mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
2.5 KiB
42 lines
2.5 KiB
/******************************************************************************
|
|
* Copyright 2022 TypeFox GmbH
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the MIT License, which is available in the project root.
|
|
******************************************************************************/
|
|
import { LocationLink, Range } from 'vscode-languageserver';
|
|
import { DefaultDefinitionProvider } from '../../lsp/index.js';
|
|
import { streamContents } from '../../utils/ast-utils.js';
|
|
import { findAssignment } from '../../utils/grammar-utils.js';
|
|
import { isGrammarImport } from '../../languages/generated/ast.js';
|
|
import { resolveImport } from '../internal-grammar-util.js';
|
|
export class LangiumGrammarDefinitionProvider extends DefaultDefinitionProvider {
|
|
constructor(services) {
|
|
super(services);
|
|
this.documents = services.shared.workspace.LangiumDocuments;
|
|
}
|
|
collectLocationLinks(sourceCstNode, _params) {
|
|
var _a, _b, _c, _d, _e, _f;
|
|
const pathFeature = 'path';
|
|
if (isGrammarImport(sourceCstNode.astNode) && ((_a = findAssignment(sourceCstNode)) === null || _a === void 0 ? void 0 : _a.feature) === pathFeature) {
|
|
const importedGrammar = resolveImport(this.documents, sourceCstNode.astNode);
|
|
if (importedGrammar === null || importedGrammar === void 0 ? void 0 : importedGrammar.$document) {
|
|
const targetObject = (_b = this.findTargetObject(importedGrammar)) !== null && _b !== void 0 ? _b : importedGrammar;
|
|
const selectionRange = (_d = (_c = this.nameProvider.getNameNode(targetObject)) === null || _c === void 0 ? void 0 : _c.range) !== null && _d !== void 0 ? _d : Range.create(0, 0, 0, 0);
|
|
const previewRange = (_f = (_e = targetObject.$cstNode) === null || _e === void 0 ? void 0 : _e.range) !== null && _f !== void 0 ? _f : Range.create(0, 0, 0, 0);
|
|
return [
|
|
LocationLink.create(importedGrammar.$document.uri.toString(), previewRange, selectionRange, sourceCstNode.range)
|
|
];
|
|
}
|
|
return undefined;
|
|
}
|
|
return super.collectLocationLinks(sourceCstNode, _params);
|
|
}
|
|
findTargetObject(importedGrammar) {
|
|
// Jump to grammar name or the first element
|
|
if (importedGrammar.isDeclared) {
|
|
return importedGrammar;
|
|
}
|
|
return streamContents(importedGrammar).head();
|
|
}
|
|
}
|
|
//# sourceMappingURL=grammar-definition.js.map
|