@agoric/babel-parser
Version:
A JavaScript parser
102 lines (77 loc) • 2.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parse = parse;
exports.parseExpression = parseExpression;
Object.defineProperty(exports, "tokTypes", {
enumerable: true,
get: function () {
return _types.types;
}
});
var _pluginUtils = require("./plugin-utils");
var _parser = _interopRequireDefault(require("./parser"));
var _types = require("./tokenizer/types");
require("./tokenizer/context");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function parse(input, options) {
if (options && options.sourceType === "unambiguous") {
options = Object.assign({}, options);
try {
options.sourceType = "module";
const parser = getParser(options, input);
const ast = parser.parse();
if (parser.sawUnambiguousESM) {
return ast;
}
if (parser.ambiguousScriptDifferentAst) {
try {
options.sourceType = "script";
return getParser(options, input).parse();
} catch {}
} else {
ast.program.sourceType = "script";
}
return ast;
} catch (moduleError) {
try {
options.sourceType = "script";
return getParser(options, input).parse();
} catch {}
throw moduleError;
}
} else {
return getParser(options, input).parse();
}
}
function parseExpression(input, options) {
const parser = getParser(options, input);
if (parser.options.strictMode) {
parser.state.strict = true;
}
return parser.getExpression();
}
function getParser(options, input) {
let cls = _parser.default;
if (options && options.plugins) {
(0, _pluginUtils.validatePlugins)(options.plugins);
cls = getParserClass(options.plugins);
}
return new cls(options, input);
}
const parserClassCache = {};
function getParserClass(pluginsFromOptions) {
const pluginList = _pluginUtils.mixinPluginNames.filter(name => (0, _pluginUtils.hasPlugin)(pluginsFromOptions, name));
const key = pluginList.join("/");
let cls = parserClassCache[key];
if (!cls) {
cls = _parser.default;
for (let _i = 0; _i < pluginList.length; _i++) {
const plugin = pluginList[_i];
cls = _pluginUtils.mixinPlugins[plugin](cls);
}
parserClassCache[key] = cls;
}
return cls;
}