in src/grammar.ts [804:857]
function matchInjections(injections: Injection[], grammar: Grammar, lineText: OnigString, isFirstLine: boolean, linePos: number, stack: StackElement, anchorPosition: number): IMatchInjectionsResult | null {
// The lower the better
let bestMatchRating = Number.MAX_VALUE;
let bestMatchCaptureIndices: IOnigCaptureIndex[] | null = null;
let bestMatchRuleId: number;
let bestMatchResultPriority: number = 0;
const scopes = stack.contentNameScopesList.generateScopes();
for (let i = 0, len = injections.length; i < len; i++) {
const injection = injections[i];
if (!injection.matcher(scopes)) {
// injection selector doesn't match stack
continue;
}
const rule = grammar.getRule(injection.ruleId);
const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, null, isFirstLine, linePos === anchorPosition);
const matchResult = ruleScanner.scanner.findNextMatchSync(lineText, linePos, findOptions);
if (!matchResult) {
continue;
}
if (DebugFlags.InDebugMode) {
console.log(` matched injection: ${injection.debugSelector}`);
console.log(debugCompiledRuleToString(ruleScanner));
}
const matchRating = matchResult.captureIndices[0].start;
if (matchRating >= bestMatchRating) {
// Injections are sorted by priority, so the previous injection had a better or equal priority
continue;
}
bestMatchRating = matchRating;
bestMatchCaptureIndices = matchResult.captureIndices;
bestMatchRuleId = ruleScanner.rules[matchResult.index];
bestMatchResultPriority = injection.priority;
if (bestMatchRating === linePos) {
// No more need to look at the rest of the injections.
break;
}
}
if (bestMatchCaptureIndices) {
return {
priorityMatch: bestMatchResultPriority === -1,
captureIndices: bestMatchCaptureIndices,
matchedRuleId: bestMatchRuleId!
};
}
return null;
}