|
1 | 1 | import { |
2 | | - BinOpNode, ConstNode, Ast, Token, ParserOptions, AstNode, OperatorsMap, OperationTypes, |
3 | | - Operators, AssignNode, TokenTypes, SetSingleVarNode, GetSingleVarNode, FunctionCallNode, |
4 | | - getTokenType, getTokenValue, isTokenTypeLiteral, getStartLine, getStartColumn, getEndColumn, |
5 | | - getEndLine, findOperators, splitTokens, DotObjectAccessNode, BracketObjectAccessNode, findTokenValueIndexes, findTokenValueIndex, FunctionDefNode |
| 2 | + BinOpNode, ConstNode, Ast, Token, ParserOptions, AstNode, Operators, AssignNode, TokenTypes, |
| 3 | + GetSingleVarNode, FunctionCallNode, getTokenType, getTokenValue, isTokenTypeLiteral, getStartLine, |
| 4 | + getStartColumn, getEndColumn, getEndLine, findOperators, splitTokens, DotObjectAccessNode, BracketObjectAccessNode, |
| 5 | + findTokenValueIndex, FunctionDefNode, CreateObjectNode, ObjectPropertyInfo, CreateArrayNode |
6 | 6 | } from '../common'; |
7 | 7 |
|
8 | 8 | export class InstructionLine { |
@@ -246,6 +246,39 @@ export class Parser { |
246 | 246 | return new BracketObjectAccessNode(name, paramsNodes); |
247 | 247 | } |
248 | 248 |
|
| 249 | + // create Object Node |
| 250 | + if (getTokenValue(tokens[0]) === '{' && getTokenValue(tokens[tokens.length - 1]) === '}') { |
| 251 | + const keyValueTokens = splitTokens(tokens.splice(1, tokens.length - 2), ','); |
| 252 | + const props = [] as ObjectPropertyInfo[]; |
| 253 | + for (let i = 0; i < keyValueTokens.length; i++) { |
| 254 | + const keyValue = splitTokens(keyValueTokens[i], ':'); |
| 255 | + if (keyValue.length !== 2) { |
| 256 | + throw Error('Incorrect JSON') |
| 257 | + } |
| 258 | + |
| 259 | + // unquoted string becomes a variable, so, we don't need it, that is why we are creating const node explicitlely |
| 260 | + const name = (keyValue[0].length === 1 && !`'"`.includes((getTokenValue(keyValue[0][0]) as string)[0])) |
| 261 | + ? new ConstNode(keyValue[0][0]) |
| 262 | + : this.createExpressionNode(keyValue[0]); |
| 263 | + const pInfo = { |
| 264 | + name, |
| 265 | + value: this.createExpressionNode(keyValue[1]) |
| 266 | + } as ObjectPropertyInfo; |
| 267 | + |
| 268 | + props.push(pInfo); |
| 269 | + } |
| 270 | + |
| 271 | + return new CreateObjectNode(props) |
| 272 | + } |
| 273 | + |
| 274 | + // create Array Node |
| 275 | + if (getTokenValue(tokens[0]) === '[' && getTokenValue(tokens[tokens.length - 1]) === ']') { |
| 276 | + const items = splitTokens(tokens.splice(1, tokens.length - 2), ',') |
| 277 | + .map(tkns => this.createExpressionNode(tkns)); |
| 278 | + |
| 279 | + return new CreateArrayNode(items); |
| 280 | + } |
| 281 | + |
249 | 282 | throw new Error('Undefined node error.'); |
250 | 283 | } |
251 | 284 | } |
0 commit comments