|
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.convertProgramNode = exports.TokenConvertor = void 0;
- const validate_1 = require("./validate");
- const errors_1 = require("./errors");
- const acorn_1 = require("./modules/acorn");
- class TokenConvertor {
- constructor(code) {
- this.templateBuffer = [];
- this.code = code;
- this.tokTypes = (0, acorn_1.getAcorn)().tokTypes;
- }
- convertToken(token) {
- const { tokTypes } = this;
- let type, value;
- const additional = {};
- if (token.type === tokTypes.string) {
- type = "String";
- value = this.code.slice(...token.range);
- }
- else if (token.type === tokTypes.num) {
- type = "Numeric";
- value = this.code.slice(...token.range);
- }
- else if (token.type.keyword) {
- if (token.type.keyword === "true" ||
- token.type.keyword === "false") {
- type = "Boolean";
- }
- else if (token.type.keyword === "null") {
- type = "Null";
- }
- else {
- type = "Keyword";
- }
- value = token.value;
- }
- else if (token.type === tokTypes.braceL ||
- token.type === tokTypes.braceR ||
- token.type === tokTypes.bracketL ||
- token.type === tokTypes.bracketR ||
- token.type === tokTypes.colon ||
- token.type === tokTypes.comma ||
- token.type === tokTypes.plusMin) {
- type = "Punctuator";
- value = this.code.slice(...token.range);
- }
- else if (token.type === tokTypes.name) {
- type = "Identifier";
- value = token.value;
- }
- else if (token.type === tokTypes.backQuote) {
- if (this.templateBuffer.length > 0) {
- const first = this.templateBuffer[0];
- this.templateBuffer.length = 0;
- return {
- type: "Template",
- value: this.code.slice(first.start, token.end),
- range: [first.start, token.end],
- loc: {
- start: first.loc.start,
- end: token.loc.end,
- },
- };
- }
- this.templateBuffer.push(token);
- return null;
- }
- else if (token.type === tokTypes.template) {
- if (this.templateBuffer.length === 0) {
- return (0, errors_1.throwUnexpectedTokenError)(this.code.slice(...token.range), token);
- }
- this.templateBuffer.push(token);
- return null;
- }
- else if (token.type === tokTypes.regexp) {
- const reValue = token.value;
- type = "RegularExpression";
- additional.regex = {
- flags: reValue.flags,
- pattern: reValue.pattern,
- };
- value = `/${reValue.pattern}/${reValue.flags}`;
- }
- else {
- return (0, errors_1.throwUnexpectedTokenError)(this.code.slice(...token.range), token);
- }
- ;
- token.type = type;
- token.value = value;
- for (const k in additional) {
- ;
- token[k] = additional[k];
- }
- return token;
- }
- }
- exports.TokenConvertor = TokenConvertor;
- function convertProgramNode(node, tokens, ctx, code) {
- if (node.type !== "JSONObjectExpression" &&
- node.type !== "JSONArrayExpression" &&
- node.type !== "JSONLiteral" &&
- node.type !== "JSONUnaryExpression" &&
- node.type !== "JSONIdentifier" &&
- node.type !== "JSONTemplateLiteral") {
- return (0, errors_1.throwUnexpectedNodeError)(node, tokens);
- }
- if (node.type === "JSONIdentifier") {
- if (!(0, validate_1.isStaticValueIdentifier)(node, ctx)) {
- return (0, errors_1.throwUnexpectedNodeError)(node, tokens);
- }
- }
- const body = Object.assign(Object.assign({ type: "JSONExpressionStatement", expression: node }, cloneLocation(node)), { parent: null });
- setParent(node, body);
- const end = code.length;
- const endLoc = (0, acorn_1.getAcorn)().getLineInfo(code, end);
- const nn = {
- type: "Program",
- body: [body],
- comments: [],
- tokens: [],
- range: [0, end],
- loc: {
- start: {
- line: 1,
- column: 0,
- },
- end: {
- line: endLoc.line,
- column: endLoc.column,
- },
- },
- parent: null,
- };
- setParent(body, nn);
- return nn;
- }
- exports.convertProgramNode = convertProgramNode;
- function cloneLocation(node) {
- const range = node.range;
- const loc = node.loc;
- return {
- range: [range[0], range[1]],
- loc: {
- start: {
- line: loc.start.line,
- column: loc.start.column,
- },
- end: {
- line: loc.end.line,
- column: loc.end.column,
- },
- },
- };
- }
- function setParent(prop, parent) {
- ;
- prop.parent = parent;
- }
|