Skip to content

Commit aedf961

Browse files
authored
Clean up resolvers (#63)
* Clean up resolvers
1 parent 0d90955 commit aedf961

12 files changed

+205
-317
lines changed

.prettierrc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"printWidth": 130,
2+
"printWidth": 200,
33
"trailingComma": "all",
44
"singleQuote": false
55
}

server/src/Documents/DocumentsCollection.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,13 @@ export default class DocumentsCollection extends Dictionnary<string, Document> {
1919
constructor() {
2020
super();
2121

22-
this.standardLibComplexTokens = JSON.parse(
23-
readFileSync(join(__dirname, "..", "resources", "standardLibDefinitions.json")).toString(),
24-
).complexTokens as ComplexToken[];
22+
this.standardLibComplexTokens = JSON.parse(readFileSync(join(__dirname, "..", "resources", "standardLibDefinitions.json")).toString()).complexTokens as ComplexToken[];
2523

2624
STATIC_RESOURCES_FOLDERS.forEach((static_resources_folder) => {
2725
const directoryPath = normalize(join(__dirname, "..", "resources", static_resources_folder));
2826
const files = readdirSync(directoryPath);
2927
files.forEach((filename) => {
30-
const tokens = JSON.parse(
31-
readFileSync(join(__dirname, "..", "resources", static_resources_folder, filename)).toString(),
32-
) as any as GlobalScopeTokenizationResult;
28+
const tokens = JSON.parse(readFileSync(join(__dirname, "..", "resources", static_resources_folder, filename)).toString()) as any as GlobalScopeTokenizationResult;
3329
this.addDocument(this.initializeDocument(`${STATIC_PREFIX}/${filename.replace(".json", FILES_EXTENSION)}`, true, tokens));
3430
});
3531
});

server/src/Providers/CompletionItemsProvider.ts

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ export default class CompletionItemsProvider extends Provider {
1313
super(server);
1414

1515
this.server.connection.onCompletion((params) => this.exceptionsWrapper(this.providerHandler(params)));
16-
this.server.connection.onCompletionResolve((item) =>
17-
this.exceptionsWrapper(() => CompletionItemBuilder.buildResolvedItem(item, this.server.config), item),
18-
);
16+
this.server.connection.onCompletionResolve((item) => this.exceptionsWrapper(() => CompletionItemBuilder.buildResolvedItem(item, this.server.config), item));
1917
}
2018

2119
private providerHandler(params: CompletionParams) {
@@ -27,67 +25,46 @@ export default class CompletionItemsProvider extends Provider {
2725

2826
const liveDocument = this.server.liveDocumentsManager.get(uri);
2927
const document = this.server.documentsCollection.getFromUri(uri);
28+
if (!liveDocument || !document) return;
3029

31-
if (liveDocument) {
32-
const localScope = this.server.tokenizer?.tokenizeContent(liveDocument.getText(), TokenizedScope.local, 0, position.line);
30+
const localScope = this.server.tokenizer.tokenizeContent(liveDocument.getText(), TokenizedScope.local, 0, position.line);
3331

34-
if (localScope) {
35-
if (document) {
36-
if (params.context?.triggerCharacter === TriggerCharacters.dot) {
37-
const structVariableIdentifier = this.server.tokenizer?.findLineIdentiferFromPositionAt(
38-
liveDocument.getText(),
39-
position,
40-
-1,
41-
);
32+
if (params.context?.triggerCharacter === TriggerCharacters.dot) {
33+
const structVariableIdentifier = this.server.tokenizer.findLineIdentiferFromPositionAt(liveDocument.getText(), position, -1);
34+
const structIdentifer = localScope.functionVariablesComplexTokens.find((token) => token.identifier === structVariableIdentifier)?.valueType;
4235

43-
const structIdentifer = localScope.functionVariablesComplexTokens.find(
44-
(token) => token.identifier === structVariableIdentifier,
45-
)?.valueType;
46-
47-
return document
48-
.getGlobalStructComplexTokens()
49-
.find((token) => token.identifier === structIdentifer)
50-
?.properties.map((property) => {
51-
return CompletionItemBuilder.buildItem(property);
52-
});
53-
}
54-
55-
if (
56-
this.server.tokenizer?.findLineIdentiferFromPositionAt(liveDocument.getText(), position, -2) ===
57-
LanguageTypes.struct
58-
) {
59-
return document.getGlobalStructComplexTokens().map((token) => CompletionItemBuilder.buildItem(token));
60-
}
61-
}
36+
return document
37+
.getGlobalStructComplexTokens()
38+
.find((token) => token.identifier === structIdentifer)
39+
?.properties.map((property) => {
40+
return CompletionItemBuilder.buildItem(property);
41+
});
42+
}
6243

63-
return this.getLocalScopeCompletionItems(localScope)
64-
.concat(this.getGlobalScopeCompletionItems(document, localScope))
65-
.concat(this.getStandardLibCompletionItems());
66-
}
44+
if (this.server.tokenizer.findLineIdentiferFromPositionAt(liveDocument.getText(), position, -2) === LanguageTypes.struct) {
45+
return document.getGlobalStructComplexTokens().map((token) => CompletionItemBuilder.buildItem(token));
6746
}
47+
48+
return this.getGlobalScopeCompletionItems(document, localScope).concat(this.getLocalScopeCompletionItems(localScope)).concat(this.getStandardLibCompletionItems());
6849
};
6950
}
7051

52+
private getGlobalScopeCompletionItems(document: Document, localScope: LocalScopeTokenizationResult) {
53+
return document
54+
.getGlobalComplexTokens(
55+
[],
56+
localScope.functionsComplexTokens.map((token) => token.identifier),
57+
)
58+
.map((token) => CompletionItemBuilder.buildItem(token));
59+
}
60+
7161
private getLocalScopeCompletionItems(localScope: LocalScopeTokenizationResult) {
72-
const functionVariablesCompletionItems = localScope.functionVariablesComplexTokens.map((token) =>
73-
CompletionItemBuilder.buildItem(token),
74-
);
62+
const functionVariablesCompletionItems = localScope.functionVariablesComplexTokens.map((token) => CompletionItemBuilder.buildItem(token));
7563
const functionsCompletionItems = localScope.functionsComplexTokens.map((token) => CompletionItemBuilder.buildItem(token));
7664

7765
return functionVariablesCompletionItems.concat(functionsCompletionItems);
7866
}
7967

80-
private getGlobalScopeCompletionItems(document: Document | undefined, localScope: LocalScopeTokenizationResult) {
81-
return (
82-
document
83-
?.getGlobalComplexTokens(
84-
[],
85-
localScope.functionsComplexTokens.map((token) => token.identifier),
86-
)
87-
.map((token) => CompletionItemBuilder.buildItem(token)) || []
88-
);
89-
}
90-
9168
private getStandardLibCompletionItems() {
9269
return this.getStandardLibComplexTokens().map((token) => CompletionItemBuilder.buildItem(token));
9370
}

server/src/Providers/DocumentFormattingProvider.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,22 @@ export default class DocumentFormattingProvider extends Provider {
88
constructor(server: ServerManager) {
99
super(server);
1010

11-
this.server.connection.onDocumentFormatting(
12-
async (params) => await this.asyncExceptionsWrapper(this.providerHandler(params)),
13-
);
11+
this.server.connection.onDocumentFormatting(async (params) => await this.asyncExceptionsWrapper(this.providerHandler(params)));
1412
}
1513

1614
private providerHandler(params: DocumentFormattingParams) {
1715
return async () => {
1816
const {
1917
textDocument: { uri },
2018
} = params;
21-
const { enabled, verbose, ignoredGlobs, style, executable } = this.server.config.formatter;
22-
const clangFormatter = new ClangFormatter(
23-
this.server.workspaceFilesSystem,
24-
enabled,
25-
verbose,
26-
ignoredGlobs,
27-
executable,
28-
style,
29-
this.server.logger,
30-
);
3119

20+
const { enabled, verbose, ignoredGlobs, style, executable } = this.server.config.formatter;
21+
const clangFormatter = new ClangFormatter(this.server.workspaceFilesSystem, enabled, verbose, ignoredGlobs, executable, style, this.server.logger);
3222
const liveDocument = this.server.liveDocumentsManager.get(uri);
23+
3324
if (liveDocument) {
3425
return await clangFormatter.formatDocument(liveDocument, null);
3526
}
36-
37-
return undefined;
3827
};
3928
}
4029
}

server/src/Providers/DocumentRangeFormattingProvider.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ export default class DocumentRangeFormattingProvider extends Provider {
88
constructor(server: ServerManager) {
99
super(server);
1010

11-
this.server.connection.onDocumentRangeFormatting(
12-
async (params) => await this.asyncExceptionsWrapper(this.providerHandler(params)),
13-
);
11+
this.server.connection.onDocumentRangeFormatting(async (params) => await this.asyncExceptionsWrapper(this.providerHandler(params)));
1412
}
1513

1614
private providerHandler(params: DocumentRangeFormattingParams) {
@@ -19,23 +17,14 @@ export default class DocumentRangeFormattingProvider extends Provider {
1917
textDocument: { uri },
2018
range,
2119
} = params;
22-
const { enabled, verbose, ignoredGlobs, style, executable } = this.server.config.formatter;
23-
const clangFormatter = new ClangFormatter(
24-
this.server.workspaceFilesSystem,
25-
enabled,
26-
verbose,
27-
ignoredGlobs,
28-
executable,
29-
style,
30-
this.server.logger,
31-
);
3220

21+
const { enabled, verbose, ignoredGlobs, style, executable } = this.server.config.formatter;
22+
const clangFormatter = new ClangFormatter(this.server.workspaceFilesSystem, enabled, verbose, ignoredGlobs, executable, style, this.server.logger);
3323
const liveDocument = this.server.liveDocumentsManager.get(uri);
24+
3425
if (liveDocument) {
3526
return await clangFormatter.formatDocument(liveDocument, range);
3627
}
37-
38-
return undefined;
3928
};
4029
}
4130
}
Lines changed: 72 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import { CompletionItemKind, DefinitionParams } from "vscode-languageserver";
1+
import { CompletionItemKind, DefinitionParams, Position } from "vscode-languageserver";
2+
import { TextDocument } from "vscode-languageserver-textdocument";
23

34
import type { OwnedComplexTokens, OwnedStructComplexTokens } from "../Documents/Document";
45
import type { ServerManager } from "../ServerManager";
56
import type { ComplexToken } from "../Tokenizer/types";
67
import { TokenizedScope } from "../Tokenizer/Tokenizer";
8+
import { Document } from "../Documents";
79
import Provider from "./Provider";
810

911
export default class GotoDefinitionProvider extends Provider {
@@ -22,98 +24,91 @@ export default class GotoDefinitionProvider extends Provider {
2224

2325
const liveDocument = this.server.liveDocumentsManager.get(uri);
2426
const document = this.server.documentsCollection.getFromUri(uri);
27+
if (!liveDocument || !document) return;
2528

26-
if (liveDocument && this.server.tokenizer) {
27-
let token: ComplexToken | undefined;
28-
let ref: OwnedComplexTokens | OwnedStructComplexTokens | undefined;
29-
const { tokenType, structVariableIdentifier, identifier } = this.server.tokenizer.findActionTargetAtPosition(
30-
liveDocument.getText(),
31-
position,
32-
);
29+
const [token, ref] = this.resolveTokenAndRef(position, document, liveDocument);
3330

34-
const localScope = this.server.tokenizer?.tokenizeContent(liveDocument.getText(), TokenizedScope.local, 0, position.line);
35-
36-
if (!tokenType) {
37-
token = localScope?.functionVariablesComplexTokens.find((token) => token.identifier === identifier);
38-
}
39-
40-
if (!token && tokenType === CompletionItemKind.Function) {
41-
token = localScope?.functionsComplexTokens.find((token) => token.identifier === identifier);
31+
if (token) {
32+
if (ref && !ref.owner) {
33+
return {
34+
uri,
35+
range: {
36+
start: { line: position.line, character: position.character },
37+
end: { line: position.line, character: position.character },
38+
},
39+
};
4240
}
4341

44-
if (document) {
45-
if (tokenType === CompletionItemKind.Property && structVariableIdentifier) {
46-
const structIdentifer = localScope?.functionVariablesComplexTokens.find(
47-
(token) => token.identifier === structVariableIdentifier,
48-
)?.valueType;
49-
50-
const tokensWithRef = document.getGlobalStructComplexTokensWithRef();
51-
for (let i = 0; i < tokensWithRef.length; i++) {
52-
ref = tokensWithRef[i];
53-
54-
token = (ref as OwnedStructComplexTokens).tokens
55-
.find((token) => token.identifier === structIdentifer)
56-
?.properties.find((property) => property.identifier === identifier);
42+
return {
43+
uri: ref ? ref.owner || "" : uri,
44+
range: {
45+
start: { line: token.position.line, character: token.position.character },
46+
end: { line: token.position.line, character: token.position.character },
47+
},
48+
};
49+
}
50+
};
51+
}
5752

58-
if (token) {
59-
break;
60-
}
61-
}
62-
}
53+
private resolveTokenAndRef(position: Position, document: Document, liveDocument: TextDocument): [token: ComplexToken | undefined, ref: OwnedComplexTokens | OwnedStructComplexTokens | undefined] {
54+
let tokensWithRef;
55+
let token: ComplexToken | undefined;
56+
let ref: OwnedComplexTokens | OwnedStructComplexTokens | undefined;
6357

64-
if (!token && tokenType === CompletionItemKind.Struct) {
65-
const tokensWithRef = document.getGlobalStructComplexTokensWithRef();
66-
for (let i = 0; i < tokensWithRef.length; i++) {
67-
ref = tokensWithRef[i];
58+
const { tokenType, structVariableIdentifier, identifier } = this.server.tokenizer.findActionTargetAtPosition(liveDocument.getText(), position);
59+
const localScope = this.server.tokenizer.tokenizeContent(liveDocument.getText(), TokenizedScope.local, 0, position.line);
6860

69-
token = ref.tokens.find((token) => token.identifier === identifier);
70-
if (token) {
71-
break;
72-
}
73-
}
74-
}
61+
switch (tokenType) {
62+
case CompletionItemKind.Function:
63+
case CompletionItemKind.Constant:
64+
token = localScope.functionsComplexTokens.find((candidate) => candidate.identifier === identifier);
65+
if (token) break;
7566

76-
if (!token && (tokenType === CompletionItemKind.Constant || tokenType === CompletionItemKind.Function)) {
77-
const localStandardLibDefinitions = this.server.documentsCollection.get("nwscript");
78-
const tokensWithRef = document.getGlobalComplexTokensWithRef();
67+
const localStandardLibDefinitions = this.server.documentsCollection.get("nwscript");
68+
tokensWithRef = document.getGlobalComplexTokensWithRef();
7969

80-
if (localStandardLibDefinitions) {
81-
tokensWithRef.push({ owner: localStandardLibDefinitions?.uri, tokens: localStandardLibDefinitions?.complexTokens });
82-
}
70+
if (localStandardLibDefinitions) {
71+
tokensWithRef.push({ owner: localStandardLibDefinitions?.uri, tokens: localStandardLibDefinitions?.complexTokens });
72+
}
8373

84-
for (let i = 0; i < tokensWithRef.length; i++) {
85-
ref = tokensWithRef[i];
74+
loop: for (let i = 0; i < tokensWithRef.length; i++) {
75+
ref = tokensWithRef[i];
8676

87-
token = ref.tokens.find((token) => token.identifier === identifier);
88-
if (token) {
89-
break;
90-
}
91-
}
77+
token = ref?.tokens.find((candidate) => candidate.identifier === identifier);
78+
if (token) {
79+
break loop;
9280
}
9381
}
94-
95-
if (token) {
96-
if (ref && !ref.owner) {
97-
return {
98-
uri,
99-
range: {
100-
start: { line: position.line, character: position.character },
101-
end: { line: position.line, character: position.character },
102-
},
103-
};
82+
break;
83+
case CompletionItemKind.Struct:
84+
tokensWithRef = document.getGlobalStructComplexTokensWithRef();
85+
loop: for (let i = 0; i < tokensWithRef.length; i++) {
86+
ref = tokensWithRef[i];
87+
88+
token = ref?.tokens.find((candidate) => candidate.identifier === identifier);
89+
if (token) {
90+
break loop;
10491
}
92+
}
93+
break;
94+
case CompletionItemKind.Property:
95+
const structIdentifer = localScope.functionVariablesComplexTokens.find((candidate) => candidate.identifier === structVariableIdentifier)?.valueType;
10596

106-
return {
107-
uri: ref ? ref.owner || "" : uri,
108-
range: {
109-
start: { line: token.position.line, character: token.position.character },
110-
end: { line: token.position.line, character: token.position.character },
111-
},
112-
};
97+
tokensWithRef = document.getGlobalStructComplexTokensWithRef();
98+
loop: for (let i = 0; i < tokensWithRef.length; i++) {
99+
ref = tokensWithRef[i];
100+
101+
token = (ref as OwnedStructComplexTokens).tokens.find((candidate) => candidate.identifier === structIdentifer)?.properties.find((property) => property.identifier === identifier);
102+
103+
if (token) {
104+
break loop;
105+
}
113106
}
114-
}
107+
break;
108+
default:
109+
token = localScope.functionVariablesComplexTokens.find((candidate) => candidate.identifier === identifier);
110+
}
115111

116-
return undefined;
117-
};
112+
return [token, ref];
118113
}
119114
}

0 commit comments

Comments
 (0)