in src/rule.ts [796:875]
private static _compilePatterns(patterns: IRawRule[] | undefined, helper: IRuleFactoryHelper, repository: IRawRepository): ICompilePatternsResult {
let r: number[] = [];
if (patterns) {
for (let i = 0, len = patterns.length; i < len; i++) {
const pattern = patterns[i];
let patternId = -1;
if (pattern.include) {
if (pattern.include.charAt(0) === '#') {
// Local include found in `repository`
let localIncludedRule = repository[pattern.include.substr(1)];
if (localIncludedRule) {
patternId = RuleFactory.getCompiledRuleId(localIncludedRule, helper, repository);
} else {
// console.warn('CANNOT find rule for scopeName: ' + pattern.include + ', I am: ', repository['$base'].name);
}
} else if (pattern.include === '$base' || pattern.include === '$self') {
// Special include also found in `repository`
patternId = RuleFactory.getCompiledRuleId(repository[pattern.include], helper, repository);
} else {
let externalGrammarName: string | null = null;
let externalGrammarInclude: string | null = null;
let sharpIndex = pattern.include.indexOf('#');
if (sharpIndex >= 0) {
externalGrammarName = pattern.include.substring(0, sharpIndex);
externalGrammarInclude = pattern.include.substring(sharpIndex + 1);
} else {
externalGrammarName = pattern.include;
}
// External include
const externalGrammar = helper.getExternalGrammar(externalGrammarName, repository);
if (externalGrammar) {
if (externalGrammarInclude) {
let externalIncludedRule = externalGrammar.repository[externalGrammarInclude];
if (externalIncludedRule) {
patternId = RuleFactory.getCompiledRuleId(externalIncludedRule, helper, externalGrammar.repository);
} else {
// console.warn('CANNOT find rule for scopeName: ' + pattern.include + ', I am: ', repository['$base'].name);
}
} else {
patternId = RuleFactory.getCompiledRuleId(externalGrammar.repository.$self, helper, externalGrammar.repository);
}
} else {
// console.warn('CANNOT find grammar for scopeName: ' + pattern.include + ', I am: ', repository['$base'].name);
}
}
} else {
patternId = RuleFactory.getCompiledRuleId(pattern, helper, repository);
}
if (patternId !== -1) {
const rule = helper.getRule(patternId);
let skipRule = false;
if (rule instanceof IncludeOnlyRule || rule instanceof BeginEndRule || rule instanceof BeginWhileRule) {
if (rule.hasMissingPatterns && rule.patterns.length === 0) {
skipRule = true;
}
}
if (skipRule) {
// console.log('REMOVING RULE ENTIRELY DUE TO EMPTY PATTERNS THAT ARE MISSING');
continue;
}
r.push(patternId);
}
}
}
return {
patterns: r,
hasMissingPatterns: ((patterns ? patterns.length : 0) !== r.length)
};
}