in src/grammar.ts [512:567]
private _collectInjections(): Injection[] {
const grammarRepository: IGrammarRepository = {
lookup: (scopeName: string): IRawGrammar | undefined => {
if (scopeName === this._scopeName) {
return this._grammar;
}
return this.getExternalGrammar(scopeName);
},
injections: (scopeName: string): string[] => {
return this._grammarRepository.injections(scopeName);
}
};
const dependencyProcessor = new ScopeDependencyProcessor(grammarRepository, this._scopeName);
// TODO: uncomment below to visit all scopes
// while (dependencyProcessor.Q.length > 0) {
// dependencyProcessor.processQueue();
// }
const result: Injection[] = [];
dependencyProcessor.seenFullScopeRequests.forEach((scopeName) => {
const grammar = grammarRepository.lookup(scopeName);
if (!grammar) {
return;
}
// add injections from the current grammar
const rawInjections = grammar.injections;
if (rawInjections) {
for (let expression in rawInjections) {
collectInjections(result, expression, rawInjections[expression], this, grammar);
}
}
// add injection grammars contributed for the current scope
if (this._grammarRepository) {
const injectionScopeNames = this._grammarRepository.injections(scopeName);
if (injectionScopeNames) {
injectionScopeNames.forEach(injectionScopeName => {
const injectionGrammar = this.getExternalGrammar(injectionScopeName);
if (injectionGrammar) {
const selector = injectionGrammar.injectionSelector;
if (selector) {
collectInjections(result, selector, injectionGrammar, this, injectionGrammar);
}
}
});
}
}
});
result.sort((i1, i2) => i1.priority - i2.priority); // sort by priority
return result;
}