From c3a9ac98abd3f41034e995c5516ebd3ff16c5f06 Mon Sep 17 00:00:00 2001 From: Korobeinikov Evgeny Date: Thu, 13 Feb 2025 18:50:48 +0300 Subject: [PATCH 1/6] Basic implementation for ArkTS --- .../src/main/resources/rawfile/images.png | Bin 0 -> 6485 bytes .../src/main/resources/rawfile/pika-pika.png | Bin 0 -> 7007 bytes .../trivial/user/src/ets/etsconfig.json | 6 +- arkoala-arkts/trivial/user/src/ets/page1.ets | 2 +- arkoala/ets-plugin/package.json | 1 + arkoala/ets-plugin/src/ArkExpander.ts | 17 ++- arkoala/ets-plugin/src/DollarTransformer.ts | 125 +++++++++++++----- .../test/ets/dollar-functions/Index.ets | 11 ++ .../ets-plugin/test/ets/tsconfig.dollar.json | 29 ++++ 9 files changed, 154 insertions(+), 37 deletions(-) create mode 100644 arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/images.png create mode 100644 arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/pika-pika.png create mode 100644 arkoala/ets-plugin/test/ets/dollar-functions/Index.ets create mode 100644 arkoala/ets-plugin/test/ets/tsconfig.dollar.json diff --git a/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/images.png b/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/images.png new file mode 100644 index 0000000000000000000000000000000000000000..552fe24224cb6ff9477731721700160c56c3ccd4 GIT binary patch literal 6485 zcmV-b8LH-qP)T^Xu#D_V)Jr`ugqd?e+Eb{QUghrAs<8G3$JO^j|{%)Jy-@ zN&neN|J+I3rAjLx9{<`)|KCa9q)q?gO#k0d{?kdSs<8F-`rfEY=&Vf!001&6C&a_U zwzar6FET(kI4UDA=I8CUx5Db{@&DjL|K~~iTtffZK8{Q>t4K$|TU*uE+}p}Y^2JQ+ zx=QV`OW&nGXJTcPl9q&mg(4Ui8VU$jQ&=r0FP@#BZ(=ta5g>PSbo16vNH!#!k1~^u zV9LqRnv-%;NGiXqMdZyrrkz~7o++S%DDu!tsgy;wokG2=Iu{EP*~m?geM-x*HI$Nz zqM3qaPathoF{6%2*upJHMN6cDLqRJTuBMu%c_`YgF2Ij5mWe}|c}A;=Td|^atdw`S zsBeyVVA!}trJQ)NrdH0CGOd9hw2xDohhgU+mvNP0CPp_|)k!ui{bxpyCLv2w=WFre{ z5de#go}7GNpN}5iPm=@y02eJuL_t(|ob6qSe-lTRZr#>p=;{_~wOa>95M3A|OETs% z#4%zdj3ke**dDJO+kpgd#w>)*PQpxv9J908c*A7E0=r56)UB$%O0DjeWNa);uKXsy z8o6YD`TD(A@4b4jnxfDcuv#n@s~b&yb~N?kk1c5G!BY=fVZl=`n%aHp;sN|I{uK^9 zb*YP;crl*3t?FX@J*T)Bt##q4LtRWDA{P^g@M5bzA_Bfc3*V_OZbIbHB5H!)gh&ft z{3CnLsO5;!BN;tnwA&fATdh_Z5}Hbo;8bB04H3U~u>=V%kQs$T!jD&oknq&4EVet< z#S$cS@qqqf0+GY2EN((1!ndl3JSK=#_;v!mt4;V80=~%602*Eg8eTldQ>S+7#B*Zm zRlnDIamzo_(PEuHGSEGU@Pm|}4W!=Qu4q}%;!Z@%E(yE6m1x-;5w#&&PU?bNg5S1i znZVZ-b`ritAHIl)G&XN!Kbp*+&&2#07-R{*iTNWC5$4Z5e)5zNd=rCA!ndl64Ggl` zenKMZ1x8(`P7Yt(1*6s@MvWL99vnQ~J&f*$9rfuhRt=He+>YAYLL}Q!yYu3S!NE)W zYDYEjNuP&O7fXz~(eS#^7{GHpb)uQigQgDrsRK)F%8ULDds{4kcLeM@eZ{_qayYP_OTyNd8n8|)}P|IjH#7u8B3iX^yc%f=p_J+}m!^9;sFZ&{Lyx2n`nm8db>T&NLQ9FyGG{`#I+knBh#!6@b91QCK)B8&`uJ?WTv%~Y#v^W+{jC3 z&YTe$Wdy+Sx5EjSe(u*S3QeX3o6T0a4*k*HCyMtto98^B;f`NEBgrUZvjKtOs^N&c z(_eBw0~rNe?VU@f2KEJJ=YukPHrhmS%Ttj~gxwoHDKQ#^Vg?w21J$J0(#ENXB3hQj z40;++@0WhB#7r8|a%e@X%~O%x>Z(;@^sUBBlo%L05v6AauTHTxX|Uz5vW^a7CRe;H zeRK9?vA3g8OB;;BzZXVs>D4(NNW9PtJHL=>pHasmHluLxA0(_j&1gF^iXb6R|MU_s z(P9HY0Q_>XZAK$iM*1Q%(`}4uL!H*K0ufjYsNd@}_{u^`hl7kvDH`0$f=@ew~#n-IM*d@Ulp7%OO-!LNBdYmy+)U+jgS*-sC@6UYOgGDY`?_=NR4@RK_W_1?b}0-c!)T#Dt-?s_51TS$(#x-W8>x`jmJX`i16`Hv7&5DA7EVn z2k=b~RVnG&XpY%ipHrJgp`9H3FRmlihn|#VNuiY9h!m6KckkS}bN}u_xR{WB zvur+69|OtjVshKgZmSk;_X0f|vKVt0M}hN$CWX|h=T?Um0P z2)ig++4%M!H%qJ@pQ2C#b}H$#yNgnC6yypE8bqC!&$m1kA^Q;yTaB~D<;<3bNPX9c zDPWkDg_KWbl!=ZNjp6rY6so~*wWKz9U6m(T&1__|6$V>|Ty!mR#HcBwj`4I0LeXhm z>6eNqqWRdi3H-Mo*Y91X6+_aduEoXL)U{mWtX~t8of)B9Q3{>=`3)W!1|cvO-v{_+ zscZ8p9epD7bNB{C>~#|SW?E>$CsurRbc2UZYd*A^uy#PizUS~oM!Unq7cD|@rKQeG zia%3gY;+*D?K4r<9*LQD6@^N9HSY~hWVD5#0vpX&pcM^m72QXSnn5bAAnV8u&5rUx zb51d>{@AAJhSGge=-ckJ^`MO&43&l-zH?=UYsqLnP>3IO+M0&5k!2PL!KV*TU!bU8 zM#WT!=Ij{PEl0qUxykAq_wPqds}e}3IC|mw#oc0 zKurgu*9V8MxT$fq+{8%hEAKhY;rC5Nt`VaVltyMCql3d&|8RYiZ)Hc>xNFyp_D2*t z!NJ&)X5Yu{3J+)XJX0FbO5Rl9!d=Jce%R67ciKiCVLfNz&UE_p!>W;p0zuC1r|TB$ z{@YQL6HH27+>M>K1CKv@G6|6A-P`%y&OJ^yp(n7JGA|q0betlNsgF8smBk{Cf%v~2 zKl?cjnZOXwDJl;bo{{VK1csma_wb)Kcz{m!X)dmZs2@9Rbq%uXi?hd%e>tg5JkiY4 z>$5%8Y__pa_Hn^yVn#QVL%XLBc#h@y$$KTZUCEqQ9uA(kbZPMPBeaaWOEnhK z_GzcBe(Kuw7Y(C;t}T5vxAf%OCx1P|GqkMr!`N57j@qDXBVpG*!9Qf3wz}rSBQaW2 zYr$*h#PRIh@GMW`j45F6J%p5A9Y%+HU_RRlem}=d5~H8Z$l_>YH_m89gt)KHOXKJB-#mZz_22%ZvDAbf zsk`)MZ$luSN{ceVkLT>JuJP@VNH->};?;mbV3L*=cv*^!GTOEV^_&;|>Nwwy_KSogc zUsoqdHfbBf*2Ka`x5b%CWa031SIl(qaecfT1Vj%G)cRutr9W(tXC%zfXsI-Z+j1kx z`ppNmd-E$R^`2#Pmol0vu?l>>ft7 zq0Zatw51xN7xzM@;arKGA{hOVw6MY1=g8CgbEN)T8fE?P*XYS>aT2~=1HUgiZ7mJq z_&{PFkg2?2>0Oo4&ok-|!02=AyS~1~5i~QirE;C3`n}V((Vt!5aJR*#FLW@{Yud_oJq zZ{vE4$CF5`c`7QDKEs5bU1~fl1vW11l;B%C)A}Ckw51~Psd9#6SO6F% znBixaA3fz50qx(D|G+kMs=)`~S4Bd<93|xw2sFEV%6ZgjOIcjWEE|+CMh2MuUQ{p$hDp3Jssx@AqX<7i9YBGSl(X&4{ z)I`B;YjOuQIlp*O4=0P+NUt$!>44G2jG$NDWCKGpk7kwQrG}pbXMg&#+Tgj;HvSPm z!i}WU9Lunk`P%Y!Jzh*CJg)Amao+Dv+r&Q&`WS!!CTCuA%|E3XdT67hNtF&w-2>vG z36gKXuv}VLnZ9*5TvXxrN2jf`&Kj49f=X3tz5{YCE{sx{U~OZl;nFRe5UfoNHGds2 zT&6O8qh3t;eD1eZzJ1W0wyqZ@%}WCJpqdi^qwYX(tD3BBj0PJF1qkK>a|X4$0>h-! z<H#tZt4 z;sSoS&GGZMCW;a02K0Os>UzPMXgzYqv#rpEd%i1(L5f}fIqrAx|!hxLzx3m;r)TaBS@%knz6C55PUGX7CV&q z&GLfxutlMrFzRv?*YHJz0l#0`*rDVFHaCV!RbxMZr6Hewf8ixMU(U|cfW}`(*Tg}) zVf-ABhgx13=SdK50yg9ObeJ4wf9w+sBMy+#ys(jz1%Pz0mMgsvyWKa%>G15DH}4`?b|lN})hT{bMf^5+dZ%(z1vma~ulAjING>5~?8T?TTDi zSk8CSM&hN)88o7WPZtzK#T5W@flxqU6#Y*}^=W8B#~r;Mh06F-cUs=}pbR!2E&M9x zJrN>ToEMN84G|85U)Pgj%Hz(y>9kEux8q5Qq82QyT}WBvE!yr`gd3A&MpbJHRbMNn zOnJg%@0U(nXS@ZWG_78%0iyXklzL1}RiT#^!0|!gf5!5v?uVic))Y!8)jyrKj{6zo zq+XL<4RUp&lp-|)15%{)(ZV)W9RFy240*R`gYpOR%7X&T%DAL{mVW58HOoNhBtJ%= z3xulVFr&q??BB1!-QVNL#y?rzD#Wm$29z7&(WXQo>ggyHAquy1uN%Q=9KtwNOhnM% zn@HP&*uNhe7ZJIfsbc;6btI|K-tfxf-(<%jdP@7Ifo z`<%c;p&5;BQluS9Ox#8K?+>9pUnnnlt<8*@z(3rbwk~`nQCmY$8QmT$uxYkDKg%F9 z>JMxsDH0L7jXb`+xjq)lGYq%j?XOPTFsF0yrYD~G-Uk2~g;G`@3k7HfSMcPZh!%bw z(1GvEPJF(W%WQWH|B!du-qJ?$EyAXeq{|8!g}ZqU1+92vLN~bU!FLU0!|z3!l-1JH zF;k*R>Dys6xfMVOQG9)SC{S2%>cSs@{*TMkZ=JRaBaM2kGw24EN5U?vJFyN44MEKZ z!Dt}18Zqg#HF#}%&vx4Ss;mK>bQ6~nqZ2N>JGCwb@qru{@Q;O$I&GEVRbLgL9qAM>X$z0sK0!(2Dp!WqhF)zvFK_N zIrCdZi-BnMW2bGZrgNTTxHaJ)Fdswwp4XwZSD}|^XPbZlQ5W7$bU<;vCt22E(R{NH zPDdz*j^hqiK&RGpruopF{LNc#YGpq zO;>UCcc-m2a*J(4<(o8rQfBm`XHQZ_J=AHd|Aq#^u+m2Qlz;U6Ic9XiV-COXI&EF` zv@UUm8EEOYVRmNx@e@Sq8{FgElbyEK$PMG-CIf{>0{|{b`Lg5R{vW|8srA;*w7!Qr zZ6kzxuV+f7&8b<2Gxu>;IcxFgU0>YKowmf0ozOICoHy{wJV@vs{1fo|w9{6n@}b3! zFTI~tyw*`4Q5Sgl2ghiY5p005=~d9vHh@}f@%b>mDzm{WC?{Qg#HgixMiR12_0~$i7k$6`#y2shP4h&JTOiSe-Ii`_S)Fe{L7Yb243Wa&MlY_{JbUy` zTdO58t@JfO%0hvFKk5%4E^%FcRPDYacv&wzKncXU8AX3UElsd_}!6qrKQ^>&b49qPrQn zp>=fl{%Un~?bpS{iDWU08o%t>`r_)RTlqq?$t2|FQUs#?z7JoUy6)OeTW@4>er9us z155=|R(lm)%epP{Vyh?%#qi^gKE+jbvhGJ?fu+^OqQh#4s88Q%YbjP|rbbH}B@Q>x zL46-vn~>Y#NM-e;ti}5F>iX7J3_7NP!0K8o8uPE;%zC=m!#{{9)bYvf(G6%sxk3yY z&NZm-;e^M?{JDHoB3pc1UESQQ29OoVSNN61lmViCWpuH$Q(l>`{d)ItxQK6Nz{fmh z8%q2`xc~d3d79;5%zv+TJKnX78b_h~*J*2YM2g8oDv|IwTtrQjX{Zq2-dz2VPjf6_ z*xKAo?e<-#9-_W|r!CIVb`<+M-H}vwVsUwXG6T4wnMX6X=d$jjciOg-;7}1Yixy?^ zrjp~gRz~uzr>*MH5v3G{g$rhv vmLI*-whe>aWd7QD`Gc~!pQ6wnW%U06U=W27<-6(c00000NkvXXu0mjfD{ra^ literal 0 HcmV?d00001 diff --git a/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/pika-pika.png b/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/pika-pika.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4118414c26a1763b00a8c05c3936a85fb96127 GIT binary patch literal 7007 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 literal 0 HcmV?d00001 diff --git a/arkoala-arkts/trivial/user/src/ets/etsconfig.json b/arkoala-arkts/trivial/user/src/ets/etsconfig.json index 8c8b162b4..d8b2ae045 100644 --- a/arkoala-arkts/trivial/user/src/ets/etsconfig.json +++ b/arkoala-arkts/trivial/user/src/ets/etsconfig.json @@ -14,7 +14,11 @@ { "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", "destination": "../../build/generated", - "arkui": "@koalaui/arkts-arkui" + "arkui": "@koalaui/arkts-arkui", + "applicationInfo": { + "bundleName": "com.example.trivial.application", + "moduleName": "entry" + } } ] } diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index c85a9eb52..261e901d9 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -113,7 +113,7 @@ struct Page1 { this.state++ console.log("#### Set Button onClick! #" + this.state) }) - Image("/resources/glass.png").width(400) + Image($rawfile('pika-pika.png')).width(400) Text("Set Button onClick! #" + this.state) .width(200).height(100) TestProvide() diff --git a/arkoala/ets-plugin/package.json b/arkoala/ets-plugin/package.json index 97b237c56..2c6829b2a 100644 --- a/arkoala/ets-plugin/package.json +++ b/arkoala/ets-plugin/package.json @@ -11,6 +11,7 @@ "scripts": { "compile": "ets-tsc -b .", "test": "npm run compile && npm run test:ets", + "compile:dollars:ets": "cd test/ets && ets-tsc -p tsconfig.dollar.json", "compile:arkoala:ets": "cd test/ets && ets-tsc -p tsconfig.arkoala.json", "compile:arkts:ets": "cd test/ets && ets-tsc -p tsconfig.arkts.json", "compile:koala:ets": "cd test/ets && ets-tsc -p tsconfig.koala.json", diff --git a/arkoala/ets-plugin/src/ArkExpander.ts b/arkoala/ets-plugin/src/ArkExpander.ts index d45369d72..6331604c6 100644 --- a/arkoala/ets-plugin/src/ArkExpander.ts +++ b/arkoala/ets-plugin/src/ArkExpander.ts @@ -35,12 +35,17 @@ import { LegacyCallTransformer } from './LegacyCallTransformer' import { AbilityTransformer } from './AbilityTransformer' import { ObservedResolver } from "./ObservedResolver" +interface ApplicationInfo { + bundleName: string, + moduleName: string +} interface ArkToKoOptions { trace?: boolean source?: string destination?: string arkui?: string - moduleInfo?: (moduleName: string) => any + moduleInfo?: (moduleName: string) => any, + applicationInfo?: ApplicationInfo } function printSourceFile(sourceFile: ts.Node, source?: string, destination?: string, extension?: string) { @@ -106,7 +111,8 @@ export function arkExpandFile( ctx: ts.TransformationContext, extras: ts.TransformerExtras | undefined, entryTracker: EntryTracker, - moduleInfo?: (moduleName: string) => any + moduleInfo?: (moduleName: string) => any, + applicationInfo?: ApplicationInfo ): ts.SourceFile { const importer = new Importer(arkuiPackage, moduleInfo) const nameTable = new NameTable() @@ -132,7 +138,7 @@ export function arkExpandFile( const styleTransformer = new StyleTransformer(sourceFile, ctx, typeChecker, importer, extensionStylesTransformer, callTable) const structTransformer = new StructTransformer(sourceFile, ctx, typeChecker, importer, nameTable, entryTracker, callTable, extras) const nameCollector = new NameCollector(sourceFile, ctx, nameTable, issueTable) - const dollarTransformer = new DollarTransformer(sourceFile, ctx, nameTable) + const dollarTransformer = new DollarTransformer(sourceFile, ctx, nameTable, importer, applicationInfo) const abilityTransformer = new AbilityTransformer(sourceFile, ctx, importer) const observedResolver = new ObservedResolver(sourceFile, ctx, importer) @@ -177,7 +183,8 @@ export default function arkExpander(program: ts.Program, userPluginOptions: ArkT source: userPluginOptions.source ?? ".", destination: userPluginOptions.destination ?? "../generated", arkui: userPluginOptions.arkui ?? "@koalaui/koala-arkui", - moduleInfo: userPluginOptions.moduleInfo + moduleInfo: userPluginOptions.moduleInfo, + applicationInfo: userPluginOptions.applicationInfo } const typeChecker = program.getTypeChecker() prepareDestination(pluginOptions.destination) @@ -194,7 +201,7 @@ export default function arkExpander(program: ts.Program, userPluginOptions: ArkT console.log("ETS->TS: " + path.normalize(sourceFile.fileName)) } - let final = arkExpandFile(sourceFile, pluginOptions.arkui, typeChecker, ctx, extras, entryTracker, pluginOptions.moduleInfo) + let final = arkExpandFile(sourceFile, pluginOptions.arkui, typeChecker, ctx, extras, entryTracker, pluginOptions.moduleInfo, pluginOptions.applicationInfo) printSourceFile(final, pluginOptions.source, pluginOptions.destination) if (pluginOptions.arkui != "@koalaui/arkts-arkui") { diff --git a/arkoala/ets-plugin/src/DollarTransformer.ts b/arkoala/ets-plugin/src/DollarTransformer.ts index caac6830f..3f86d2fd2 100644 --- a/arkoala/ets-plugin/src/DollarTransformer.ts +++ b/arkoala/ets-plugin/src/DollarTransformer.ts @@ -16,59 +16,124 @@ import * as ts from "@koalaui/ets-tsc" import { AbstractVisitor } from "./AbstractVisitor"; import { NameTable } from "./utils"; +import { Importer } from "./Importer"; +const RESOURCE_TYPE: Record = { // Copied from ets2bundle/compiler/src/pre_define.ts + color: 10001, + float: 10002, + string: 10003, + plural: 10004, + boolean: 10005, + intarray: 10006, + integer: 10007, + pattern: 10008, + strarray: 10009, + media: 20000, + rawfile: 30000 +}; + +interface ApplicationInfo { + bundleName: string, + moduleName: string +} export class DollarTransformer extends AbstractVisitor { constructor( sourceFile: ts.SourceFile, ctx: ts.TransformationContext, - private nameTable: NameTable + private nameTable: NameTable, + private importer: Importer, + private applicationInfo?: ApplicationInfo ) { super(sourceFile, ctx) } - currentStruct: ts.StructDeclaration | undefined = undefined - whiteList = ["$$", "$r", "$rawfile"] isDollarVariableAccess(node: ts.Identifier): boolean { const name = ts.idText(node) - if (!name.startsWith("$")) return false - const fieldName = name.substring(1) - // TODO: is it correct? - // The white list has a preference over the fields. - if (this.whiteList.includes(name)) return false - if (!this.currentStruct) return false - if (this.currentStruct.members.find(it => ( - it.name && - ts.isIdentifier(it.name) && - ts.idText(it.name) == fieldName - )) == undefined) return false - // Already has a receiver. - if (ts.isPropertyAccessExpression(node.parent)) return false - + if (!this.whiteList.includes(name)) return false return true } - transformDollarVariableAccess(node: ts.Identifier): ts.Expression { - this.nameTable.dollars.push(ts.idText(node)) - return ts.factory.createPropertyAccessExpression( - ts.factory.createThis(), - node + createResource(id: number, type: number, name: string, bundleName: string, moduleName: string): ts.AsExpression { + return ts.factory.createAsExpression( + ts.factory.createObjectLiteralExpression( + [ + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("id"), + ts.factory.createNumericLiteral(0) + ), + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("type"), + ts.factory.createNumericLiteral(type) + ), + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("params"), + ts.factory.createNewExpression( + ts.factory.createIdentifier("Array"), + [ + ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) + ], + [ + ts.factory.createStringLiteral(name) + ] + ) + ), + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("bundleName"), + ts.factory.createStringLiteral(bundleName) + ), + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("moduleName"), + ts.factory.createStringLiteral(moduleName) + ), + ], + true + ), + ts.factory.createTypeReferenceNode( + ts.factory.createIdentifier("Resource"), + undefined + ) ) } + transformDollarRVariable(node: ts.CallExpression): ts.Expression { + console.log("not implemented") + return node + } + + transformDollarRawfileVariable(node: ts.CallExpression): ts.Expression { + const name = Object(node.arguments[0]).text + return this.createResource(0, RESOURCE_TYPE.rawfile, name, this.applicationInfo?.bundleName ?? "", this.applicationInfo?.moduleName ?? "entry") + } + + transformDollarDollarVariable(node: ts.CallExpression): ts.Expression { + console.log("not implemented") + return node + } + visitor(node: ts.Node): ts.Node { - if (ts.isStruct(node)) { - this.currentStruct = node - const transformed = this.visitEachChild(node) - this.currentStruct = undefined - return transformed - } else if (ts.isIdentifier(node)) { - if (this.currentStruct && this.isDollarVariableAccess(node)) { - return this.transformDollarVariableAccess(node) + + if (ts.isCallExpression(node)) { + if (ts.isIdentifier(node.expression)) { + if (this.isDollarVariableAccess(node.expression)) { + switch (ts.idText(node.expression)) { + case "$r": + this.importer.addAdaptorImport("Resource") + return this.transformDollarRVariable(node) + case "$rawfile": + this.importer.addAdaptorImport("Resource") + return this.transformDollarRawfileVariable(node) + case "$$": + return this.transformDollarDollarVariable(node) + default: + console.log("Unknown dollar function") + } + } } } + return this.visitEachChild(node) } } \ No newline at end of file diff --git a/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets b/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets new file mode 100644 index 000000000..f6d331741 --- /dev/null +++ b/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets @@ -0,0 +1,11 @@ +@Entry +@Component +struct Index { + build() { + Column() { + Image($rawfile('startIcon.png')) + } + .height('100%') + .width('100%') + } +} \ No newline at end of file diff --git a/arkoala/ets-plugin/test/ets/tsconfig.dollar.json b/arkoala/ets-plugin/test/ets/tsconfig.dollar.json new file mode 100644 index 000000000..9bd5f146a --- /dev/null +++ b/arkoala/ets-plugin/test/ets/tsconfig.dollar.json @@ -0,0 +1,29 @@ +{ + "extends": "@koalaui/arkui-common/config/tsconfig.base.json", + "include": [ + "./dollar-functions/**/*.ets" + ], + "compilerOptions": { + "baseUrl": ".", + "outDir": "../../build/js/arkoala/ets", + "paths": { + "@kit.AbilityKit": [ + "arkoala-ability/@kit.AbilityKit" + ], + "@ohos.app.ability.UIAbility": [ + "arkoala-ability/@ohos.app.ability.UIAbility" + ] + }, + "plugins": [ + { + "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", + "arkui": "@koalaui/arkoala-arkui", + "destination": "../../build/ts/arkoala/ets", + "applicationInfo": { + "bundleName": "com.application.example", + "moduleName": "entry" + } + } + ] + } + } \ No newline at end of file -- Gitee From d426ab3421d660353091c0de172489b1a2e139c9 Mon Sep 17 00:00:00 2001 From: Korobeinikov Evgeny Date: Fri, 14 Feb 2025 19:45:55 +0300 Subject: [PATCH 2/6] Dollar r implementation --- arkoala-arkts/arkui/src/handwritten/index.ts | 1 + .../arkui/src/handwritten/resources.ts | 40 ++++++++ .../main/resources/base/element/color.json | 4 + .../main/resources/base/element/string.json | 4 + arkoala-arkts/trivial/user/src/ets/page1.ets | 3 + arkoala/ets-plugin/src/DollarTransformer.ts | 93 ++++++------------- .../test/ets/dollar-functions/Index.ets | 1 + 7 files changed, 80 insertions(+), 66 deletions(-) create mode 100644 arkoala-arkts/arkui/src/handwritten/resources.ts diff --git a/arkoala-arkts/arkui/src/handwritten/index.ts b/arkoala-arkts/arkui/src/handwritten/index.ts index bbf766e8f..9b1107584 100644 --- a/arkoala-arkts/arkui/src/handwritten/index.ts +++ b/arkoala-arkts/arkui/src/handwritten/index.ts @@ -2,6 +2,7 @@ export * from "./ArkPageTransition" export * from "./ArkPageTransitionData" export * from "./Router" export * from "./ForeignFunctions" +export * from "./resources" // TODO: implement this diff --git a/arkoala-arkts/arkui/src/handwritten/resources.ts b/arkoala-arkts/arkui/src/handwritten/resources.ts new file mode 100644 index 000000000..2e2e8cf8a --- /dev/null +++ b/arkoala-arkts/arkui/src/handwritten/resources.ts @@ -0,0 +1,40 @@ +import { Resource } from "../generated"; + +export function _r(name: string, bundleName: string, moduleName: string): Resource { + const param: string = name.split(".")[1]; + let res_type = 20000; + + switch (param) { + case 'media': + res_type = 20000; + break; + case 'color': + res_type = 10001; + break; + case 'string': + res_type = 10003; + break; + case 'float': + res_type = 10002; + break; + } + + + return { + "id": -1, + "type": res_type, + "params": new Array(name), + "bundleName": bundleName, + "moduleName": moduleName + } as Resource +} + +export function _rawfile(name: string, bundleName: string, moduleName: string): Resource { + return { + "id": 0, + "type": 30000, + "params": new Array(name), + "bundleName": bundleName, + "moduleName": moduleName + } as Resource +} \ No newline at end of file diff --git a/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/color.json b/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/color.json index 3c712962d..6a20c650b 100644 --- a/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/color.json +++ b/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/color.json @@ -3,6 +3,10 @@ { "name": "start_window_background", "value": "#FFFFFF" + }, + { + "name": "my_color", + "value": "#2e2e33" } ] } \ No newline at end of file diff --git a/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/string.json b/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/string.json index f94595515..d1c869602 100644 --- a/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/string.json +++ b/arkoala-arkts/shopping/application/entry/src/main/resources/base/element/string.json @@ -11,6 +11,10 @@ { "name": "EntryAbility_label", "value": "label" + }, + { + "name": "my_text", + "value": "some_text" } ] } \ No newline at end of file diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index 261e901d9..d767d0002 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -107,12 +107,15 @@ struct Page1 { .backgroundColor(this.color2) .width(200).height(100) .onClick((e?: ClickEvent) => { this.swap() }) + Text($r('app.string.my_text')).height(50) Button("Click! " + this.state) .width(200).height(100) + .backgroundColor($r('app.color.my_color')) .onClick((e?: ClickEvent) => { this.state++ console.log("#### Set Button onClick! #" + this.state) }) + Image($r('app.media.startIcon')).width(60).height(60) Image($rawfile('pika-pika.png')).width(400) Text("Set Button onClick! #" + this.state) .width(200).height(100) diff --git a/arkoala/ets-plugin/src/DollarTransformer.ts b/arkoala/ets-plugin/src/DollarTransformer.ts index 3f86d2fd2..e04ea5b01 100644 --- a/arkoala/ets-plugin/src/DollarTransformer.ts +++ b/arkoala/ets-plugin/src/DollarTransformer.ts @@ -18,20 +18,6 @@ import { AbstractVisitor } from "./AbstractVisitor"; import { NameTable } from "./utils"; import { Importer } from "./Importer"; -const RESOURCE_TYPE: Record = { // Copied from ets2bundle/compiler/src/pre_define.ts - color: 10001, - float: 10002, - string: 10003, - plural: 10004, - boolean: 10005, - intarray: 10006, - integer: 10007, - pattern: 10008, - strarray: 10009, - media: 20000, - rawfile: 30000 -}; - interface ApplicationInfo { bundleName: string, moduleName: string @@ -56,60 +42,39 @@ export class DollarTransformer extends AbstractVisitor { return true } - createResource(id: number, type: number, name: string, bundleName: string, moduleName: string): ts.AsExpression { - return ts.factory.createAsExpression( - ts.factory.createObjectLiteralExpression( - [ - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("id"), - ts.factory.createNumericLiteral(0) - ), - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("type"), - ts.factory.createNumericLiteral(type) - ), - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("params"), - ts.factory.createNewExpression( - ts.factory.createIdentifier("Array"), - [ - ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) - ], - [ - ts.factory.createStringLiteral(name) - ] - ) - ), - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("bundleName"), - ts.factory.createStringLiteral(bundleName) - ), - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("moduleName"), - ts.factory.createStringLiteral(moduleName) - ), - ], - true - ), - ts.factory.createTypeReferenceNode( - ts.factory.createIdentifier("Resource"), - undefined - ) - ) - } - transformDollarRVariable(node: ts.CallExpression): ts.Expression { - console.log("not implemented") - return node + const args = node.arguments.slice() + + args.push( + ts.factory.createStringLiteral(this.applicationInfo?.bundleName ?? ""), + ts.factory.createStringLiteral(this.applicationInfo?.moduleName ?? "entry") + ) + + return ts.factory.updateCallExpression( + node, + ts.factory.createIdentifier(this.importer.withAdaptorImport("_r")), + node.typeArguments, + args + ) } - transformDollarRawfileVariable(node: ts.CallExpression): ts.Expression { - const name = Object(node.arguments[0]).text - return this.createResource(0, RESOURCE_TYPE.rawfile, name, this.applicationInfo?.bundleName ?? "", this.applicationInfo?.moduleName ?? "entry") + transformDollarRawfileVariable(node: ts.CallExpression): ts.CallExpression { + const args = node.arguments.slice() + + args.push( + ts.factory.createStringLiteral(this.applicationInfo?.bundleName ?? ""), + ts.factory.createStringLiteral(this.applicationInfo?.moduleName ?? "entry") + ) + + return ts.factory.updateCallExpression( + node, + ts.factory.createIdentifier(this.importer.withAdaptorImport("_rawfile")), + node.typeArguments, + args + ) } transformDollarDollarVariable(node: ts.CallExpression): ts.Expression { - console.log("not implemented") return node } @@ -120,15 +85,11 @@ export class DollarTransformer extends AbstractVisitor { if (this.isDollarVariableAccess(node.expression)) { switch (ts.idText(node.expression)) { case "$r": - this.importer.addAdaptorImport("Resource") return this.transformDollarRVariable(node) case "$rawfile": - this.importer.addAdaptorImport("Resource") return this.transformDollarRawfileVariable(node) case "$$": return this.transformDollarDollarVariable(node) - default: - console.log("Unknown dollar function") } } } diff --git a/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets b/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets index f6d331741..d18c9fccb 100644 --- a/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets +++ b/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets @@ -4,6 +4,7 @@ struct Index { build() { Column() { Image($rawfile('startIcon.png')) + Image($r('app.media.icon')) } .height('100%') .width('100%') -- Gitee From a7b431bff347efccf5009c320204408b0e97479e Mon Sep 17 00:00:00 2001 From: Korobeinikov Evgeny Date: Mon, 17 Feb 2025 12:01:06 +0300 Subject: [PATCH 3/6] Change image --- .../entry/src/main/resources/rawfile/images.png | Bin 6485 -> 0 bytes .../entry/src/main/resources/rawfile/phone.png | Bin 0 -> 49101 bytes .../src/main/resources/rawfile/pika-pika.png | Bin 7007 -> 0 bytes arkoala-arkts/trivial/user/src/ets/page1.ets | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/images.png create mode 100644 arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/phone.png delete mode 100644 arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/pika-pika.png diff --git a/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/images.png b/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/images.png deleted file mode 100644 index 552fe24224cb6ff9477731721700160c56c3ccd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6485 zcmV-b8LH-qP)T^Xu#D_V)Jr`ugqd?e+Eb{QUghrAs<8G3$JO^j|{%)Jy-@ zN&neN|J+I3rAjLx9{<`)|KCa9q)q?gO#k0d{?kdSs<8F-`rfEY=&Vf!001&6C&a_U zwzar6FET(kI4UDA=I8CUx5Db{@&DjL|K~~iTtffZK8{Q>t4K$|TU*uE+}p}Y^2JQ+ zx=QV`OW&nGXJTcPl9q&mg(4Ui8VU$jQ&=r0FP@#BZ(=ta5g>PSbo16vNH!#!k1~^u zV9LqRnv-%;NGiXqMdZyrrkz~7o++S%DDu!tsgy;wokG2=Iu{EP*~m?geM-x*HI$Nz zqM3qaPathoF{6%2*upJHMN6cDLqRJTuBMu%c_`YgF2Ij5mWe}|c}A;=Td|^atdw`S zsBeyVVA!}trJQ)NrdH0CGOd9hw2xDohhgU+mvNP0CPp_|)k!ui{bxpyCLv2w=WFre{ z5de#go}7GNpN}5iPm=@y02eJuL_t(|ob6qSe-lTRZr#>p=;{_~wOa>95M3A|OETs% z#4%zdj3ke**dDJO+kpgd#w>)*PQpxv9J908c*A7E0=r56)UB$%O0DjeWNa);uKXsy z8o6YD`TD(A@4b4jnxfDcuv#n@s~b&yb~N?kk1c5G!BY=fVZl=`n%aHp;sN|I{uK^9 zb*YP;crl*3t?FX@J*T)Bt##q4LtRWDA{P^g@M5bzA_Bfc3*V_OZbIbHB5H!)gh&ft z{3CnLsO5;!BN;tnwA&fATdh_Z5}Hbo;8bB04H3U~u>=V%kQs$T!jD&oknq&4EVet< z#S$cS@qqqf0+GY2EN((1!ndl3JSK=#_;v!mt4;V80=~%602*Eg8eTldQ>S+7#B*Zm zRlnDIamzo_(PEuHGSEGU@Pm|}4W!=Qu4q}%;!Z@%E(yE6m1x-;5w#&&PU?bNg5S1i znZVZ-b`ritAHIl)G&XN!Kbp*+&&2#07-R{*iTNWC5$4Z5e)5zNd=rCA!ndl64Ggl` zenKMZ1x8(`P7Yt(1*6s@MvWL99vnQ~J&f*$9rfuhRt=He+>YAYLL}Q!yYu3S!NE)W zYDYEjNuP&O7fXz~(eS#^7{GHpb)uQigQgDrsRK)F%8ULDds{4kcLeM@eZ{_qayYP_OTyNd8n8|)}P|IjH#7u8B3iX^yc%f=p_J+}m!^9;sFZ&{Lyx2n`nm8db>T&NLQ9FyGG{`#I+knBh#!6@b91QCK)B8&`uJ?WTv%~Y#v^W+{jC3 z&YTe$Wdy+Sx5EjSe(u*S3QeX3o6T0a4*k*HCyMtto98^B;f`NEBgrUZvjKtOs^N&c z(_eBw0~rNe?VU@f2KEJJ=YukPHrhmS%Ttj~gxwoHDKQ#^Vg?w21J$J0(#ENXB3hQj z40;++@0WhB#7r8|a%e@X%~O%x>Z(;@^sUBBlo%L05v6AauTHTxX|Uz5vW^a7CRe;H zeRK9?vA3g8OB;;BzZXVs>D4(NNW9PtJHL=>pHasmHluLxA0(_j&1gF^iXb6R|MU_s z(P9HY0Q_>XZAK$iM*1Q%(`}4uL!H*K0ufjYsNd@}_{u^`hl7kvDH`0$f=@ew~#n-IM*d@Ulp7%OO-!LNBdYmy+)U+jgS*-sC@6UYOgGDY`?_=NR4@RK_W_1?b}0-c!)T#Dt-?s_51TS$(#x-W8>x`jmJX`i16`Hv7&5DA7EVn z2k=b~RVnG&XpY%ipHrJgp`9H3FRmlihn|#VNuiY9h!m6KckkS}bN}u_xR{WB zvur+69|OtjVshKgZmSk;_X0f|vKVt0M}hN$CWX|h=T?Um0P z2)ig++4%M!H%qJ@pQ2C#b}H$#yNgnC6yypE8bqC!&$m1kA^Q;yTaB~D<;<3bNPX9c zDPWkDg_KWbl!=ZNjp6rY6so~*wWKz9U6m(T&1__|6$V>|Ty!mR#HcBwj`4I0LeXhm z>6eNqqWRdi3H-Mo*Y91X6+_aduEoXL)U{mWtX~t8of)B9Q3{>=`3)W!1|cvO-v{_+ zscZ8p9epD7bNB{C>~#|SW?E>$CsurRbc2UZYd*A^uy#PizUS~oM!Unq7cD|@rKQeG zia%3gY;+*D?K4r<9*LQD6@^N9HSY~hWVD5#0vpX&pcM^m72QXSnn5bAAnV8u&5rUx zb51d>{@AAJhSGge=-ckJ^`MO&43&l-zH?=UYsqLnP>3IO+M0&5k!2PL!KV*TU!bU8 zM#WT!=Ij{PEl0qUxykAq_wPqds}e}3IC|mw#oc0 zKurgu*9V8MxT$fq+{8%hEAKhY;rC5Nt`VaVltyMCql3d&|8RYiZ)Hc>xNFyp_D2*t z!NJ&)X5Yu{3J+)XJX0FbO5Rl9!d=Jce%R67ciKiCVLfNz&UE_p!>W;p0zuC1r|TB$ z{@YQL6HH27+>M>K1CKv@G6|6A-P`%y&OJ^yp(n7JGA|q0betlNsgF8smBk{Cf%v~2 zKl?cjnZOXwDJl;bo{{VK1csma_wb)Kcz{m!X)dmZs2@9Rbq%uXi?hd%e>tg5JkiY4 z>$5%8Y__pa_Hn^yVn#QVL%XLBc#h@y$$KTZUCEqQ9uA(kbZPMPBeaaWOEnhK z_GzcBe(Kuw7Y(C;t}T5vxAf%OCx1P|GqkMr!`N57j@qDXBVpG*!9Qf3wz}rSBQaW2 zYr$*h#PRIh@GMW`j45F6J%p5A9Y%+HU_RRlem}=d5~H8Z$l_>YH_m89gt)KHOXKJB-#mZz_22%ZvDAbf zsk`)MZ$luSN{ceVkLT>JuJP@VNH->};?;mbV3L*=cv*^!GTOEV^_&;|>Nwwy_KSogc zUsoqdHfbBf*2Ka`x5b%CWa031SIl(qaecfT1Vj%G)cRutr9W(tXC%zfXsI-Z+j1kx z`ppNmd-E$R^`2#Pmol0vu?l>>ft7 zq0Zatw51xN7xzM@;arKGA{hOVw6MY1=g8CgbEN)T8fE?P*XYS>aT2~=1HUgiZ7mJq z_&{PFkg2?2>0Oo4&ok-|!02=AyS~1~5i~QirE;C3`n}V((Vt!5aJR*#FLW@{Yud_oJq zZ{vE4$CF5`c`7QDKEs5bU1~fl1vW11l;B%C)A}Ckw51~Psd9#6SO6F% znBixaA3fz50qx(D|G+kMs=)`~S4Bd<93|xw2sFEV%6ZgjOIcjWEE|+CMh2MuUQ{p$hDp3Jssx@AqX<7i9YBGSl(X&4{ z)I`B;YjOuQIlp*O4=0P+NUt$!>44G2jG$NDWCKGpk7kwQrG}pbXMg&#+Tgj;HvSPm z!i}WU9Lunk`P%Y!Jzh*CJg)Amao+Dv+r&Q&`WS!!CTCuA%|E3XdT67hNtF&w-2>vG z36gKXuv}VLnZ9*5TvXxrN2jf`&Kj49f=X3tz5{YCE{sx{U~OZl;nFRe5UfoNHGds2 zT&6O8qh3t;eD1eZzJ1W0wyqZ@%}WCJpqdi^qwYX(tD3BBj0PJF1qkK>a|X4$0>h-! z<H#tZt4 z;sSoS&GGZMCW;a02K0Os>UzPMXgzYqv#rpEd%i1(L5f}fIqrAx|!hxLzx3m;r)TaBS@%knz6C55PUGX7CV&q z&GLfxutlMrFzRv?*YHJz0l#0`*rDVFHaCV!RbxMZr6Hewf8ixMU(U|cfW}`(*Tg}) zVf-ABhgx13=SdK50yg9ObeJ4wf9w+sBMy+#ys(jz1%Pz0mMgsvyWKa%>G15DH}4`?b|lN})hT{bMf^5+dZ%(z1vma~ulAjING>5~?8T?TTDi zSk8CSM&hN)88o7WPZtzK#T5W@flxqU6#Y*}^=W8B#~r;Mh06F-cUs=}pbR!2E&M9x zJrN>ToEMN84G|85U)Pgj%Hz(y>9kEux8q5Qq82QyT}WBvE!yr`gd3A&MpbJHRbMNn zOnJg%@0U(nXS@ZWG_78%0iyXklzL1}RiT#^!0|!gf5!5v?uVic))Y!8)jyrKj{6zo zq+XL<4RUp&lp-|)15%{)(ZV)W9RFy240*R`gYpOR%7X&T%DAL{mVW58HOoNhBtJ%= z3xulVFr&q??BB1!-QVNL#y?rzD#Wm$29z7&(WXQo>ggyHAquy1uN%Q=9KtwNOhnM% zn@HP&*uNhe7ZJIfsbc;6btI|K-tfxf-(<%jdP@7Ifo z`<%c;p&5;BQluS9Ox#8K?+>9pUnnnlt<8*@z(3rbwk~`nQCmY$8QmT$uxYkDKg%F9 z>JMxsDH0L7jXb`+xjq)lGYq%j?XOPTFsF0yrYD~G-Uk2~g;G`@3k7HfSMcPZh!%bw z(1GvEPJF(W%WQWH|B!du-qJ?$EyAXeq{|8!g}ZqU1+92vLN~bU!FLU0!|z3!l-1JH zF;k*R>Dys6xfMVOQG9)SC{S2%>cSs@{*TMkZ=JRaBaM2kGw24EN5U?vJFyN44MEKZ z!Dt}18Zqg#HF#}%&vx4Ss;mK>bQ6~nqZ2N>JGCwb@qru{@Q;O$I&GEVRbLgL9qAM>X$z0sK0!(2Dp!WqhF)zvFK_N zIrCdZi-BnMW2bGZrgNTTxHaJ)Fdswwp4XwZSD}|^XPbZlQ5W7$bU<;vCt22E(R{NH zPDdz*j^hqiK&RGpruopF{LNc#YGpq zO;>UCcc-m2a*J(4<(o8rQfBm`XHQZ_J=AHd|Aq#^u+m2Qlz;U6Ic9XiV-COXI&EF` zv@UUm8EEOYVRmNx@e@Sq8{FgElbyEK$PMG-CIf{>0{|{b`Lg5R{vW|8srA;*w7!Qr zZ6kzxuV+f7&8b<2Gxu>;IcxFgU0>YKowmf0ozOICoHy{wJV@vs{1fo|w9{6n@}b3! zFTI~tyw*`4Q5Sgl2ghiY5p005=~d9vHh@}f@%b>mDzm{WC?{Qg#HgixMiR12_0~$i7k$6`#y2shP4h&JTOiSe-Ii`_S)Fe{L7Yb243Wa&MlY_{JbUy` zTdO58t@JfO%0hvFKk5%4E^%FcRPDYacv&wzKncXU8AX3UElsd_}!6qrKQ^>&b49qPrQn zp>=fl{%Un~?bpS{iDWU08o%t>`r_)RTlqq?$t2|FQUs#?z7JoUy6)OeTW@4>er9us z155=|R(lm)%epP{Vyh?%#qi^gKE+jbvhGJ?fu+^OqQh#4s88Q%YbjP|rbbH}B@Q>x zL46-vn~>Y#NM-e;ti}5F>iX7J3_7NP!0K8o8uPE;%zC=m!#{{9)bYvf(G6%sxk3yY z&NZm-;e^M?{JDHoB3pc1UESQQ29OoVSNN61lmViCWpuH$Q(l>`{d)ItxQK6Nz{fmh z8%q2`xc~d3d79;5%zv+TJKnX78b_h~*J*2YM2g8oDv|IwTtrQjX{Zq2-dz2VPjf6_ z*xKAo?e<-#9-_W|r!CIVb`<+M-H}vwVsUwXG6T4wnMX6X=d$jjciOg-;7}1Yixy?^ zrjp~gRz~uzr>*MH5v3G{g$rhv vmLI*-whe>aWd7QD`Gc~!pQ6wnW%U06U=W27<-6(c00000NkvXXu0mjfD{ra^ diff --git a/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/phone.png b/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..75f9a36d17ae87c9fbb5cc6673a7420488016d11 GIT binary patch literal 49101 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 literal 0 HcmV?d00001 diff --git a/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/pika-pika.png b/arkoala-arkts/trivial/trivial/entry/src/main/resources/rawfile/pika-pika.png deleted file mode 100644 index 3f4118414c26a1763b00a8c05c3936a85fb96127..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7007 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 diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index d767d0002..7d28ff27e 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -116,7 +116,7 @@ struct Page1 { console.log("#### Set Button onClick! #" + this.state) }) Image($r('app.media.startIcon')).width(60).height(60) - Image($rawfile('pika-pika.png')).width(400) + Image($rawfile('phone.png')).width(400) Text("Set Button onClick! #" + this.state) .width(200).height(100) TestProvide() -- Gitee From 4056c71273e8d5c5945726292ad2363136f76fbd Mon Sep 17 00:00:00 2001 From: Korobeinikov Evgeny Date: Mon, 17 Feb 2025 16:21:24 +0300 Subject: [PATCH 4/6] fixed tests --- arkoala/ets-plugin/package.json | 1 - arkoala/ets-plugin/src/DollarTransformer.ts | 46 ++++++++++++++++--- .../{Index.ets => dollar-functions.ets} | 3 ++ .../ets-plugin/test/ets/tsconfig.arkoala.json | 4 ++ .../ets-plugin/test/ets/tsconfig.arkts.json | 4 ++ .../ets-plugin/test/ets/tsconfig.dollar.json | 29 ------------ .../arkoala/ets/__router_initialization.ts | 2 + .../koala/ets/__router_initialization.ts | 2 + 8 files changed, 55 insertions(+), 36 deletions(-) rename arkoala/ets-plugin/test/ets/dollar-functions/{Index.ets => dollar-functions.ets} (75%) delete mode 100644 arkoala/ets-plugin/test/ets/tsconfig.dollar.json diff --git a/arkoala/ets-plugin/package.json b/arkoala/ets-plugin/package.json index 2c6829b2a..97b237c56 100644 --- a/arkoala/ets-plugin/package.json +++ b/arkoala/ets-plugin/package.json @@ -11,7 +11,6 @@ "scripts": { "compile": "ets-tsc -b .", "test": "npm run compile && npm run test:ets", - "compile:dollars:ets": "cd test/ets && ets-tsc -p tsconfig.dollar.json", "compile:arkoala:ets": "cd test/ets && ets-tsc -p tsconfig.arkoala.json", "compile:arkts:ets": "cd test/ets && ets-tsc -p tsconfig.arkts.json", "compile:koala:ets": "cd test/ets && ets-tsc -p tsconfig.koala.json", diff --git a/arkoala/ets-plugin/src/DollarTransformer.ts b/arkoala/ets-plugin/src/DollarTransformer.ts index e04ea5b01..46debc6f0 100644 --- a/arkoala/ets-plugin/src/DollarTransformer.ts +++ b/arkoala/ets-plugin/src/DollarTransformer.ts @@ -18,6 +18,7 @@ import { AbstractVisitor } from "./AbstractVisitor"; import { NameTable } from "./utils"; import { Importer } from "./Importer"; + interface ApplicationInfo { bundleName: string, moduleName: string @@ -34,11 +35,32 @@ export class DollarTransformer extends AbstractVisitor { super(sourceFile, ctx) } + currentStruct: ts.StructDeclaration | undefined = undefined + whiteList = ["$$", "$r", "$rawfile"] + isDollarFunction(node: ts.Identifier): boolean { + const name = ts.idText(node) + if (!this.whiteList.includes(name)) return false + return true + } + isDollarVariableAccess(node: ts.Identifier): boolean { const name = ts.idText(node) - if (!this.whiteList.includes(name)) return false + if (!name.startsWith("$")) return false + const fieldName = name.substring(1) + // TODO: is it correct? + // The white list has a preference over the fields. + if (this.whiteList.includes(name)) return false + if (!this.currentStruct) return false + if (this.currentStruct.members.find(it => ( + it.name && + ts.isIdentifier(it.name) && + ts.idText(it.name) == fieldName + )) == undefined) return false + // Already has a receiver. + if (ts.isPropertyAccessExpression(node.parent)) return false + return true } @@ -74,27 +96,39 @@ export class DollarTransformer extends AbstractVisitor { ) } - transformDollarDollarVariable(node: ts.CallExpression): ts.Expression { - return node + transformDollarVariableAccess(node: ts.Identifier): ts.Expression { + this.nameTable.dollars.push(ts.idText(node)) + return ts.factory.createPropertyAccessExpression( + ts.factory.createThis(), + node + ) } visitor(node: ts.Node): ts.Node { if (ts.isCallExpression(node)) { if (ts.isIdentifier(node.expression)) { - if (this.isDollarVariableAccess(node.expression)) { + if (this.isDollarFunction(node.expression)) { switch (ts.idText(node.expression)) { case "$r": return this.transformDollarRVariable(node) case "$rawfile": return this.transformDollarRawfileVariable(node) - case "$$": - return this.transformDollarDollarVariable(node) } } } } + if (ts.isStruct(node)) { + this.currentStruct = node + const transformed = this.visitEachChild(node) + this.currentStruct = undefined + return transformed + } else if (ts.isIdentifier(node)) { + if (this.currentStruct && this.isDollarVariableAccess(node)) { + return this.transformDollarVariableAccess(node) + } + } return this.visitEachChild(node) } } \ No newline at end of file diff --git a/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets b/arkoala/ets-plugin/test/ets/dollar-functions/dollar-functions.ets similarity index 75% rename from arkoala/ets-plugin/test/ets/dollar-functions/Index.ets rename to arkoala/ets-plugin/test/ets/dollar-functions/dollar-functions.ets index d18c9fccb..6a0f053fd 100644 --- a/arkoala/ets-plugin/test/ets/dollar-functions/Index.ets +++ b/arkoala/ets-plugin/test/ets/dollar-functions/dollar-functions.ets @@ -1,10 +1,13 @@ @Entry @Component struct Index { + @State myState2: string = "Hello" + build() { Column() { Image($rawfile('startIcon.png')) Image($r('app.media.icon')) + Text($myState2) } .height('100%') .width('100%') diff --git a/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json b/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json index fc43e2658..1df10a875 100644 --- a/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json +++ b/arkoala/ets-plugin/test/ets/tsconfig.arkoala.json @@ -19,6 +19,10 @@ "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", "arkui": "@koalaui/arkoala-arkui", "destination": "../../build/ts/arkoala/ets", + "applicationInfo": { + "bundleName": "com.application.example", + "moduleName": "entry" + } } ] } diff --git a/arkoala/ets-plugin/test/ets/tsconfig.arkts.json b/arkoala/ets-plugin/test/ets/tsconfig.arkts.json index 5d6536e20..7bc311532 100644 --- a/arkoala/ets-plugin/test/ets/tsconfig.arkts.json +++ b/arkoala/ets-plugin/test/ets/tsconfig.arkts.json @@ -19,6 +19,10 @@ "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", "arkui": "@koalaui/arkts-arkui", "destination": "../../build/ts/arkts/ets", + "applicationInfo": { + "bundleName": "com.application.example", + "moduleName": "entry" + } } ] } diff --git a/arkoala/ets-plugin/test/ets/tsconfig.dollar.json b/arkoala/ets-plugin/test/ets/tsconfig.dollar.json deleted file mode 100644 index 9bd5f146a..000000000 --- a/arkoala/ets-plugin/test/ets/tsconfig.dollar.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "extends": "@koalaui/arkui-common/config/tsconfig.base.json", - "include": [ - "./dollar-functions/**/*.ets" - ], - "compilerOptions": { - "baseUrl": ".", - "outDir": "../../build/js/arkoala/ets", - "paths": { - "@kit.AbilityKit": [ - "arkoala-ability/@kit.AbilityKit" - ], - "@ohos.app.ability.UIAbility": [ - "arkoala-ability/@ohos.app.ability.UIAbility" - ] - }, - "plugins": [ - { - "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", - "arkui": "@koalaui/arkoala-arkui", - "destination": "../../build/ts/arkoala/ets", - "applicationInfo": { - "bundleName": "com.application.example", - "moduleName": "entry" - } - } - ] - } - } \ No newline at end of file diff --git a/arkoala/ets-plugin/test/golden/arkoala/ets/__router_initialization.ts b/arkoala/ets-plugin/test/golden/arkoala/ets/__router_initialization.ts index 2d336d769..acedfbdd3 100644 --- a/arkoala/ets-plugin/test/golden/arkoala/ets/__router_initialization.ts +++ b/arkoala/ets-plugin/test/golden/arkoala/ets/__router_initialization.ts @@ -2,9 +2,11 @@ import { EntryExample as Entry0 } from "./Rewrite" import { LocalStorageLinkExample as Entry1 } from "./Rewrite2" import { LocalStoragePropExample as Entry2 } from "./Rewrite3" +import { Index as Entry3 } from "./dollar-functions/dollar-functions" export function registerRoutes() { const __forceEntry0Use = Entry0 const __forceEntry1Use = Entry1 const __forceEntry2Use = Entry2 + const __forceEntry3Use = Entry3 } diff --git a/arkoala/ets-plugin/test/golden/koala/ets/__router_initialization.ts b/arkoala/ets-plugin/test/golden/koala/ets/__router_initialization.ts index 2d336d769..acedfbdd3 100644 --- a/arkoala/ets-plugin/test/golden/koala/ets/__router_initialization.ts +++ b/arkoala/ets-plugin/test/golden/koala/ets/__router_initialization.ts @@ -2,9 +2,11 @@ import { EntryExample as Entry0 } from "./Rewrite" import { LocalStorageLinkExample as Entry1 } from "./Rewrite2" import { LocalStoragePropExample as Entry2 } from "./Rewrite3" +import { Index as Entry3 } from "./dollar-functions/dollar-functions" export function registerRoutes() { const __forceEntry0Use = Entry0 const __forceEntry1Use = Entry1 const __forceEntry2Use = Entry2 + const __forceEntry3Use = Entry3 } -- Gitee From 71656ffa879ed58a54e72a4dd6efa55d3e98d384 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Mon, 17 Feb 2025 16:58:01 +0300 Subject: [PATCH 5/6] test dollar functions with golden files Signed-off-by: Sergey Malenkov --- .../ets/dollar-functions/dollar-functions.ts | 52 ++++++++++++++++++ .../ets/dollar-functions/dollar-functions.ts | 52 ++++++++++++++++++ .../ets/dollar-functions/dollar-functions.ts | 54 +++++++++++++++++++ arkoala/ets-plugin/test/utils.ts | 2 +- 4 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts create mode 100644 arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts create mode 100644 arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts diff --git a/arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts b/arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts new file mode 100644 index 000000000..802760813 --- /dev/null +++ b/arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts @@ -0,0 +1,52 @@ +import { ArkColumn, ArkColumnComponent, ArkCommonMethodComponent, ArkImage, ArkPageTransitionEnterComponent, ArkPageTransitionExitComponent, ArkStructBase, ArkText, LocalStorage, MutableState, _r, _rawfile, observableProxy, stateOf } from "@koalaui/arkoala-arkui"; +import { registerArkuiEntry } from "@koalaui/arkoala-arkui/ohos.router"; +class ArkIndexComponent extends ArkStructBase { + private _entry_local_storage_ = new LocalStorage(); + __initializeStruct(/**/ + /** @memo */ + content?: () => void, initializers?: IndexOptions): void { + this.__backing_myState2 = stateOf(initializers?.myState2 ?? ("Hello"), this); + } + private __backing_myState2?: MutableState; + private get myState2(): string { + return this.__backing_myState2!.value; + } + private set myState2(value: string) { + this.__backing_myState2!.value = observableProxy(value); + } + /** @memo */ + __build(/**/ + /** @memo */ + __builder: ((__instance: ArkCommonMethodComponent) => void) | undefined, /**/ + /** @memo */ + content?: () => void, initializers?: IndexOptions) { + ArkColumn(__instance => { + { + __instance.height('100%') + .width('100%'); + } + __builder?.(__instance); + }, () => { + ArkImage(undefined, undefined, _rawfile('startIcon.png', "com.application.example", "entry")); + ArkImage(undefined, undefined, _r('app.media.icon', "com.application.example", "entry")); + ArkText(undefined, undefined, this.$myState2); + }); + } +} +/** @memo */ +export function Index(/**/ +/** @memo */ +style?: (__instance: ArkCommonMethodComponent) => void, /**/ +/** @memo */ +content?: () => void, initializers?: IndexOptions): void { + const updatedInitializers: IndexOptions = { + __backing_myState2: initializers?.__backing_myState2 + }; + ArkIndexComponent._instantiate(style, () => new ArkIndexComponent, content, updatedInitializers); +} +export interface IndexOptions { + __backing_myState2?: MutableState; + myState2?: string; +} +registerArkuiEntry(Index, "dollar-functions/dollar-functions"); +export const __Entry = Index; diff --git a/arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts b/arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts new file mode 100644 index 000000000..6314c5bd1 --- /dev/null +++ b/arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts @@ -0,0 +1,52 @@ +import { ArkColumn, ArkColumnComponent, ArkCommonMethodComponent, ArkImage, ArkPageTransitionEnterComponent, ArkPageTransitionExitComponent, ArkStructBase, ArkText, _r, _rawfile, stateOf } from "@koalaui/arkts-arkui"; +import { MutableState } from "@koalaui/runtime"; +import { LocalStorage } from "@koalaui/arkui-common"; +import { observableProxy } from "@koalaui/common"; +class ArkIndexComponent extends ArkStructBase { + private _entry_local_storage_ = new LocalStorage(); + __initializeStruct(/**/ + /** @memo */ + content?: () => void, initializers?: IndexOptions): void { + this.__backing_myState2 = stateOf(initializers?.myState2 ?? ("Hello"), this); + } + private __backing_myState2?: MutableState; + private get myState2(): string { + return this.__backing_myState2!.value; + } + private set myState2(value: string) { + this.__backing_myState2!.value = observableProxy(value); + } + /** @memo */ + __build(/**/ + /** @memo */ + __builder: ((__instance: ArkCommonMethodComponent) => void) | undefined, /**/ + /** @memo */ + content?: () => void, initializers?: IndexOptions) { + ArkColumn(__instance => { + { + __instance.height('100%') + .width('100%'); + } + __builder?.(__instance); + }, () => { + ArkImage(undefined, undefined, _rawfile('startIcon.png', "com.application.example", "entry")); + ArkImage(undefined, undefined, _r('app.media.icon', "com.application.example", "entry")); + ArkText(undefined, undefined, this.$myState2); + }); + } +} +/** @memo */ +export function Index(/**/ +/** @memo */ +style?: (__instance: ArkCommonMethodComponent) => void, /**/ +/** @memo */ +content?: () => void, initializers?: IndexOptions): void { + const updatedInitializers: IndexOptions = { + __backing_myState2: initializers?.__backing_myState2 + }; + ArkIndexComponent._instantiate(style, () => new ArkIndexComponent, content, updatedInitializers); +} +export interface IndexOptions { + __backing_myState2?: MutableState; + myState2?: string; +} diff --git a/arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts b/arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts new file mode 100644 index 000000000..2882f8963 --- /dev/null +++ b/arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts @@ -0,0 +1,54 @@ +import { $r, $rawfile, AppStorage, ArkColumn, ArkColumnComponent, ArkCommonMethodComponent, ArkImage, ArkPageTransitionEnterComponent, ArkPageTransitionExitComponent, ArkStructBase, ArkText, CanvasRenderingContext2D, CustomDialogController, DataChangeListener, Environment, ForEach, GestureGroup, IDataSource, LocalStorage, LongPressGesture, PanGesture, PanGestureOptions, PersistentStorage, PinchGesture, RenderingContextSettings, RotationGesture, Scroller, SubscribedAbstractProperty, SwipeGesture, SwiperController, TabsController, TapGesture, TextAreaController, VideoController, _r, _rawfile, animateTo, fp2px, getContext, getInspectorByKey, lpx2px, px2fp, px2lpx, px2vp, stateOf, vp2px } from "@koalaui/arkui"; +import { MutableState } from "@koalaui/runtime"; +import { registerArkuiEntry } from "@koalaui/arkui/ohos.router"; +import { observableProxy } from "@koalaui/common"; +class ArkIndexComponent extends ArkStructBase { + private _entry_local_storage_ = new LocalStorage(); + __initializeStruct(/**/ + /** @memo */ + content?: () => void, initializers?: IndexOptions): void { + this.__backing_myState2 = stateOf(initializers?.myState2 ?? ("Hello"), this); + } + private __backing_myState2?: MutableState; + private get myState2(): string { + return this.__backing_myState2!.value; + } + private set myState2(value: string) { + this.__backing_myState2!.value = observableProxy(value); + } + /** @memo */ + __build(/**/ + /** @memo */ + __builder: ((__instance: ArkCommonMethodComponent) => void) | undefined, /**/ + /** @memo */ + content?: () => void, initializers?: IndexOptions) { + ArkColumn(__instance => { + { + __instance.height('100%') + .width('100%'); + } + __builder?.(__instance); + }, () => { + ArkImage(undefined, undefined, _rawfile('startIcon.png', "", "entry")); + ArkImage(undefined, undefined, _r('app.media.icon', "", "entry")); + ArkText(undefined, undefined, this.$myState2); + }); + } +} +/** @memo */ +export function Index(/**/ +/** @memo */ +style?: (__instance: ArkCommonMethodComponent) => void, /**/ +/** @memo */ +content?: () => void, initializers?: IndexOptions): void { + const updatedInitializers: IndexOptions = { + __backing_myState2: initializers?.__backing_myState2 + }; + ArkIndexComponent._instantiate(style, () => new ArkIndexComponent, content, updatedInitializers); +} +export interface IndexOptions { + __backing_myState2?: MutableState; + myState2?: string; +} +registerArkuiEntry(Index, "dollar-functions/dollar-functions"); +export const __Entry = Index; diff --git a/arkoala/ets-plugin/test/utils.ts b/arkoala/ets-plugin/test/utils.ts index b22af78f9..a4da1e0c1 100644 --- a/arkoala/ets-plugin/test/utils.ts +++ b/arkoala/ets-plugin/test/utils.ts @@ -22,7 +22,7 @@ export function testFolder(folder: string) { suite(folder, () => { const golden = "./test/golden/" + folder const current = "./build/ts/" + folder - const files = collectFiles(path.resolve(golden)) + const files = collectFiles(path.resolve(current)) console.log(files) files.forEach(file => { test(file, () => { -- Gitee From c4f38ed95562d22b8addeccffbfad47e4fd7977f Mon Sep 17 00:00:00 2001 From: Korobeinikov Evgeny Date: Mon, 17 Feb 2025 17:41:45 +0300 Subject: [PATCH 6/6] one more fix --- .../arkui/src/handwritten/resources.ts | 4 +- arkoala/ets-plugin/src/ArkExpander.ts | 6 +- arkoala/ets-plugin/src/DollarTransformer.ts | 58 ++++++------------- .../ets/dollar-functions/dollar-functions.ts | 4 +- .../ets/dollar-functions/dollar-functions.ts | 4 +- .../ets/dollar-functions/dollar-functions.ts | 4 +- 6 files changed, 27 insertions(+), 53 deletions(-) diff --git a/arkoala-arkts/arkui/src/handwritten/resources.ts b/arkoala-arkts/arkui/src/handwritten/resources.ts index 2e2e8cf8a..44c16b051 100644 --- a/arkoala-arkts/arkui/src/handwritten/resources.ts +++ b/arkoala-arkts/arkui/src/handwritten/resources.ts @@ -1,6 +1,6 @@ import { Resource } from "../generated"; -export function _r(name: string, bundleName: string, moduleName: string): Resource { +export function _r(bundleName: string, moduleName: string, name: string): Resource { const param: string = name.split(".")[1]; let res_type = 20000; @@ -29,7 +29,7 @@ export function _r(name: string, bundleName: string, moduleName: string): Resour } as Resource } -export function _rawfile(name: string, bundleName: string, moduleName: string): Resource { +export function _rawfile(bundleName: string, moduleName: string, name: string): Resource { return { "id": 0, "type": 30000, diff --git a/arkoala/ets-plugin/src/ArkExpander.ts b/arkoala/ets-plugin/src/ArkExpander.ts index 6331604c6..c5cdf8d6e 100644 --- a/arkoala/ets-plugin/src/ArkExpander.ts +++ b/arkoala/ets-plugin/src/ArkExpander.ts @@ -25,7 +25,7 @@ import { CallTable, IssueTable, NameTable } from './utils' import { LazyTransformer } from './LazyTransformer' import { EntryTracker } from './EntryTracker' import { filterOutDiagnostics } from './DiagnosticFilter' -import { DollarTransformer } from './DollarTransformer' +import { DollarTransformer, ApplicationInfo } from './DollarTransformer' import { ExtensionStylesTransformer } from './ExtensionStylesTransformer' import { NewTransformer } from './NewTransformer' import { CustomBuilderTransformer } from './CustomBuilderTransformer' @@ -35,10 +35,6 @@ import { LegacyCallTransformer } from './LegacyCallTransformer' import { AbilityTransformer } from './AbilityTransformer' import { ObservedResolver } from "./ObservedResolver" -interface ApplicationInfo { - bundleName: string, - moduleName: string -} interface ArkToKoOptions { trace?: boolean source?: string diff --git a/arkoala/ets-plugin/src/DollarTransformer.ts b/arkoala/ets-plugin/src/DollarTransformer.ts index 46debc6f0..12a3dfe99 100644 --- a/arkoala/ets-plugin/src/DollarTransformer.ts +++ b/arkoala/ets-plugin/src/DollarTransformer.ts @@ -19,7 +19,7 @@ import { NameTable } from "./utils"; import { Importer } from "./Importer"; -interface ApplicationInfo { +export interface ApplicationInfo { bundleName: string, moduleName: string } @@ -39,12 +39,6 @@ export class DollarTransformer extends AbstractVisitor { whiteList = ["$$", "$r", "$rawfile"] - isDollarFunction(node: ts.Identifier): boolean { - const name = ts.idText(node) - if (!this.whiteList.includes(name)) return false - return true - } - isDollarVariableAccess(node: ts.Identifier): boolean { const name = ts.idText(node) if (!name.startsWith("$")) return false @@ -64,58 +58,42 @@ export class DollarTransformer extends AbstractVisitor { return true } - transformDollarRVariable(node: ts.CallExpression): ts.Expression { - const args = node.arguments.slice() - - args.push( - ts.factory.createStringLiteral(this.applicationInfo?.bundleName ?? ""), - ts.factory.createStringLiteral(this.applicationInfo?.moduleName ?? "entry") - ) - - return ts.factory.updateCallExpression( - node, - ts.factory.createIdentifier(this.importer.withAdaptorImport("_r")), - node.typeArguments, - args + transformDollarVariableAccess(node: ts.Identifier): ts.Expression { + this.nameTable.dollars.push(ts.idText(node)) + return ts.factory.createPropertyAccessExpression( + ts.factory.createThis(), + node ) } - transformDollarRawfileVariable(node: ts.CallExpression): ts.CallExpression { + isDollarCallExpression(node: ts.CallExpression): boolean { + return !this.whiteList.includes(ts.idText(node.expression as ts.Identifier)) ? false : true + } + + transformDollarCallExpression(node: ts.CallExpression): ts.CallExpression { + const name = ts.idText(node.expression as ts.Identifier).replace('$', '_') + const args = node.arguments.slice() - args.push( + args.unshift( ts.factory.createStringLiteral(this.applicationInfo?.bundleName ?? ""), ts.factory.createStringLiteral(this.applicationInfo?.moduleName ?? "entry") ) return ts.factory.updateCallExpression( node, - ts.factory.createIdentifier(this.importer.withAdaptorImport("_rawfile")), + ts.factory.createIdentifier(this.importer.withAdaptorImport(name)), node.typeArguments, args ) - } - transformDollarVariableAccess(node: ts.Identifier): ts.Expression { - this.nameTable.dollars.push(ts.idText(node)) - return ts.factory.createPropertyAccessExpression( - ts.factory.createThis(), - node - ) } visitor(node: ts.Node): ts.Node { - if (ts.isCallExpression(node)) { - if (ts.isIdentifier(node.expression)) { - if (this.isDollarFunction(node.expression)) { - switch (ts.idText(node.expression)) { - case "$r": - return this.transformDollarRVariable(node) - case "$rawfile": - return this.transformDollarRawfileVariable(node) - } - } + if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) { + if (this.isDollarCallExpression(node)) { + return this.transformDollarCallExpression(node) } } diff --git a/arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts b/arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts index 802760813..efc95491b 100644 --- a/arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts +++ b/arkoala/ets-plugin/test/golden/arkoala/ets/dollar-functions/dollar-functions.ts @@ -27,8 +27,8 @@ class ArkIndexComponent extends ArkStructBase { } __builder?.(__instance); }, () => { - ArkImage(undefined, undefined, _rawfile('startIcon.png', "com.application.example", "entry")); - ArkImage(undefined, undefined, _r('app.media.icon', "com.application.example", "entry")); + ArkImage(undefined, undefined, _rawfile("com.application.example", "entry", 'startIcon.png')); + ArkImage(undefined, undefined, _r("com.application.example", "entry", 'app.media.icon')); ArkText(undefined, undefined, this.$myState2); }); } diff --git a/arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts b/arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts index 6314c5bd1..0d250826a 100644 --- a/arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts +++ b/arkoala/ets-plugin/test/golden/arkts/ets/dollar-functions/dollar-functions.ts @@ -29,8 +29,8 @@ class ArkIndexComponent extends ArkStructBase { } __builder?.(__instance); }, () => { - ArkImage(undefined, undefined, _rawfile('startIcon.png', "com.application.example", "entry")); - ArkImage(undefined, undefined, _r('app.media.icon', "com.application.example", "entry")); + ArkImage(undefined, undefined, _rawfile("com.application.example", "entry", 'startIcon.png')); + ArkImage(undefined, undefined, _r("com.application.example", "entry", 'app.media.icon')); ArkText(undefined, undefined, this.$myState2); }); } diff --git a/arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts b/arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts index 2882f8963..a52669498 100644 --- a/arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts +++ b/arkoala/ets-plugin/test/golden/koala/ets/dollar-functions/dollar-functions.ts @@ -29,8 +29,8 @@ class ArkIndexComponent extends ArkStructBase { } __builder?.(__instance); }, () => { - ArkImage(undefined, undefined, _rawfile('startIcon.png', "", "entry")); - ArkImage(undefined, undefined, _r('app.media.icon', "", "entry")); + ArkImage(undefined, undefined, _rawfile("", "entry", 'startIcon.png')); + ArkImage(undefined, undefined, _r("", "entry", 'app.media.icon')); ArkText(undefined, undefined, this.$myState2); }); } -- Gitee