plaxtony
Version:
Static code analysis of SC2 Galaxy Script
64 lines • 2.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DefinitionProvider = void 0;
const checker_1 = require("../compiler/checker");
const provider_1 = require("./provider");
const utils_1 = require("../compiler/utils");
const utils_2 = require("./utils");
const lsp = require("vscode-languageserver");
class DefinitionProvider extends provider_1.AbstractProvider {
processIncludeStatement(inclStmt) {
const links = [];
const qresults = this.store.qualifiedDocuments.get(inclStmt.path.value.toLowerCase().replace(/\.galaxy$/, ''));
if (!qresults)
return;
for (const qsfile of qresults.values()) {
const targetRange = lsp.Range.create({ line: 0, character: 0 }, { line: 0, character: 0 });
links.push({
targetUri: qsfile.fileName,
targetRange: utils_2.getNodeRange(qsfile),
targetSelectionRange: targetRange,
originSelectionRange: utils_2.getNodeRange(inclStmt.path),
});
}
return links;
}
processIdentifier(identifier) {
const links = [];
const checker = new checker_1.TypeChecker(this.store);
const symbol = checker.getSymbolAtLocation(identifier);
if (!symbol)
return;
for (const decl of symbol.declarations) {
let declName = decl;
if (utils_1.isNamedDeclarationKind(decl.kind)) {
declName = decl.name;
}
const sourceFile = utils_1.getSourceFileOfNode(decl);
links.push({
targetUri: sourceFile.fileName,
targetRange: utils_2.getNodeRange(decl),
targetSelectionRange: utils_2.getNodeRange(declName),
});
}
return links;
}
getDefinitionAt(uri, position) {
const sourceFile = this.store.documents.get(uri);
if (!sourceFile)
return;
const currentToken = utils_2.getTokenAtPosition(position, sourceFile);
if (!currentToken)
return;
if (currentToken.kind === 3 /* StringLiteral */) {
if (currentToken.parent.kind === 136 /* IncludeStatement */) {
return this.processIncludeStatement(currentToken.parent);
}
}
else if (currentToken.kind === 113 /* Identifier */) {
return this.processIdentifier(currentToken);
}
}
}
exports.DefinitionProvider = DefinitionProvider;
//# sourceMappingURL=definitions.js.map