From ebf2614ffde218c0069f419e4e5070402dc011ad Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Thu, 28 Nov 2024 09:38:27 +0100 Subject: [PATCH] fix(amdTranspiler): Extend call without classInfo UI5 class extend calls with a missing second argument for the class info is now also supported and will be properly transformed into a ES class which improves linter checks on the class code. --- .../amdTranspiler/rewriteExtendCall.ts | 46 +++++++++--------- .../Positive_12/Component.js | 8 +++ .../Positive_12/manifest.json | 23 +++++++++ .../amd/Factory_ClassWithoutClassInfo.js | 3 ++ .../amdTranspiler/snapshots/transpiler.ts.md | 22 +++++++++ .../snapshots/transpiler.ts.snap | Bin 15903 -> 15965 bytes .../rules/snapshots/AsyncComponentFlags.ts.md | 24 +++++++++ .../snapshots/AsyncComponentFlags.ts.snap | Bin 2144 -> 2173 bytes 8 files changed, 103 insertions(+), 23 deletions(-) create mode 100644 test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/Component.js create mode 100644 test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/manifest.json create mode 100644 test/fixtures/transpiler/amd/Factory_ClassWithoutClassInfo.js diff --git a/src/linter/ui5Types/amdTranspiler/rewriteExtendCall.ts b/src/linter/ui5Types/amdTranspiler/rewriteExtendCall.ts index 2b02e1f90..b9af9d002 100644 --- a/src/linter/ui5Types/amdTranspiler/rewriteExtendCall.ts +++ b/src/linter/ui5Types/amdTranspiler/rewriteExtendCall.ts @@ -18,10 +18,10 @@ export default function rewriteExtendCall(nodeFactory: ts.NodeFactory, callExp.expression.name.text === "extend")) { throw new UnsupportedExtendCall(`Not a UI5 Class#extends call ${toPosStr(callExp.expression)}`); } + const [extractedClassName, body] = extractInfoFromArguments(nodeFactory, callExp); if (!className) { - className = nodeFactory.createUniqueName(getClassNameFromArguments(callExp)); + className = nodeFactory.createUniqueName(extractedClassName); } - const body = getClassBodyFromArguments(nodeFactory, callExp); return nodeFactory.createClassDeclaration(modifiers, className, undefined, @@ -34,33 +34,33 @@ export default function rewriteExtendCall(nodeFactory: ts.NodeFactory, body); } -function getClassNameFromArguments(callExp: ts.CallExpression): string { - const firstArg = callExp.arguments[0]; - if (!firstArg) { - throw new UnsupportedExtendCall(`Missing extends argument at ${toPosStr(callExp)}`); +function extractInfoFromArguments( + nodeFactory: ts.NodeFactory, callExp: ts.CallExpression +): [string, ts.ClassElement[]] { + const args = callExp.arguments; + if (args.length === 0) { + throw new UnsupportedExtendCall(`Missing arguments at ${toPosStr(callExp)}`); } - if (firstArg && !ts.isStringLiteralLike(firstArg)) { - throw new UnsupportedExtendCall(`Unexpected extends argument of type ${ts.SyntaxKind[firstArg.kind]} at ` + - toPosStr(firstArg)); + const className = getClassNameFromArgument(args[0]); + // Class body is optional + const classBody: ts.ClassElement[] = args.length > 1 ? getClassBodyFromArgument(nodeFactory, args[1]) : []; + return [className, classBody]; +} + +function getClassNameFromArgument(className: ts.Expression): string { + if (!ts.isStringLiteralLike(className)) { + throw new UnsupportedExtendCall(`Unexpected extends argument of type ${ts.SyntaxKind[className.kind]} at ` + + toPosStr(className)); } // Just like OpenUI5's ObjectPath... - const nameSegments = firstArg.text.split("."); + const nameSegments = className.text.split("."); return nameSegments[nameSegments.length - 1]; } -function getClassBodyFromArguments( - nodeFactory: ts.NodeFactory, callExp: ts.CallExpression): ts.ClassElement[] { - const args = callExp.arguments; - let classBody: ts.ObjectLiteralExpression | undefined; - for (let i = args.length - 1; i >= 0; i--) { - const arg = args[i]; - if (ts.isObjectLiteralExpression(arg)) { - classBody = arg; - break; - } - } - if (!classBody) { - throw new UnsupportedExtendCall(`No class body found in extends call at ${toPosStr(callExp)}`); +function getClassBodyFromArgument(nodeFactory: ts.NodeFactory, classBody: ts.Expression): ts.ClassElement[] { + if (!ts.isObjectLiteralExpression(classBody)) { + throw new UnsupportedExtendCall(`Unexpected extends argument of type ${ts.SyntaxKind[classBody.kind]} at ` + + toPosStr(classBody)); } if (classBody.properties.find((prop) => ts.isSpreadAssignment(prop))) { // TODO: Support spread elements(?) diff --git a/test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/Component.js b/test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/Component.js new file mode 100644 index 000000000..52a2b7140 --- /dev/null +++ b/test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/Component.js @@ -0,0 +1,8 @@ +// Fixture description: +// Async flag (rootView only, no routing) in manifest.json +// No manifest: "json" configuration in metadata +sap.ui.define(["sap/ui/core/UIComponent"], function (UIComponent) { + "use strict"; + + return UIComponent.extend("mycomp.Component"); +}); diff --git a/test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/manifest.json b/test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/manifest.json new file mode 100644 index 000000000..d077969ee --- /dev/null +++ b/test/fixtures/linter/rules/AsyncComponentFlags/Positive_12/manifest.json @@ -0,0 +1,23 @@ +{ + "_version": "1.12.0", + + "sap.app": { + "id": "mycomp", + "type": "application", + "i18n": "i18n/i18n.properties", + "title": "{{appTitle}}", + "description": "{{appDescription}}", + "applicationVersion": { + "version": "1.0.0" + } + }, + + "sap.ui5": { + "rootView": { + "viewName": "mycomp.view.App", + "type": "XML", + "id": "app", + "async": true + } + } +} diff --git a/test/fixtures/transpiler/amd/Factory_ClassWithoutClassInfo.js b/test/fixtures/transpiler/amd/Factory_ClassWithoutClassInfo.js new file mode 100644 index 000000000..ad92c2757 --- /dev/null +++ b/test/fixtures/transpiler/amd/Factory_ClassWithoutClassInfo.js @@ -0,0 +1,3 @@ +sap.ui.define(["sap/ui/core/UIComponent"], function (UIComponent) { + return UIComponent.extend("mycomp.Component"); +}); diff --git a/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md b/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md index f78080e7d..e279906d3 100644 --- a/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md +++ b/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.md @@ -368,6 +368,28 @@ Generated by [AVA](https://avajs.dev). version: 3, } +## Transpile Factory_ClassWithoutClassInfo.js + +> Snapshot 1 + + `import UIComponent from "sap/ui/core/UIComponent";␊ + export default class Component_1 extends UIComponent {␊ + }␊ + //# sourceMappingURL=Factory_ClassWithoutClassInfo.js.map` + +> Snapshot 2 + + { + file: 'Factory_ClassWithoutClassInfo.js', + mappings: 'OAAqD,WAAW,MAAjD,yBAAyB;yCAChC,WAAW', + names: [], + sourceRoot: '', + sources: [ + 'Factory_ClassWithoutClassInfo.js', + ], + version: 3, + } + ## Transpile Factory_ClassWithoutName.js > Snapshot 1 diff --git a/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.snap b/test/lib/linter/amdTranspiler/snapshots/transpiler.ts.snap index fb1929150b643c4b931d6909a4bc3b0ab79326da..044c208a2c380541afb83a0f62e3159e964aebfb 100644 GIT binary patch literal 15965 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 Snapshot 1 + + [ + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'Component.js', + messages: [ + { + column: 9, + line: 7, + message: 'Component does not specify that it uses the descriptor via the manifest.json file', + messageDetails: 'A manifest.json has been found in the same directory as the component. Although it will be used at runtime automatically, this should still be expressed in the metadata of the component class (https://ui5.sap.com/#/topic/0187ea5e2eff4166b0453b9dcc8fc64f).', + ruleId: 'async-component-flags', + severity: 1, + }, + ], + warningCount: 1, + }, + ] diff --git a/test/lib/linter/rules/snapshots/AsyncComponentFlags.ts.snap b/test/lib/linter/rules/snapshots/AsyncComponentFlags.ts.snap index b84ff36e3de3a8cb5114d6bf3ed75aeb61d0355f..d351468f476eb25fad2ab97fcefc2aa5412c91a3 100644 GIT binary patch literal 2173 zcmV-@2!i)PRzVL97YqWa5-OrVg+fK4K%qr#RZxps{vb*#^#=t6D!)MDLxO@T zl_F8#2SR*jeYVfu_-w~HC-&XmpY!hQd_M0y@4L@C`*42MllEQefk%XPwI}p(;fsKK zx3CkUz_q(3J~)$gmCwtnD7Cu#VaMT`pCO+xkVN=LQiL7^FbiNGN$e%o(IDVeLK?p& zCMH0x1tB222szTIlspIEV*tJk;QIi64`6}-)1=-|;^gXCVQWI0KPM+AL9PQyfb1dU zP6E7v7$DYOvfGwxBH#tF?B^xO1ojcyD7#h!feenximz+8Ohg`-$aBrTclLNHm3KX{ z!gaCP=P_9-OJDdpeOA>*RBRbhsw9-+1)(C%>^{c>-}MXaJ*C>#&S+b^_A;}jtP5td zF=k_j*<6g-*kLvwV>Wh}EnJKleYpiQV+KGDz^%P-qcz;_Sg*K?kbA=aqz2&&0DcJI z6#xkW93;RQ0;nDkrbzM&1o#R8zDIyx6NKGho&qOmq^h+E`X8dBhW=;ipy)Rz^~6=4 z)b%So5Wc=>YCjlwYJ(Yev@Fr3EZN_N$i*8X-VpJI*w_$@u~#2Euf7yxHg=dDjvdbx zLtk%S$D_B4-c za45q8%^ePCgx+_d;rj`??9}E8KSUZU{7VA-mH_`Dz#A#xQ{ZU>c*W?4+}j47u%%Zi z`Sta?CQ@p8t}p6k(VEHnGBmCinv2F<#eAumE&aS(s06}cc^NRSs=i$eq%SLqd6GM> zUr0w9-BWM$HlexesrqgDCh|Td*wNMo?p$wx-Bi@NtZvC5S}a;fZzQaI|ca>Y&CG7#zIT3^Sc zuS2>H1lO+gnd@s2$6rHNwcG#7J*;mLa%y|DWRDz3N}@n^c2f`yuh?%Q#z=K zsj&L~_3jojfvjlPFJ#tNYd_<@(^@F?X;+-vA65w)w3~}u;=Y>~N=KJ45mY>}>@+TK zsEy!Iv)-X_C{fc*DX}I3S6Ay;(=MdZAz_s~Gvbj?h62m|Mn0v{iG1qp^Qp^^d>*~Z zle(^Hu4k3>YeRZruvvv>GnA-@7_U*_FBJGE#ik)pi{)BI!*XvmnwI;~3qS8RfUge1%wJvbyqk`pFyg9*%;z)2H$iv>Js0WU`b)WnsepE$}KrI=&L zSjSQ3$RXavVRSfyXYC&$x#s}_e3byt65uxkpcGi3z{#lG(~-{h5E6`>+;iW6!U$=Z z)ptfM(^a3_&xVufBJ@ub_$%$^Q8!O(Maxp1r))O)vpQNKNU3i?k5pH>ex4OQ^J56-59 z!T=Hm`k~dybs4>ReTUJY*?SD&GY0TY19;H@7ERy-7I3}?&8A5584LKX1^mJS{$>Hs zCxF|Nz{f9FOYg?e$sQuhdp8K$kz!qDQDtGf`6|;zu9>S@MTvFJc7(D6x2$Er)?8k@ z)n)-KG?4xTnE&Buq;8Qbwkm|r^0MMP4S7QGl3pho*<{=X@nU6RO z+v7@g*NJAbON)Xph*^=(&u4SF)tUK)xz)ptZ7=2R+1&l+gXJlIibD7R}RLXV_q0bUU<*|UfQm_VD6yo+{my) zhwo|P-2IrcL!7(cChRccx%*Dv99ciU`lNAU^ho3EfXVxw!kF>-3mgAS1o%dO$@{08 z$@@QUB=6r!ftxAtZVEUQ_&EjsZ2&W7Pg!fl1WucPHi6HX!0$|;Y5`9SGkG7&TCuFv zudEde-qjIXI^t~`U9GtGT_QM=sof6wKO=*-hr+S6KV(Z^ z2hvkL7JsiV4{glx5HGuzLHr%Q(@MR4oQa=qIq~Zu6TjKWiakz%XL^ypQCsTgn&khF zI{EJ+WRBK8NeKZ6gGWt)^AvcB0yi4KyG-CCz5T$0Ch&C=c-{nlWda!s2ok_!iSB+N zMUpQjfS)FS*AhS?37k#>uP1>UQ<194OLQSoZ+z8xeYnx#3(qYUr*`-m@!sbzwnUt|_ezLU@yp>3^6dWyj?v~0g<1dr09!62 literal 2144 zcmV-m2%q;sRzV zpd_6=i64sy00000000B+TU(49R~i1!nHk${((I<84+xmS|Ihc&JX~1wq^NNWQ{)o{k_i7uiqQQ4<^b#=iQU9H90a^ZNb}Rw z)D+0IAOvIwA%~hq$uj^x2H-0Iz7OE{0Hz2qOBx*|j<1~-wkEXoae8_hq`nvv;iO2<01+KaG&OTSA3a%$s zxh}QFJR-{#=?h<{PpkTjN^LVrm4#BgC{(1Ioo9I9yMD2Aq*TY=86A7q*=Dx2^}uW{ z#%$s+n~yP@ILsDe%q9-A#q%+vFSlW4WC7#>+}aN}TF32<4Z|IT+!OvMbqHSo@IwHv z07wvEKLJh=K=pwzMUwXu;6Va>j{v_W2#3J}1&+~(skH_AAEM)i{^#hh=(iU2_!VB% z^{YG(zCLehKNxyx!#Q@eEzzSbIoN^7#|I)l5b=T7JP=E9RG+x0z8qsVahM&91J7kc zUvJ;Qqqj@o$z|gM5g&;7Kx`g}SbLt7sJ<$dyJfw=v@R)T&jI)YfN28UJSb-G85Xl} zDx(3-9SvxN-g~a&`v`iR)Yc9^M4CJNO9K3s0RJJt8!6yZ;AsPR#TbO#J0_j5rB^Nc zjs3eO(rS9HFB)x8%Vc94n%@^&o5ozle5si&{eoMp2Et(l88EJDzFi8WFRO}qk~^+n zOh-E1)#&s#p}Fg+#?SOkv-Nm%xm9#C(nSB{8E3Tc% zFXh+r^ZA8^ynS#%aEIrX=ht#`xn;gQx3H93noYBna>WznaMq!5)lJ(n5b2frSVyF< zL%I$G*RJ%L>uV7dxGk9Lvvwazv%{VifnVoBueP5lp_wiTHd9~p3@doN$h2fLI;e`7 z(0uR4aEqBhR<-LFGaI|LmvP@|Zf$q>Z(iX= zUDtBg(@OgFDZMbb{M=Xq|?0?HQf84GyK0%{4sN&*Ly5z}ifkk)thp!Mr}(>nbY+IYRm zm8#A~7eJV4cA_L$Ae^f2a9?-wBG+st6J@+i;|f)hRnK8-p>**d?zqt?APhWPd+e2TBco)Qb1mZ4FA;j5x zoV~}{dz`&*O&VPugGrDpFVhT78Y9cOhvbaD*(ov365vY&c%&b3Y-E{Fl4h3qDrsez z`zSC=fuj_#!yBANw)uJ=4oQ*ZlnLBm0`n$t+yvfY0Z&@M%h3ciarx*c&N9a-=NK{8 zah5rDi1!E>U7o?S_KuO<^F;!Dl>pBY;5P)I6j-Fd@u=L>mCkk%5{#YPbMKJC2x(i@ zcgC&K)mYolMpNk`^iLG{EA16gw=Qc%+fv>0oqy40zLPhALk94E16VhJcbLFSCP1Sx z^fIRKaSWXhM(y$tXY!#jXVfeOZXc9U{jp=zPhSE?{r31N=sy{LS$)_vRKfo~Jev{< z14tMcgjT0FWc1eeJB%jH-eUltHGn4!;6(#iGJy|Rz}Y@Dn-6Uv7iVc}XRfO#pYD|~7X0B#cB{n$Q5y}qSik1OecX|D% z4i8|VgA69X{11mCwk59Enh-uK$g1x&pDqER*R)@qGw#s z3(3B!gcAmapz3S4EEun9S?1ccxfg0Fy5y>6Xi&OgBR*USgbEECBbSBdArmrLhy)DV z<4X0`iL$xnCBYZPoG26)a{2sPc42XT?Vw}Z%LO~XP?#Ns$TG-XQm?wpo;aFsi)h~E z33TJtScRWR75+X0_|bM%;s1;6tiq3-(B9=O2jkB%FH9saJYWDXZC73}ucGSQ*sw#F z_i5tV{e-eZT)W>U>@eoF`)=k2mi|i_{Lzx`=?sP z`#)|L@83#+n%VNc^RP~8kMa&E)Ed@6z*S7`B zrRV3;%d>37S6Xmqe+VOUgyU`ub;y>Ec-!VstFC>Q2o7cHKZpFEkwM2r;aoZ|vZb#B z>8U=OzuT7wHrIH7SKNyr{x0unrQSZt#7{3d@#_&2zuBycJw||M`jNj;-|FXD}R`M@@mV6nKgPHyXgZOyDE^