Skip to content

Commit fe367bc

Browse files
committed
Fixes #378
1 parent 3a700f8 commit fe367bc

File tree

6 files changed

+47
-38
lines changed

6 files changed

+47
-38
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## [2.7.5] - 2025-XX-XX
4+
- Fix issue [#378](https://github.com/intersystems/language-server/issues/378): Remove `intersystems.language-server.completion.showInternal` setting
5+
36
## [2.7.4] - 2025-06-30
47
- Fix issue [#373](https://github.com/intersystems/language-server/issues/373): Add go to definition and hover support for `UrlMap` Call and Forward attribute values
58
- Fix issue [#374](https://github.com/intersystems/language-server/issues/374): `undefined` items appearing in completion lists for XML XData

package.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -237,12 +237,6 @@
237237
"default": true,
238238
"description": "Controls whether diagnostics are provided when a local variable may be undefined."
239239
},
240-
"intersystems.language-server.completion.showInternal": {
241-
"scope": "window",
242-
"type": "boolean",
243-
"default": false,
244-
"markdownDescription": "Controls whether class members with the `Internal` keyword and system globals are shown in completion lists."
245-
},
246240
"intersystems.language-server.completion.showGenerated": {
247241
"scope": "window",
248242
"type": "boolean",

server/src/providers/completion.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CompletionItem, CompletionItemKind, CompletionItemTag, CompletionParams, InsertTextFormat, MarkupKind, Position, Range, TextEdit } from 'vscode-languageserver/node';
2-
import { getServerSpec, getLanguageServerSettings, getMacroContext, makeRESTRequest, normalizeSystemName, getImports, findFullRange, getClassMemberContext, quoteUDLIdentifier, documaticHtmlToMarkdown, determineClassNameParameterClass, storageKeywordsKeyForToken, getParsedDocument, currentClass, normalizeClassname, macroDefToDoc } from '../utils/functions';
2+
import { getServerSpec, getLanguageServerSettings, getMacroContext, makeRESTRequest, normalizeSystemName, getImports, findFullRange, getClassMemberContext, quoteUDLIdentifier, documaticHtmlToMarkdown, determineClassNameParameterClass, storageKeywordsKeyForToken, getParsedDocument, currentClass, normalizeClassname, macroDefToDoc, showInternalForServer } from '../utils/functions';
33
import { ServerSpec, QueryData, KeywordDoc, MacroContext, compressedline, LanguageServerConfiguration } from '../utils/types';
44
import { documents, corePropertyParams, mppContinue } from '../utils/variables';
55
import * as ld from '../utils/languageDefinitions';
@@ -702,7 +702,7 @@ async function globalsOrRoutines(
702702
parameters: [`${prefix.length ? `${prefix.slice(0,-1)}/` : ""}*.mac,*.int,*.obj`]
703703
} : {
704704
query: "SELECT Name FROM %SYS.GlobalQuery_NameSpaceList(,?,?,,,1,0)",
705-
parameters: [`${prefix}*`,settings.completion.showInternal ? 1 : 0]
705+
parameters: [`${prefix}*`,(await showInternalForServer(server)) ? 1 : 0]
706706
}
707707
);
708708
if (Array.isArray(respdata?.data?.result?.content) && respdata.data.result.content.length > 0) {
@@ -1083,8 +1083,8 @@ export async function onCompletion(params: CompletionParams): Promise<Completion
10831083
thistoken !== 0 && (triggerlang === ld.cos_langindex || triggerlang === ld.cls_langindex)) ||
10841084
(prevline.endsWith(".#") && triggerlang === ld.cos_langindex)
10851085
) {
1086-
var prevtokentype = "";
1087-
var prevtokentext = "";
1086+
let prevtokentype = "";
1087+
let prevtokentext = "";
10881088
const prevtokenrange = findFullRange(params.position.line,parsed,thistoken-1,parsed[params.position.line][thistoken-1].p,parsed[params.position.line][thistoken-1].p+parsed[params.position.line][thistoken-1].c);
10891089
prevtokentext = doc.getText(prevtokenrange);
10901090
if ((parsed[params.position.line][thistoken-1].l == ld.cls_langindex && parsed[params.position.line][thistoken-1].s == ld.cls_clsname_attrindex) ||
@@ -1163,7 +1163,7 @@ export async function onCompletion(params: CompletionParams): Promise<Completion
11631163
else {
11641164
// This is a class member
11651165

1166-
const internalStr = !settings.completion.showInternal ? " AND Internal = 0": "";
1166+
const internalStr = !(await showInternalForServer(server)) ? " AND Internal = 0": "";
11671167
const deprecatedStr = !settings.completion.showDeprecated ? " AND Deprecated = 0" : "";
11681168
if (prevline.slice(-2) === ".#") {
11691169
// Get the base class that this member is in
@@ -1465,7 +1465,7 @@ export async function onCompletion(params: CompletionParams): Promise<Completion
14651465
const data: QueryData = {
14661466
query: `SELECT Name, Description, Origin, Type, Deprecated FROM %Dictionary.CompiledParameter WHERE Parent = ?${
14671467
isProperty ? " OR Parent %INLIST (SELECT $LISTFROMSTRING(PropertyClass) FROM %Dictionary.CompiledClass WHERE Name = ?)" : ""
1468-
}${!settings.completion.showInternal ? " AND Internal = 0": ""}${!settings.completion.showDeprecated ? " AND Deprecated = 0": ""}`,
1468+
}${!(await showInternalForServer(server)) ? " AND Internal = 0": ""}${!settings.completion.showDeprecated ? " AND Deprecated = 0": ""}`,
14691469
parameters: isProperty ? [normalizedcls,currentClass(doc,parsed)] : [normalizedcls]
14701470
};
14711471
const respdata = await makeRESTRequest("POST",1,"/action/query",server,data);
@@ -1736,14 +1736,14 @@ export async function onCompletion(params: CompletionParams): Promise<Completion
17361736
// List of methods
17371737

17381738
// Find the class name
1739-
var thisclass = "";
1739+
let thisclass = "";
17401740
for (let i = 0; i < parsed.length; i++) {
17411741
if (parsed[i].length === 0) {
17421742
continue;
17431743
}
17441744
else if (parsed[i][0].l == ld.cls_langindex && parsed[i][0].s == ld.cls_keyword_attrindex) {
17451745
// This line starts with a UDL keyword
1746-
var keyword = doc.getText(Range.create(Position.create(i,parsed[i][0].p),Position.create(i,parsed[i][0].p+parsed[i][0].c)));
1746+
const keyword = doc.getText(Range.create(Position.create(i,parsed[i][0].p),Position.create(i,parsed[i][0].p+parsed[i][0].c)));
17471747
if (keyword.toLowerCase() === "class") {
17481748
for (let j = 1; j < parsed[i].length; j++) {
17491749
if (parsed[i][j].l == ld.cls_langindex && parsed[i][j].s == ld.cls_clsname_attrindex) {
@@ -1760,7 +1760,7 @@ export async function onCompletion(params: CompletionParams): Promise<Completion
17601760
}
17611761
const querydata = {
17621762
query: `SELECT Name, Description, Origin FROM %Dictionary.CompiledMethod WHERE Parent = ?${
1763-
!settings.completion.showInternal ? " AND Internal = 0": ""
1763+
!(await showInternalForServer(server)) ? " AND Internal = 0": ""
17641764
}`,
17651765
parameters:[thisclass]
17661766
};
@@ -2165,11 +2165,12 @@ export async function onCompletion(params: CompletionParams): Promise<Completion
21652165
// If we couldn't determine the class, don't return anything
21662166
return null;
21672167
}
2168+
const showInternal = await showInternalForServer(server);
21682169

21692170
// Query the server to get the names and descriptions of all non-calculated properties
21702171
const data: QueryData = {
21712172
query: `SELECT Name, Description, Origin, RuntimeType, Deprecated FROM %Dictionary.CompiledProperty WHERE Parent = ? AND Calculated = 0${
2172-
!settings.completion.showInternal ? " AND Internal = 0": ""
2173+
!showInternal ? " AND Internal = 0": ""
21732174
}${!settings.completion.showDeprecated ? " AND Deprecated = 0" : ""}`,
21742175
parameters: [thisclass]
21752176
}

server/src/providers/refactoring.ts

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import parameterTypes = require("../documentation/parameterTypes.json");
1515

1616
import * as ld from '../utils/languageDefinitions';
1717
import { compressedline, QueryData, ServerSpec } from '../utils/types';
18-
import { getServerSpec, findFullRange, makeRESTRequest, quoteUDLIdentifier, parseDimLine, getLanguageServerSettings, getParsedDocument, memberRegex } from '../utils/functions';
18+
import { getServerSpec, findFullRange, makeRESTRequest, quoteUDLIdentifier, parseDimLine, getLanguageServerSettings, getParsedDocument, memberRegex, showInternalForServer } from '../utils/functions';
1919
import { documents, connection, zutilFunctions } from '../utils/variables';
2020

2121
/**
@@ -216,32 +216,29 @@ export async function listOverridableMembers(params: ListOverridableMembersParam
216216
const parsed = await getParsedDocument(params.uri);
217217
if (parsed === undefined) {return [];}
218218
const server: ServerSpec = await getServerSpec(params.uri);
219-
var result: QuickPickItem[] = [];
219+
const result: QuickPickItem[] = [];
220220

221221
// Determine what class this is
222-
var thisclass = "";
222+
let thisclass = "";
223223
for (let ln = 0; ln < parsed.length; ln++) {
224-
if (parsed[ln].length === 0) {
225-
continue;
226-
}
227-
else if (parsed[ln][0].l == ld.cls_langindex && parsed[ln][0].s == ld.cls_keyword_attrindex) {
228-
// This line starts with a UDL keyword
229-
230-
var keyword = doc.getText(Range.create(Position.create(ln,parsed[ln][0].p),Position.create(ln,parsed[ln][0].p+parsed[ln][0].c))).toLowerCase();
231-
if (keyword === "class") {
232-
thisclass = doc.getText(findFullRange(ln,parsed,1,parsed[ln][1].p,parsed[ln][1].p+parsed[ln][1].c));
233-
break;
234-
}
224+
if (!parsed[ln]?.length) continue;
225+
if (
226+
parsed[ln][0].l == ld.cls_langindex && parsed[ln][0].s == ld.cls_keyword_attrindex &&
227+
doc.getText(Range.create(ln,parsed[ln][0].p,ln,parsed[ln][0].p+parsed[ln][0].c)).toLowerCase() == "class"
228+
) {
229+
thisclass = doc.getText(findFullRange(ln,parsed,1,parsed[ln][1].p,parsed[ln][1].p+parsed[ln][1].c));
230+
break;
235231
}
236232
}
237233

238234
if (thisclass !== "") {
239235
// We found the name of this class
240236

237+
const showInternalStr = await showInternalForServer(server) ? "" : " AND Internal = 0";
241238
// Build the list of QuickPickItems
242239
if (params.memberType === "Method") {
243240
const querydata: QueryData = {
244-
query: "SELECT Name, Origin, ClassMethod, ReturnType FROM %Dictionary.CompiledMethod WHERE Parent = ? AND Stub IS NULL AND Origin != ? AND Final = 0 AND NotInheritable = 0",
241+
query: `SELECT Name, Origin, ClassMethod, ReturnType FROM %Dictionary.CompiledMethod WHERE Parent = ? AND Stub IS NULL AND Origin != ? AND Final = 0 AND NotInheritable = 0${showInternalStr}`,
245242
parameters: [thisclass,thisclass]
246243
};
247244
const respdata = await makeRESTRequest("POST",1,"/action/query",server,querydata);
@@ -266,7 +263,7 @@ export async function listOverridableMembers(params: ListOverridableMembersParam
266263
}
267264
else if (params.memberType === "Parameter") {
268265
const querydata: QueryData = {
269-
query: "SELECT Name, Origin, Type FROM %Dictionary.CompiledParameter WHERE Parent = ? AND Origin != ? AND Final = 0",
266+
query: `SELECT Name, Origin, Type FROM %Dictionary.CompiledParameter WHERE Parent = ? AND Origin != ? AND Final = 0${showInternalStr}`,
270267
parameters: [thisclass,thisclass]
271268
};
272269
const respdata = await makeRESTRequest("POST",1,"/action/query",server,querydata);
@@ -282,7 +279,7 @@ export async function listOverridableMembers(params: ListOverridableMembersParam
282279
}
283280
else if (params.memberType === "Projection") {
284281
const querydata: QueryData = {
285-
query: "SELECT Name, Origin, Type FROM %Dictionary.CompiledProjection WHERE Parent = ? AND Origin != ?",
282+
query: `SELECT Name, Origin, Type FROM %Dictionary.CompiledProjection WHERE Parent = ? AND Origin != ?${showInternalStr}`,
286283
parameters: [thisclass,thisclass]
287284
};
288285
const respdata = await makeRESTRequest("POST",1,"/action/query",server,querydata);
@@ -298,7 +295,7 @@ export async function listOverridableMembers(params: ListOverridableMembersParam
298295
}
299296
else if (params.memberType === "Property") {
300297
const querydata: QueryData = {
301-
query: "SELECT Name, Origin, Type FROM %Dictionary.CompiledProperty WHERE Parent = ? AND Origin != ? AND Final = 0",
298+
query: `SELECT Name, Origin, Type FROM %Dictionary.CompiledProperty WHERE Parent = ? AND Origin != ? AND Final = 0${showInternalStr}`,
302299
parameters: [thisclass,thisclass]
303300
};
304301
const respdata = await makeRESTRequest("POST",1,"/action/query",server,querydata);
@@ -314,7 +311,7 @@ export async function listOverridableMembers(params: ListOverridableMembersParam
314311
}
315312
else if (params.memberType === "Query") {
316313
const querydata: QueryData = {
317-
query: "SELECT Name, Origin, Type FROM %Dictionary.CompiledQuery WHERE Parent = ? AND Origin != ? AND Final = 0",
314+
query: `SELECT Name, Origin, Type FROM %Dictionary.CompiledQuery WHERE Parent = ? AND Origin != ? AND Final = 0${showInternalStr}`,
318315
parameters: [thisclass,thisclass]
319316
};
320317
const respdata = await makeRESTRequest("POST",1,"/action/query",server,querydata);
@@ -330,7 +327,7 @@ export async function listOverridableMembers(params: ListOverridableMembersParam
330327
}
331328
else if (params.memberType === "Trigger") {
332329
const querydata: QueryData = {
333-
query: "SELECT Name, Origin, Event FROM %Dictionary.CompiledTrigger WHERE Parent = ? AND Origin != ? AND Final = 0",
330+
query: `SELECT Name, Origin, Event FROM %Dictionary.CompiledTrigger WHERE Parent = ? AND Origin != ? AND Final = 0${showInternalStr}`,
334331
parameters: [thisclass,thisclass]
335332
};
336333
const respdata = await makeRESTRequest("POST",1,"/action/query",server,querydata);
@@ -346,7 +343,7 @@ export async function listOverridableMembers(params: ListOverridableMembersParam
346343
}
347344
else if (params.memberType === "XData") {
348345
const querydata: QueryData = {
349-
query: "SELECT Name, Origin, MimeType FROM %Dictionary.CompiledXData WHERE Parent = ? AND Origin != ?",
346+
query: `SELECT Name, Origin, MimeType FROM %Dictionary.CompiledXData WHERE Parent = ? AND Origin != ?${showInternalStr}`,
350347
parameters: [thisclass,thisclass]
351348
};
352349
const respdata = await makeRESTRequest("POST",1,"/action/query",server,querydata);

server/src/utils/functions.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2895,3 +2895,18 @@ export function determineActiveParam(text: string): number {
28952895
});
28962896
return activeParam;
28972897
}
2898+
2899+
const showInternalCache: Map<string,boolean> = new Map();
2900+
2901+
/** Determine if class members with the `Internal` keyword and system globals should be shown in the completion list */
2902+
export async function showInternalForServer(server: ServerSpec): Promise<boolean> {
2903+
const key = `${server.host}::${server.port}::${server.pathPrefix}::${server.username}`;
2904+
let result = showInternalCache.get(key);
2905+
if (result != undefined) return result;
2906+
result = await makeRESTRequest("POST",1,"/action/query",server,{
2907+
query: "SELECT Name FROM %Library.RoutineMgr_StudioOpenDialog(?,?,?,?,?,?,?)",
2908+
parameters: ["%Library.ConstraintRelationship.cls",1,1,1,1,0,0]
2909+
}).then((respdata) => respdata?.data?.result?.content?.length > 0).catch(() => false);
2910+
showInternalCache.set(key,result);
2911+
return result;
2912+
}

server/src/utils/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ export type LanguageServerConfiguration = {
4040
},
4141
completion: {
4242
showGenerated: boolean,
43-
showInternal: boolean,
4443
showDeprecated: boolean
4544
}
4645
};

0 commit comments

Comments
 (0)