Skip to content

Commit 3e059b1

Browse files
authored
Properly handle other files and packages in server-side projects (#1087)
1 parent 535b179 commit 3e059b1

File tree

3 files changed

+47
-24
lines changed

3 files changed

+47
-24
lines changed

src/commands/project.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ export function removeProjectItem(Name: string, Type: string, items: ProjectItem
313313
);
314314
}
315315
} else if (Type == "OTH" && items.findIndex((item) => item.Name.toLowerCase() == Name.toLowerCase()) != -1) {
316-
remove.push({ Name, Type });
316+
remove.push({ Name, Type: items.find((item) => item.Name.toLowerCase() == Name.toLowerCase())?.Type ?? Type });
317317
}
318318

319319
return remove;
@@ -786,7 +786,12 @@ export async function modifyProject(
786786
);
787787
} else if (node.category == "OTH") {
788788
// Remove all items of Type "OTH" with this prefix
789-
remove.push(...items.filter((item) => item.Name.startsWith(`${node.fullName}.`) && item.Type == "OTH"));
789+
remove.push(
790+
...items.filter(
791+
(item) =>
792+
item.Name.startsWith(`${node.fullName}.`) && !["CLS", "PKG", "MAC", "CSP", "DIR"].includes(item.Type)
793+
)
794+
);
790795
} else if (node.category == "INC") {
791796
// Remove all items of Type "MAC" with this prefix and the .inc extension
792797
remove.push(

src/explorer/explorer.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,17 @@ export function registerExplorerOpen(): vscode.Disposable {
8585
: ["mac", "int", "inc"].includes(ext)
8686
? "MAC"
8787
: "OTH";
88-
await api.actionQuery("DELETE FROM %Studio.ProjectItem WHERE Project = ? AND LOWER(Name||Type) = ?", [
89-
project,
90-
`${prjFileName}${prjType}`.toLowerCase(),
91-
]);
88+
if (prjType == "OTH") {
89+
await api.actionQuery(
90+
"DELETE FROM %Studio.ProjectItem WHERE Project = ? AND Name = ? AND Type NOT IN ('CLS','PKG','MAC','CSP','DIR','GBL')",
91+
[project, prjFileName]
92+
);
93+
} else {
94+
await api.actionQuery("DELETE FROM %Studio.ProjectItem WHERE Project = ? AND LOWER(Name||Type) = ?", [
95+
project,
96+
`${prjFileName}${prjType}`.toLowerCase(),
97+
]);
98+
}
9299
} catch (error) {
93100
let message = `Failed to remove '${fullName}' from project '${project}'.`;
94101
if (error && error.errorText && error.errorText !== "") {

src/utils/FileProviderUtil.ts

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export async function projectContentsFromUri(uri: vscode.Uri, overrideFlat?: boo
1515
// Treat this the same as an empty folder
1616
folder = "";
1717
}
18+
const folderDots = folder.replace(/\//g, ".");
1819
const project = params.get("project");
1920
let query: string;
2021
let parameters: string[];
@@ -27,35 +28,38 @@ export async function projectContentsFromUri(uri: vscode.Uri, overrideFlat?: boo
2728
"WHERE (Name %STARTSWITH ? OR Name %STARTSWITH ?) AND (" +
2829
"(Type = 'MAC' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.mac,*.int,*.inc',1,1,1,1,0,1) AS sod WHERE Name = sod.Name)) OR " +
2930
"(Type = 'CSP' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,1,0,1) AS sod WHERE '/'||Name = sod.Name)) OR " +
30-
"(Type = 'OTH' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.other',1,1,1,1,0,1) AS sod WHERE Name = sod.Name))) OR " +
31+
"(Type NOT IN ('CLS','PKG','MAC','CSP','DIR','GBL') AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.other',1,1,1,1,0,1) AS sod WHERE Name = sod.Name))) OR " +
3132
"(Type = 'CLS' AND (Package IS NOT NULL OR (Package IS NULL AND EXISTS (SELECT dcd.ID FROM %Dictionary.ClassDefinition AS dcd WHERE dcd.ID = Name)))) " +
3233
"UNION " +
3334
"SELECT SUBSTR(sod.Name,2) AS Name, pil.Type FROM %Library.RoutineMgr_StudioOpenDialog(?,1,1,1,1,0,1) AS sod " +
3435
"JOIN %Studio.Project_ProjectItemsList(?,1) AS pil ON " +
3536
"pil.Type = 'DIR' AND SUBSTR(sod.Name,2) %STARTSWITH ? AND SUBSTR(sod.Name,2) %STARTSWITH pil.Name||'/'";
36-
parameters = [project, folder.replace(/\//g, "."), folder, folder + "*.cspall", project, folder];
37+
parameters = [project, folderDots, folder, folder + "*.cspall", project, folder];
3738
} else {
3839
if (folder.length) {
3940
const l = String(folder.length + 1); // Need the + 1 because SUBSTR is 1 indexed
4041
query =
4142
"SELECT sod.Name, pil.Type FROM %Library.RoutineMgr_StudioOpenDialog(?,1,1,1,0,0,1) AS sod JOIN %Studio.Project_ProjectItemsList(?) AS pil ON " +
42-
"((pil.Type = 'MAC' OR pil.Type = 'OTH') AND ?||sod.Name = pil.Name) OR " +
43+
"(pil.Type = 'MAC' AND ?||sod.Name = pil.Name) OR " +
4344
"(pil.Type = 'CLS' AND ?||sod.Name = pil.Name||'.cls') OR (pil.Type = 'PKG' AND ?||sod.Name = pil.Name) OR " +
4445
"((pil.Type = 'CLS' OR pil.Type = 'PKG') AND pil.Name %STARTSWITH ?||sod.Name||'.') " +
45-
"WHERE pil.Type = 'MAC' OR pil.Type = 'OTH' OR pil.Type = 'CLS' OR pil.Type = 'PKG' UNION SELECT sod.Name, pil.Type FROM " +
46+
"WHERE pil.Type = 'MAC' OR pil.Type = 'CLS' OR pil.Type = 'PKG' UNION SELECT sod.Name, pil.Type FROM " +
4647
"%Library.RoutineMgr_StudioOpenDialog(?,1,1,1,0,0,1) AS sod JOIN %Studio.Project_ProjectItemsList(?,1) AS pil ON " +
4748
"(pil.Type = 'DIR' AND ?||sod.Name %STARTSWITH pil.Name||'/') OR (pil.Type = 'CSP' AND ?||sod.Name = pil.Name) " +
4849
"UNION SELECT $PIECE(SUBSTR(Name,?),'/') AS Name, Type FROM %Studio.Project_ProjectItemsList(?,1) WHERE (" +
4950
"Type = 'DIR' AND $LENGTH($PIECE(SUBSTR(Name,?),'/')) > 0 AND Name %STARTSWITH ? AND EXISTS " +
5051
"(SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,0,0,1) AS sod WHERE Name %STARTSWITH sod.Name||'/' OR Name = sod.Name)) OR (" +
51-
"Type = 'CSP' AND Name %STARTSWITH ? AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,1,0,1) AS sod WHERE Name = sod.Name))";
52+
"Type = 'CSP' AND Name %STARTSWITH ? AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,1,0,1) AS sod WHERE Name = sod.Name)) " +
53+
"UNION SELECT CASE WHEN $LENGTH(SUBSTR(sod.Name,?),'.') > 2 THEN $PIECE(SUBSTR(sod.Name,?),'.') ELSE SUBSTR(sod.Name,?) END Name, pil.Type FROM " +
54+
"%Library.RoutineMgr_StudioOpenDialog(?,1,1,1,1,0,1) AS sod JOIN %Studio.Project_ProjectItemsList(?,1) AS pil ON " +
55+
"$PIECE(sod.Name,'.',1,$LENGTH(sod.Name,'.')-1) = $PIECE(pil.Name,'.',1,$LENGTH(pil.Name,'.')-1) AND UPPER($PIECE(sod.Name,'.',$LENGTH(sod.Name,'.'))) = $PIECE(pil.Name,'.',$LENGTH(pil.Name,'.'))";
5256
parameters = [
53-
folder.replace(/\//g, ".").slice(0, -1) + "/*",
57+
folderDots.slice(0, -1) + "/*",
5458
project,
55-
folder.replace(/\//g, "."),
56-
folder.replace(/\//g, "."),
57-
folder.replace(/\//g, "."),
58-
folder.replace(/\//g, "."),
59+
folderDots,
60+
folderDots,
61+
folderDots,
62+
folderDots,
5963
folder + "*",
6064
project,
6165
folder,
@@ -65,20 +69,27 @@ export async function projectContentsFromUri(uri: vscode.Uri, overrideFlat?: boo
6569
l,
6670
folder,
6771
folder,
72+
l,
73+
l,
74+
l,
75+
folderDots + "*.other",
76+
project,
6877
];
6978
} else {
7079
const nameCol =
7180
"CASE WHEN Type = 'CSP' OR Type = 'DIR' THEN $PIECE(Name,'/') " +
72-
"WHEN (Type != 'CSP' AND Type != 'DIR' AND $LENGTH(Name,'.') > 2) OR Type = 'CLS' OR Type = 'PKG' THEN $PIECE(Name,'.') ELSE Name END";
81+
"WHEN (Type != 'CSP' AND Type != 'DIR' AND $LENGTH(Name,'.') > 2 AND UPPER($PIECE(Name,'.',$LENGTH(Name,'.'))) != 'DFI') " +
82+
"OR Type = 'CLS' OR Type = 'PKG' THEN $PIECE(Name,'.') ELSE Name END";
7383
query =
7484
`SELECT DISTINCT BY (${nameCol}) ${nameCol} ` +
75-
"Name, Type FROM %Studio.Project_ProjectItemsList(?,1) WHERE " +
76-
"(Type = 'MAC' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.mac,*.int,*.inc',1,1,1,1,0,1) AS sod WHERE Name = sod.Name)) OR " +
77-
"(Type = 'CSP' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,1,0,1) AS sod WHERE Name = sod.Name)) OR " +
78-
"(Type = 'OTH' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.other',1,1,1,1,0,1) AS sod WHERE Name = sod.Name)) OR " +
79-
"(Type = 'CLS' AND EXISTS (SELECT dcd.ID FROM %Dictionary.ClassDefinition AS dcd WHERE dcd.ID = Name)) OR " +
80-
"(Type = 'PKG' AND EXISTS (SELECT dcd.ID FROM %Dictionary.ClassDefinition AS dcd WHERE dcd.ID %STARTSWITH Name||'.')) OR " +
81-
"(Type = 'DIR' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,0,0,1) AS sod WHERE Name %STARTSWITH sod.Name||'/' OR Name = sod.Name))";
85+
"Name, Type FROM %Studio.Project_ProjectItemsList(?,1) AS pil WHERE " +
86+
"(Type = 'MAC' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.mac,*.int,*.inc',1,1,1,1,0,1) AS sod WHERE pil.Name = sod.Name)) OR " +
87+
"(Type = 'CSP' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,1,0,1) AS sod WHERE pil.Name = sod.Name)) OR " +
88+
"(Type NOT IN ('CLS','PKG','MAC','CSP','DIR','GBL') AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.other',1,1,1,1,0,1) AS sod WHERE " +
89+
"$PIECE(sod.Name,'.',1,$LENGTH(sod.Name,'.')-1) = $PIECE(pil.Name,'.',1,$LENGTH(pil.Name,'.')-1) AND UPPER($PIECE(sod.Name,'.',$LENGTH(sod.Name,'.'))) = $PIECE(pil.Name,'.',$LENGTH(pil.Name,'.')))) OR " +
90+
"(Type = 'CLS' AND EXISTS (SELECT dcd.ID FROM %Dictionary.ClassDefinition AS dcd WHERE dcd.ID = pil.Name)) OR " +
91+
"(Type = 'PKG' AND EXISTS (SELECT dcd.ID FROM %Dictionary.ClassDefinition AS dcd WHERE dcd.ID %STARTSWITH pil.Name||'.')) OR " +
92+
"(Type = 'DIR' AND EXISTS (SELECT sod.Size FROM %Library.RoutineMgr_StudioOpenDialog('*.cspall',1,1,1,0,0,1) AS sod WHERE pil.Name %STARTSWITH sod.Name||'/' OR pil.Name = sod.Name))";
8293
parameters = [project];
8394
}
8495
}

0 commit comments

Comments
 (0)