@jalvin/compiler 2.0.50 → 2.0.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codegen.d.ts +4 -0
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +184 -25
- package/dist/codegen.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +31 -1
- package/dist/parser.js.map +1 -1
- package/dist/typechecker.d.ts +1 -0
- package/dist/typechecker.d.ts.map +1 -1
- package/dist/typechecker.js +18 -3
- package/dist/typechecker.js.map +1 -1
- package/package.json +1 -1
package/dist/codegen.d.ts
CHANGED
|
@@ -119,6 +119,10 @@ export declare class CodeGenerator {
|
|
|
119
119
|
private resolveLocalComponentImports;
|
|
120
120
|
private isConstructorCall;
|
|
121
121
|
private emitComponentCall;
|
|
122
|
+
private isComplexBuilderStmt;
|
|
123
|
+
private emitBuilderStmt;
|
|
124
|
+
private emitBuilderIf;
|
|
125
|
+
private emitBuilderWhen;
|
|
122
126
|
private emitLambdaBodyAsDomChildren;
|
|
123
127
|
private emitLambdaExpr;
|
|
124
128
|
private emitIfExpr;
|
package/dist/codegen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAoDzC,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,uBAAuB,EAAE,cAIrC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAgB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,oBAAoB,CAAqB;IACjD,wEAAwE;IACxE,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,sGAAsG;IACtG,OAAO,CAAC,qBAAqB,CAAqB;IAClD;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,+FAA+F;IAC/F,OAAO,CAAC,eAAe,CAAS;IAChC,2DAA2D;IAC3D,OAAO,CAAC,cAAc,CAAqB;IAC3C,0DAA0D;IAC1D,OAAO,CAAC,mBAAmB,CAAqC;IAChE,qCAAqC;IACrC,OAAO,CAAC,OAAO,CAA4B;IAC3C;;;;OAIG;IACH,OAAO,CAAC,mBAAmB,CAA0C;IACrE;;;;OAIG;IACH,OAAO,CAAC,sBAAsB,CAAqB;IACnD,4FAA4F;IAC5F,OAAO,CAAC,wBAAwB,CAAqB;IACrD;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,GAAE,OAAO,CAAC,cAAc,CAAM;IAI9C,QAAQ,CACN,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,iBAAiB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,EAC/C,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAC3B,aAAa;IA2FhB,0DAA0D;IAC1D,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,UAAU;IAmDlB,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,WAAW;IAuCnB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,iBAAiB;IAoDzB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,wBAAwB;IAqBhC,OAAO,CAAC,0BAA0B;IA4BlC,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,iBAAiB;IAyFzB,OAAO,CAAC,mBAAmB;IAuE3B,OAAO,CAAC,iBAAiB;IAmDzB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,oBAAoB;IAwC5B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,2BAA2B;IAkCnC,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAiEhB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,YAAY;IAqBpB,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,MAAM;IAuGhC,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,YAAY;IAgGpB,OAAO,CAAC,6BAA6B;IAoBrC,OAAO,CAAC,sBAAsB;IAgE9B,OAAO,CAAC,4BAA4B;IA0EpC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,eAAe;IAkFvB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,2BAA2B;IAgCnC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,sBAAsB;CAiB/B;AAOD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,aAAa,CAAkF"}
|
package/dist/codegen.js
CHANGED
|
@@ -1730,8 +1730,15 @@ class CodeGenerator {
|
|
|
1730
1730
|
}
|
|
1731
1731
|
props.push(propName === val ? propName : `${propName}: ${val}`);
|
|
1732
1732
|
}
|
|
1733
|
+
const lastParamName = paramNames && paramNames.length > 0 ? paramNames[paramNames.length - 1] : undefined;
|
|
1734
|
+
const isUserComponent = tagName !== null && this.userComponentNames.has(tagName);
|
|
1735
|
+
const isTrailingLambdaMappedToProps = expr.trailingLambda && isUserComponent && lastParamName && lastParamName !== "children";
|
|
1736
|
+
if (isTrailingLambdaMappedToProps) {
|
|
1737
|
+
const lambdaStr = this.emitLambdaExpr(expr.trailingLambda);
|
|
1738
|
+
props.push(`${lastParamName}: ${lambdaStr}`);
|
|
1739
|
+
}
|
|
1733
1740
|
const propsStr = props.length > 0 ? `{ ${props.join(", ")} }` : "{}";
|
|
1734
|
-
if (expr.trailingLambda) {
|
|
1741
|
+
if (expr.trailingLambda && !isTrailingLambdaMappedToProps) {
|
|
1735
1742
|
if (expr.trailingLambda.params.length > 0) {
|
|
1736
1743
|
// Lambda with explicit params (e.g. builder-style): emit as a function, not DOM children
|
|
1737
1744
|
return `${callee}(${propsStr}, [${this.emitLambdaExpr(expr.trailingLambda)}])`;
|
|
@@ -1741,36 +1748,188 @@ class CodeGenerator {
|
|
|
1741
1748
|
}
|
|
1742
1749
|
return `${callee}(${propsStr})`;
|
|
1743
1750
|
}
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1751
|
+
isComplexBuilderStmt(stmt) {
|
|
1752
|
+
if (stmt.kind !== "ExprStmt") {
|
|
1753
|
+
return true;
|
|
1754
|
+
}
|
|
1755
|
+
const expr = stmt.expr;
|
|
1756
|
+
if (expr.kind === "AssignExpr" || expr.kind === "CompoundAssignExpr") {
|
|
1757
|
+
return true;
|
|
1758
|
+
}
|
|
1759
|
+
return false;
|
|
1760
|
+
}
|
|
1761
|
+
emitBuilderStmt(stmt, arrayName) {
|
|
1762
|
+
switch (stmt.kind) {
|
|
1763
|
+
case "Block":
|
|
1764
|
+
for (const s of stmt.statements) {
|
|
1765
|
+
this.emitBuilderStmt(s, arrayName);
|
|
1766
|
+
}
|
|
1767
|
+
break;
|
|
1768
|
+
case "PropertyDecl":
|
|
1769
|
+
this.emitPropertyDecl(stmt, false, true);
|
|
1770
|
+
break;
|
|
1771
|
+
case "DestructuringDecl":
|
|
1772
|
+
this.emitDestructuringDecl(stmt, false);
|
|
1773
|
+
break;
|
|
1774
|
+
case "ExprStmt":
|
|
1775
|
+
if (stmt.expr.kind === "AssignExpr" || stmt.expr.kind === "CompoundAssignExpr") {
|
|
1776
|
+
this.w.writeIndentedLine(`${this.emitExpr(stmt.expr)};`);
|
|
1777
|
+
}
|
|
1778
|
+
else {
|
|
1779
|
+
this.w.writeIndentedLine(`${arrayName}.push(${this.emitExpr(stmt.expr)});`);
|
|
1780
|
+
}
|
|
1781
|
+
break;
|
|
1782
|
+
case "IfStmt":
|
|
1783
|
+
this.emitBuilderIf(stmt, arrayName);
|
|
1784
|
+
break;
|
|
1785
|
+
case "WhenStmt":
|
|
1786
|
+
this.emitBuilderWhen(stmt, arrayName);
|
|
1787
|
+
break;
|
|
1788
|
+
case "ForStmt": {
|
|
1763
1789
|
const s = stmt;
|
|
1764
1790
|
const iter = this.emitExpr(s.iterable);
|
|
1765
1791
|
let bindingStr = typeof s.binding === "string" ? `const ${s.binding}` : s.binding.kind === "TupleDestructure" ? `const [${s.binding.names.map((n) => n ?? "_").join(", ")}]` : `const [${s.binding.key}, ${s.binding.value}]`;
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1792
|
+
this.w.writeIndentedLine(`for (${bindingStr} of ${iter}) {`);
|
|
1793
|
+
this.w.pushIndent();
|
|
1794
|
+
this.emitBuilderStmt(s.body, arrayName);
|
|
1795
|
+
this.w.popIndent();
|
|
1796
|
+
this.w.writeIndentedLine("}");
|
|
1797
|
+
break;
|
|
1798
|
+
}
|
|
1799
|
+
case "WhileStmt": {
|
|
1800
|
+
const s = stmt;
|
|
1801
|
+
this.w.writeIndentedLine(`while (${this.emitExpr(s.condition)}) {`);
|
|
1802
|
+
this.w.pushIndent();
|
|
1803
|
+
this.emitBuilderStmt(s.body, arrayName);
|
|
1804
|
+
this.w.popIndent();
|
|
1805
|
+
this.w.writeIndentedLine("}");
|
|
1806
|
+
break;
|
|
1807
|
+
}
|
|
1808
|
+
case "DoWhileStmt": {
|
|
1809
|
+
const s = stmt;
|
|
1810
|
+
this.w.writeIndentedLine(`do {`);
|
|
1811
|
+
this.w.pushIndent();
|
|
1812
|
+
this.emitBuilderStmt(s.body, arrayName);
|
|
1813
|
+
this.w.popIndent();
|
|
1814
|
+
this.w.writeIndentedLine(`} while (${this.emitExpr(s.condition)});`);
|
|
1815
|
+
break;
|
|
1816
|
+
}
|
|
1817
|
+
case "TryCatchStmt": {
|
|
1818
|
+
const s = stmt;
|
|
1819
|
+
this.w.writeIndentedLine(`try {`);
|
|
1820
|
+
this.w.pushIndent();
|
|
1821
|
+
this.emitBuilderStmt(s.body, arrayName);
|
|
1822
|
+
this.w.popIndent();
|
|
1823
|
+
for (const c of s.catches) {
|
|
1824
|
+
this.w.writeIndentedLine(`} catch (${c.name}) {`);
|
|
1825
|
+
this.w.pushIndent();
|
|
1826
|
+
this.emitBuilderStmt(c.body, arrayName);
|
|
1827
|
+
this.w.popIndent();
|
|
1828
|
+
}
|
|
1829
|
+
if (s.finally) {
|
|
1830
|
+
this.w.writeIndentedLine(`} finally {`);
|
|
1831
|
+
this.w.pushIndent();
|
|
1832
|
+
this.emitBuilderStmt(s.finally, arrayName);
|
|
1833
|
+
this.w.popIndent();
|
|
1834
|
+
}
|
|
1835
|
+
this.w.writeIndentedLine(`}`);
|
|
1836
|
+
break;
|
|
1837
|
+
}
|
|
1838
|
+
default:
|
|
1839
|
+
this.emitStmt(stmt);
|
|
1840
|
+
break;
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
emitBuilderIf(stmt, arrayName, isElseIf = false) {
|
|
1844
|
+
const cond = this.emitExpr(stmt.condition);
|
|
1845
|
+
if (isElseIf) {
|
|
1846
|
+
this.w.write(`if (${cond}) {\n`);
|
|
1847
|
+
}
|
|
1848
|
+
else {
|
|
1849
|
+
this.w.writeIndentedLine(`if (${cond}) {`);
|
|
1850
|
+
}
|
|
1851
|
+
this.w.pushIndent();
|
|
1852
|
+
this.emitBuilderStmt(stmt.then, arrayName);
|
|
1853
|
+
this.w.popIndent();
|
|
1854
|
+
if (stmt.else) {
|
|
1855
|
+
if (stmt.else.kind === "IfStmt") {
|
|
1856
|
+
this.w.writeIndented("} else ");
|
|
1857
|
+
this.emitBuilderIf(stmt.else, arrayName, true);
|
|
1858
|
+
}
|
|
1859
|
+
else {
|
|
1860
|
+
this.w.writeIndentedLine("} else {");
|
|
1861
|
+
this.w.pushIndent();
|
|
1862
|
+
this.emitBuilderStmt(stmt.else, arrayName);
|
|
1863
|
+
this.w.popIndent();
|
|
1864
|
+
this.w.writeIndentedLine("}");
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
else {
|
|
1868
|
+
this.w.writeIndentedLine("}");
|
|
1869
|
+
}
|
|
1870
|
+
}
|
|
1871
|
+
emitBuilderWhen(stmt, arrayName) {
|
|
1872
|
+
const subjectVar = stmt.subject ? "__when_subject__" : null;
|
|
1873
|
+
if (stmt.subject) {
|
|
1874
|
+
const binding = stmt.subject.binding ?? subjectVar;
|
|
1875
|
+
this.w.writeIndentedLine(`const ${binding} = ${this.emitExpr(stmt.subject.expr)};`);
|
|
1876
|
+
}
|
|
1877
|
+
let first = true;
|
|
1878
|
+
for (const branch of stmt.branches) {
|
|
1879
|
+
if (branch.isElse) {
|
|
1880
|
+
this.w.writeIndentedLine(first ? `{` : `} else {`);
|
|
1881
|
+
}
|
|
1882
|
+
else {
|
|
1883
|
+
const cond = branch.conditions.map((c) => this.emitWhenCondition(c, subjectVar ?? "")).join(" || ");
|
|
1884
|
+
this.w.writeIndentedLine(first ? `if (${cond}) {` : `} else if (${cond}) {`);
|
|
1885
|
+
}
|
|
1886
|
+
first = false;
|
|
1887
|
+
this.w.pushIndent();
|
|
1888
|
+
if (branch.body.kind === "Block") {
|
|
1889
|
+
this.emitBuilderStmt(branch.body, arrayName);
|
|
1890
|
+
}
|
|
1891
|
+
else {
|
|
1892
|
+
if (branch.body.kind === "AssignExpr" || branch.body.kind === "CompoundAssignExpr") {
|
|
1893
|
+
this.w.writeIndentedLine(`${this.emitExpr(branch.body)};`);
|
|
1894
|
+
}
|
|
1895
|
+
else {
|
|
1896
|
+
this.w.writeIndentedLine(`${arrayName}.push(${this.emitExpr(branch.body)});`);
|
|
1897
|
+
}
|
|
1898
|
+
}
|
|
1899
|
+
this.w.popIndent();
|
|
1900
|
+
}
|
|
1901
|
+
this.w.writeIndentedLine(`}`);
|
|
1902
|
+
}
|
|
1903
|
+
emitLambdaBodyAsDomChildren(lambda) {
|
|
1904
|
+
const hasComplex = lambda.body.some((s) => this.isComplexBuilderStmt(s));
|
|
1905
|
+
if (!hasComplex) {
|
|
1906
|
+
const parts = [];
|
|
1907
|
+
for (const stmt of lambda.body) {
|
|
1908
|
+
if (stmt.kind === "ExprStmt") {
|
|
1909
|
+
parts.push(this.emitExpr(stmt.expr));
|
|
1770
1910
|
}
|
|
1771
1911
|
}
|
|
1912
|
+
return parts.join(", ");
|
|
1913
|
+
}
|
|
1914
|
+
const saved = this.w;
|
|
1915
|
+
const tmp = new Writer();
|
|
1916
|
+
tmp.indent = saved.indent;
|
|
1917
|
+
this.w = tmp;
|
|
1918
|
+
try {
|
|
1919
|
+
this.w.writeLine("(() => {");
|
|
1920
|
+
this.w.pushIndent();
|
|
1921
|
+
this.w.writeIndentedLine("const __c: any[] = [];");
|
|
1922
|
+
for (const stmt of lambda.body) {
|
|
1923
|
+
this.emitBuilderStmt(stmt, "__c");
|
|
1924
|
+
}
|
|
1925
|
+
this.w.writeIndentedLine("return __c;");
|
|
1926
|
+
this.w.popIndent();
|
|
1927
|
+
this.w.writeIndented("})()");
|
|
1928
|
+
}
|
|
1929
|
+
finally {
|
|
1930
|
+
this.w = saved;
|
|
1772
1931
|
}
|
|
1773
|
-
return
|
|
1932
|
+
return `...${tmp.output.trim()}`;
|
|
1774
1933
|
}
|
|
1775
1934
|
emitLambdaExpr(expr) {
|
|
1776
1935
|
const params = expr.params.length === 0 ? "it" : expr.params.map((p) => p.name ?? "_").join(", ");
|