Skip to content

Commit 4cd8467

Browse files
committed
parser: add custom parser to handle props statement
1 parent 269f86d commit 4cd8467

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/melody/melody-extension-core/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { SetParser } from "./parser/set.js";
3131
import { SpacelessParser } from "./parser/spaceless.js";
3232
import { UseParser } from "./parser/use.js";
3333
import { MountParser } from "./parser/mount.js";
34+
import { PropsParser } from "./parser/props.js";
3435

3536
import forVisitor from "./visitors/for.js";
3637
import testVisitor from "./visitors/tests.js";
@@ -97,7 +98,8 @@ export const extension = {
9798
SetParser,
9899
SpacelessParser,
99100
UseParser,
100-
MountParser
101+
MountParser,
102+
PropsParser
101103
],
102104
unaryOperators,
103105
binaryOperators,
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { DoStatement, PropItem, PropsStatement } from "../types.js";
2+
import {
3+
createNode,
4+
setEndFromToken,
5+
setStartFromToken,
6+
Types
7+
} from "../../melody-parser/index.js";
8+
import { Identifier } from "../../melody-types/index.js";
9+
10+
export const PropsParser = {
11+
name: "props",
12+
parse(parser, token) {
13+
const tokenStream = parser.tokens;
14+
const items = [];
15+
let name;
16+
let nameNode;
17+
let valueNode;
18+
19+
do {
20+
name = tokenStream.expect(Types.SYMBOL);
21+
nameNode = createNode(Identifier, name, name.text);
22+
if (tokenStream.test(Types.ASSIGNMENT)) {
23+
tokenStream.expect(Types.ASSIGNMENT);
24+
valueNode = parser.matchExpression();
25+
} else {
26+
valueNode = undefined;
27+
}
28+
const item = new PropItem(nameNode, valueNode);
29+
items.push(item);
30+
} while (tokenStream.nextIf(Types.COMMA));
31+
32+
const propsStatement = new PropsStatement(items);
33+
setStartFromToken(propsStatement, token);
34+
setEndFromToken(propsStatement, tokenStream.expect(Types.TAG_END));
35+
return propsStatement;
36+
}
37+
};

0 commit comments

Comments
 (0)