langium
Version:
A language engineering tool for the Language Server Protocol
98 lines • 5.38 kB
TypeScript
/******************************************************************************
* Copyright 2021 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 type { LangiumCoreServices } from '../services.js';
import type { AstNode, AstNodeDescription, AstReflection, CstNode, LinkingError, MultiReference, MultiReferenceItem, Reference, ReferenceInfo } from '../syntax-tree.js';
import type { AstNodeLocator } from '../workspace/ast-node-locator.js';
import type { LangiumDocument, LangiumDocuments } from '../workspace/documents.js';
import type { ScopeProvider } from './scope-provider.js';
import { CancellationToken } from '../utils/cancellation.js';
/**
* Language-specific service for resolving cross-references in the AST.
*/
export interface Linker {
/**
* Links all cross-references within the specified document. The default implementation loads only target
* elements from documents that are present in the `LangiumDocuments` service. The linked references are
* stored in the document's `references` property.
*
* @param document A LangiumDocument that shall be linked.
* @param cancelToken A token for cancelling the operation.
*
* @throws `OperationCancelled` if a cancellation event is detected
*/
link(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void>;
/**
* Unlinks all references within the specified document and removes them from the list of `references`.
*
* @param document A LangiumDocument that shall be unlinked.
*/
unlink(document: LangiumDocument): void;
/**
* Determines a candidate AST node description for linking the given reference.
*
* @param refInfo Information about the reference.
*/
getCandidate(refInfo: ReferenceInfo): AstNodeDescription | LinkingError;
/**
* Determines a candidate AST node description for linking the given reference.
*
* @param node The AST node containing the reference.
* @param refId The reference identifier used to build a scope.
* @param reference The actual reference to resolve.
*/
getCandidates(refInfo: ReferenceInfo): AstNodeDescription[] | LinkingError;
/**
* Creates a cross reference node being aware of its containing AstNode, the corresponding CstNode,
* the cross reference text denoting the target AstNode being already extracted of the document text,
* as well as the unique cross reference identifier.
*
* Default behavior:
* - The returned Reference's 'ref' property pointing to the target AstNode is populated lazily on its
* first visit.
* - If the target AstNode cannot be resolved on the first visit, an error indicator will be installed
* and further resolution attempts will *not* be performed.
*
* @param node The containing AST node
* @param property The AST node property being referenced
* @param refNode The corresponding CST node
* @param refText The cross reference text denoting the target AstNode
* @returns the desired Reference node, whose behavior wrt. resolving the cross reference is implementation specific.
*/
buildReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): Reference;
buildMultiReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): MultiReference;
}
export declare const RefResolving: unique symbol;
export interface DefaultReference extends Reference {
_ref?: AstNode | LinkingError | typeof RefResolving;
_nodeDescription?: AstNodeDescription;
}
export interface DefaultMultiReference extends MultiReference {
_items: MultiReferenceItem[] | typeof RefResolving | undefined;
_linkingError?: LinkingError;
}
export declare class DefaultLinker implements Linker {
protected readonly reflection: AstReflection;
protected readonly scopeProvider: ScopeProvider;
protected readonly astNodeLocator: AstNodeLocator;
protected readonly langiumDocuments: () => LangiumDocuments;
constructor(services: LangiumCoreServices);
link(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void>;
protected doLink(refInfo: ReferenceInfo, document: LangiumDocument): void;
unlink(document: LangiumDocument): void;
getCandidate(refInfo: ReferenceInfo): AstNodeDescription | LinkingError;
getCandidates(refInfo: ReferenceInfo): AstNodeDescription[] | LinkingError;
buildReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): Reference;
buildMultiReference(node: AstNode, property: string, refNode: CstNode | undefined, refText: string): MultiReference;
protected throwCyclicReferenceError(node: AstNode, property: string, refText: string): never;
protected getLinkedNode(refInfo: ReferenceInfo): {
node?: AstNode;
descr?: AstNodeDescription;
error?: LinkingError;
};
protected loadAstNode(nodeDescription: AstNodeDescription): AstNode | undefined;
protected createLinkingError(refInfo: ReferenceInfo, targetDescription?: AstNodeDescription): LinkingError;
}
//# sourceMappingURL=linker.d.ts.map