From b3658472ac4f8cb06cf7e01c568b056d47dbc091 Mon Sep 17 00:00:00 2001 From: develar Date: Fri, 23 Aug 2013 22:12:37 +0400 Subject: [PATCH] JS backend: improved sourcemap generation and moved SourceMap3Builder and JsSourceGenerationVisitor to kotlin sources from dart-ast(develar fork). #KT-927 in progress (cherry picked from commit 10fb0f9) --- js/js.translator/lib/dart-ast.jar | Bin 116833 -> 111700 bytes js/js.translator/lib/src/dart-ast-src.jar | Bin 76638 -> 74206 bytes .../compiler/JsSourceGenerationVisitor.java | 93 ++++++++++ .../compiler/sourcemap/SourceMap3Builder.java | 168 ++++++++++++++++++ .../jetbrains/k2js/facade/K2JSTranslator.java | 5 +- .../k2js/facade/SourceMapBuilderConsumer.java | 2 +- .../expression/ExpressionVisitor.java | 30 ++-- .../k2js/translate/general/Translation.java | 16 +- .../operation/BinaryOperationTranslator.java | 7 +- .../translate/reference/CallTranslator.java | 2 +- .../k2js/translate/utils/JsAstUtils.java | 8 + 11 files changed, 297 insertions(+), 34 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/js/compiler/JsSourceGenerationVisitor.java create mode 100644 js/js.translator/src/org/jetbrains/js/compiler/sourcemap/SourceMap3Builder.java diff --git a/js/js.translator/lib/dart-ast.jar b/js/js.translator/lib/dart-ast.jar index ba5c8028bdcd24b4d7864c0a29af3bed9d892853..de3a20e193fa2b37ce88715926fbd134fb0e8ba2 100644 GIT binary patch delta 27014 zcmZ6y1ymhPur-RiyK8WFcXxN!;0_^326rd8y99T4m*DOi+?@a~UvmHZzxU3pb-HU$ zRdrR*teW0E=j_Bm&mTb{D$9XGz=8bt8BA1-M0uY;7U08rZcEAw^e6b1=UlzL+y0ocF2#L9BUl<=}Y zP)HIn_&-RYh_QYwiyXARvRnw_|7wv`{?WRvg#k}ow_{8pss=@^UmPF+{i~2-paRNR z54lwb_J75c$a+w?`kS+_|FFdKY{vSJ_wS&IfBdH~w16TuU&Db8!~8S&&;(^{J|Y9v zMM#;H1!YX(?f^w=F5m=Z1xqycVN9`=0EKTh6#-3w|Eu2oN1Yrr#fTM@zWLk^6b<@M z8uZO6UqEj_VKG2p{v2p#s)d@0J>pfJsyx}bPq;Qv9wMSmga6aoWK7{J?&Km!-# z>e69Wu}%l=WnUv$l-^pk?GCg^VKw3N2B(5-y~1&_E@j53W%{H%FI$F`9D{D2X)jrr zp9WFDBD7WBs&0fIb%cZphQw7c8Fj=v1w` zc=Ore*ZfDeCmaY?|5m>;C{QAsM_>puCnQ84NZcD~ab@-t{`!jo^4m$(s}3&pRUMcR zvKWpc%~d3``1%1I-0uVsl&}E=v3k6@a(i1&|C`01FN+G3YxrwxyOT>pu=Lgn>2EXN zt&3-M8}u48seOfVOE~COizr{&3;5dlW6GP*4Q#p6LkbZ28X+tlYyiEjO$^)c1+E4x zW3^K^u`ima)aB`0GPx}?XNxfE4JRRs$;X$o6)met#X0hh9Emnz8C$bC0fnS zuK7pYhZR^{pPHsDD9ZkSD-_?;eI>U8N1JNCPn36q~=&%@&VXMR#g3?HA&A_-WO zDh}o6u+I-_Rm8#7mje-|w*t(W=f#>E#ReP&|q-2Trr{C5?pz8BqT9!_Ab;w(C;v>_@aO&pL!i3XYw;+xA&t)o9B{X0AVR1}6m) z);dHuvhoZpjbnljcR=Op?c1zN1M_lm1@PEkVtSJ5&Od*?-2y83I$8P`=|2}NIwH+7 z(B#>75RpvBu9SL>t4f{F*sL|8QMIj=n5Xuzj>g?_EAsY_5bl6hwt3GNStNGJauWGx zrRw9mi8V^DLa(z8Yy>A9o32J9%a8<*aobbAn&0XNAr%iJT`w(42tjwk{th(R5Fv&I{3 z-ehCMF{wXnO}N4M;?j8A;^Q}`zu@+mRPjA)L$tB*40)N?>xD%IbcDy?2HsIFDqWgf zq`>8q#`b77$|b%>4-xqPF|+l^Sgp37FZ{xCm@a?^_toBdE+n9(sl_DDtfonx_xv^) zgbj)g0g&n$usG4|^*LhF?+a{p#Z_JaVQ-kwZ#r~#iC?JLKIaT-lqU_eWHOo-@X*;2)zs@k`qlomlk zd^8@~;>qI+CrMMNPEd`x7sh8cL^fJMHEpoYRA7S3hK9E(S;2!v5RF%e%1kClv*mY( z^vIS!((r7wx?eZA8914Dy_xi*3Ul9`C1V0uH>GmhV$9=7L!dXzvdiG4zW2(6)(cz& zf&8#HgPIq27_R(haMI9nXSuc(Kiu**6O1PYe;V6!#f3ga!SZB-V}^hhN7}HE3dDAX zK%f-S+c_>YubLP8keQ&;MFBT6NT)@7n$0R)CKXB!f-^oTb>f)n&Qf*?pCTX~yw4%w zcaS34_Gp@ToErVIao3?N8mOXIuGw>HR}WF-4LWMLOuD)>1UrS_xy&<|&_mCoMuifD zn!6H&p7`(u{j)CjgZYEn(h$)}9j49M6cDlHn zN!bS0O{KhJ*w1EQ&Cu=a{bsk0Bj@pIik>XIEpaEF8+h>(ftVMcWB{c0 z%hPNU|5^5p`$x!0FD2WG)x&G6q-jJcX-d4+_CS`=G`E_ z`XRRkb-AH8#kvnTW5iH>AyKNTz7mKI=awGA_-gILnmA5sQv09sTX;NV@C^Fi8@9yR zU>}gT+rKJ9-ny=|rhV=f zTAEvTUvM)(^fiFW`v}PI2>|94M=8JI8Z=IyYH?kM^fA)np64rzU<3Ecyo1O2<0h!? z#l5?*Ct-p%C1n;63#f9&)>Y)1-cnFC&?|~eDUo$_x6ZKopjuw1$1=jPYjL3l6nzAY zO_{x#VKt*$c74g04;>&`Jixb8SWM`I)O(DIT zOnnYJrYul;bbSs7robsqg+>tJzUe7$g+kCq@8Bw~T_8+*WTZjAF}}p|A5Ve3yJTl5 z*lPpES!8E|j7@31RhTBoF0~8@$tWhsuCDXq&MQ0<060%L>f zP^V}nQZ3pEy=@Z9DvZS}+OaTvLxZXai*$X8PAply9$__9K&v)!V3EY~oPI@4F9PZV zJvJMzop6xA@Sq24Dn(!RFH_Dy9gHkxV>c9dX?zux=u~Va^WV=*pl5-~?*g_NY>aU7!Og*fug%O^GvIr1Pr!la>u;qLr~fEO5?Sl-XKWQ3`z3N>}vl zgJu+A8cC~~GG?+-Y}#8_i6r@G<{w-dJEI;7mDh$B9#~eJgI2#)d7u{vP|PDaHNHhX zG$`|pEFdwjvWcE6R(aqT`0ABzOfDd?uGWhJ=O|jQii)pQC7A6WZzLs^1zR57M!IU9 z+YsNedXF=>93`XHktz25!CKgnQw}K+H?(wGAi8pL#`X7`ia#u~g07PHlszzH6-9%( zcu%Q=)=3JDS1SV;Q)acMyn6wVxg!@yYLx3Rv^LImeaLG6S3ZE;;9D4@kgVf{W8My3 zH$?ZXO>XS$f!0pP2e`5vG|WpVNZ-pJ*3hE?0`eaN`Ts1YoBu4PsldR$+o-1W$b#~v zv=@V-)h9a>K>PB(di<}H zm>bMjj}}J>`OkwLU;SQc*m;SK z0u;WUquS{&k}~}jls2j64?&@6eEL5z@YNf&ar_hhxJ+rO0!6Cd?kf2^bV_{a{}?b2 z;s1|8IbVJFn83ft{)CyLRP$#9G>Cs`{2NBxts$X~wpKVKq= zCO!;_Bx}$q$+drollXG>zZ4?oE&e6;pXL3|>%Rd0H)6&kpML>N{h5ujOYwh3SJ&JB zI&*jH|59X@_;UrS8$r?Qo<{#hlJXb9YXU{D$9pOH=i@&HblL=p+&B$7``4_w2pn|l zZ|}eBm2!pthaC+-f$si`=nvHV2g3g=H6vkzzW#NS!b}V*&@4j$y8q9|AJOZt%HJWI zotXZ|<$rp7&C#r&L;u|UnYCtc9#DpVy8kD`W(R)IAOAbY&0GqgSbwGFKX*pX|4w%^ zk~L_-Kf^z9@TL4ApKvMby`adzpoX5>oG`|F6Nah{N*PxNrzZm>EVg4^pI1Ub!qb8j9Cx;eg;HzJO{SI=S4}Nr+@ldAmsG6 zsoO!*r+e4Mbr3E{W)E@rz+b27jN_s*^+%p{aGwtb*2yL4WVmt#yq$(d>>&YWArX9Ou2%Z1ej`K24$L({KGYY|-Q zwjS({?MZE_F}gp`LgUfCsX)YNSzDG(CP=hNvYd`oX01QIBgk+8gaR!E1^A)t@+YZ% z2844hQX*CdM8~PUzKD>7^`1R(8xb8qIb?w>RseJK|==VGe?3;pshP z&-Xi>Jnc+9eNP>Iuet%|RoS!^HKu%@OD2<`&1ptvfI^bzyY;-OC0B^ z7ka9kxB(|wjVsQq9_2*qf)u7cYYBZ5xMt-YDF01(*N*%d@w`xJ@{4qmJshXli*TnR z*abyP{k$w(0hF3n`k-~DN`p?_XacpENsVFpS$}I7K#i8;gIuZedJJ_w+V*hUg7SfLd+Y*_NBdC=B>Cl_TZl{a+O%%Z> z!UWJmKpwba4tGI|#gTMhTg-7Jbhp3Y4zXZer(LRyS*)wj%&I`4#|Nj5?g(T;KIegi0ZRjeCx;UZ8lrdm5U<3#;BU!TZD#q?S0 z&5hw-$SR-N)|;fPZjV8@ctl9~!RRb7+y3pTF2psKOXBy}*RO*vbkOIV{mW@;U%xwx zidQ4y@ZmyIiQm`Qo`$Y_NT;C&w_9?D*siD~sMg7+5Vxwr^O@4$t_vEX}DmfPZ6(pl|fB}lBA zwK|S03e7b_npEw=Rh4_f<6`Qt`1k>3pJ-``_UJH;%tA$ZrJc)5O}WAy)#tA&;Sg_W zv6zcy6Wa=Ru{71!hiLmJ{fP){?nK1xzqHKh@Gd7QLtFo3N!fkWmV)Q=?Q%~OAoVo3!5ER zL}mvm^6i1b^tm-fS+R^&d^cLB5QbZ{3-aJQ^exSx?2)+(#rGjAU&PB-hlcE*Td1#% zQrU5#=y`ZlV!g5`J`5Q0Qz6K}=6!Es->vNc?zjALw0Qk)Vb*uH-7zNfyt`V($6Cdg zin$vj3(;0O9HFzXskZ_HpX9omlwP$>1?-6pKzQ&Ye&ggkjVS2gnlq?j$#+P`r=}q6 zWot0W!3xPmH3YlRh*VMR>b@gaRZO`P^5mRKMdX)8_St>Azzi`o<`tp?z&_x@yW=nx zD4NDHD#<28V!daGsT^}lxPvurS|um&Tm1QaF}04KnT(;n;^u)3+Q!T)$PsyDAvsRx zQI%~&^StA$_U_U=1oK>=#$paG?dTt5kq|WJ3pIpsHJBxCcQ0D;jpS(@Mw?ARx5}|No*9 z45kY>;!9u%>`65>H7lGXd{1t&rbZrS*FTh9+3UO+thULzvWD?YqNYdNqVy{p?S0EuOpWEQrU*9UP)5H2=V1hvo9{hKq`(pO8sU! z#!(etmA;KVM`5=qM>+w`qRfJRqmR^mL2rj$HC9Vjlt$08GZ@vKkAIq0fHsV!02d7K zmP|;rTR~)ua&hM(y(VGHhql6T+@h$BE}a6U)!Ki>M};zCqv~JD{WJZ+_w>5KKGB72 zh;Cz`g2Vl@>PPq$4Rv zE*Dp7&!n7E1DC3kcNrp+n>VF`;kgyiSE6NAH1Enqi>t*LyG$(qF;s|pwM*T;wfx=V zDP4vwIW;cnr)kzQl37S`Rc5)mA_ArEpqZb=ri-O5cull1GMs-hSm+wi*06YgAMk9eI@_PT;I>G3 zZ03i}o7gPSo4l3c_;nwLPk?|27~dq1DOon85ehsye#c#z*d&(rZH;y7RQ(n)ft_R& zzfmB8Cn5M6cTgXS^I4^b=Y7){;=WG96)&8;({9SS3;EaRZLuK(T&87>#6aR1EJaC2 zY?aFkmpNdTGhS*W2Wl(Ssi+nk18LL zF!JF7wc(Mh;n`|Ul1JH~>V+{)lTL&=fICk=7)AjXNTi@8I74+i{8H#LK((YK?(Ipx3jHBsMq~bC z`kQfv$(qqK{xk86-ZT93;ORu-sznw}64k+&Ae@p_!i+k$43v*Tw@<(4TQUh&I9`-j z+3|RTnuR7sSUz_!va_1piKE=fFXDRAv6h9HuNclMK|G!SqLu&xGYHN}hAzO{TaH1>&oy~a)bL@j5yTX3L@-QhO7&eTcHlnj~ zK^>f6dM=+tvM%4y&mFhrKC80M{d6lfy3JtCA{y;0T_)0QHELLGeE7QM>e0yi?QMz} z0L2ke8A7n6n2wPcX4=9^y{H+ffqN13y%2>x z^l%F)Z_*e>Dt&>_p{%GTPcdl0%#(4~U6D)ubkHXF5a7KCfwR^!-_()m^%bxCx{-w= z*h=P2O+8#gwd=OiGrcNvVuiyHk`Oj5u@{Hb=Aj>vsSnBlWiaq7Lig~r17)#rL=PYv z>2b1S&)d|Rv!A^OM( zKDyBwI$+l`3%d*g#@0<-Kl~&M@wR97Dc~Ym)wl8_E>GZIIq9l0fS^fQ<~K}Xkz)yp z>J@Aijc1fSWM>Q6PIy4ca>7+sz~#mRG^9}5IU8j8+6DD=TuKinhW>azc5^0Q*@k4l zI)L!FS}szyOXos0l5wOIQYmIeyP$(9b#=Q(0rXUIvXS+b)Z+|^CIzZ*s~v3$Grx~c zYan3m64h|io6{&8Fzb`{Q8s_nlY!yy-R+I#qMXe5>(0XSHU~8oe%u#8E}YYA!5bbc zRsY_&Dxs;hY3(h!Bd!U3CubF3{}Oqzdn5|xI5V;~|C%;bFuy5H7-#|gF1e5GCK>xK z4!FHy@+L!X?3lSZAa;qLg=I(X61IH{!!ZyNqY?}a$QY2{H7Gn1Aj-vR(KOo?=uon! ziUx#Tao(_orCMauec8Xko+0j{2^I@xfpitnoUqs&%+pDi9bJaKNp^;n;6JuBPy3Tb zm@dz$+9;_NYISl~CsyNGuf$gJaX3ZE0S*{51-!DwSUBVpo;@zjvCfwc%1#sQ?cq%P zYD+Vh1)odZb7CRFST2v{{jkdB$i(Hmx~0Gx)Y%FQ6rz8|&8#F#LgPgtaf*#A%)keI zTSj}c0QVY^VtTQnSrCbw_nVw;V}hvujkR+{T%l2s<-yYT*DmmP(E8J8ZP~zGy zf7-*A<0^5()-8Tj6lof;|F@C#AKh7F&;t0OJ=HZ9e{H@}IdD2cDIg(<*60ANdb2J)VNc%&Q7HQ*OIU_O zL#Z$!C!vwiu-~=}!|9gS@bVCmUwV``sk-D)GRZNwBRnAve(2Uxmb1+>RjQOhwg`*X zK4N&*lGZ-2snVeJ0d$< ztjN{iH~%+54W`_EQJeOWL8ikL<$G0G#)5qpFsIWj)jylU_C@N6*ze`v)%v98%XM7TRf^83cgN z;lay6PWh{2U!Pd`?ES~NxlYD+kS(dvZ?aV-`ydogF8D&y)%?;$p`~}s{$4@lv8pcE z8pN)>YP^%NYR6w_KLifA+Kll(z$uiJUBV3C3dVBWu1lWgzVq+xPTl;{cVYo_52n;U zu%&UBW+RzepT>VJD7w%bVuXyQawQ{;i_@nz1d{-r(Q9 zNgv_H-*Rt|4V-8`!tjJVu9cp0XrAW>h4%Ceu4pw`p65q}zT9-9+;q1+Z9Q$#JO|YH z9`Al^8_fg)s`o~W?~a`>#I(K&MUK?Z$=TneMjsj9jlKyb#k4#j|CW-CF(m^))*xJa zeFNHqw(rZ8sevWP{-Az_-JlZ;#eK;EwZQ`{2QMjCu?%Tt3F5I=GTNQIFK7l=L06`I z)$@}gEfNW8pMH=@V7`?u<|L?V6qcF#$rVN-oFvPzBNUp)$srsPw+x~Xu(7BkxJK?+ z5%AMX8p}i}4@$E`u+U}$lyw00XmNS0Y=H(#2+4k_X$7r|fs-~~EsoTvr-r;!c(`eT zn!HCiKg%FZG4CLI$;g)ou#(gZ47Nel`{<2%=`hGL*7CDlGICc zZEE)jNX6Re(JrS5iE{0U9s~YvCmjj*nYx6&V1y^%rcox{;^loblLHl#IJBa#-EJKC!iw%I%$@?u?7hs|q}fq_oH!3s0b zv%s)xLY$?!yrQM9p<@CZ^vXl;~d@Q7WbL6UyG7pDz^e6@+A%i z;eTK!B_|m#-JDR2%Z@8kR($71;*iLHFFtYs%;bc()k)&AiiLBV$ZAN#E-NhK=5g%c zFoMC~?}OcEgj-5k)a!|GOC1p^@43cwgG9C@PJd_oZe^G;Hgf*Q)-06|`hsI_kneB^4^@7vt8SRV-r?KL$*y5i80@7gO zIM}Z4*VVwP5$wW~o5eHq!U76+-ladG#6ZOl^Yn%R_GY=s{-M%krLfQ$1(-8VHD%eo zsq|T0l7O0T)h3`FXKzjGa1}}ihOY;vzyTWc10&Q1e1LVVsKTOuRk$U=nC*%YZs7?( z<+Wd=96vfn;ghb{G9+|hxQ;-c&Ko)eGXZWRX-yGXOEk(n)M=o~1UX_a?}QHGdmiW@ zBpJuMrB@zQ`yNiw1Hz0NHrx`#VUTXzei1_+^@FKGsWgCJrcYpFE!uMZeyBV^Jsb=k zpDamV=)O~4O0les50eOW)QO5tt1E#aOmiD6FARJNE(O+1r zFz4Hb(c#comy1k(D%pWcCB)fZ$;~4~RqYAv#|1v=#U-KHw_&w{YbNk#(U4UWMEpby zA?Mb7<9$i1oMbU#>sI69i&+#so&eMMv%fNFZ1Q>L4v#F{t$@&;29EQ&UvE4E(fhQr z?-K;M-0vM>bTFIz__OvVa(yTdk}s5Sp%n8Kv7~{&4Z#xjs-ODr_f+@-uxcAmi3PI! zcCdje6LpoU2nxxxq0-G{^#iw6Ih~m1XlYEGOwSrDI1Z@a3Lz|}cgm|lF%2#8lve7G z_8!{Ieh8Ncjm`R#&mTSZUvQ{1UnD|A$V_W~BDn|AFVCYLG59BX1;V>`4^gLtQmjP& zwgoSxQ}dGGea4q6KB5^RulWMd93lc_+F-uhVvq6_aAV);=*4j@J@fX(4H`ad#tM?Bq_M+%=n#m2elrBosBWM z$=|Ic7*R{+F+3;PS;aWKQS6tHn@-R2nb|)Mbr!lWvgBJ#3(cY-h3cl;Xh9Sp&h8c< zg5sV-o?WqX&D$nUHHHrrGa9GN8ZrTLXGZ}sBgNgBYqRRE^rw{2FLobL-Yh+6Cum`^ z!(~u-MU-yqPqaqujLKrGCc}go70jiLp7o2`c>@8@n-`V#4aXH@U>N`a`&q(D zdBG+>kNMd!>W9^^;nuIPWdyl#T|E3)XHa`8`o?^--1rlTNdy1Hb5upSkO#=Ge7T!9 zERP@1e1TmUM$?*Yqbp^@eLB$EofcJhAJHHgbTAtS#N_waE)>;t-W~kPEEqujR-N1r zk_5yD(-aDm)$T|K2K&Cjgl>SPMM2RJmXvM=q4+-CD5-ncxRdZ}qf&n7ca3GNCgo4M z*y}D6YZV?3!R_1TJz|p&h58HDuj+qpWKOQslpydA;>@+6~|0! zl8J5#^0p^?kWNaSPJ=ECZRS`y3T+tXURrh*BSc-rDDS#|mV;U7DU6`a6vP&%#SftV ztiLJl_2t6!?vmkvEe5u15>nPejC=kxcl{@rgp|2!uQKk%y+cA4BzRu0RXgMIzN6hb zZS0}?4Dv>Az=%s*mI+{M9U(y0Z?UL1J4h*N^V#2~Hyob0?KW>1XhO1rk#>~P<0*vW?GO~9?lZQ)h8}}}f`V90Jfn;~ zQfT@KJb66I?9S}eZ>K>uvC!hX5JQhKXjQzJ)wl_Ph1#YYCkZw@g(!-wac&<4EU47z zBKLjY-xSGuI&)s5+|F^@_M)6L)0|DYh1b!8@64-hbOaTSVQJxdnx-E4;`;_V$h=-M zm@o9;AqfBlB!(8D2-Tdh7CYjFc@=VMr%bcCXGcEDQgC0%kwY)Nv3MDiaJ9SwTIc{3TsP%n1m0P1+R&^{$PlXz6u6_W znw$eW!79c`rT7oWQW$X#&N#%`Wo1rz%*J$>Fy3f`0mem7p)=Z(T3S4DKrObeM2U1v`u*ZK``qH+I43Uu!38g0QweU^%7N{P~<@`RP`u z?&W}Xez<}(I`MEldu^I*tNLo+3A>?uwFBmwx^n`hB36l&X}ho^$K+7v>NR5~r6NTO z4NS_^HXDZ^th4jaU`h`Xo5R5w5%CghdL+3kaKy#YGmL1KCl$;R+g$|b;-M0?M-iVI zD5D++U^m(?Sr+Ty!#rqU_m~hz7r2)uYQ3d@^ zPSdZq>I(Xzo{7hma)TD-E&AwM%H!rX&m1%ZN$P~b@~ny-F!E0XWPj$trEy5=$^?%% z0#*%XP*LM-c7S7-E4?MTjdG@a$$Hld%pC`CI+n92Two_Hkxr5>Ri}WCjMj}D4=Pj$W@94OEA*gRcE zsc>1h7M!dpoPJkINkmQ^Yu5J?2LqIZZzc9c8IyA?rs%%sUW=>#pqlm#7poB6BbsGE z9_5TTd@2}9paxXYmBPo_uh~1F5Ry}6UmodE?=u;Q7rI>L25xsDH9AVeQ-A^5%x^Bf zf(jk-`yFJ48iTeY23)653LT0>jYf|-jB)!;veXvd?AK7%y&2y-C^m;$A6jb7hKXWN z&GEZZ84Z?CNU_1vJ*7G-!@t1(K!iLyT!jdP73v1gwDmDVMAI$4xz>e6~~Y5qD|c*#Y?MwQP6I?yh#xA2KQ5sP+6X@iVk1` z{YTY9#PK;>)6pWl)f^YarnQSLCL!>_x^I-&Pz;TvtM_)_eNTR~Y5~y<`0UuNrmjPa zRd*~RgcRCnEt_`0$-e(8l8{e6iL;Z+~G{7lw{n6j}mGWrxVftSll%^l)9i3DcTtE*zzk(rstrD?n*worZeJTT;NsQ3|wjX|BhIN4}=Tw*EkcBq<;!!iAgT~0sW zJdKwWCqBhk&MWT34&=`eWzpzFcA42}r*hQvSelA@akI-anE)={BPm)($wqno5N z%qe*2+S}oc90oS43g+w)B~xN8)OmXDI^|87>!_8nlQNJ*+{QDk+zF%T5$rYy;0iqW zBF3?qhA>U|A4-?oOzcZ**@6$7Q*{K;=8wTe+X$re;t^)OfBUFifF7&wlIdY2Pm27C zzCU;w&W)+qivW%>@u3XY1-(fK_SV8ioAz}1JISiA122cL}aQMGFYTWw$_^*5)v$UXLFcQ(nuW}A_ymXq!M6+^$?8-{9P zlyAuDl{T>(UTCe|_$9-CSYd@Vv!aCS5+>W(!mztL&;i!-p&W~rVo!8;Bz@Tpl_^2? z;)p}h_IHFrOvZ^@vQ4)Zl1#G3@b+R@gnzbhpPfyhQz8VC!y9iHYM ze;G2P&IF1^hfM3-%;&+zMj5suq+~I@A+GjUVaX@%k`)5Tx*s=(75~}`Y4bpxQAnsB^i6)!EYHK&LUv zKqp`@pLtdt6#EIv4Xmrn7uk!WvnOGL^+xKxa^?`Z%JXQ=nl`(C?IZ)oBXO9@c9LU02{y29|o>!alI<RuaiGBgrMJ_%|sZeX;g@0sA(DS12+^BSIhnNk>Geb$qVKi zZgQ>Yb?g0W$qQDO=6GAlY~y|3sE+D*?s16}H$f4Pq319_8 z`KVAXnJwCf1V3mBdi(}Ox>$`7M2Ysi$wUuxU=E3;iv`Yh&kr09Y}aQOq{iDKhrWD# z(V8A#O#ujeUbdPjd&KE%eu5*2^D`jm;yi<98<3AL3FDWFAm5`*J(F{8@ZWZ#n(p3# z!2bx@HR63oeIWe|w+QF_nf6Q`8n6|3nF!3S7`yURTt|-ak+O_%Aum1V>pjL@g+rPu z?Py__l3f=J(<8l^$KcqbZ0b+Rm&N$1IJJ%OYm%9M@Ob4Ln|UF(+HO@SMnz>S(Tgz` zmAkD)5kHgQAPp=p=11nx7T7NQ$H~=HFhEDK1R{5h{2XW#c!3DDq4HZV5CEvYE*=gx z_jxK2S_mqkTlDjrjIr{ojH&XA(VPbEn-zO4l7L<>34gGMeny-LY8W)43=eFNTkqxS zbskAq^%g)7IsA@J;hpWw6|kh5gKqXT~fsJ;72Es zA#VKBjo4b?Whaf+_RU$!j(wH@x+m+fMe98sgJ#N`8FG#%R}?nFoiV~iuuzyrJ~&tz zB+{7jy9jC1WFTCrcyLAN0g7mzqrZj|F9GyY?{y8nqTgCC@|RxSCjiT4CJfxF<=!e2 z(JJh8dU>(H#9nyMT2#zhGI4oimNcN8*h0(%o%YF6eY27tTG0f3TRj<>Z&|-3PGXzP z15JNIF;s5(zzMeIH~CC!EEXr8_o>=2r$)qX;G_+p2bj8SU-SnH$d zXQ@3^Wj2TELXbg<$-PINfL&6T7WEEl&hzxR%?Qq0PJN%ZvnC2_gDF?;>0V2ge&TZ z50)cvB~d(nc<>z_c-X*YeNH8>DiJ$DFJ**L9U47j5`$3b<6m>EJ_S;jf!|*9giMw0 zO?d2y5w!i2+?-RwYl-XNuFy=qao)t+yd>#k!QA&u-#AP& zA0hJ$d9!v$Dukn#F{``5H`j-rRJ~p^S*Q;eA8%4fBf>SPRsxjXmfzf7_FSK~eWaKg z`eqwihE0Ae;(W(?#EFs;edr0=C_SC`7Lr%Lnb#Z{m5Jm7N%Rm!+l?V#e>GthkWQ{n zvtNM$*clXKVr`U3lcbyHD0yT6|Jir6^($ocY+!f(kqHO>L$dmv!|U47$?G>(=i}p1 zBhXWJOU<627-o#q2-|r_gTrYMll?-AkW$sFd@P9&dC?PhL=qwtYkYKz5W>S$@ar3R zf5sQ>a)JZPfd*KEDP00K%+H`E-ybq4FuHkwu}~evA4z6j%gh+i9iw0sNR7SGHK#=( z2$J2iB#p(WpTkI+2J?=+-91&|8Ntt~bqmBSPSu+XEuv}H{Kh~;Efi?s%PO9!yA}>= zO$8;jc!KopLw{AMeN;^`fb70RkTWCbg%%NsFkI4MIu@ARz{kVSUV3g>L2}SdnI1C& zH|q50xVToeSDtF(*H$|wH2I$WeXv)QbH1lt=G-T%-?NTXl|LSO<~dV`@-Pj`Dh|iX zC0Gi-hybN^JJZNJ2o@_?>-`Gr{iu(Y;odDVdT@H6n^O#B%cjb;W4UB9!&)TQ&yts+ z$5@iD({y(9la+B{^)`HcpU_Rv$ku5AR7#!HjYWZUTp@o;*8EX1b~P_?S5;{C%nJ@& zD^V79>bbPYVFED3bDLzxiEpVJg3x2fewOx}gwU2ypK8)dBJ zr0G{V>A46(h^lp&UIXm9zNe zBlUv}!Eb^gu_f7a#;;YV2Qt9~qTH@pp{$U*Sjki5M zxw2kUJ2sXua1XGbsSDhURJ*1>k<08D5X6{L22V^7Y=s#En8Pc@s+Rfz`9%l``k-Bh zp)^K2muT^H0!9g>sl>ged7NhYD5WW>ui+jW=`xHlshvH>547alY4qUP7G6DK`kF@# zW@Z-NX0U}bD?LS2hzQ>G^7@2&D35k?nEqph?^49=%Sj64`aj(>?5 znR7wzl+;ElzcJN@Ip)gr3fmbm(%?`BqQo%2)XO>Z&J31-2?h9}72Ywj!RVQ4TM`>6 zXg2U^{2=cJJHK4QYI;qTekEB;kt_72?>dJAZ`<*yQZtvwf*@k z7H5~3K&wQJ%WVi@UC#lfevDIfyi==$Q#VVlfmKUGZvnC&(7oXkciE^3Uw2iNG0n!E zA`mJ0Mu2w@kAu|_X81tyy`K&X9nWr-8OORsbC!8Ix7Yu)R*z zF>aZ(f4(CwoZ*+6Y?&_qCT!TAHRF4&wixk9-CgzHZ4-&G4VA#$6~>)!1^}7@d_>%6 zR&zH8DqKk9UI_ZC$U!g>UrAj6CIsJ+W5~S55W4`dOtv7lmc-{BKv&Q-2{!G68w|oc z`Bbrhb03$e#tlyOE7ut^p#}WqmRtH4EyCXQ_8ue7_y)7TZQL+=ZWvXs=qB>mSAaXF zM3h4*5Gorfnjc)(lhW=N_>PuOoP^b{bWuL+V2?zM)mFlwp$~Y8HpmS-82e1O9gqxn z#ta33F+MUnv`0pfT|NMVt(JmJEY*iXfh8a{UOhoYo_#C+Fqi&kO8Af6w4syo`=iq# z457%~6!8SbNDTC6?8vY~(;iSC?g&c=&nIb&N$QbpL7WMxeq}+Zh_6WW+h!)PQ^A-% z1QmySI}n1Pi#IaLQ&eJXQ)0D8DyKf?)}X7vG{ceBUM>!J=*E!_VH`LQ>k(<-x*eP? z8{8=;O~qu02vRU@tJ@+XE2#JoGPjvA^_@Ue{A~M1oMC6Jf>Rmld}@q~n!Hd=N9#li zIfpp1r;9XK%~$yFYn0!GuSsTg8ZofvEOrHx2L^E@UvL(4^UGDMYJEctwiA?iOAQHu z!aV(wf|E(%g^cig`+Q`@?>HL%7IiGVL+! zeiy?S7eg?SE{yai*5$q*+vZ(hKey?22)f`H4{ax+BS>^V2wg_QO<62_XvUrtY4+q0 zaghfGZwy#5Ci|_o9q4IPS4SHdYH`2;#ot?BAiP<> zs+z9tv*~W>25FFxkS>uD1VoS!K}t#x5Rf=@Bh40R5ReAxkS;+&NrfXNEscOu|K{*K z?}Vu+p%+{nJM%^~GmqX4HAySkp6Jdo^L`lxbcJ^9RPg?OKNDyIkp9-?4>G~8 zJkoICnNS{QTSZGQPGqztR32Bw8`pNMu87tTaKRfn%!%X1h(E!k)R?07W{t;ei1r-X z6xm!9WvmuGpggQ`4fABUnR!Dv6W(7E{@HU*&)z!1xNS@6muO(VOn>T7KlXM2r z)ACahO9{@V%`DFOe8xkRxM<+!9fVSAQqCuJ=br%)y9?Im+w*CERQ(Q!Zot1|g1x8R z4^n%#zvd=cftvySkyd<9_=N0y$mJR(O@8GTR1K|n8m;AzOfMUkj?6tZX&5O*jr9m; z9m%ekG9^-dLRk0vbav5G%TTN6H}Lx7)G$7SBE<>+{oOnKDDHSHzCBsN=K#tHkrJRO zpCA*YaE52po)KhtgzLx-r-Eeg1@J>so@mg7enSq z&*;4dWqjd#gp0i;ZL!vY;*niX;oFQavu8|If@bF49(s;GXBR)utCPR!{k*De06~8}PZ+M-q@b+@LNNc*^v-l{&wz+zL`Bszll*!{?T6bK0F9q{nsTC3GCcs_FYNFsNG z5)I)%bd&sPePJ;w{^WDGYja$DUhjaNclw0NM$^gc45RA|v&Bpn<~e=v<495ebF3#v zTDXZ%?sD}oC*Dxy>UneDlIDJ1_q&9EC5!{q$a`PaDiARs{`>x@ITgn64-yjn>I8B3 zT6t-c97?JaCB1dcl_ zplL-;F7H#adwsdCaa0LNJ(ks+$eI~9rStU6AJ*NB4bxVvhEW-Z<}|RI6JwUK`6t*3C5eksv8t-GN$%MIb)HS=UtRMG?-{4jx`(S`8*2QM-CPXky zPMcX`%`i1Atf@kD0&k24qBfst+~Sv<2pON8ER*TU8ei}wO&Em#t$(=UU>Ds z)M6Rl9V_>21g4p*gEX!U7(d|g9y;T8^T(w57S~BKN&JQUHNfz3^1i?`rIleH{!Ky) zg_+K;*0(j1=1%~2@&fG<-2)aGls(-Sqrd2^DJvTs;e{G`ER@b&oo`4v@@rt%!oosVLrzt9y)Kj_rJ& z{1tv6yf?r+)WWfRee{#J)SaaX;FH)+C3m()MR#`RR|#&jRm)V6Y9}V-xatBs7w?&~Q_k}%DblLj3l z#i}Wzz2D!e=`plDv+r;Fi?|2dbxP{x(tt8&QH*c`8 z*5cF={yU}sE2-q2UGcp6$TiWF64vrt;UNP$Bwtakhb3}z+U0(U9^*KD_#v)uoO`wS z;l~(*8vJW3xcYQ~=Ru!v12q=uSM_wbZ#R|In>TiI-gr9PzGvP>=C*uQ z&1mnd)aAz1*>0?-Iio4PKMN?h9-y^m;ZSx&&{;c6iI?ib)5+iLwZK(&Q)~$DR`>?^ z-5f0!52aRc(#+va8+krMa5<06%0mM;8#%7e1oyjD`}jlkf)(BiqG%_^lFvS6+wR=- zqe-D(f;-%CYpskmV?beuYVC2sot_Fn+igsgGUuUCQM@y#EuZZ^5Asu`% z=ha!dNOwBAwY@JoFM{vmVfWGYC#tG74UQba8sJ%XWbB@_@`yZc@LowWd0fuWCyttm z$!F1wo;iiKvXtzVi6$0Gxarrc)^Pnf6G{C$Oy-c@G-C~!wI{810!c$uIiE*T4(WtG zNl8>CMQXU^COq#fMS1t5@Bunjh7*9D>o*pTXRe?Bs3Pm4g8sKHLO@(R$es-s=tK za_7O@b_)$%M4R!O<9_qhyjyaOSquychnY`k;2Sct29a5ZiXMxv1MNj?UdP>u{wN9S zpJE9l=2TtI!tvL67=mIDjq>er7W-E+)%PB!EDyE2Ek3d%T1an7k57|E=U6B+e~z>L z@;qHmts#*doE98&t1D*xm?mn$5=W*K$Gn0jnngNo#?;?H9Tl7C5O?v%oJozobY#{E z{wJ;c{CZB9v4x8ui3<)%6`e&@j-DX(OjIP>b{Gb4{_6>nMcs)XpDR*IpS&(crU&Afa4Lu^u!GCLC_(&Y+fU z1$PQ~&PEwBU8|gU)|J>r@9r$R-}cS0kr$zfz+R+lxMsF6B__x8srInF%!ky|jj*W_ zx9MmbVLa&pJb2`X+Go36wVPMZKF*LI_pq4!x;SC?&ex`U1c#MB zAM*I|e8%>bo@QxVmqw9JEXj{X_0@Rpp(XDhQ~kp{)h6!P%%A1q^q#Wxh$}06=Jpz) zTR!o=gfHSw^p+cq)ERb84`D+T{qjEAiY5Z(4<+FJ1)q`qMi^j*xfo1V9;UM0CVj+D z?ln!g5K~5_1e5k737)rePZOq zYM%|?woN&5y|SZjium18SN=zaXiBF2kGFhz3-kugHa}VGv~!Mm@jW_8E;UVlK^ROj z^zwUj|Iu%}qAbD~uZ2PjI>G_W+71su8RJ6yv6jFWz(VS-fK^iBxV5(c=9;m9NNUV`a$D3rP>mm1l#sJM=)s|0Vkg7pG2{73)A&N z&3nI2cd%hrj^-WB_?RNJB-XEluJIRem)=@a8hT3BT3-@!FndM6fbKquZN z>4lFF`w_b?6|x%GY@VRG%277HAL`_1kl0O5C8|xs_E*Y{?ysU!olJ>-xE7iXXmKsHVqUxyx?<` z&36BGzdN(O6zoh*Faah3rspw^3@_F#d&Sf&8&@iwwgE4WCwhe4DN_6WGiUZA(L?$i)6m^U)%e9{Eqe1=wjukJ-Uq#Cp%OBhq7Fe#{jIIB!~rj-+t*>qS_TF<8bZKHeY z-kXiN-g=^?bE$YDEV`=CtE+A+KwnXkfo8LFc$T2T`UZ;{hRH=H=(6uW?StfRn4xU^ zS3RgR{!$nRObP*{q1yD=nN*idI%Ps+wWjJRt}^Z@rtsTDShlvGJihxgNfXK2TNpt=RH03yW5f!|q^PoXrEg>bFzQB*MA8m3BpW-uH#M z42WVeW_xbwCvm{VM3Rz}lS>mem^LD_QVf8U2k1l-=J{g}g)QDKnR8izF3!8J!X3z} zzVL-nhd+2&>)M~d(WyjodpAidxy_j+vhwBEarF|`5f3{&JyBSqfIvQewb8gQ+?Jdv zmyOr<%dj?jwRygnB4SvzAiRX8fOw-A|JbanxosH(kGT=Y|eUUB2002~qnw%!Qr5q|Z-KF*EBiQIAY--l#a<7(j8{UG=fC5qUBZAbUC_;N+j)a=)=Z~hh1?HiiTv= zZzarMKFrcv(M^7&v*P+vAxm_XH|Wpg;fn^{tXitasUdFGGA-VESx*uc#yoKfZuWJ& zmRGo$J$zgR*U7^@*<>bUP#!%rX^_uO;+mTadm81*vhz$zxoY9ux*3h@6<(6+8m%C$ zcmYi&soc}>Z~Hra18oi%)up>%n{+$7Uhjjc3SN47gGno)p$0rQY=wEaB~I0z#B`wR z8n;>9-Latb#&8vimz!K=Q)xcqI05YTB{zT6f!404@Y1-IrNqV^E{^s33_Y*tGE>pB z>kR}mIbsw7aHYCHfwCML0hVR6XF_LMV`d2U!LE9TE@#zLLdTK_j}(auF5L`RRl&wMo&hObU~@ z;_Ipq0o=3OT5IA+@&(mO%@1bu_%;um>k2Je?l&nRoo*dy$s6p?Di`e*|W%1bry>V)q!pdzRKCSj2w88w6+rjLt7!#JhHz8(V+mutfBUeVd zRMFpJ{Ql!-H8PwiXL-J`^WH^GYxc4ZotEIr54;E&?aE1lC>GNYcdDPb;b{y{br~{# z4qQKuQP9vH2H*OSO>8K)JG`|Z45XFK+U%NtatcR4>K^s9eo~2 z*H;|&sR-jyy#>{q{0FHK=NdSgGFmB$W94NELHrw()3pmv%Kd`1oDQ?&30Vy9z;4a6 zjBMc&lD!@x!lQkVUvaJ7OX^Q9f^*;%kp9dla}3@Sw>kKyow=j{;{&xIF@mr|>oILU z0X1qqY5FI}k7VLLkH`yyN|Z9iO^ zsb=Xd{Um*eG7fa|epT|r*|=mVWNwf6$jjw+20Qe_Ym#ZvbN&3jbi1lu4((&-aj#wYjQ> zxH>Ujl;t*f>qEVWJ!;2Cn1eK}9=5krLr%niv$^H@RM)L=`_`u)WW5Qd*)~J4OaiBf zsZGfGw?g^O=_&{)ZhmeYK9DkU-O3T*oArbfQ_S3HZZw_RZ8YW9fA{FRdVN<4QPoEevFE#(Cu0*?i0z* zYqcySr!*HI;{xSrPBEA;*e|00sY1cJR{+CBwF!QE1#luSFron-vpZbiqxz@5tJlO?e70OxI{TeG~VYD~`8nT6J zK^c}O%^oc9b1xsDt|zfo{;>+t1Grt}SYVF(sru`pYb-wZlh8Qm zETl5>*ihvAVuQU~>0!ObMg&Xo0b;87iw7J;E1Qj_-RbL4L)ag0ejZJ&4V}oD5u*~v zHck4K$A>j>u6f)R8U2){nHu-|FDBVt3AP2#ZHlQ+$XIY07D^S8tDE)o??)CtQI=0KH=*Lk3MzgG@2LSO zII#be?_ha4AcRcQQaT`lykN)xB#;-z832g9ILrXlkrzstfDY)L1yF;PnE+S31Re!= znh6krD-eVti3>Vq16&|qHXw(hKy-0)o8zyhuDmI5{4Gcb%V&xgsN@2F<^WtM8_4VU z+ZJSC&s&Jw@-4)D#C+ipf6tNzO!Wlu@K8@W*UD|Y1lk_`zc zo)3lR=R!_-97yoY79aeR`){~vK4dB9ge*Mq+pc(EdOkpQNi0_YSxyBnEEfv&w3jGJ zA%xn9AW?%tNYWa=7y=qakpxqPMBsWG)ZXL;h$9JsA|O`@z>g9r1zpR6sgOoJI9>`F z@5vx3Aenl)OJbV$7d*1@ZHK&|`Fr5nC8|&fp+yQ{TP45`Mniw0yjQ%qQMxos)j(!D zC1m60X9VD67R0|;3xRyfNPbAip6b$dyB1lN z)JA|F+-`(idyOv;K~TC08an+42oZmb48G912c13uLVyO?mIH8u!yf<{lQ5Gi|zg$sma@d?0}7r8pVKs{ZMC?t_j!gH}W$zcDH z_LRG!VLA63TD2pPV8X2{E2iwl1-k&)U;wEvYP14)jF5=F+}|RhqF4M0Judx=S^=^P zy?rpc1)xE32)slQEdV*=g-qsq)pi&P)Yv!Z0g=2yFcOSR0i-NSf1$1kPUk`KG7%Rb zw0f>xEH*qO#coUtfE)=TE`IVH9+JKVTK<QjDaCC<3UEBma08NO6NaqoKY0s;5F3(sTP?&*;_Ymk%J%*#DCwhWB7>F`$6# zQc(%irO7H}=za-s4GH3vLLfl{vY#dmxZvZ`e=_;(!r<48^oGP%FGnR^2G9U5;7%#P z8_(a31xAc+? z`V4_L!G>~x6q$oGwjmW?C>#Y!_|+U>k3gP6U=Ji>i}d_0-(MF9<)9tP)|E{ZwmA-Y zDj@gte;=ERwK;sz-rQHnCK5k1N(K(({WBJ?_mDvaf!t}j-vgA$Jk4Ez{tFji{EZc? z|HFn;1=%H6AUj`t(H0?+4cV{LOdnrss9z$`+}ypgWSZ9??_1!*2V=G zPxFiPzZ6e6hos7&2OJ$*u2NShe77NQng4eEb2UWqW*0eWkd!O~vIhr=!b5dX4|uTt zcYlaGM0!FJvoy#aVAn$76@QT6EGj_$-)Y2}9!ji+=Aj*$Mwu&Jh(ATTx7GqoNDh@c zh@%<+fjU44JSBy8F=)rXT>4>%Q2i)q4AGFxl)@DfEc6Ti8=yJ`)F`w`<1t)3ZTnuu zKU<-WA3{?qa>XAbsSesp9qa#@oQQg;O)mTk4j#~!0s8Ekt^a2-85{l6ZNnOGWAkinzEY!3S>aj1u8^yi9#~C*dW1&e*zvgLnc~A zkhmH8&rb@P0cvFC?*y~DkQ6m`+s(&zqLWH=5>$vGVEXZT^dG6LPzdzS-`7XU#tMqKOV>a>fUz|^|wfv z(v`tri(Evpfm4|PAF_eJ<$L6>xcZ1+x@u+tTu9fyk4$f0an+MSy2canF(F6%|0|Lh zuSETEx`?7d9v|Qz1{uAf4_1awsFhN;|JX=Dk4|Vpp*s7@K16?|pD*0Oolbxe?79ekkG#=C z(f7Or83F*D|1-;fpHuQ(;qvpj3~TKIXps-j-v@c(S6t=6?M{FRd7g>;*Lf!RISblw zFHZXYetCdSvj6(!;`dK0Ay5U#-wiGNi#G|GZh(fuJPd$6dv0~(f6Hbk$cPdg2EOVB zXp!C}7r^^4P^$-e5E1`!{JcQtkSOhyVMFgDa(~z5{C{-^2BQkU;JHbL4(+Tkm<{y% OD^xIBL_j+w?Ee8=0>=UX delta 31843 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 diff --git a/js/js.translator/lib/src/dart-ast-src.jar b/js/js.translator/lib/src/dart-ast-src.jar index b03781e1fbc9a3d59bcb871ba8b7f479dc6a2817..7830e0022c67798034e186b1908b83a8e1913388 100644 GIT binary patch delta 15026 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 delta 17476 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 Juz*+W{{xM8)qwy2 diff --git a/js/js.translator/src/org/jetbrains/js/compiler/JsSourceGenerationVisitor.java b/js/js.translator/src/org/jetbrains/js/compiler/JsSourceGenerationVisitor.java new file mode 100644 index 00000000000..023414ed69d --- /dev/null +++ b/js/js.translator/src/org/jetbrains/js/compiler/JsSourceGenerationVisitor.java @@ -0,0 +1,93 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.js.compiler; + +import com.google.dart.compiler.backend.js.JsToStringGenerationVisitor; +import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.util.TextOutput; +import org.jetbrains.annotations.Nullable; + +public class JsSourceGenerationVisitor extends JsToStringGenerationVisitor implements TextOutput.OutListener { + @Nullable + private final SourceMapBuilder sourceMapBuilder; + + private Object pendingSourceInfo; + + public JsSourceGenerationVisitor(TextOutput out, @Nullable SourceMapBuilder sourceMapBuilder) { + super(out); + this.sourceMapBuilder = sourceMapBuilder; + out.setOutListener(this); + } + + @Override + public boolean visit(JsProgram program, JsContext ctx) { + return true; + } + + @Override + public boolean visit(JsProgramFragment x, JsContext ctx) { + // Descend naturally. + return true; + } + + @Override + public boolean visit(JsBlock x, JsContext ctx) { + printJsBlock(x, false, true); + return false; + } + + @Override + public void newLined() { + if (sourceMapBuilder != null) { + sourceMapBuilder.newLine(); + } + } + + @Override + public void indentedAfterNewLine() { + if (pendingSourceInfo != null) { + assert sourceMapBuilder != null; + sourceMapBuilder.processSourceInfo(pendingSourceInfo); + pendingSourceInfo = null; + } + } + + @Override + protected void doTraverse(JsVisitable node, JsContext context) { + if (sourceMapBuilder != null) { + Object sourceInfo = node.getSourceInfo(); + if (sourceInfo != null) { + assert pendingSourceInfo == null; + if (p.isJustNewlined()) { + pendingSourceInfo = sourceInfo; + } + else { + sourceMapBuilder.processSourceInfo(sourceInfo); + } + } + } + super.doTraverse(node, context); + } + + @Override + public void endVisit(JsProgram x, JsContext context) { + super.endVisit(x, context); + if (sourceMapBuilder != null) { + sourceMapBuilder.addLink(); + } + } +} diff --git a/js/js.translator/src/org/jetbrains/js/compiler/sourcemap/SourceMap3Builder.java b/js/js.translator/src/org/jetbrains/js/compiler/sourcemap/SourceMap3Builder.java new file mode 100644 index 00000000000..b8551da2862 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/js/compiler/sourcemap/SourceMap3Builder.java @@ -0,0 +1,168 @@ +package org.jetbrains.js.compiler.sourcemap; + +import com.google.dart.compiler.common.SourceInfo; +import com.google.dart.compiler.util.TextOutput; +import com.intellij.util.PairConsumer; +import gnu.trove.TObjectIntHashMap; +import org.jetbrains.js.compiler.SourceMapBuilder; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class SourceMap3Builder implements SourceMapBuilder { + private final StringBuilder out = new StringBuilder(8192); + private final File generatedFile; + private final TextOutput textOutput; + private final PairConsumer sourceInfoConsumer; + + private String lastSource; + private int lastSourceIndex; + + private final TObjectIntHashMap sources = new TObjectIntHashMap() { + @Override + public int get(String key) { + int index = index(key); + return index < 0 ? -1 : _values[index]; + } + }; + + private final List orderedSources = new ArrayList(); + + private int previousGeneratedColumn = -1; + private int previousSourceIndex; + private int previousSourceLine; + private int previousSourceColumn; + + public SourceMap3Builder(File generatedFile, TextOutput textOutput, PairConsumer sourceInfoConsumer) { + this.generatedFile = generatedFile; + this.textOutput = textOutput; + this.sourceInfoConsumer = sourceInfoConsumer; + } + + @Override + public File getOutFile() { + return new File(generatedFile.getParentFile(), generatedFile.getName() + ".map"); + } + + @Override + public String build() { + StringBuilder sb = new StringBuilder(out.length() + (128 * orderedSources.size())); + sb.append("{\"version\":3,\"file\":\"").append(generatedFile.getName()).append('"').append(','); + appendSources(sb); + sb.append(",\"names\":["); + sb.append("],\"mappings\":\""); + sb.append(out); + sb.append("\"}"); + return sb.toString(); + } + + private void appendSources(StringBuilder sb) { + boolean isNotFirst = false; + sb.append('"').append("sources").append("\":["); + for (String source : orderedSources) { + if (isNotFirst) { + sb.append(','); + } + else { + isNotFirst = true; + } + sb.append('"').append("file://").append(source).append('"'); + } + sb.append(']'); + } + + @Override + public void newLine() { + out.append(';'); + previousGeneratedColumn = -1; + } + + @Override + public void processSourceInfo(Object sourceInfo) { + if (sourceInfo instanceof SourceInfo) { + throw new UnsupportedOperationException("SourceInfo is not yet supported"); + } + sourceInfoConsumer.consume(this, sourceInfo); + } + + private int getSourceIndex(String source) { + if (source.equals(lastSource)) { + return lastSourceIndex; + } + + int sourceIndex = sources.get(source); + if (sourceIndex == -1) { + sourceIndex = orderedSources.size(); + sources.put(source, sourceIndex); + orderedSources.add(source); + } + + lastSource = source; + lastSourceIndex = sourceIndex; + + return sourceIndex; + } + + @Override + public void addMapping(String source, int sourceLine, int sourceColumn) { + if (previousGeneratedColumn == -1) { + previousGeneratedColumn = 0; + } + else { + out.append(','); + } + + Base64VLQ.encode(out, textOutput.getColumn() - previousGeneratedColumn); + previousGeneratedColumn = textOutput.getColumn(); + int sourceIndex = getSourceIndex(source); + Base64VLQ.encode(out, sourceIndex - previousSourceIndex); + previousSourceIndex = sourceIndex; + + Base64VLQ.encode(out, sourceLine - previousSourceLine); + previousSourceLine = sourceLine; + + Base64VLQ.encode(out, sourceColumn - previousSourceColumn); + previousSourceColumn = sourceColumn; + } + + @Override + public void addLink() { + textOutput.print("\n//@ sourceMappingURL=file://"); + textOutput.print(getOutFile().getAbsolutePath()); + } + + private static final class Base64VLQ { + // A Base64 VLQ digit can represent 5 bits, so it is base-32. + private static final int VLQ_BASE_SHIFT = 5; + private static final int VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // A mask of bits for a VLQ digit (11111), 31 decimal. + private static final int VLQ_BASE_MASK = VLQ_BASE - 1; + + // The continuation bit is the 6th bit. + private static final int VLQ_CONTINUATION_BIT = VLQ_BASE; + + private static final char[] BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); + + private Base64VLQ() { + } + + private static int toVLQSigned(int value) { + return value < 0 ? ((-value) << 1) + 1 : value << 1; + } + + public static void encode(StringBuilder out, int value) { + value = toVLQSigned(value); + do { + int digit = value & VLQ_BASE_MASK; + value >>>= VLQ_BASE_SHIFT; + if (value > 0) { + digit |= VLQ_CONTINUATION_BIT; + } + out.append(BASE64_MAP[digit]); + } + while (value > 0); + } + } +} diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java index f6e0c1a7296..83511204a89 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -16,7 +16,6 @@ package org.jetbrains.k2js.facade; -import com.google.dart.compiler.backend.js.JsSourceGenerationVisitor; import com.google.dart.compiler.backend.js.ast.JsProgram; import com.google.dart.compiler.util.TextOutputImpl; import com.intellij.openapi.project.Project; @@ -25,7 +24,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.js.compiler.JsSourceGenerationVisitor; import org.jetbrains.js.compiler.SourceMapBuilder; +import org.jetbrains.js.compiler.sourcemap.SourceMap3Builder; import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS; import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.facade.exceptions.TranslationException; @@ -54,7 +55,7 @@ public final class K2JSTranslator { K2JSTranslator translator = new K2JSTranslator(config); File outFile = new File(outputPath); TextOutputImpl output = new TextOutputImpl(); - SourceMapBuilder sourceMapBuilder = config.isSourcemap() ? new SourceMapBuilder(outFile, output, new SourceMapBuilderConsumer()) : null; + SourceMapBuilder sourceMapBuilder = config.isSourcemap() ? new SourceMap3Builder(outFile, output, new SourceMapBuilderConsumer()) : null; String programCode = translator.generateProgramCode(files, mainCall, output, sourceMapBuilder); FileUtil.writeToFile(outFile, programCode); if (sourceMapBuilder != null) { diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/SourceMapBuilderConsumer.java b/js/js.translator/src/org/jetbrains/k2js/facade/SourceMapBuilderConsumer.java index 00b5d4f1c80..90db9c0a6ab 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/SourceMapBuilderConsumer.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/SourceMapBuilderConsumer.java @@ -36,6 +36,6 @@ class SourceMapBuilderConsumer implements PairConsumer assert document != null; int line = document.getLineNumber(offset); int column = offset - document.getLineStartOffset(line); - builder.addMapping(file.getViewProvider().getVirtualFile().getUrl(), line, column); + builder.addMapping(file.getViewProvider().getVirtualFile().getPath(), line, column); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 1aa9f437b49..14b092ae0d2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -112,7 +112,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { jsBlock.getStatements().add(convertToStatement(jsNode)); } } - return jsBlock; + return source(jsBlock, jetBlock); } @Override @@ -120,10 +120,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { public JsNode visitReturnExpression(@NotNull JetReturnExpression jetReturnExpression, @NotNull TranslationContext context) { JetExpression returnedExpression = jetReturnExpression.getReturnedExpression(); - if (returnedExpression != null) { - return new JsReturn(translateAsExpression(returnedExpression, context)); - } - return new JsReturn(); + return source(new JsReturn(returnedExpression != null ? translateAsExpression(returnedExpression, context) : null), jetReturnExpression); } @Override @@ -158,14 +155,14 @@ public final class ExpressionVisitor extends TranslatorVisitor { context.aliasingContext().registerAlias(descriptor, alias); } - return newVar(name, initializer); + return source(newVar(name, initializer), expression); } @Override @NotNull public JsNode visitCallExpression(@NotNull JetCallExpression expression, @NotNull TranslationContext context) { - return CallExpressionTranslator.translate(expression, null, CallType.NORMAL, context); + return source(CallExpressionTranslator.translate(expression, null, CallType.NORMAL, context), expression); } @Override @@ -181,10 +178,11 @@ public final class ExpressionVisitor extends TranslatorVisitor { boolean isKotlinStatement = BindingUtils.isStatement(context.bindingContext(), expression); boolean canBeJsExpression = thenNode instanceof JsExpression && elseNode instanceof JsExpression; if (!isKotlinStatement && canBeJsExpression) { - return new JsConditional(testExpression, convertToExpression(thenNode), convertToExpression(elseNode)); + return source(new JsConditional(testExpression, convertToExpression(thenNode), convertToExpression(elseNode)), expression); } else { JsIf ifStatement = new JsIf(testExpression, convertToStatement(thenNode), elseNode == null ? null : convertToStatement(elseNode)); + source(ifStatement, expression); if (isKotlinStatement) { return ifStatement; } @@ -198,12 +196,11 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Override @NotNull - public JsNode visitSimpleNameExpression(@NotNull JetSimpleNameExpression expression, + public JsExpression visitSimpleNameExpression(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { return ReferenceTranslator.translateSimpleName(expression, context); } - @NotNull private JsStatement translateNullableExpressionAsNotNullStatement(@Nullable JetExpression nullableExpression, @NotNull TranslationContext context) { @@ -245,7 +242,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { private JsNode createWhile(@NotNull JsWhile result, @NotNull JetWhileExpressionBase expression, @NotNull TranslationContext context) { result.setCondition(translateConditionExpression(expression.getCondition(), context)); result.setBody(translateNullableExpressionAsNotNullStatement(expression.getBody(), context)); - return result; + return source(result, expression); } @Override @@ -256,7 +253,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { if (stringLiteral != null) { return stringLiteral; } - return resolveAsTemplate(expression, context); + return source(resolveAsTemplate(expression, context), expression); } @NotNull @@ -316,10 +313,9 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Nullable public JsNode visitWhenExpression(@NotNull JetWhenExpression expression, @NotNull TranslationContext context) { - return Translation.translateWhenExpression(expression, context); + return WhenTranslator.translate(expression, context); } - @Override @NotNull public JsNode visitBinaryWithTypeRHSExpression(@NotNull JetBinaryExpressionWithTypeRHS expression, @@ -367,7 +363,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { JsExpression alias = context.literalFunctionTranslator().translate(expression, descriptor, context); JsName name = context.scope().declareFreshName(descriptor.getName().asString()); context.aliasingContext().registerAlias(descriptor, name.makeRef()); - return new JsVars(new JsVars.JsVar(name, alias)); + return source(new JsVars(new JsVars.JsVar(name, alias)), expression); } @Override @@ -406,7 +402,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull TranslationContext context) { JetExpression thrownExpression = expression.getThrownExpression(); assert thrownExpression != null : "Thrown expression must not be null"; - return new JsThrow(translateAsExpression(thrownExpression, context)); + return source(new JsThrow(translateAsExpression(thrownExpression, context)), expression); } @Override @@ -424,6 +420,6 @@ public final class ExpressionVisitor extends TranslatorVisitor { DeclarationDescriptor descriptor = getDescriptorForElement(context.bindingContext(), objectDeclarationName); JsName propertyName = context.getNameForDescriptor(descriptor); JsExpression value = ClassTranslator.generateClassCreation(expression, context); - return newVar(propertyName, value); + return source(newVar(propertyName, value), expression); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index 24c1fd12459..f91b894306d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -20,7 +20,10 @@ import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.JetDeclarationWithBody; +import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.facade.MainCallParameters; @@ -35,7 +38,6 @@ import org.jetbrains.k2js.translate.declaration.NamespaceDeclarationTranslator; import org.jetbrains.k2js.translate.expression.ExpressionVisitor; import org.jetbrains.k2js.translate.expression.FunctionTranslator; import org.jetbrains.k2js.translate.expression.PatternTranslator; -import org.jetbrains.k2js.translate.expression.WhenTranslator; import org.jetbrains.k2js.translate.reference.CallBuilder; import org.jetbrains.k2js.translate.test.JSTestGenerator; import org.jetbrains.k2js.translate.test.JSTester; @@ -88,9 +90,7 @@ public final class Translation { //NOTE: use with care @NotNull public static JsNode doTranslateExpression(JetExpression expression, TranslationContext context) { - JsNode jsNode = expression.accept(new ExpressionVisitor(), context); - jsNode.setSourceInfo(expression); - return jsNode; + return expression.accept(new ExpressionVisitor(), context); } @NotNull @@ -105,12 +105,6 @@ public final class Translation { return convertToStatement(translateExpression(expression, context)); } - @Nullable - public static JsNode translateWhenExpression(@NotNull JetWhenExpression expression, - @NotNull TranslationContext context) { - return WhenTranslator.translate(expression, context); - } - @NotNull public static JsProgram generateAst(@NotNull BindingContext bindingContext, @NotNull Collection files, @NotNull MainCallParameters mainCallParameters, diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java index c240882a5db..a8a5130d51b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java @@ -37,6 +37,7 @@ import static org.jetbrains.k2js.translate.operation.CompareToTranslator.isCompa import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.BindingUtils.getResolvedCall; import static org.jetbrains.k2js.translate.utils.JsAstUtils.not; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.source; import static org.jetbrains.k2js.translate.utils.PsiUtils.*; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateLeftExpression; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression; @@ -47,13 +48,15 @@ public final class BinaryOperationTranslator extends AbstractTranslator { @NotNull public static JsExpression translate(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { - return (new BinaryOperationTranslator(expression, context).translate()); + JsExpression jsExpression = new BinaryOperationTranslator(expression, context).translate(); + return source(jsExpression, expression); } @NotNull /*package*/ static JsExpression translateAsOverloadedCall(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { - return (new BinaryOperationTranslator(expression, context)).translateAsOverloadedBinaryOperation(); + JsExpression jsExpression = (new BinaryOperationTranslator(expression, context)).translateAsOverloadedBinaryOperation(); + return source(jsExpression, expression); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index e5b1d2808bd..7adb73e25e4 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -79,7 +79,7 @@ public final class CallTranslator extends AbstractTranslator { } @NotNull - /*package*/ JsExpression translate() { + /*package*/ JsExpression translate() { JsExpression result = intrinsicInvocation(); if (result != null) { return result; diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java index bfb7a2e40c3..349144b9fba 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.Modality; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; +import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.k2js.translate.context.TranslationContext; import java.util.Arrays; @@ -296,4 +297,11 @@ public final class JsAstUtils { public static JsObjectLiteral wrapValue(@NotNull JsExpression label, @NotNull JsExpression value) { return new JsObjectLiteral(Collections.singletonList(new JsPropertyInitializer(label, value))); } + + @NotNull + public static T source(@NotNull T jsNode, @NotNull JetElement ktElement) { + jsNode.setSourceInfo(ktElement); + return jsNode; + } + }