private _collectInjections()

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;
	}