vscode-tmgrammar-test
Version:
Test runner for VSCode textmate grammars
116 lines • 4.78 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadConfiguration = exports.createRegistryFromGrammars = exports.createRegistry = void 0;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const tm = __importStar(require("vscode-textmate"));
const oniguruma = __importStar(require("vscode-oniguruma"));
function createRegistry(gs) {
return createRegistryFromGrammars(gs.map((grammar) => {
return {
grammar,
content: fs.readFileSync(grammar.path).toString()
};
}));
}
exports.createRegistry = createRegistry;
function createRegistryFromGrammars(grammars) {
let grammarIndex = {};
let _injections = {};
for (const g of grammars) {
const { grammar, content } = g;
let rawGrammar = tm.parseRawGrammar(content, grammar.path);
grammarIndex[grammar.scopeName || rawGrammar.scopeName] = rawGrammar;
if (grammar.injectTo) {
for (let injectScope of grammar.injectTo) {
let injections = _injections[injectScope];
if (!injections) {
_injections[injectScope] = injections = [];
}
injections.push(grammar.scopeName);
}
}
}
const wasmPath = require.resolve('vscode-oniguruma').replace(/main\.js$/, 'onig.wasm');
const wasmBin = fs.readFileSync(wasmPath).buffer;
const vscodeOnigurumaLib = oniguruma.loadWASM(wasmBin).then(() => {
return {
createOnigScanner(patterns) {
return new oniguruma.OnigScanner(patterns);
},
createOnigString(s) {
return new oniguruma.OnigString(s);
}
};
});
return new tm.Registry({
onigLib: vscodeOnigurumaLib,
loadGrammar: (scopeName) => {
if (grammarIndex[scopeName] !== undefined) {
return new Promise((fulfill, _) => {
fulfill(grammarIndex[scopeName]);
});
}
console.warn(`grammar not found for "${scopeName}"`);
return null;
},
getInjections: (scopeName) => {
const xs = scopeName.split('.');
let injections = [];
for (let i = 1; i <= xs.length; i++) {
const subScopeName = xs.slice(0, i).join('.');
injections = [...injections, ...(_injections[subScopeName] || [])];
}
return injections;
}
});
}
exports.createRegistryFromGrammars = createRegistryFromGrammars;
function loadConfiguration(config, scope, grammar) {
const configPath = config || 'package.json';
let grammars = [];
let extensionToScope = (_) => scope || undefined;
if (grammar) {
const xs = grammar.map((path) => ({ path, scopeName: '' }));
grammars.push(...xs);
}
if (fs.existsSync(configPath)) {
const json = JSON.parse(fs.readFileSync(configPath).toString());
let xs = json?.contributes?.grammars || [];
const dirPath = path.dirname(configPath);
xs.forEach((x) => {
x.path = path.join(dirPath, x.path);
});
grammars.push(...xs);
let ys = json?.contributes?.languages || [];
let langToScope = Object.assign({}, ...grammars.filter((x) => x.language).map((x) => ({ [x.language || '']: x.scopeName })));
let extToLang = Object.assign({}, ...ys.map((x) => (x.extensions || []).map((e) => ({ [e]: x.id }))).flat());
extensionToScope = (ext) => scope || langToScope[extToLang[ext]];
}
return { grammars, extensionToScope };
}
exports.loadConfiguration = loadConfiguration;
//# sourceMappingURL=index.js.map
;