UNPKG

@stackpress/idea-parser

Version:

Parses ideas to AST and readable JSON.

226 lines (225 loc) 8.22 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const definitions_js_1 = require("../definitions.js"); const AbstractTree_js_1 = __importDefault(require("./AbstractTree.js")); class TypeTree extends AbstractTree_js_1.default { static definitions(lexer) { super.definitions(lexer); lexer.define('Type', (code, index) => { const regexp = /^[A-Z][a-zA-Z0-9_]*((\[\])|\?)?/; const results = (0, definitions_js_1.scan)('Literal', regexp, code, index); if (results) { const square = code.substring(results.end, results.end + 2); if (results.end > index && square === '[]') { results.end += 2; results.value += square; } results.raw = `"${results.value}"`; } return results; }); lexer.define('TypeWord', (code, index) => (0, definitions_js_1.scan)('_TypeWord', /^type/, code, index)); return lexer; } static parse(code, start = 0) { return new this().parse(code, start); } parse(code, start = 0) { this._lexer.load(code, start); return this.type(); } parameter() { const key = this._lexer.expect('AttributeIdentifier'); key.name = key.name.slice(1); const elements = []; if (this._lexer.optional('(')) { this.noncode(); const data = this.constructor.data; let results; do { results = this._lexer.optional(data); if (results) { elements.push(results); this.noncode(); continue; } } while (results); this._lexer.expect(')'); } return { type: 'Property', kind: 'init', start: key.start, end: this._lexer.index, method: false, shorthand: false, computed: false, key, value: elements.length ? { type: 'ArrayExpression', start: key.start, end: this._lexer.index, elements } : { type: 'Literal', start: key.start, end: this._lexer.index, value: true, raw: 'true' } }; } property() { const key = this._lexer.expect('CamelIdentifier'); this._lexer.expect('whitespace'); const value = this._lexer.expect('Type'); this._lexer.expect('whitespace'); const properties = []; this.dotry(() => { properties.push(this.parameter()); this.noncode(); }); return { type: 'Property', kind: 'init', start: key.start, end: this._lexer.index, method: false, shorthand: false, computed: false, key, value: { type: 'ObjectExpression', start: value.start, end: this._lexer.index, properties: [ { type: 'Property', kind: 'init', start: value.start, end: value.end, method: false, shorthand: false, computed: false, key: { type: 'Identifier', start: value.start, end: value.end, name: 'type', }, value }, { type: 'Property', kind: 'init', start: value.start, end: this._lexer.index, method: false, shorthand: false, computed: false, key: { type: 'Identifier', start: value.start, end: value.end, name: 'attributes', }, value: { type: 'ObjectExpression', start: value.start, end: value.end, properties } } ] } }; } type() { const type = this._lexer.expect('TypeWord'); this._lexer.expect('whitespace'); const id = this._lexer.expect('CapitalIdentifier'); const final = this._lexer.optional('!'); this._lexer.expect('whitespace'); const properties = []; this.dotry(() => { properties.push(this.parameter()); this.noncode(); }); this.noncode(); this._lexer.expect('{'); this.noncode(); const columns = []; this.dotry(() => { columns.push(this.property()); }); this._lexer.expect('}'); return { type: 'VariableDeclaration', kind: 'type', mutable: !Boolean(final), start: type.start, end: this._lexer.index, declarations: [{ type: 'VariableDeclarator', start: type.start, end: this._lexer.index, id, init: { type: 'ObjectExpression', start: type.start, end: this._lexer.index, properties: [ { type: 'Property', kind: 'init', start: type.start, end: this._lexer.index, method: false, shorthand: false, computed: false, key: { type: 'Identifier', start: type.start, end: type.end, name: 'attributes', }, value: { type: 'ObjectExpression', start: type.start, end: type.end, properties } }, { type: 'Property', kind: 'init', start: type.start, end: this._lexer.index, method: false, shorthand: false, computed: false, key: { type: 'Identifier', start: type.start, end: type.end, name: 'columns', }, value: { type: 'ObjectExpression', start: type.start, end: type.end, properties: columns } } ] } }] }; } } TypeTree.data = [...definitions_js_1.data, 'CapitalIdentifier']; exports.default = TypeTree; ;