[REF] parser: make AST definition more consistent

This commit is contained in:
Géry Debongnie
2022-03-07 14:31:17 +01:00
committed by Samuel Degueldre
parent 56086242bb
commit b3062d29f1
10 changed files with 356 additions and 293 deletions
+212 -146
View File
@@ -42,8 +42,8 @@ describe("qweb parser", () => {
tag: "div",
dynamicTag: null,
content: [],
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -69,8 +69,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
content: [],
@@ -83,8 +83,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
content: [{ type: ASTType.Text, value: "some text" }],
@@ -97,8 +97,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -108,8 +108,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -127,8 +127,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -138,8 +138,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -155,8 +155,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -180,8 +180,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -200,8 +200,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -222,8 +222,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -245,8 +245,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -262,7 +262,7 @@ describe("qweb parser", () => {
tag: "div",
dynamicTag: null,
attrs: { class: "abc" },
on: {},
on: null,
ref: null,
model: null,
ns: null,
@@ -294,7 +294,7 @@ describe("qweb parser", () => {
dynamicTag: null,
model: null,
ns: null,
on: {},
on: null,
ref: null,
tag: "circle",
type: 2,
@@ -303,7 +303,7 @@ describe("qweb parser", () => {
dynamicTag: null,
model: null,
ns: "http://www.w3.org/2000/svg",
on: {},
on: null,
ref: null,
tag: "svg",
type: 2,
@@ -311,7 +311,7 @@ describe("qweb parser", () => {
expect(
parse(`<g><circle cx="50" cy="50" r="4" stroke="green" stroke-width="1" fill="yellow"/></g>`)
).toEqual({
attrs: {},
attrs: null,
content: [
{
attrs: {
@@ -326,7 +326,7 @@ describe("qweb parser", () => {
dynamicTag: null,
model: null,
ns: null,
on: {},
on: null,
ref: null,
tag: "circle",
type: 2,
@@ -335,7 +335,7 @@ describe("qweb parser", () => {
dynamicTag: null,
model: null,
ns: "http://www.w3.org/2000/svg",
on: {},
on: null,
ref: null,
tag: "g",
type: 2,
@@ -347,16 +347,16 @@ describe("qweb parser", () => {
type: 2,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
content: [
{
type: 2,
tag: "pre",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
content: [],
model: null,
@@ -390,8 +390,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -412,8 +412,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -454,8 +454,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -468,8 +468,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -488,8 +488,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -529,8 +529,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -606,8 +606,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -625,8 +625,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "h1",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -638,8 +638,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "h2",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -684,8 +684,8 @@ describe("qweb parser", () => {
body: [
{
type: ASTType.DomNode,
attrs: {},
on: {},
attrs: null,
on: null,
tag: "div",
dynamicTag: null,
ref: null,
@@ -704,8 +704,8 @@ describe("qweb parser", () => {
body: [
{
type: ASTType.DomNode,
attrs: {},
on: {},
attrs: null,
on: null,
tag: "div",
dynamicTag: null,
ref: null,
@@ -741,8 +741,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -810,8 +810,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -852,8 +852,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -886,8 +886,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -920,7 +920,7 @@ describe("qweb parser", () => {
"t-att-selected": "category.id==options.active_category_id",
"t-att-value": "category.id",
},
on: {},
on: null,
ref: null,
model: null,
ns: null,
@@ -939,8 +939,8 @@ describe("qweb parser", () => {
parse(`<div><t t-foreach="list" t-as="item" t-key="item_index"><t t-esc="item"/></t></div>`)
).toEqual({
type: ASTType.DomNode,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
tag: "div",
@@ -983,10 +983,10 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
on: {},
on: null,
ref: null,
model: null,
attrs: {},
attrs: null,
ns: null,
content: [{ type: ASTType.TEsc, expr: "item", defaultValue: "" }],
},
@@ -1009,8 +1009,8 @@ describe("qweb parser", () => {
isDynamic: false,
name: "Comp",
dynamicProps: null,
props: {},
slots: {},
props: null,
slots: null,
on: null,
},
memo: "",
@@ -1086,8 +1086,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -1124,7 +1124,7 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "button",
dynamicTag: null,
attrs: {},
attrs: null,
on: { click: "add" },
ref: null,
model: null,
@@ -1142,8 +1142,8 @@ describe("qweb parser", () => {
type: 2,
tag: "select",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
content: [
{
@@ -1151,7 +1151,7 @@ describe("qweb parser", () => {
tag: "option",
dynamicTag: null,
attrs: { value: "1" },
on: {},
on: null,
ref: null,
content: [],
model: null,
@@ -1162,6 +1162,7 @@ describe("qweb parser", () => {
baseExpr: "state",
expr: "'model'",
targetAttr: "value",
hasDynamicChildren: false,
specialInitTargetAttr: null,
eventType: "change",
shouldTrim: false,
@@ -1178,8 +1179,8 @@ describe("qweb parser", () => {
type: 2,
tag: "select",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
content: [
{
@@ -1187,7 +1188,7 @@ describe("qweb parser", () => {
tag: "option",
dynamicTag: null,
attrs: { "t-att-value": "valueVar" },
on: {},
on: null,
ref: null,
content: [],
model: null,
@@ -1217,9 +1218,9 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
on: null,
slots: {},
slots: null,
isDynamic: false,
});
});
@@ -1232,7 +1233,7 @@ describe("qweb parser", () => {
props: { a: "1", b: "'b'" },
isDynamic: false,
on: null,
slots: {},
slots: null,
});
});
@@ -1244,7 +1245,7 @@ describe("qweb parser", () => {
props: { a: "1" },
isDynamic: false,
on: null,
slots: {},
slots: null,
});
});
@@ -1253,10 +1254,10 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: { click: "someMethod" },
slots: {},
slots: null,
});
});
@@ -1289,10 +1290,17 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: null,
slots: { default: { content: { type: ASTType.Text, value: "foo" } } },
slots: {
default: {
content: { type: ASTType.Text, value: "foo" },
attrs: null,
on: null,
scope: null,
},
},
});
});
@@ -1303,11 +1311,16 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: null,
slots: {
default: { content: { type: ASTType.Text, value: "foo" }, attrs: { param: "param" } },
default: {
content: { type: ASTType.Text, value: "foo" },
attrs: { param: "param" },
on: null,
scope: null,
},
},
});
});
@@ -1318,7 +1331,7 @@ describe("qweb parser", () => {
name: "MyComponent",
isDynamic: false,
dynamicProps: null,
props: {},
props: null,
on: null,
slots: {
default: {
@@ -1329,26 +1342,29 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "span",
dynamicTag: null,
attrs: {},
attrs: null,
content: [],
ref: null,
model: null,
on: {},
on: null,
ns: null,
},
{
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
attrs: null,
content: [],
ref: null,
model: null,
on: {},
on: null,
ns: null,
},
],
},
attrs: null,
on: null,
scope: null,
},
},
});
@@ -1360,9 +1376,11 @@ describe("qweb parser", () => {
name: "MyComponent",
isDynamic: false,
dynamicProps: null,
props: {},
props: null,
on: null,
slots: { name: { content: { type: ASTType.Text, value: "foo" } } },
slots: {
name: { content: { type: ASTType.Text, value: "foo" }, attrs: null, on: null, scope: null },
},
});
});
@@ -1372,9 +1390,16 @@ describe("qweb parser", () => {
name: "MyComponent",
isDynamic: false,
dynamicProps: null,
props: {},
props: null,
on: null,
slots: { name: { content: { type: ASTType.Text, value: "foo" }, attrs: { param: "param" } } },
slots: {
name: {
content: { type: ASTType.Text, value: "foo" },
attrs: { param: "param" },
on: null,
scope: null,
},
},
});
});
@@ -1386,12 +1411,14 @@ describe("qweb parser", () => {
name: "MyComponent",
isDynamic: false,
dynamicProps: null,
props: {},
props: null,
on: null,
slots: {
name: {
content: { type: ASTType.Text, value: "foo" },
on: { click: "doStuff" },
attrs: null,
scope: null,
},
},
});
@@ -1408,12 +1435,17 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: null,
slots: {
default: { content: { type: ASTType.Text, value: " " } },
name: { content: { type: ASTType.Text, value: "foo" } },
default: {
content: { type: ASTType.Text, value: " " },
attrs: null,
on: null,
scope: null,
},
name: { content: { type: ASTType.Text, value: "foo" }, attrs: null, on: null, scope: null },
},
});
});
@@ -1428,12 +1460,12 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: null,
slots: {
a: { content: { type: ASTType.Text, value: "foo" } },
b: { content: { type: ASTType.Text, value: "bar" } },
a: { content: { type: ASTType.Text, value: "foo" }, attrs: null, on: null, scope: null },
b: { content: { type: ASTType.Text, value: "bar" }, attrs: null, on: null, scope: null },
},
});
});
@@ -1443,10 +1475,10 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "myComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: true,
on: null,
slots: {},
slots: null,
});
});
@@ -1458,7 +1490,7 @@ describe("qweb parser", () => {
props: { a: "1", b: "'b'" },
isDynamic: true,
on: null,
slots: {},
slots: null,
});
});
@@ -1470,7 +1502,7 @@ describe("qweb parser", () => {
props: { a: "1" },
isDynamic: true,
on: null,
slots: {},
slots: null,
});
});
@@ -1491,10 +1523,17 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: null,
slots: { default: { content: { body: null, name: "subTemplate", type: ASTType.TCall } } },
slots: {
default: {
content: { body: null, name: "subTemplate", type: ASTType.TCall },
attrs: null,
scope: null,
on: null,
},
},
});
});
@@ -1510,19 +1549,29 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: null,
slots: {
default: {
attrs: null,
on: null,
scope: null,
content: {
type: ASTType.TComponent,
isDynamic: false,
name: "Child",
dynamicProps: null,
props: {},
props: null,
on: null,
slots: { brol: { content: { type: ASTType.Text, value: "coucou" } } },
slots: {
brol: {
content: { type: ASTType.Text, value: "coucou" },
attrs: null,
scope: null,
on: null,
},
},
},
},
},
@@ -1541,19 +1590,29 @@ describe("qweb parser", () => {
type: ASTType.TComponent,
name: "MyComponent",
dynamicProps: null,
props: {},
props: null,
isDynamic: false,
on: null,
slots: {
default: {
attrs: null,
on: null,
scope: null,
content: {
type: ASTType.TComponent,
isDynamic: false,
name: "Child",
dynamicProps: null,
props: {},
props: null,
on: null,
slots: { brol: { content: { type: ASTType.Text, value: "coucou" } } },
slots: {
brol: {
content: { type: ASTType.Text, value: "coucou" },
attrs: null,
on: null,
scope: null,
},
},
},
},
},
@@ -1568,7 +1627,7 @@ describe("qweb parser", () => {
expect(parse(`<t t-slot="default"/>`)).toEqual({
type: ASTType.TSlot,
name: "default",
attrs: {},
attrs: null,
on: null,
defaultContent: null,
});
@@ -1578,7 +1637,7 @@ describe("qweb parser", () => {
expect(parse(`<t t-slot="header">default content</t>`)).toEqual({
type: ASTType.TSlot,
name: "header",
attrs: {},
attrs: null,
on: null,
defaultContent: { type: ASTType.Text, value: "default content" },
});
@@ -1588,7 +1647,7 @@ describe("qweb parser", () => {
expect(parse(`<t t-slot="default" t-on-click.prevent="doSomething"/>`)).toEqual({
type: ASTType.TSlot,
name: "default",
attrs: {},
attrs: null,
on: { "click.prevent": "doSomething" },
defaultContent: null,
});
@@ -1605,8 +1664,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -1623,8 +1682,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: null,
model: null,
ns: null,
@@ -1642,8 +1701,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: "name",
model: null,
ns: null,
@@ -1656,8 +1715,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: "name",
model: null,
ns: null,
@@ -1672,8 +1731,8 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
tag: "div",
dynamicTag: null,
attrs: {},
on: {},
attrs: null,
on: null,
ref: "name",
model: null,
ns: null,
@@ -1708,14 +1767,14 @@ describe("qweb parser", () => {
).toEqual({
body: {
content: {
attrs: {},
attrs: null,
content: [
{
type: ASTType.Text,
value: "word",
},
],
on: {},
on: null,
ref: null,
model: null,
tag: "div",
@@ -1743,9 +1802,9 @@ describe("qweb parser", () => {
test("t-model", async () => {
expect(parse(`<input t-model="state.stuff" />`)).toEqual({
type: ASTType.DomNode,
attrs: {},
attrs: null,
content: [],
on: {},
on: null,
ref: null,
tag: "input",
dynamicTag: null,
@@ -1756,15 +1815,16 @@ describe("qweb parser", () => {
eventType: "input",
shouldNumberize: false,
shouldTrim: false,
hasDynamicChildren: false,
targetAttr: "value",
specialInitTargetAttr: null,
},
});
expect(parse(`<input t-model="state['stuff']" />`)).toEqual({
type: ASTType.DomNode,
attrs: {},
attrs: null,
content: [],
on: {},
on: null,
ref: null,
tag: "input",
dynamicTag: null,
@@ -1777,13 +1837,14 @@ describe("qweb parser", () => {
shouldTrim: false,
targetAttr: "value",
specialInitTargetAttr: null,
hasDynamicChildren: false,
},
});
expect(parse(`<input t-model.lazy.trim.number="state.stuff" />`)).toEqual({
type: ASTType.DomNode,
attrs: {},
attrs: null,
content: [],
on: {},
on: null,
ref: null,
tag: "input",
dynamicTag: null,
@@ -1795,15 +1856,16 @@ describe("qweb parser", () => {
shouldNumberize: true,
shouldTrim: true,
targetAttr: "value",
hasDynamicChildren: false,
specialInitTargetAttr: null,
},
});
});
expect(parse(`<textarea t-model="state.stuff" />`)).toEqual({
type: ASTType.DomNode,
attrs: {},
attrs: null,
content: [],
on: {},
on: null,
ref: null,
tag: "textarea",
dynamicTag: null,
@@ -1815,6 +1877,7 @@ describe("qweb parser", () => {
shouldNumberize: false,
shouldTrim: false,
targetAttr: "value",
hasDynamicChildren: false,
specialInitTargetAttr: null,
},
});
@@ -1822,7 +1885,7 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
attrs: { type: "checkbox" },
content: [],
on: {},
on: null,
ref: null,
tag: "input",
dynamicTag: null,
@@ -1834,6 +1897,7 @@ describe("qweb parser", () => {
shouldNumberize: false,
shouldTrim: false,
targetAttr: "checked",
hasDynamicChildren: false,
specialInitTargetAttr: null,
},
});
@@ -1841,7 +1905,7 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
attrs: { type: "radio" },
content: [],
on: {},
on: null,
ref: null,
tag: "input",
dynamicTag: null,
@@ -1853,6 +1917,7 @@ describe("qweb parser", () => {
shouldNumberize: false,
shouldTrim: false,
targetAttr: "value",
hasDynamicChildren: false,
specialInitTargetAttr: "checked",
},
});
@@ -1860,7 +1925,7 @@ describe("qweb parser", () => {
type: ASTType.DomNode,
attrs: { type: "radio" },
content: [],
on: {},
on: null,
ref: null,
tag: "input",
dynamicTag: null,
@@ -1872,6 +1937,7 @@ describe("qweb parser", () => {
shouldNumberize: false,
shouldTrim: false,
targetAttr: "value",
hasDynamicChildren: false,
specialInitTargetAttr: "checked",
},
});
@@ -1882,9 +1948,9 @@ describe("qweb parser", () => {
test("t-tag", async () => {
expect(parse(`<div t-tag="theTag" />`)).toEqual({
type: ASTType.DomNode,
attrs: {},
attrs: null,
content: [],
on: {},
on: null,
ref: null,
tag: "div",
dynamicTag: "theTag",