Files
infocom-systems-design/node_modules/langium/lib/references/scope.js
2025-10-03 22:27:28 +03:00

80 lines
2.8 KiB
JavaScript

/******************************************************************************
* Copyright 2023 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 { EMPTY_STREAM, stream } from '../utils/stream.js';
/**
* The default scope implementation is based on a `Stream`. It has an optional _outer scope_ describing
* the next level of elements, which are queried when a target element is not found in the stream provided
* to this scope.
*/
export class StreamScope {
constructor(elements, outerScope, options) {
var _a;
this.elements = elements;
this.outerScope = outerScope;
this.caseInsensitive = (_a = options === null || options === void 0 ? void 0 : options.caseInsensitive) !== null && _a !== void 0 ? _a : false;
}
getAllElements() {
if (this.outerScope) {
return this.elements.concat(this.outerScope.getAllElements());
}
else {
return this.elements;
}
}
getElement(name) {
const local = this.caseInsensitive
? this.elements.find(e => e.name.toLowerCase() === name.toLowerCase())
: this.elements.find(e => e.name === name);
if (local) {
return local;
}
if (this.outerScope) {
return this.outerScope.getElement(name);
}
return undefined;
}
}
export class MapScope {
constructor(elements, outerScope, options) {
var _a;
this.elements = new Map();
this.caseInsensitive = (_a = options === null || options === void 0 ? void 0 : options.caseInsensitive) !== null && _a !== void 0 ? _a : false;
for (const element of elements) {
const name = this.caseInsensitive
? element.name.toLowerCase()
: element.name;
this.elements.set(name, element);
}
this.outerScope = outerScope;
}
getElement(name) {
const localName = this.caseInsensitive ? name.toLowerCase() : name;
const local = this.elements.get(localName);
if (local) {
return local;
}
if (this.outerScope) {
return this.outerScope.getElement(name);
}
return undefined;
}
getAllElements() {
let elementStream = stream(this.elements.values());
if (this.outerScope) {
elementStream = elementStream.concat(this.outerScope.getAllElements());
}
return elementStream;
}
}
export const EMPTY_SCOPE = {
getElement() {
return undefined;
},
getAllElements() {
return EMPTY_STREAM;
}
};
//# sourceMappingURL=scope.js.map