From 8e3daedee2be080e2a757a3efd15eb8de9f30bb4 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 12 Jan 2022 14:20:32 +0300 Subject: [PATCH 01/74] Migrate project to gradle --- .gitignore | 7 +- build.gradle.kts | 30 +++ gradle.properties | 6 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 +++++++++++++++++++++++ gradlew.bat | 89 +++++++++ pom.xml | 190 ------------------ settings.gradle.kts | 12 ++ 9 files changed, 382 insertions(+), 191 deletions(-) create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore index 5231862..f470c1d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ -.idea +**/.idea/* *.iml +.gradle +.gradletasknamecache +build +out target +local.properties diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..1405f00 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,30 @@ +plugins { + kotlin("jvm") + `java-gradle-plugin` + `maven-publish` +} + +repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation("com.google.protobuf:protobuf-java:2.6.1") + implementation("org.jetbrains.kotlin:kotlin-stdlib:1.6.10") + implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0") + testImplementation("org.jetbrains.kotlin:kotlin-test-junit:1.6.10") + testImplementation("junit:junit:4.12") +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +publishing { + publications.create("maven") { + from(components["java"]) + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..81723f8 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +version=0.1.0-SNAPSHOT +group=org.jetbrains.kotlinx + +kotlin_version=1.6.10 +kotlinx_metadata_version=0.3.0 +pluginPublishVersion=0.10.1 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 zcma&NbC71ylI~qywr$(CZQJHswz}-9F59+k+g;UV+cs{`J?GrGXYR~=-ydruB3JCa zB64N^cILAcWk5iofq)<(fq;O7{th4@;QxID0)qN`mJ?GIqLY#rX8-|G{5M0pdVW5^ zzXk$-2kQTAC?_N@B`&6-N-rmVFE=$QD?>*=4<|!MJu@}isLc4AW#{m2if&A5T5g&~ ziuMQeS*U5sL6J698wOd)K@oK@1{peP5&Esut<#VH^u)gp`9H4)`uE!2$>RTctN+^u z=ASkePDZA-X8)rp%D;p*~P?*a_=*Kwc<^>QSH|^<0>o37lt^+Mj1;4YvJ(JR-Y+?%Nu}JAYj5 z_Qc5%Ao#F?q32i?ZaN2OSNhWL;2oDEw_({7ZbgUjna!Fqn3NzLM@-EWFPZVmc>(fZ z0&bF-Ch#p9C{YJT9Rcr3+Y_uR^At1^BxZ#eo>$PLJF3=;t_$2|t+_6gg5(j{TmjYU zK12c&lE?Eh+2u2&6Gf*IdKS&6?rYbSEKBN!rv{YCm|Rt=UlPcW9j`0o6{66#y5t9C zruFA2iKd=H%jHf%ypOkxLnO8#H}#Zt{8p!oi6)7#NqoF({t6|J^?1e*oxqng9Q2Cc zg%5Vu!em)}Yuj?kaP!D?b?(C*w!1;>R=j90+RTkyEXz+9CufZ$C^umX^+4|JYaO<5 zmIM3#dv`DGM;@F6;(t!WngZSYzHx?9&$xEF70D1BvfVj<%+b#)vz)2iLCrTeYzUcL z(OBnNoG6Le%M+@2oo)&jdOg=iCszzv59e zDRCeaX8l1hC=8LbBt|k5?CXgep=3r9BXx1uR8!p%Z|0+4Xro=xi0G!e{c4U~1j6!) zH6adq0}#l{%*1U(Cb%4AJ}VLWKBPi0MoKFaQH6x?^hQ!6em@993xdtS%_dmevzeNl z(o?YlOI=jl(`L9^ z0O+H9k$_@`6L13eTT8ci-V0ljDMD|0ifUw|Q-Hep$xYj0hTO@0%IS^TD4b4n6EKDG z??uM;MEx`s98KYN(K0>c!C3HZdZ{+_53DO%9k5W%pr6yJusQAv_;IA}925Y%;+!tY z%2k!YQmLLOr{rF~!s<3-WEUs)`ix_mSU|cNRBIWxOox_Yb7Z=~Q45ZNe*u|m^|)d* zog=i>`=bTe!|;8F+#H>EjIMcgWcG2ORD`w0WD;YZAy5#s{65~qfI6o$+Ty&-hyMyJ z3Ra~t>R!p=5ZpxA;QkDAoPi4sYOP6>LT+}{xp}tk+<0k^CKCFdNYG(Es>p0gqD)jP zWOeX5G;9(m@?GOG7g;e74i_|SmE?`B2i;sLYwRWKLy0RLW!Hx`=!LH3&k=FuCsM=9M4|GqzA)anEHfxkB z?2iK-u(DC_T1};KaUT@3nP~LEcENT^UgPvp!QC@Dw&PVAhaEYrPey{nkcn(ro|r7XUz z%#(=$7D8uP_uU-oPHhd>>^adbCSQetgSG`e$U|7mr!`|bU0aHl_cmL)na-5x1#OsVE#m*+k84Y^+UMeSAa zbrVZHU=mFwXEaGHtXQq`2ZtjfS!B2H{5A<3(nb-6ARVV8kEmOkx6D2x7~-6hl;*-*}2Xz;J#a8Wn;_B5=m zl3dY;%krf?i-Ok^Pal-}4F`{F@TYPTwTEhxpZK5WCpfD^UmM_iYPe}wpE!Djai6_{ z*pGO=WB47#Xjb7!n2Ma)s^yeR*1rTxp`Mt4sfA+`HwZf%!7ZqGosPkw69`Ix5Ku6G z@Pa;pjzV&dn{M=QDx89t?p?d9gna*}jBly*#1!6}5K<*xDPJ{wv4& zM$17DFd~L*Te3A%yD;Dp9UGWTjRxAvMu!j^Tbc}2v~q^59d4bz zvu#!IJCy(BcWTc`;v$9tH;J%oiSJ_i7s;2`JXZF+qd4C)vY!hyCtl)sJIC{ebI*0> z@x>;EzyBv>AI-~{D6l6{ST=em*U( z(r$nuXY-#CCi^8Z2#v#UXOt`dbYN1z5jzNF2 z411?w)whZrfA20;nl&C1Gi+gk<`JSm+{|*2o<< zqM#@z_D`Cn|0H^9$|Tah)0M_X4c37|KQ*PmoT@%xHc3L1ZY6(p(sNXHa&49Frzto& zR`c~ClHpE~4Z=uKa5S(-?M8EJ$zt0&fJk~p$M#fGN1-y$7!37hld`Uw>Urri(DxLa;=#rK0g4J)pXMC zxzraOVw1+kNWpi#P=6(qxf`zSdUC?D$i`8ZI@F>k6k zz21?d+dw7b&i*>Kv5L(LH-?J%@WnqT7j#qZ9B>|Zl+=> z^U-pV@1y_ptHo4hl^cPRWewbLQ#g6XYQ@EkiP z;(=SU!yhjHp%1&MsU`FV1Z_#K1&(|5n(7IHbx&gG28HNT)*~-BQi372@|->2Aw5It z0CBpUcMA*QvsPy)#lr!lIdCi@1k4V2m!NH)%Px(vu-r(Q)HYc!p zJ^$|)j^E#q#QOgcb^pd74^JUi7fUmMiNP_o*lvx*q%_odv49Dsv$NV;6J z9GOXKomA{2Pb{w}&+yHtH?IkJJu~}Z?{Uk++2mB8zyvh*xhHKE``99>y#TdD z&(MH^^JHf;g(Tbb^&8P*;_i*2&fS$7${3WJtV7K&&(MBV2~)2KB3%cWg#1!VE~k#C z!;A;?p$s{ihyojEZz+$I1)L}&G~ml=udD9qh>Tu(ylv)?YcJT3ihapi!zgPtWb*CP zlLLJSRCj-^w?@;RU9aL2zDZY1`I3d<&OMuW=c3$o0#STpv_p3b9Wtbql>w^bBi~u4 z3D8KyF?YE?=HcKk!xcp@Cigvzy=lnFgc^9c%(^F22BWYNAYRSho@~*~S)4%AhEttv zvq>7X!!EWKG?mOd9&n>vvH1p4VzE?HCuxT-u+F&mnsfDI^}*-d00-KAauEaXqg3k@ zy#)MGX!X;&3&0s}F3q40ZmVM$(H3CLfpdL?hB6nVqMxX)q=1b}o_PG%r~hZ4gUfSp zOH4qlEOW4OMUc)_m)fMR_rl^pCfXc{$fQbI*E&mV77}kRF z&{<06AJyJ!e863o-V>FA1a9Eemx6>^F$~9ppt()ZbPGfg_NdRXBWoZnDy2;#ODgf! zgl?iOcF7Meo|{AF>KDwTgYrJLb$L2%%BEtO>T$C?|9bAB&}s;gI?lY#^tttY&hfr# zKhC+&b-rpg_?~uVK%S@mQleU#_xCsvIPK*<`E0fHE1&!J7!xD#IB|SSPW6-PyuqGn3^M^Rz%WT{e?OI^svARX&SAdU77V(C~ zM$H{Kg59op{<|8ry9ecfP%=kFm(-!W&?U0@<%z*+!*<e0XesMxRFu9QnGqun6R_%T+B%&9Dtk?*d$Q zb~>84jEAPi@&F@3wAa^Lzc(AJz5gsfZ7J53;@D<;Klpl?sK&u@gie`~vTsbOE~Cd4 z%kr56mI|#b(Jk&;p6plVwmNB0H@0SmgdmjIn5Ne@)}7Vty(yb2t3ev@22AE^s!KaN zyQ>j+F3w=wnx7w@FVCRe+`vUH)3gW%_72fxzqX!S&!dchdkRiHbXW1FMrIIBwjsai8`CB2r4mAbwp%rrO>3B$Zw;9=%fXI9B{d(UzVap7u z6piC-FQ)>}VOEuPpuqznpY`hN4dGa_1Xz9rVg(;H$5Te^F0dDv*gz9JS<|>>U0J^# z6)(4ICh+N_Q`Ft0hF|3fSHs*?a=XC;e`sJaU9&d>X4l?1W=|fr!5ShD|nv$GK;j46@BV6+{oRbWfqOBRb!ir88XD*SbC(LF}I1h#6@dvK%Toe%@ zhDyG$93H8Eu&gCYddP58iF3oQH*zLbNI;rN@E{T9%A8!=v#JLxKyUe}e}BJpB{~uN zqgxRgo0*-@-iaHPV8bTOH(rS(huwK1Xg0u+e!`(Irzu@Bld&s5&bWgVc@m7;JgELd zimVs`>vQ}B_1(2#rv#N9O`fJpVfPc7V2nv34PC);Dzbb;p!6pqHzvy?2pD&1NE)?A zt(t-ucqy@wn9`^MN5apa7K|L=9>ISC>xoc#>{@e}m#YAAa1*8-RUMKwbm|;5p>T`Z zNf*ph@tnF{gmDa3uwwN(g=`Rh)4!&)^oOy@VJaK4lMT&5#YbXkl`q?<*XtsqD z9PRK6bqb)fJw0g-^a@nu`^?71k|m3RPRjt;pIkCo1{*pdqbVs-Yl>4E>3fZx3Sv44grW=*qdSoiZ9?X0wWyO4`yDHh2E!9I!ZFi zVL8|VtW38}BOJHW(Ax#KL_KQzarbuE{(%TA)AY)@tY4%A%P%SqIU~8~-Lp3qY;U-} z`h_Gel7;K1h}7$_5ZZT0&%$Lxxr-<89V&&TCsu}LL#!xpQ1O31jaa{U34~^le*Y%L za?7$>Jk^k^pS^_M&cDs}NgXlR>16AHkSK-4TRaJSh#h&p!-!vQY%f+bmn6x`4fwTp z$727L^y`~!exvmE^W&#@uY!NxJi`g!i#(++!)?iJ(1)2Wk;RN zFK&O4eTkP$Xn~4bB|q8y(btx$R#D`O@epi4ofcETrx!IM(kWNEe42Qh(8*KqfP(c0 zouBl6>Fc_zM+V;F3znbo{x#%!?mH3`_ANJ?y7ppxS@glg#S9^MXu|FM&ynpz3o&Qh z2ujAHLF3($pH}0jXQsa#?t--TnF1P73b?4`KeJ9^qK-USHE)4!IYgMn-7z|=ALF5SNGkrtPG@Y~niUQV2?g$vzJN3nZ{7;HZHzWAeQ;5P|@Tl3YHpyznGG4-f4=XflwSJY+58-+wf?~Fg@1p1wkzuu-RF3j2JX37SQUc? zQ4v%`V8z9ZVZVqS8h|@@RpD?n0W<=hk=3Cf8R?d^9YK&e9ZybFY%jdnA)PeHvtBe- zhMLD+SSteHBq*q)d6x{)s1UrsO!byyLS$58WK;sqip$Mk{l)Y(_6hEIBsIjCr5t>( z7CdKUrJTrW%qZ#1z^n*Lb8#VdfzPw~OIL76aC+Rhr<~;4Tl!sw?Rj6hXj4XWa#6Tp z@)kJ~qOV)^Rh*-?aG>ic2*NlC2M7&LUzc9RT6WM%Cpe78`iAowe!>(T0jo&ivn8-7 zs{Qa@cGy$rE-3AY0V(l8wjI^uB8Lchj@?L}fYal^>T9z;8juH@?rG&g-t+R2dVDBe zq!K%{e-rT5jX19`(bP23LUN4+_zh2KD~EAYzhpEO3MUG8@}uBHH@4J zd`>_(K4q&>*k82(dDuC)X6JuPrBBubOg7qZ{?x!r@{%0);*`h*^F|%o?&1wX?Wr4b z1~&cy#PUuES{C#xJ84!z<1tp9sfrR(i%Tu^jnXy;4`Xk;AQCdFC@?V%|; zySdC7qS|uQRcH}EFZH%mMB~7gi}a0utE}ZE_}8PQH8f;H%PN41Cb9R%w5Oi5el^fd z$n{3SqLCnrF##x?4sa^r!O$7NX!}&}V;0ZGQ&K&i%6$3C_dR%I7%gdQ;KT6YZiQrW zk%q<74oVBV>@}CvJ4Wj!d^?#Zwq(b$E1ze4$99DuNg?6t9H}k_|D7KWD7i0-g*EO7 z;5{hSIYE4DMOK3H%|f5Edx+S0VI0Yw!tsaRS2&Il2)ea^8R5TG72BrJue|f_{2UHa z@w;^c|K3da#$TB0P3;MPlF7RuQeXT$ zS<<|C0OF(k)>fr&wOB=gP8!Qm>F41u;3esv7_0l%QHt(~+n; zf!G6%hp;Gfa9L9=AceiZs~tK+Tf*Wof=4!u{nIO90jH@iS0l+#%8=~%ASzFv7zqSB^?!@N7)kp0t&tCGLmzXSRMRyxCmCYUD2!B`? zhs$4%KO~m=VFk3Buv9osha{v+mAEq=ik3RdK@;WWTV_g&-$U4IM{1IhGX{pAu%Z&H zFfwCpUsX%RKg);B@7OUzZ{Hn{q6Vv!3#8fAg!P$IEx<0vAx;GU%}0{VIsmFBPq_mb zpe^BChDK>sc-WLKl<6 zwbW|e&d&dv9Wu0goueyu>(JyPx1mz0v4E?cJjFuKF71Q1)AL8jHO$!fYT3(;U3Re* zPPOe%*O+@JYt1bW`!W_1!mN&=w3G9ru1XsmwfS~BJ))PhD(+_J_^N6j)sx5VwbWK| zwRyC?W<`pOCY)b#AS?rluxuuGf-AJ=D!M36l{ua?@SJ5>e!IBr3CXIxWw5xUZ@Xrw z_R@%?{>d%Ld4p}nEsiA@v*nc6Ah!MUs?GA7e5Q5lPpp0@`%5xY$C;{%rz24$;vR#* zBP=a{)K#CwIY%p} zXVdxTQ^HS@O&~eIftU+Qt^~(DGxrdi3k}DdT^I7Iy5SMOp$QuD8s;+93YQ!OY{eB24%xY7ml@|M7I(Nb@K_-?F;2?et|CKkuZK_>+>Lvg!>JE~wN`BI|_h6$qi!P)+K-1Hh(1;a`os z55)4Q{oJiA(lQM#;w#Ta%T0jDNXIPM_bgESMCDEg6rM33anEr}=|Fn6)|jBP6Y}u{ zv9@%7*#RI9;fv;Yii5CI+KrRdr0DKh=L>)eO4q$1zmcSmglsV`*N(x=&Wx`*v!!hn6X-l0 zP_m;X??O(skcj+oS$cIdKhfT%ABAzz3w^la-Ucw?yBPEC+=Pe_vU8nd-HV5YX6X8r zZih&j^eLU=%*;VzhUyoLF;#8QsEfmByk+Y~caBqSvQaaWf2a{JKB9B>V&r?l^rXaC z8)6AdR@Qy_BxQrE2Fk?ewD!SwLuMj@&d_n5RZFf7=>O>hzVE*seW3U?_p|R^CfoY`?|#x9)-*yjv#lo&zP=uI`M?J zbzC<^3x7GfXA4{FZ72{PE*-mNHyy59Q;kYG@BB~NhTd6pm2Oj=_ zizmD?MKVRkT^KmXuhsk?eRQllPo2Ubk=uCKiZ&u3Xjj~<(!M94c)Tez@9M1Gfs5JV z->@II)CDJOXTtPrQudNjE}Eltbjq>6KiwAwqvAKd^|g!exgLG3;wP+#mZYr`cy3#39e653d=jrR-ulW|h#ddHu(m9mFoW~2yE zz5?dB%6vF}+`-&-W8vy^OCxm3_{02royjvmwjlp+eQDzFVEUiyO#gLv%QdDSI#3W* z?3!lL8clTaNo-DVJw@ynq?q!%6hTQi35&^>P85G$TqNt78%9_sSJt2RThO|JzM$iL zg|wjxdMC2|Icc5rX*qPL(coL!u>-xxz-rFiC!6hD1IR%|HSRsV3>Kq~&vJ=s3M5y8SG%YBQ|{^l#LGlg!D?E>2yR*eV%9m$_J6VGQ~AIh&P$_aFbh zULr0Z$QE!QpkP=aAeR4ny<#3Fwyw@rZf4?Ewq`;mCVv}xaz+3ni+}a=k~P+yaWt^L z@w67!DqVf7D%7XtXX5xBW;Co|HvQ8WR1k?r2cZD%U;2$bsM%u8{JUJ5Z0k= zZJARv^vFkmWx15CB=rb=D4${+#DVqy5$C%bf`!T0+epLJLnh1jwCdb*zuCL}eEFvE z{rO1%gxg>1!W(I!owu*mJZ0@6FM(?C+d*CeceZRW_4id*D9p5nzMY&{mWqrJomjIZ z97ZNnZ3_%Hx8dn;H>p8m7F#^2;T%yZ3H;a&N7tm=Lvs&lgJLW{V1@h&6Vy~!+Ffbb zv(n3+v)_D$}dqd!2>Y2B)#<+o}LH#%ogGi2-?xRIH)1!SD)u-L65B&bsJTC=LiaF+YOCif2dUX6uAA|#+vNR z>U+KQekVGon)Yi<93(d!(yw1h3&X0N(PxN2{%vn}cnV?rYw z$N^}_o!XUB!mckL`yO1rnUaI4wrOeQ(+&k?2mi47hzxSD`N#-byqd1IhEoh!PGq>t z_MRy{5B0eKY>;Ao3z$RUU7U+i?iX^&r739F)itdrTpAi-NN0=?^m%?{A9Ly2pVv>Lqs6moTP?T2-AHqFD-o_ znVr|7OAS#AEH}h8SRPQ@NGG47dO}l=t07__+iK8nHw^(AHx&Wb<%jPc$$jl6_p(b$ z)!pi(0fQodCHfM)KMEMUR&UID>}m^(!{C^U7sBDOA)$VThRCI0_+2=( zV8mMq0R(#z;C|7$m>$>`tX+T|xGt(+Y48@ZYu#z;0pCgYgmMVbFb!$?%yhZqP_nhn zy4<#3P1oQ#2b51NU1mGnHP$cf0j-YOgAA}A$QoL6JVLcmExs(kU{4z;PBHJD%_=0F z>+sQV`mzijSIT7xn%PiDKHOujX;n|M&qr1T@rOxTdxtZ!&u&3HHFLYD5$RLQ=heur zb>+AFokUVQeJy-#LP*^)spt{mb@Mqe=A~-4p0b+Bt|pZ+@CY+%x}9f}izU5;4&QFE zO1bhg&A4uC1)Zb67kuowWY4xbo&J=%yoXlFB)&$d*-}kjBu|w!^zbD1YPc0-#XTJr z)pm2RDy%J3jlqSMq|o%xGS$bPwn4AqitC6&e?pqWcjWPt{3I{>CBy;hg0Umh#c;hU3RhCUX=8aR>rmd` z7Orw(5tcM{|-^J?ZAA9KP|)X6n9$-kvr#j5YDecTM6n z&07(nD^qb8hpF0B^z^pQ*%5ePYkv&FabrlI61ntiVp!!C8y^}|<2xgAd#FY=8b*y( zuQOuvy2`Ii^`VBNJB&R!0{hABYX55ooCAJSSevl4RPqEGb)iy_0H}v@vFwFzD%>#I>)3PsouQ+_Kkbqy*kKdHdfkN7NBcq%V{x^fSxgXpg7$bF& zj!6AQbDY(1u#1_A#1UO9AxiZaCVN2F0wGXdY*g@x$ByvUA?ePdide0dmr#}udE%K| z3*k}Vv2Ew2u1FXBaVA6aerI36R&rzEZeDDCl5!t0J=ug6kuNZzH>3i_VN`%BsaVB3 zQYw|Xub_SGf{)F{$ZX5`Jc!X!;eybjP+o$I{Z^Hsj@D=E{MnnL+TbC@HEU2DjG{3-LDGIbq()U87x4eS;JXnSh;lRlJ z>EL3D>wHt-+wTjQF$fGyDO$>d+(fq@bPpLBS~xA~R=3JPbS{tzN(u~m#Po!?H;IYv zE;?8%^vle|%#oux(Lj!YzBKv+Fd}*Ur-dCBoX*t{KeNM*n~ZPYJ4NNKkI^MFbz9!v z4(Bvm*Kc!-$%VFEewYJKz-CQN{`2}KX4*CeJEs+Q(!kI%hN1!1P6iOq?ovz}X0IOi z)YfWpwW@pK08^69#wSyCZkX9?uZD?C^@rw^Y?gLS_xmFKkooyx$*^5#cPqntNTtSG zlP>XLMj2!VF^0k#ole7`-c~*~+_T5ls?x4)ah(j8vo_ zwb%S8qoaZqY0-$ZI+ViIA_1~~rAH7K_+yFS{0rT@eQtTAdz#8E5VpwnW!zJ_^{Utv zlW5Iar3V5t&H4D6A=>?mq;G92;1cg9a2sf;gY9pJDVKn$DYdQlvfXq}zz8#LyPGq@ z+`YUMD;^-6w&r-82JL7mA8&M~Pj@aK!m{0+^v<|t%APYf7`}jGEhdYLqsHW-Le9TL z_hZZ1gbrz7$f9^fAzVIP30^KIz!!#+DRLL+qMszvI_BpOSmjtl$hh;&UeM{ER@INV zcI}VbiVTPoN|iSna@=7XkP&-4#06C};8ajbxJ4Gcq8(vWv4*&X8bM^T$mBk75Q92j z1v&%a;OSKc8EIrodmIiw$lOES2hzGDcjjB`kEDfJe{r}yE6`eZL zEB`9u>Cl0IsQ+t}`-cx}{6jqcANucqIB>Qmga_&<+80E2Q|VHHQ$YlAt{6`Qu`HA3 z03s0-sSlwbvgi&_R8s={6<~M^pGvBNjKOa>tWenzS8s zR>L7R5aZ=mSU{f?ib4Grx$AeFvtO5N|D>9#)ChH#Fny2maHWHOf2G=#<9Myot#+4u zWVa6d^Vseq_0=#AYS(-m$Lp;*8nC_6jXIjEM`omUmtH@QDs3|G)i4j*#_?#UYVZvJ z?YjT-?!4Q{BNun;dKBWLEw2C-VeAz`%?A>p;)PL}TAZn5j~HK>v1W&anteARlE+~+ zj>c(F;?qO3pXBb|#OZdQnm<4xWmn~;DR5SDMxt0UK_F^&eD|KZ=O;tO3vy4@4h^;2 zUL~-z`-P1aOe?|ZC1BgVsL)2^J-&vIFI%q@40w0{jjEfeVl)i9(~bt2z#2Vm)p`V_ z1;6$Ae7=YXk#=Qkd24Y23t&GvRxaOoad~NbJ+6pxqzJ>FY#Td7@`N5xp!n(c!=RE& z&<<@^a$_Ys8jqz4|5Nk#FY$~|FPC0`*a5HH!|Gssa9=~66&xG9)|=pOOJ2KE5|YrR zw!w6K2aC=J$t?L-;}5hn6mHd%hC;p8P|Dgh6D>hGnXPgi;6r+eA=?f72y9(Cf_ho{ zH6#)uD&R=73^$$NE;5piWX2bzR67fQ)`b=85o0eOLGI4c-Tb@-KNi2pz=Ke@SDcPn za$AxXib84`!Sf;Z3B@TSo`Dz7GM5Kf(@PR>Ghzi=BBxK8wRp>YQoXm+iL>H*Jo9M3 z6w&E?BC8AFTFT&Tv8zf+m9<&S&%dIaZ)Aoqkak_$r-2{$d~0g2oLETx9Y`eOAf14QXEQw3tJne;fdzl@wV#TFXSLXM2428F-Q}t+n2g%vPRMUzYPvzQ9f# zu(liiJem9P*?0%V@RwA7F53r~|I!Ty)<*AsMX3J{_4&}{6pT%Tpw>)^|DJ)>gpS~1rNEh z0$D?uO8mG?H;2BwM5a*26^7YO$XjUm40XmBsb63MoR;bJh63J;OngS5sSI+o2HA;W zdZV#8pDpC9Oez&L8loZO)MClRz!_!WD&QRtQxnazhT%Vj6Wl4G11nUk8*vSeVab@N#oJ}`KyJv+8Mo@T1-pqZ1t|?cnaVOd;1(h9 z!$DrN=jcGsVYE-0-n?oCJ^4x)F}E;UaD-LZUIzcD?W^ficqJWM%QLy6QikrM1aKZC zi{?;oKwq^Vsr|&`i{jIphA8S6G4)$KGvpULjH%9u(Dq247;R#l&I0{IhcC|oBF*Al zvLo7Xte=C{aIt*otJD}BUq)|_pdR>{zBMT< z(^1RpZv*l*m*OV^8>9&asGBo8h*_4q*)-eCv*|Pq=XNGrZE)^(SF7^{QE_~4VDB(o zVcPA_!G+2CAtLbl+`=Q~9iW`4ZRLku!uB?;tWqVjB0lEOf}2RD7dJ=BExy=<9wkb- z9&7{XFA%n#JsHYN8t5d~=T~5DcW4$B%3M+nNvC2`0!#@sckqlzo5;hhGi(D9=*A4` z5ynobawSPRtWn&CDLEs3Xf`(8^zDP=NdF~F^s&={l7(aw&EG}KWpMjtmz7j_VLO;@ zM2NVLDxZ@GIv7*gzl1 zjq78tv*8#WSY`}Su0&C;2F$Ze(q>F(@Wm^Gw!)(j;dk9Ad{STaxn)IV9FZhm*n+U} zi;4y*3v%A`_c7a__DJ8D1b@dl0Std3F||4Wtvi)fCcBRh!X9$1x!_VzUh>*S5s!oq z;qd{J_r79EL2wIeiGAqFstWtkfIJpjVh%zFo*=55B9Zq~y0=^iqHWfQl@O!Ak;(o*m!pZqe9 z%U2oDOhR)BvW8&F70L;2TpkzIutIvNQaTjjs5V#8mV4!NQ}zN=i`i@WI1z0eN-iCS z;vL-Wxc^Vc_qK<5RPh(}*8dLT{~GzE{w2o$2kMFaEl&q zP{V=>&3kW7tWaK-Exy{~`v4J0U#OZBk{a9{&)&QG18L@6=bsZ1zC_d{{pKZ-Ey>I> z;8H0t4bwyQqgu4hmO`3|4K{R*5>qnQ&gOfdy?z`XD%e5+pTDzUt3`k^u~SaL&XMe= z9*h#kT(*Q9jO#w2Hd|Mr-%DV8i_1{J1MU~XJ3!WUplhXDYBpJH><0OU`**nIvPIof z|N8@I=wA)sf45SAvx||f?Z5uB$kz1qL3Ky_{%RPdP5iN-D2!p5scq}buuC00C@jom zhfGKm3|f?Z0iQ|K$Z~!`8{nmAS1r+fp6r#YDOS8V*;K&Gs7Lc&f^$RC66O|)28oh`NHy&vq zJh+hAw8+ybTB0@VhWN^0iiTnLsCWbS_y`^gs!LX!Lw{yE``!UVzrV24tP8o;I6-65 z1MUiHw^{bB15tmrVT*7-#sj6cs~z`wk52YQJ*TG{SE;KTm#Hf#a~|<(|ImHH17nNM z`Ub{+J3dMD!)mzC8b(2tZtokKW5pAwHa?NFiso~# z1*iaNh4lQ4TS)|@G)H4dZV@l*Vd;Rw;-;odDhW2&lJ%m@jz+Panv7LQm~2Js6rOW3 z0_&2cW^b^MYW3)@o;neZ<{B4c#m48dAl$GCc=$>ErDe|?y@z`$uq3xd(%aAsX)D%l z>y*SQ%My`yDP*zof|3@_w#cjaW_YW4BdA;#Glg1RQcJGY*CJ9`H{@|D+*e~*457kd z73p<%fB^PV!Ybw@)Dr%(ZJbX}xmCStCYv#K3O32ej{$9IzM^I{6FJ8!(=azt7RWf4 z7ib0UOPqN40X!wOnFOoddd8`!_IN~9O)#HRTyjfc#&MCZ zZAMzOVB=;qwt8gV?{Y2?b=iSZG~RF~uyx18K)IDFLl})G1v@$(s{O4@RJ%OTJyF+Cpcx4jmy|F3euCnMK!P2WTDu5j z{{gD$=M*pH!GGzL%P)V2*ROm>!$Y=z|D`!_yY6e7SU$~a5q8?hZGgaYqaiLnkK%?0 zs#oI%;zOxF@g*@(V4p!$7dS1rOr6GVs6uYCTt2h)eB4?(&w8{#o)s#%gN@BBosRUe z)@P@8_Zm89pr~)b>e{tbPC~&_MR--iB{=)y;INU5#)@Gix-YpgP<-c2Ms{9zuCX|3 z!p(?VaXww&(w&uBHzoT%!A2=3HAP>SDxcljrego7rY|%hxy3XlODWffO_%g|l+7Y_ zqV(xbu)s4lV=l7M;f>vJl{`6qBm>#ZeMA}kXb97Z)?R97EkoI?x6Lp0yu1Z>PS?2{ z0QQ(8D)|lc9CO3B~e(pQM&5(1y&y=e>C^X$`)_&XuaI!IgDTVqt31wX#n+@!a_A0ZQkA zCJ2@M_4Gb5MfCrm5UPggeyh)8 zO9?`B0J#rkoCx(R0I!ko_2?iO@|oRf1;3r+i)w-2&j?=;NVIdPFsB)`|IC0zk6r9c zRrkfxWsiJ(#8QndNJj@{@WP2Ackr|r1VxV{7S&rSU(^)-M8gV>@UzOLXu9K<{6e{T zXJ6b92r$!|lwjhmgqkdswY&}c)KW4A)-ac%sU;2^fvq7gfUW4Bw$b!i@duy1CAxSn z(pyh$^Z=&O-q<{bZUP+$U}=*#M9uVc>CQVgDs4swy5&8RAHZ~$)hrTF4W zPsSa~qYv_0mJnF89RnnJTH`3}w4?~epFl=D(35$ zWa07ON$`OMBOHgCmfO(9RFc<)?$x)N}Jd2A(<*Ll7+4jrRt9w zwGxExUXd9VB#I|DwfxvJ;HZ8Q{37^wDhaZ%O!oO(HpcqfLH%#a#!~;Jl7F5>EX_=8 z{()l2NqPz>La3qJR;_v+wlK>GsHl;uRA8%j`A|yH@k5r%55S9{*Cp%uw6t`qc1!*T za2OeqtQj7sAp#Q~=5Fs&aCR9v>5V+s&RdNvo&H~6FJOjvaj--2sYYBvMq;55%z8^o z|BJDA4vzfow#DO#ZQHh;Oq_{r+qP{R9ox2TOgwQiv7Ow!zjN+A@BN;0tA2lUb#+zO z(^b89eV)D7UVE+h{mcNc6&GtpOqDn_?VAQ)Vob$hlFwW%xh>D#wml{t&Ofmm_d_+; zKDxzdr}`n2Rw`DtyIjrG)eD0vut$}dJAZ0AohZ+ZQdWXn_Z@dI_y=7t3q8x#pDI-K z2VVc&EGq445Rq-j0=U=Zx`oBaBjsefY;%)Co>J3v4l8V(T8H?49_@;K6q#r~Wwppc z4XW0(4k}cP=5ex>-Xt3oATZ~bBWKv)aw|I|Lx=9C1s~&b77idz({&q3T(Y(KbWO?+ zmcZ6?WeUsGk6>km*~234YC+2e6Zxdl~<_g2J|IE`GH%n<%PRv-50; zH{tnVts*S5*_RxFT9eM0z-pksIb^drUq4>QSww=u;UFCv2AhOuXE*V4z?MM`|ABOC4P;OfhS(M{1|c%QZ=!%rQTDFx`+}?Kdx$&FU?Y<$x;j7z=(;Lyz+?EE>ov!8vvMtSzG!nMie zsBa9t8as#2nH}n8xzN%W%U$#MHNXmDUVr@GX{?(=yI=4vks|V)!-W5jHsU|h_&+kY zS_8^kd3jlYqOoiI`ZqBVY!(UfnAGny!FowZWY_@YR0z!nG7m{{)4OS$q&YDyw6vC$ zm4!$h>*|!2LbMbxS+VM6&DIrL*X4DeMO!@#EzMVfr)e4Tagn~AQHIU8?e61TuhcKD zr!F4(kEebk(Wdk-?4oXM(rJwanS>Jc%<>R(siF+>+5*CqJLecP_we33iTFTXr6W^G z7M?LPC-qFHK;E!fxCP)`8rkxZyFk{EV;G-|kwf4b$c1k0atD?85+|4V%YATWMG|?K zLyLrws36p%Qz6{}>7b>)$pe>mR+=IWuGrX{3ZPZXF3plvuv5Huax86}KX*lbPVr}L z{C#lDjdDeHr~?l|)Vp_}T|%$qF&q#U;ClHEPVuS+Jg~NjC1RP=17=aQKGOcJ6B3mp z8?4*-fAD~}sX*=E6!}^u8)+m2j<&FSW%pYr_d|p_{28DZ#Cz0@NF=gC-o$MY?8Ca8 zr5Y8DSR^*urS~rhpX^05r30Ik#2>*dIOGxRm0#0YX@YQ%Mg5b6dXlS!4{7O_kdaW8PFSdj1=ryI-=5$fiieGK{LZ+SX(1b=MNL!q#lN zv98?fqqTUH8r8C7v(cx#BQ5P9W>- zmW93;eH6T`vuJ~rqtIBg%A6>q>gnWb3X!r0wh_q;211+Om&?nvYzL1hhtjB zK_7G3!n7PL>d!kj){HQE zE8(%J%dWLh1_k%gVXTZt zEdT09XSKAx27Ncaq|(vzL3gm83q>6CAw<$fTnMU05*xAe&rDfCiu`u^1)CD<>sx0i z*hr^N_TeN89G(nunZoLBf^81#pmM}>JgD@Nn1l*lN#a=B=9pN%tmvYFjFIoKe_(GF z-26x{(KXdfsQL7Uv6UtDuYwV`;8V3w>oT_I<`Ccz3QqK9tYT5ZQzbop{=I=!pMOCb zCU68`n?^DT%^&m>A%+-~#lvF!7`L7a{z<3JqIlk1$<||_J}vW1U9Y&eX<}l8##6i( zZcTT@2`9(Mecptm@{3A_Y(X`w9K0EwtPq~O!16bq{7c0f7#(3wn-^)h zxV&M~iiF!{-6A@>o;$RzQ5A50kxXYj!tcgme=Qjrbje~;5X2xryU;vH|6bE(8z^<7 zQ>BG7_c*JG8~K7Oe68i#0~C$v?-t@~@r3t2inUnLT(c=URpA9kA8uq9PKU(Ps(LVH zqgcqW>Gm?6oV#AldDPKVRcEyQIdTT`Qa1j~vS{<;SwyTdr&3*t?J)y=M7q*CzucZ&B0M=joT zBbj@*SY;o2^_h*>R0e({!QHF0=)0hOj^B^d*m>SnRrwq>MolNSgl^~r8GR#mDWGYEIJA8B<|{{j?-7p zVnV$zancW3&JVDtVpIlI|5djKq0(w$KxEFzEiiL=h5Jw~4Le23@s(mYyXWL9SX6Ot zmb)sZaly_P%BeX_9 zw&{yBef8tFm+%=--m*J|o~+Xg3N+$IH)t)=fqD+|fEk4AAZ&!wcN5=mi~Vvo^i`}> z#_3ahR}Ju)(Px7kev#JGcSwPXJ2id9%Qd2A#Uc@t8~egZ8;iC{e! z%=CGJOD1}j!HW_sgbi_8suYnn4#Ou}%9u)dXd3huFIb!ytlX>Denx@pCS-Nj$`VO&j@(z!kKSP0hE4;YIP#w9ta=3DO$7f*x zc9M4&NK%IrVmZAe=r@skWD`AEWH=g+r|*13Ss$+{c_R!b?>?UaGXlw*8qDmY#xlR= z<0XFbs2t?8i^G~m?b|!Hal^ZjRjt<@a? z%({Gn14b4-a|#uY^=@iiKH+k?~~wTj5K1A&hU z2^9-HTC)7zpoWK|$JXaBL6C z#qSNYtY>65T@Zs&-0cHeu|RX(Pxz6vTITdzJdYippF zC-EB+n4}#lM7`2Ry~SO>FxhKboIAF#Z{1wqxaCb{#yEFhLuX;Rx(Lz%T`Xo1+a2M}7D+@wol2)OJs$TwtRNJ={( zD@#zTUEE}#Fz#&(EoD|SV#bayvr&E0vzmb%H?o~46|FAcx?r4$N z&67W3mdip-T1RIxwSm_&(%U|+WvtGBj*}t69XVd&ebn>KOuL(7Y8cV?THd-(+9>G7*Nt%T zcH;`p={`SOjaf7hNd(=37Lz3-51;58JffzIPgGs_7xIOsB5p2t&@v1mKS$2D$*GQ6 zM(IR*j4{nri7NMK9xlDy-hJW6sW|ZiDRaFiayj%;(%51DN!ZCCCXz+0Vm#};70nOx zJ#yA0P3p^1DED;jGdPbQWo0WATN=&2(QybbVdhd=Vq*liDk`c7iZ?*AKEYC#SY&2g z&Q(Ci)MJ{mEat$ZdSwTjf6h~roanYh2?9j$CF@4hjj_f35kTKuGHvIs9}Re@iKMxS-OI*`0S z6s)fOtz}O$T?PLFVSeOjSO26$@u`e<>k(OSP!&YstH3ANh>)mzmKGNOwOawq-MPXe zy4xbeUAl6tamnx))-`Gi2uV5>9n(73yS)Ukma4*7fI8PaEwa)dWHs6QA6>$}7?(L8 ztN8M}?{Tf!Zu22J5?2@95&rQ|F7=FK-hihT-vDp!5JCcWrVogEnp;CHenAZ)+E+K5 z$Cffk5sNwD_?4+ymgcHR(5xgt20Z8M`2*;MzOM#>yhk{r3x=EyM226wb&!+j`W<%* zSc&|`8!>dn9D@!pYow~(DsY_naSx7(Z4i>cu#hA5=;IuI88}7f%)bRkuY2B;+9Uep zpXcvFWkJ!mQai63BgNXG26$5kyhZ2&*3Q_tk)Ii4M>@p~_~q_cE!|^A;_MHB;7s#9 zKzMzK{lIxotjc};k67^Xsl-gS!^*m*m6kn|sbdun`O?dUkJ{0cmI0-_2y=lTAfn*Y zKg*A-2sJq)CCJgY0LF-VQvl&6HIXZyxo2#!O&6fOhbHXC?%1cMc6y^*dOS{f$=137Ds1m01qs`>iUQ49JijsaQ( zksqV9@&?il$|4Ua%4!O15>Zy&%gBY&wgqB>XA3!EldQ%1CRSM(pp#k~-pkcCg4LAT zXE=puHbgsw)!xtc@P4r~Z}nTF=D2~j(6D%gTBw$(`Fc=OOQ0kiW$_RDd=hcO0t97h zb86S5r=>(@VGy1&#S$Kg_H@7G^;8Ue)X5Y+IWUi`o;mpvoV)`fcVk4FpcT|;EG!;? zHG^zrVVZOm>1KFaHlaogcWj(v!S)O(Aa|Vo?S|P z5|6b{qkH(USa*Z7-y_Uvty_Z1|B{rTS^qmEMLEYUSk03_Fg&!O3BMo{b^*`3SHvl0 zhnLTe^_vVIdcSHe)SQE}r~2dq)VZJ!aSKR?RS<(9lzkYo&dQ?mubnWmgMM37Nudwo z3Vz@R{=m2gENUE3V4NbIzAA$H1z0pagz94-PTJyX{b$yndsdKptmlKQKaaHj@3=ED zc7L?p@%ui|RegVYutK$64q4pe9+5sv34QUpo)u{1ci?)_7gXQd{PL>b0l(LI#rJmN zGuO+%GO`xneFOOr4EU(Wg}_%bhzUf;d@TU+V*2#}!2OLwg~%D;1FAu=Un>OgjPb3S z7l(riiCwgghC=Lm5hWGf5NdGp#01xQ59`HJcLXbUR3&n%P(+W2q$h2Qd z*6+-QXJ*&Kvk9ht0f0*rO_|FMBALen{j7T1l%=Q>gf#kma zQlg#I9+HB+z*5BMxdesMND`_W;q5|FaEURFk|~&{@qY32N$G$2B=&Po{=!)x5b!#n zxLzblkq{yj05#O7(GRuT39(06FJlalyv<#K4m}+vs>9@q-&31@1(QBv82{}Zkns~K ze{eHC_RDX0#^A*JQTwF`a=IkE6Ze@j#-8Q`tTT?k9`^ZhA~3eCZJ-Jr{~7Cx;H4A3 zcZ+Zj{mzFZbVvQ6U~n>$U2ZotGsERZ@}VKrgGh0xM;Jzt29%TX6_&CWzg+YYMozrM z`nutuS)_0dCM8UVaKRj804J4i%z2BA_8A4OJRQ$N(P9Mfn-gF;4#q788C@9XR0O3< zsoS4wIoyt046d+LnSCJOy@B@Uz*#GGd#+Ln1ek5Dv>(ZtD@tgZlPnZZJGBLr^JK+!$$?A_fA3LOrkoDRH&l7 zcMcD$Hsjko3`-{bn)jPL6E9Ds{WskMrivsUu5apD z?grQO@W7i5+%X&E&p|RBaEZ(sGLR@~(y^BI@lDMot^Ll?!`90KT!JXUhYS`ZgX3jnu@Ja^seA*M5R@f`=`ynQV4rc$uT1mvE?@tz)TN<=&H1%Z?5yjxcpO+6y_R z6EPuPKM5uxKpmZfT(WKjRRNHs@ib)F5WAP7QCADvmCSD#hPz$V10wiD&{NXyEwx5S z6NE`3z!IS^$s7m}PCwQutVQ#~w+V z=+~->DI*bR2j0^@dMr9`p>q^Ny~NrAVxrJtX2DUveic5vM%#N*XO|?YAWwNI$Q)_) zvE|L(L1jP@F%gOGtnlXtIv2&1i8q<)Xfz8O3G^Ea~e*HJsQgBxWL(yuLY+jqUK zRE~`-zklrGog(X}$9@ZVUw!8*=l`6mzYLtsg`AvBYz(cxmAhr^j0~(rzXdiOEeu_p zE$sf2(w(BPAvO5DlaN&uQ$4@p-b?fRs}d7&2UQ4Fh?1Hzu*YVjcndqJLw0#q@fR4u zJCJ}>_7-|QbvOfylj+e^_L`5Ep9gqd>XI3-O?Wp z-gt*P29f$Tx(mtS`0d05nHH=gm~Po_^OxxUwV294BDKT>PHVlC5bndncxGR!n(OOm znsNt@Q&N{TLrmsoKFw0&_M9$&+C24`sIXGWgQaz=kY;S{?w`z^Q0JXXBKFLj0w0U6P*+jPKyZHX9F#b0D1$&(- zrm8PJd?+SrVf^JlfTM^qGDK&-p2Kdfg?f>^%>1n8bu&byH(huaocL>l@f%c*QkX2i znl}VZ4R1en4S&Bcqw?$=Zi7ohqB$Jw9x`aM#>pHc0x z0$!q7iFu zZ`tryM70qBI6JWWTF9EjgG@>6SRzsd}3h+4D8d~@CR07P$LJ}MFsYi-*O%XVvD@yT|rJ+Mk zDllJ7$n0V&A!0flbOf)HE6P_afPWZmbhpliqJuw=-h+r;WGk|ntkWN(8tKlYpq5Ow z(@%s>IN8nHRaYb*^d;M(D$zGCv5C|uqmsDjwy4g=Lz>*OhO3z=)VD}C<65;`89Ye} zSCxrv#ILzIpEx1KdLPlM&%Cctf@FqTKvNPXC&`*H9=l=D3r!GLM?UV zOxa(8ZsB`&+76S-_xuj?G#wXBfDY@Z_tMpXJS7^mp z@YX&u0jYw2A+Z+bD#6sgVK5ZgdPSJV3>{K^4~%HV?rn~4D)*2H!67Y>0aOmzup`{D zzDp3c9yEbGCY$U<8biJ_gB*`jluz1ShUd!QUIQJ$*1;MXCMApJ^m*Fiv88RZ zFopLViw}{$Tyhh_{MLGIE2~sZ)t0VvoW%=8qKZ>h=adTe3QM$&$PO2lfqH@brt!9j ziePM8$!CgE9iz6B<6_wyTQj?qYa;eC^{x_0wuwV~W+^fZmFco-o%wsKSnjXFEx02V zF5C2t)T6Gw$Kf^_c;Ei3G~uC8SM-xyycmXyC2hAVi-IfXqhu$$-C=*|X?R0~hu z8`J6TdgflslhrmDZq1f?GXF7*ALeMmOEpRDg(s*H`4>_NAr`2uqF;k;JQ+8>A|_6ZNsNLECC%NNEb1Y1dP zbIEmNpK)#XagtL4R6BC{C5T(+=yA-(Z|Ap}U-AfZM#gwVpus3(gPn}Q$CExObJ5AC z)ff9Yk?wZ}dZ-^)?cbb9Fw#EjqQ8jxF4G3=L?Ra zg_)0QDMV1y^A^>HRI$x?Op@t;oj&H@1xt4SZ9(kifQ zb59B*`M99Td7@aZ3UWvj1rD0sE)d=BsBuW*KwkCds7ay(7*01_+L}b~7)VHI>F_!{ zyxg-&nCO?v#KOUec0{OOKy+sjWA;8rTE|Lv6I9H?CI?H(mUm8VXGwU$49LGpz&{nQp2}dinE1@lZ1iox6{ghN&v^GZv9J${7WaXj)<0S4g_uiJ&JCZ zr8-hsu`U%N;+9N^@&Q0^kVPB3)wY(rr}p7{p0qFHb3NUUHJb672+wRZs`gd1UjKPX z4o6zljKKA+Kkj?H>Ew63o%QjyBk&1!P22;MkD>sM0=z_s-G{mTixJCT9@_|*(p^bz zJ8?ZZ&;pzV+7#6Mn`_U-)k8Pjg?a;|Oe^us^PoPY$Va~yi8|?+&=y$f+lABT<*pZr zP}D{~Pq1Qyni+@|aP;ixO~mbEW9#c0OU#YbDZIaw=_&$K%Ep2f%hO^&P67hApZe`x zv8b`Mz@?M_7-)b!lkQKk)JXXUuT|B8kJlvqRmRpxtQDgvrHMXC1B$M@Y%Me!BSx3P z#2Eawl$HleZhhTS6Txm>lN_+I`>eV$&v9fOg)%zVn3O5mI*lAl>QcHuW6!Kixmq`X zBCZ*Ck6OYtDiK!N47>jxI&O2a9x7M|i^IagRr-fmrmikEQGgw%J7bO|)*$2FW95O4 zeBs>KR)izRG1gRVL;F*sr8A}aRHO0gc$$j&ds8CIO1=Gwq1%_~E)CWNn9pCtBE}+`Jelk4{>S)M)`Ll=!~gnn1yq^EX(+y*ik@3Ou0qU`IgYi3*doM+5&dU!cho$pZ zn%lhKeZkS72P?Cf68<#kll_6OAO26bIbueZx**j6o;I0cS^XiL`y+>{cD}gd%lux} z)3N>MaE24WBZ}s0ApfdM;5J_Ny}rfUyxfkC``Awo2#sgLnGPewK};dORuT?@I6(5~ z?kE)Qh$L&fwJXzK){iYx!l5$Tt|^D~MkGZPA}(o6f7w~O2G6Vvzdo*a;iXzk$B66$ zwF#;wM7A+(;uFG4+UAY(2`*3XXx|V$K8AYu#ECJYSl@S=uZW$ksfC$~qrrbQj4??z-)uz0QL}>k^?fPnJTPw% zGz)~?B4}u0CzOf@l^um}HZzbaIwPmb<)< zi_3@E9lc)Qe2_`*Z^HH;1CXOceL=CHpHS{HySy3T%<^NrWQ}G0i4e1xm_K3(+~oi$ zoHl9wzb?Z4j#90DtURtjtgvi7uw8DzHYmtPb;?%8vb9n@bszT=1qr)V_>R%s!92_` zfnHQPANx z<#hIjIMm#*(v*!OXtF+w8kLu`o?VZ5k7{`vw{Yc^qYclpUGIM_PBN1+c{#Vxv&E*@ zxg=W2W~JuV{IuRYw3>LSI1)a!thID@R=bU+cU@DbR^_SXY`MC7HOsCN z!dO4OKV7(E_Z8T#8MA1H`99?Z!r0)qKW_#|29X3#Jb+5+>qUidbeP1NJ@)(qi2S-X zao|f0_tl(O+$R|Qwd$H{_ig|~I1fbp_$NkI!0E;Y z6JrnU{1Ra6^on{9gUUB0mwzP3S%B#h0fjo>JvV~#+X0P~JV=IG=yHG$O+p5O3NUgG zEQ}z6BTp^Fie)Sg<){Z&I8NwPR(=mO4joTLHkJ>|Tnk23E(Bo`FSbPc05lF2-+)X? z6vV3*m~IBHTy*^E!<0nA(tCOJW2G4DsH7)BxLV8kICn5lu6@U*R`w)o9;Ro$i8=Q^V%uH8n3q=+Yf;SFRZu z!+F&PKcH#8cG?aSK_Tl@K9P#8o+jry@gdexz&d(Q=47<7nw@e@FFfIRNL9^)1i@;A z28+$Z#rjv-wj#heI|<&J_DiJ*s}xd-f!{J8jfqOHE`TiHHZVIA8CjkNQ_u;Ery^^t zl1I75&u^`1_q)crO+JT4rx|z2ToSC>)Or@-D zy3S>jW*sNIZR-EBsfyaJ+Jq4BQE4?SePtD2+jY8*%FsSLZ9MY>+wk?}}}AFAw)vr{ml)8LUG-y9>^t!{~|sgpxYc0Gnkg`&~R z-pilJZjr@y5$>B=VMdZ73svct%##v%wdX~9fz6i3Q-zOKJ9wso+h?VME7}SjL=!NUG{J?M&i!>ma`eoEa@IX`5G>B1(7;%}M*%-# zfhJ(W{y;>MRz!Ic8=S}VaBKqh;~7KdnGEHxcL$kA-6E~=!hrN*zw9N+_=odt<$_H_8dbo;0=42wcAETPCVGUr~v(`Uai zb{=D!Qc!dOEU6v)2eHSZq%5iqK?B(JlCq%T6av$Cb4Rko6onlG&?CqaX7Y_C_cOC3 zYZ;_oI(}=>_07}Oep&Ws7x7-R)cc8zfe!SYxJYP``pi$FDS)4Fvw5HH=FiU6xfVqIM!hJ;Rx8c0cB7~aPtNH(Nmm5Vh{ibAoU#J6 zImRCr?(iyu_4W_6AWo3*vxTPUw@vPwy@E0`(>1Qi=%>5eSIrp^`` zK*Y?fK_6F1W>-7UsB)RPC4>>Ps9)f+^MqM}8AUm@tZ->j%&h1M8s*s!LX5&WxQcAh z8mciQej@RPm?660%>{_D+7er>%zX_{s|$Z+;G7_sfNfBgY(zLB4Ey}J9F>zX#K0f6 z?dVNIeEh?EIShmP6>M+d|0wMM85Sa4diw1hrg|ITJ}JDg@o8y>(rF9mXk5M z2@D|NA)-7>wD&wF;S_$KS=eE84`BGw3g0?6wGxu8ys4rwI?9U=*^VF22t3%mbGeOh z`!O-OpF7#Vceu~F`${bW0nYVU9ecmk31V{tF%iv&5hWofC>I~cqAt@u6|R+|HLMMX zVxuSlMFOK_EQ86#E8&KwxIr8S9tj_goWtLv4f@!&h8;Ov41{J~496vp9vX=(LK#j! zAwi*21RAV-LD>9Cw3bV_9X(X3)Kr0-UaB*7Y>t82EQ%!)(&(XuAYtTsYy-dz+w=$ir)VJpe!_$ z6SGpX^i(af3{o=VlFPC);|J8#(=_8#vdxDe|Cok+ANhYwbE*FO`Su2m1~w+&9<_9~ z-|tTU_ACGN`~CNW5WYYBn^B#SwZ(t4%3aPp z;o)|L6Rk569KGxFLUPx@!6OOa+5OjQLK5w&nAmwxkC5rZ|m&HT8G%GVZxB_@ME z>>{rnXUqyiJrT(8GMj_ap#yN_!9-lO5e8mR3cJiK3NE{_UM&=*vIU`YkiL$1%kf+1 z4=jk@7EEj`u(jy$HnzE33ZVW_J4bj}K;vT?T91YlO(|Y0FU4r+VdbmQ97%(J5 zkK*Bed8+C}FcZ@HIgdCMioV%A<*4pw_n}l*{Cr4}a(lq|injK#O?$tyvyE`S%(1`H z_wwRvk#13ElkZvij2MFGOj`fhy?nC^8`Zyo%yVcUAfEr8x&J#A{|moUBAV_^f$hpaUuyQeY3da^ zS9iRgf87YBwfe}>BO+T&Fl%rfpZh#+AM?Dq-k$Bq`vG6G_b4z%Kbd&v>qFjow*mBl z-OylnqOpLg}or7_VNwRg2za3VBK6FUfFX{|TD z`Wt0Vm2H$vdlRWYQJqDmM?JUbVqL*ZQY|5&sY*?!&%P8qhA~5+Af<{MaGo(dl&C5t zE%t!J0 zh6jqANt4ABdPxSTrVV}fLsRQal*)l&_*rFq(Ez}ClEH6LHv{J#v?+H-BZ2)Wy{K@9 z+ovXHq~DiDvm>O~r$LJo!cOuwL+Oa--6;UFE2q@g3N8Qkw5E>ytz^(&($!O47+i~$ zKM+tkAd-RbmP{s_rh+ugTD;lriL~`Xwkad#;_aM?nQ7L_muEFI}U_4$phjvYgleK~`Fo`;GiC07&Hq1F<%p;9Q;tv5b?*QnR%8DYJH3P>Svmv47Y>*LPZJy8_{9H`g6kQpyZU{oJ`m%&p~D=K#KpfoJ@ zn-3cqmHsdtN!f?~w+(t+I`*7GQA#EQC^lUA9(i6=i1PqSAc|ha91I%X&nXzjYaM{8$s&wEx@aVkQ6M{E2 zfzId#&r(XwUNtPcq4Ngze^+XaJA1EK-%&C9j>^9(secqe{}z>hR5CFNveMsVA)m#S zk)_%SidkY-XmMWlVnQ(mNJ>)ooszQ#vaK;!rPmGKXV7am^_F!Lz>;~{VrIO$;!#30XRhE1QqO_~#+Ux;B_D{Nk=grn z8Y0oR^4RqtcYM)7a%@B(XdbZCOqnX#fD{BQTeLvRHd(irHKq=4*jq34`6@VAQR8WG z^%)@5CXnD_T#f%@-l${>y$tfb>2LPmc{~5A82|16mH)R?&r#KKLs7xpN-D`=&Cm^R zvMA6#Ahr<3X>Q7|-qfTY)}32HkAz$_mibYV!I)u>bmjK`qwBe(>za^0Kt*HnFbSdO z1>+ryKCNxmm^)*$XfiDOF2|{-v3KKB?&!(S_Y=Ht@|ir^hLd978xuI&N{k>?(*f8H z=ClxVJK_%_z1TH0eUwm2J+2To7FK4o+n_na)&#VLn1m;!+CX+~WC+qg1?PA~KdOlC zW)C@pw75_xoe=w7i|r9KGIvQ$+3K?L{7TGHwrQM{dCp=Z*D}3kX7E-@sZnup!BImw z*T#a=+WcTwL78exTgBn|iNE3#EsOorO z*kt)gDzHiPt07fmisA2LWN?AymkdqTgr?=loT7z@d`wnlr6oN}@o|&JX!yPzC*Y8d zu6kWlTzE1)ckyBn+0Y^HMN+GA$wUO_LN6W>mxCo!0?oiQvT`z$jbSEu&{UHRU0E8# z%B^wOc@S!yhMT49Y)ww(Xta^8pmPCe@eI5C*ed96)AX9<>))nKx0(sci8gwob_1}4 z0DIL&vsJ1_s%<@y%U*-eX z5rN&(zef-5G~?@r79oZGW1d!WaTqQn0F6RIOa9tJ=0(kdd{d1{<*tHT#cCvl*i>YY zH+L7jq8xZNcTUBqj(S)ztTU!TM!RQ}In*n&Gn<>(60G7}4%WQL!o>hbJqNDSGwl#H z`4k+twp0cj%PsS+NKaxslAEu9!#U3xT1|_KB6`h=PI0SW`P9GTa7caD1}vKEglV8# zjKZR`pluCW19c2fM&ZG)c3T3Um;ir3y(tSCJ7Agl6|b524dy5El{^EQBG?E61H0XY z`bqg!;zhGhyMFl&(o=JWEJ8n~z)xI}A@C0d2hQGvw7nGv)?POU@(kS1m=%`|+^ika zXl8zjS?xqW$WlO?Ewa;vF~XbybHBor$f<%I&*t$F5fynwZlTGj|IjZtVfGa7l&tK} zW>I<69w(cZLu)QIVG|M2xzW@S+70NinQzk&Y0+3WT*cC)rx~04O-^<{JohU_&HL5XdUKW!uFy|i$FB|EMu0eUyW;gsf`XfIc!Z0V zeK&*hPL}f_cX=@iv>K%S5kL;cl_$v?n(Q9f_cChk8Lq$glT|=e+T*8O4H2n<=NGmn z+2*h+v;kBvF>}&0RDS>)B{1!_*XuE8A$Y=G8w^qGMtfudDBsD5>T5SB;Qo}fSkkiV ze^K^M(UthkwrD!&*tTsu>Dacdj_q`~V%r_twr$(Ct&_dKeeXE?fA&4&yASJWJ*}~- zel=@W)tusynfC_YqH4ll>4Eg`Xjs5F7Tj>tTLz<0N3)X<1px_d2yUY>X~y>>93*$) z5PuNMQLf9Bu?AAGO~a_|J2akO1M*@VYN^VxvP0F$2>;Zb9;d5Yfd8P%oFCCoZE$ z4#N$^J8rxYjUE_6{T%Y>MmWfHgScpuGv59#4u6fpTF%~KB^Ae`t1TD_^Ud#DhL+Dm zbY^VAM#MrAmFj{3-BpVSWph2b_Y6gCnCAombVa|1S@DU)2r9W<> zT5L8BB^er3zxKt1v(y&OYk!^aoQisqU zH(g@_o)D~BufUXcPt!Ydom)e|aW{XiMnes2z&rE?og>7|G+tp7&^;q?Qz5S5^yd$i z8lWr4g5nctBHtigX%0%XzIAB8U|T6&JsC4&^hZBw^*aIcuNO47de?|pGXJ4t}BB`L^d8tD`H`i zqrP8?#J@8T#;{^B!KO6J=@OWKhAerih(phML`(Rg7N1XWf1TN>=Z3Do{l_!d~DND&)O)D>ta20}@Lt77qSnVsA7>)uZAaT9bsB>u&aUQl+7GiY2|dAEg@%Al3i316y;&IhQL^8fw_nwS>f60M_-m+!5)S_6EPM7Y)(Nq^8gL7(3 zOiot`6Wy6%vw~a_H?1hLVzIT^i1;HedHgW9-P#)}Y6vF%C=P70X0Tk^z9Te@kPILI z_(gk!k+0%CG)%!WnBjjw*kAKs_lf#=5HXC00s-}oM-Q1aXYLj)(1d!_a7 z*Gg4Fe6F$*ujVjI|79Z5+Pr`us%zW@ln++2l+0hsngv<{mJ%?OfSo_3HJXOCys{Ug z00*YR-(fv<=&%Q!j%b-_ppA$JsTm^_L4x`$k{VpfLI(FMCap%LFAyq;#ns5bR7V+x zO!o;c5y~DyBPqdVQX)8G^G&jWkBy2|oWTw>)?5u}SAsI$RjT#)lTV&Rf8;>u*qXnb z8F%Xb=7#$m)83z%`E;49)t3fHInhtc#kx4wSLLms!*~Z$V?bTyUGiS&m>1P(952(H zuHdv=;o*{;5#X-uAyon`hP}d#U{uDlV?W?_5UjJvf%11hKwe&(&9_~{W)*y1nR5f_ z!N(R74nNK`y8>B!0Bt_Vr!;nc3W>~RiKtGSBkNlsR#-t^&;$W#)f9tTlZz>n*+Fjz z3zXZ;jf(sTM(oDzJt4FJS*8c&;PLTW(IQDFs_5QPy+7yhi1syPCarvqrHFcf&yTy)^O<1EBx;Ir`5W{TIM>{8w&PB>ro4;YD<5LF^TjTb0!zAP|QijA+1Vg>{Afv^% zmrkc4o6rvBI;Q8rj4*=AZacy*n8B{&G3VJc)so4$XUoie0)vr;qzPZVbb<#Fc=j+8CGBWe$n|3K& z_@%?{l|TzKSlUEO{U{{%Fz_pVDxs7i9H#bnbCw7@4DR=}r_qV!Zo~CvD4ZI*+j3kO zW6_=|S`)(*gM0Z;;}nj`73OigF4p6_NPZQ-Od~e$c_);;4-7sR>+2u$6m$Gf%T{aq zle>e3(*Rt(TPD}03n5)!Ca8Pu!V}m6v0o1;5<1h$*|7z|^(3$Y&;KHKTT}hV056wuF0Xo@mK-52~r=6^SI1NC%c~CC?n>yX6wPTgiWYVz!Sx^atLby9YNn1Rk{g?|pJaxD4|9cUf|V1_I*w zzxK)hRh9%zOl=*$?XUjly5z8?jPMy%vEN)f%T*|WO|bp5NWv@B(K3D6LMl!-6dQg0 zXNE&O>Oyf%K@`ngCvbGPR>HRg5!1IV$_}m@3dWB7x3t&KFyOJn9pxRXCAzFr&%37wXG;z^xaO$ekR=LJG ztIHpY8F5xBP{mtQidqNRoz= z@){+N3(VO5bD+VrmS^YjG@+JO{EOIW)9=F4v_$Ed8rZtHvjpiEp{r^c4F6Ic#ChlC zJX^DtSK+v(YdCW)^EFcs=XP7S>Y!4=xgmv>{S$~@h=xW-G4FF9?I@zYN$e5oF9g$# zb!eVU#J+NjLyX;yb)%SY)xJdvGhsnE*JEkuOVo^k5PyS=o#vq!KD46UTW_%R=Y&0G zFj6bV{`Y6)YoKgqnir2&+sl+i6foAn-**Zd1{_;Zb7Ki=u394C5J{l^H@XN`_6XTKY%X1AgQM6KycJ+= zYO=&t#5oSKB^pYhNdzPgH~aEGW2=ec1O#s-KG z71}LOg@4UEFtp3GY1PBemXpNs6UK-ax*)#$J^pC_me;Z$Je(OqLoh|ZrW*mAMBFn< zHttjwC&fkVfMnQeen8`Rvy^$pNRFVaiEN4Pih*Y3@jo!T0nsClN)pdrr9AYLcZxZ| zJ5Wlj+4q~($hbtuY zVQ7hl>4-+@6g1i`1a)rvtp-;b0>^`Dloy(#{z~ytgv=j4q^Kl}wD>K_Y!l~ zp(_&7sh`vfO(1*MO!B%<6E_bx1)&s+Ae`O)a|X=J9y~XDa@UB`m)`tSG4AUhoM=5& znWoHlA-(z@3n0=l{E)R-p8sB9XkV zZ#D8wietfHL?J5X0%&fGg@MH~(rNS2`GHS4xTo7L$>TPme+Is~!|79=^}QbPF>m%J zFMkGzSndiPO|E~hrhCeo@&Ea{M(ieIgRWMf)E}qeTxT8Q#g-!Lu*x$v8W^M^>?-g= zwMJ$dThI|~M06rG$Sv@C@tWR>_YgaG&!BAbkGggVQa#KdtDB)lMLNVLN|51C@F^y8 zCRvMB^{GO@j=cHfmy}_pCGbP%xb{pNN>? z?7tBz$1^zVaP|uaatYaIN+#xEN4jBzwZ|YI_)p(4CUAz1ZEbDk>J~Y|63SZaak~#0 zoYKruYsWHoOlC1(MhTnsdUOwQfz5p6-D0}4;DO$B;7#M{3lSE^jnTT;ns`>!G%i*F?@pR1JO{QTuD0U+~SlZxcc8~>IB{)@8p`P&+nDxNj`*gh|u?yrv$phpQcW)Us)bi`kT%qLj(fi{dWRZ%Es2!=3mI~UxiW0$-v3vUl?#g{p6eF zMEUAqo5-L0Ar(s{VlR9g=j7+lt!gP!UN2ICMokAZ5(Agd>})#gkA2w|5+<%-CuEP# zqgcM}u@3(QIC^Gx<2dbLj?cFSws_f3e%f4jeR?4M^M3cx1f+Qr6ydQ>n)kz1s##2w zk}UyQc+Z5G-d-1}{WzjkLXgS-2P7auWSJ%pSnD|Uivj5u!xk0 z_^-N9r9o;(rFDt~q1PvE#iJZ_f>J3gcP$)SOqhE~pD2|$=GvpL^d!r z6u=sp-CrMoF7;)}Zd7XO4XihC4ji?>V&(t^?@3Q&t9Mx=qex6C9d%{FE6dvU6%d94 zIE;hJ1J)cCqjv?F``7I*6bc#X)JW2b4f$L^>j{*$R`%5VHFi*+Q$2;nyieduE}qdS{L8y8F08yLs?w}{>8>$3236T-VMh@B zq-nujsb_1aUv_7g#)*rf9h%sFj*^mIcImRV*k~Vmw;%;YH(&ylYpy!&UjUVqqtfG` zox3esju?`unJJA_zKXRJP)rA3nXc$m^{S&-p|v|-0x9LHJm;XIww7C#R$?00l&Yyj z=e}gKUOpsImwW?N)+E(awoF@HyP^EhL+GlNB#k?R<2>95hz!h9sF@U20DHSB3~WMa zk90+858r@-+vWwkawJ)8ougd(i#1m3GLN{iSTylYz$brAsP%=&m$mQQrH$g%3-^VR zE%B`Vi&m8f3T~&myTEK28BDWCVzfWir1I?03;pX))|kY5ClO^+bae z*7E?g=3g7EiisYOrE+lA)2?Ln6q2*HLNpZEWMB|O-JI_oaHZB%CvYB(%=tU= zE*OY%QY58fW#RG5=gm0NR#iMB=EuNF@)%oZJ}nmm=tsJ?eGjia{e{yuU0l3{d^D@)kVDt=1PE)&tf_hHC%0MB znL|CRCPC}SeuVTdf>-QV70`0(EHizc21s^sU>y%hW0t!0&y<7}Wi-wGy>m%(-jsDj zP?mF|>p_K>liZ6ZP(w5(|9Ga%>tLgb$|doDDfkdW>Z z`)>V2XC?NJT26mL^@ zf+IKr27TfM!UbZ@?zRddC7#6ss1sw%CXJ4FWC+t3lHZupzM77m^=9 z&(a?-LxIq}*nvv)y?27lZ{j zifdl9hyJudyP2LpU$-kXctshbJDKS{WfulP5Dk~xU4Le4c#h^(YjJit4#R8_khheS z|8(>2ibaHES4+J|DBM7I#QF5u-*EdN{n=Kt@4Zt?@Tv{JZA{`4 zU#kYOv{#A&gGPwT+$Ud}AXlK3K7hYzo$(fBSFjrP{QQ zeaKg--L&jh$9N}`pu{Bs>?eDFPaWY4|9|foN%}i;3%;@4{dc+iw>m}{3rELqH21G! z`8@;w-zsJ1H(N3%|1B@#ioLOjib)j`EiJqPQVSbPSPVHCj6t5J&(NcWzBrzCiDt{4 zdlPAUKldz%6x5II1H_+jv)(xVL+a;P+-1hv_pM>gMRr%04@k;DTokASSKKhU1Qms| zrWh3a!b(J3n0>-tipg{a?UaKsP7?+|@A+1WPDiQIW1Sf@qDU~M_P65_s}7(gjTn0X zucyEm)o;f8UyshMy&>^SC3I|C6jR*R_GFwGranWZe*I>K+0k}pBuET&M~ z;Odo*ZcT?ZpduHyrf8E%IBFtv;JQ!N_m>!sV6ly$_1D{(&nO~w)G~Y`7sD3#hQk%^ zp}ucDF_$!6DAz*PM8yE(&~;%|=+h(Rn-=1Wykas_-@d&z#=S}rDf`4w(rVlcF&lF! z=1)M3YVz7orwk^BXhslJ8jR);sh^knJW(Qmm(QdSgIAIdlN4Te5KJisifjr?eB{FjAX1a0AB>d?qY4Wx>BZ8&}5K0fA+d{l8 z?^s&l8#j7pR&ijD?0b%;lL9l$P_mi2^*_OL+b}4kuLR$GAf85sOo02?Y#90}CCDiS zZ%rbCw>=H~CBO=C_JVV=xgDe%b4FaEFtuS7Q1##y686r%F6I)s-~2(}PWK|Z8M+Gu zl$y~5@#0Ka%$M<&Cv%L`a8X^@tY&T7<0|(6dNT=EsRe0%kp1Qyq!^43VAKYnr*A5~ zsI%lK1ewqO;0TpLrT9v}!@vJK{QoVa_+N4FYT#h?Y8rS1S&-G+m$FNMP?(8N`MZP zels(*?kK{{^g9DOzkuZXJ2;SrOQsp9T$hwRB1(phw1c7`!Q!by?Q#YsSM#I12RhU{$Q+{xj83axHcftEc$mNJ8_T7A-BQc*k(sZ+~NsO~xAA zxnbb%dam_fZlHvW7fKXrB~F&jS<4FD2FqY?VG?ix*r~MDXCE^WQ|W|WM;gsIA4lQP zJ2hAK@CF*3*VqPr2eeg6GzWFlICi8S>nO>5HvWzyZTE)hlkdC_>pBej*>o0EOHR|) z$?};&I4+_?wvL*g#PJ9)!bc#9BJu1(*RdNEn>#Oxta(VWeM40ola<0aOe2kSS~{^P zDJBd}0L-P#O-CzX*%+$#v;(x%<*SPgAje=F{Zh-@ucd2DA(yC|N_|ocs*|-!H%wEw z@Q!>siv2W;C^^j^59OAX03&}&D*W4EjCvfi(ygcL#~t8XGa#|NPO+*M@Y-)ctFA@I z-p7npT1#5zOLo>7q?aZpCZ=iecn3QYklP;gF0bq@>oyBq94f6C=;Csw3PkZ|5q=(c zfs`aw?II0e(h=|7o&T+hq&m$; zBrE09Twxd9BJ2P+QPN}*OdZ-JZV7%av@OM7v!!NL8R;%WFq*?{9T3{ct@2EKgc8h) zMxoM$SaF#p<`65BwIDfmXG6+OiK0e)`I=!A3E`+K@61f}0e z!2a*FOaDrOe>U`q%K!QN`&=&0C~)CaL3R4VY(NDt{Xz(Xpqru5=r#uQN1L$Je1*dkdqQ*=lofQaN%lO!<5z9ZlHgxt|`THd>2 zsWfU$9=p;yLyJyM^t zS2w9w?Bpto`@H^xJpZDKR1@~^30Il6oFGfk5%g6w*C+VM)+%R@gfIwNprOV5{F^M2 zO?n3DEzpT+EoSV-%OdvZvNF+pDd-ZVZ&d8 zKeIyrrfPN=EcFRCPEDCVflX#3-)Ik_HCkL(ejmY8vzcf-MTA{oHk!R2*36`O68$7J zf}zJC+bbQk--9Xm!u#lgLvx8TXx2J258E5^*IZ(FXMpq$2LUUvhWQPs((z1+2{Op% z?J}9k5^N=z;7ja~zi8a_-exIqWUBJwohe#4QJ`|FF*$C{lM18z^#hX6!5B8KAkLUX ziP=oti-gpV(BsLD{0(3*dw}4JxK23Y7M{BeFPucw!sHpY&l%Ws4pSm`+~V7;bZ%Dx zeI)MK=4vC&5#;2MT7fS?^ch9?2;%<8Jlu-IB&N~gg8t;6S-#C@!NU{`p7M8@2iGc& zg|JPg%@gCoCQ&s6JvDU&`X2S<57f(k8nJ1wvBu{8r?;q3_kpZZ${?|( z+^)UvR33sjSd)aT!UPkA;ylO6{aE3MQa{g%Mcf$1KONcjO@&g5zPHWtzM1rYC{_K> zgQNcs<{&X{OA=cEWw5JGqpr0O>x*Tfak2PE9?FuWtz^DDNI}rwAaT0(bdo-<+SJ6A z&}S%boGMWIS0L}=S>|-#kRX;e^sUsotry(MjE|3_9duvfc|nwF#NHuM-w7ZU!5ei8 z6Mkf>2)WunY2eU@C-Uj-A zG(z0Tz2YoBk>zCz_9-)4a>T46$(~kF+Y{#sA9MWH%5z#zNoz)sdXq7ZR_+`RZ%0(q zC7&GyS_|BGHNFl8Xa%@>iWh%Gr?=J5<(!OEjauj5jyrA-QXBjn0OAhJJ9+v=!LK`` z@g(`^*84Q4jcDL`OA&ZV60djgwG`|bcD*i50O}Q{9_noRg|~?dj%VtKOnyRs$Uzqg z191aWoR^rDX#@iSq0n z?9Sg$WSRPqSeI<}&n1T3!6%Wj@5iw5`*`Btni~G=&;J+4`7g#OQTa>u`{4ZZ(c@s$ zK0y;ySOGD-UTjREKbru{QaS>HjN<2)R%Nn-TZiQ(Twe4p@-saNa3~p{?^V9Nixz@a zykPv~<@lu6-Ng9i$Lrk(xi2Tri3q=RW`BJYOPC;S0Yly%77c727Yj-d1vF!Fuk{Xh z)lMbA69y7*5ufET>P*gXQrxsW+ zz)*MbHZv*eJPEXYE<6g6_M7N%#%mR{#awV3i^PafNv(zyI)&bH?F}2s8_rR(6%!V4SOWlup`TKAb@ee>!9JKPM=&8g#BeYRH9FpFybxBXQI2|g}FGJfJ+ zY-*2hB?o{TVL;Wt_ek;AP5PBqfDR4@Z->_182W z{P@Mc27j6jE*9xG{R$>6_;i=y{qf(c`5w9fa*`rEzX6t!KJ(p1H|>J1pC-2zqWENF zmm=Z5B4u{cY2XYl(PfrInB*~WGWik3@1oRhiMOS|D;acnf-Bs(QCm#wR;@Vf!hOPJ zgjhDCfDj$HcyVLJ=AaTbQ{@vIv14LWWF$=i-BDoC11}V;2V8A`S>_x)vIq44-VB-v z*w-d}$G+Ql?En8j!~ZkCpQ$|cA0|+rrY>tiCeWxkRGPoarxlGU2?7%k#F693RHT24 z-?JsiXlT2PTqZqNb&sSc>$d;O4V@|b6VKSWQb~bUaWn1Cf0+K%`Q&Wc<>mQ>*iEGB zbZ;aYOotBZ{vH3y<0A*L0QVM|#rf*LIsGx(O*-7)r@yyBIzJnBFSKBUSl1e|8lxU* zzFL+YDVVkIuzFWeJ8AbgN&w(4-7zbiaMn{5!JQXu)SELk*CNL+Fro|2v|YO)1l15t zs(0^&EB6DPMyaqvY>=KL>)tEpsn;N5Q#yJj<9}ImL((SqErWN3Q=;tBO~ExTCs9hB z2E$7eN#5wX4<3m^5pdjm#5o>s#eS_Q^P)tm$@SawTqF*1dj_i#)3};JslbLKHXl_N z)Fxzf>FN)EK&Rz&*|6&%Hs-^f{V|+_vL1S;-1K-l$5xiC@}%uDuwHYhmsV?YcOUlk zOYkG5v2+`+UWqpn0aaaqrD3lYdh0*!L`3FAsNKu=Q!vJu?Yc8n|CoYyDo_`r0mPoo z8>XCo$W4>l(==h?2~PoRR*kEe)&IH{1sM41mO#-36`02m#nTX{r*r`Q5rZ2-sE|nA zhnn5T#s#v`52T5|?GNS`%HgS2;R(*|^egNPDzzH_z^W)-Q98~$#YAe)cEZ%vge965AS_am#DK#pjPRr-!^za8>`kksCAUj(Xr*1NW5~e zpypt_eJpD&4_bl_y?G%>^L}=>xAaV>KR6;^aBytqpiHe%!j;&MzI_>Sx7O%F%D*8s zSN}cS^<{iiK)=Ji`FpO#^zY!_|D)qeRNAtgmH)m;qC|mq^j(|hL`7uBz+ULUj37gj zksdbnU+LSVo35riSX_4z{UX=%n&}7s0{WuZYoSfwAP`8aKN9P@%e=~1`~1ASL-z%# zw>DO&ixr}c9%4InGc*_y42bdEk)ZdG7-mTu0bD@_vGAr*NcFoMW;@r?@LUhRI zCUJgHb`O?M3!w)|CPu~ej%fddw20lod?Ufp8Dmt0PbnA0J%KE^2~AIcnKP()025V> zG>noSM3$5Btmc$GZoyP^v1@Poz0FD(6YSTH@aD0}BXva?LphAiSz9f&Y(aDAzBnUh z?d2m``~{z;{}kZJ>a^wYI?ry(V9hIoh;|EFc0*-#*`$T0DRQ1;WsqInG;YPS+I4{g zJGpKk%%Sdc5xBa$Q^_I~(F97eqDO7AN3EN0u)PNBAb+n+ zWBTxQx^;O9o0`=g+Zrt_{lP!sgWZHW?8bLYS$;1a@&7w9rD9|Ge;Gb?sEjFoF9-6v z#!2)t{DMHZ2@0W*fCx;62d#;jouz`R5Y(t{BT=$N4yr^^o$ON8d{PQ=!O zX17^CrdM~7D-;ZrC!||<+FEOxI_WI3CA<35va%4v>gc zEX-@h8esj=a4szW7x{0g$hwoWRQG$yK{@3mqd-jYiVofJE!Wok1* znV7Gm&Ssq#hFuvj1sRyHg(6PFA5U*Q8Rx>-blOs=lb`qa{zFy&n4xY;sd$fE+<3EI z##W$P9M{B3c3Si9gw^jlPU-JqD~Cye;wr=XkV7BSv#6}DrsXWFJ3eUNrc%7{=^sP> zrp)BWKA9<}^R9g!0q7yWlh;gr_TEOD|#BmGq<@IV;ueg+D2}cjpp+dPf&Q(36sFU&K8}hA85U61faW&{ zlB`9HUl-WWCG|<1XANN3JVAkRYvr5U4q6;!G*MTdSUt*Mi=z_y3B1A9j-@aK{lNvx zK%p23>M&=KTCgR!Ee8c?DAO2_R?B zkaqr6^BSP!8dHXxj%N1l+V$_%vzHjqvu7p@%Nl6;>y*S}M!B=pz=aqUV#`;h%M0rU zHfcog>kv3UZAEB*g7Er@t6CF8kHDmKTjO@rejA^ULqn!`LwrEwOVmHx^;g|5PHm#B zZ+jjWgjJ!043F+&#_;D*mz%Q60=L9Ove|$gU&~As5^uz@2-BfQ!bW)Khn}G+Wyjw- z19qI#oB(RSNydn0t~;tAmK!P-d{b-@@E5|cdgOS#!>%#Rj6ynkMvaW@37E>@hJP^8 z2zk8VXx|>#R^JCcWdBCy{0nPmYFOxN55#^-rlqobe0#L6)bi?E?SPymF*a5oDDeSd zO0gx?#KMoOd&G(2O@*W)HgX6y_aa6iMCl^~`{@UR`nMQE`>n_{_aY5nA}vqU8mt8H z`oa=g0SyiLd~BxAj2~l$zRSDHxvDs;I4>+M$W`HbJ|g&P+$!U7-PHX4RAcR0szJ*( ze-417=bO2q{492SWrqDK+L3#ChUHtz*@MP)e^%@>_&#Yk^1|tv@j4%3T)diEX zATx4K*hcO`sY$jk#jN5WD<=C3nvuVsRh||qDHnc~;Kf59zr0;c7VkVSUPD%NnnJC_ zl3F^#f_rDu8l}l8qcAz0FFa)EAt32IUy_JLIhU_J^l~FRH&6-ivSpG2PRqzDdMWft>Zc(c)#tb%wgmWN%>IOPm zZi-noqS!^Ftb81pRcQi`X#UhWK70hy4tGW1mz|+vI8c*h@ zfFGJtW3r>qV>1Z0r|L>7I3un^gcep$AAWfZHRvB|E*kktY$qQP_$YG60C@X~tTQjB3%@`uz!qxtxF+LE!+=nrS^07hn` zEgAp!h|r03h7B!$#OZW#ACD+M;-5J!W+{h|6I;5cNnE(Y863%1(oH}_FTW})8zYb$7czP zg~Szk1+_NTm6SJ0MS_|oSz%e(S~P-&SFp;!k?uFayytV$8HPwuyELSXOs^27XvK-D zOx-Dl!P|28DK6iX>p#Yb%3`A&CG0X2S43FjN%IB}q(!hC$fG}yl1y9W&W&I@KTg6@ zK^kpH8=yFuP+vI^+59|3%Zqnb5lTDAykf z9S#X`3N(X^SpdMyWQGOQRjhiwlj!0W-yD<3aEj^&X%=?`6lCy~?`&WSWt z?U~EKFcCG_RJ(Qp7j=$I%H8t)Z@6VjA#>1f@EYiS8MRHZphp zMA_5`znM=pzUpBPO)pXGYpQ6gkine{6u_o!P@Q+NKJ}k!_X7u|qfpAyIJb$_#3@wJ z<1SE2Edkfk9C!0t%}8Yio09^F`YGzpaJHGk*-ffsn85@)%4@`;Fv^8q(-Wk7r=Q8p zT&hD`5(f?M{gfzGbbwh8(}G#|#fDuk7v1W)5H9wkorE0ZZjL0Q1=NRGY>zwgfm81DdoaVwNH;or{{eSyybt)m<=zXoA^RALYG-2t zouH|L*BLvmm9cdMmn+KGopyR@4*=&0&4g|FLoreZOhRmh=)R0bg~ zT2(8V_q7~42-zvb)+y959OAv!V$u(O3)%Es0M@CRFmG{5sovIq4%8Ahjk#*5w{+)+ zMWQoJI_r$HxL5km1#6(e@{lK3Udc~n0@g`g$s?VrnQJ$!oPnb?IHh-1qA`Rz$)Ai< z6w$-MJW-gKNvOhL+XMbE7&mFt`x1KY>k4(!KbbpZ`>`K@1J<(#vVbjx@Z@(6Q}MF# zMnbr-f55(cTa^q4+#)=s+ThMaV~E`B8V=|W_fZWDwiso8tNMTNse)RNBGi=gVwgg% zbOg8>mbRN%7^Um-7oj4=6`$|(K7!+t^90a{$18Z>}<#!bm%ZEFQ{X(yBZMc>lCz0f1I2w9Sq zuGh<9<=AO&g6BZte6hn>Qmvv;Rt)*cJfTr2=~EnGD8P$v3R|&1RCl&7)b+`=QGapi zPbLg_pxm`+HZurtFZ;wZ=`Vk*do~$wB zxoW&=j0OTbQ=Q%S8XJ%~qoa3Ea|au5o}_(P;=!y-AjFrERh%8la!z6Fn@lR?^E~H12D?8#ht=1F;7@o4$Q8GDj;sSC%Jfn01xgL&%F2 zwG1|5ikb^qHv&9hT8w83+yv&BQXOQyMVJSBL(Ky~p)gU3#%|blG?IR9rP^zUbs7rOA0X52Ao=GRt@C&zlyjNLv-} z9?*x{y(`509qhCV*B47f2hLrGl^<@SuRGR!KwHei?!CM10Tq*YDIoBNyRuO*>3FU? zHjipIE#B~y3FSfOsMfj~F9PNr*H?0oHyYB^G(YyNh{SxcE(Y-`x5jFMKb~HO*m+R% zrq|ic4fzJ#USpTm;X7K+E%xsT_3VHKe?*uc4-FsILUH;kL>_okY(w`VU*8+l>o>Jm ziU#?2^`>arnsl#)*R&nf_%>A+qwl%o{l(u)M?DK1^mf260_oteV3#E_>6Y4!_hhVD zM8AI6MM2V*^_M^sQ0dmHu11fy^kOqXqzpr?K$`}BKWG`=Es(9&S@K@)ZjA{lj3ea7_MBP zk(|hBFRjHVMN!sNUkrB;(cTP)T97M$0Dtc&UXSec<+q?y>5=)}S~{Z@ua;1xt@=T5 zI7{`Z=z_X*no8s>mY;>BvEXK%b`a6(DTS6t&b!vf_z#HM{Uoy_5fiB(zpkF{})ruka$iX*~pq1ZxD?q68dIo zIZSVls9kFGsTwvr4{T_LidcWtt$u{kJlW7moRaH6+A5hW&;;2O#$oKyEN8kx`LmG)Wfq4ykh+q{I3|RfVpkR&QH_x;t41Uw z`P+tft^E2B$domKT@|nNW`EHwyj>&}K;eDpe z1bNOh=fvIfk`&B61+S8ND<(KC%>y&?>opCnY*r5M+!UrWKxv0_QvTlJc>X#AaI^xo zaRXL}t5Ej_Z$y*|w*$6D+A?Lw-CO-$itm^{2Ct82-<0IW)0KMNvJHgBrdsIR0v~=H z?n6^}l{D``Me90`^o|q!olsF?UX3YSq^6Vu>Ijm>>PaZI8G@<^NGw{Cx&%|PwYrfw zR!gX_%AR=L3BFsf8LxI|K^J}deh0ZdV?$3r--FEX`#INxsOG6_=!v)DI>0q|BxT)z z-G6kzA01M?rba+G_mwNMQD1mbVbNTWmBi*{s_v_Ft9m2Avg!^78(QFu&n6mbRJ2bA zv!b;%yo{g*9l2)>tsZJOOp}U~8VUH`}$ z8p_}t*XIOehezolNa-a2x0BS})Y9}&*TPgua{Ewn-=wVrmJUeU39EKx+%w%=ixQWK zDLpwaNJs65#6o7Ln7~~X+p_o2BR1g~VCfxLzxA{HlWAI6^H;`juI=&r1jQrUv_q0Z z1Ja-tjdktrrP>GOC*#p?*xfQU5MqjMsBe!9lh(u8)w$e@Z|>aUHI5o;MGw*|Myiz3 z-f0;pHg~Q#%*Kx8MxH%AluVXjG2C$)WL-K63@Q`#y9_k_+}eR(x4~dp7oV-ek0H>I zgy8p#i4GN{>#v=pFYUQT(g&b$OeTy-X_#FDgNF8XyfGY6R!>inYn8IR2RDa&O!(6< znXs{W!bkP|s_YI*Yx%4stI`=ZO45IK6rBs`g7sP40ic}GZ58s?Mc$&i`kq_tfci>N zIHrC0H+Qpam1bNa=(`SRKjixBTtm&e`j9porEci!zdlg1RI0Jw#b(_Tb@RQK1Zxr_ z%7SUeH6=TrXt3J@js`4iDD0=IoHhK~I7^W8^Rcp~Yaf>2wVe|Hh1bUpX9ATD#moByY57-f2Ef1TP^lBi&p5_s7WGG9|0T}dlfxOx zXvScJO1Cnq`c`~{Dp;{;l<-KkCDE+pmexJkd}zCgE{eF=)K``-qC~IT6GcRog_)!X z?fK^F8UDz$(zFUrwuR$qro5>qqn>+Z%<5>;_*3pZ8QM|yv9CAtrAx;($>4l^_$_-L z*&?(77!-=zvnCVW&kUcZMb6;2!83si518Y%R*A3JZ8Is|kUCMu`!vxDgaWjs7^0j( ziTaS4HhQ)ldR=r)_7vYFUr%THE}cPF{0H45FJ5MQW^+W>P+eEX2kLp3zzFe*-pFVA zdDZRybv?H|>`9f$AKVjFWJ=wegO7hOOIYCtd?Vj{EYLT*^gl35|HQ`R=ti+ADm{jyQE7K@kdjuqJhWVSks>b^ zxha88-h3s;%3_5b1TqFCPTxVjvuB5U>v=HyZ$?JSk+&I%)M7KE*wOg<)1-Iy)8-K! z^XpIt|0ibmk9RtMmlUd7#Ap3Q!q9N4atQy)TmrhrFhfx1DAN`^vq@Q_SRl|V z#lU<~n67$mT)NvHh`%als+G-)x1`Y%4Bp*6Un5Ri9h=_Db zA-AdP!f>f0m@~>7X#uBM?diI@)Egjuz@jXKvm zJo+==juc9_<;CqeRaU9_Mz@;3e=E4=6TK+c`|uu#pIqhSyNm`G(X)&)B`8q0RBv#> z`gGlw(Q=1Xmf55VHj%C#^1lpc>LY8kfA@|rlC1EA<1#`iuyNO z(=;irt{_&K=i4)^x%;U(Xv<)+o=dczC5H3W~+e|f~{*ucxj@{Yi-cw^MqYr3fN zF5D+~!wd$#al?UfMnz(@K#wn`_5na@rRr8XqN@&M&FGEC@`+OEv}sI1hw>Up0qAWf zL#e4~&oM;TVfjRE+10B_gFlLEP9?Q-dARr3xi6nQqnw>k-S;~b z;!0s2VS4}W8b&pGuK=7im+t(`nz@FnT#VD|!)eQNp-W6)@>aA+j~K*H{$G`y2|QHY z|Hmy+CR@#jWY4~)lr1qBJB_RfHJFfP<}pK5(#ZZGSqcpyS&}01LnTWk5fzmXMGHkJ zTP6L^B+uj;lmB_W<~4=${+v0>z31M!-_O@o-O9GyW)j_mjx}!0@br_LE-7SIuPP84 z;5=O(U*g_um0tyG|61N@d9lEuOeiRd+#NY^{nd5;-CVlw&Ap7J?qwM^?E29wvS}2d zbzar4Fz&RSR(-|s!Z6+za&Z zY#D<5q_JUktIzvL0)yq_kLWG6DO{ri=?c!y!f(Dk%G{8)k`Gym%j#!OgXVDD3;$&v@qy#ISJfp=Vm>pls@9-mapVQChAHHd-x+OGx)(*Yr zC1qDUTZ6mM(b_hi!TuFF2k#8uI2;kD70AQ&di$L*4P*Y-@p`jdm%_c3f)XhYD^6M8&#Y$ZpzQMcR|6nsH>b=*R_Von!$BTRj7yGCXokoAQ z&ANvx0-Epw`QIEPgI(^cS2f(Y85yV@ygI{ewyv5Frng)e}KCZF7JbR(&W618_dcEh(#+^zZFY;o<815<5sOHQdeax9_!PyM&;{P zkBa5xymca0#)c#tke@3KNEM8a_mT&1gm;p&&JlMGH(cL(b)BckgMQ^9&vRwj!~3@l zY?L5}=Jzr080OGKb|y`ee(+`flQg|!lo6>=H)X4`$Gz~hLmu2a%kYW_Uu8x09Pa0J zKZ`E$BKJ=2GPj_3l*TEcZ*uYRr<*J^#5pILTT;k_cgto1ZL-%slyc16J~OH-(RgDA z%;EjEnoUkZ&acS{Q8`{i6T5^nywgqQI5bDIymoa7CSZG|WWVk>GM9)zy*bNih|QIm z%0+(Nnc*a_xo;$=!HQYaapLms>J1ToyjtFByY`C2H1wT#178#4+|{H0BBqtCdd$L% z_3Hc60j@{t9~MjM@LBalR&6@>B;9?r<7J~F+WXyYu*y3?px*=8MAK@EA+jRX8{CG?GI-< z54?Dc9CAh>QTAvyOEm0^+x;r2BWX|{3$Y7)L5l*qVE*y0`7J>l2wCmW zL1?|a`pJ-l{fb_N;R(Z9UMiSj6pQjOvQ^%DvhIJF!+Th7jO2~1f1N+(-TyCFYQZYw z4)>7caf^Ki_KJ^Zx2JUb z&$3zJy!*+rCV4%jqwyuNY3j1ZEiltS0xTzd+=itTb;IPYpaf?8Y+RSdVdpacB(bVQ zC(JupLfFp8y43%PMj2}T|VS@%LVp>hv4Y!RPMF?pp8U_$xCJ)S zQx!69>bphNTIb9yn*_yfj{N%bY)t{L1cs8<8|!f$;UQ*}IN=2<6lA;x^(`8t?;+ST zh)z4qeYYgZkIy{$4x28O-pugO&gauRh3;lti9)9Pvw+^)0!h~%m&8Q!AKX%urEMnl z?yEz?g#ODn$UM`+Q#$Q!6|zsq_`dLO5YK-6bJM6ya>}H+vnW^h?o$z;V&wvuM$dR& zeEq;uUUh$XR`TWeC$$c&Jjau2it3#%J-y}Qm>nW*s?En?R&6w@sDXMEr#8~$=b(gk zwDC3)NtAP;M2BW_lL^5ShpK$D%@|BnD{=!Tq)o(5@z3i7Z){} zGr}Exom_qDO{kAVkZ*MbLNHE666Kina#D{&>Jy%~w7yX$oj;cYCd^p9zy z8*+wgSEcj$4{WxKmCF(5o7U4jqwEvO&dm1H#7z}%VXAbW&W24v-tS6N3}qrm1OnE)fUkoE8yMMn9S$?IswS88tQWm4#Oid#ckgr6 zRtHm!mfNl-`d>O*1~d7%;~n+{Rph6BBy^95zqI{K((E!iFQ+h*C3EsbxNo_aRm5gj zKYug($r*Q#W9`p%Bf{bi6;IY0v`pB^^qu)gbg9QHQ7 zWBj(a1YSu)~2RK8Pi#C>{DMlrqFb9e_RehEHyI{n?e3vL_}L>kYJC z_ly$$)zFi*SFyNrnOt(B*7E$??s67EO%DgoZL2XNk8iVx~X_)o++4oaK1M|ou73vA0K^503j@uuVmLcHH4ya-kOIDfM%5%(E z+Xpt~#7y2!KB&)PoyCA+$~DXqxPxxALy!g-O?<9+9KTk4Pgq4AIdUkl`1<1#j^cJg zgU3`0hkHj_jxV>`Y~%LAZl^3o0}`Sm@iw7kwff{M%VwtN)|~!p{AsfA6vB5UolF~d zHWS%*uBDt<9y!9v2Xe|au&1j&iR1HXCdyCjxSgG*L{wmTD4(NQ=mFjpa~xooc6kju z`~+d{j7$h-;HAB04H!Zscu^hZffL#9!p$)9>sRI|Yovm)g@F>ZnosF2EgkU3ln0bR zTA}|+E(tt)!SG)-bEJi_0m{l+(cAz^pi}`9=~n?y&;2eG;d9{M6nj>BHGn(KA2n|O zt}$=FPq!j`p&kQ8>cirSzkU0c08%8{^Qyqi-w2LoO8)^E7;;I1;HQ6B$u0nNaX2CY zSmfi)F`m94zL8>#zu;8|{aBui@RzRKBlP1&mfFxEC@%cjl?NBs`cr^nm){>;$g?rhKr$AO&6qV_Wbn^}5tfFBry^e1`%du2~o zs$~dN;S_#%iwwA_QvmMjh%Qo?0?rR~6liyN5Xmej8(*V9ym*T`xAhHih-v$7U}8=dfXi2i*aAB!xM(Xekg*ix@r|ymDw*{*s0?dlVys2e)z62u1 z+k3esbJE=-P5S$&KdFp+2H7_2e=}OKDrf( z9-207?6$@f4m4B+9E*e((Y89!q?zH|mz_vM>kp*HGXldO0Hg#!EtFhRuOm$u8e~a9 z5(roy7m$Kh+zjW6@zw{&20u?1f2uP&boD}$#Zy)4o&T;vyBoqFiF2t;*g=|1=)PxB z8eM3Mp=l_obbc?I^xyLz?4Y1YDWPa+nm;O<$Cn;@ane616`J9OO2r=rZr{I_Kizyc zP#^^WCdIEp*()rRT+*YZK>V@^Zs=ht32x>Kwe zab)@ZEffz;VM4{XA6e421^h~`ji5r%)B{wZu#hD}f3$y@L0JV9f3g{-RK!A?vBUA}${YF(vO4)@`6f1 z-A|}e#LN{)(eXloDnX4Vs7eH|<@{r#LodP@Nz--$Dg_Par%DCpu2>2jUnqy~|J?eZ zBG4FVsz_A+ibdwv>mLp>P!(t}E>$JGaK$R~;fb{O3($y1ssQQo|5M;^JqC?7qe|hg zu0ZOqeFcp?qVn&Qu7FQJ4hcFi&|nR!*j)MF#b}QO^lN%5)4p*D^H+B){n8%VPUzi! zDihoGcP71a6!ab`l^hK&*dYrVYzJ0)#}xVrp!e;lI!+x+bfCN0KXwUAPU9@#l7@0& QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..84d1f85 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# 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 +# +# https://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. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index b3ac848..0000000 --- a/pom.xml +++ /dev/null @@ -1,190 +0,0 @@ - - - 4.0.0 - - org.jetbrains.kotlinx - kotlinx.reflect.lite - 1.1.0 - jar - https://github.com/Kotlin/kotlinx.reflect.lite - - - 1.3.50 - 4.12 - 2.6.1 - 2.0.14 - 0.1.0 - - true - - UTF-8 - - - - - com.google.protobuf - protobuf-java - ${protobuf.version} - - - org.jetbrains.kotlin - kotlin-stdlib - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-test-junit - ${kotlin.version} - test - - - org.jetbrains.kotlinx - kotlinx-metadata-jvm - ${kotlinx.metadata.version} - - - junit - junit - ${junit.version} - test - - - - - - bintray-kotlin-kotlinx - bintray - https://kotlin.bintray.com/kotlinx - - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - compile - process-sources - - compile - - - - test-compile - process-test-sources - - test-compile - - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.4 - - - - attach-sources - - jar - - - - - - - maven-release-plugin - 2.5.2 - - - true - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 - - - package - - shade - - - ${project.build.directory}/dependency-reduced-pom.xml - - - org.jetbrains.kotlin:kotlin-stdlib - org.jetbrains:annotations - - - - - com.google.protobuf - kotlinx.reflect.lite.protobuf - - - - - - - - - com.github.wvengen - proguard-maven-plugin - ${proguard.plugin.version} - - - process-classes-with-proguard - package - - proguard - - - 1G - ${project.build.finalName}.jar - false - true - false - ${project.basedir}/reflect-lite.pro - - ${java.home}/lib/rt.jar - - 5.2 - - - - - - - maven-compiler-plugin - 3.7.0 - - 1.6 - 1.6 - - - - - - - - bintray - https://api.bintray.com/maven/kotlin/kotlinx.reflect.lite/kotlinx.reflect.lite - - - - - scm:git:https://github.com/Kotlin/kotlinx.reflect.lite.git - https://github.com/Kotlin/kotlinx.reflect.lite - HEAD - - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..d6584d8 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,12 @@ +rootProject.name = "kotlinx.reflect.lite" + +pluginManagement { + resolutionStrategy { + val kotlin_version: String by settings + eachPlugin { + if (requested.id.namespace?.startsWith("org.jetbrains.kotlin") == true) { + useVersion(kotlin_version) + } + } + } +} \ No newline at end of file From 6c0aa0d4638d220c7be6fcf8ddee3af1c92f72d8 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 12 Jan 2022 14:23:24 +0300 Subject: [PATCH 02/74] Initial commit: introduced basic API consistent with reflect-full --- .../kotlinx/reflect/lite/CallableMetadata.kt | 38 ---- .../kotlinx/reflect/lite/ClassMetadata.kt | 105 --------- .../reflect/lite/ConstructorMetadata.kt | 28 --- .../reflect/lite/DeclarationMetadata.kt | 55 ----- .../kotlinx/reflect/lite/FunctionMetadata.kt | 52 ----- .../kotlinx/reflect/lite/KAnnotatedElement.kt | 13 ++ .../java/kotlinx/reflect/lite/KCallable.kt | 85 +++++++ src/main/java/kotlinx/reflect/lite/KClass.kt | 138 ++++++++++++ .../reflect/lite/KDeclarationContainer.kt | 14 ++ .../java/kotlinx/reflect/lite/KFunction.kt | 43 ++++ .../java/kotlinx/reflect/lite/KParameter.kt | 80 +++++++ .../java/kotlinx/reflect/lite/KProperty.kt | 19 ++ src/main/java/kotlinx/reflect/lite/KType.kt | 52 +++++ .../kotlinx/reflect/lite/ParameterMetadata.kt | 39 ---- .../kotlinx/reflect/lite/PropertyMetadata.kt | 37 --- .../kotlinx/reflect/lite/ReflectionLite.kt | 6 +- .../java/kotlinx/reflect/lite/TypeMetadata.kt | 41 ---- .../reflect/lite/impl/CallableMetadataImpl.kt | 21 -- .../reflect/lite/impl/ClassMetadataImpl.kt | 78 ------- .../lite/impl/ConstructorMetadataImpl.kt | 43 ---- .../reflect/lite/impl/FunctionMetadataImpl.kt | 52 ----- .../reflect/lite/impl/KCallableImpl.kt | 5 + .../kotlinx/reflect/lite/impl/KClassImpl.kt | 44 ++++ .../reflect/lite/impl/KConstructorImpl.kt | 33 +++ .../reflect/lite/impl/KFunctionImpl.kt | 34 +++ .../reflect/lite/impl/KParameterImpl.kt | 17 ++ .../reflect/lite/impl/KPropertyImpl.kt | 30 +++ .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 11 + .../lite/impl/ParameterMetadataImpl.kt | 31 --- .../reflect/lite/impl/PropertyMetadataImpl.kt | 45 ---- .../reflect/lite/impl/ReflectionLiteImpl.kt | 164 +------------- .../reflect/lite/impl/TypeMetadataImpl.kt | 29 --- .../java/kotlinx/reflect/lite/impl/util.kt | 42 ---- .../reflect/lite/test/BasicReflectTest.kt | 89 ++++++++ .../kotlinx/reflect/lite/test/SmokeTest.kt | 210 ------------------ .../kotlinx/reflect/lite/test/testData.kt | 22 ++ 36 files changed, 738 insertions(+), 1107 deletions(-) delete mode 100644 src/main/java/kotlinx/reflect/lite/CallableMetadata.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/ClassMetadata.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/ConstructorMetadata.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/DeclarationMetadata.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/FunctionMetadata.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KCallable.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KClass.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KFunction.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KParameter.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KProperty.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KType.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/ParameterMetadata.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/PropertyMetadata.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/TypeMetadata.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/CallableMetadataImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/ClassMetadataImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/ConstructorMetadataImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/FunctionMetadataImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/ParameterMetadataImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/PropertyMetadataImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/TypeMetadataImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/util.kt create mode 100644 src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/test/SmokeTest.kt diff --git a/src/main/java/kotlinx/reflect/lite/CallableMetadata.kt b/src/main/java/kotlinx/reflect/lite/CallableMetadata.kt deleted file mode 100644 index 66fa1e7..0000000 --- a/src/main/java/kotlinx/reflect/lite/CallableMetadata.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -/** - * Provides access to the metadata of callable Kotlin declarations: functions, properties and constructors. - */ -interface CallableMetadata : DeclarationMetadata { - /** - * Name of this callable declaration, as declared in the source code. Constructors have the name "".` - */ - val name: String - - /** - * Metadata for the parameters of this callable declaration, in the declaration order. - * If this declaration is a property, an empty list is returned. - */ - val parameters: List - - /** - * Metadata for the type of the extension receiver of this function or property, or `null` if this callable is not an extension. - */ - val extensionReceiverType: TypeMetadata? -} diff --git a/src/main/java/kotlinx/reflect/lite/ClassMetadata.kt b/src/main/java/kotlinx/reflect/lite/ClassMetadata.kt deleted file mode 100644 index 7c67982..0000000 --- a/src/main/java/kotlinx/reflect/lite/ClassMetadata.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -import java.lang.reflect.Constructor -import java.lang.reflect.Field -import java.lang.reflect.Method - -/** - * Provides access to the metadata of a Kotlin class, as well as to the metadata of individual members of this class. - */ -interface ClassMetadata : DeclarationMetadata { - /** - * Metadata for all functions declared in this class, not including functions from supertypes. - */ - val functions: Collection - - /** - * Metadata for all constructors declared in this class. - */ - val constructors: Collection - - /** - * Metadata for all properties declared in this class, not including properties from supertypes. - */ - val properties: Collection - - /** - * Metadata for the given [method] if that method is visible from Kotlin source code and - * belongs to this class, or `null` otherwise. - */ - fun getFunction(method: Method): FunctionMetadata? - - /** - * Metadata for the given [constructor] if that constructor is visible from Kotlin source code and - * belongs to this class, or `null` otherwise. - */ - fun getConstructor(constructor: Constructor<*>): ConstructorMetadata? - - /** - * Metadata for the property, backed by the given [field], or `null` if there's no Kotlin property corresponding to that field. - */ - fun getProperty(field: Field): PropertyMetadata? - - /** - * `true` if this class is a data class. - */ - val isData: Boolean - - /** - * Kind of this class. - */ - val kind: Kind - - /** - * Represents different sorts of classes that can be declared in Kotlin code. - */ - enum class Kind { - /** - * Class, declared simply with the keyword `class`. - * Note that enum classes and annotation classes have separate kinds [ENUM_CLASS] and [ANNOTATION_CLASS]. - */ - CLASS, - - /** - * Interface, declared with the keyword `interface`. - */ - INTERFACE, - - /** - * Enum class, declared with the keywords `enum class`. - */ - ENUM_CLASS, - - /** - * Annotation class, declared with the keywords `annotation class`. - */ - ANNOTATION_CLASS, - - /** - * Object, declared with the keyword `object`. - * Note that companion objects have a separate kind [COMPANION_OBJECT]. - */ - OBJECT, - - /** - * Companion object, declared with the keywords `companion object`. - */ - COMPANION_OBJECT, - } -} diff --git a/src/main/java/kotlinx/reflect/lite/ConstructorMetadata.kt b/src/main/java/kotlinx/reflect/lite/ConstructorMetadata.kt deleted file mode 100644 index a4f2d21..0000000 --- a/src/main/java/kotlinx/reflect/lite/ConstructorMetadata.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -/** - * Provides access to the metadata of a constructor of a Kotlin class. - */ -interface ConstructorMetadata : CallableMetadata { - /** - * Whether this constructor is the primary constructor of the containing class, meaning that its declaration - * is syntactically placed right after the class name and before the class body. - */ - val isPrimary: Boolean -} diff --git a/src/main/java/kotlinx/reflect/lite/DeclarationMetadata.kt b/src/main/java/kotlinx/reflect/lite/DeclarationMetadata.kt deleted file mode 100644 index 4935245..0000000 --- a/src/main/java/kotlinx/reflect/lite/DeclarationMetadata.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -/** - * Provides access to the metadata of any Kotlin declaration. - */ -interface DeclarationMetadata { - /** - * Visibility of this declaration, or `null` if the visibility cannot be represented in Kotlin. - */ - val visibility: Visibility? - - /** - * Represents different visibilities that Kotlin declarations can have. - * - * Note that some Java visibilities such as package-private and protected (which also gives access to items - * from the same package) cannot be represented in Kotlin, so there's no [Visibility] value corresponding to them. - */ - enum class Visibility { - /** - * Visibility of declarations marked with the `public` modifier, or with no modifier at all. - */ - PUBLIC, - - /** - * Visibility of declarations marked with the `protected` modifier. - */ - PROTECTED, - - /** - * Visibility of declarations marked with the `internal` modifier. - */ - INTERNAL, - - /** - * Visibility of declarations marked with the `private` modifier. - */ - PRIVATE, - } -} diff --git a/src/main/java/kotlinx/reflect/lite/FunctionMetadata.kt b/src/main/java/kotlinx/reflect/lite/FunctionMetadata.kt deleted file mode 100644 index 5fa0041..0000000 --- a/src/main/java/kotlinx/reflect/lite/FunctionMetadata.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -/** - * Provides access to the metadata of a Kotlin function. - */ -interface FunctionMetadata : CallableMetadata { - /** - * Metadata for the return type of this function. - */ - val returnType: TypeMetadata - - /** - * `true` if this function is `inline`. - */ - val isInline: Boolean - - /** - * `true` if this function is `external`. - */ - val isExternal: Boolean - - /** - * `true` if this function is `operator`. - */ - val isOperator: Boolean - - /** - * `true` if this function is `infix`. - */ - val isInfix: Boolean - - /** - * `true` if this function is `suspend`. - */ - val isSuspend: Boolean -} diff --git a/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt new file mode 100644 index 0000000..b841080 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt @@ -0,0 +1,13 @@ +package kotlinx.reflect.lite + +/** + * Represents an annotated element and allows to obtain its annotations. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/annotations.html) + * for more information. + */ +public interface KAnnotatedElement { + /** + * Annotations which are present on this element. + */ + //public val annotations: List +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KCallable.kt b/src/main/java/kotlinx/reflect/lite/KCallable.kt new file mode 100644 index 0000000..114ab69 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KCallable.kt @@ -0,0 +1,85 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlinx.reflect.lite + +/** + * Represents a callable entity, such as a function or a property. + * + * @param R return type of the callable. + */ +public interface KCallable : KAnnotatedElement { + /** + * The name of this callable as it was declared in the source code. + * If the callable has no name, a special invented name is created. + * Nameless callables include: + * - constructors have the name "", + * - property accessors: the getter for a property named "foo" will have the name "", + * the setter, similarly, will have the name "". + */ + public val name: String + + /** + * Parameters required to make a call to this callable. + * If this callable requires a `this` instance or an extension receiver parameter, + * they come first in the list in that order. + */ + public val parameters: List + + /** + * The type of values returned by this callable. + */ + // public val returnType: KType + + /** + * The list of type parameters of this callable. + */ +// @SinceKotlin("1.1") +// public val typeParameters: List + + /** + * Calls this callable with the specified list of arguments and returns the result. + * Throws an exception if the number of specified arguments is not equal to the size of [parameters], + * or if their types do not match the types of the parameters. + */ + //public fun call(vararg args: Any?): R + + /** + * Calls this callable with the specified mapping of parameters to arguments and returns the result. + * If a parameter is not found in the mapping and is not optional (as per [KParameter.isOptional]), + * or its type does not match the type of the provided value, an exception is thrown. + */ + //public fun callBy(args: Map): R + + /** + * Visibility of this callable, or `null` if its visibility cannot be represented in Kotlin. + */ + //@SinceKotlin("1.1") + //public val visibility: KVisibility? + + /** + * `true` if this callable is `final`. + */ + @SinceKotlin("1.1") + public val isFinal: Boolean + + /** + * `true` if this callable is `open`. + */ + @SinceKotlin("1.1") + public val isOpen: Boolean + + /** + * `true` if this callable is `abstract`. + */ + @SinceKotlin("1.1") + public val isAbstract: Boolean + + /** + * `true` if this is a suspending function. + */ + @SinceKotlin("1.3") + public val isSuspend: Boolean +} diff --git a/src/main/java/kotlinx/reflect/lite/KClass.kt b/src/main/java/kotlinx/reflect/lite/KClass.kt new file mode 100644 index 0000000..324b363 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KClass.kt @@ -0,0 +1,138 @@ +package kotlinx.reflect.lite + +public interface KClass : KDeclarationContainer, KAnnotatedElement { + /** + * The simple name of the class as it was declared in the source code, + * or `null` if the class has no name (if, for example, it is a class of an anonymous object). + */ + public val simpleName: String? + + /** + * All properties declared in this class, not including properties from supertypes. + */ + public val properties: Collection> + + /** + * All functions declared in this class, not including functions from supertypes. + */ + public val functions: Collection> + + /** + * All constructors declared in this class. + */ + public val constructors: Collection> + + /** + * The fully qualified dot-separated name of the class, + * or `null` if the class is local or a class of an anonymous object. + */ + //public val qualifiedName: String? + + /** + * All classes declared inside this class. This includes both inner and static nested classes. + */ + //public val nestedClasses: Collection> + + /** + * All functions and properties accessible in this class, including those declared in this class + * and all of its superclasses. Does not include constructors. + */ + //override val members: Collection> + + /** + * The instance of the object declaration, or `null` if this class is not an object declaration. + */ +// public val objectInstance: T? + + /** + * Returns `true` if [value] is an instance of this class on a given platform. + */ +// @SinceKotlin("1.1") +// public fun isInstance(value: Any?): Boolean + + /** + * The list of type parameters of this class. This list does *not* include type parameters of outer classes. + */ +// @SinceKotlin("1.1") +// public val typeParameters: List + + /** + * The list of immediate supertypes of this class, in the order they are listed in the source code. + */ +// @SinceKotlin("1.1") +// public val supertypes: List + + /** + * The list of the immediate subclasses if this class is a sealed class, or an empty list otherwise. + */ +// @SinceKotlin("1.3") +// public val sealedSubclasses: List> + + /** + * Visibility of this class, or `null` if its visibility cannot be represented in Kotlin. + */ +// @SinceKotlin("1.1") +// public val visibility: KVisibility? + + /** + * `true` if this class is `final`. + */ + @SinceKotlin("1.1") + public val isFinal: Boolean + + /** + * `true` if this class is `open`. + */ + @SinceKotlin("1.1") + public val isOpen: Boolean + + /** + * `true` if this class is `abstract`. + */ + @SinceKotlin("1.1") + public val isAbstract: Boolean + + /** + * `true` if this class is `sealed`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/sealed-classes.html) + * for more information. + */ + @SinceKotlin("1.1") + public val isSealed: Boolean + + /** + * `true` if this class is a data class. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/data-classes.html) + * for more information. + */ + @SinceKotlin("1.1") + public val isData: Boolean + + /** + * `true` if this class is an inner class. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/nested-classes.html#inner-classes) + * for more information. + */ + @SinceKotlin("1.1") + public val isInner: Boolean + + /** + * `true` if this class is a companion object. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects) + * for more information. + */ + @SinceKotlin("1.1") + public val isCompanion: Boolean + + /** + * `true` if this class is a Kotlin functional interface. + */ + @SinceKotlin("1.4") + public val isFun: Boolean + + /** + * `true` if this class is a value class. + */ + @SinceKotlin("1.5") + public val isValue: Boolean +} diff --git a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt new file mode 100644 index 0000000..1ff54ef --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt @@ -0,0 +1,14 @@ +package kotlinx.reflect.lite + +import kotlin.reflect.* + +/** + * Represents an entity which may contain declarations of any other entities, + * such as a class or a package. + */ +interface KDeclarationContainer { + /** + * All functions and properties accessible in this container. + */ + //public val members: Collection> +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KFunction.kt b/src/main/java/kotlinx/reflect/lite/KFunction.kt new file mode 100644 index 0000000..88a2c74 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KFunction.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlinx.reflect.lite + +/** + * Represents a function with introspection capabilities. + */ +public interface KFunction : KCallable, Function { + /** + * `true` if this function is `inline`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/inline-functions.html) + * for more information. + */ + @SinceKotlin("1.1") + public val isInline: Boolean + + /** + * `true` if this function is `external`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/java-interop.html#using-jni-with-kotlin) + * for more information. + */ + @SinceKotlin("1.1") + public val isExternal: Boolean + + /** + * `true` if this function is `operator`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/operator-overloading.html) + * for more information. + */ + @SinceKotlin("1.1") + public val isOperator: Boolean + + /** + * `true` if this function is `infix`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/functions.html#infix-notation) + * for more information. + */ + @SinceKotlin("1.1") + public val isInfix: Boolean +} diff --git a/src/main/java/kotlinx/reflect/lite/KParameter.kt b/src/main/java/kotlinx/reflect/lite/KParameter.kt new file mode 100644 index 0000000..b0917b2 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KParameter.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2010-2015 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 kotlinx.reflect.lite + +/** + * Represents a parameter passed to a function or a property getter/setter, + * including `this` and extension receiver parameters. + */ +public interface KParameter : KAnnotatedElement { + /** + * 0-based index of this parameter in the parameter list of its containing callable. + */ + //public val index: Int + + /** + * Name of this parameter as it was declared in the source code, + * or `null` if the parameter has no name or its name is not available at runtime. + * Examples of nameless parameters include `this` instance for member functions, + * extension receiver for extension functions or properties, parameters of Java methods + * compiled without the debug information, and others. + */ + public val name: String? + + /** + * Type of this parameter. For a `vararg` parameter, this is the type of the corresponding array, + * not the individual element. + */ + public val type: KType? + + /** + * Kind of this parameter. + */ + //public val kind: Kind + + /** + * Kind represents a particular position of the parameter declaration in the source code, + * such as an instance, an extension receiver parameter or a value parameter. + */ + public enum class Kind { + /** Instance required to make a call to the member, or an outer class instance for an inner class constructor. */ + INSTANCE, + + /** Extension receiver of an extension function or property. */ + EXTENSION_RECEIVER, + + /** Ordinary named value parameter. */ + VALUE, + } + + /** + * `true` if this parameter is optional and can be omitted when making a call via [KCallable.callBy], or `false` otherwise. + * + * A parameter is optional in any of the two cases: + * 1. The default value is provided at the declaration of this parameter. + * 2. The parameter is declared in a member function and one of the corresponding parameters in the super functions is optional. + */ + //public val isOptional: Boolean + + /** + * `true` if this parameter is `vararg`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs) + * for more information. + */ + @SinceKotlin("1.1") + public val isVararg: Boolean +} diff --git a/src/main/java/kotlinx/reflect/lite/KProperty.kt b/src/main/java/kotlinx/reflect/lite/KProperty.kt new file mode 100644 index 0000000..c9a31d5 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KProperty.kt @@ -0,0 +1,19 @@ +package kotlinx.reflect.lite + +public interface KProperty : KCallable { + /** + * `true` if this property is `lateinit`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/properties.html#late-initialized-properties) + * for more information. + */ + @SinceKotlin("1.1") + public val isLateinit: Boolean + + /** + * `true` if this property is `const`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/properties.html#compile-time-constants) + * for more information. + */ + @SinceKotlin("1.1") + public val isConst: Boolean +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KType.kt b/src/main/java/kotlinx/reflect/lite/KType.kt new file mode 100644 index 0000000..4c2ba6d --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KType.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlinx.reflect.lite + +/** + * Represents a type. Type is usually either a class with optional type arguments, + * or a type parameter of some declaration, plus nullability. + */ +public interface KType : KAnnotatedElement { + /** + * The declaration of the classifier used in this type. + * For example, in the type `List` the classifier would be the [KClass] instance for [List]. + * + * Returns `null` if this type is not denotable in Kotlin, for example if it is an intersection type. + */ + //@SinceKotlin("1.1") + //public val classifier: KClassifier? + + /** + * Type arguments passed for the parameters of the classifier in this type. + * For example, in the type `Array` the only type argument is `out Number`. + * + * In case this type is based on an inner class, the returned list contains the type arguments provided for the innermost class first, + * then its outer class, and so on. + * For example, in the type `Outer.Inner` the returned list is `[C, D, A, B]`. + */ + //@SinceKotlin("1.1") + //public val arguments: List + + /** + * `true` if this type was marked nullable in the source code. + * + * For Kotlin types, it means that `null` value is allowed to be represented by this type. + * In practice it means that the type was declared with a question mark at the end. + * For non-Kotlin types, it means the type or the symbol which was declared with this type + * is annotated with a runtime-retained nullability annotation such as [javax.annotation.Nullable]. + * + * Note that even if [isMarkedNullable] is false, values of the type can still be `null`. + * This may happen if it is a type of the type parameter with a nullable upper bound: + * + * ``` + * fun foo(t: T) { + * // isMarkedNullable == false for t's type, but t can be null here when T = "Any?" + * } + * ``` + */ + public val isMarkedNullable: Boolean +} + diff --git a/src/main/java/kotlinx/reflect/lite/ParameterMetadata.kt b/src/main/java/kotlinx/reflect/lite/ParameterMetadata.kt deleted file mode 100644 index 14413fe..0000000 --- a/src/main/java/kotlinx/reflect/lite/ParameterMetadata.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -/** - * Provides access to the metadata of a parameter of a Kotlin function or constructor. - */ -interface ParameterMetadata { - /** - * Name of this parameter as it was declared in the source code, or `null` if the parameter has no name or its name is not available at runtime. - */ - val name: String? - - /** - * Metadata for the type of this parameter. - */ - val type: TypeMetadata - - /** - * `true` if this parameter declares a default value in the source code. - * - * Note that in case the parameter inherits a default value from a super function, it's not considered to be declaring a default value. - */ - val hasDefaultValue: Boolean -} diff --git a/src/main/java/kotlinx/reflect/lite/PropertyMetadata.kt b/src/main/java/kotlinx/reflect/lite/PropertyMetadata.kt deleted file mode 100644 index c2fe646..0000000 --- a/src/main/java/kotlinx/reflect/lite/PropertyMetadata.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -/** - * Provides access to the metadata of a Kotlin property. - */ -interface PropertyMetadata : CallableMetadata { - /** - * Metadata for the type of values this property returns. - */ - val returnType: TypeMetadata - - /** - * `true` if this property is `lateinit`. - */ - val isLateinit: Boolean - - /** - * `true` if this property is `const`. - */ - val isConst: Boolean -} diff --git a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt index 0848b91..9290c30 100644 --- a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt +++ b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2017 JetBrains s.r.o. + * Copyright 2010-2022 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. @@ -16,7 +16,7 @@ package kotlinx.reflect.lite -import kotlinx.reflect.lite.impl.ReflectionLiteImpl +import kotlinx.reflect.lite.impl.* /** * The entry point to the lite reflection on Kotlin metadata. @@ -25,7 +25,7 @@ object ReflectionLite { /** * Metadata for the given [klass] if this is a Kotlin class, or `null` otherwise. */ - fun loadClassMetadata(klass: Class<*>): ClassMetadata? { + fun loadClassMetadata(klass: Class<*>): KClass<*>? { return ReflectionLiteImpl.loadClassMetadata(klass) } } diff --git a/src/main/java/kotlinx/reflect/lite/TypeMetadata.kt b/src/main/java/kotlinx/reflect/lite/TypeMetadata.kt deleted file mode 100644 index 8731c76..0000000 --- a/src/main/java/kotlinx/reflect/lite/TypeMetadata.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite - -/** - * Provides access to the metadata related to an individual type usage in a Kotlin declaration. - */ -interface TypeMetadata { - /** - * `true` if this type was marked nullable in the source code. - * - * For Kotlin types, it means that `null` value is allowed to be represented by this type. - * In practice it means that the type was declared with a question mark at the end. - * For non-Kotlin types, it means the type or the symbol which was declared with this type - * is annotated with a runtime-retained nullability annotation such as [javax.annotation.Nullable]. - * - * Note that even if [isNullable] is false, values of the type can still be `null`. - * This may happen if it is a type of the type parameter with a nullable upper bound: - * - * ``` - * fun foo(t: T) { - * // isNullable == false for t's type, but t can be null here when T = "Any?" - * } - * ``` - */ - val isNullable: Boolean -} diff --git a/src/main/java/kotlinx/reflect/lite/impl/CallableMetadataImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/CallableMetadataImpl.kt deleted file mode 100644 index 69b67ba..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/CallableMetadataImpl.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.reflect.lite.CallableMetadata - -internal abstract class CallableMetadataImpl : CallableMetadata diff --git a/src/main/java/kotlinx/reflect/lite/impl/ClassMetadataImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ClassMetadataImpl.kt deleted file mode 100644 index 4eb4f3d..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/ClassMetadataImpl.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.metadata.ClassName -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.metadata.jvm.JvmFieldSignature -import kotlinx.metadata.jvm.JvmMemberSignature -import kotlinx.metadata.jvm.JvmMethodSignature -import kotlinx.reflect.lite.* -import java.lang.reflect.Constructor -import java.lang.reflect.Field -import java.lang.reflect.Method - -internal class ClassMetadataImpl( - private val flags: Flags, - private val name: ClassName, - override val functions: Collection, - override val constructors: Collection, - override val properties: Collection, - private val functionsBySignature: Map, - private val constructorsBySignature: Map, - private val propertiesBySignature: Map -) : ClassMetadata { - override fun getFunction(method: Method): FunctionMetadata? = - functionsBySignature[signature(method.name, method.parameterTypes, method.returnType)] - - override fun getConstructor(constructor: Constructor<*>): ConstructorMetadata? = - constructorsBySignature[signature("", constructor.parameterTypes, Void.TYPE)] - - override fun getProperty(field: Field): PropertyMetadata? = - propertiesBySignature[JvmFieldSignature(field.name, field.type.desc())] - - private fun signature(name: String, parameterTypes: Array>, returnType: Class<*>): JvmMemberSignature = - JvmMethodSignature( - name, - parameterTypes.joinToString( - separator = "", prefix = "(", postfix = ")${returnType.desc()}", transform = Class<*>::desc - ) - ) - - override val isData: Boolean - get() = Flag.Class.IS_DATA(flags) - - override val kind: ClassMetadata.Kind - get() = when { - Flag.Class.IS_CLASS(flags) -> ClassMetadata.Kind.CLASS - Flag.Class.IS_INTERFACE(flags) -> ClassMetadata.Kind.INTERFACE - Flag.Class.IS_ENUM_CLASS(flags) -> ClassMetadata.Kind.ENUM_CLASS - Flag.Class.IS_ENUM_ENTRY(flags) -> { - // Enum entries were never supposed to have their own class kind, so we're treating them - // as other anonymous classes, i.e. as CLASS - ClassMetadata.Kind.CLASS - } - Flag.Class.IS_ANNOTATION_CLASS(flags) -> ClassMetadata.Kind.ANNOTATION_CLASS - Flag.Class.IS_OBJECT(flags) -> ClassMetadata.Kind.OBJECT - Flag.Class.IS_COMPANION_OBJECT(flags) -> ClassMetadata.Kind.COMPANION_OBJECT - else -> error("Unknown class kind for class $name") - } - - override val visibility: DeclarationMetadata.Visibility? - get() = flags.toVisibility -} diff --git a/src/main/java/kotlinx/reflect/lite/impl/ConstructorMetadataImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ConstructorMetadataImpl.kt deleted file mode 100644 index c15a065..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/ConstructorMetadataImpl.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.metadata.jvm.JvmMethodSignature -import kotlinx.reflect.lite.ConstructorMetadata -import kotlinx.reflect.lite.DeclarationMetadata -import kotlinx.reflect.lite.ParameterMetadata -import kotlinx.reflect.lite.TypeMetadata - -internal class ConstructorMetadataImpl( - private val flags: Flags, - override val parameters: List, - val signature: JvmMethodSignature? -) : CallableMetadataImpl(), ConstructorMetadata { - override val name: String - get() = "" - - override val extensionReceiverType: TypeMetadata? - get() = null - - override val visibility: DeclarationMetadata.Visibility? - get() = flags.toVisibility - - override val isPrimary: Boolean - get() = Flag.Constructor.IS_PRIMARY(flags) -} diff --git a/src/main/java/kotlinx/reflect/lite/impl/FunctionMetadataImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/FunctionMetadataImpl.kt deleted file mode 100644 index b750ce0..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/FunctionMetadataImpl.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.metadata.jvm.JvmMethodSignature -import kotlinx.reflect.lite.DeclarationMetadata -import kotlinx.reflect.lite.FunctionMetadata -import kotlinx.reflect.lite.ParameterMetadata -import kotlinx.reflect.lite.TypeMetadata - -internal class FunctionMetadataImpl( - private val flags: Flags, - override val name: String, - override val extensionReceiverType: TypeMetadata?, - override val parameters: List, - override val returnType: TypeMetadata, - val signature: JvmMethodSignature? -) : CallableMetadataImpl(), FunctionMetadata { - override val visibility: DeclarationMetadata.Visibility? - get() = flags.toVisibility - - override val isInline: Boolean - get() = Flag.Function.IS_INLINE(flags) - - override val isExternal: Boolean - get() = Flag.Function.IS_EXTERNAL(flags) - - override val isOperator: Boolean - get() = Flag.Function.IS_OPERATOR(flags) - - override val isInfix: Boolean - get() = Flag.Function.IS_INFIX(flags) - - override val isSuspend: Boolean - get() = Flag.Function.IS_SUSPEND(flags) -} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt new file mode 100644 index 0000000..46e760c --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -0,0 +1,5 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* + +internal abstract class KCallableImpl: KCallable \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt new file mode 100644 index 0000000..f9070bd --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -0,0 +1,44 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.metadata.* +import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.* + +internal class KClassImpl( + private val klass: Class<*>, + private val metadata: KotlinClassMetadata.Class +) : KClass { + private val kmClass = metadata.toKmClass() + private val flags: Flags = kmClass.flags + + override val simpleName: String + get() = kmClass.name + + override val properties: Collection> + get() = kmClass.properties.map(::KPropertyImpl) + + override val functions: Collection> + get() = kmClass.functions.map(::KFunctionImpl) + + override val constructors: Collection> + get() = kmClass.constructors.map(::KConstructorImpl) + + override val isFinal: Boolean + get() = Flag.Common.IS_FINAL(flags) + override val isOpen: Boolean + get() = Flag.Common.IS_OPEN(flags) + override val isAbstract: Boolean + get() = Flag.Common.IS_ABSTRACT(flags) + override val isSealed: Boolean + get() = Flag.Common.IS_SEALED(flags) + override val isData: Boolean + get() = Flag.Class.IS_DATA(flags) + override val isInner: Boolean + get() = Flag.Class.IS_INNER(flags) + override val isCompanion: Boolean + get() = Flag.Class.IS_COMPANION_OBJECT(flags) + override val isFun: Boolean + get() = Flag.Class.IS_FUN(flags) + override val isValue: Boolean + get() = Flag.Class.IS_VALUE(flags) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt new file mode 100644 index 0000000..c93e9f2 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt @@ -0,0 +1,33 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* + +internal class KConstructorImpl( + private val kmCons: KmConstructor +) : KCallableImpl(), KFunction { + private val flags: Flags = kmCons.flags + + override val name: String + get() = "" + + override val parameters: List + get() = kmCons.valueParameters.map(::KParameterImpl) + + override val isInline: Boolean + get() = false + override val isExternal: Boolean + get() = false + override val isOperator: Boolean + get() = false + override val isInfix: Boolean + get() = false + override val isAbstract: Boolean + get() = Flag.IS_ABSTRACT(flags) + override val isFinal: Boolean + get() = Flag.IS_FINAL(flags) + override val isOpen: Boolean + get() = Flag.IS_OPEN(flags) + override val isSuspend: Boolean + get() = false +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt new file mode 100644 index 0000000..8680a8f --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt @@ -0,0 +1,34 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* + +internal class KFunctionImpl( + private val kmFunction: KmFunction +) : KCallableImpl(), KFunction { + private val flags: Flags = kmFunction.flags + + override val name: String + get() = kmFunction.name + + override val parameters: List + get() = kmFunction.valueParameters.map(::KParameterImpl) + + override val isInline: Boolean + get() = Flag.Function.IS_INLINE(flags) + override val isExternal: Boolean + get() = Flag.Function.IS_EXTERNAL(flags) + override val isOperator: Boolean + get() = Flag.Function.IS_OPERATOR(flags) + override val isInfix: Boolean + get() = Flag.Function.IS_INFIX(flags) + override val isSuspend: Boolean + get() = Flag.Function.IS_SUSPEND(flags) + + override val isAbstract: Boolean + get() = Flag.Common.IS_ABSTRACT(flags) + override val isFinal: Boolean + get() = Flag.Common.IS_FINAL(flags) + override val isOpen: Boolean + get() = Flag.Common.IS_OPEN(flags) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt new file mode 100644 index 0000000..022c6f2 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -0,0 +1,17 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* + +class KParameterImpl( + private val kmParam: KmValueParameter +): KParameter { + override val name: String + get() = kmParam.name + + override val type: KType? + get() = kmParam.type?.let(::KTypeImpl) + + override val isVararg: Boolean + get() = kmParam.varargElementType != null +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt new file mode 100644 index 0000000..688028d --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt @@ -0,0 +1,30 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* + +internal class KPropertyImpl( + private val kmProperty: KmProperty +) : KCallableImpl(), KProperty { + private val flags: Flags = kmProperty.flags + + override val name: String + get() = kmProperty.name + + override val parameters: List + get() = emptyList() + + override val isConst: Boolean + get() = Flag.Property.IS_CONST(flags) + override val isLateinit: Boolean + get() = Flag.Property.IS_LATEINIT(flags) + + override val isAbstract: Boolean + get() = Flag.Common.IS_ABSTRACT(flags) + override val isFinal: Boolean + get() = Flag.Common.IS_FINAL(flags) + override val isOpen: Boolean + get() = Flag.Common.IS_OPEN(flags) + override val isSuspend: Boolean + get() = false +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt new file mode 100644 index 0000000..225fb7e --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -0,0 +1,11 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* + +class KTypeImpl( + private val kmType: KmType +): KType { + override val isMarkedNullable: Boolean + get() = Flag.Type.IS_NULLABLE(kmType.flags) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/ParameterMetadataImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ParameterMetadataImpl.kt deleted file mode 100644 index 4d56956..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/ParameterMetadataImpl.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.reflect.lite.ParameterMetadata -import kotlinx.reflect.lite.TypeMetadata - -internal class ParameterMetadataImpl( - private val flags: Flags, - override val name: String, - override val type: TypeMetadata -) : ParameterMetadata { - override val hasDefaultValue: Boolean - get() = Flag.ValueParameter.DECLARES_DEFAULT_VALUE(flags) -} diff --git a/src/main/java/kotlinx/reflect/lite/impl/PropertyMetadataImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/PropertyMetadataImpl.kt deleted file mode 100644 index 762fc7a..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/PropertyMetadataImpl.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.metadata.jvm.JvmFieldSignature -import kotlinx.reflect.lite.DeclarationMetadata -import kotlinx.reflect.lite.ParameterMetadata -import kotlinx.reflect.lite.PropertyMetadata -import kotlinx.reflect.lite.TypeMetadata - -internal class PropertyMetadataImpl( - private val flags: Flags, - override val name: String, - override val extensionReceiverType: TypeMetadata?, - override val returnType: TypeMetadata, - val fieldSignature: JvmFieldSignature? -) : CallableMetadataImpl(), PropertyMetadata { - override val parameters: List - get() = emptyList() - - override val visibility: DeclarationMetadata.Visibility? - get() = flags.toVisibility - - override val isLateinit: Boolean - get() = Flag.Property.IS_LATEINIT(flags) - - override val isConst: Boolean - get() = Flag.Property.IS_CONST(flags) -} diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 541e599..6abb4cf 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2017 JetBrains s.r.o. + * Copyright 2010-2022 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. @@ -16,172 +16,20 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* import kotlinx.metadata.jvm.* -import kotlinx.reflect.lite.ClassMetadata -import kotlinx.reflect.lite.ParameterMetadata -import kotlinx.reflect.lite.TypeMetadata +import kotlinx.reflect.lite.* internal object ReflectionLiteImpl { - fun loadClassMetadata(klass: Class<*>): ClassMetadata? { + fun loadClassMetadata(klass: Class<*>): KClass<*>? { val header = with(klass.getAnnotation(Metadata::class.java)) { - KotlinClassHeader(kind, metadataVersion, bytecodeVersion, data1, data2, extraString, packageName, extraInt) + KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt) } val metadata = KotlinClassMetadata.read(header) if (metadata is KotlinClassMetadata.Class) { - return ReflectLiteClassVisitor().also(metadata::accept).createMetadata() + return KClassImpl(klass, metadata) } return null } -} - -internal class ReflectLiteClassVisitor : KmClassVisitor() { - private var flags: Flags? = null - private lateinit var name: ClassName - private val functions = mutableListOf() - private val constructors = mutableListOf() - private val properties = mutableListOf() - - override fun visit(flags: Flags, name: ClassName) { - this.flags = flags - this.name = name - } - - override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = - ReflectLiteFunctionVisitor(flags, name).also(functions::add0) - - override fun visitConstructor(flags: Flags): KmConstructorVisitor? = - ReflectLiteConstructorVisitor(flags).also(constructors::add0) - - override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = - ReflectLitePropertyVisitor(flags, name).also(properties::add0) - - fun createMetadata(): ClassMetadata { - val functions = functions.map(ReflectLiteFunctionVisitor::createMetadata) - val properties = properties.map(ReflectLitePropertyVisitor::createMetadata) - val constructors = constructors.map(ReflectLiteConstructorVisitor::createMetadata) - return ClassMetadataImpl( - flags!!, name, functions, constructors, properties, - functions.mapNotNull { it.signature?.to(it) }.toMap(), - constructors.mapNotNull { it.signature?.to(it) }.toMap(), - properties.mapNotNull { it.fieldSignature?.to(it) }.toMap() - ) - } -} - -internal class ReflectLiteFunctionVisitor( - private var flags: Flags, - private var name: String -) : KmFunctionVisitor() { - private var signature: JvmMethodSignature? = null - private val valueParameters = mutableListOf() - private var receiverParameterType: ReflectLiteTypeVisitor? = null - private lateinit var returnType: ReflectLiteTypeVisitor - - override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = - ReflectLiteTypeVisitor(flags).also { receiverParameterType = it } - - override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = - ReflectLiteValueParameterVisitor(flags, name).also(valueParameters::add0) - - override fun visitReturnType(flags: Flags): KmTypeVisitor? = - ReflectLiteTypeVisitor(flags).also { returnType = it } - - override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? = - object : JvmFunctionExtensionVisitor() { - override fun visit(desc: JvmMethodSignature?) { - signature = desc - } - } - - fun createMetadata(): FunctionMetadataImpl = - FunctionMetadataImpl( - flags, name, - receiverParameterType?.createMetadata(), - valueParameters.map(ReflectLiteValueParameterVisitor::createMetadata), - returnType.createMetadata(), - signature - ) -} - -internal class ReflectLiteConstructorVisitor( - private var flags: Flags -) : KmConstructorVisitor() { - private var signature: JvmMethodSignature? = null - private val valueParameters = mutableListOf() - - override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = - ReflectLiteValueParameterVisitor(flags, name).also(valueParameters::add0) - - override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? = - object : JvmConstructorExtensionVisitor() { - override fun visit(desc: JvmMethodSignature?) { - signature = desc - } - } - - fun createMetadata(): ConstructorMetadataImpl = - ConstructorMetadataImpl( - flags, - valueParameters.map(ReflectLiteValueParameterVisitor::createMetadata), - signature - ) -} - -internal class ReflectLitePropertyVisitor( - private var flags: Flags, - private var name: String -) : KmPropertyVisitor() { - private var field: JvmFieldSignature? = null - private var getter: JvmMethodSignature? = null - private var setter: JvmMethodSignature? = null - private var receiverParameterType: ReflectLiteTypeVisitor? = null - private lateinit var returnType: ReflectLiteTypeVisitor - - override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = - ReflectLiteTypeVisitor(flags).also { receiverParameterType = it } - - override fun visitReturnType(flags: Flags): KmTypeVisitor? = - ReflectLiteTypeVisitor(flags).also { returnType = it } - - override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor? = - object : JvmPropertyExtensionVisitor() { - override fun visit(fieldDesc: JvmFieldSignature?, getterDesc: JvmMethodSignature?, setterDesc: JvmMethodSignature?) { - field = fieldDesc - getter = getterDesc - setter = setterDesc - } - } - - fun createMetadata(): PropertyMetadataImpl = - PropertyMetadataImpl( - flags, name, - receiverParameterType?.createMetadata(), - returnType.createMetadata(), - field - ) -} - -internal class ReflectLiteValueParameterVisitor( - private var flags: Flags, - private var name: String -) : KmValueParameterVisitor() { - private lateinit var type: ReflectLiteTypeVisitor - - override fun visitType(flags: Flags): KmTypeVisitor? = - ReflectLiteTypeVisitor(flags).also { type = it } - - // TODO: vararg - - fun createMetadata(): ParameterMetadata = - ParameterMetadataImpl(flags, name, type.createMetadata()) -} - -internal class ReflectLiteTypeVisitor( - private var flags: Flags -) : KmTypeVisitor() { - fun createMetadata(): TypeMetadata = - TypeMetadataImpl(flags) -} +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/TypeMetadataImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/TypeMetadataImpl.kt deleted file mode 100644 index d83b5b3..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/TypeMetadataImpl.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.reflect.lite.TypeMetadata -import java.lang.reflect.Array as ReflectArray - -internal class TypeMetadataImpl( - private val flags: Flags -) : TypeMetadata { - override val isNullable: Boolean - get() = Flag.Type.IS_NULLABLE(flags) -} diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt deleted file mode 100644 index 806e65b..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.impl - -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.reflect.lite.DeclarationMetadata -import java.lang.reflect.Array - -internal fun Class<*>.desc(): String { - if (this == Void.TYPE) return "V" - return Array.newInstance(this, 0).javaClass.name.substring(1).replace('.', '/') -} - -internal val Flags.toVisibility: DeclarationMetadata.Visibility? - get() = when { - Flag.IS_PUBLIC(this) -> DeclarationMetadata.Visibility.PUBLIC - Flag.IS_PROTECTED(this) -> DeclarationMetadata.Visibility.PROTECTED - Flag.IS_INTERNAL(this) -> DeclarationMetadata.Visibility.INTERNAL - Flag.IS_PRIVATE(this) || Flag.IS_PRIVATE_TO_THIS(this) -> DeclarationMetadata.Visibility.PRIVATE - else -> null - } - -// To be able to pass `List::add0` as a callable reference to `also` (`List::add` only works with the new inference) -@Suppress("NOTHING_TO_INLINE") -inline fun MutableList.add0(element: T) { - add(element) -} diff --git a/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt b/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt new file mode 100644 index 0000000..d8f781f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt @@ -0,0 +1,89 @@ +package kotlinx.reflect.lite.test + +import kotlinx.reflect.lite.* +import org.junit.Test +import kotlin.test.* + +class BasicReflectTest { + + @Test + fun testReturnTypeAndNullability() { + val kClass = ReflectionLite.loadClassMetadata(Types::class.java)!! + val notNullListOfStrings = kClass.functions.single { it.name == "notNullListOfStrings" } + assertTrue(notNullListOfStrings.parameters.isEmpty()) + } + + @Test + fun testParameterNamesAndNullability() { + val kClass = ReflectionLite.loadClassMetadata(Types.Nested::class.java)!! + val method = kClass.functions.single { it.name == "method" } + + val parameters = method.parameters + assertEquals(listOf("nullableString", "nonNullIntArray", "nullableNested"), parameters.map { it.name }) + assertEquals(listOf(true, false, true), parameters.map { it.type?.isMarkedNullable }) + } + + @Test + fun testConstructor() { + val kClass = ReflectionLite.loadClassMetadata(Types::class.java)!! + assertEquals(2, kClass.constructors.size) + val primaryConstructor = kClass.constructors.single { it.parameters.size == 1 } + assertTrue(primaryConstructor.name == "") + + val parameter = primaryConstructor.parameters.single() + assertTrue(parameter.name == "param") + } + + @Test + fun testDataClass() { + assertTrue(ReflectionLite.loadClassMetadata(DataClass::class.java)!!.isData) + assertFalse(ReflectionLite.loadClassMetadata(Types::class.java)!!.isData) + } + + @Test + fun testClassKinds() { + assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Enum::class.java)!!.isFinal) + assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Companion::class.java)!!.isCompanion) + } + + @Test + fun testProperties() { + val kClass = ReflectionLite.loadClassMetadata(Properties::class.java)!! + val backingField = kClass.properties.single { it.name == "backingField" } + + assertEquals("backingField", backingField.name) + } + + @Test + fun testCallableModifiers() { + val kClass = ReflectionLite.loadClassMetadata(CallableModifiers::class.java)!! + + assertTrue(kClass.functions.single { it.name == "inline" }.isInline) + assertTrue(kClass.functions.single { it.name == "external" }.isExternal) + assertTrue(kClass.functions.single { it.name == "plus" }.isOperator) + assertTrue(kClass.functions.single { it.name == "infix" }.isInfix) + + assertTrue(kClass.properties.single { it.name == "lateinit" }.isLateinit) + assertTrue(kClass.properties.single { it.name == "const" }.isConst) + + assertFalse(kClass.functions.single { it.name == "external" }.isInline) + assertFalse(kClass.functions.single { it.name == "plus" }.isExternal) + assertFalse(kClass.functions.single { it.name == "infix" }.isOperator) + assertFalse(kClass.functions.single { it.name == "suspend" }.isInfix) + assertFalse(kClass.functions.single { it.name == "inline" }.isSuspend) + + assertFalse(kClass.properties.single { it.name == "lateinit" }.isConst) + assertFalse(kClass.properties.single { it.name == "const" }.isLateinit) + } + + @Test + fun testParameterVararg() { + val kClass = ReflectionLite.loadClassMetadata(ParameterVararg::class.java)!! + + val parameters = kClass.functions.single { it.name == "foo" }.parameters + assertFalse(parameters[0].type!!.isMarkedNullable) + + assertTrue(parameters[1].isVararg) + assertFalse(parameters[1].type!!.isMarkedNullable) + } +} diff --git a/src/test/java/kotlinx/reflect/lite/test/SmokeTest.kt b/src/test/java/kotlinx/reflect/lite/test/SmokeTest.kt deleted file mode 100644 index a8c137e..0000000 --- a/src/test/java/kotlinx/reflect/lite/test/SmokeTest.kt +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2010-2017 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 kotlinx.reflect.lite.test - -import kotlinx.reflect.lite.* -import org.junit.Test -import java.lang.reflect.Constructor -import java.lang.reflect.Field -import java.lang.reflect.Method -import kotlin.test.* - -@Suppress("unused") -class SmokeTest { - private fun Class<*>.methodByName(name: String): Method = declaredMethods.single { it.name == name } - - private fun Class<*>.fieldByName(name: String): Field = declaredFields.single { it.name == name } - - private fun Class<*>.constructorBySignature(vararg paramTypes: Class<*>): Constructor<*> = - declaredConstructors.single { it.parameterTypes!!.contentEquals(paramTypes) } - - @Test - fun testReturnTypeAndNullability() { - val klass = Types::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - - val notNullListOfStrings = classMetadata.getFunction(klass.methodByName("notNullListOfStrings"))!! - assertFalse(notNullListOfStrings.returnType.isNullable) - - val nullableInt = classMetadata.getFunction(klass.methodByName("nullableInt"))!! - assertTrue(nullableInt.returnType.isNullable) - } - - @Test - fun testParameterNamesAndNullability() { - val klass = Types.Nested::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - - val method = classMetadata.getFunction(klass.methodByName("method"))!! - assertEquals("method", method.name) - - val parameters = method.parameters - assertEquals(listOf(true, false, true), parameters.map { it.type.isNullable }) - assertEquals(listOf("nullableString", "nonNullIntArray", "nullableNested"), parameters.map { it.name }) - } - - @Test - fun testConstructor() { - val klass = Types::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - - val primaryConstructor = classMetadata.getConstructor(klass.constructorBySignature(Int::class.java))!! - assertTrue(primaryConstructor.isPrimary) - val secondaryConstructor = classMetadata.getConstructor(klass.constructorBySignature())!! - assertFalse(secondaryConstructor.isPrimary) - - assertEquals("", primaryConstructor.name) - assertEquals("", secondaryConstructor.name) - - val parameter = primaryConstructor.parameters.single() - assertEquals("param", parameter.name) - assertFalse(parameter.type.isNullable) - } - - @Test - fun testMappedTypes() { - val klass = Types::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - - assertNotNull(classMetadata.getFunction(klass.methodByName("primitives"))) - assertNotNull(classMetadata.getFunction(klass.methodByName("primitiveArrays"))) - assertNotNull(classMetadata.getFunction(klass.methodByName("mappedCollections"))) - assertNotNull(classMetadata.getFunction(klass.methodByName("mappedMutableCollections"))) - assertNotNull(classMetadata.getFunction(klass.methodByName("mappedTypes"))) - assertNotNull(classMetadata.getFunction(klass.methodByName("functionTypes"))) - } - - @Test - fun testDataClass() { - assertTrue(ReflectionLite.loadClassMetadata(DataClass::class.java)!!.isData) - assertFalse(ReflectionLite.loadClassMetadata(Types::class.java)!!.isData) - } - - @Test - fun testClassKinds() { - assertEquals(ClassMetadata.Kind.CLASS, ReflectionLite.loadClassMetadata(ClassKinds.Class::class.java)!!.kind) - assertEquals(ClassMetadata.Kind.INTERFACE, ReflectionLite.loadClassMetadata(ClassKinds.Interface::class.java)!!.kind) - assertEquals(ClassMetadata.Kind.ENUM_CLASS, ReflectionLite.loadClassMetadata(ClassKinds.Enum::class.java)!!.kind) - assertEquals(ClassMetadata.Kind.ANNOTATION_CLASS, ReflectionLite.loadClassMetadata(ClassKinds.Annotation::class.java)!!.kind) - assertEquals(ClassMetadata.Kind.OBJECT, ReflectionLite.loadClassMetadata(ClassKinds.Object::class.java)!!.kind) - assertEquals(ClassMetadata.Kind.COMPANION_OBJECT, ReflectionLite.loadClassMetadata(ClassKinds.Companion::class.java)!!.kind) - - assertEquals(ClassMetadata.Kind.CLASS, ReflectionLite.loadClassMetadata(ClassKinds.Enum.ENTRY::class.java)!!.kind) - } - - @Test - fun testVisibilities() { - val klass = Visibilities::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - assertEquals(DeclarationMetadata.Visibility.PUBLIC, classMetadata.getFunction(klass.methodByName("publicFun"))!!.visibility) - assertEquals(DeclarationMetadata.Visibility.PROTECTED, classMetadata.getFunction(klass.methodByName("protectedFun"))!!.visibility) - assertEquals(DeclarationMetadata.Visibility.INTERNAL, classMetadata.getFunction(klass.methodByName("internalFun\$kotlinx_reflect_lite"))!!.visibility) - assertEquals(DeclarationMetadata.Visibility.PRIVATE, classMetadata.getFunction(klass.methodByName("privateFun"))!!.visibility) - - assertEquals(DeclarationMetadata.Visibility.PUBLIC, classMetadata.getConstructor(klass.constructorBySignature())!!.visibility) - assertEquals(DeclarationMetadata.Visibility.PROTECTED, classMetadata.getConstructor(klass.constructorBySignature(Int::class.java))!!.visibility) - assertEquals(DeclarationMetadata.Visibility.INTERNAL, classMetadata.getConstructor(klass.constructorBySignature(Double::class.java))!!.visibility) - assertEquals(DeclarationMetadata.Visibility.PRIVATE, classMetadata.getConstructor(klass.constructorBySignature(Float::class.java))!!.visibility) - } - - @Test - fun testProperties() { - val klass = Properties::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - - val backingField = classMetadata.getProperty(klass.fieldByName("backingField"))!! - assertEquals("backingField", backingField.name) - assertTrue(backingField.returnType.isNullable) - - val delegated = classMetadata.getProperty(klass.fieldByName("delegated\$delegate"))!! - assertEquals("delegated", delegated.name) - assertFalse(delegated.returnType.isNullable) - } - - @Test - fun testEnumerateAll() { - val klass = EnumerateAllCallables::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - assertEquals(listOf("function1", "function2"), classMetadata.functions.map(FunctionMetadata::name).sorted()) - assertEquals(listOf("property1", "property2"), classMetadata.properties.map(PropertyMetadata::name).sorted()) - assertEquals(2, classMetadata.constructors.size) - } - - @Test - fun testExtensionReceiverType() { - val klass = ExtensionReceiverType::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - - assertFalse(classMetadata.getFunction(klass.methodByName("stringExtFun"))!!.extensionReceiverType!!.isNullable) - assertTrue(classMetadata.getFunction(klass.methodByName("nullableListExtFun"))!!.extensionReceiverType!!.isNullable) - - assertFalse(classMetadata.properties.single { it.name == "intExtProp" }.extensionReceiverType!!.isNullable) - assertTrue(classMetadata.properties.single { it.name == "nullableDoubleExtProp" }.extensionReceiverType!!.isNullable) - - assertNull(classMetadata.getFunction(klass.methodByName("nonExtFun"))!!.extensionReceiverType) - assertNull(classMetadata.constructors.single().extensionReceiverType) - } - - @Test - fun testCallableModifiers() { - val klass = CallableModifiers::class.java - val classMetadata = ReflectionLite.loadClassMetadata(klass)!! - - assertTrue(classMetadata.getFunction(klass.methodByName("inline"))!!.isInline) - assertTrue(classMetadata.getFunction(klass.methodByName("external"))!!.isExternal) - assertTrue(classMetadata.getFunction(klass.methodByName("plus"))!!.isOperator) - assertTrue(classMetadata.getFunction(klass.methodByName("infix"))!!.isInfix) - assertTrue(classMetadata.getFunction(klass.methodByName("suspend"))!!.isSuspend) - - assertTrue(classMetadata.getProperty(klass.fieldByName("lateinit"))!!.isLateinit) - assertTrue(classMetadata.getProperty(klass.fieldByName("const"))!!.isConst) - - assertFalse(classMetadata.getFunction(klass.methodByName("external"))!!.isInline) - assertFalse(classMetadata.getFunction(klass.methodByName("plus"))!!.isExternal) - assertFalse(classMetadata.getFunction(klass.methodByName("infix"))!!.isOperator) - assertFalse(classMetadata.getFunction(klass.methodByName("suspend"))!!.isInfix) - assertFalse(classMetadata.getFunction(klass.methodByName("inline"))!!.isSuspend) - - assertFalse(classMetadata.getProperty(klass.fieldByName("const"))!!.isLateinit) - assertFalse(classMetadata.getProperty(klass.fieldByName("lateinit"))!!.isConst) - } - - @Test - fun testParameterDefaultValue() { - val klass = ParameterDefaultValue::class.java - val subclass = ParameterDefaultValueSubclass::class.java - - val parameters = ReflectionLite.loadClassMetadata(klass)!!.getFunction(klass.methodByName("foo"))!!.parameters - assertFalse(parameters[0].hasDefaultValue) - assertTrue(parameters[1].hasDefaultValue) - - val subclassParameters = ReflectionLite.loadClassMetadata(subclass)!!.getFunction(subclass.methodByName("foo"))!!.parameters - assertFalse(subclassParameters[0].hasDefaultValue) - assertFalse(subclassParameters[1].hasDefaultValue) - } - - @Test - fun testParameterVararg() { - val klass = ParameterVararg::class.java - - val parameters = ReflectionLite.loadClassMetadata(klass)!!.getFunction(klass.methodByName("foo"))!!.parameters - assertFalse(parameters[0].type.isNullable) - - // The type of parameter `y` is `Array` - assertFalse(parameters[1].type.isNullable) - } -} diff --git a/src/test/java/kotlinx/reflect/lite/test/testData.kt b/src/test/java/kotlinx/reflect/lite/test/testData.kt index df9aa2b..0cee084 100644 --- a/src/test/java/kotlinx/reflect/lite/test/testData.kt +++ b/src/test/java/kotlinx/reflect/lite/test/testData.kt @@ -102,6 +102,7 @@ object CallableModifiers { operator fun plus(s: String) = s infix fun infix(s: String) = s suspend fun suspend() {} + fun isOdd(x: Int) = x % 2 != 0 lateinit var lateinit: String const val const = 42 @@ -118,3 +119,24 @@ class ParameterDefaultValueSubclass : ParameterDefaultValue() { class ParameterVararg { fun foo(x: Int, vararg y: String?) {} } + +open class ParentClass { + open val p1: String = "aaa" + val p2: String = "bbb" + + open fun foo1(x: Int): String { + return "$x$p1" + } + + fun foo2(x: Int): String { + return "$x$p2" + } +} + +class ChildClass(): ParentClass() { + val p3: String = "ccc" + + fun bar(): String { + return p3 + } +} \ No newline at end of file From 8c02d6923b01fe5dd81f4f4dc2b0ea84cefa3f1d Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 17 Jan 2022 19:25:46 +0300 Subject: [PATCH 03/74] All the reflect interfaces copied from the stdlib. --- .../kotlinx/reflect/lite/KAnnotatedElement.kt | 3 +- .../java/kotlinx/reflect/lite/KCallable.kt | 17 +- src/main/java/kotlinx/reflect/lite/KClass.kt | 60 +++-- .../java/kotlinx/reflect/lite/KClassifier.kt | 10 + .../reflect/lite/KDeclarationContainer.kt | 5 +- .../java/kotlinx/reflect/lite/KFunction.kt | 6 + .../java/kotlinx/reflect/lite/KParameter.kt | 9 +- .../java/kotlinx/reflect/lite/KProperty.kt | 235 +++++++++++++++++- src/main/java/kotlinx/reflect/lite/KType.kt | 10 +- .../kotlinx/reflect/lite/KTypeParameter.kt | 39 +++ .../kotlinx/reflect/lite/KTypeProjection.kt | 79 ++++++ .../java/kotlinx/reflect/lite/KVariance.kt | 29 +++ .../java/kotlinx/reflect/lite/KVisibility.kt | 34 +++ .../kotlinx/reflect/lite/impl/KClassImpl.kt | 4 +- .../reflect/lite/test/BasicReflectTest.kt | 59 ----- 15 files changed, 486 insertions(+), 113 deletions(-) create mode 100644 src/main/java/kotlinx/reflect/lite/KClassifier.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KTypeParameter.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KTypeProjection.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KVariance.kt create mode 100644 src/main/java/kotlinx/reflect/lite/KVisibility.kt diff --git a/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt index b841080..f4b9c51 100644 --- a/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt +++ b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt @@ -9,5 +9,6 @@ public interface KAnnotatedElement { /** * Annotations which are present on this element. */ - //public val annotations: List + private val annotations: List + get() = TODO() } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KCallable.kt b/src/main/java/kotlinx/reflect/lite/KCallable.kt index 114ab69..66009b4 100644 --- a/src/main/java/kotlinx/reflect/lite/KCallable.kt +++ b/src/main/java/kotlinx/reflect/lite/KCallable.kt @@ -31,33 +31,36 @@ public interface KCallable : KAnnotatedElement { /** * The type of values returned by this callable. */ - // public val returnType: KType + private val returnType: KType + get() = TODO() /** * The list of type parameters of this callable. */ -// @SinceKotlin("1.1") -// public val typeParameters: List + @SinceKotlin("1.1") + private val typeParameters: List + get() = TODO() /** * Calls this callable with the specified list of arguments and returns the result. * Throws an exception if the number of specified arguments is not equal to the size of [parameters], * or if their types do not match the types of the parameters. */ - //public fun call(vararg args: Any?): R + private fun call(vararg args: Any?): R = TODO() /** * Calls this callable with the specified mapping of parameters to arguments and returns the result. * If a parameter is not found in the mapping and is not optional (as per [KParameter.isOptional]), * or its type does not match the type of the provided value, an exception is thrown. */ - //public fun callBy(args: Map): R + private fun callBy(args: Map): R = TODO() /** * Visibility of this callable, or `null` if its visibility cannot be represented in Kotlin. */ - //@SinceKotlin("1.1") - //public val visibility: KVisibility? + @SinceKotlin("1.1") + private val visibility: KVisibility? + get() = TODO() /** * `true` if this callable is `final`. diff --git a/src/main/java/kotlinx/reflect/lite/KClass.kt b/src/main/java/kotlinx/reflect/lite/KClass.kt index 324b363..1b9008d 100644 --- a/src/main/java/kotlinx/reflect/lite/KClass.kt +++ b/src/main/java/kotlinx/reflect/lite/KClass.kt @@ -1,6 +1,11 @@ package kotlinx.reflect.lite -public interface KClass : KDeclarationContainer, KAnnotatedElement { +/** + * Represents a class and provides introspection capabilities. + * + * @param T the type of the class. + */ +public interface KClass : KDeclarationContainer, KAnnotatedElement, KClassifier { /** * The simple name of the class as it was declared in the source code, * or `null` if the class has no name (if, for example, it is a class of an anonymous object). @@ -8,71 +13,62 @@ public interface KClass : KDeclarationContainer, KAnnotatedElement { public val simpleName: String? /** - * All properties declared in this class, not including properties from supertypes. - */ - public val properties: Collection> - - /** - * All functions declared in this class, not including functions from supertypes. + * The fully qualified dot-separated name of the class, + * or `null` if the class is local or a class of an anonymous object. */ - public val functions: Collection> + private val qualifiedName: String? + get() = TODO() /** * All constructors declared in this class. */ public val constructors: Collection> - /** - * The fully qualified dot-separated name of the class, - * or `null` if the class is local or a class of an anonymous object. - */ - //public val qualifiedName: String? - /** * All classes declared inside this class. This includes both inner and static nested classes. */ - //public val nestedClasses: Collection> - - /** - * All functions and properties accessible in this class, including those declared in this class - * and all of its superclasses. Does not include constructors. - */ - //override val members: Collection> + private val nestedClasses: Collection> + get() = TODO() /** * The instance of the object declaration, or `null` if this class is not an object declaration. */ -// public val objectInstance: T? + private val objectInstance: T? + get() = TODO() /** * Returns `true` if [value] is an instance of this class on a given platform. */ -// @SinceKotlin("1.1") -// public fun isInstance(value: Any?): Boolean + @SinceKotlin("1.1") + private fun isInstance(value: Any?): Boolean = TODO() /** * The list of type parameters of this class. This list does *not* include type parameters of outer classes. */ -// @SinceKotlin("1.1") -// public val typeParameters: List + @SinceKotlin("1.1") + private val typeParameters: List + get() = TODO() /** * The list of immediate supertypes of this class, in the order they are listed in the source code. */ -// @SinceKotlin("1.1") -// public val supertypes: List + @SinceKotlin("1.1") + private val supertypes: List + get() = TODO() /** * The list of the immediate subclasses if this class is a sealed class, or an empty list otherwise. */ -// @SinceKotlin("1.3") -// public val sealedSubclasses: List> + @SinceKotlin("1.3") + private val sealedSubclasses: List> + get() = TODO() /** * Visibility of this class, or `null` if its visibility cannot be represented in Kotlin. */ -// @SinceKotlin("1.1") -// public val visibility: KVisibility? + @SinceKotlin("1.1") + private val visibility: KVisibility? + get() = TODO() /** * `true` if this class is `final`. diff --git a/src/main/java/kotlinx/reflect/lite/KClassifier.kt b/src/main/java/kotlinx/reflect/lite/KClassifier.kt new file mode 100644 index 0000000..9fbde99 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KClassifier.kt @@ -0,0 +1,10 @@ +package kotlinx.reflect.lite + +/** + * A classifier is either a class or a type parameter. + * + * @see [KClass] + * @see [KTypeParameter] + */ +@SinceKotlin("1.1") +public interface KClassifier \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt index 1ff54ef..014364b 100644 --- a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt +++ b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt @@ -1,7 +1,5 @@ package kotlinx.reflect.lite -import kotlin.reflect.* - /** * Represents an entity which may contain declarations of any other entities, * such as a class or a package. @@ -10,5 +8,6 @@ interface KDeclarationContainer { /** * All functions and properties accessible in this container. */ - //public val members: Collection> + private val members: Collection> + get() = TODO() } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KFunction.kt b/src/main/java/kotlinx/reflect/lite/KFunction.kt index 88a2c74..7861fee 100644 --- a/src/main/java/kotlinx/reflect/lite/KFunction.kt +++ b/src/main/java/kotlinx/reflect/lite/KFunction.kt @@ -40,4 +40,10 @@ public interface KFunction : KCallable, Function { */ @SinceKotlin("1.1") public val isInfix: Boolean + + /** + * `true` if this is a suspending function. + */ + @SinceKotlin("1.1") + public override val isSuspend: Boolean } diff --git a/src/main/java/kotlinx/reflect/lite/KParameter.kt b/src/main/java/kotlinx/reflect/lite/KParameter.kt index b0917b2..f3ff16e 100644 --- a/src/main/java/kotlinx/reflect/lite/KParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KParameter.kt @@ -24,7 +24,8 @@ public interface KParameter : KAnnotatedElement { /** * 0-based index of this parameter in the parameter list of its containing callable. */ - //public val index: Int + private val index: Int + get() = TODO() /** * Name of this parameter as it was declared in the source code, @@ -44,7 +45,8 @@ public interface KParameter : KAnnotatedElement { /** * Kind of this parameter. */ - //public val kind: Kind + private val kind: Kind + get() = TODO() /** * Kind represents a particular position of the parameter declaration in the source code, @@ -68,7 +70,8 @@ public interface KParameter : KAnnotatedElement { * 1. The default value is provided at the declaration of this parameter. * 2. The parameter is declared in a member function and one of the corresponding parameters in the super functions is optional. */ - //public val isOptional: Boolean + private val isOptional: Boolean + get() = TODO() /** * `true` if this parameter is `vararg`. diff --git a/src/main/java/kotlinx/reflect/lite/KProperty.kt b/src/main/java/kotlinx/reflect/lite/KProperty.kt index c9a31d5..937d057 100644 --- a/src/main/java/kotlinx/reflect/lite/KProperty.kt +++ b/src/main/java/kotlinx/reflect/lite/KProperty.kt @@ -1,6 +1,11 @@ package kotlinx.reflect.lite -public interface KProperty : KCallable { +/** + * Represents a property, such as a named `val` or `var` declaration. + * + * @param V the type of the property value. + */ +public interface KProperty : KCallable { /** * `true` if this property is `lateinit`. * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/properties.html#late-initialized-properties) @@ -16,4 +21,230 @@ public interface KProperty : KCallable { */ @SinceKotlin("1.1") public val isConst: Boolean -} \ No newline at end of file + + /** The getter of this property, used to obtain the value of the property. */ + private val getter: Getter + get() = TODO() + + /** + * Represents a property accessor, which is a `get` or `set` method declared alongside the property. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/properties.html#getters-and-setters) + * for more information. + * + * @param V the type of the property, which it is an accessor of. + */ + public interface Accessor { + /** The property which this accessor is originated from. */ + public val property: KProperty + } + + /** + * Getter of the property is a `get` method declared alongside the property. + */ + public interface Getter : Accessor, KFunction +} + +/** + * Represents a property declared as a `var`. + */ +public interface KMutableProperty : kotlin.reflect.KProperty { + /** The setter of this mutable property, used to change the value of the property. */ + public val setter: Setter + + /** + * Setter of the property is a `set` method declared alongside the property. + */ + public interface Setter : kotlin.reflect.KProperty.Accessor, kotlin.reflect.KFunction +} + + +/** + * Represents a property without any kind of receiver. + * Such property is either originally declared in a receiverless context such as a package, + * or has the receiver bound to it. + */ +public interface KProperty0 : kotlin.reflect.KProperty, () -> V { + /** + * Returns the current value of the property. + */ + public fun get(): V + + /** + * Returns the value of the delegate if this is a delegated property, or `null` if this property is not delegated. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/delegated-properties.html) + * for more information. + */ + @SinceKotlin("1.1") + public fun getDelegate(): Any? + + override val getter: Getter + + /** + * Getter of the property is a `get` method declared alongside the property. + * + * Can be used as a function that takes 0 arguments and returns the value of the property type [V]. + */ + public interface Getter : kotlin.reflect.KProperty.Getter, () -> V +} + +/** + * Represents a `var`-property without any kind of receiver. + */ +public interface KMutableProperty0 : KProperty0, KMutableProperty { + /** + * Modifies the value of the property. + * + * @param value the new value to be assigned to this property. + */ + public fun set(value: V) + + override val setter: Setter + + /** + * Setter of the property is a `set` method declared alongside the property. + * + * Can be used as a function that takes new property value as an argument and returns [Unit]. + */ + public interface Setter : KMutableProperty.Setter, (V) -> Unit +} + + +/** + * Represents a property, operations on which take one receiver as a parameter. + * + * @param T the type of the receiver which should be used to obtain the value of the property. + * @param V the type of the property value. + */ +public interface KProperty1 : kotlin.reflect.KProperty, (T) -> V { + /** + * Returns the current value of the property. + * + * @param receiver the receiver which is used to obtain the value of the property. + * For example, it should be a class instance if this is a member property of that class, + * or an extension receiver if this is a top level extension property. + */ + public fun get(receiver: T): V + + /** + * Returns the value of the delegate if this is a delegated property, or `null` if this property is not delegated. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/delegated-properties.html) + * for more information. + * + * Note that for a top level **extension** property, the delegate is the same for all extension receivers, + * so the actual [receiver] instance passed in is not going to make any difference, it must only be a value of [T]. + * + * @param receiver the receiver which is used to obtain the value of the property delegate. + * For example, it should be a class instance if this is a member property of that class, + * or an extension receiver if this is a top level extension property. + * + * @see [kotlin.reflect.full.getExtensionDelegate] // [KProperty1.getExtensionDelegate] + */ + @SinceKotlin("1.1") + public fun getDelegate(receiver: T): Any? + + override val getter: Getter + + /** + * Getter of the property is a `get` method declared alongside the property. + * + * Can be used as a function that takes an argument of type [T] (the receiver) and returns the value of the property type [V]. + */ + public interface Getter : kotlin.reflect.KProperty.Getter, (T) -> V +} + +/** + * Represents a `var`-property, operations on which take one receiver as a parameter. + */ +public interface KMutableProperty1 : KProperty1, KMutableProperty { + /** + * Modifies the value of the property. + * + * @param receiver the receiver which is used to modify the value of the property. + * For example, it should be a class instance if this is a member property of that class, + * or an extension receiver if this is a top level extension property. + * @param value the new value to be assigned to this property. + */ + public fun set(receiver: T, value: V) + + override val setter: Setter + + /** + * Setter of the property is a `set` method declared alongside the property. + * + * Can be used as a function that takes the receiver and the new property value as arguments and returns [Unit]. + */ + public interface Setter : KMutableProperty.Setter, (T, V) -> Unit +} + + +/** + * Represents a property, operations on which take two receivers as parameters, + * such as an extension property declared in a class. + * + * @param D the type of the first receiver. In case of the extension property in a class this is + * the type of the declaring class of the property, or any subclass of that class. + * @param E the type of the second receiver. In case of the extension property in a class this is + * the type of the extension receiver. + * @param V the type of the property value. + */ +public interface KProperty2 : kotlin.reflect.KProperty, (D, E) -> V { + /** + * Returns the current value of the property. In case of the extension property in a class, + * the instance of the class should be passed first and the instance of the extension receiver second. + * + * @param receiver1 the instance of the first receiver. + * @param receiver2 the instance of the second receiver. + */ + public fun get(receiver1: D, receiver2: E): V + + /** + * Returns the value of the delegate if this is a delegated property, or `null` if this property is not delegated. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/delegated-properties.html) + * for more information. + * + * In case of the extension property in a class, the instance of the class should be passed first + * and the instance of the extension receiver second. + * + * @param receiver1 the instance of the first receiver. + * @param receiver2 the instance of the second receiver. + * + * @see [kotlin.reflect.full.getExtensionDelegate] // [KProperty2.getExtensionDelegate] + */ + @SinceKotlin("1.1") + public fun getDelegate(receiver1: D, receiver2: E): Any? + + override val getter: Getter + + /** + * Getter of the property is a `get` method declared alongside the property. + * + * Can be used as a function that takes an argument of type [D] (the first receiver), an argument of type [E] (the second receiver) + * and returns the value of the property type [V]. + */ + public interface Getter : kotlin.reflect.KProperty.Getter, (D, E) -> V +} + +/** + * Represents a `var`-property, operations on which take two receivers as parameters. + */ +public interface KMutableProperty2 : KProperty2, KMutableProperty { + /** + * Modifies the value of the property. + * + * @param receiver1 the instance of the first receiver. + * @param receiver2 the instance of the second receiver. + * @param value the new value to be assigned to this property. + */ + public fun set(receiver1: D, receiver2: E, value: V) + + override val setter: Setter + + /** + * Setter of the property is a `set` method declared alongside the property. + * + * Can be used as a function that takes an argument of type [D] (the first receiver), an argument of type [E] (the second receiver), + * and the new property value and returns [Unit]. + */ + public interface Setter : KMutableProperty.Setter, (D, E, V) -> Unit +} + diff --git a/src/main/java/kotlinx/reflect/lite/KType.kt b/src/main/java/kotlinx/reflect/lite/KType.kt index 4c2ba6d..ae26bcf 100644 --- a/src/main/java/kotlinx/reflect/lite/KType.kt +++ b/src/main/java/kotlinx/reflect/lite/KType.kt @@ -16,8 +16,9 @@ public interface KType : KAnnotatedElement { * * Returns `null` if this type is not denotable in Kotlin, for example if it is an intersection type. */ - //@SinceKotlin("1.1") - //public val classifier: KClassifier? + @SinceKotlin("1.1") + private val classifier: KClassifier? + get() = TODO() /** * Type arguments passed for the parameters of the classifier in this type. @@ -27,8 +28,9 @@ public interface KType : KAnnotatedElement { * then its outer class, and so on. * For example, in the type `Outer.Inner` the returned list is `[C, D, A, B]`. */ - //@SinceKotlin("1.1") - //public val arguments: List + @SinceKotlin("1.1") + private val arguments: List + get() = TODO() /** * `true` if this type was marked nullable in the source code. diff --git a/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt new file mode 100644 index 0000000..96e0067 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt @@ -0,0 +1,39 @@ +package kotlinx.reflect.lite + +/** + * Represents a declaration of a type parameter of a class or a callable. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#generics) + * for more information. + */ +@SinceKotlin("1.1") +public interface KTypeParameter : KClassifier { + /** + * The name of this type parameter as it was declared in the source code. + */ + private val name: String + get() = TODO() + + /** + * Upper bounds, or generic constraints imposed on this type parameter. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#upper-bounds) + * for more information. + */ + private val upperBounds: List + get() = TODO() + + /** + * Declaration-site variance of this type parameter. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#declaration-site-variance) + * for more information. + */ + private val variance: KVariance + get() = TODO() + + /** + * `true` if this type parameter is `reified`. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters) + * for more information. + */ + private val isReified: Boolean + get() = TODO() +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt new file mode 100644 index 0000000..7b10cfa --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt @@ -0,0 +1,79 @@ +package kotlinx.reflect.lite + +/** + * Represents a type projection. Type projection is usually the argument to another type in a type usage. + * For example, in the type `Array`, `out Number` is the covariant projection of the type represented by the class `Number`. + * + * Type projection is either the star projection, or an entity consisting of a specific type plus optional variance. + * + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#type-projections) + * for more information. + */ +@SinceKotlin("1.1") +public data class KTypeProjection constructor( + /** + * The use-site variance specified in the projection, or `null` if this is a star projection. + */ + public val variance: KVariance?, + /** + * The type specified in the projection, or `null` if this is a star projection. + */ + public val type: KType? +) { + + init { + require((variance == null) == (type == null)) { + if (variance == null) + "Star projection must have no type specified." + else + "The projection variance $variance requires type to be specified." + } + } + + override fun toString(): String = when (variance) { + null -> "*" + KVariance.INVARIANT -> type.toString() + KVariance.IN -> "in $type" + KVariance.OUT -> "out $type" + } + + public companion object { + // provided for compiler access + @JvmField + @PublishedApi + internal val star: KTypeProjection = KTypeProjection(null, null) + + /** + * Star projection, denoted by the `*` character. + * For example, in the type `KClass<*>`, `*` is the star projection. + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#star-projections) + * for more information. + */ + public val STAR: KTypeProjection get() = star + + /** + * Creates an invariant projection of a given type. Invariant projection is just the type itself, + * without any use-site variance modifiers applied to it. + * For example, in the type `Set`, `String` is an invariant projection of the type represented by the class `String`. + */ + @JvmStatic + public fun invariant(type: KType): KTypeProjection = + KTypeProjection(KVariance.INVARIANT, type) + + /** + * Creates a contravariant projection of a given type, denoted by the `in` modifier applied to a type. + * For example, in the type `MutableList`, `in Number` is a contravariant projection of the type of class `Number`. + */ + @JvmStatic + public fun contravariant(type: KType): KTypeProjection = + KTypeProjection(KVariance.IN, type) + + /** + * Creates a covariant projection of a given type, denoted by the `out` modifier applied to a type. + * For example, in the type `Array`, `out Number` is a covariant projection of the type of class `Number`. + */ + @JvmStatic + public fun covariant(type: KType): KTypeProjection = + KTypeProjection(KVariance.OUT, type) + } +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KVariance.kt b/src/main/java/kotlinx/reflect/lite/KVariance.kt new file mode 100644 index 0000000..f1bd882 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KVariance.kt @@ -0,0 +1,29 @@ +package kotlinx.reflect.lite + +/** + * Represents variance applied to a type parameter on the declaration site (*declaration-site variance*), + * or to a type in a projection (*use-site variance*). + * + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#variance) + * for more information. + * + * @see [KTypeParameter.variance] + * @see [KTypeProjection] + */ +@SinceKotlin("1.1") +enum class KVariance { + /** + * The affected type parameter or type is *invariant*, which means it has no variance applied to it. + */ + INVARIANT, + + /** + * The affected type parameter or type is *contravariant*. Denoted by the `in` modifier in the source code. + */ + IN, + + /** + * The affected type parameter or type is *covariant*. Denoted by the `out` modifier in the source code. + */ + OUT, +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KVisibility.kt b/src/main/java/kotlinx/reflect/lite/KVisibility.kt new file mode 100644 index 0000000..fd46bca --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KVisibility.kt @@ -0,0 +1,34 @@ +package kotlinx.reflect.lite + +/** + * Visibility is an aspect of a Kotlin declaration regulating where that declaration is accessible in the source code. + * Visibility can be changed with one of the following modifiers: `public`, `protected`, `internal`, `private`. + * + * Note that some Java visibilities such as package-private and protected (which also gives access to items from the same package) + * cannot be represented in Kotlin, so there's no [KVisibility] value corresponding to them. + * + * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/visibility-modifiers.html) + * for more information. + */ +@SinceKotlin("1.1") +enum class KVisibility { + /** + * Visibility of declarations marked with the `public` modifier, or with no modifier at all. + */ + PUBLIC, + + /** + * Visibility of declarations marked with the `protected` modifier. + */ + PROTECTED, + + /** + * Visibility of declarations marked with the `internal` modifier. + */ + INTERNAL, + + /** + * Visibility of declarations marked with the `private` modifier. + */ + PRIVATE, +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index f9070bd..109c3ca 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -14,10 +14,10 @@ internal class KClassImpl( override val simpleName: String get() = kmClass.name - override val properties: Collection> + private val properties: Collection> get() = kmClass.properties.map(::KPropertyImpl) - override val functions: Collection> + private val functions: Collection> get() = kmClass.functions.map(::KFunctionImpl) override val constructors: Collection> diff --git a/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt b/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt index d8f781f..75451d8 100644 --- a/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt +++ b/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt @@ -5,24 +5,6 @@ import org.junit.Test import kotlin.test.* class BasicReflectTest { - - @Test - fun testReturnTypeAndNullability() { - val kClass = ReflectionLite.loadClassMetadata(Types::class.java)!! - val notNullListOfStrings = kClass.functions.single { it.name == "notNullListOfStrings" } - assertTrue(notNullListOfStrings.parameters.isEmpty()) - } - - @Test - fun testParameterNamesAndNullability() { - val kClass = ReflectionLite.loadClassMetadata(Types.Nested::class.java)!! - val method = kClass.functions.single { it.name == "method" } - - val parameters = method.parameters - assertEquals(listOf("nullableString", "nonNullIntArray", "nullableNested"), parameters.map { it.name }) - assertEquals(listOf(true, false, true), parameters.map { it.type?.isMarkedNullable }) - } - @Test fun testConstructor() { val kClass = ReflectionLite.loadClassMetadata(Types::class.java)!! @@ -45,45 +27,4 @@ class BasicReflectTest { assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Enum::class.java)!!.isFinal) assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Companion::class.java)!!.isCompanion) } - - @Test - fun testProperties() { - val kClass = ReflectionLite.loadClassMetadata(Properties::class.java)!! - val backingField = kClass.properties.single { it.name == "backingField" } - - assertEquals("backingField", backingField.name) - } - - @Test - fun testCallableModifiers() { - val kClass = ReflectionLite.loadClassMetadata(CallableModifiers::class.java)!! - - assertTrue(kClass.functions.single { it.name == "inline" }.isInline) - assertTrue(kClass.functions.single { it.name == "external" }.isExternal) - assertTrue(kClass.functions.single { it.name == "plus" }.isOperator) - assertTrue(kClass.functions.single { it.name == "infix" }.isInfix) - - assertTrue(kClass.properties.single { it.name == "lateinit" }.isLateinit) - assertTrue(kClass.properties.single { it.name == "const" }.isConst) - - assertFalse(kClass.functions.single { it.name == "external" }.isInline) - assertFalse(kClass.functions.single { it.name == "plus" }.isExternal) - assertFalse(kClass.functions.single { it.name == "infix" }.isOperator) - assertFalse(kClass.functions.single { it.name == "suspend" }.isInfix) - assertFalse(kClass.functions.single { it.name == "inline" }.isSuspend) - - assertFalse(kClass.properties.single { it.name == "lateinit" }.isConst) - assertFalse(kClass.properties.single { it.name == "const" }.isLateinit) - } - - @Test - fun testParameterVararg() { - val kClass = ReflectionLite.loadClassMetadata(ParameterVararg::class.java)!! - - val parameters = kClass.functions.single { it.name == "foo" }.parameters - assertFalse(parameters[0].type!!.isMarkedNullable) - - assertTrue(parameters[1].isVararg) - assertFalse(parameters[1].type!!.isMarkedNullable) - } } From 315d2a00418fd1841b8d838401a73142e6b76ac4 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 25 Jan 2022 22:50:57 +0300 Subject: [PATCH 04/74] Implementation of reflect API via descriptors --- .../java/kotlinx/reflect/lite/KCallable.kt | 6 +- src/main/java/kotlinx/reflect/lite/KClass.kt | 20 +- .../java/kotlinx/reflect/lite/KParameter.kt | 12 +- src/main/java/kotlinx/reflect/lite/KType.kt | 3 +- .../kotlinx/reflect/lite/KTypeParameter.kt | 6 +- .../kotlinx/reflect/lite/ReflectionLite.kt | 2 +- .../lite/builtins/JavaToKotlinClassMap.kt | 151 ++++++++++++++ .../reflect/lite/builtins/JvmPrimitiveType.kt | 30 +++ .../reflect/lite/builtins/KotlinBuiltIns.kt | 51 +++++ .../reflect/lite/builtins/PrimitiveType.kt | 16 ++ .../reflect/lite/descriptors/descriptors.kt | 132 ++++++++++++ .../lite/descriptors/descriptorsImpl.kt | 188 ++++++++++++++++++ .../reflect/lite/impl/KCallableImpl.kt | 22 +- .../kotlinx/reflect/lite/impl/KClassImpl.kt | 98 +++++++-- .../reflect/lite/impl/KConstructorImpl.kt | 33 --- .../reflect/lite/impl/KFunctionImpl.kt | 31 ++- .../reflect/lite/impl/KParameterImpl.kt | 16 +- .../reflect/lite/impl/KPropertyImpl.kt | 30 ++- .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 8 +- .../reflect/lite/impl/KTypeParameterImpl.kt | 14 ++ .../reflect/lite/impl/ReflectionLiteImpl.kt | 15 +- .../lite/misc/CompanionObjectMapping.kt | 21 ++ .../java/kotlinx/reflect/lite/misc/util.kt | 84 ++++++++ .../java/kotlinx/reflect/lite/name/names.kt | 79 ++++++++ .../java/kotlinx/reflect/lite/types/types.kt | 16 ++ .../reflect/lite/test/BasicReflectTest.kt | 9 + 26 files changed, 949 insertions(+), 144 deletions(-) create mode 100644 src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt create mode 100644 src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt create mode 100644 src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt create mode 100644 src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt create mode 100644 src/main/java/kotlinx/reflect/lite/misc/util.kt create mode 100644 src/main/java/kotlinx/reflect/lite/name/names.kt create mode 100644 src/main/java/kotlinx/reflect/lite/types/types.kt diff --git a/src/main/java/kotlinx/reflect/lite/KCallable.kt b/src/main/java/kotlinx/reflect/lite/KCallable.kt index 66009b4..2d2ec4e 100644 --- a/src/main/java/kotlinx/reflect/lite/KCallable.kt +++ b/src/main/java/kotlinx/reflect/lite/KCallable.kt @@ -38,8 +38,7 @@ public interface KCallable : KAnnotatedElement { * The list of type parameters of this callable. */ @SinceKotlin("1.1") - private val typeParameters: List - get() = TODO() + public val typeParameters: List /** * Calls this callable with the specified list of arguments and returns the result. @@ -59,8 +58,7 @@ public interface KCallable : KAnnotatedElement { * Visibility of this callable, or `null` if its visibility cannot be represented in Kotlin. */ @SinceKotlin("1.1") - private val visibility: KVisibility? - get() = TODO() + public val visibility: KVisibility? /** * `true` if this callable is `final`. diff --git a/src/main/java/kotlinx/reflect/lite/KClass.kt b/src/main/java/kotlinx/reflect/lite/KClass.kt index 1b9008d..943c34e 100644 --- a/src/main/java/kotlinx/reflect/lite/KClass.kt +++ b/src/main/java/kotlinx/reflect/lite/KClass.kt @@ -1,11 +1,14 @@ package kotlinx.reflect.lite +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor + /** * Represents a class and provides introspection capabilities. * * @param T the type of the class. */ -public interface KClass : KDeclarationContainer, KAnnotatedElement, KClassifier { +public interface KClass : KDeclarationContainer, KAnnotatedElement, KClassifier { /** * The simple name of the class as it was declared in the source code, * or `null` if the class has no name (if, for example, it is a class of an anonymous object). @@ -16,8 +19,7 @@ public interface KClass : KDeclarationContainer, KAnnotatedElement, KCl * The fully qualified dot-separated name of the class, * or `null` if the class is local or a class of an anonymous object. */ - private val qualifiedName: String? - get() = TODO() + public val qualifiedName: String? /** * All constructors declared in this class. @@ -27,8 +29,7 @@ public interface KClass : KDeclarationContainer, KAnnotatedElement, KCl /** * All classes declared inside this class. This includes both inner and static nested classes. */ - private val nestedClasses: Collection> - get() = TODO() + public val nestedClasses: Collection> /** * The instance of the object declaration, or `null` if this class is not an object declaration. @@ -46,8 +47,7 @@ public interface KClass : KDeclarationContainer, KAnnotatedElement, KCl * The list of type parameters of this class. This list does *not* include type parameters of outer classes. */ @SinceKotlin("1.1") - private val typeParameters: List - get() = TODO() + public val typeParameters: List /** * The list of immediate supertypes of this class, in the order they are listed in the source code. @@ -60,15 +60,13 @@ public interface KClass : KDeclarationContainer, KAnnotatedElement, KCl * The list of the immediate subclasses if this class is a sealed class, or an empty list otherwise. */ @SinceKotlin("1.3") - private val sealedSubclasses: List> - get() = TODO() + public val sealedSubclasses: List> /** * Visibility of this class, or `null` if its visibility cannot be represented in Kotlin. */ @SinceKotlin("1.1") - private val visibility: KVisibility? - get() = TODO() + public val visibility: KVisibility? /** * `true` if this class is `final`. diff --git a/src/main/java/kotlinx/reflect/lite/KParameter.kt b/src/main/java/kotlinx/reflect/lite/KParameter.kt index f3ff16e..dca09b5 100644 --- a/src/main/java/kotlinx/reflect/lite/KParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KParameter.kt @@ -24,8 +24,7 @@ public interface KParameter : KAnnotatedElement { /** * 0-based index of this parameter in the parameter list of its containing callable. */ - private val index: Int - get() = TODO() + public val index: Int /** * Name of this parameter as it was declared in the source code, @@ -40,13 +39,13 @@ public interface KParameter : KAnnotatedElement { * Type of this parameter. For a `vararg` parameter, this is the type of the corresponding array, * not the individual element. */ - public val type: KType? + private val type: KType? + get() = TODO() /** * Kind of this parameter. */ - private val kind: Kind - get() = TODO() + public val kind: Kind /** * Kind represents a particular position of the parameter declaration in the source code, @@ -79,5 +78,6 @@ public interface KParameter : KAnnotatedElement { * for more information. */ @SinceKotlin("1.1") - public val isVararg: Boolean + private val isVararg: Boolean + get() = TODO() } diff --git a/src/main/java/kotlinx/reflect/lite/KType.kt b/src/main/java/kotlinx/reflect/lite/KType.kt index ae26bcf..1509aa3 100644 --- a/src/main/java/kotlinx/reflect/lite/KType.kt +++ b/src/main/java/kotlinx/reflect/lite/KType.kt @@ -49,6 +49,7 @@ public interface KType : KAnnotatedElement { * } * ``` */ - public val isMarkedNullable: Boolean + private val isMarkedNullable: Boolean + get() = TODO() } diff --git a/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt index 96e0067..43f1625 100644 --- a/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt @@ -10,8 +10,7 @@ public interface KTypeParameter : KClassifier { /** * The name of this type parameter as it was declared in the source code. */ - private val name: String - get() = TODO() + public val name: String /** * Upper bounds, or generic constraints imposed on this type parameter. @@ -34,6 +33,5 @@ public interface KTypeParameter : KClassifier { * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters) * for more information. */ - private val isReified: Boolean - get() = TODO() + public val isReified: Boolean } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt index 9290c30..c5c2c0c 100644 --- a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt +++ b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt @@ -25,7 +25,7 @@ object ReflectionLite { /** * Metadata for the given [klass] if this is a Kotlin class, or `null` otherwise. */ - fun loadClassMetadata(klass: Class<*>): KClass<*>? { + fun loadClassMetadata(klass: Class): KClass? { return ReflectionLiteImpl.loadClassMetadata(klass) } } diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt new file mode 100644 index 0000000..319a746 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt @@ -0,0 +1,151 @@ +package kotlinx.reflect.lite.builtins + +import kotlinx.reflect.lite.builtins.StandardNames.FQ_NAMES +import kotlinx.reflect.lite.misc.* +import kotlinx.reflect.lite.name.* + +object JavaToKotlinClassMap { + private const val BIG_FUNCTION_ARITY = 23 + + private const val NUMBERED_FUNCTION_PREFIX = "kotlin.Function" + private const val NUMBERED_K_FUNCTION_PREFIX = "kotlin.reflect.KFunction" + private const val NUMBERED_SUSPEND_FUNCTION_PREFIX = "kotlin.coroutines.SuspendFunction" + private const val NUMBERED_K_SUSPEND_FUNCTION_PREFIX = "kotlin.reflect.KSuspendFunction" + + private val FUNCTION_N_CLASS_ID = ClassId.topLevel(FqName("kotlin.jvm.functions.FunctionN")) + private val K_FUNCTION_CLASS_ID = ClassId.topLevel(FqName("kotlin.reflect.KFunction")) + + private val javaToKotlin = hashMapOf() + private val kotlinToJava = hashMapOf() + + data class PlatformMutabilityMapping( + val javaClass: ClassId, + val kotlinReadOnly: ClassId, + val kotlinMutable: ClassId + ) + + private inline fun mutabilityMapping(kotlinReadOnly: ClassId, kotlinMutable: FqName): PlatformMutabilityMapping { + val mutableClassId = ClassId( + kotlinReadOnly.packageFqName, + FqName(kotlinMutable.asString().substring(kotlinReadOnly.packageFqName.asString().length + 1)), + false + ) + return PlatformMutabilityMapping(T::class.java.classId, kotlinReadOnly, mutableClassId) + } + + private val mutabilityMappings = listOf( + mutabilityMapping>(ClassId.topLevel(FQ_NAMES.iterable), FQ_NAMES.mutableIterable), + mutabilityMapping>(ClassId.topLevel(FQ_NAMES.iterator), FQ_NAMES.mutableIterator), + mutabilityMapping>(ClassId.topLevel(FQ_NAMES.collection), FQ_NAMES.mutableCollection), + mutabilityMapping>(ClassId.topLevel(FQ_NAMES.list), FQ_NAMES.mutableList), + mutabilityMapping>(ClassId.topLevel(FQ_NAMES.set), FQ_NAMES.mutableSet), + mutabilityMapping>(ClassId.topLevel(FQ_NAMES.listIterator), FQ_NAMES.mutableListIterator), + mutabilityMapping>(ClassId.topLevel(FQ_NAMES.map), FQ_NAMES.mutableMap), + mutabilityMapping>( + ClassId.topLevel(FQ_NAMES.map).createNestedClassId(FQ_NAMES.mapEntry.shortName()), FQ_NAMES.mutableMapEntry + ) + ) + + init { + addTopLevel(Any::class.java, FQ_NAMES.any) + addTopLevel(String::class.java, FQ_NAMES.string) + addTopLevel(CharSequence::class.java, FQ_NAMES.charSequence) + addTopLevel(Throwable::class.java, FQ_NAMES.throwable) + addTopLevel(Cloneable::class.java, FQ_NAMES.cloneable) + addTopLevel(Number::class.java, FQ_NAMES.number) + addTopLevel(Comparable::class.java, FQ_NAMES.comparable) + addTopLevel(Enum::class.java, FQ_NAMES._enum) + addTopLevel(Annotation::class.java, FQ_NAMES.annotation) + + for ((javaClassId, readOnlyClassId, mutableClassId) in mutabilityMappings) { + add(javaClassId, readOnlyClassId) + addKotlinToJava(mutableClassId.asSingleFqName(), javaClassId) + } + + for (jvmType in JvmPrimitiveType.values()) { + add( + ClassId.topLevel(jvmType.wrapperFqName), + ClassId.topLevel(jvmType.primitiveType.typeFqName) + ) + } + + for (classId in CompanionObjectMapping.allClassesWithIntrinsicCompanions()) { + add( + ClassId.topLevel(FqName("kotlin.jvm.internal." + classId.shortClassName + "CompanionObject")), + classId.createNestedClassId("Companion") + ) + } + + for (i in 0 until BIG_FUNCTION_ARITY) { + add(ClassId.topLevel(FqName("kotlin.jvm.functions.Function$i")), ClassId.topLevel(FqName("kotlin.Function$i"))) + addKotlinToJava(FqName(NUMBERED_K_FUNCTION_PREFIX + i), K_FUNCTION_CLASS_ID) + } + for (i in 0 until BIG_FUNCTION_ARITY - 1) { + addKotlinToJava(FqName("kotlin.reflect.KSuspendFunction$i"), K_FUNCTION_CLASS_ID) + } + + addKotlinToJava(FQ_NAMES.nothing, Void::class.java.classId) + } + + /** + * E.g. + * java.lang.String -> kotlin.String + * java.lang.Integer -> kotlin.Int + * kotlin.jvm.internal.IntCompanionObject -> kotlin.Int.Companion + * java.util.List -> kotlin.List + * java.util.Map.Entry -> kotlin.Map.Entry + * java.lang.Void -> null + * kotlin.jvm.functions.Function3 -> kotlin.Function3 + * kotlin.jvm.functions.FunctionN -> null // Without a type annotation like @Arity(n), it's impossible to find out arity + */ + fun mapJavaToKotlin(fqName: FqName): ClassId? { + return javaToKotlin[fqName] + } + + /** + * E.g. + * kotlin.Throwable -> java.lang.Throwable + * kotlin.Int -> java.lang.Integer + * kotlin.Int.Companion -> kotlin.jvm.internal.IntCompanionObject + * kotlin.Nothing -> java.lang.Void + * kotlin.IntArray -> null + * kotlin.Function3 -> kotlin.jvm.functions.Function3 + * kotlin.coroutines.SuspendFunction3 -> kotlin.jvm.functions.Function4 + * kotlin.Function42 -> kotlin.jvm.functions.FunctionN + * kotlin.coroutines.SuspendFunction42 -> kotlin.jvm.functions.FunctionN + * kotlin.reflect.KFunction3 -> kotlin.reflect.KFunction + * kotlin.reflect.KSuspendFunction3 -> kotlin.reflect.KFunction + * kotlin.reflect.KFunction42 -> kotlin.reflect.KFunction + * kotlin.reflect.KSuspendFunction42 -> kotlin.reflect.KFunction + */ + // TODO: maybe take ClassId as well + fun mapKotlinToJava(kotlinFqName: FqName): ClassId? = when { + isKotlinFunctionWithBigArity(kotlinFqName, NUMBERED_FUNCTION_PREFIX) -> FUNCTION_N_CLASS_ID + isKotlinFunctionWithBigArity(kotlinFqName, NUMBERED_SUSPEND_FUNCTION_PREFIX) -> FUNCTION_N_CLASS_ID + isKotlinFunctionWithBigArity(kotlinFqName, NUMBERED_K_FUNCTION_PREFIX) -> K_FUNCTION_CLASS_ID + isKotlinFunctionWithBigArity(kotlinFqName, NUMBERED_K_SUSPEND_FUNCTION_PREFIX) -> K_FUNCTION_CLASS_ID + else -> kotlinToJava[kotlinFqName] + } + + private fun isKotlinFunctionWithBigArity(kotlinFqName: FqName, prefix: String): Boolean { + val arityString = kotlinFqName.asString().substringAfter(prefix, "") + if (arityString.isNotEmpty() && !arityString.startsWith('0')) { + val arity = arityString.toIntOrNull() + return arity != null && arity >= BIG_FUNCTION_ARITY + } + return false + } + + private fun add(javaClassId: ClassId, kotlinClassId: ClassId) { + javaToKotlin[javaClassId.asSingleFqName()] = kotlinClassId + addKotlinToJava(kotlinClassId.asSingleFqName(), javaClassId) + } + + private fun addTopLevel(javaClass: Class<*>, kotlinFqName: FqName) { + add(javaClass.classId, ClassId.topLevel(kotlinFqName)) + } + + private fun addKotlinToJava(kotlinFqName: FqName, javaClassId: ClassId) { + kotlinToJava[kotlinFqName] = javaClassId + } +} diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt new file mode 100644 index 0000000..30d46ea --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt @@ -0,0 +1,30 @@ +package kotlinx.reflect.lite.builtins + +import kotlinx.reflect.lite.name.* + +enum class JvmPrimitiveType(val primitiveType: PrimitiveType, val javaKeywordName: String, wrapperClassName: String) { + BOOLEAN(PrimitiveType.BOOLEAN, "boolean", "Boolean"), + CHAR(PrimitiveType.CHAR, "char", "Character"), + BYTE(PrimitiveType.BYTE, "byte", "Byte"), + SHORT(PrimitiveType.SHORT, "short", "Short"), + INT(PrimitiveType.INT, "int", "Integer"), + FLOAT(PrimitiveType.FLOAT, "float", "Float"), + LONG(PrimitiveType.LONG, "long", "Long"), + DOUBLE(PrimitiveType.DOUBLE, "double", "Double"); + + val wrapperFqName = FqName("java.lang.$wrapperClassName") + + companion object { + private val TYPE_BY_NAME: MutableMap = + HashMap() + + operator fun get(name: String): JvmPrimitiveType = + TYPE_BY_NAME[name] ?: throw AssertionError("Non-primitive type name passed: $name") + + init { + for (type in values()) { + TYPE_BY_NAME[type.javaKeywordName] = type + } + } + } +} diff --git a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt new file mode 100644 index 0000000..1e44113 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt @@ -0,0 +1,51 @@ +package kotlinx.reflect.lite.builtins + +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.name.* +import kotlinx.reflect.lite.types.* +import kotlinx.reflect.lite.types.KotlinType + +internal object StandardNames { + val BUILT_INS_PACKAGE_FQ_NAME = FqName("kotlin") + + val FQ_NAMES = FqNames() + class FqNames { + val array = FqName("kotlin.Array") + val any = FqName("kotlin.Any") + val string = FqName("kotlin.String") + val charSequence = FqName("kotlin.CharSequence") + val throwable = FqName("kotlin.Throwable") + val cloneable = FqName("kotlin.Cloneable") + val number = FqName("kotlin.Number") + val comparable = FqName("kotlin.Comparable") + val _enum = FqName("kotlin.Enum") + val annotation = FqName("kotlin.Annotation") + val nothing = FqName("kotlin.Nothing") + val _boolean = FqName("kotlin.Boolean") + + val iterable = FqName("kotlin.collections.Iterable") + val iterator = FqName("kotlin.collections.Iterator") + val collection = FqName("kotlin.collections.Collection") + val list = FqName("kotlin.collections.List") + val set = FqName("kotlin.collections.Set") + val listIterator = FqName("kotlin.collections.ListIterator") + val map = FqName("kotlin.collections.Map") + val mapEntry = FqName("kotlin.collections.Map.Entry") + val mutableIterable = FqName("kotlin.collections.MutableIterable") + val mutableIterator = FqName("kotlin.collections.MutableIterator") + val mutableCollection = FqName("kotlin.collections.MutableCollection") + val mutableList = FqName("kotlin.collections.MutableList") + val mutableSet = FqName("kotlin.collections.MutableSet") + val mutableListIterator = FqName("kotlin.collections.MutableListIterator") + val mutableMap = FqName("kotlin.collections.MutableMap") + val mutableMapEntry = FqName("kotlin.collections.MutableMap.Entry") + } + + val CLASS_IDS = ClassIds() + class ClassIds { + val any = ClassId(BUILT_INS_PACKAGE_FQ_NAME, "Any") + } +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt new file mode 100644 index 0000000..9dcf76b --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt @@ -0,0 +1,16 @@ +package kotlinx.reflect.lite.builtins + +import kotlinx.reflect.lite.name.* + +enum class PrimitiveType(val typeName: Name) { + BOOLEAN("Boolean"), CHAR("Char"), BYTE("Byte"), SHORT("Short"), INT("Int"), FLOAT("Float"), LONG("Long"), DOUBLE("Double"); + + val arrayTypeName: Name = typeName + "Array" + + val typeFqName: FqName = StandardNames.BUILT_INS_PACKAGE_FQ_NAME.child(typeName) + val arrayTypeFqName: FqName = StandardNames.BUILT_INS_PACKAGE_FQ_NAME.child(arrayTypeName) + + companion object { + val NUMBER_TYPES = setOf(CHAR, BYTE, SHORT, INT, FLOAT, LONG, DOUBLE) + } +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt new file mode 100644 index 0000000..36945c6 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -0,0 +1,132 @@ +package kotlinx.reflect.lite.descriptors + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.name.* +import kotlinx.reflect.lite.types.KotlinType + +internal interface ModuleDescriptor { + fun findClass(name: ClassName): ClassDescriptor +} + +internal interface Annotated { + private val annotations: Annotations + get() = TODO() +} + +interface Annotations { + fun getAll(): List + + object Empty : Annotations { + override fun getAll(): List = emptyList() + } + + companion object { + val EMPTY: Empty get() = Empty + } +} + +internal interface DeclarationDescriptor : Annotated { + val name: Name +} + +internal interface DeclarationContainerDescriptor { + private val members: Collection + get() = TODO() +} + +internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierDescriptor { + val classId: ClassId + val module: ModuleDescriptor + val kClass: KClassImpl<*> + + val constructors: List + val nestedClasses: List + val sealedSubclasses: List + + public val typeParameters: List + + private val supertypes: List + get() = TODO() + + public val visibility: KVisibility? + + val isFinal: Boolean + val isOpen: Boolean + val isAbstract: Boolean + val isSealed: Boolean + val isData: Boolean + val isInner: Boolean + val isCompanion: Boolean + val isFun: Boolean + val isValue: Boolean +} + +internal interface CallableDescriptor : DeclarationDescriptor { + val module: ModuleDescriptor + val containingClass: ClassDescriptor? + + val valueParameters: List + + public val typeParameters: List + + private val returnType: KType + get() = TODO() + + public val visibility: KVisibility? + + val isFinal: Boolean + val isOpen: Boolean + val isAbstract: Boolean +} + +internal interface FunctionDescriptor : CallableDescriptor { + val isInline: Boolean + val isExternal: Boolean + val isOperator: Boolean + val isInfix: Boolean + val isSuspend: Boolean +} + +internal interface ParameterDescriptor : DeclarationDescriptor { + val containingDeclaration: CallableDescriptor +} + +internal interface ValueParameterDescriptor : ParameterDescriptor + +internal interface ReceiverParameterDescriptor : ParameterDescriptor + +internal interface PropertyDescriptor : CallableDescriptor { + private val isVar: Boolean + get() = TODO() + public val isLateInit: Boolean + public val isConst: Boolean + private val isDelegated: Boolean + get() = TODO() + + private val getter: PropertyGetterDescriptor? + get() = TODO() + private val setter: PropertySetterDescriptor? + get() = TODO() +} + +internal interface PropertyAccessorDescriptor : FunctionDescriptor { + val property: PropertyDescriptor +} +internal interface PropertyGetterDescriptor : PropertyAccessorDescriptor +internal interface PropertySetterDescriptor : PropertyAccessorDescriptor + +internal interface ConstructorDescriptor : FunctionDescriptor + +internal interface ClassifierDescriptor : DeclarationDescriptor + +internal interface TypeParameterDescriptor : ClassifierDescriptor { + val containingDeclaration: DeclarationDescriptor + private val upperBounds: List + get() = TODO() + private val variance: KVariance + get() = TODO() + val isReified: Boolean +} + diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt new file mode 100644 index 0000000..d08e5fc --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt @@ -0,0 +1,188 @@ +package kotlinx.reflect.lite.descriptors + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.misc.* +import kotlinx.reflect.lite.name.* + +internal class ModuleDescriptorImpl(private val classLoader: ClassLoader) : ModuleDescriptor { + override fun findClass(name: ClassName): ClassDescriptor { + // TODO whyyy java to kotlin class map, and kotlin to java wtf + val fqName = + (JavaToKotlinClassMap.mapKotlinToJava(FqName(name.replace('/', '.'))) ?: ClassId(name)).asJavaLookupFqName() + val jClass = classLoader.tryLoadClass(fqName) + // todo error message if the class is not found + return KClassImpl(jClass!!).descriptor + } +} + +internal class ClassDescriptorImpl internal constructor( + val kmClass: KmClass, + override val module: ModuleDescriptor, + override val classId: ClassId, + override val kClass: KClassImpl<*> +) : ClassDescriptor { + override val name: Name + get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') + + override val constructors: List + get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this) } + + override val nestedClasses: List + get() = kmClass.nestedClasses.map { module.findClass(classId.createNestedClassId(it).asClassName()) } + + override val sealedSubclasses: List + get() = kmClass.sealedSubclasses.map(module::findClass) + + override val visibility: KVisibility? + get() = kmClass.flags.toVisibility() + + override val typeParameters: List + get() = TODO("Not yet implemented") + + override val isFinal: Boolean + get() = Flag.Common.IS_FINAL(kmClass.flags) + override val isOpen: Boolean + get() = Flag.Common.IS_OPEN(kmClass.flags) + override val isAbstract: Boolean + get() = Flag.Common.IS_ABSTRACT(kmClass.flags) + override val isSealed: Boolean + get() = Flag.Common.IS_SEALED(kmClass.flags) + override val isData: Boolean + get() = Flag.Class.IS_DATA(kmClass.flags) + override val isInner: Boolean + get() = Flag.Class.IS_INNER(kmClass.flags) + override val isCompanion: Boolean + get() = Flag.Class.IS_COMPANION_OBJECT(kmClass.flags) + override val isFun: Boolean + get() = Flag.Class.IS_FUN(kmClass.flags) + override val isValue: Boolean + get() = Flag.Class.IS_VALUE(kmClass.flags) +} + +internal class ConstructorDescriptorImpl( + val kmCons: KmConstructor, + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptor +) : AbstractFunctionDescriptor(), ConstructorDescriptor { + override val flags: Flags + get() = kmCons.flags + + override val name: Name + get() = "" + + override val valueParameters: List + get() = kmCons.valueParameters.mapIndexed { index, parameter -> + ValueParameterDescriptorImpl(parameter, this, index) + } + + override val typeParameters: List + get() = emptyList() +} + +internal class FunctionDescriptorImpl( + val kmFunction: KmFunction, + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptorImpl? +) : AbstractFunctionDescriptor() { + override val flags: Flags + get() = kmFunction.flags + + override val name: Name + get() = kmFunction.name + + override val valueParameters: List + get() = kmFunction.valueParameters.mapIndexed { index, kmValueParam -> + ValueParameterDescriptorImpl(kmValueParam, this, index) + } + + override val typeParameters: List + get() = kmFunction.typeParameters.map { TypeParameterDescriptorImpl(it, module, this) } +} + +abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor(), FunctionDescriptor { + override val isInline: Boolean + get() = Flag.Function.IS_INLINE(flags) + override val isExternal: Boolean + get() = Flag.Function.IS_EXTERNAL(flags) + override val isOperator: Boolean + get() = Flag.Function.IS_OPERATOR(flags) + override val isInfix: Boolean + get() = Flag.Function.IS_INFIX(flags) + override val isSuspend: Boolean + get() = Flag.Function.IS_SUSPEND(flags) +} + +abstract class AbstractCallableDescriptor : CallableDescriptor { + protected abstract val flags: Flags + + override val visibility: KVisibility? + get() = flags.toVisibility() + + override val isFinal: Boolean + get() = Flag.Common.IS_FINAL(flags) + override val isOpen: Boolean + get() = Flag.Common.IS_OPEN(flags) + override val isAbstract: Boolean + get() = Flag.Common.IS_ABSTRACT(flags) +} + +internal class ValueParameterDescriptorImpl( + private val kmValueParam: KmValueParameter, + override val containingDeclaration: AbstractFunctionDescriptor, + private val index: Int +) : ValueParameterDescriptor { + override val name: Name + get() = kmValueParam.name +} + +internal class TypeParameterDescriptorImpl( + private val kmTypeParam: KmTypeParameter, + private val module: ModuleDescriptor, + override val containingDeclaration: DeclarationDescriptor +) : TypeParameterDescriptor { + internal val id: Int get() = kmTypeParam.id + + override val name: Name + get() = kmTypeParam.name + + override val isReified: Boolean + get() = Flag.TypeParameter.IS_REIFIED(kmTypeParam.flags) +} + +internal class PropertyDescriptorImpl( + val kmProperty: KmProperty, + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptorImpl? +) : AbstractCallableDescriptor(), PropertyDescriptor { + override val flags: Flags + get() = kmProperty.flags + + override val name: Name + get() = kmProperty.name + + override val valueParameters: List + get() = emptyList() + + override val typeParameters: List + get() = kmProperty.typeParameters.map { TypeParameterDescriptorImpl(it, module, this) } + + override val isConst: Boolean + get() = Flag.Property.IS_CONST(flags) + override val isLateInit: Boolean + get() = Flag.Property.IS_LATEINIT(flags) +} + +private fun Flags.toVisibility(): KVisibility? = + when { + Flag.Common.IS_PRIVATE(this) -> KVisibility.PRIVATE + Flag.Common.IS_PRIVATE_TO_THIS(this) -> KVisibility.PRIVATE + Flag.Common.IS_INTERNAL(this) -> KVisibility.INTERNAL + Flag.Common.IS_PROTECTED(this) -> KVisibility.PROTECTED + Flag.Common.IS_PUBLIC(this) -> KVisibility.PUBLIC + Flag.Common.IS_LOCAL(this) -> null + else -> error("Declaration with unknown visibility") + } + diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 46e760c..0e805f9 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -1,5 +1,25 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* -internal abstract class KCallableImpl: KCallable \ No newline at end of file +internal abstract class KCallableImpl: KCallable { + abstract val descriptor: CallableDescriptor + + override val parameters: List + get() { + val descriptor = descriptor + val result = mutableListOf() + // TODO bound parameter + for ((index, i) in descriptor.valueParameters.indices.withIndex()) { + result.add(KParameterImpl(descriptor.valueParameters[i], index, KParameter.Kind.VALUE)) + } + return result + } + + override val visibility: KVisibility? + get() = descriptor.visibility + + override val typeParameters: List + get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index 109c3ca..70eec32 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -1,44 +1,100 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.misc.* internal class KClassImpl( - private val klass: Class<*>, - private val metadata: KotlinClassMetadata.Class + val jClass: Class ) : KClass { - private val kmClass = metadata.toKmClass() - private val flags: Flags = kmClass.flags + val descriptor: ClassDescriptor = createClassDescriptor() - override val simpleName: String - get() = kmClass.name + private fun createClassDescriptor(): ClassDescriptor { + val header = with(jClass.getAnnotation(Metadata::class.java)) { + KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt) + } + val metadata = KotlinClassMetadata.read(header) + val kmClass = (metadata as? KotlinClassMetadata.Class)?.toKmClass() + ?: error("KotlinClassMetadata.Class metadata is only supported for now") + val module = ModuleDescriptorImpl(jClass.safeClassLoader) + return ClassDescriptorImpl(kmClass, module, jClass.classId, this) + } - private val properties: Collection> - get() = kmClass.properties.map(::KPropertyImpl) + override val simpleName: String? + get() { + if (jClass.isAnonymousClass) return null - private val functions: Collection> - get() = kmClass.functions.map(::KFunctionImpl) + val classId = jClass.classId + return when { + classId.isLocal -> calculateLocalClassName(jClass) + else -> classId.shortClassName + } + } + + override val qualifiedName: String? + get() { + if (jClass.isAnonymousClass) return null + + val classId = jClass.classId + return when { + classId.isLocal -> null + else -> classId.asSingleFqName().asString() + } + } + + private fun calculateLocalClassName(jClass: Class<*>): String { + val name = jClass.simpleName + jClass.enclosingMethod?.let { method -> + return name.substringAfter(method.name + "$") + } + jClass.enclosingConstructor?.let { constructor -> + return name.substringAfter(constructor.name + "$") + } + return name.substringAfter('$') + } override val constructors: Collection> - get() = kmClass.constructors.map(::KConstructorImpl) + get() = descriptor.constructors.map { + @Suppress("UNCHECKED_CAST") + KFunctionImpl(it) as KFunction + } + + override val nestedClasses: Collection> + get() = descriptor.nestedClasses.map { nestedClassDesc -> + nestedClassDesc.kClass.jClass.let { KClassImpl(it) } + } + + override val sealedSubclasses: List> + get() = descriptor.sealedSubclasses.mapNotNull { subclassDesc -> + @Suppress("UNCHECKED_CAST") + val jClass = subclassDesc.kClass.jClass as Class? + jClass?.let { KClassImpl(it) } + } + + override val visibility: KVisibility? + get() = descriptor.visibility + + override val typeParameters: List + get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } override val isFinal: Boolean - get() = Flag.Common.IS_FINAL(flags) + get() = descriptor.isFinal override val isOpen: Boolean - get() = Flag.Common.IS_OPEN(flags) + get() = descriptor.isOpen override val isAbstract: Boolean - get() = Flag.Common.IS_ABSTRACT(flags) + get() = descriptor.isAbstract override val isSealed: Boolean - get() = Flag.Common.IS_SEALED(flags) + get() = descriptor.isSealed override val isData: Boolean - get() = Flag.Class.IS_DATA(flags) + get() = descriptor.isData override val isInner: Boolean - get() = Flag.Class.IS_INNER(flags) + get() = descriptor.isInner override val isCompanion: Boolean - get() = Flag.Class.IS_COMPANION_OBJECT(flags) + get() = descriptor.isCompanion override val isFun: Boolean - get() = Flag.Class.IS_FUN(flags) + get() = descriptor.isFun override val isValue: Boolean - get() = Flag.Class.IS_VALUE(flags) + get() = descriptor.isValue } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt deleted file mode 100644 index c93e9f2..0000000 --- a/src/main/java/kotlinx/reflect/lite/impl/KConstructorImpl.kt +++ /dev/null @@ -1,33 +0,0 @@ -package kotlinx.reflect.lite.impl - -import kotlinx.metadata.* -import kotlinx.reflect.lite.* - -internal class KConstructorImpl( - private val kmCons: KmConstructor -) : KCallableImpl(), KFunction { - private val flags: Flags = kmCons.flags - - override val name: String - get() = "" - - override val parameters: List - get() = kmCons.valueParameters.map(::KParameterImpl) - - override val isInline: Boolean - get() = false - override val isExternal: Boolean - get() = false - override val isOperator: Boolean - get() = false - override val isInfix: Boolean - get() = false - override val isAbstract: Boolean - get() = Flag.IS_ABSTRACT(flags) - override val isFinal: Boolean - get() = Flag.IS_FINAL(flags) - override val isOpen: Boolean - get() = Flag.IS_OPEN(flags) - override val isSuspend: Boolean - get() = false -} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt index 8680a8f..f51c29d 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt @@ -1,34 +1,29 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* -internal class KFunctionImpl( - private val kmFunction: KmFunction -) : KCallableImpl(), KFunction { - private val flags: Flags = kmFunction.flags - +internal class KFunctionImpl( + override val descriptor: FunctionDescriptor +) : KCallableImpl(), KFunction { override val name: String - get() = kmFunction.name - - override val parameters: List - get() = kmFunction.valueParameters.map(::KParameterImpl) + get() = descriptor.name override val isInline: Boolean - get() = Flag.Function.IS_INLINE(flags) + get() = descriptor.isInline override val isExternal: Boolean - get() = Flag.Function.IS_EXTERNAL(flags) + get() = descriptor.isExternal override val isOperator: Boolean - get() = Flag.Function.IS_OPERATOR(flags) + get() = descriptor.isOperator override val isInfix: Boolean - get() = Flag.Function.IS_INFIX(flags) + get() = descriptor.isInfix override val isSuspend: Boolean - get() = Flag.Function.IS_SUSPEND(flags) + get() = descriptor.isSuspend override val isAbstract: Boolean - get() = Flag.Common.IS_ABSTRACT(flags) + get() = descriptor.isAbstract override val isFinal: Boolean - get() = Flag.Common.IS_FINAL(flags) + get() = descriptor.isFinal override val isOpen: Boolean - get() = Flag.Common.IS_OPEN(flags) + get() = descriptor.isOpen } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt index 022c6f2..8be5076 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -1,17 +1,13 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* -class KParameterImpl( - private val kmParam: KmValueParameter +internal class KParameterImpl( + val descriptor: ParameterDescriptor, + override val index: Int, + override val kind: KParameter.Kind ): KParameter { override val name: String - get() = kmParam.name - - override val type: KType? - get() = kmParam.type?.let(::KTypeImpl) - - override val isVararg: Boolean - get() = kmParam.varargElementType != null + get() = descriptor.name } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt index 688028d..5c53be4 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt @@ -1,30 +1,26 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* internal class KPropertyImpl( - private val kmProperty: KmProperty + override val descriptor: PropertyDescriptor ) : KCallableImpl(), KProperty { - private val flags: Flags = kmProperty.flags - override val name: String - get() = kmProperty.name - - override val parameters: List - get() = emptyList() - - override val isConst: Boolean - get() = Flag.Property.IS_CONST(flags) - override val isLateinit: Boolean - get() = Flag.Property.IS_LATEINIT(flags) + get() = descriptor.name - override val isAbstract: Boolean - get() = Flag.Common.IS_ABSTRACT(flags) override val isFinal: Boolean - get() = Flag.Common.IS_FINAL(flags) + get() = descriptor.isFinal + override val isAbstract: Boolean + get() = descriptor.isAbstract override val isOpen: Boolean - get() = Flag.Common.IS_OPEN(flags) + get() = descriptor.isOpen override val isSuspend: Boolean get() = false + + override val isConst: Boolean + get() = descriptor.isConst + + override val isLateinit: Boolean + get() = descriptor.isLateInit } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 225fb7e..3ccbcd0 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -1,11 +1,9 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.types.KotlinType -class KTypeImpl( - private val kmType: KmType +internal class KTypeImpl( + val kType: KotlinType ): KType { - override val isMarkedNullable: Boolean - get() = Flag.Type.IS_NULLABLE(kmType.flags) } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt new file mode 100644 index 0000000..0278fc4 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt @@ -0,0 +1,14 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor + +internal class KTypeParameterImpl( + val descriptor: TypeParameterDescriptor +) : KTypeParameter { + override val name: String + get() = descriptor.name + + override val isReified: Boolean + get() = descriptor.isReified +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 6abb4cf..6c93704 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -16,20 +16,11 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* internal object ReflectionLiteImpl { - fun loadClassMetadata(klass: Class<*>): KClass<*>? { - val header = with(klass.getAnnotation(Metadata::class.java)) { - KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt) - } - - val metadata = KotlinClassMetadata.read(header) - if (metadata is KotlinClassMetadata.Class) { - return KClassImpl(klass, metadata) - } - - return null + // TODO some entry point API + fun loadClassMetadata(klass: Class): KClass? { + return KClassImpl(klass) } } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt new file mode 100644 index 0000000..a1868f8 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt @@ -0,0 +1,21 @@ +package kotlinx.reflect.lite.misc + +import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.builtins.StandardNames.FQ_NAMES +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.name.* +import java.util.* + +internal object CompanionObjectMapping { + private val classIds: Set = + (PrimitiveType.NUMBER_TYPES.map(PrimitiveType::typeFqName) + + FQ_NAMES.string + + FQ_NAMES._boolean + + FQ_NAMES._enum).mapTo(linkedSetOf(), (ClassId)::topLevel) + + fun allClassesWithIntrinsicCompanions(): Set = + Collections.unmodifiableSet(classIds) + +// fun isMappedIntrinsicCompanionObject(classDescriptor: ClassDescriptor): Boolean = +// classDescriptor.isCompanionObject && classDescriptor.classId.getOuterClassId() in classIds +} diff --git a/src/main/java/kotlinx/reflect/lite/misc/util.kt b/src/main/java/kotlinx/reflect/lite/misc/util.kt new file mode 100644 index 0000000..b8af713 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/misc/util.kt @@ -0,0 +1,84 @@ +package kotlinx.reflect.lite.misc + +import kotlinx.reflect.lite.name.* +import java.lang.reflect.Array +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type + +val Class<*>.safeClassLoader: ClassLoader + get() = classLoader ?: ClassLoader.getSystemClassLoader() + +private val PRIMITIVE_CLASSES = + listOf(Boolean::class, Byte::class, Char::class, Double::class, Float::class, Int::class, Long::class, Short::class) +private val WRAPPER_TO_PRIMITIVE = PRIMITIVE_CLASSES.map { it.javaObjectType to it.javaPrimitiveType }.toMap() +private val PRIMITIVE_TO_WRAPPER = PRIMITIVE_CLASSES.map { it.javaPrimitiveType to it.javaObjectType }.toMap() + +val Class<*>.primitiveByWrapper: Class<*>? + get() = WRAPPER_TO_PRIMITIVE[this] + +val Class<*>.wrapperByPrimitive: Class<*>? + get() = PRIMITIVE_TO_WRAPPER[this] + +private val FUNCTION_CLASSES = + listOf( + Function0::class.java, Function1::class.java, Function2::class.java, Function3::class.java, Function4::class.java, + Function5::class.java, Function6::class.java, Function7::class.java, Function8::class.java, Function9::class.java, + Function10::class.java, Function11::class.java, Function12::class.java, Function13::class.java, Function14::class.java, + Function15::class.java, Function16::class.java, Function17::class.java, Function18::class.java, Function19::class.java, + Function20::class.java, Function21::class.java, Function22::class.java + ).mapIndexed { i, clazz -> clazz to i }.toMap() + +val Class<*>.functionClassArity: Int? + get() = FUNCTION_CLASSES[this] + +/** + * NOTE: does not perform a Java -> Kotlin mapping. If this is not expected, consider using KClassImpl#classId instead TODO + */ +val Class<*>.classId: ClassId + get() = when { + isPrimitive -> throw IllegalArgumentException("Can't compute ClassId for primitive type: $this") + isArray -> throw IllegalArgumentException("Can't compute ClassId for array type: $this") + enclosingMethod != null || enclosingConstructor != null || simpleName.isEmpty() -> { + val fqName = FqName(name) + ClassId(fqName.parent(), FqName(fqName.shortName()), /* local = */ true) + } + else -> declaringClass?.classId?.createNestedClassId(simpleName) ?: ClassId.topLevel(FqName(name)) + } + +val Class<*>.desc: String + get() { + if (this == Void.TYPE) return "V" + // This is a clever exploitation of a format returned by Class.getName(): for arrays, it's almost an internal name, + // but with '.' instead of '/' + return createArrayType().name.substring(1).replace('.', '/') + } + +fun Class<*>.createArrayType(): Class<*> = + Array.newInstance(this, 0)::class.java + +/** + * @return all arguments of a parameterized type, including those of outer classes in case this type represents an inner generic. + * The returned list starts with the arguments to the innermost class, then continues with those of its outer class, and so on. + * For example, for the type `Outer.Inner` the result would be `[C, D, A, B]`. + */ +val Type.parameterizedTypeArguments: List + get() { + if (this !is ParameterizedType) return emptyList() + if (ownerType == null) return actualTypeArguments.toList() + + return generateSequence(this) { it.ownerType as? ParameterizedType }.flatMap { it.actualTypeArguments.asSequence() }.toList() + } + +fun ClassLoader.tryLoadClass(fqName: String) = + try { + Class.forName(fqName, false, this) + } catch (e: ClassNotFoundException) { + null + } + +fun ArrayList.compact(): List = + when (size) { + 0 -> emptyList() + 1 -> listOf(first()) + else -> apply { trimToSize() } + } diff --git a/src/main/java/kotlinx/reflect/lite/name/names.kt b/src/main/java/kotlinx/reflect/lite/name/names.kt new file mode 100644 index 0000000..6cd600b --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/name/names.kt @@ -0,0 +1,79 @@ +package kotlinx.reflect.lite.name + +import kotlinx.metadata.ClassName +import kotlinx.metadata.isLocal + +typealias Name = String + +data class FqName(val fqName: String) { + val isRoot: Boolean get() = fqName.isEmpty() + + fun parent(): FqName = fqName.lastIndexOf('.').let { i -> + if (i >= 0) FqName(fqName.substring(0, i)) else EMPTY + } + + fun child(name: Name): FqName = FqName("$fqName.$name") + + fun shortName(): Name = fqName.substring(fqName.lastIndexOf('.') + 1) + + fun asString(): String = fqName + + override fun toString(): String = fqName + + companion object { + @JvmField + val EMPTY = FqName("") + } +} + +data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val isLocal: Boolean = false) { + constructor(packageFqName: FqName, relativeClassName: Name) : this(packageFqName, FqName(relativeClassName)) + + constructor(className: ClassName) : this( + FqName(className.substringBeforeLast('/', "").replace('/', '.')), + FqName(className.substringAfterLast('/')) + ) { + require(!className.isLocal) { TODO("Local class names are not yet supported here: $className") } + } + + val shortClassName: Name + get() = relativeClassName.shortName() + + // TODO: investigate if call sites mean to use asJavaLookupFqName instead + fun asSingleFqName(): FqName = + if (packageFqName.isRoot) relativeClassName else FqName(packageFqName.asString() + "." + relativeClassName.asString()) + + fun asJavaLookupFqName(): String = + (if (packageFqName.isRoot) "" else (packageFqName.asString() + ".")) + + relativeClassName.fqName.replace('.', '$') + + fun createNestedClassId(name: Name): ClassId = + ClassId(packageFqName, relativeClassName.child(name), isLocal) + + fun getOuterClassId(): ClassId? = + relativeClassName.parent().let { + if (it.isRoot) null else ClassId(packageFqName, it, isLocal) + } + + private fun asString(): String { + return if (packageFqName.isRoot) relativeClassName.asString() + else packageFqName.asString().replace('.', '/') + "/" + relativeClassName.asString() + } + + fun asClassName(): ClassName { + if (isLocal) TODO(asString()) + return asString() + } + + override fun toString(): String = if (packageFqName.isRoot) "/" + asString() else asString() + + companion object { + fun topLevel(topLevelFqName: FqName): ClassId = + ClassId(topLevelFqName.parent(), FqName(topLevelFqName.shortName())) + } +} + +private val SANITIZE_AS_JAVA_INVALID_CHARACTERS = "[^\\p{L}\\p{Digit}]".toRegex() + +fun sanitizeAsJavaIdentifier(name: String): String = + SANITIZE_AS_JAVA_INVALID_CHARACTERS.replace(name, "_") diff --git a/src/main/java/kotlinx/reflect/lite/types/types.kt b/src/main/java/kotlinx/reflect/lite/types/types.kt new file mode 100644 index 0000000..4639383 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/types/types.kt @@ -0,0 +1,16 @@ +package kotlinx.reflect.lite.types + +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.ClassifierDescriptor + +internal class KotlinType( + val descriptor: ClassifierDescriptor, + val arguments: List, + val isMarkedNullable: Boolean +) : Annotated { + +} + +internal class TypeProjection( + val type: KotlinType +) diff --git a/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt b/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt index 75451d8..07ecc92 100644 --- a/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt +++ b/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt @@ -27,4 +27,13 @@ class BasicReflectTest { assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Enum::class.java)!!.isFinal) assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Companion::class.java)!!.isCompanion) } + + @Test + fun testNestedClasses() { + val kClass = ReflectionLite.loadClassMetadata(A::class.java)!! + val nestedClasses = kClass.nestedClasses.map { it.simpleName } + nestedClasses.forEach { + println(it) + } + } } From c42939c5041796db10fd707eff0983650410cd7e Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 14 Feb 2022 08:26:22 +0300 Subject: [PATCH 05/74] Descriptors for reflection entities --- build.gradle.kts | 7 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../java/kotlinx/reflect/lite/KCallable.kt | 3 +- src/main/java/kotlinx/reflect/lite/KClass.kt | 3 +- .../reflect/lite/KDeclarationContainer.kt | 4 +- .../java/kotlinx/reflect/lite/KParameter.kt | 9 +- src/main/java/kotlinx/reflect/lite/KType.kt | 9 +- .../kotlinx/reflect/lite/KTypeParameter.kt | 6 +- .../kotlinx/reflect/lite/ReflectionLite.kt | 2 +- .../lite/builtins/JavaToKotlinClassMap.kt | 1 - .../reflect/lite/builtins/KotlinBuiltIns.kt | 6 - .../reflect/lite/descriptors/descriptors.kt | 53 +++-- .../lite/descriptors/descriptorsImpl.kt | 188 ------------------ .../impl/AbstractCallableDescriptor.kt | 22 ++ .../descriptors/impl/ClassDescriptorImpl.kt | 87 ++++++++ .../impl/ConstructorDescriptorImpl.kt | 35 ++++ .../impl/FunctionDescriptorImpl.kt | 48 +++++ .../lite/descriptors/impl/KotlinType.kt | 88 ++++++++ .../descriptors/impl/ModuleDescriptorImpl.kt | 17 ++ .../impl/PropertyDescriptorImpl.kt | 37 ++++ .../impl/TypeParameterDescriptorImpl.kt | 30 +++ .../impl/ValueParameterDescriptorImpl.kt | 23 +++ .../kotlinx/reflect/lite/descriptors/util.kt | 22 ++ .../reflect/lite/impl/KCallableImpl.kt | 3 + .../kotlinx/reflect/lite/impl/KClassImpl.kt | 37 +++- .../reflect/lite/impl/KParameterImpl.kt | 9 + .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 39 +++- .../reflect/lite/impl/KTypeParameterImpl.kt | 6 + .../reflect/lite/impl/ReflectionLiteImpl.kt | 2 +- .../lite/internal/ReflectProperties.java | 113 +++++++++++ .../lite/misc/CompanionObjectMapping.kt | 3 - .../java/kotlinx/reflect/lite/misc/util.kt | 9 +- .../java/kotlinx/reflect/lite/name/names.kt | 3 - .../java/kotlinx/reflect/lite/types/types.kt | 16 -- .../reflect/lite/test/BasicReflectTest.kt | 39 ---- .../kotlinx/reflect/lite/test/testData.kt | 142 ------------- .../annotationRetentionAnnotation.kt | 16 ++ .../annotations/genericExtensionProperty.kt | 15 ++ .../testData/annotations/localClassLiteral.kt | 25 +++ .../annotations/onTypes/arrayKClass.kt | 13 ++ .../onTypes/classLiteralWithExpectedType.kt | 24 +++ .../onTypes/differentArgumentTypes.kt | 96 +++++++++ .../annotations/onTypes/differentPositions.kt | 47 +++++ .../testData/annotations/privateAnnotation.kt | 13 ++ .../testData/annotations/propertyAccessors.kt | 17 ++ .../propertyWithoutBackingField.kt | 11 + .../lite/testData/annotations/retentions.kt | 20 ++ .../lite/testData/annotations/setparam.kt | 23 +++ .../annotations/simpleClassAnnotation.kt | 11 + .../simpleConstructorAnnotation.kt | 15 ++ .../annotations/simpleFunAnnotation.kt | 9 + .../annotations/simpleParamAnnotation.kt | 10 + .../annotations/simpleValAnnotation.kt | 11 + .../lite/testData/builtins/collections.kt | 26 +++ .../lite/testData/builtins/enumNameOrdinal.kt | 13 ++ .../lite/testData/builtins/stringLength.kt | 9 + .../reflect/lite/testData/call/bigArity.kt | 21 ++ .../bound/companionObjectPropertyAccessors.kt | 50 +++++ .../testData/call/bound/extensionFunction.kt | 9 + .../call/bound/extensionPropertyAccessors.kt | 42 ++++ .../call/bound/innerClassConstructor.kt | 13 ++ ...mStaticCompanionObjectPropertyAccessors.kt | 50 +++++ .../call/bound/jvmStaticObjectFunction.kt | 16 ++ .../bound/jvmStaticObjectPropertyAccessors.kt | 48 +++++ .../testData/call/bound/memberFunction.kt | 10 + .../call/bound/memberPropertyAccessors.kt | 47 +++++ .../testData/call/bound/objectFunction.kt | 16 ++ .../call/bound/objectPropertyAccessors.kt | 48 +++++ .../call/cannotCallEnumConstructor.kt | 17 ++ .../testData/call/equalsHashCodeToString.kt | 29 +++ .../lite/testData/call/exceptionHappened.kt | 17 ++ .../lite/testData/call/fakeOverride.kt | 12 ++ .../testData/call/fakeOverrideSubstituted.kt | 12 ++ .../call/incorrectNumberOfArguments.kt | 105 ++++++++++ .../constructorWithInlineClassParameters.kt | 28 +++ .../call/inlineClasses/fieldAccessors.kt | 36 ++++ .../functionsWithInlineClassParameters.kt | 30 +++ .../inlineClasses/inlineClassConstructor.kt | 46 +++++ .../internalPrimaryValOfInlineClass.kt | 38 ++++ .../inlineClasses/jvmStaticFieldInObject.kt | 33 +++ .../call/inlineClasses/jvmStaticFunction.kt | 35 ++++ .../nonOverridingFunOfInlineClass.kt | 35 ++++ .../nonOverridingVarOfInlineClass.kt | 81 ++++++++ .../overridingFunOfInlineClass.kt | 39 ++++ .../overridingVarOfInlineClass.kt | 85 ++++++++ .../inlineClasses/primaryValOfInlineClass.kt | 38 ++++ .../testData/call/inlineClasses/properties.kt | 50 +++++ .../testData/call/innerClassConstructor.kt | 10 + .../reflect/lite/testData/call/jvmStatic.kt | 19 ++ .../jvmStaticInObjectIncorrectReceiver.kt | 44 ++++ .../lite/testData/call/localClassMember.kt | 9 + .../testData/call/memberOfGenericClass.kt | 14 ++ ...GetterAndGetFunctionDifferentReturnType.kt | 9 + .../lite/testData/call/protectedMembers.kt | 34 ++++ .../reflect/lite/testData/call/returnUnit.kt | 26 +++ .../lite/testData/call/simpleConstructor.kt | 8 + .../testData/call/simpleMemberFunction.kt | 18 ++ .../testData/call/simpleTopLevelFunctions.kt | 29 +++ .../testData/callBy/boundExtensionFunction.kt | 10 + .../callBy/boundExtensionPropertyAcessor.kt | 9 + .../testData/callBy/boundJvmStaticInObject.kt | 16 ++ .../lite/testData/callBy/companionObject.kt | 31 +++ .../callBy/defaultAndNonDefaultIntertwined.kt | 17 ++ .../testData/callBy/defaultInSuperClass.kt | 20 ++ .../callBy/defaultInSuperInterface.kt | 28 +++ .../lite/testData/callBy/emptyVarArg.kt | 15 ++ .../lite/testData/callBy/extensionFunction.kt | 11 + .../callBy/inlineClassDefaultArguments.kt | 9 + .../inlineClassFunctionsAndConstructors.kt | 44 ++++ .../testData/callBy/inlineClassMembers.kt | 75 +++++++ .../callBy/jvmStaticInCompanionObject.kt | 34 ++++ .../lite/testData/callBy/jvmStaticInObject.kt | 30 +++ .../manyArgumentsNoneDefaultConstructor.kt | 98 +++++++++ .../manyArgumentsNoneDefaultFunction.kt | 99 +++++++++ .../callBy/manyArgumentsOnlyOneDefault.kt | 99 +++++++++ .../lite/testData/callBy/manyMaskArguments.kt | 97 +++++++++ .../callBy/nonDefaultParameterOmitted.kt | 23 +++ .../reflect/lite/testData/callBy/nullValue.kt | 12 ++ ...thodIsInvokedWhenNoDefaultValuesAreUsed.kt | 20 ++ .../testData/callBy/primitiveDefaultValues.kt | 28 +++ .../lite/testData/callBy/simpleConstructor.kt | 5 + .../testData/callBy/simpleMemberFunciton.kt | 10 + .../testData/callBy/simpleTopLevelFunction.kt | 5 + .../classLiterals/annotationClassLiteral.kt | 9 + .../lite/testData/classLiterals/arrays.kt | 14 ++ .../lite/testData/classLiterals/bareArray.kt | 13 ++ .../classLiterals/builtinClassLiterals.kt | 39 ++++ .../testData/classLiterals/genericArrays.kt | 30 +++ .../testData/classLiterals/genericClass.kt | 11 + .../testData/classLiterals/lambdaClass.kt | 28 +++ .../classLiterals/reifiedTypeClassLiteral.kt | 30 +++ .../lite/testData/classes/classMembers.kt | 23 +++ .../lite/testData/classes/classSimpleName.kt | 13 ++ .../reflect/lite/testData/classes/javaVoid.kt | 18 ++ .../testData/classes/localClassSimpleName.kt | 42 ++++ .../lite/testData/classes/nestedClasses.kt | 59 ++++++ .../lite/testData/classes/objectInstance.kt | 33 +++ .../classes/primitiveKClassEquality.kt | 15 ++ .../lite/testData/classes/qualifiedName.kt | 29 +++ .../classes/qualifiedNameOfStandardClasses.kt | 40 ++++ .../lite/testData/classes/sealedSubclasses.kt | 40 ++++ .../classesWithoutConstructors.kt | 20 ++ .../testData/constructors/constructorName.kt | 11 + .../lite/testData/constructors/enumEntry.kt | 24 +++ .../constructors/simpleGetConstructors.kt | 32 +++ .../createAnnotation/annotationType.kt | 11 + .../createAnnotation/arrayOfKClasses.kt | 14 ++ .../createJdkAnnotationInstance.kt | 15 ++ .../createAnnotation/enumKClassAnnotation.kt | 48 +++++ .../equalsHashCodeToString.kt | 46 +++++ .../floatingPointParameters.kt | 67 +++++++ .../createAnnotation/parameterNamedEquals.kt | 15 ++ .../createAnnotation/primitivesAndArrays.kt | 84 ++++++++ .../testData/functions/enumValuesValueOf.kt | 15 ++ .../testData/functions/functionFromStdlib.kt | 10 + .../functions/genericOverriddenFunction.kt | 18 ++ .../functions/isAccessibleOnAllMembers.kt | 18 ++ .../lite/testData/functions/platformName.kt | 6 + .../lite/testData/functions/simpleNames.kt | 18 ++ .../isInstance/isInstanceCastAndSafeCast.kt | 58 ++++++ .../lite/testData/kClassInAnnotation/array.kt | 18 ++ .../lite/testData/kClassInAnnotation/basic.kt | 15 ++ .../testData/kClassInAnnotation/checkcast.kt | 12 ++ .../kClassInAnnotation/forceWrapping.kt | 21 ++ .../testData/kClassInAnnotation/vararg.kt | 18 ++ .../wrappingForCallableReferences.kt | 41 ++++ .../parameterNamesAndNullability.kt | 45 +++++ ...reflectOnDefaultWithInlineClassArgument.kt | 9 + .../reflectOnLambdaInArrayConstructor.kt | 11 + .../reflectOnLambdaInConstructor.kt | 15 ++ .../lambdaClasses/reflectOnLambdaInField.kt | 11 + .../reflectOnLambdaInStaticField.kt | 9 + .../reflectOnSuspendLambdaInField.kt | 11 + .../lite/testData/mapping/constructor.kt | 33 +++ .../testData/mapping/extensionProperty.kt | 31 +++ .../lite/testData/mapping/functions.kt | 29 +++ .../inlineClasses/inlineClassPrimaryVal.kt | 38 ++++ ...spendFunctionWithInlineClassInSignature.kt | 45 +++++ .../lite/testData/mapping/inlineReifiedFun.kt | 22 ++ .../jvmStatic/companionObjectFunction.kt | 35 ++++ .../mapping/jvmStatic/objectFunction.kt | 22 ++ .../lite/testData/mapping/lateinitProperty.kt | 30 +++ .../mappedClassIsEqualToClassLiteral.kt | 14 ++ .../lite/testData/mapping/memberProperty.kt | 28 +++ .../mapping/methodsFromSuperInterface.kt | 26 +++ .../mapping/propertyAccessorsWithJvmName.kt | 25 +++ .../lite/testData/mapping/syntheticFields.kt | 16 ++ .../lite/testData/mapping/topLevelProperty.kt | 30 +++ .../types/annotationConstructorParameters.kt | 47 +++++ .../lite/testData/mapping/types/array.kt | 30 +++ .../testData/mapping/types/constructors.kt | 25 +++ .../mapping/types/genericArrayElementType.kt | 33 +++ .../mapping/types/inlineClassInSignature.kt | 26 +++ .../mapping/types/inlineClassPrimaryVal.kt | 59 ++++++ .../mapping/types/innerGenericTypeArgument.kt | 31 +++ .../testData/mapping/types/memberFunctions.kt | 25 +++ .../mapping/types/overrideAnyWithPrimitive.kt | 25 +++ .../types/parameterizedTypeArgument.kt | 22 ++ .../mapping/types/parameterizedTypes.kt | 41 ++++ .../mapping/types/propertyAccessors.kt | 26 +++ .../lite/testData/mapping/types/supertypes.kt | 30 +++ .../lite/testData/mapping/types/suspendFun.kt | 15 ++ .../mapping/types/topLevelFunctions.kt | 17 ++ .../testData/mapping/types/typeParameters.kt | 23 +++ .../lite/testData/mapping/types/unit.kt | 23 +++ ...bleReferencesNotEqualToCallablesFromAPI.kt | 29 +++ .../builtinFunctionsToString.kt | 23 +++ ...llableReferencesEqualToCallablesFromAPI.kt | 22 ++ .../testData/methodsFromAny/classToString.kt | 31 +++ .../extensionPropertyReceiverToString.kt | 88 ++++++++ .../fakeOverrideEqualsHashCode.kt | 24 +++ .../methodsFromAny/fakeOverrideToString.kt | 26 +++ .../methodsFromAny/fakeOverrideToString2.kt | 32 +++ .../methodsFromAny/functionEqualsHashCode.kt | 33 +++ .../functionFromStdlibMultiFileFacade.kt | 16 ++ .../functionFromStdlibSingleFileFacade.kt | 13 ++ .../methodsFromAny/functionToString.kt | 26 +++ .../parametersEqualsHashCode.kt | 28 +++ .../parametersEqualsWithClearCaches.kt | 46 +++++ .../methodsFromAny/parametersToString.kt | 30 +++ .../methodsFromAny/propertyEqualsHashCode.kt | 31 +++ .../methodsFromAny/propertyToString.kt | 34 ++++ .../methodsFromAny/typeEqualsHashCode.kt | 30 +++ .../typeParametersEqualsHashCode.kt | 39 ++++ .../methodsFromAny/typeParametersToString.kt | 15 ++ .../testData/methodsFromAny/typeToString.kt | 39 ++++ .../typeToStringInnerGeneric.kt | 18 ++ .../testData/modifiers/callableModality.kt | 51 +++++ .../testData/modifiers/callableVisibility.kt | 55 +++++ .../lite/testData/modifiers/classModality.kt | 56 ++++++ .../testData/modifiers/classVisibility.kt | 29 +++ .../lite/testData/modifiers/functions.kt | 59 ++++++ .../lite/testData/modifiers/properties.kt | 22 ++ .../lite/testData/modifiers/typeParameters.kt | 15 ++ .../lite/testData/parameters/bigArity.kt | 20 ++ .../parameters/boundInnerClassConstructor.kt | 25 +++ .../parameters/boundObjectMemberReferences.kt | 23 +++ .../testData/parameters/boundReferences.kt | 31 +++ .../lite/testData/parameters/isOptional.kt | 26 +++ .../testData/parameters/propertySetter.kt | 26 +++ .../accessors/extensionPropertyAccessors.kt | 20 ++ .../accessors/memberPropertyAccessors.kt | 17 ++ .../accessors/topLevelPropertyAccessors.kt | 16 ++ .../properties/genericOverriddenProperty.kt | 19 ++ .../testData/properties/genericProperty.kt | 12 ++ .../booleanPropertyNameStartsWithIs.kt | 20 ++ .../getDelegate/boundExtensionProperty.kt | 25 +++ .../getDelegate/extensionProperty.kt | 24 +++ .../properties/getDelegate/fakeOverride.kt | 24 +++ .../kPropertyForDelegatedProperty.kt | 31 +++ .../getDelegate/memberExtensionProperty.kt | 28 +++ .../properties/getDelegate/memberProperty.kt | 24 +++ .../method/delegateMethodIsNonOverridable.kt | 33 +++ .../getDelegate/nameClashClassAndCompanion.kt | 25 +++ .../getDelegate/notDelegatedProperty.kt | 28 +++ .../overrideDelegatedByDelegated.kt | 36 ++++ .../getDelegate/topLevelProperty.kt | 22 ++ .../properties/localDelegated/defaultImpls.kt | 22 ++ .../properties/localDelegated/inLambda.kt | 13 ++ .../properties/localDelegated/inlineFun.kt | 25 +++ .../localDelegated/localAndNonLocal.kt | 33 +++ .../localDelegated/localDelegatedProperty.kt | 74 +++++++ .../localDelegated/variableOfGenericType.kt | 30 +++ .../properties/privateJvmStaticVarInObject.kt | 27 +++ .../propertyOfNestedClassAndArrayType.kt | 22 ++ .../properties/publicClassValAccessible.kt | 14 ++ .../typeParameters/declarationSiteVariance.kt | 23 +++ .../typeParameters/innerGenericParameter.kt | 27 +++ .../typeParameters/typeParametersAndNames.kt | 36 ++++ .../testData/typeParameters/upperBounds.kt | 59 ++++++ .../lite/testData/types/classifierIsClass.kt | 25 +++ .../types/classifierIsTypeParameter.kt | 23 +++ .../types/classifiersOfBuiltInTypes.kt | 112 +++++++++++ ...sForClassAndTypeParameterWithSameFqName.kt | 24 +++ .../testData/types/innerGenericArguments.kt | 32 +++ .../lite/testData/types/jvmErasureOfClass.kt | 20 ++ .../types/jvmErasureOfTypeParameter.kt | 45 +++++ .../lite/testData/types/typeArguments.kt | 42 ++++ .../lite/testData/types/useSiteVariance.kt | 26 +++ .../kotlinx/reflect/lite/tests/KClassTests.kt | 42 ++++ .../kotlinx/reflect/lite/tests/testUtil.kt | 16 ++ 281 files changed, 7783 insertions(+), 466 deletions(-) delete mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/util.kt create mode 100644 src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java delete mode 100644 src/main/java/kotlinx/reflect/lite/types/types.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/test/testData.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/annotationRetentionAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/genericExtensionProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/localClassLiteral.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/arrayKClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/classLiteralWithExpectedType.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentArgumentTypes.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentPositions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/privateAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/propertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/propertyWithoutBackingField.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/retentions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/setparam.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/simpleClassAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/simpleConstructorAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/simpleFunAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/simpleParamAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/annotations/simpleValAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/builtins/collections.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/builtins/enumNameOrdinal.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/builtins/stringLength.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/companionObjectPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/innerClassConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/memberFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/memberPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/objectFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/bound/objectPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/constructorWithInlineClassParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/fieldAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/functionsWithInlineClassParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/inlineClassConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/internalPrimaryValOfInlineClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFieldInObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingFunOfInlineClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingVarOfInlineClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingFunOfInlineClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingVarOfInlineClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/primaryValOfInlineClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/properties.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperInterface.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/emptyVarArg.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassDefaultArguments.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassFunctionsAndConstructors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassMembers.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/annotationClassLiteral.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/arrays.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/bareArray.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/builtinClassLiterals.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericArrays.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/lambdaClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classLiterals/reifiedTypeClassLiteral.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/javaVoid.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/objectInstance.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/primitiveKClassEquality.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/annotationType.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/arrayOfKClasses.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/createJdkAnnotationInstance.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/enumKClassAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/equalsHashCodeToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/floatingPointParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/parameterNamedEquals.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/createAnnotation/primitivesAndArrays.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/functions/enumValuesValueOf.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/functions/functionFromStdlib.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/functions/genericOverriddenFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/functions/isAccessibleOnAllMembers.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/functions/platformName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/functions/simpleNames.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/isInstance/isInstanceCastAndSafeCast.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/array.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/basic.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/checkcast.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/forceWrapping.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/vararg.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/wrappingForCallableReferences.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/parameterNamesAndNullability.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInField.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInStaticField.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnSuspendLambdaInField.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/inlineClassPrimaryVal.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/companionObjectFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/objectFunction.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/mappedClassIsEqualToClassLiteral.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/annotationConstructorParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassInSignature.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassPrimaryVal.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/innerGenericTypeArgument.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/overrideAnyWithPrimitive.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/suspendFun.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/builtinFunctionsToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/classToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/extensionPropertyReceiverToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideEqualsHashCode.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString2.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionEqualsHashCode.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibMultiFileFacade.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibSingleFileFacade.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsHashCode.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsWithClearCaches.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyEqualsHashCode.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeEqualsHashCode.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersEqualsHashCode.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToString.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToStringInnerGeneric.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/modifiers/callableModality.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/modifiers/callableVisibility.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/modifiers/classModality.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/modifiers/classVisibility.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/modifiers/functions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/modifiers/properties.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/modifiers/typeParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/genericOverriddenProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/genericProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/boundExtensionProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/extensionProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/fakeOverride.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/kPropertyForDelegatedProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberExtensionProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/nameClashClassAndCompanion.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/notDelegatedProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/overrideDelegatedByDelegated.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/topLevelProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/defaultImpls.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inLambda.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inlineFun.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localAndNonLocal.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localDelegatedProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/variableOfGenericType.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/privateJvmStaticVarInObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/publicClassValAccessible.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/typeParameters/declarationSiteVariance.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/typeParameters/innerGenericParameter.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/typeParameters/typeParametersAndNames.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/typeParameters/upperBounds.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/classifierIsClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/classifierIsTypeParameter.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/classifiersOfBuiltInTypes.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/equalsForClassAndTypeParameterWithSameFqName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/innerGenericArguments.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfClass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfTypeParameter.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/typeArguments.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/types/useSiteVariance.kt create mode 100644 src/test/java/kotlinx/reflect/lite/tests/KClassTests.kt create mode 100644 src/test/java/kotlinx/reflect/lite/tests/testUtil.kt diff --git a/build.gradle.kts b/build.gradle.kts index 1405f00..0c22344 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - kotlin("jvm") + kotlin("jvm") version "1.6.10" `java-gradle-plugin` `maven-publish` } @@ -12,9 +12,10 @@ repositories { dependencies { implementation("com.google.protobuf:protobuf-java:2.6.1") - implementation("org.jetbrains.kotlin:kotlin-stdlib:1.6.10") + implementation("org.jetbrains.kotlin:kotlin-stdlib") + testImplementation("org.jetbrains.kotlin:kotlin-stdlib") + testImplementation("org.jetbrains.kotlin:kotlin-test") implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0") - testImplementation("org.jetbrains.kotlin:kotlin-test-junit:1.6.10") testImplementation("junit:junit:4.12") } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 84d1f85..ffed3a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/kotlinx/reflect/lite/KCallable.kt b/src/main/java/kotlinx/reflect/lite/KCallable.kt index 2d2ec4e..6c3f04d 100644 --- a/src/main/java/kotlinx/reflect/lite/KCallable.kt +++ b/src/main/java/kotlinx/reflect/lite/KCallable.kt @@ -31,8 +31,7 @@ public interface KCallable : KAnnotatedElement { /** * The type of values returned by this callable. */ - private val returnType: KType - get() = TODO() + public val returnType: KType /** * The list of type parameters of this callable. diff --git a/src/main/java/kotlinx/reflect/lite/KClass.kt b/src/main/java/kotlinx/reflect/lite/KClass.kt index 943c34e..d0d599e 100644 --- a/src/main/java/kotlinx/reflect/lite/KClass.kt +++ b/src/main/java/kotlinx/reflect/lite/KClass.kt @@ -53,8 +53,7 @@ public interface KClass : KDeclarationContainer, KAnnotatedElement, KClas * The list of immediate supertypes of this class, in the order they are listed in the source code. */ @SinceKotlin("1.1") - private val supertypes: List - get() = TODO() + public val supertypes: List /** * The list of the immediate subclasses if this class is a sealed class, or an empty list otherwise. diff --git a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt index 014364b..4b9d2ec 100644 --- a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt +++ b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt @@ -7,7 +7,7 @@ package kotlinx.reflect.lite interface KDeclarationContainer { /** * All functions and properties accessible in this container. + * TODO: inherited members are not supported yet */ - private val members: Collection> - get() = TODO() + public val members: Collection> } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KParameter.kt b/src/main/java/kotlinx/reflect/lite/KParameter.kt index dca09b5..60345fd 100644 --- a/src/main/java/kotlinx/reflect/lite/KParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KParameter.kt @@ -39,8 +39,7 @@ public interface KParameter : KAnnotatedElement { * Type of this parameter. For a `vararg` parameter, this is the type of the corresponding array, * not the individual element. */ - private val type: KType? - get() = TODO() + public val type: KType? /** * Kind of this parameter. @@ -69,8 +68,7 @@ public interface KParameter : KAnnotatedElement { * 1. The default value is provided at the declaration of this parameter. * 2. The parameter is declared in a member function and one of the corresponding parameters in the super functions is optional. */ - private val isOptional: Boolean - get() = TODO() + public val isOptional: Boolean /** * `true` if this parameter is `vararg`. @@ -78,6 +76,5 @@ public interface KParameter : KAnnotatedElement { * for more information. */ @SinceKotlin("1.1") - private val isVararg: Boolean - get() = TODO() + public val isVararg: Boolean } diff --git a/src/main/java/kotlinx/reflect/lite/KType.kt b/src/main/java/kotlinx/reflect/lite/KType.kt index 1509aa3..d3e2dcf 100644 --- a/src/main/java/kotlinx/reflect/lite/KType.kt +++ b/src/main/java/kotlinx/reflect/lite/KType.kt @@ -17,8 +17,7 @@ public interface KType : KAnnotatedElement { * Returns `null` if this type is not denotable in Kotlin, for example if it is an intersection type. */ @SinceKotlin("1.1") - private val classifier: KClassifier? - get() = TODO() + public val classifier: KClassifier? /** * Type arguments passed for the parameters of the classifier in this type. @@ -29,8 +28,7 @@ public interface KType : KAnnotatedElement { * For example, in the type `Outer.Inner` the returned list is `[C, D, A, B]`. */ @SinceKotlin("1.1") - private val arguments: List - get() = TODO() + public val arguments: List /** * `true` if this type was marked nullable in the source code. @@ -49,7 +47,6 @@ public interface KType : KAnnotatedElement { * } * ``` */ - private val isMarkedNullable: Boolean - get() = TODO() + public val isMarkedNullable: Boolean } diff --git a/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt index 43f1625..ef14938 100644 --- a/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt @@ -17,16 +17,14 @@ public interface KTypeParameter : KClassifier { * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#upper-bounds) * for more information. */ - private val upperBounds: List - get() = TODO() + public val upperBounds: List /** * Declaration-site variance of this type parameter. * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/generics.html#declaration-site-variance) * for more information. */ - private val variance: KVariance - get() = TODO() + public val variance: KVariance /** * `true` if this type parameter is `reified`. diff --git a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt index c5c2c0c..e4dcc8c 100644 --- a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt +++ b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt @@ -25,7 +25,7 @@ object ReflectionLite { /** * Metadata for the given [klass] if this is a Kotlin class, or `null` otherwise. */ - fun loadClassMetadata(klass: Class): KClass? { + fun loadClassMetadata(klass: Class): KClass { return ReflectionLiteImpl.loadClassMetadata(klass) } } diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt index 319a746..fb1d9ea 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt @@ -118,7 +118,6 @@ object JavaToKotlinClassMap { * kotlin.reflect.KFunction42 -> kotlin.reflect.KFunction * kotlin.reflect.KSuspendFunction42 -> kotlin.reflect.KFunction */ - // TODO: maybe take ClassId as well fun mapKotlinToJava(kotlinFqName: FqName): ClassId? = when { isKotlinFunctionWithBigArity(kotlinFqName, NUMBERED_FUNCTION_PREFIX) -> FUNCTION_N_CLASS_ID isKotlinFunctionWithBigArity(kotlinFqName, NUMBERED_SUSPEND_FUNCTION_PREFIX) -> FUNCTION_N_CLASS_ID diff --git a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt index 1e44113..08c50ab 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt @@ -1,12 +1,6 @@ package kotlinx.reflect.lite.builtins -import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.ClassDescriptor -import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.impl.KClassImpl import kotlinx.reflect.lite.name.* -import kotlinx.reflect.lite.types.* -import kotlinx.reflect.lite.types.KotlinType internal object StandardNames { val BUILT_INS_PACKAGE_FQ_NAME = FqName("kotlin") diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 36945c6..617cf32 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -2,9 +2,9 @@ package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.impl.KotlinType import kotlinx.reflect.lite.impl.KClassImpl import kotlinx.reflect.lite.name.* -import kotlinx.reflect.lite.types.KotlinType internal interface ModuleDescriptor { fun findClass(name: ClassName): ClassDescriptor @@ -31,10 +31,7 @@ internal interface DeclarationDescriptor : Annotated { val name: Name } -internal interface DeclarationContainerDescriptor { - private val members: Collection - get() = TODO() -} +internal interface DeclarationContainerDescriptor internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierDescriptor { val classId: ClassId @@ -44,13 +41,18 @@ internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierD val constructors: List val nestedClasses: List val sealedSubclasses: List + val properties: List + val functions: List + val memberScope: MemberScope - public val typeParameters: List + val typeParameters: List + val supertypes: List - private val supertypes: List - get() = TODO() + val visibility: KVisibility? - public val visibility: KVisibility? + val isInterface: Boolean + val isObject: Boolean + val isCompanionObject: Boolean val isFinal: Boolean val isOpen: Boolean @@ -63,18 +65,22 @@ internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierD val isValue: Boolean } +internal class MemberScope( + val properties: List, + val functions: List +) + internal interface CallableDescriptor : DeclarationDescriptor { val module: ModuleDescriptor val containingClass: ClassDescriptor? val valueParameters: List - public val typeParameters: List + val typeParameters: List - private val returnType: KType - get() = TODO() + val returnType: KotlinType - public val visibility: KVisibility? + val visibility: KVisibility? val isFinal: Boolean val isOpen: Boolean @@ -91,17 +97,24 @@ internal interface FunctionDescriptor : CallableDescriptor { internal interface ParameterDescriptor : DeclarationDescriptor { val containingDeclaration: CallableDescriptor + val type: KotlinType? } -internal interface ValueParameterDescriptor : ParameterDescriptor +internal interface ValueParameterDescriptor : ParameterDescriptor { + val declaresDefaultValue: Boolean + private val inheritsDefaultValue: Boolean + get() = TODO("Is not implemented yet (for KParameter.isOptional 2 case)") + + val varargElementType: KotlinType? +} internal interface ReceiverParameterDescriptor : ParameterDescriptor internal interface PropertyDescriptor : CallableDescriptor { private val isVar: Boolean get() = TODO() - public val isLateInit: Boolean - public val isConst: Boolean + val isLateInit: Boolean + val isConst: Boolean private val isDelegated: Boolean get() = TODO() @@ -123,10 +136,10 @@ internal interface ClassifierDescriptor : DeclarationDescriptor internal interface TypeParameterDescriptor : ClassifierDescriptor { val containingDeclaration: DeclarationDescriptor - private val upperBounds: List - get() = TODO() - private val variance: KVariance - get() = TODO() + val upperBounds: List + + val variance: KVariance val isReified: Boolean } +internal interface TypeAliasDescriptor : ClassifierDescriptor \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt deleted file mode 100644 index d08e5fc..0000000 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptorsImpl.kt +++ /dev/null @@ -1,188 +0,0 @@ -package kotlinx.reflect.lite.descriptors - -import kotlinx.metadata.* -import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.builtins.* -import kotlinx.reflect.lite.impl.KClassImpl -import kotlinx.reflect.lite.misc.* -import kotlinx.reflect.lite.name.* - -internal class ModuleDescriptorImpl(private val classLoader: ClassLoader) : ModuleDescriptor { - override fun findClass(name: ClassName): ClassDescriptor { - // TODO whyyy java to kotlin class map, and kotlin to java wtf - val fqName = - (JavaToKotlinClassMap.mapKotlinToJava(FqName(name.replace('/', '.'))) ?: ClassId(name)).asJavaLookupFqName() - val jClass = classLoader.tryLoadClass(fqName) - // todo error message if the class is not found - return KClassImpl(jClass!!).descriptor - } -} - -internal class ClassDescriptorImpl internal constructor( - val kmClass: KmClass, - override val module: ModuleDescriptor, - override val classId: ClassId, - override val kClass: KClassImpl<*> -) : ClassDescriptor { - override val name: Name - get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') - - override val constructors: List - get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this) } - - override val nestedClasses: List - get() = kmClass.nestedClasses.map { module.findClass(classId.createNestedClassId(it).asClassName()) } - - override val sealedSubclasses: List - get() = kmClass.sealedSubclasses.map(module::findClass) - - override val visibility: KVisibility? - get() = kmClass.flags.toVisibility() - - override val typeParameters: List - get() = TODO("Not yet implemented") - - override val isFinal: Boolean - get() = Flag.Common.IS_FINAL(kmClass.flags) - override val isOpen: Boolean - get() = Flag.Common.IS_OPEN(kmClass.flags) - override val isAbstract: Boolean - get() = Flag.Common.IS_ABSTRACT(kmClass.flags) - override val isSealed: Boolean - get() = Flag.Common.IS_SEALED(kmClass.flags) - override val isData: Boolean - get() = Flag.Class.IS_DATA(kmClass.flags) - override val isInner: Boolean - get() = Flag.Class.IS_INNER(kmClass.flags) - override val isCompanion: Boolean - get() = Flag.Class.IS_COMPANION_OBJECT(kmClass.flags) - override val isFun: Boolean - get() = Flag.Class.IS_FUN(kmClass.flags) - override val isValue: Boolean - get() = Flag.Class.IS_VALUE(kmClass.flags) -} - -internal class ConstructorDescriptorImpl( - val kmCons: KmConstructor, - override val module: ModuleDescriptor, - override val containingClass: ClassDescriptor -) : AbstractFunctionDescriptor(), ConstructorDescriptor { - override val flags: Flags - get() = kmCons.flags - - override val name: Name - get() = "" - - override val valueParameters: List - get() = kmCons.valueParameters.mapIndexed { index, parameter -> - ValueParameterDescriptorImpl(parameter, this, index) - } - - override val typeParameters: List - get() = emptyList() -} - -internal class FunctionDescriptorImpl( - val kmFunction: KmFunction, - override val module: ModuleDescriptor, - override val containingClass: ClassDescriptorImpl? -) : AbstractFunctionDescriptor() { - override val flags: Flags - get() = kmFunction.flags - - override val name: Name - get() = kmFunction.name - - override val valueParameters: List - get() = kmFunction.valueParameters.mapIndexed { index, kmValueParam -> - ValueParameterDescriptorImpl(kmValueParam, this, index) - } - - override val typeParameters: List - get() = kmFunction.typeParameters.map { TypeParameterDescriptorImpl(it, module, this) } -} - -abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor(), FunctionDescriptor { - override val isInline: Boolean - get() = Flag.Function.IS_INLINE(flags) - override val isExternal: Boolean - get() = Flag.Function.IS_EXTERNAL(flags) - override val isOperator: Boolean - get() = Flag.Function.IS_OPERATOR(flags) - override val isInfix: Boolean - get() = Flag.Function.IS_INFIX(flags) - override val isSuspend: Boolean - get() = Flag.Function.IS_SUSPEND(flags) -} - -abstract class AbstractCallableDescriptor : CallableDescriptor { - protected abstract val flags: Flags - - override val visibility: KVisibility? - get() = flags.toVisibility() - - override val isFinal: Boolean - get() = Flag.Common.IS_FINAL(flags) - override val isOpen: Boolean - get() = Flag.Common.IS_OPEN(flags) - override val isAbstract: Boolean - get() = Flag.Common.IS_ABSTRACT(flags) -} - -internal class ValueParameterDescriptorImpl( - private val kmValueParam: KmValueParameter, - override val containingDeclaration: AbstractFunctionDescriptor, - private val index: Int -) : ValueParameterDescriptor { - override val name: Name - get() = kmValueParam.name -} - -internal class TypeParameterDescriptorImpl( - private val kmTypeParam: KmTypeParameter, - private val module: ModuleDescriptor, - override val containingDeclaration: DeclarationDescriptor -) : TypeParameterDescriptor { - internal val id: Int get() = kmTypeParam.id - - override val name: Name - get() = kmTypeParam.name - - override val isReified: Boolean - get() = Flag.TypeParameter.IS_REIFIED(kmTypeParam.flags) -} - -internal class PropertyDescriptorImpl( - val kmProperty: KmProperty, - override val module: ModuleDescriptor, - override val containingClass: ClassDescriptorImpl? -) : AbstractCallableDescriptor(), PropertyDescriptor { - override val flags: Flags - get() = kmProperty.flags - - override val name: Name - get() = kmProperty.name - - override val valueParameters: List - get() = emptyList() - - override val typeParameters: List - get() = kmProperty.typeParameters.map { TypeParameterDescriptorImpl(it, module, this) } - - override val isConst: Boolean - get() = Flag.Property.IS_CONST(flags) - override val isLateInit: Boolean - get() = Flag.Property.IS_LATEINIT(flags) -} - -private fun Flags.toVisibility(): KVisibility? = - when { - Flag.Common.IS_PRIVATE(this) -> KVisibility.PRIVATE - Flag.Common.IS_PRIVATE_TO_THIS(this) -> KVisibility.PRIVATE - Flag.Common.IS_INTERNAL(this) -> KVisibility.INTERNAL - Flag.Common.IS_PROTECTED(this) -> KVisibility.PROTECTED - Flag.Common.IS_PUBLIC(this) -> KVisibility.PUBLIC - Flag.Common.IS_LOCAL(this) -> null - else -> error("Declaration with unknown visibility") - } - diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt new file mode 100644 index 0000000..eb60130 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt @@ -0,0 +1,22 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.CallableDescriptor + +abstract class AbstractCallableDescriptor : CallableDescriptor { + protected abstract val flags: Flags + + override val visibility: KVisibility? + get() = flags.toVisibility() + + internal abstract val typeParameterTable: TypeParameterTable + + override val isFinal: Boolean + get() = Flag.Common.IS_FINAL(flags) + override val isOpen: Boolean + get() = Flag.Common.IS_OPEN(flags) + override val isAbstract: Boolean + get() = Flag.Common.IS_ABSTRACT(flags) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt new file mode 100644 index 0000000..1fc3f95 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -0,0 +1,87 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.descriptors.ConstructorDescriptor +import kotlinx.reflect.lite.descriptors.FunctionDescriptor +import kotlinx.reflect.lite.descriptors.MemberScope +import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.descriptors.PropertyDescriptor +import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor +import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.name.* + +internal class ClassDescriptorImpl internal constructor( + val kmClass: KmClass, + override val module: ModuleDescriptor, + override val classId: ClassId, + override val kClass: KClassImpl<*> +) : ClassDescriptor { + override val name: Name + get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') + + override val constructors: List + get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this) } + + override val nestedClasses: List + get() = kmClass.nestedClasses.map { module.findClass(classId.createNestedClassId(it).asClassName()) } + + override val sealedSubclasses: List + get() = kmClass.sealedSubclasses.map(module::findClass) + + override val properties: List + get() = kmClass.properties.map { PropertyDescriptorImpl(it, module, this) } + + override val functions: List + get() = kmClass.functions.map { FunctionDescriptorImpl(it, module, this) } + + // TODO: static members + // TODO: function and property fake overrides + override val memberScope: MemberScope + get() = MemberScope( + kmClass.properties.map { PropertyDescriptorImpl(it, module, this) }, + kmClass.functions.map { FunctionDescriptorImpl(it, module, this) } + ) + + override val visibility: KVisibility? + get() = kmClass.flags.toVisibility() + + internal val typeParameterTable: TypeParameterTable = + kmClass.typeParameters.toTypeParameters(this, module, containingClass?.typeParameterTable) + + internal val containingClass: ClassDescriptorImpl? + get() = classId.getOuterClassId()?.let { module.findClass(it.asClassName()) as ClassDescriptorImpl? } + + override val typeParameters: List + get() = typeParameterTable.typeParameters + + override val supertypes: List + get() = kmClass.supertypes.map { it.toKotlinType(module, typeParameterTable) } + + override val isInterface: Boolean + get() = Flag.Class.IS_INTERFACE(kmClass.flags) + override val isObject: Boolean + get() = Flag.Class.IS_OBJECT(kmClass.flags) + override val isCompanionObject: Boolean + get() = Flag.Class.IS_COMPANION_OBJECT(kmClass.flags) + override val isFinal: Boolean + get() = Flag.Common.IS_FINAL(kmClass.flags) + override val isOpen: Boolean + get() = Flag.Common.IS_OPEN(kmClass.flags) + override val isAbstract: Boolean + get() = Flag.Common.IS_ABSTRACT(kmClass.flags) + override val isSealed: Boolean + get() = Flag.Common.IS_SEALED(kmClass.flags) + override val isData: Boolean + get() = Flag.Class.IS_DATA(kmClass.flags) + override val isInner: Boolean + get() = Flag.Class.IS_INNER(kmClass.flags) + override val isCompanion: Boolean + get() = Flag.Class.IS_COMPANION_OBJECT(kmClass.flags) + override val isFun: Boolean + get() = Flag.Class.IS_FUN(kmClass.flags) + override val isValue: Boolean + get() = Flag.Class.IS_VALUE(kmClass.flags) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt new file mode 100644 index 0000000..b039069 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -0,0 +1,35 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.descriptors.ConstructorDescriptor +import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor +import kotlinx.reflect.lite.descriptors.ValueParameterDescriptor +import kotlinx.reflect.lite.descriptors.ValueParameterDescriptorImpl +import kotlinx.reflect.lite.name.* + +internal class ConstructorDescriptorImpl( + val kmCons: KmConstructor, + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptorImpl +) : AbstractFunctionDescriptor(), ConstructorDescriptor { + override val flags: Flags + get() = kmCons.flags + + override val name: Name + get() = "" + + override val valueParameters: List + get() = kmCons.valueParameters.mapIndexed { index, parameter -> + ValueParameterDescriptorImpl(parameter, this, index) + } + + override val typeParameterTable: TypeParameterTable + get() = emptyList().toTypeParameters(this, module, containingClass.typeParameterTable) + + override val typeParameters: List + get() = emptyList() + + override val returnType: KotlinType + get() = containingClass.kotlinType +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt new file mode 100644 index 0000000..3e99e93 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -0,0 +1,48 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.descriptors.FunctionDescriptor +import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor +import kotlinx.reflect.lite.descriptors.ValueParameterDescriptor +import kotlinx.reflect.lite.descriptors.ValueParameterDescriptorImpl +import kotlinx.reflect.lite.name.* + +abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor(), FunctionDescriptor { + override val isInline: Boolean + get() = Flag.Function.IS_INLINE(flags) + override val isExternal: Boolean + get() = Flag.Function.IS_EXTERNAL(flags) + override val isOperator: Boolean + get() = Flag.Function.IS_OPERATOR(flags) + override val isInfix: Boolean + get() = Flag.Function.IS_INFIX(flags) + override val isSuspend: Boolean + get() = Flag.Function.IS_SUSPEND(flags) +} + +internal class FunctionDescriptorImpl( + val kmFunction: KmFunction, + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptorImpl? +) : AbstractFunctionDescriptor() { + override val flags: Flags + get() = kmFunction.flags + + override val name: Name + get() = kmFunction.name + + override val valueParameters: List + get() = kmFunction.valueParameters.mapIndexed { index, kmValueParam -> + ValueParameterDescriptorImpl(kmValueParam, this, index) + } + + override val typeParameterTable: TypeParameterTable = + kmFunction.typeParameters.toTypeParameters(this, module, containingClass?.typeParameterTable) + + override val typeParameters: List + get() = typeParameterTable.typeParameters + + override val returnType: KotlinType + get() = kmFunction.returnType.toKotlinType(module, typeParameterTable) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt new file mode 100644 index 0000000..4045c7c --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -0,0 +1,88 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.KVariance +import kotlinx.reflect.lite.descriptors.Annotated +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.descriptors.ClassifierDescriptor +import kotlinx.reflect.lite.descriptors.DeclarationDescriptor +import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor + +internal class KotlinType( + val classifierDescriptor: ClassifierDescriptor, + val arguments: List, + val isMarkedNullable: Boolean +) : Annotated { + +} + +internal class TypeParameterTable( + val typeParameters: List, + private val parent: TypeParameterTable? = null +) { + private fun getOrNull(id: Int): TypeParameterDescriptor? = + typeParameters.find { it.id == id } ?: parent?.getOrNull(id) + + fun get(id: Int): TypeParameterDescriptor = + getOrNull(id) ?: error("Unknown type parameter with id=$id") + + companion object { + @JvmField + val EMPTY = TypeParameterTable(emptyList()) + } +} + +internal class TypeProjection( + val type: KotlinType, + val isStarProjection: Boolean, + val projectionKind: KVariance +) + +internal fun KmType.toKotlinType(module: ModuleDescriptor, typeParameterTable: TypeParameterTable): KotlinType { + val classifier = classifier.let { classifier -> + when (classifier) { + is KmClassifier.Class -> module.findClass(classifier.name) + is KmClassifier.TypeParameter -> typeParameterTable.get(classifier.id) + is KmClassifier.TypeAlias -> TODO() + } + } + return KotlinType( + classifier, + generateSequence(this, KmType::outerType).flatMap(KmType::arguments).map { (variance, type) -> + TypeProjection( + type?.toKotlinType(module, typeParameterTable) ?: TODO("Any type"), + variance == null, + variance?.toVariance() ?: KVariance.OUT + ) + }.toList(), + Flag.Type.IS_NULLABLE(flags) + ) +} + +internal fun List.toTypeParameters( + container: DeclarationDescriptor, + module: ModuleDescriptor, + parentTable: TypeParameterTable? +): TypeParameterTable { + val list = ArrayList(size) + return TypeParameterTable(list, parentTable).also { table -> + mapTo(list) { TypeParameterDescriptorImpl(it, module, container, table) } + } +} + +internal val ClassifierDescriptor.kotlinType: KotlinType + get() = KotlinType( + this, + (this as? ClassDescriptor)?.typeParameters?.map { + TypeProjection(it.kotlinType, false, KVariance.INVARIANT) + }.orEmpty(), + false + ) + +private fun KmVariance.toVariance(): KVariance = + when (this) { + KmVariance.INVARIANT -> KVariance.INVARIANT + KmVariance.IN -> KVariance.IN + KmVariance.OUT -> KVariance.OUT + } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt new file mode 100644 index 0000000..60c5a4c --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -0,0 +1,17 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.misc.* +import kotlinx.reflect.lite.name.* + +internal class ModuleDescriptorImpl(private val classLoader: ClassLoader) : ModuleDescriptor { + override fun findClass(name: ClassName): ClassDescriptor { + val fqName = (JavaToKotlinClassMap.mapKotlinToJava(FqName(name.replace('/', '.'))) ?: ClassId(name)).asJavaLookupFqName() + val jClass = classLoader.tryLoadClass(fqName) ?: error("Failed to load the class: $fqName") + return KClassImpl(jClass).descriptor + } +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt new file mode 100644 index 0000000..d5596db --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -0,0 +1,37 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.descriptors.PropertyDescriptor +import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor +import kotlinx.reflect.lite.descriptors.ValueParameterDescriptor +import kotlinx.reflect.lite.name.* + +internal class PropertyDescriptorImpl( + val kmProperty: KmProperty, + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptorImpl? +) : AbstractCallableDescriptor(), PropertyDescriptor { + override val flags: Flags + get() = kmProperty.flags + + override val name: Name + get() = kmProperty.name + + override val valueParameters: List + get() = emptyList() + + override val typeParameterTable: TypeParameterTable = + kmProperty.typeParameters.toTypeParameters(this, module, containingClass?.typeParameterTable) + + override val typeParameters: List + get() = typeParameterTable.typeParameters + + override val returnType: KotlinType + get() = kmProperty.returnType.toKotlinType(module, typeParameterTable) + + override val isConst: Boolean + get() = Flag.Property.IS_CONST(flags) + override val isLateInit: Boolean + get() = Flag.Property.IS_LATEINIT(flags) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt new file mode 100644 index 0000000..79ae82d --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt @@ -0,0 +1,30 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.DeclarationDescriptor +import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor +import kotlinx.reflect.lite.name.* + +internal class TypeParameterDescriptorImpl( + private val kmTypeParam: KmTypeParameter, + private val module: ModuleDescriptor, + override val containingDeclaration: DeclarationDescriptor, + private val typeParameterTable: TypeParameterTable +) : TypeParameterDescriptor { + internal val id: Int get() = kmTypeParam.id + + override val name: Name + get() = kmTypeParam.name + + override val isReified: Boolean + get() = Flag.TypeParameter.IS_REIFIED(kmTypeParam.flags) + + override val upperBounds: List + get() = kmTypeParam.upperBounds.map { it.toKotlinType(module, typeParameterTable) } + + override val variance: KVariance + get() = kmTypeParam.variance.toVariance() +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt new file mode 100644 index 0000000..4d8c6ae --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt @@ -0,0 +1,23 @@ +package kotlinx.reflect.lite.descriptors + +import kotlinx.metadata.* +import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.name.* + +internal class ValueParameterDescriptorImpl( + private val kmValueParam: KmValueParameter, + override val containingDeclaration: AbstractFunctionDescriptor, + private val index: Int +) : ValueParameterDescriptor { + override val name: Name + get() = kmValueParam.name + + override val type: KotlinType? + get() = kmValueParam.type?.toKotlinType(containingDeclaration.module, containingDeclaration.typeParameterTable) + + override val declaresDefaultValue: Boolean + get() = Flag.ValueParameter.DECLARES_DEFAULT_VALUE(kmValueParam.flags) + + override val varargElementType: KotlinType? + get() = kmValueParam.varargElementType?.toKotlinType(containingDeclaration.module, containingDeclaration.typeParameterTable) +} \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt new file mode 100644 index 0000000..1cff8f3 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt @@ -0,0 +1,22 @@ +package kotlinx.reflect.lite.descriptors + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* + +internal fun Flags.toVisibility(): KVisibility? = + when { + Flag.Common.IS_PRIVATE(this) -> KVisibility.PRIVATE + Flag.Common.IS_PRIVATE_TO_THIS(this) -> KVisibility.PRIVATE + Flag.Common.IS_INTERNAL(this) -> KVisibility.INTERNAL + Flag.Common.IS_PROTECTED(this) -> KVisibility.PROTECTED + Flag.Common.IS_PUBLIC(this) -> KVisibility.PUBLIC + Flag.Common.IS_LOCAL(this) -> null + else -> error("Declaration with unknown visibility") + } + +internal fun KmVariance.toVariance(): KVariance = + when (this) { + KmVariance.INVARIANT -> KVariance.INVARIANT + KmVariance.IN -> KVariance.IN + KmVariance.OUT -> KVariance.OUT + } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 0e805f9..11cf75c 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -22,4 +22,7 @@ internal abstract class KCallableImpl: KCallable { override val typeParameters: List get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } + + override val returnType: KType + get() = KTypeImpl(descriptor.returnType) } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index 70eec32..fe56e48 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -2,24 +2,29 @@ package kotlinx.reflect.lite.impl import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.descriptors.impl.ClassDescriptorImpl +import kotlinx.reflect.lite.descriptors.impl.ModuleDescriptorImpl +import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.* internal class KClassImpl( val jClass: Class ) : KClass { - val descriptor: ClassDescriptor = createClassDescriptor() + + val descriptor: ClassDescriptor by ReflectProperties.lazySoft { + createClassDescriptor() + } private fun createClassDescriptor(): ClassDescriptor { - val header = with(jClass.getAnnotation(Metadata::class.java)) { - KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt) - } + val header = jClass.getAnnotation(Metadata::class.java)?.let { + KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) + } ?: error("@Metadata annotation was not found for ${jClass.name} ") val metadata = KotlinClassMetadata.read(header) val kmClass = (metadata as? KotlinClassMetadata.Class)?.toKmClass() ?: error("KotlinClassMetadata.Class metadata is only supported for now") val module = ModuleDescriptorImpl(jClass.safeClassLoader) - return ClassDescriptorImpl(kmClass, module, jClass.classId, this) + return ClassDescriptorImpl(kmClass, module, jClass.classId, this@KClassImpl) } override val simpleName: String? @@ -56,10 +61,15 @@ internal class KClassImpl( } override val constructors: Collection> - get() = descriptor.constructors.map { - @Suppress("UNCHECKED_CAST") - KFunctionImpl(it) as KFunction - } + get() = + if (descriptor.isInterface || descriptor.isObject || descriptor.isCompanionObject) { + emptyList() + } else { + descriptor.constructors.map { + @Suppress("UNCHECKED_CAST") + KFunctionImpl(it) as KFunction + } + } override val nestedClasses: Collection> get() = descriptor.nestedClasses.map { nestedClassDesc -> @@ -73,12 +83,19 @@ internal class KClassImpl( jClass?.let { KClassImpl(it) } } + // TODO: inherited members + override val members: Collection> + get() = descriptor.functions.map(::KFunctionImpl) + descriptor.properties.map(::KPropertyImpl) + override val visibility: KVisibility? get() = descriptor.visibility override val typeParameters: List get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } + override val supertypes: List + get() = descriptor.supertypes.map(::KTypeImpl) + override val isFinal: Boolean get() = descriptor.isFinal override val isOpen: Boolean diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt index 8be5076..f795f56 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -10,4 +10,13 @@ internal class KParameterImpl( ): KParameter { override val name: String get() = descriptor.name + + override val type: KType? + get() = descriptor.type?.let(::KTypeImpl) + + override val isOptional: Boolean // TODO: inheritsDefaultValue + get() = (descriptor as? ValueParameterDescriptor)?.declaresDefaultValue ?: false + + override val isVararg: Boolean + get() = (descriptor is ValueParameterDescriptor) && descriptor.varargElementType != null } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 3ccbcd0..895cf4b 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -1,9 +1,44 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.types.KotlinType +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.impl.KotlinType internal class KTypeImpl( - val kType: KotlinType + val type: KotlinType ): KType { + + override val classifier: KClassifier? + get() = + when (val descriptor = type.classifierDescriptor) { + is ClassDescriptor -> { + val jClass = descriptor.kClass.jClass + // TODO array types + KClassImpl(jClass) + } + is TypeParameterDescriptor -> KTypeParameterImpl(descriptor) + is TypeAliasDescriptor -> TODO("Type alias classifiers are not yet supported") + else -> null + } + + override val arguments: List + get() { + val typeArguments = type.arguments + if (typeArguments.isEmpty()) return emptyList() + return typeArguments.map { typeProjection -> + if (typeProjection.isStarProjection) { + KTypeProjection.STAR + } else { + val type = KTypeImpl(typeProjection.type) + when (typeProjection.projectionKind) { + KVariance.INVARIANT -> KTypeProjection.invariant(type) + KVariance.IN -> KTypeProjection.contravariant(type) + KVariance.OUT -> KTypeProjection.covariant(type) + } + } + } + } + + override val isMarkedNullable: Boolean + get() = type.isMarkedNullable } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt index 0278fc4..cd6bdda 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt @@ -11,4 +11,10 @@ internal class KTypeParameterImpl( override val isReified: Boolean get() = descriptor.isReified + + override val upperBounds: List + get() = descriptor.upperBounds.map(::KTypeImpl) + + override val variance: KVariance + get() = descriptor.variance } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 6c93704..5e6c676 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -20,7 +20,7 @@ import kotlinx.reflect.lite.* internal object ReflectionLiteImpl { // TODO some entry point API - fun loadClassMetadata(klass: Class): KClass? { + fun loadClassMetadata(klass: Class): KClass { return KClassImpl(klass) } } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java b/src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java new file mode 100644 index 0000000..2510e6a --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java @@ -0,0 +1,113 @@ +/* + * Copyright 2010-2015 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 kotlinx.reflect.lite.internal; + +import kotlin.jvm.functions.Function0; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.ref.SoftReference; + +public class ReflectProperties { + public static abstract class Val { + private static final Object NULL_VALUE = new Object() {}; + + @SuppressWarnings({"UnusedParameters", "unused"}) + public final T getValue(Object instance, Object metadata) { + return invoke(); + } + + public abstract T invoke(); + + protected Object escape(T value) { + return value == null ? NULL_VALUE : value; + } + + @SuppressWarnings("unchecked") + protected T unescape(Object value) { + return value == NULL_VALUE ? null : (T) value; + } + } + + // A delegate for a lazy property, whose initializer may be invoked multiple times including simultaneously from different threads + public static class LazyVal extends Val { + private final Function0 initializer; + private volatile Object value = null; + + public LazyVal(@NotNull Function0 initializer) { + this.initializer = initializer; + } + + @Override + public T invoke() { + Object cached = value; + if (cached != null) { + return unescape(cached); + } + + T result = initializer.invoke(); + value = escape(result); + + return result; + } + } + + // A delegate for a lazy property on a soft reference, whose initializer may be invoked multiple times + // including simultaneously from different threads + public static class LazySoftVal extends Val implements Function0 { + private final Function0 initializer; + private volatile SoftReference value = null; + + public LazySoftVal(@Nullable T initialValue, @NotNull Function0 initializer) { + this.initializer = initializer; + if (initialValue != null) { + this.value = new SoftReference(escape(initialValue)); + } + } + + @Override + public T invoke() { + SoftReference cached = value; + if (cached != null) { + Object result = cached.get(); + if (result != null) { + return unescape(result); + } + } + + T result = initializer.invoke(); + value = new SoftReference(escape(result)); + + return result; + } + } + + @NotNull + public static LazyVal lazy(@NotNull Function0 initializer) { + return new LazyVal(initializer); + } + + @NotNull + public static LazySoftVal lazySoft(@Nullable T initialValue, @NotNull Function0 initializer) { + return new LazySoftVal(initialValue, initializer); + } + + @NotNull + public static LazySoftVal lazySoft(@NotNull Function0 initializer) { + return lazySoft(null, initializer); + } +} diff --git a/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt index a1868f8..4d608c5 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt @@ -15,7 +15,4 @@ internal object CompanionObjectMapping { fun allClassesWithIntrinsicCompanions(): Set = Collections.unmodifiableSet(classIds) - -// fun isMappedIntrinsicCompanionObject(classDescriptor: ClassDescriptor): Boolean = -// classDescriptor.isCompanionObject && classDescriptor.classId.getOuterClassId() in classIds } diff --git a/src/main/java/kotlinx/reflect/lite/misc/util.kt b/src/main/java/kotlinx/reflect/lite/misc/util.kt index b8af713..8ada0d7 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/util.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/util.kt @@ -74,11 +74,4 @@ fun ClassLoader.tryLoadClass(fqName: String) = Class.forName(fqName, false, this) } catch (e: ClassNotFoundException) { null - } - -fun ArrayList.compact(): List = - when (size) { - 0 -> emptyList() - 1 -> listOf(first()) - else -> apply { trimToSize() } - } + } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/name/names.kt b/src/main/java/kotlinx/reflect/lite/name/names.kt index 6cd600b..4f0812b 100644 --- a/src/main/java/kotlinx/reflect/lite/name/names.kt +++ b/src/main/java/kotlinx/reflect/lite/name/names.kt @@ -74,6 +74,3 @@ data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val } private val SANITIZE_AS_JAVA_INVALID_CHARACTERS = "[^\\p{L}\\p{Digit}]".toRegex() - -fun sanitizeAsJavaIdentifier(name: String): String = - SANITIZE_AS_JAVA_INVALID_CHARACTERS.replace(name, "_") diff --git a/src/main/java/kotlinx/reflect/lite/types/types.kt b/src/main/java/kotlinx/reflect/lite/types/types.kt deleted file mode 100644 index 4639383..0000000 --- a/src/main/java/kotlinx/reflect/lite/types/types.kt +++ /dev/null @@ -1,16 +0,0 @@ -package kotlinx.reflect.lite.types - -import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.ClassifierDescriptor - -internal class KotlinType( - val descriptor: ClassifierDescriptor, - val arguments: List, - val isMarkedNullable: Boolean -) : Annotated { - -} - -internal class TypeProjection( - val type: KotlinType -) diff --git a/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt b/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt deleted file mode 100644 index 07ecc92..0000000 --- a/src/test/java/kotlinx/reflect/lite/test/BasicReflectTest.kt +++ /dev/null @@ -1,39 +0,0 @@ -package kotlinx.reflect.lite.test - -import kotlinx.reflect.lite.* -import org.junit.Test -import kotlin.test.* - -class BasicReflectTest { - @Test - fun testConstructor() { - val kClass = ReflectionLite.loadClassMetadata(Types::class.java)!! - assertEquals(2, kClass.constructors.size) - val primaryConstructor = kClass.constructors.single { it.parameters.size == 1 } - assertTrue(primaryConstructor.name == "") - - val parameter = primaryConstructor.parameters.single() - assertTrue(parameter.name == "param") - } - - @Test - fun testDataClass() { - assertTrue(ReflectionLite.loadClassMetadata(DataClass::class.java)!!.isData) - assertFalse(ReflectionLite.loadClassMetadata(Types::class.java)!!.isData) - } - - @Test - fun testClassKinds() { - assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Enum::class.java)!!.isFinal) - assertTrue(ReflectionLite.loadClassMetadata(ClassKinds.Companion::class.java)!!.isCompanion) - } - - @Test - fun testNestedClasses() { - val kClass = ReflectionLite.loadClassMetadata(A::class.java)!! - val nestedClasses = kClass.nestedClasses.map { it.simpleName } - nestedClasses.forEach { - println(it) - } - } -} diff --git a/src/test/java/kotlinx/reflect/lite/test/testData.kt b/src/test/java/kotlinx/reflect/lite/test/testData.kt deleted file mode 100644 index 0cee084..0000000 --- a/src/test/java/kotlinx/reflect/lite/test/testData.kt +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2010-2017 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. - */ - -@file:Suppress("UNUSED_PARAMETER", "unused", "RedundantSuspendModifier") - -package kotlinx.reflect.lite.test - -import kotlin.reflect.KClass - -class Types(param: Int) { - class Nested { - fun method(nullableString: String?, nonNullIntArray: IntArray, nullableNested: Nested?): Int = 0 - } - - constructor() : this(0) - - fun notNullListOfStrings(): List = emptyList() - fun nullableInt(): Int? = null - - fun primitives(z: Boolean, c: Char, b: Byte, s: Short, i: Int, f: Float, j: Long, d: Double) {} - fun primitiveArrays(z: BooleanArray, c: CharArray, b: ByteArray, s: ShortArray, i: IntArray, f: FloatArray, j: LongArray, d: DoubleArray) {} - fun mappedCollections(a: Iterable<*>, b: Iterator<*>, c: Collection<*>, d: List<*>, e: Set<*>, f: Map<*, *>, g: Map.Entry<*, *>, h: ListIterator<*>) {} - fun mappedMutableCollections( - a: MutableIterable<*>, b: MutableIterator<*>, c: MutableCollection<*>, d: MutableList<*>, e: MutableSet<*>, - f: MutableMap<*, *>, g: MutableMap.MutableEntry<*, *>, h: MutableListIterator<*> - ) {} - fun mappedTypes(a: Any, b: String, c: CharSequence, d: Throwable, e: Cloneable, f: Number, g: Comparable<*>, h: Enum<*>, i: Annotation) {} - fun functionTypes(a: () -> Unit, b: () -> String, c: (String) -> Unit, d: (String, Int, DoubleArray) -> List<*>, - e: (Any, Any, Any?, Array, KClass, Class, List, Map) -> Any?) {} -} - -data class DataClass(val field: Int) - -class ClassKinds { - class Class - interface Interface - enum class Enum { - ENTRY { fun foo() {} } - } - annotation class Annotation - object Object - companion object -} - -open class Visibilities { - constructor() - protected constructor(i: Int) - internal constructor(d: Double) - private constructor(f: Float) - - fun publicFun() {} - protected fun protectedFun() {} - internal fun internalFun() {} - private fun privateFun() {} - - val publicVal = "" - protected val protectedVal = "" - internal val internalVal = "" - private val privateVal = "" -} - -class Properties { - private val backingField: List? = emptyList() - - val delegated: String by lazy { "42" } -} - -class EnumerateAllCallables(val property1: String) { - constructor() : this("") - - fun function1() {} - fun function2() {} - val property2 = "" -} - -class ExtensionReceiverType { - fun String.stringExtFun() {} - fun List?.nullableListExtFun() {} - - val Int.intExtProp get() = "" - val Double?.nullableDoubleExtProp get() = "" - - fun nonExtFun() {} -} - -object CallableModifiers { - inline fun inline(f: () -> Unit) = f() - external fun external() - operator fun plus(s: String) = s - infix fun infix(s: String) = s - suspend fun suspend() {} - fun isOdd(x: Int) = x % 2 != 0 - - lateinit var lateinit: String - const val const = 42 -} - -open class ParameterDefaultValue { - open fun foo(x: Int, y: Int? = null) {} -} - -class ParameterDefaultValueSubclass : ParameterDefaultValue() { - override fun foo(x: Int, y: Int?) {} -} - -class ParameterVararg { - fun foo(x: Int, vararg y: String?) {} -} - -open class ParentClass { - open val p1: String = "aaa" - val p2: String = "bbb" - - open fun foo1(x: Int): String { - return "$x$p1" - } - - fun foo2(x: Int): String { - return "$x$p2" - } -} - -class ChildClass(): ParentClass() { - val p3: String = "ccc" - - fun bar(): String { - return p3 - } -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/annotationRetentionAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/annotationRetentionAnnotation.kt new file mode 100644 index 0000000..bf0c70e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/annotationRetentionAnnotation.kt @@ -0,0 +1,16 @@ +package tests.annotations.annotationRetentionAnnotation + +import kotlin.test.assertEquals + +@Retention(AnnotationRetention.RUNTIME) +annotation class Anno + +fun box(): String { + val a = Anno::class.annotations + + if (a.size != 1) return "Fail 1: $a" + val ann = a.single() as? Retention ?: return "Fail 2: ${a.single()}" + assertEquals(AnnotationRetention.RUNTIME, ann.value) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/genericExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/genericExtensionProperty.kt new file mode 100644 index 0000000..eec707c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/genericExtensionProperty.kt @@ -0,0 +1,15 @@ +package tests.annotations.genericExtensionProperty + +@Retention(AnnotationRetention.RUNTIME) +annotation class Simple(val value: String) + +interface A + +@Simple("OK") +public val A.p: String + get() = TODO() + +fun box(): String { + val o = object : A {} + return (o::p.annotations.single() as Simple).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/localClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/localClassLiteral.kt new file mode 100644 index 0000000..a43b8b4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/localClassLiteral.kt @@ -0,0 +1,25 @@ + +package tests.annotations.localClassLiteral + +import kotlin.reflect.KClass + +annotation class Anno(val k1: KClass<*>, val k2: KClass<*>, val k3: KClass<*>) + +fun box(): String { + class L + + @Anno(k1 = L::class, k2 = Array::class, k3 = Array>::class) + class M + + val fqName = "tests.annotations.localClassLiteral.LocalClassLiteralKt\$box\$L" + + // JDK 8 and earlier + val expected1 = "[@tests.annotations.localClassLiteral.Anno(k1=class $fqName, k2=class [L$fqName;, k3=class [[L$fqName;)]" + // JDK 9 and later + val expected2 = "[@tests.annotations.localClassLiteral.Anno(k1=$fqName.class, k2=$fqName[].class, k3=$fqName[][].class)]" + + val actual = M::class.annotations.toString() + if (actual != expected1 && actual != expected2) return "Fail: $actual" + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/arrayKClass.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/arrayKClass.kt new file mode 100644 index 0000000..a00e95e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/arrayKClass.kt @@ -0,0 +1,13 @@ +package tests.annotations.onTypes.arrayKClass + +import kotlin.reflect.KClass + +@Target(AnnotationTarget.TYPE) +annotation class MyAnn(val cls: KClass<*>) + +val s: @MyAnn(Array::class) String = "" + +fun box(): String { + val ann = ::s.returnType.annotations[0] as MyAnn + return if (ann.cls == Array::class) "OK" else "Fail: ${ann.cls}" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/classLiteralWithExpectedType.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/classLiteralWithExpectedType.kt new file mode 100644 index 0000000..53ed479 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/classLiteralWithExpectedType.kt @@ -0,0 +1,24 @@ + +package tests.annotations.onTypes.classLiteralWithExpectedType + +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +@Target(AnnotationTarget.TYPE) +annotation class Anno( + val k1: KClass, + val k2: KClass, + val ka: Array> +) + +fun f(): @Anno(String::class, CharSequence::class, [Double::class, Long::class, Int::class]) Unit {} + +fun box(): String { + assertEquals( + "[@tests.annotations.onTypes.classLiteralWithExpectedType.Anno(k1=class java.lang.String, k2=interface java.lang.CharSequence, " + + "ka=[class java.lang.Double, class java.lang.Long, class java.lang.Integer])]", + ::f.returnType.annotations.toString() + ) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentArgumentTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentArgumentTypes.kt new file mode 100644 index 0000000..3403a89 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentArgumentTypes.kt @@ -0,0 +1,96 @@ +package tests.annotations.onTypes.differentArgumentTypes + +import kotlin.reflect.KClass +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +annotation class Nested(val value: String) + +@Target(AnnotationTarget.TYPE) +annotation class Anno( + val b: Byte, + val c: Char, + val d: Double, + val f: Float, + val i: Int, + val j: Long, + val s: Short, + val z: Boolean, + val ba: ByteArray, + val ca: CharArray, + val da: DoubleArray, + val fa: FloatArray, + val ia: IntArray, + val ja: LongArray, + val sa: ShortArray, + val za: BooleanArray, + val str: String, + val k: KClass<*>, + val k2: KClass<*>, + val e: AnnotationTarget, + val a: Nested, + val stra: Array, + val ka: Array>, + val ea: Array, + val aa: Array +) + +fun f(): @Anno( + 1.toByte(), + 'x', + 3.14, + -2.72f, + 42424242, + 239239239239239L, + 42.toShort(), + true, + [(-1).toByte()], + ['y'], + [-3.14159], + [2.7218f], + [424242], + [239239239239L], + [(-43).toShort()], + [false, true], + "lol", + Number::class, + IntArray::class, + AnnotationTarget.EXPRESSION, + Nested("1"), + ["lmao"], + [Double::class, Unit::class, LongArray::class, Array::class], + [AnnotationTarget.TYPEALIAS, AnnotationTarget.FIELD], + [Nested("2"), Nested("3")] +) Unit {} + +fun box(): String { + val anno = ::f.returnType.annotations.single() as Anno + assertEquals( + "@tests.annotations.onTypes.differentArgumentTypes.Anno(b=1, c=x, d=3.14, f=-2.72, i=42424242, j=239239239239239, s=42, z=true, " + + "ba=[-1], ca=[y], da=[-3.14159], fa=[2.7218], ia=[424242], ja=[239239239239], sa=[-43], za=[false, true], " + + "str=lol, k=class java.lang.Number, k2=class [I, e=EXPRESSION, a=@tests.annotations.onTypes.differentArgumentTypes.Nested(value=1), stra=[lmao], " + + "ka=[class java.lang.Double, class kotlin.Unit, class [J, class [Ljava.lang.String;], " + + "ea=[TYPEALIAS, FIELD], aa=[@tests.annotations.onTypes.differentArgumentTypes.Nested(value=2), @tests.annotations.onTypes.differentArgumentTypes.Nested(value=3)])", + anno.toString() + ) + + // Check that array instances have correct types at runtime and not just Object[]. + assertTrue(anno.ba is ByteArray) + assertTrue(anno.ca is CharArray) + assertTrue(anno.da is DoubleArray) + assertTrue(anno.fa is FloatArray) + assertTrue(anno.ia is IntArray) + assertTrue(anno.ja is LongArray) + assertTrue(anno.sa is ShortArray) + assertTrue(anno.za is BooleanArray) + val stra = anno.stra + assertTrue(stra is Array<*> && stra.isArrayOf()) + val ka = anno.ka + assertTrue(ka is Array<*> && ka.isArrayOf>()) + val ea = anno.ea + assertTrue(ea is Array<*> && ea.isArrayOf()) + val aa = anno.aa + assertTrue(aa is Array<*> && aa.isArrayOf()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentPositions.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentPositions.kt new file mode 100644 index 0000000..2602d67 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentPositions.kt @@ -0,0 +1,47 @@ +package tests.annotations.onTypes.differentPositions + +import kotlin.reflect.KCallable +import kotlin.reflect.KType + +@Target(AnnotationTarget.TYPE) +annotation class InRange(val from: Int, val to: Int) + +val propertyType: @InRange(1, 10) Int = 5 + +fun functionType(): @InRange(1, 10) Int = 5 + +fun parameterType(param: @InRange(1, 10) Int) {} + +fun (@InRange(1, 10) Int).receiverType() {} + +abstract class Supertype : @InRange(1, 10) Number() { + fun typeParameterBound(t: T): T = t + + inner class Inner +} + +fun typeArgument(): List<@InRange(1, 10) Int>? = null + +// ------- + +private fun check(what: String, type: KType) { + val annotations = type.annotations + if (annotations.isEmpty()) throw AssertionError("No annotations found on $what") + val a = annotations.single() as InRange + if (a.from != 1 || a.to != 10) throw AssertionError("Incorrect from/to values: ${a.from} ${a.to}") +} + +fun box(): String { + check("property return type", ::propertyType.returnType) + check("function return type", ::functionType.returnType) + check("parameter type", ::parameterType.parameters.single().type) + check("receiver type", Int::receiverType.parameters.single().type) + check("supertype", Supertype::class.supertypes.single()) + + val typeParameterBound = Supertype::class.members.single { it.name == "typeParameterBound" } as KCallable + check("type parameter bound", typeParameterBound.typeParameters.single().upperBounds.single()) + + check("type argument", ::typeArgument.returnType.arguments.single().type!!) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/privateAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/privateAnnotation.kt new file mode 100644 index 0000000..7e62b55 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/privateAnnotation.kt @@ -0,0 +1,13 @@ +package tests.annotations.privateAnnotation + +annotation private class Ann(val name: String) + +class A { + @Ann("OK") + fun foo() {} +} + +fun box(): String { + val ann = A::class.members.single { it.name == "foo" }.annotations.single() as Ann + return ann.name +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyAccessors.kt new file mode 100644 index 0000000..1885efc --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyAccessors.kt @@ -0,0 +1,17 @@ +package tests.annotations.propertyAccessors + +annotation class Get +annotation class Set +annotation class SetParam + +var foo: String + @Get get() = "" + @Set set(@SetParam value) {} + +fun box(): String { + assert(::foo.getter.annotations.single() is Get) + assert(::foo.setter.annotations.single() is Set) + assert(::foo.setter.parameters.single().annotations.single() is SetParam) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyWithoutBackingField.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyWithoutBackingField.kt new file mode 100644 index 0000000..815da33 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyWithoutBackingField.kt @@ -0,0 +1,11 @@ +package tests.annotations.propertyWithoutBackingField + +annotation class Ann(val value: String) + +@Ann("OK") +val property: String + get() = "" + +fun box(): String { + return (::property.annotations.single() as Ann).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/retentions.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/retentions.kt new file mode 100644 index 0000000..694cf7d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/retentions.kt @@ -0,0 +1,20 @@ +package tests.annotations.retentions + +import kotlin.test.assertEquals + +@Retention(AnnotationRetention.SOURCE) +annotation class SourceAnno + +@Retention(AnnotationRetention.BINARY) +annotation class BinaryAnno + +@Retention(AnnotationRetention.RUNTIME) +annotation class RuntimeAnno + +@SourceAnno +@BinaryAnno +@RuntimeAnno +fun box(): String { + assertEquals(listOf(RuntimeAnno::class.java), ::box.annotations.map { it.annotationClass.java }) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/setparam.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/setparam.kt new file mode 100644 index 0000000..b776f31 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/setparam.kt @@ -0,0 +1,23 @@ + +// different annotation order + +package tests.annotations.setparam + +import kotlin.test.assertEquals + +annotation class Ann1 +annotation class Ann2 + +class Foo { + @setparam:Ann1 + var delegate = " " + set(@Ann2 value) {} +} + +fun box(): String { + val setterParameters = Foo::delegate.setter.parameters + assertEquals(2, setterParameters.size) + assertEquals("[]", setterParameters.first().annotations.toString()) + assertEquals("[@tests.annotations.setparam.Ann2(), @tests.annotations.setparam.Ann1()]", setterParameters.last().annotations.toString()) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleClassAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleClassAnnotation.kt new file mode 100644 index 0000000..7c95967 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleClassAnnotation.kt @@ -0,0 +1,11 @@ +package tests.annotations.simpleClassAnnotation + +@Retention(AnnotationRetention.RUNTIME) +annotation class Simple(val value: String) + +@Simple("OK") +class A + +fun box(): String { + return (A::class.annotations.single() as Simple).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleConstructorAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleConstructorAnnotation.kt new file mode 100644 index 0000000..c332460 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleConstructorAnnotation.kt @@ -0,0 +1,15 @@ +package tests.annotations.simpleConstructorAnnotation + +annotation class Primary +annotation class Secondary + +class C @Primary constructor() { + @Secondary + constructor(s: String): this() +} + +fun box(): String { + val ans = C::class.constructors.map { it.annotations.single().annotationClass.java.simpleName }.sorted() + if (ans != listOf("Primary", "Secondary")) return "Fail: $ans" + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleFunAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleFunAnnotation.kt new file mode 100644 index 0000000..96bf9aa --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleFunAnnotation.kt @@ -0,0 +1,9 @@ +package tests.annotations.simpleFunAnnotation + +@Retention(AnnotationRetention.RUNTIME) +annotation class Simple(val value: String) + +@Simple("OK") +fun box(): String { + return (::box.annotations.single() as Simple).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleParamAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleParamAnnotation.kt new file mode 100644 index 0000000..570ed62 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleParamAnnotation.kt @@ -0,0 +1,10 @@ +package tests.annotations.simpleParamAnnotation + +@Retention(AnnotationRetention.RUNTIME) +annotation class Simple(val value: String) + +fun test(@Simple("OK") x: Int) {} + +fun box(): String { + return (::test.parameters.single().annotations.single() as Simple).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleValAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleValAnnotation.kt new file mode 100644 index 0000000..eea4528 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleValAnnotation.kt @@ -0,0 +1,11 @@ +package tests.annotations.simpleValAnnotation + +@Retention(AnnotationRetention.RUNTIME) +annotation class Simple(val value: String) + +@property:Simple("OK") +val foo: Int = 0 + +fun box(): String { + return (::foo.annotations.single() as Simple).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/builtins/collections.kt b/src/test/java/kotlinx/reflect/lite/testData/builtins/collections.kt new file mode 100644 index 0000000..3a09791 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/builtins/collections.kt @@ -0,0 +1,26 @@ +package tests.builtins.collections + +// See KT-11258, KT-16616 + +import java.util.* +import kotlin.test.assertEquals + +fun box(): String { + listOf( + ArrayList::class, + LinkedList::class, + AbstractList::class, + HashSet::class, + TreeSet::class, + HashMap::class, + TreeMap::class, + AbstractMap::class, + AbstractMap.SimpleEntry::class + ).map { + it.members.map(Any::toString) + } + + assertEquals(1, Collection::size.getter(listOf(1))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/builtins/enumNameOrdinal.kt b/src/test/java/kotlinx/reflect/lite/testData/builtins/enumNameOrdinal.kt new file mode 100644 index 0000000..17ea740 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/builtins/enumNameOrdinal.kt @@ -0,0 +1,13 @@ +package tests.builtins.enumNameOrdinal + +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +enum class E { X, Y, Z } + +fun box(): String { + assertTrue(E::class.members.size in 11..12, "" + E::class.members.size) + assertEquals("Y", E::name.call(E.Y)) + assertEquals(2, E::ordinal.call(E.Z)) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/builtins/stringLength.kt b/src/test/java/kotlinx/reflect/lite/testData/builtins/stringLength.kt new file mode 100644 index 0000000..b54e3d4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/builtins/stringLength.kt @@ -0,0 +1,9 @@ +package tests.builtins.stringLength + +import kotlin.test.assertEquals + +fun box(): String { + String::class.members + assertEquals(2, String::length.call("OK")) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt new file mode 100644 index 0000000..1a944cf --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -0,0 +1,21 @@ +package tests.call.bigArity + +class A { + fun foo( + p00: A, p01: A, p02: A, p03: A, p04: A, p05: A, p06: A, p07: A, p08: A, p09: A, + p10: A, p11: A, p12: A, p13: A, p14: A, p15: A, p16: A, p17: A, p18: A, p19: A, + p20: A, p21: A, p22: A, p23: A, p24: A, p25: A, p26: A, p27: A, p28: A, p29: String + ): String { + return p29 + } +} + +fun box(): String { + val a = A() + val o = A::foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "O") + + val foo = A::class.members.single { it.name == "foo" } + val k = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "K") + + return o + k +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/companionObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/companionObjectPropertyAccessors.kt new file mode 100644 index 0000000..62989b8 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/companionObjectPropertyAccessors.kt @@ -0,0 +1,50 @@ +package tests.call.bound.companionObjectPropertyAccessors + +import kotlin.reflect.* +import kotlin.test.assertEquals + +class Host { + companion object { + val x = 1 + var y = 2 + + val xx: Int + get() = x + + var yy: Int + get() = y + set(value) { y = value } + } +} + +val c_x = Host.Companion::x +val c_xx = Host.Companion::xx +val c_y = Host.Companion::y +val c_yy = Host.Companion::yy + +fun box(): String { + assertEquals(1, c_x.getter()) + assertEquals(1, c_x.getter.call()) + assertEquals(1, c_xx.getter()) + assertEquals(1, c_xx.getter.call()) + assertEquals(2, c_y.getter()) + assertEquals(2, c_y.getter.call()) + assertEquals(2, c_yy.getter()) + assertEquals(2, c_yy.getter.call()) + + c_y.setter(10) + assertEquals(10, c_y.getter()) + assertEquals(10, c_yy.getter()) + + c_yy.setter(20) + assertEquals(20, c_y.getter()) + assertEquals(20, c_yy.getter()) + + c_y.setter.call(100) + assertEquals(100, c_yy.getter.call()) + + c_yy.setter.call(200) + assertEquals(200, c_y.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionFunction.kt new file mode 100644 index 0000000..225802e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionFunction.kt @@ -0,0 +1,9 @@ +package tests.call.bound.extensionFunction + +import kotlin.reflect.* + +fun String.foo(x: String) = this + x +fun String?.bar(x: String) = x + +fun box() = + (""::foo).call("O") + (null::bar).call("K") \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionPropertyAccessors.kt new file mode 100644 index 0000000..ac7c145 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionPropertyAccessors.kt @@ -0,0 +1,42 @@ +package tests.call.bound.extensionPropertyAccessors + +import kotlin.reflect.* +import kotlin.test.assertEquals + +class C(val x: Int, var y: Int) + +val C.xx: Int + get() = x + +var C.yy: Int + get() = y + set(value) { y = value } + + +val c = C(1, 2) + +val c_xx = c::xx +val c_y = c::y +val c_yy = c::yy + +fun box(): String { + assertEquals(1, c_xx.getter()) + assertEquals(1, c_xx.getter.call()) + assertEquals(2, c_yy.getter()) + assertEquals(2, c_yy.getter.call()) + + c_y.setter(10) + assertEquals(10, c_yy.getter()) + + c_yy.setter(20) + assertEquals(20, c_y.getter()) + assertEquals(20, c_yy.getter()) + + c_y.setter.call(100) + assertEquals(100, c_yy.getter.call()) + + c_yy.setter.call(200) + assertEquals(200, c_y.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/innerClassConstructor.kt new file mode 100644 index 0000000..47e278c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/innerClassConstructor.kt @@ -0,0 +1,13 @@ +package tests.call.bound.innerClassConstructor + +class Outer(val x: String) { + inner class Inner(val y: String) { + fun foo() = x + y + } +} + +fun box(): String { + val innerCtor = Outer("O")::Inner + val inner = innerCtor.call("K") + return inner.foo() +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt new file mode 100644 index 0000000..90ade2d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt @@ -0,0 +1,50 @@ +package tests.call.bound.jvmStaticCompanionObjectPropertyAccessors + +import kotlin.reflect.* +import kotlin.test.assertEquals + +class Host { + companion object { + @JvmStatic val x = 1 + @JvmStatic var y = 2 + + @JvmStatic val xx: Int + get() = x + + @JvmStatic var yy: Int + get() = y + set(value) { y = value } + } +} + +val c_x = Host.Companion::x +val c_xx = Host.Companion::xx +val c_y = Host.Companion::y +val c_yy = Host.Companion::yy + +fun box(): String { + assertEquals(1, c_x.getter()) + assertEquals(1, c_x.getter.call()) + assertEquals(1, c_xx.getter()) + assertEquals(1, c_xx.getter.call()) + assertEquals(2, c_y.getter()) + assertEquals(2, c_y.getter.call()) + assertEquals(2, c_yy.getter()) + assertEquals(2, c_yy.getter.call()) + + c_y.setter(10) + assertEquals(10, c_y.getter()) + assertEquals(10, c_yy.getter()) + + c_yy.setter(20) + assertEquals(20, c_y.getter()) + assertEquals(20, c_yy.getter()) + + c_y.setter.call(100) + assertEquals(100, c_yy.getter.call()) + + c_yy.setter.call(200) + assertEquals(200, c_y.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectFunction.kt new file mode 100644 index 0000000..5dfe19f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectFunction.kt @@ -0,0 +1,16 @@ +package tests.call.bound.jvmStaticObjectFunction + +import kotlin.reflect.* + +object Host { + @JvmStatic fun foo(x: String) = x +} + +class CompanionOwner { + companion object { + @JvmStatic fun bar(x: String) = x + } +} + +fun box(): String = + (Host::foo).call("O") + (CompanionOwner.Companion::bar).call("K") \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectPropertyAccessors.kt new file mode 100644 index 0000000..e5657b2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectPropertyAccessors.kt @@ -0,0 +1,48 @@ +package tests.call.bound.jvmStaticObjectPropertyAccessors + +import kotlin.reflect.* +import kotlin.test.assertEquals + +object Host { + @JvmStatic val x = 1 + @JvmStatic var y = 2 + + @JvmStatic val xx: Int + get() = x + + @JvmStatic var yy: Int + get() = y + set(value) { y = value } +} + +val c_x = Host::x +val c_xx = Host::xx +val c_y = Host::y +val c_yy = Host::yy + +fun box(): String { + assertEquals(1, c_x.getter()) + assertEquals(1, c_x.getter.call()) + assertEquals(1, c_xx.getter()) + assertEquals(1, c_xx.getter.call()) + assertEquals(2, c_y.getter()) + assertEquals(2, c_y.getter.call()) + assertEquals(2, c_yy.getter()) + assertEquals(2, c_yy.getter.call()) + + c_y.setter(10) + assertEquals(10, c_y.getter()) + assertEquals(10, c_yy.getter()) + + c_yy.setter(20) + assertEquals(20, c_y.getter()) + assertEquals(20, c_yy.getter()) + + c_y.setter.call(100) + assertEquals(100, c_yy.getter.call()) + + c_yy.setter.call(200) + assertEquals(200, c_y.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberFunction.kt new file mode 100644 index 0000000..300e4c7 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberFunction.kt @@ -0,0 +1,10 @@ +package tests.call.bound.memberFunction + +import kotlin.reflect.* + +class C(val k: String) { + fun foo(s: String) = s + k +} + +fun box(): String = + C("K")::foo.call("O") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberPropertyAccessors.kt new file mode 100644 index 0000000..d379846 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberPropertyAccessors.kt @@ -0,0 +1,47 @@ +package tests.call.bound.memberPropertyAccessors + +import kotlin.reflect.* +import kotlin.test.assertEquals + +class C(val x: Int, var y: Int) { + val xx: Int + get() = x + + var yy: Int + get() = y + set(value) { y = value } +} + +val c = C(1, 2) + +val c_x = c::x +val c_xx = c::xx +val c_y = c::y +val c_yy = c::yy + +fun box(): String { + assertEquals(1, c_x.getter()) + assertEquals(1, c_x.getter.call()) + assertEquals(1, c_xx.getter()) + assertEquals(1, c_xx.getter.call()) + assertEquals(2, c_y.getter()) + assertEquals(2, c_y.getter.call()) + assertEquals(2, c_yy.getter()) + assertEquals(2, c_yy.getter.call()) + + c_y.setter(10) + assertEquals(10, c_y.getter()) + assertEquals(10, c_yy.getter()) + + c_yy.setter(20) + assertEquals(20, c_y.getter()) + assertEquals(20, c_yy.getter()) + + c_y.setter.call(100) + assertEquals(100, c_yy.getter.call()) + + c_yy.setter.call(200) + assertEquals(200, c_y.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectFunction.kt new file mode 100644 index 0000000..582455f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectFunction.kt @@ -0,0 +1,16 @@ +package tests.call.bound.objectFunction + +import kotlin.reflect.* + +object Host { + fun foo(x: String) = x +} + +class CompanionOwner { + companion object { + fun bar(x: String) = x + } +} + +fun box(): String = + (Host::foo).call("O") + (CompanionOwner.Companion::bar).call("K") \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectPropertyAccessors.kt new file mode 100644 index 0000000..da60c05 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectPropertyAccessors.kt @@ -0,0 +1,48 @@ +package tests.call.bound.objectPropertyAccessors + +import kotlin.reflect.* +import kotlin.test.assertEquals + +object Host { + val x = 1 + var y = 2 + + val xx: Int + get() = x + + var yy: Int + get() = y + set(value) { y = value } +} + +val c_x = Host::x +val c_xx = Host::xx +val c_y = Host::y +val c_yy = Host::yy + +fun box(): String { + assertEquals(1, c_x.getter()) + assertEquals(1, c_x.getter.call()) + assertEquals(1, c_xx.getter()) + assertEquals(1, c_xx.getter.call()) + assertEquals(2, c_y.getter()) + assertEquals(2, c_y.getter.call()) + assertEquals(2, c_yy.getter()) + assertEquals(2, c_yy.getter.call()) + + c_y.setter(10) + assertEquals(10, c_y.getter()) + assertEquals(10, c_yy.getter()) + + c_yy.setter(20) + assertEquals(20, c_y.getter()) + assertEquals(20, c_yy.getter()) + + c_y.setter.call(100) + assertEquals(100, c_yy.getter.call()) + + c_yy.setter.call(200) + assertEquals(200, c_y.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt new file mode 100644 index 0000000..8099c55 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -0,0 +1,17 @@ +package tests.call.cannotCallEnumConstructor + +import kotlin.reflect.jvm.isAccessible + +enum class E + +fun box(): String { + try { + val c = E::class.constructors.single() + c.isAccessible = true + c.call() + return "Fail: constructing an enum class should not be allowed" + } + catch (e: Throwable) { + return "OK" + } +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt new file mode 100644 index 0000000..600a11c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -0,0 +1,29 @@ + + +package tests.call.equalsHashCodeToString + +class A + +data class D(val s: String) + +fun box(): String { + val a = A() + assert(A::equals.call(a, a)) + assert(!A::equals.call(a, 0)) + assert(A::hashCode.call(a) == A::hashCode.call(a)) + assert(A::toString.call(a).startsWith("tests.call.equalsHashCodeToString.A@")) + + assert(D::equals.call(D("foo"), D("foo"))) + assert(!D::equals.call(D("foo"), D("bar"))) + assert(D::hashCode.call(D("foo")) == D::hashCode.call(D("foo"))) + assert(D::toString.call(D("foo")) == "D(s=foo)") + + assert(Int::equals.call(-1, -1)) + assert(Int::hashCode.call(0) != Int::hashCode.call(1)) + assert(Int::toString.call(42) == "42") + + assert(String::equals.call("beer", "beer")) + String::hashCode.call("beer") + + return String::toString.call("OK") +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt new file mode 100644 index 0000000..19cd930 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -0,0 +1,17 @@ +package tests.call.exceptionHappened + +import java.lang.reflect.InvocationTargetException + +fun fail(message: String) { + throw AssertionError(message) +} + +fun box(): String { + try { + ::fail.call("OK") + } catch (e: InvocationTargetException) { + return e.getTargetException().message.toString() + } + + return "Fail: no exception was thrown" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt new file mode 100644 index 0000000..92a9f80 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt @@ -0,0 +1,12 @@ +package tests.call.fakeOverride + +open class A { + fun foo() = "OK" +} + +class B : A() + +fun box(): String { + val foo = B::class.members.single { it.name == "foo" } + return foo.call(B()) as String +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt new file mode 100644 index 0000000..4230208 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt @@ -0,0 +1,12 @@ +package tests.call.fakeOverrideSubstituted + +open class A(val t: T) { + fun foo() = t +} + +class B(s: String) : A(s) + +fun box(): String { + val foo = B::class.members.single { it.name == "foo" } + return foo.call(B("OK")) as String +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt new file mode 100644 index 0000000..9dfc168 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -0,0 +1,105 @@ +package tests.call.incorrectNumberOfArguments + +import kotlin.reflect.jvm.isAccessible +import kotlin.reflect.KCallable +import kotlin.reflect.KFunction +import kotlin.reflect.KMutableProperty + +var foo: String = "" + +class A(private var bar: String = "") { + fun getBar() = A::bar +} + +object O { + @JvmStatic + private var baz: String = "" + + @JvmStatic + fun getBaz() = (O::class.members.single { it.name == "baz" } as KMutableProperty<*>).apply { isAccessible = true } + + fun getGetBaz() = O::class.members.single { it.name == "getBaz" } as KFunction<*> +} + +fun check(callable: KCallable<*>, vararg args: Any?) { + val expected = callable.parameters.size + val actual = args.size + + if (expected == actual) { + throw AssertionError("Bad test case: expected and actual number of arguments should differ (was $expected vs $actual)") + } + + val expectedExceptionMessage = "Callable expects $expected arguments, but $actual were provided." + + try { + callable.call(*args) + throw AssertionError("Fail: an IllegalArgumentException should have been thrown") + } catch (e: IllegalArgumentException) { + if (e.message != expectedExceptionMessage) { + // This most probably means that we don't check number of passed arguments in reflection + // and the default check from Java reflection yields an IllegalArgumentException, but with a not that helpful message + throw AssertionError("Fail: an exception with an unrecognized message was thrown: \"${e.message}\"" + + "\nExpected message was: $expectedExceptionMessage") + } + } +} + +fun box(): String { + check(::box, null) + check(::box, "") + + check(::A) + check(::A, null, "") + + check(O.getGetBaz()) + check(O.getGetBaz(), null, "") + + + val f = ::foo + check(f, null) + check(f, null, null) + check(f, arrayOf(null)) + check(f, "") + + check(f.getter, null) + check(f.getter, null, null) + check(f.getter, arrayOf(null)) + check(f.getter, "") + + check(f.setter) + check(f.setter, null, null) + check(f.setter, null, "") + + + val b = A().getBar() + + check(b) + check(b, null, null) + check(b, "", "") + + check(b.getter) + check(b.getter, null, null) + check(b.getter, "", "") + + check(b.setter) + check(b.setter, null) + check(b.setter, "") + + + val z = O.getBaz() + + check(z) + check(z, null, null) + check(z, "", "") + + check(z.getter) + check(z.getter, null, null) + check(z.getter, "", "") + + check(z.setter) + check(z.setter, null) + check(z.setter, "") + + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/constructorWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/constructorWithInlineClassParameters.kt new file mode 100644 index 0000000..786d29d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/constructorWithInlineClassParameters.kt @@ -0,0 +1,28 @@ +package tests.call.inlineClasses.constructorWithInlineClassParameters + +import kotlin.test.assertEquals + +inline class Z(val x: Int) + +class Outer(val z1: Z) { + inner class Inner(val z2: Z) { + val test = "$z1 $z2" + } +} + +inline class InlineOuter(val z1: Z) { + @Suppress("INNER_CLASS_INSIDE_INLINE_CLASS") + inner class Inner(val z2: Z) { + val test = "$z1 $z2" + } +} + +fun box(): String { + assertEquals(Z(1), ::Outer.call(Z(1)).z1) + assertEquals("Z(x=1) Z(x=2)", Outer::Inner.call(Outer(Z(1)), Z(2)).test) + assertEquals("Z(x=1) Z(x=3)", Outer(Z(1))::Inner.call(Z(3)).test) + assertEquals("Z(x=1) Z(x=2)", InlineOuter::Inner.call(InlineOuter(Z(1)), Z(2)).test) + assertEquals("Z(x=1) Z(x=3)", InlineOuter(Z(1))::Inner.call(Z(3)).test) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/fieldAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/fieldAccessors.kt new file mode 100644 index 0000000..70b744a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/fieldAccessors.kt @@ -0,0 +1,36 @@ +package tests.call.inlineClasses.fieldAccessors + +import kotlin.reflect.KCallable +import kotlin.reflect.jvm.isAccessible +import kotlin.test.assertEquals + +inline class S(val value: String) { + operator fun plus(other: S): S = S(this.value + other.value) +} + +class C { + private var member: S = S("") + + fun unboundRef() = C::member.apply { isAccessible = true } + fun boundRef() = this::member.apply { isAccessible = true } +} + +private var topLevel: S = S("") + +fun box(): String { + val c = C() + assertEquals(Unit, c.unboundRef().setter.call(c, S("ab"))) + assertEquals(S("ab"), c.unboundRef().call(c)) + assertEquals(S("ab"), c.unboundRef().getter.call(c)) + + assertEquals(Unit, c.boundRef().setter.call(S("cd"))) + assertEquals(S("cd"), c.boundRef().call()) + assertEquals(S("cd"), c.boundRef().getter.call()) + + val topLevel = ::topLevel.apply { isAccessible = true } + assertEquals(Unit, topLevel.setter.call(S("ef"))) + assertEquals(S("ef"), topLevel.call()) + assertEquals(S("ef"), topLevel.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/functionsWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/functionsWithInlineClassParameters.kt new file mode 100644 index 0000000..216c2d3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/functionsWithInlineClassParameters.kt @@ -0,0 +1,30 @@ +package tests.call.inlineClasses.functionsWithInlineClassParameters + +import kotlin.test.assertEquals + +inline class S(val value: String) { + operator fun plus(other: S): S = S(this.value + other.value) +} + +class C { + fun member(x: S, y: String): S = x + S(y) +} + +fun topLevel(x: String, y: S): S = S(x) + y + +fun S.extension(y: S): S = this + y + +fun S.extension2(): String = value + +fun box(): String { + assertEquals(S("ab"), C::member.call(C(), S("a"), "b")) + assertEquals(S("cd"), ::topLevel.call("c", S("d"))) + assertEquals(S("gh"), S::extension.call(S("g"), S("h"))) + assertEquals("_", S::extension2.call(S("_"))) + + assertEquals(S("ij"), C()::member.call(S("i"), "j")) + assertEquals(S("mn"), S("m")::extension.call(S("n"))) + assertEquals("_", S("_")::extension2.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/inlineClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/inlineClassConstructor.kt new file mode 100644 index 0000000..677c52f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/inlineClassConstructor.kt @@ -0,0 +1,46 @@ +package tests.call.inlineClasses.inlineClassConstructor + +import kotlin.reflect.KCallable +import kotlin.test.assertEquals + +inline class Z(val x: Int) { + constructor(a: Int, b: Int) : this(a + b) +} + +inline class L(val x: Long) { + constructor(a: Long, b: Long) : this(a + b) +} + +inline class S(val x: String) { + constructor(a: String, b: String) : this(a + b) +} + +inline class A(val x: Any) { + constructor(a: String, b: String) : this(a + b) +} + +inline class Z2(val z: Z) + +fun box(): String { + val ctorZ1: (Int) -> Z = ::Z + val ctorZ2: (Int, Int) -> Z = ::Z + val ctorL1: (Long) -> L = ::L + val ctorL2: (Long, Long) -> L = ::L + val ctorS1: (String) -> S = ::S + val ctorS2: (String, String) -> S = ::S + val ctorA1: (Any) -> A = ::A + val ctorA2: (String, String) -> A = ::A + + assertEquals(Z(42), (ctorZ1 as KCallable).call(42)) + assertEquals(Z(123), (ctorZ2 as KCallable).call(100, 23)) + assertEquals(L(1L), (ctorL1 as KCallable).call(1L)) + assertEquals(L(123L), (ctorL2 as KCallable).call(100L, 23L)) + assertEquals(S("abc"), (ctorS1 as KCallable).call("abc")) + assertEquals(S("abc"), (ctorS2 as KCallable).call("ab", "c")) + assertEquals(A("abc"), (ctorA1 as KCallable).call("abc")) + assertEquals(A("abc"), (ctorA2 as KCallable).call("a", "bc")) + + assertEquals(Z2(Z(42)), ::Z2.call(Z(42))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/internalPrimaryValOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/internalPrimaryValOfInlineClass.kt new file mode 100644 index 0000000..0854d31 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/internalPrimaryValOfInlineClass.kt @@ -0,0 +1,38 @@ +package tests.call.inlineClasses.internalPrimaryValOfInlineClass + +import kotlin.test.assertEquals + +inline class Z(internal val x: Int) +inline class Z2(internal val x: Z) + +inline class L(internal val x: Long) +inline class L2(internal val x: L) + +inline class A(internal val x: Any?) +inline class A2(internal val x: A) + +fun box(): String { + assertEquals(42, Z::x.call(Z(42))) + assertEquals(42, Z(42)::x.call()) + + assertEquals(1234L, L::x.call(L(1234L))) + assertEquals(1234L, L(1234L)::x.call()) + + assertEquals("abc", A::x.call(A("abc"))) + assertEquals("abc", A("abc")::x.call()) + assertEquals(null, A::x.call(A(null))) + assertEquals(null, A(null)::x.call()) + + assertEquals(Z(42), Z2::x.call(Z2(Z(42)))) + assertEquals(Z(42), Z2(Z(42))::x.call()) + + assertEquals(L(1234L), L2::x.call(L2(L(1234L)))) + assertEquals(L(1234L), L2(L(1234L))::x.call()) + + assertEquals(A("abc"), A2::x.call(A2(A("abc")))) + assertEquals(A("abc"), A2(A("abc"))::x.call()) + assertEquals(A(null), A2::x.call(A2(A(null)))) + assertEquals(A(null), A2(A(null))::x.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFieldInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFieldInObject.kt new file mode 100644 index 0000000..18c4a98 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFieldInObject.kt @@ -0,0 +1,33 @@ +package tests.call.inlineClasses.jvmStaticFieldInObject + +// JVM_TARGET: 1.8 + +import kotlin.reflect.KMutableProperty1 +import kotlin.reflect.jvm.isAccessible +import kotlin.test.assertEquals + +inline class S(val value: String) { + operator fun plus(other: S): S = S(this.value + other.value) +} + +object C { + @JvmStatic + private var p: S = S("") + + fun boundRef() = this::p.apply { isAccessible = true } +} + +fun box(): String { + val unboundRef = C::class.members.single { it.name == "p" } as KMutableProperty1 + unboundRef.isAccessible = true + assertEquals(Unit, unboundRef.setter.call(C, S("ab"))) + assertEquals(S("ab"), unboundRef.call(C)) + assertEquals(S("ab"), unboundRef.getter.call(C)) + + val boundRef = C.boundRef() + assertEquals(Unit, boundRef.setter.call(S("cd"))) + assertEquals(S("cd"), boundRef.call()) + assertEquals(S("cd"), boundRef.getter.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFunction.kt new file mode 100644 index 0000000..d64c902 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFunction.kt @@ -0,0 +1,35 @@ +package tests.call.inlineClasses.jvmStaticFunction + +// JVM_TARGET: 1.8 + +import kotlin.reflect.KFunction +import kotlin.test.assertEquals + +inline class S(val value: String) { + operator fun plus(other: S): S = S(this.value + other.value) +} + +object C { + @JvmStatic + fun foo(x: S, y: String): S = x + S(y) +} + +interface I { + companion object { + @JvmStatic + fun bar(x: String, y: S): S = S(x) + y + } +} + +fun box(): String { + assertEquals(S("ab"), C::foo.call(S("a"), "b")) + assertEquals(S("cd"), (I)::bar.call("c", S("d"))) + + val unboundFoo = C::class.members.single { it.name == "foo" } as KFunction<*> + assertEquals(S("ef"), unboundFoo.call(C, S("e"), "f")) + + val unboundBar = I.Companion::class.members.single { it.name == "bar" } as KFunction<*> + assertEquals(S("gh"), unboundBar.call(I, "g", S("h"))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingFunOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingFunOfInlineClass.kt new file mode 100644 index 0000000..30e856e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingFunOfInlineClass.kt @@ -0,0 +1,35 @@ +package tests.call.inlineClasses.nonOverridingFunOfInlineClass + +import kotlin.test.assertEquals + +inline class Z(val x: Int) { + fun test(a: String, b: S) = "$x$a${b.x}" +} + +inline class L(val x: Long) { + fun test(a: String, b: S) = "$x$a${b.x}" +} + +inline class S(val x: String) { + fun test(a: String, b: S) = "$x$a${b.x}" +} + +inline class A(val x: Any) { + fun test(a: String, b: S) = "$x$a${b.x}" +} + +fun box(): String { + assertEquals("42-+", Z::test.call(Z(42), "-", S("+"))) + assertEquals("42-+", Z(42)::test.call("-", S("+"))) + + assertEquals("42-+", L::test.call(L(42L), "-", S("+"))) + assertEquals("42-+", L(42L)::test.call("-", S("+"))) + + assertEquals("42-+", S::test.call(S("42"), "-", S("+"))) + assertEquals("42-+", S("42")::test.call("-", S("+"))) + + assertEquals("42-+", A::test.call(A("42"), "-", S("+"))) + assertEquals("42-+", A("42")::test.call("-", S("+"))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingVarOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingVarOfInlineClass.kt new file mode 100644 index 0000000..52a59b4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingVarOfInlineClass.kt @@ -0,0 +1,81 @@ +package tests.call.inlineClasses.nonOverridingVarOfInlineClass + +import kotlin.test.assertEquals + +var global = S("") + +inline class Z(val x: Int) { + var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +inline class L(val x: Long) { + var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +inline class S(val x: String) { + var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +inline class A(val x: Any) { + var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +fun box(): String { + global = S("") + assertEquals(S("42"), Z::test.call(Z(42))) + assertEquals(S("42"), Z(42)::test.call()) + assertEquals(S("42"), Z::test.getter.call(Z(42))) + assertEquals(S("42"), Z(42)::test.getter.call()) + Z::test.setter.call(Z(42), S("Z-")) + assertEquals(S("Z-42"), global) + Z(42)::test.setter.call(S("Z+")) + assertEquals(S("Z+42"), global) + + global = S("") + assertEquals(S("42"), L::test.call(L(42L))) + assertEquals(S("42"), L(42L)::test.call()) + assertEquals(S("42"), L::test.getter.call(L(42L))) + assertEquals(S("42"), L(42L)::test.getter.call()) + L::test.setter.call(L(42L), S("L-")) + assertEquals(S("L-42"), global) + L(42L)::test.setter.call(S("L+")) + assertEquals(S("L+42"), global) + + global = S("") + assertEquals(S("42"), S::test.call(S("42"))) + assertEquals(S("42"), S("42")::test.call()) + assertEquals(S("42"), S::test.getter.call(S("42"))) + assertEquals(S("42"), S("42")::test.getter.call()) + S::test.setter.call(S("42"), S("S-")) + assertEquals(S("S-42"), global) + S("42")::test.setter.call(S("S+")) + assertEquals(S("S+42"), global) + + global = S("") + assertEquals(S("42"), A::test.call(A(42))) + assertEquals(S("42"), A(42)::test.call()) + assertEquals(S("42"), A::test.getter.call(A(42))) + assertEquals(S("42"), A(42)::test.getter.call()) + A::test.setter.call(A(42), S("A-")) + assertEquals(S("A-42"), global) + A(42)::test.setter.call(S("A+")) + assertEquals(S("A+42"), global) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingFunOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingFunOfInlineClass.kt new file mode 100644 index 0000000..954ec46 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingFunOfInlineClass.kt @@ -0,0 +1,39 @@ +package tests.call.inlineClasses.overridingFunOfInlineClass + +import kotlin.test.assertEquals + +interface ITest { + fun test(a: String, b: S): String +} + +inline class Z(val x: Int) : ITest { + override fun test(a: String, b: S) = "$x$a${b.x}" +} + +inline class L(val x: Long) : ITest { + override fun test(a: String, b: S) = "$x$a${b.x}" +} + +inline class S(val x: String) : ITest { + override fun test(a: String, b: S) = "$x$a${b.x}" +} + +inline class A(val x: Any) : ITest { + override fun test(a: String, b: S) = "$x$a${b.x}" +} + +fun box(): String { + assertEquals("42-+", Z::test.call(Z(42), "-", S("+"))) + assertEquals("42-+", Z(42)::test.call("-", S("+"))) + + assertEquals("42-+", L::test.call(L(42L), "-", S("+"))) + assertEquals("42-+", L(42L)::test.call("-", S("+"))) + + assertEquals("42-+", S::test.call(S("42"), "-", S("+"))) + assertEquals("42-+", S("42")::test.call("-", S("+"))) + + assertEquals("42-+", A::test.call(A("42"), "-", S("+"))) + assertEquals("42-+", A("42")::test.call("-", S("+"))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingVarOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingVarOfInlineClass.kt new file mode 100644 index 0000000..6540f43 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingVarOfInlineClass.kt @@ -0,0 +1,85 @@ +package tests.call.inlineClasses.overridingVarOfInlineClass + +import kotlin.test.assertEquals + +var global = S("") + +interface ITest { + var test: S +} + +inline class Z(val x: Int) : ITest { + override var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +inline class L(val x: Long) : ITest { + override var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +inline class S(val x: String) : ITest { + override var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +inline class A(val x: Any) : ITest { + override var test: S + get() = S("${global.x}$x") + set(value) { + global = S("${value.x}$x") + } +} + +fun box(): String { + global = S("") + assertEquals(S("42"), Z::test.call(Z(42))) + assertEquals(S("42"), Z(42)::test.call()) + assertEquals(S("42"), Z::test.getter.call(Z(42))) + assertEquals(S("42"), Z(42)::test.getter.call()) + Z::test.setter.call(Z(42), S("Z-")) + assertEquals(S("Z-42"), global) + Z(42)::test.setter.call(S("Z+")) + assertEquals(S("Z+42"), global) + + global = S("") + assertEquals(S("42"), L::test.call(L(42L))) + assertEquals(S("42"), L(42L)::test.call()) + assertEquals(S("42"), L::test.getter.call(L(42L))) + assertEquals(S("42"), L(42L)::test.getter.call()) + L::test.setter.call(L(42L), S("L-")) + assertEquals(S("L-42"), global) + L(42L)::test.setter.call(S("L+")) + assertEquals(S("L+42"), global) + + global = S("") + assertEquals(S("42"), S::test.call(S("42"))) + assertEquals(S("42"), S("42")::test.call()) + assertEquals(S("42"), S::test.getter.call(S("42"))) + assertEquals(S("42"), S("42")::test.getter.call()) + S::test.setter.call(S("42"), S("S-")) + assertEquals(S("S-42"), global) + S("42")::test.setter.call(S("S+")) + assertEquals(S("S+42"), global) + + global = S("") + assertEquals(S("42"), A::test.call(A(42))) + assertEquals(S("42"), A(42)::test.call()) + assertEquals(S("42"), A::test.getter.call(A(42))) + assertEquals(S("42"), A(42)::test.getter.call()) + A::test.setter.call(A(42), S("A-")) + assertEquals(S("A-42"), global) + A(42)::test.setter.call(S("A+")) + assertEquals(S("A+42"), global) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/primaryValOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/primaryValOfInlineClass.kt new file mode 100644 index 0000000..a696cc5 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/primaryValOfInlineClass.kt @@ -0,0 +1,38 @@ +package tests.call.inlineClasses.primaryValOfInlineClass + +import kotlin.test.assertEquals + +inline class Z(val x: Int) +inline class Z2(val x: Z) + +inline class L(val x: Long) +inline class L2(val x: L) + +inline class A(val x: Any?) +inline class A2(val x: A) + +fun box(): String { + assertEquals(42, Z::x.call(Z(42))) + assertEquals(42, Z(42)::x.call()) + + assertEquals(1234L, L::x.call(L(1234L))) + assertEquals(1234L, L(1234L)::x.call()) + + assertEquals("abc", A::x.call(A("abc"))) + assertEquals("abc", A("abc")::x.call()) + assertEquals(null, A::x.call(A(null))) + assertEquals(null, A(null)::x.call()) + + assertEquals(Z(42), Z2::x.call(Z2(Z(42)))) + assertEquals(Z(42), Z2(Z(42))::x.call()) + + assertEquals(L(1234L), L2::x.call(L2(L(1234L)))) + assertEquals(L(1234L), L2(L(1234L))::x.call()) + + assertEquals(A("abc"), A2::x.call(A2(A("abc")))) + assertEquals(A("abc"), A2(A("abc"))::x.call()) + assertEquals(A(null), A2::x.call(A2(A(null)))) + assertEquals(A(null), A2(A(null))::x.call()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/properties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/properties.kt new file mode 100644 index 0000000..370497e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/properties.kt @@ -0,0 +1,50 @@ +package tests.call.inlineClasses.properties + +import kotlin.reflect.KMutableProperty2 +import kotlin.test.assertEquals + +inline class S(val value: String) { + operator fun plus(other: S): S = S(this.value + other.value) +} + +class C { + var member: S = S("") + + private var suffix = S("") + var S.memExt: S + get() = this + suffix + set(value) { suffix = this + value } +} + +var topLevel: S = S("") + +private var suffix = S("") +var S.ext: S + get() = this + suffix + set(value) { suffix = this + value } + +fun box(): String { + val c = C() + assertEquals(Unit, C::member.setter.call(c, S("ab"))) + assertEquals(S("ab"), C::member.call(c)) + assertEquals(S("ab"), C::member.getter.call(c)) + + assertEquals(Unit, c::member.setter.call(S("cd"))) + assertEquals(S("cd"), c::member.call()) + assertEquals(S("cd"), c::member.getter.call()) + + val memExt = C::class.members.single { it.name == "memExt" } as KMutableProperty2 + assertEquals(Unit, memExt.setter.call(c, S(""), S("f"))) + assertEquals(S("ef"), memExt.call(c, S("e"))) + assertEquals(S("ef"), memExt.getter.call(c, S("e"))) + + assertEquals(Unit, ::topLevel.setter.call(S("gh"))) + assertEquals(S("gh"), ::topLevel.call()) + assertEquals(S("gh"), ::topLevel.getter.call()) + + assertEquals(Unit, S::ext.setter.call(S(""), S("j"))) + assertEquals(S("ij"), S::ext.call(S("i"))) + assertEquals(S("ij"), S::ext.getter.call(S("i"))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt new file mode 100644 index 0000000..4b4ab0f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt @@ -0,0 +1,10 @@ +package tests.call.innerClassConstructor + +class A { + class Nested(val result: String) + inner class Inner(val result: String) +} + +fun box(): String { + return (A::Nested).call("O").result + (A::Inner).call((::A).call(), "K").result +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt new file mode 100644 index 0000000..76113ae --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt @@ -0,0 +1,19 @@ +package tests.call.jvmStatic + +object Obj { + @JvmStatic + fun foo() {} +} + +class C { + companion object { + @JvmStatic + fun bar() {} + } +} + +fun box(): String { + (Obj::class.members.single { it.name == "foo" }).call(Obj) + (C.Companion::class.members.single { it.name == "bar" }).call(C.Companion) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt new file mode 100644 index 0000000..e9bbdf3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt @@ -0,0 +1,44 @@ +package tests.call.jvmStaticInObjectIncorrectReceiver + +object Obj { + @JvmStatic + fun foo(s: String) {} + + @JvmStatic + fun bar() {} + + @JvmStatic + fun sly(obj: Obj) {} + + operator fun get(name: String) = Obj::class.members.single { it.name == name } +} + +fun box(): String { + // This should succeed + (Obj["foo"]).call(Obj, "") + (Obj["bar"]).call(Obj) + (Obj["sly"]).call(Obj, Obj) + + // This shouldn't: first argument should always be Obj + try { + (Obj["foo"]).call(null, "") + return "Fail foo" + } catch (e: IllegalArgumentException) {} + + try { + (Obj["bar"]).call("") + return "Fail bar" + } catch (e: IllegalArgumentException) {} + + try { + (Obj["sly"]).call(Obj) + return "Fail sly 1" + } catch (e: IllegalArgumentException) {} + + try { + (Obj["sly"]).call(null, Obj) + return "Fail sly 2" + } catch (e: IllegalArgumentException) {} + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt new file mode 100644 index 0000000..a73e10d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt @@ -0,0 +1,9 @@ +package tests.call.localClassMember + +fun box(): String { + class Local { + fun result(s: String) = s + } + + return Local::result.call(Local(), "OK") +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt new file mode 100644 index 0000000..6c9d3cd --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt @@ -0,0 +1,14 @@ +package tests.call.memberOfGenericClass + +var result = "Fail" + +class A { + fun foo(t: T) { + result = t as String + } +} + +fun box(): String { + (A::foo).call(A(), "OK") + return result +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt new file mode 100644 index 0000000..de6e02e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt @@ -0,0 +1,9 @@ +package tests.call.propertyGetterAndGetFunctionDifferentReturnType + +data class Foo(val id: String) { + fun getId() = -42 // Fail +} + +fun box(): String { + return Foo::id.call(Foo("OK")) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt new file mode 100644 index 0000000..8e94aac --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -0,0 +1,34 @@ +package tests.call.protectedMembers + +import kotlin.reflect.* +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +abstract class Base { + protected val protectedVal: String + get() = "1" + + var publicVarProtectedSet: String = "" + protected set + + protected fun protectedFun(): String = "3" +} + +class Derived : Base() + +fun member(name: String): KCallable<*> = Derived::class.members.single { it.name == name }.apply { isAccessible = true } + +fun box(): String { + val a = Derived() + + assertEquals("1", member("protectedVal").call(a)) + + val publicVarProtectedSet = member("publicVarProtectedSet") as KMutableProperty1 + publicVarProtectedSet.setter.call(a, "2") + assertEquals("2", publicVarProtectedSet.getter.call(a)) + assertEquals("2", publicVarProtectedSet.call(a)) + + assertEquals("3", member("protectedFun").call(a)) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt new file mode 100644 index 0000000..aa26b9a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt @@ -0,0 +1,26 @@ +package tests.call.returnUnit + +import kotlin.test.assertEquals + +fun foo() {} + +class A { + fun bar() {} +} + +object O { + @JvmStatic fun baz() {} +} + +fun nullableUnit(unit: Boolean): Unit? = if (unit) Unit else null + +fun box(): String { + assertEquals(Unit, ::foo.call()) + assertEquals(Unit, A::bar.call(A())) + assertEquals(Unit, O::class.members.single { it.name == "baz" }.call(O)) + + assertEquals(Unit, (::nullableUnit).call(true)) + assertEquals(null, (::nullableUnit).call(false)) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt new file mode 100644 index 0000000..b015ae6 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt @@ -0,0 +1,8 @@ +package tests.call.simpleConstructor + +class A(val result: String) + +fun box(): String { + val a = (::A).call("OK") + return a.result +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt new file mode 100644 index 0000000..19bef5b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt @@ -0,0 +1,18 @@ +package tests.call.simpleMemberFunction + +class A { + fun foo(x: Int, y: Int) = x + y +} + +fun box(): String { + val x = (A::foo).call(A(), 42, 239) + if (x != 281) return "Fail: $x" + + try { + (A::foo).call() + return "Fail: no exception" + } + catch (e: Exception) {} + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt new file mode 100644 index 0000000..0028055 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt @@ -0,0 +1,29 @@ +package tests.call.simpleTopLevelFunctions + +fun String.foo(): Int = length + +var state = "Fail" + +fun bar(result: String) { + state = result +} + +fun box(): String { + val f = (String::foo).call("abc") + if (f != 3) return "Fail: $f" + + try { + (String::foo).call() + return "Fail: IllegalArgumentException should have been thrown" + } + catch (e: IllegalArgumentException) {} + + try { + (String::foo).call(42) + return "Fail: IllegalArgumentException should have been thrown" + } + catch (e: IllegalArgumentException) {} + + (::bar).call("OK") + return state +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunction.kt new file mode 100644 index 0000000..7904472 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunction.kt @@ -0,0 +1,10 @@ +package tests.callBy.boundExtensionFunction + +import kotlin.test.assertEquals + +fun String.extFun(k: String, s: String = "") = this + k + s + +fun box(): String { + val sExtFun = "O"::extFun + return sExtFun.callBy(mapOf(sExtFun.parameters[0] to "K")) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessor.kt new file mode 100644 index 0000000..1a46929 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessor.kt @@ -0,0 +1,9 @@ +package tests.callBy.boundExtensionPropertyAcessor + +import kotlin.test.assertEquals + +val String.plusK: String + get() = this + "K" + +fun box(): String = + ("O"::plusK).getter.callBy(mapOf()) \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt new file mode 100644 index 0000000..5ffd978 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt @@ -0,0 +1,16 @@ +package tests.callBy.boundJvmStaticInObject + +object Host { + @JvmStatic fun concat(s1: String, s2: String, s3: String = "K", s4: String = "x") = + s1 + s2 + s3 + s4 +} + +fun box(): String { + val concat = Host::concat + val concatParams = concat.parameters + return concat.callBy(mapOf( + concatParams[0] to "", + concatParams[1] to "O", + concatParams[3] to "" + )) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt new file mode 100644 index 0000000..f5f08e0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt @@ -0,0 +1,31 @@ +package tests.callBy.companionObject + +import kotlin.test.assertEquals + +class C { + companion object { + fun foo(a: String, b: String = "b") = a + b + } +} + +fun box(): String { + val f = C.Companion::class.members.single { it.name == "foo" } + + // Any object method currently requires the object instance passed + try { + f.callBy(mapOf( + f.parameters.single { it.name == "a" } to "a" + )) + return "Fail: IllegalArgumentException should have been thrown" + } + catch (e: IllegalArgumentException) { + // OK + } + + assertEquals("ab", f.callBy(mapOf( + f.parameters.first() to C, + f.parameters.single { it.name == "a" } to "a" + ))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt new file mode 100644 index 0000000..9e72870 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt @@ -0,0 +1,17 @@ +package tests.callBy.defaultAndNonDefaultIntertwined + +import kotlin.test.assertEquals + +fun foo(a: String, b: String = "b", c: String, d: String = "d", e: String) = + a + b + c + d + e + +fun box(): String { + val p = ::foo.parameters + assertEquals("abcde", ::foo.callBy(mapOf( + p[0] to "a", + p[2] to "c", + p[4] to "e" + ))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClass.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClass.kt new file mode 100644 index 0000000..f3ac6e3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClass.kt @@ -0,0 +1,20 @@ +package tests.callBy.defaultInSuperClass + +open class A { + open fun foo(a: String, b: String = "b") = b + a +} + +class B : A() { + override fun foo(a: String, b: String) = a + b +} + +fun box(): String { + val f = B::foo + + assert("ab" == f.callBy(mapOf( + f.parameters.first() to B(), + f.parameters.single { it.name == "a" } to "a" + ))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperInterface.kt new file mode 100644 index 0000000..7cc2aaa --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperInterface.kt @@ -0,0 +1,28 @@ +package tests.callBy.defaultInSuperInterface + +interface A1 { + fun test(o: String, k: String): String +} +interface A2 : A1 + +interface B1 { + fun test(o: String = "O", k: String = "K"): String +} +interface B2 : B1 + +interface C1 +interface C2 : C1 + +interface D +interface E : A2, B2, C2 { + override fun test(o: String, k: String): String { + return o + k + } +} + +class Z : D, E + +fun box(): String { + val f = Z::test + return f.callBy(mapOf(f.parameters.first() to Z())) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/emptyVarArg.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/emptyVarArg.kt new file mode 100644 index 0000000..e8914f8 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/emptyVarArg.kt @@ -0,0 +1,15 @@ +package tests.callBy.emptyVarArg + +import kotlin.test.assertEquals + +fun join(vararg strings: String) = strings.toList().joinToString("") + +fun sum(vararg bytes: Byte) = bytes.toList().fold(0) { acc, el -> acc + el } + +fun box(): String { + val j = ::join + val s = ::sum + assertEquals("", j.callBy(emptyMap())) + assertEquals(0, s.callBy(emptyMap())) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt new file mode 100644 index 0000000..fdeb59d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt @@ -0,0 +1,11 @@ +package tests.callBy.extensionFunction + +import kotlin.test.assertEquals + +fun String.sum(other: String = "b") = this + other + +fun box(): String { + val f = String::sum + assertEquals("ab", f.callBy(mapOf(f.parameters.first() to "a"))) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassDefaultArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassDefaultArguments.kt new file mode 100644 index 0000000..a7f71ac --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassDefaultArguments.kt @@ -0,0 +1,9 @@ +package tests.callBy.inlineClassDefaultArguments + +inline class A(val x: Int) + +fun test(x: A = A(0)) = "OK" + +fun box(): String { + return (::test).callBy(mapOf()) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassFunctionsAndConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassFunctionsAndConstructors.kt new file mode 100644 index 0000000..3eb2018 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassFunctionsAndConstructors.kt @@ -0,0 +1,44 @@ +package tests.callBy.inlineClassFunctionsAndConstructors + +import kotlin.test.assertEquals + +inline class S(val value: String) { + operator fun plus(other: S): S = S(this.value + other.value) +} + +class C { + fun member(a: S, b: S = S("b")): S = a + b +} + +fun topLevel(c: S, d: S = S("d")): S = c + d + +/* TODO: support constructors with inline class types in the signature (KT-26765) +class D(e: S, f: S = S("f")) { + val result = e + f +} +*/ + +fun S.extension(h: S = S("h")): S = this + h + +fun box(): String { + assertEquals(S("ab"), C().member(S("a"))) + assertEquals(S("ab"), C::member.callBy(C::member.parameters.filter { it.name != "b" }.associate { + it to (if (it.name == "a") S("a") else C()) + })) + + assertEquals(S("cd"), topLevel(S("c"))) + assertEquals(S("cd"), ::topLevel.callBy(::topLevel.parameters.filter { it.name != "d" }.associate { it to S("c") })) + + // assertEquals(S("ef"), ::D.callBy(::D.parameters.filter { it.name != "f" }.associate { it to S("e") }).result) + + assertEquals(S("gh"), S("g").extension()) + assertEquals(S("gh"), S::extension.callBy(S::extension.parameters.filter { it.name != "h" }.associate { it to S("g") })) + + val boundMember = C()::member + assertEquals(S("ab"), boundMember.callBy(boundMember.parameters.associate { it to S(it.name!!) })) + + val boundExtension = S("g")::extension + assertEquals(S("gh"), boundExtension.callBy(boundExtension.parameters.associate { it to S(it.name!!) })) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassMembers.kt new file mode 100644 index 0000000..ad91ea4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassMembers.kt @@ -0,0 +1,75 @@ +package tests.callBy.inlineClassMembers + +import kotlin.test.assertEquals + +interface IFoo { + fun fooFun(z: Z): Z + var fooVar: Z +} + +var global = Z(0) + + +inline class Z(val x: Int) : IFoo { + + override fun fooFun(z: Z): Z = Z(z.x + x) + + override var fooVar: Z + get() = Z(global.x + x) + set(value) { + global = Z(value.x + x) + } + + fun barFun(z: Z): Z = Z(z.x * 100 + x) + + var barVar: Z + get() = Z(global.x * 100 + x) + set(value) { + global = Z(value.x * 100 + x) + } +} + + +fun box(): String { + val fooFunR = Z::fooFun + assertEquals(Z(53), fooFunR.callBy(mapOf(fooFunR.parameters[0] to Z(42), fooFunR.parameters[1] to Z(11)))) + + val fooFunBR = Z(42)::fooFun + assertEquals(Z(142), fooFunBR.callBy(mapOf(fooFunBR.parameters[0] to Z(100)))) + + global = Z(0) + val fooVarR = Z::fooVar + assertEquals(Z(42), fooVarR.callBy(mapOf(fooVarR.parameters[0] to Z(42)))) + assertEquals(Z(42), fooVarR.getter.callBy(mapOf(fooVarR.getter.parameters[0] to Z(42)))) + fooVarR.setter.callBy(mapOf(fooVarR.setter.parameters[0] to Z(42), fooVarR.setter.parameters[1] to Z(1))) + assertEquals(Z(43), global) + + global = Z(100) + val fooVarBR = Z(42)::fooVar + assertEquals(Z(142), fooVarBR.callBy(mapOf())) + assertEquals(Z(142), fooVarBR.getter.callBy(mapOf())) + fooVarBR.setter.callBy(mapOf(fooVarBR.setter.parameters[0] to Z(1))) + assertEquals(Z(43), global) + + val barFunR = Z::barFun + assertEquals(Z(1142), barFunR.callBy(mapOf(barFunR.parameters[0] to Z(42), barFunR.parameters[1] to Z(11)))) + + val barFunBR = Z(42)::barFun + assertEquals(Z(2242), barFunBR.callBy(mapOf(barFunBR.parameters[0] to Z(22)))) + + global = Z(1) + val barVarR = Z::barVar + assertEquals(Z(142), barVarR.callBy(mapOf(barVarR.parameters[0] to Z(42)))) + assertEquals(Z(142), barVarR.getter.callBy(mapOf(barVarR.getter.parameters[0] to Z(42)))) + barVarR.setter.callBy(mapOf(barVarR.setter.parameters[0] to Z(42), barVarR.setter.parameters[1] to Z(3))) + assertEquals(Z(342), global) + + global = Z(2) + val barVarBR = Z(42)::barVar + assertEquals(Z(242), barVarBR.callBy(mapOf())) + assertEquals(Z(242), barVarBR.getter.callBy(mapOf())) + barVarBR.setter.callBy(mapOf(barVarBR.setter.parameters[0] to Z(4))) + assertEquals(Z(442), global) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt new file mode 100644 index 0000000..1af744b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt @@ -0,0 +1,34 @@ +package tests.callBy.jvmStaticInCompanionObject + +// KT-12915 IAE on callBy of JvmStatic function with default arguments + +import kotlin.test.assertEquals + +class C { + companion object { + @JvmStatic + fun foo(a: String, b: String = "b") = a + b + } +} + +fun box(): String { + val f = C.Companion::class.members.single { it.name == "foo" } + + // Any object method currently requires the object instance passed + try { + f.callBy(mapOf( + f.parameters.single { it.name == "a" } to "a" + )) + return "Fail: IllegalArgumentException should have been thrown" + } + catch (e: IllegalArgumentException) { + // OK + } + + assertEquals("ab", f.callBy(mapOf( + f.parameters.first() to C, + f.parameters.single { it.name == "a" } to "a" + ))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt new file mode 100644 index 0000000..18380e9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt @@ -0,0 +1,30 @@ +package tests.callBy.jvmStaticInObject + +import kotlin.test.assertEquals + +object Obj { + @JvmStatic + fun foo(a: String, b: String = "b") = a + b +} + +fun box(): String { + val f = Obj::class.members.single { it.name == "foo" } + + // Any object method currently requires the object instance passed + try { + f.callBy(mapOf( + f.parameters.single { it.name == "a" } to "a" + )) + return "Fail: IllegalArgumentException should have been thrown" + } + catch (e: IllegalArgumentException) { + // OK + } + + assertEquals("ab", f.callBy(mapOf( + f.parameters.first() to Obj, + f.parameters.single { it.name == "a" } to "a" + ))) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt new file mode 100644 index 0000000..56338eb --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt @@ -0,0 +1,98 @@ +package tests.callBy.manyArgumentsNoneDefaultConstructor + +import kotlin.test.assertEquals + +// Generate: +// (1..70).map { " p${"%02d".format(it)}: Int," }.joinToString("\n") + +class A( + p01: Int, + p02: Int, + p03: Int, + p04: Int, + p05: Int, + p06: Int, + p07: Int, + p08: Int, + p09: Int, + p10: Int, + p11: Int, + p12: Int, + p13: Int, + p14: Int, + p15: Int, + p16: Int, + p17: Int, + p18: Int, + p19: Int, + p20: Int, + p21: Int, + p22: Int, + p23: Int, + p24: Int, + p25: Int, + p26: Int, + p27: Int, + p28: Int, + p29: Int, + p30: Int, + p31: Int, + p32: Int, + p33: Int, + p34: Int, + p35: Int, + p36: Int, + p37: Int, + p38: Int, + p39: Int, + p40: Int, + p41: Int, + p42: Int, + p43: Int, + p44: Int, + p45: Int, + p46: Int, + p47: Int, + p48: Int, + p49: Int, + p50: Int, + p51: Int, + p52: Int, + p53: Int, + p54: Int, + p55: Int, + p56: Int, + p57: Int, + p58: Int, + p59: Int, + p60: Int, + p61: Int, + p62: Int, + p63: Int, + p64: Int, + p65: Int, + p66: Int, + p67: Int, + p68: Int, + p69: Int, + p70: Int +) { + init { + assertEquals(1, p01) + assertEquals(41, p41) + assertEquals(42, p42) + assertEquals(43, p43) + assertEquals(70, p70) + } +} + +fun box(): String { + val f = A::class.constructors.single() + val parameters = f.parameters + + f.callBy(mapOf( + *((1..70)).map { i -> parameters[i - 1] to i }.toTypedArray() + )) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt new file mode 100644 index 0000000..8253f82 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt @@ -0,0 +1,99 @@ +package tests.callBy.manyArgumentsNoneDefaultFunction + +import kotlin.test.assertEquals + +// Generate: +// (1..70).map { " p${"%02d".format(it)}: Int," }.joinToString("\n") + +class A { + fun foo( + p01: Int, + p02: Int, + p03: Int, + p04: Int, + p05: Int, + p06: Int, + p07: Int, + p08: Int, + p09: Int, + p10: Int, + p11: Int, + p12: Int, + p13: Int, + p14: Int, + p15: Int, + p16: Int, + p17: Int, + p18: Int, + p19: Int, + p20: Int, + p21: Int, + p22: Int, + p23: Int, + p24: Int, + p25: Int, + p26: Int, + p27: Int, + p28: Int, + p29: Int, + p30: Int, + p31: Int, + p32: Int, + p33: Int, + p34: Int, + p35: Int, + p36: Int, + p37: Int, + p38: Int, + p39: Int, + p40: Int, + p41: Int, + p42: Int, + p43: Int, + p44: Int, + p45: Int, + p46: Int, + p47: Int, + p48: Int, + p49: Int, + p50: Int, + p51: Int, + p52: Int, + p53: Int, + p54: Int, + p55: Int, + p56: Int, + p57: Int, + p58: Int, + p59: Int, + p60: Int, + p61: Int, + p62: Int, + p63: Int, + p64: Int, + p65: Int, + p66: Int, + p67: Int, + p68: Int, + p69: Int, + p70: Int + ) { + assertEquals(1, p01) + assertEquals(41, p41) + assertEquals(42, p42) + assertEquals(43, p43) + assertEquals(70, p70) + } +} + +fun box(): String { + val f = A::class.members.single { it.name == "foo" } + val parameters = f.parameters + + f.callBy(mapOf( + parameters.first() to A(), + *((1..70)).map { i -> parameters[i] to i }.toTypedArray() + )) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt new file mode 100644 index 0000000..c1eecda --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt @@ -0,0 +1,99 @@ +package tests.callBy.manyArgumentsOnlyOneDefault + +import kotlin.test.assertEquals + +// Generate: +// (1..70).map { " p${"%02d".format(it)}: Int," }.joinToString("\n") + +class A { + fun foo( + p01: Int, + p02: Int, + p03: Int, + p04: Int, + p05: Int, + p06: Int, + p07: Int, + p08: Int, + p09: Int, + p10: Int, + p11: Int, + p12: Int, + p13: Int, + p14: Int, + p15: Int, + p16: Int, + p17: Int, + p18: Int, + p19: Int, + p20: Int, + p21: Int, + p22: Int, + p23: Int, + p24: Int, + p25: Int, + p26: Int, + p27: Int, + p28: Int, + p29: Int, + p30: Int, + p31: Int, + p32: Int, + p33: Int, + p34: Int, + p35: Int, + p36: Int, + p37: Int, + p38: Int, + p39: Int, + p40: Int, + p41: Int, + p42: Int = 239, + p43: Int, + p44: Int, + p45: Int, + p46: Int, + p47: Int, + p48: Int, + p49: Int, + p50: Int, + p51: Int, + p52: Int, + p53: Int, + p54: Int, + p55: Int, + p56: Int, + p57: Int, + p58: Int, + p59: Int, + p60: Int, + p61: Int, + p62: Int, + p63: Int, + p64: Int, + p65: Int, + p66: Int, + p67: Int, + p68: Int, + p69: Int, + p70: Int + ) { + assertEquals(1, p01) + assertEquals(41, p41) + assertEquals(239, p42) + assertEquals(43, p43) + assertEquals(70, p70) + } +} + +fun box(): String { + val f = A::class.members.single { it.name == "foo" } + val parameters = f.parameters + + f.callBy(mapOf( + parameters.first() to A(), + *((1..41) + (43..70)).map { i -> parameters[i] to i }.toTypedArray() + )) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt new file mode 100644 index 0000000..c4c70ea --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt @@ -0,0 +1,97 @@ +package tests.callBy.manyMaskArguments + +import kotlin.test.assertEquals + +// Generate: +// (1..70).map { " p${"%02d".format(it)}: Int = $it," }.joinToString("\n") + +class A { + fun foo( + p01: Int = 1, + p02: Int = 2, + p03: Int = 3, + p04: Int = 4, + p05: Int = 5, + p06: Int = 6, + p07: Int = 7, + p08: Int = 8, + p09: Int = 9, + p10: Int = 10, + p11: Int = 11, + p12: Int = 12, + p13: Int = 13, + p14: Int = 14, + p15: Int = 15, + p16: Int = 16, + p17: Int = 17, + p18: Int = 18, + p19: Int = 19, + p20: Int = 20, + p21: Int = 21, + p22: Int = 22, + p23: Int = 23, + p24: Int = 24, + p25: Int = 25, + p26: Int = 26, + p27: Int = 27, + p28: Int = 28, + p29: Int = 29, + p30: Int = 30, + p31: Int = 31, + p32: Int = 32, + p33: Int = 33, + p34: Int = 34, + p35: Int = 35, + p36: Int = 36, + p37: Int = 37, + p38: Int = 38, + p39: Int = 39, + p40: Int = 40, + p41: Int = 41, + p42: Int, + p43: Int = 43, + p44: Int = 44, + p45: Int = 45, + p46: Int = 46, + p47: Int = 47, + p48: Int = 48, + p49: Int = 49, + p50: Int = 50, + p51: Int = 51, + p52: Int = 52, + p53: Int = 53, + p54: Int = 54, + p55: Int = 55, + p56: Int = 56, + p57: Int = 57, + p58: Int = 58, + p59: Int = 59, + p60: Int = 60, + p61: Int = 61, + p62: Int = 62, + p63: Int = 63, + p64: Int = 64, + p65: Int = 65, + p66: Int = 66, + p67: Int = 67, + p68: Int = 68, + p69: Int = 69, + p70: Int = 70 + ) { + assertEquals(1, p01) + assertEquals(41, p41) + assertEquals(239, p42) + assertEquals(43, p43) + assertEquals(70, p70) + } +} + +fun box(): String { + val f = A::class.members.single { it.name == "foo" } + val parameters = f.parameters + f.callBy(mapOf( + parameters.first() to A(), + parameters.single { it.name == "p42" } to 239 + )) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt new file mode 100644 index 0000000..7709432 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt @@ -0,0 +1,23 @@ +package tests.callBy.nonDefaultParameterOmitted + +fun foo(x: Int, y: Int = 2) = x + y + +fun box(): String { + try { + ::foo.callBy(mapOf()) + return "Fail: IllegalArgumentException must have been thrown" + } + catch (e: IllegalArgumentException) { + // OK + } + + try { + ::foo.callBy(mapOf(::foo.parameters.last() to 1)) + return "Fail: IllegalArgumentException must have been thrown" + } + catch (e: IllegalArgumentException) { + // OK + } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt new file mode 100644 index 0000000..b7ecd22 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt @@ -0,0 +1,12 @@ +package tests.callBy.nullValue + +import kotlin.test.assertNull + +fun foo(x: String? = "Fail") { + assertNull(x) +} + +fun box(): String { + ::foo.callBy(mapOf(::foo.parameters.single() to null)) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt new file mode 100644 index 0000000..b65d5d9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt @@ -0,0 +1,20 @@ +package tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed + +import kotlin.test.assertEquals + +fun foo(result: String = "foo") { + assertEquals("box", result) + + // Check that this function was invoked directly and not through the "foo$default", i.e. there's no "foo$default" in the stack trace + val st = Thread.currentThread().stackTrace + for (i in 0..5) { + if ("foo\$default" in st[i].methodName) { + throw AssertionError("KCallable.call should invoke the method directly if all arguments are provided") + } + } +} + +fun box(): String { + ::foo.callBy(mapOf(::foo.parameters.single() to "box")) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt new file mode 100644 index 0000000..13b6f32 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt @@ -0,0 +1,28 @@ +package tests.callBy.primitiveDefaultValues + +import kotlin.test.assertEquals + +fun primitives( + boolean: Boolean = true, + character: Char = 'z', + byte: Byte = 5.toByte(), + short: Short = (-5).toShort(), + int: Int = 2000000000, + float: Float = -2.72f, + long: Long = 1000000000000000000L, + double: Double = 3.14159265359 +) { + assertEquals(true, boolean) + assertEquals('z', character) + assertEquals(5.toByte(), byte) + assertEquals((-5).toShort(), short) + assertEquals(2000000000, int) + assertEquals(-2.72f, float) + assertEquals(1000000000000000000L, long) + assertEquals(3.14159265359, double) +} + +fun box(): String { + ::primitives.callBy(emptyMap()) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt new file mode 100644 index 0000000..ad7cfd8 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt @@ -0,0 +1,5 @@ +package tests.callBy.simpleConstructor + +class A(val result: String = "OK") + +fun box(): String = ::A.callBy(mapOf()).result \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt new file mode 100644 index 0000000..c239cda --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt @@ -0,0 +1,10 @@ +package tests.callBy.simpleMemberFunciton + +class A(val result: String = "OK") { + fun foo(x: Int = 42): String { + assert(x == 42) { x } + return result + } +} + +fun box(): String = A::foo.callBy(mapOf(A::foo.parameters.first() to A())) \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt new file mode 100644 index 0000000..57bdc98 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt @@ -0,0 +1,5 @@ +package tests.callBy.simpleTopLevelFunction + +fun foo(result: String = "OK") = result + +fun box(): String = ::foo.callBy(mapOf()) \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/annotationClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/annotationClassLiteral.kt new file mode 100644 index 0000000..fce32d4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/annotationClassLiteral.kt @@ -0,0 +1,9 @@ +package tests.classLiterals.annotationClassLiteral + +import kotlin.test.assertEquals + +fun box(): String { + assertEquals("Deprecated", Deprecated::class.simpleName) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/arrays.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/arrays.kt new file mode 100644 index 0000000..f314141 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/arrays.kt @@ -0,0 +1,14 @@ +package tests.classLiterals.arrays + +import kotlin.test.* +import kotlin.reflect.KClass + +fun box(): String { + val any = Array::class + val string = Array::class + + assertNotEquals>(any, string) + assertNotEquals>(any.java, string.java) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/bareArray.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/bareArray.kt new file mode 100644 index 0000000..612a1b2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/bareArray.kt @@ -0,0 +1,13 @@ +package tests.classLiterals.bareArray + +import kotlin.test.* +import kotlin.reflect.KClass + +fun box(): String { + val any = Array::class + val bare = Array::class + + assertEquals>(any, bare) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/builtinClassLiterals.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/builtinClassLiterals.kt new file mode 100644 index 0000000..f421db2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/builtinClassLiterals.kt @@ -0,0 +1,39 @@ +package tests.classLiterals.builtinClassLiterals + +import kotlin.test.assertEquals + +fun box(): String { + assertEquals("Any", Any::class.simpleName) + assertEquals("String", String::class.simpleName) + assertEquals("CharSequence", CharSequence::class.simpleName) + assertEquals("Number", Number::class.simpleName) + assertEquals("Int", Int::class.simpleName) + assertEquals("Long", Long::class.simpleName) + + assertEquals("Array", Array::class.simpleName) + assertEquals("Array", Array::class.simpleName) + assertEquals("Array", Array>::class.simpleName) + + assertEquals("IntArray", IntArray::class.simpleName) + assertEquals("DoubleArray", DoubleArray::class.simpleName) + + assertEquals("Companion", Int.Companion::class.simpleName) + assertEquals("Companion", Double.Companion::class.simpleName) + assertEquals("Companion", Char.Companion::class.simpleName) + + assertEquals("IntRange", IntRange::class.simpleName) + + assertEquals("List", List::class.simpleName) + assertEquals("Entry", Map.Entry::class.simpleName) + + // TODO: KT-11754 + assertEquals("List", MutableList::class.simpleName) + assertEquals("Entry", MutableMap.MutableEntry::class.simpleName) + + assertEquals("Function0", Function0::class.simpleName) + assertEquals("Function1", Function1::class.simpleName) + assertEquals("Function5", Function5::class.simpleName) + assertEquals("FunctionN", Function42::class.simpleName) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericArrays.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericArrays.kt new file mode 100644 index 0000000..a6b0831 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericArrays.kt @@ -0,0 +1,30 @@ +package tests.classLiterals.genericArrays + +import kotlin.test.* +import kotlin.reflect.* +import kotlin.reflect.jvm.* + +class Klass + +inline fun arrayClass(): KClass> = Array::class + +fun box(): String { + assertEquals("Array", arrayClass().simpleName) + assertEquals("Array", arrayClass().simpleName) + assertEquals("Array", arrayClass>().simpleName) + assertEquals("Array", arrayClass().simpleName) + assertEquals("Array", arrayClass().simpleName) + assertEquals("Array", arrayClass>().simpleName) + assertEquals("Array", arrayClass>().simpleName) + + // Should not be that way. Fix this test when backend is fixed. + assertEquals("[Ljava.lang.Object;", arrayClass().jvmName) + assertEquals("[Ljava.lang.Object;", arrayClass().jvmName) + assertEquals("[Ljava.lang.Object;", arrayClass>().jvmName) + assertEquals("[Ljava.lang.Object;", arrayClass().jvmName) + assertEquals("[Ljava.lang.Object;", arrayClass().jvmName) + assertEquals("[Ljava.lang.Object;", arrayClass>().jvmName) + assertEquals("[Ljava.lang.Object;", arrayClass>().jvmName) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericClass.kt new file mode 100644 index 0000000..7f90584 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericClass.kt @@ -0,0 +1,11 @@ +package tests.classLiterals.genericClass + +import kotlin.test.assertEquals + +class Generic + +fun box(): String { + val g = Generic::class + assertEquals("Generic", g.simpleName) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/lambdaClass.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/lambdaClass.kt new file mode 100644 index 0000000..2dc5f60 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/lambdaClass.kt @@ -0,0 +1,28 @@ +package tests.classLiterals.lambdaClass + +// KT-33992 + +class P(val a: T, val b: T) + +inline fun foo(x: () -> Any) = P(x(), x()) + +fun box(): String { + val p1 = foo { + class C + C() + } + val p2 = foo { + object {} + } + + val x = p1.a + val y = p1.b + + val a = p2.a + val b = p2.b + + if (x::class != y::class) return "FAIL 1" + if (a::class != b::class) return "FAIL 2" + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/reifiedTypeClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/reifiedTypeClassLiteral.kt new file mode 100644 index 0000000..0e181ec --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classLiterals/reifiedTypeClassLiteral.kt @@ -0,0 +1,30 @@ +package tests.classLiterals.reifiedTypeClassLiteral + +import kotlin.test.* + +class Klass +class Other + +inline fun simpleName(): String = + T::class.simpleName!! + +inline fun twoReifiedParams(): String = + "${T1::class.simpleName!!}, ${T2::class.simpleName!!}" + +inline fun myJavaClass(): Class = + T::class.java + +fun box(): String { + assertEquals("Klass", simpleName()) + assertEquals("Int", simpleName()) + assertEquals("Array", simpleName>()) + assertEquals("Error", simpleName()) + assertEquals("Klass, Other", twoReifiedParams()) + + assertEquals(String::class.java, myJavaClass()) + assertEquals(IntArray::class.java, myJavaClass()) + assertEquals(Klass::class.java, myJavaClass()) + assertEquals(Error::class.java, myJavaClass()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt new file mode 100644 index 0000000..3818f64 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt @@ -0,0 +1,23 @@ +package tests.classes.classMembers + +import kotlinx.reflect.lite.tests.* + +open class Base { + fun foo() {} + + val a = 20 +} + +class Derived : Base() { + val b = 20 + + fun bar() {} +} + +fun box(): String { + Derived::class.java.toLiteKClass().members.forEach { + println(it.name) + } + return "OK" +} + diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt new file mode 100644 index 0000000..740c460 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt @@ -0,0 +1,13 @@ +package tests.classes.classSimpleName + +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +class Klass + +fun box(): String { + assertEquals("Klass", Klass::class.java.toLiteKClass().simpleName) + assertEquals("Date", java.util.Date::class.java.toLiteKClass().simpleName) + assertEquals("ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().simpleName) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/javaVoid.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/javaVoid.kt new file mode 100644 index 0000000..07106ea --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/javaVoid.kt @@ -0,0 +1,18 @@ +package tests.classes.javaVoid + +import kotlin.test.assertEquals + +fun box(): String { + assertEquals(Void::class, Void.TYPE.kotlin) + assertEquals(Void.TYPE.kotlin, Void::class) + + assertEquals(Void.TYPE, Void::class.javaPrimitiveType) + assertEquals(Void::class.java, Void::class.javaObjectType) + assertEquals(Void.TYPE, Void.TYPE.kotlin.javaPrimitiveType) + assertEquals(Void::class.java, Void.TYPE.kotlin.javaObjectType) + + assertEquals("Void", Void::class.simpleName) + assertEquals("java.lang.Void", Void::class.qualifiedName) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt new file mode 100644 index 0000000..865938d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt @@ -0,0 +1,42 @@ +package tests.classes.localClassSimpleName + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +fun check(klass: KClass<*>, expectedName: String) { + assertEquals(expectedName, klass.simpleName) +} + +fun localInMethod() { + fun localInMethod(unused: Any?) { + class Local + check(Local::class.java.toLiteKClass(), "Local") + + class `Local$With$Dollars` + check(`Local$With$Dollars`::class.java.toLiteKClass(), "Local\$With\$Dollars") + } + localInMethod(null) + + class Local + check(Local::class.java.toLiteKClass(), "Local") + + class `Local$With$Dollars` + check(`Local$With$Dollars`::class.java.toLiteKClass(), "Local\$With\$Dollars") +} + +class LocalInConstructor { + init { + class Local + check(Local::class.java.toLiteKClass(), "Local") + + class `Local$With$Dollars` + check(`Local$With$Dollars`::class.java.toLiteKClass(), "Local\$With\$Dollars") + } +} + +fun box(): String { + localInMethod() + LocalInConstructor() + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt new file mode 100644 index 0000000..dfc6e30 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt @@ -0,0 +1,59 @@ +package tests.classes.nestedClasses + +import kotlin.test.assertEquals +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + +class A { + companion object {} + inner class Inner + class Nested + private class PrivateNested +} + +fun nestedNames(c: KClass<*>) = c.nestedClasses.map { it.simpleName ?: throw AssertionError("Unnamed class: ${it}") }.sorted() + +fun box(): String { + // Kotlin class without nested classes + assertEquals(emptyList(), nestedNames(A.Inner::class.java.toLiteKClass())) + // Kotlin class with nested classes + assertEquals(listOf("Companion", "Inner", "Nested", "PrivateNested"), nestedNames(A::class.java.toLiteKClass())) + + // Java class without nested classes + //assertEquals(emptyList(), nestedNames(Error::class.java.toLiteKClass())) + // Java interface with nested classes + //assertEquals(listOf("Entry"), nestedNames(java.util.Map::class.java.toLiteKClass())) + // Java class with nested classes + //assertEquals(listOf("SimpleEntry", "SimpleImmutableEntry"), nestedNames(java.util.AbstractMap::class.java.toLiteKClass())) + + // Built-ins +// assertEquals(emptyList(), nestedNames(Array::class.java.toLiteKClass())) +// assertEquals(emptyList(), nestedNames(CharSequence::class.java.toLiteKClass())) +// assertEquals(listOf("Companion"), nestedNames(String::class.java.toLiteKClass())) +// +// assertEquals(emptyList(), nestedNames(Collection::class.java.toLiteKClass())) +// assertEquals(emptyList(), nestedNames(MutableCollection::class.java.toLiteKClass())) +// assertEquals(emptyList(), nestedNames(List::class.java.toLiteKClass())) +// assertEquals(emptyList(), nestedNames(MutableList::class.java.toLiteKClass())) +// assertEquals(listOf("Entry"), nestedNames(Map::class.java.toLiteKClass())) +// assertEquals(emptyList(), nestedNames(Map.Entry::class.java.toLiteKClass())) +// assertEquals(emptyList(), nestedNames(MutableMap.MutableEntry::class.java.toLiteKClass())) + + // TODO: should be MutableEntry. Currently we do not distinguish between Map and MutableMap. + //assertEquals(listOf("Entry"), nestedNames(MutableMap::class.java.toLiteKClass())) + + // Primitives +// for (primitive in listOf(Byte::class, Double::class, Float::class, Int::class, Long::class, Short::class, Char::class, Boolean::class)) { +// assertEquals(listOf("Companion"), nestedNames(primitive.java.toLiteKClass())) +// } + + // Primitive arrays +// for (primitiveArray in listOf( +// ByteArray::class, DoubleArray::class, FloatArray::class, IntArray::class, +// LongArray::class, ShortArray::class, CharArray::class, BooleanArray::class +// )) { +// assertEquals(emptyList(), nestedNames(primitiveArray.java.toLiteKClass())) +// } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/objectInstance.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/objectInstance.kt new file mode 100644 index 0000000..2ac527e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/objectInstance.kt @@ -0,0 +1,33 @@ +package tests.classes.objectInstance + +import kotlin.test.assertEquals + +object Obj { + fun foo() = 1 +} + +class A { + companion object { + fun foo() = 2 + } +} + +class B { + companion object Factory { + fun foo() = 3 + } +} + +class C + +fun box(): String { + assertEquals(1, Obj::class.objectInstance!!.foo()) + assertEquals(2, A.Companion::class.objectInstance!!.foo()) + assertEquals(3, B.Factory::class.objectInstance!!.foo()) + + assertEquals(null, C::class.objectInstance) + assertEquals(null, String::class.objectInstance) + assertEquals(Unit, Unit::class.objectInstance) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/primitiveKClassEquality.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/primitiveKClassEquality.kt new file mode 100644 index 0000000..7f6ff91 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/primitiveKClassEquality.kt @@ -0,0 +1,15 @@ +package tests.classes.primitiveKClassEquality + +import kotlin.test.assertEquals +import kotlin.test.assertFalse + +fun box(): String { + val x = Int::class.javaPrimitiveType!!.kotlin + val y = Int::class.javaObjectType.kotlin + + assertEquals(x, y) + assertEquals(x.hashCode(), y.hashCode()) + assertFalse(x === y) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt new file mode 100644 index 0000000..19279af --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -0,0 +1,29 @@ + +package tests.classes.qualifiedName + +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +class Klass { + class Nested + class `Nested$With$Dollars` + companion object +} + +fun box(): String { + assertEquals("tests.classes.qualifiedName.Klass", Klass::class.java.toLiteKClass().qualifiedName) + assertEquals("tests.classes.qualifiedName.Klass.Nested", Klass.Nested::class.java.toLiteKClass().qualifiedName) + assertEquals("tests.classes.qualifiedName.Klass.Nested\$With\$Dollars", Klass.`Nested$With$Dollars`::class.java.toLiteKClass().qualifiedName) + assertEquals("tests.classes.qualifiedName.Klass.Companion", Klass.Companion::class.java.toLiteKClass().qualifiedName) + + assertEquals("java.util.Date", java.util.Date::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().qualifiedName) + + class Local + assertEquals(null, Local::class.java.toLiteKClass().qualifiedName) + + val o = object {} + assertEquals(null, o.javaClass.toLiteKClass().qualifiedName) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt new file mode 100644 index 0000000..36708f4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt @@ -0,0 +1,40 @@ +package tests.classes.qualifiedNameOfStandardClasses + +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +fun box(): String { + assertEquals("kotlin.Any", Any::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.String", String::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.CharSequence", CharSequence::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Number", Number::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Int", Int::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Long", Long::class.java.toLiteKClass().qualifiedName) + + assertEquals("kotlin.Array", Array::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Array", Array::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Array", Array>::class.java.toLiteKClass().qualifiedName) + + assertEquals("kotlin.IntArray", IntArray::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.DoubleArray", DoubleArray::class.java.toLiteKClass().qualifiedName) + + assertEquals("kotlin.Int.Companion", Int.Companion::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Double.Companion", Double.Companion::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Char.Companion", Char.Companion::class.java.toLiteKClass().qualifiedName) + + assertEquals("kotlin.ranges.IntRange", IntRange::class.java.toLiteKClass().qualifiedName) + + assertEquals("kotlin.collections.List", List::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.collections.Map.Entry", Map.Entry::class.java.toLiteKClass().qualifiedName) + + // TODO: KT-11754 + assertEquals("kotlin.collections.List", MutableList::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.collections.Map.Entry", MutableMap.MutableEntry::class.java.toLiteKClass().qualifiedName) + + assertEquals("kotlin.Function0", Function0::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Function1", Function1::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Function5", Function5::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.jvm.functions.FunctionN", Function42::class.java.toLiteKClass().qualifiedName) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt new file mode 100644 index 0000000..d6fec33 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt @@ -0,0 +1,40 @@ +package tests.classes.sealedSubclasses + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +// -- + +sealed class SealedClassWithTopLevelSubclasses { + class NotASealedSubclass : TL2() +} +object TL1 : SealedClassWithTopLevelSubclasses() +open class TL2 : SealedClassWithTopLevelSubclasses() + +// -- + +sealed class SealedClassWithNestedSubclasses { + data class N1(val x: Unit) : SealedClassWithNestedSubclasses() + object N2 : SealedClassWithNestedSubclasses() +} + +// -- + +sealed class SealedClassWithNoSubclasses + +// -- + +fun sealedSubclassNames(c: KClass<*>) = c.sealedSubclasses.map { it.simpleName ?: throw AssertionError("Unnamed class: ${it}") }.sorted() + +fun box(): String { + assertEquals(listOf("TL1", "TL2"), sealedSubclassNames(SealedClassWithTopLevelSubclasses::class.java.toLiteKClass())) + assertEquals(listOf("N1", "N2"), sealedSubclassNames(SealedClassWithNestedSubclasses::class.java.toLiteKClass())) + assertEquals(emptyList(), sealedSubclassNames(SealedClassWithNoSubclasses::class.java.toLiteKClass())) + +// assertEquals(emptyList(), sealedSubclassNames(String::class.java.toLiteKClass())) +// assertEquals(emptyList(), sealedSubclassNames(Thread::class.java.toLiteKClass())) +// assertEquals(emptyList(), sealedSubclassNames(FloatArray::class.java.toLiteKClass())) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt new file mode 100644 index 0000000..cff33ac --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt @@ -0,0 +1,20 @@ +package tests.constructors.classesWithoutConstructors + +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertTrue + +interface Interface +object Obj + +class C { + companion object +} + +fun box(): String { + assertTrue(Interface::class.java.toLiteKClass().constructors.isEmpty()) + assertTrue(Obj::class.java.toLiteKClass().constructors.isEmpty()) + assertTrue(C.Companion::class.java.toLiteKClass().constructors.isEmpty()) + assertTrue(object {}::class.java.toLiteKClass().constructors.isEmpty()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt new file mode 100644 index 0000000..60ae354 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt @@ -0,0 +1,11 @@ +package tests.constructors.constructorName + +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +class A + +fun box(): String { + assertEquals("", A::class.java.toLiteKClass().constructors.first().name) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt new file mode 100644 index 0000000..ca224ef --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt @@ -0,0 +1,24 @@ +package tests.constructors.enumEntry + +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +enum class TestEnum(val id: String? = null) { + ENUM1(id = "enum1_id"), + + ENUM2(id = "enum2_id") { + override fun test() { + ENUM1.test() + } + }; + + open fun test() { + } +} + +fun box(): String { + assertEquals(listOf("fun (kotlin.String?): tests.constructors.enumEntry.TestEnum"), TestEnum.ENUM1::class.java.toLiteKClass().constructors.map { it.toString() }) + assertEquals(listOf(), TestEnum.ENUM2::class.java.toLiteKClass().constructors.map { it.toString() }) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt new file mode 100644 index 0000000..154c3dc --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt @@ -0,0 +1,32 @@ +package tests.constructors.simpleGetConstructors + +import kotlinx.reflect.lite.tests.* +import java.util.Collections +import kotlin.reflect.* +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +open class A private constructor(x: Int) { + public constructor(s: String): this(s.length) + constructor(): this("") +} + +class B : A("") + +class C { + class Nested + inner class Inner +} + +fun box(): String { + assertEquals(3, A::class.java.toLiteKClass().constructors.size) + assertEquals(1, B::class.java.toLiteKClass().constructors.size) + + assertTrue(Collections.disjoint(A::class.java.toLiteKClass().members, A::class.java.toLiteKClass().constructors)) + assertTrue(Collections.disjoint(B::class.java.toLiteKClass().members, B::class.java.toLiteKClass().constructors)) + + assertEquals(1, C.Nested::class.java.toLiteKClass().constructors.size) + assertEquals(1, C.Inner::class.java.toLiteKClass().constructors.size) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/annotationType.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/annotationType.kt new file mode 100644 index 0000000..e100a65 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/annotationType.kt @@ -0,0 +1,11 @@ +package tests.createAnnotation.annotationType + +import kotlin.test.assertEquals + +annotation class Foo + +fun box(): String { + val foo = Foo::class.constructors.single().call() + assertEquals(Foo::class, foo.annotationClass) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/arrayOfKClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/arrayOfKClasses.kt new file mode 100644 index 0000000..bab75ec --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/arrayOfKClasses.kt @@ -0,0 +1,14 @@ + +package tests.createAnnotation.arrayOfKClasses + +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +annotation class Anno(val klasses: Array> = arrayOf(String::class, Int::class)) + +fun box(): String { + val anno = Anno::class.constructors.single().callBy(emptyMap()) + assertEquals(listOf(String::class, Int::class), anno.klasses.toList()) + assertEquals("@tests.createAnnotation.arrayOfKClasses.Anno(klasses=[class java.lang.String, int])", anno.toString()) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/createJdkAnnotationInstance.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/createJdkAnnotationInstance.kt new file mode 100644 index 0000000..b075f4c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/createJdkAnnotationInstance.kt @@ -0,0 +1,15 @@ +package tests.createAnnotation.createJdkAnnotationInstance + +import java.lang.annotation.Retention +import java.lang.annotation.RetentionPolicy +import kotlin.test.assertEquals + +fun box(): String { + val ctor = Retention::class.constructors.single() + val r = ctor.callBy(mapOf( + ctor.parameters.single { it.name == "value" } to RetentionPolicy.RUNTIME + )) + assertEquals(RetentionPolicy.RUNTIME, r.value as RetentionPolicy) + assertEquals(Retention::class.java.classLoader, r.javaClass.classLoader) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/enumKClassAnnotation.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/enumKClassAnnotation.kt new file mode 100644 index 0000000..cd6be70 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/enumKClassAnnotation.kt @@ -0,0 +1,48 @@ + +package tests.createAnnotation.enumKClassAnnotation + +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +annotation class Foo(val value: String) + +annotation class Anno( + val level: DeprecationLevel, + val klass: KClass<*>, + val foo: Foo, + val levels: Array, + val klasses: Array>, + val foos: Array +) + +@Anno( + DeprecationLevel.WARNING, + Number::class, + Foo("OK"), + arrayOf(DeprecationLevel.WARNING), + arrayOf(Number::class), + arrayOf(Foo("OK")) +) +fun foo() {} + +fun box(): String { + // Construct an annotation with exactly the same parameters, check that the proxy created by Kotlin and by Java reflection are the same and have the same hash code + val a1 = Anno::class.constructors.single().call( + DeprecationLevel.WARNING, + Number::class, + Foo::class.constructors.single().call("OK"), + arrayOf(DeprecationLevel.WARNING), + arrayOf(Number::class), + arrayOf(Foo::class.constructors.single().call("OK")) + ) + val a2 = ::foo.annotations.single() as Anno + + assertEquals(a1, a2) + assertEquals(a2, a1) + assertEquals(a1.hashCode(), a2.hashCode()) + + assertEquals("@tests.createAnnotation.enumKClassAnnotation.Anno(level=WARNING, klass=class java.lang.Number, foo=@tests.createAnnotation.enumKClassAnnotation.Foo(value=OK), " + + "levels=[WARNING], klasses=[class java.lang.Number], foos=[@tests.createAnnotation.enumKClassAnnotation.Foo(value=OK)])", a1.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/equalsHashCodeToString.kt new file mode 100644 index 0000000..eac2234 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/equalsHashCodeToString.kt @@ -0,0 +1,46 @@ + + +package tests.createAnnotation.equalsHashCodeToString + +annotation class A +annotation class B(val s: String) + +@A +@B("2") +fun javaReflectionAnnotationInstances() {} + +fun box(): String { + val createA = A::class.constructors.single() + + val a1 = createA.call() + if (a1.toString() != "@tests.createAnnotation.equalsHashCodeToString.A()") return "Fail: toString does not correspond to the documentation of java.lang.annotation.Annotation#toString: $a1" + + val a2 = createA.call() + if (a1 === a2) return "Fail: instances created by the constructor should be different" + if (a1 != a2) return "Fail: any instance of A should be equal to any other instance of A" + if (a1.hashCode() != a2.hashCode()) return "Fail: hash codes of equal instances should be equal" + if (a1.hashCode() != 0) return "Fail: hashCode does not correspond to the documentation of java.lang.annotation.Annotation#hashCode: ${a1.hashCode()}" + + val createB = B::class.constructors.single() + val b1 = createB.call("1") + if (b1.toString() != "@tests.createAnnotation.equalsHashCodeToString.B(s=1)") return "Fail: toString does not correspond to the documentation of java.lang.annotation.Annotation#toString: $b1" + if (b1 != b1) return "Fail: instance should be equal to itself" + + val b2 = createB.call("2") + if (b1 == b2) return "Fail: instances with different data should not be equal" + if (b1.hashCode() == b2.hashCode()) return "Fail: hash codes of different instances should very likely be also different" + + val a3 = ::javaReflectionAnnotationInstances.annotations.filterIsInstance().single() + if (a1 === a3) return "Fail: instance created by the constructor and the one obtained from Java reflection should be different" + if (a1 != a3) return "Fail: instance created by the constructor should be equal to the one obtained from Java reflection" + if (a3 != a1) return "Fail: instance obtained from Java reflection should be equal to the one created by the constructor" + if (a1.hashCode() != a3.hashCode()) return "Fail: hash codes of equal instances should be equal" + + val b3 = ::javaReflectionAnnotationInstances.annotations.filterIsInstance().single() + if (b2 === b3) return "Fail: instance created by the constructor and the one obtained from Java reflection should be different" + if (b2 != b3) return "Fail: instance created by the constructor should be equal to the one obtained from Java reflection" + if (b3 != b2) return "Fail: instance obtained from Java reflection should be equal to the one created by the constructor" + if (b2.hashCode() != b3.hashCode()) return "Fail: hash codes of equal instances should be equal" + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/floatingPointParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/floatingPointParameters.kt new file mode 100644 index 0000000..3634161 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/floatingPointParameters.kt @@ -0,0 +1,67 @@ + +package tests.createAnnotation.floatingPointParameters +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals +import kotlin.test.assertTrue + +annotation class D(val d: Double) +annotation class F(val f: Float) + +/* +// TODO: uncomment once KT-13887 is implemented +@D(Double.NaN) +fun dnan() {} + +@F(Float.NaN) +fun fnan() {} +*/ + +@D(-0.0) +fun dMinusZero() {} +@D(+0.0) +fun dPlusZero() {} + +@F(-0.0f) +fun fMinusZero() {} +@F(+0.0f) +fun fPlusZero() {} + +fun check(x: Any, y: Any, regexString: String) { + assertEquals(x, y) + assertEquals(y, x) + assertEquals(x.hashCode(), y.hashCode()) + + val regex = regexString.toRegex() + assertTrue(regex.matches(x.toString())) + assertTrue(regex.matches(y.toString())) +} + +fun checkNot(x: Any, y: Any) { + assertNotEquals(x, y) + assertNotEquals(y, x) + assertNotEquals(x.hashCode(), y.hashCode()) + assertNotEquals(x.toString(), y.toString()) +} + +fun box(): String { +/* + check(::dnan.annotations.single() as D, D::class.constructors.single().call(Double.NaN)) + check(::fnan.annotations.single() as F, F::class.constructors.single().call(Float.NaN)) +*/ + + val dmz = D::class.constructors.single().call(-0.0) + val dpz = D::class.constructors.single().call(+0.0) + val fmz = F::class.constructors.single().call(-0.0f) + val fpz = F::class.constructors.single().call(+0.0f) + check(::dMinusZero.annotations.single() as D, dmz, "@tests.createAnnotation.floatingPointParameters.D\\(d=-0.0\\)") + check(::dPlusZero.annotations.single() as D, dpz, "@tests.createAnnotation.floatingPointParameters.D\\(d=0.0\\)") + check(::fMinusZero.annotations.single() as F, fmz, "@tests.createAnnotation.floatingPointParameters.F\\(f=-0.0f?\\)") + check(::fPlusZero.annotations.single() as F, fpz, "@tests.createAnnotation.floatingPointParameters.F\\(f=0.0f?\\)") + + checkNot(dmz, dpz) + checkNot(fmz, fpz) + checkNot(dmz, fmz) + checkNot(dpz, fpz) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/parameterNamedEquals.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/parameterNamedEquals.kt new file mode 100644 index 0000000..2dfab0d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/parameterNamedEquals.kt @@ -0,0 +1,15 @@ +package tests.createAnnotation.parameterNamedEquals + +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals + +annotation class Anno(val equals: Boolean) + +fun box(): String { + val t = Anno::class.constructors.single().call(true) + val f = Anno::class.constructors.single().call(false) + assertEquals(true, t.equals) + assertEquals(false, f.equals) + assertNotEquals(t, f) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/primitivesAndArrays.kt b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/primitivesAndArrays.kt new file mode 100644 index 0000000..7ceae67 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/primitivesAndArrays.kt @@ -0,0 +1,84 @@ + + +package tests.createAnnotation.primitivesAndArrays + +import kotlin.test.assertEquals + +annotation class Anno( + val b: Byte, + val c: Char, + val d: Double, + val f: Float, + val i: Int, + val j: Long, + val s: Short, + val z: Boolean, + val ba: ByteArray, + val ca: CharArray, + val da: DoubleArray, + val fa: FloatArray, + val ia: IntArray, + val ja: LongArray, + val sa: ShortArray, + val za: BooleanArray, + val str: String, + val stra: Array +) + +@Anno( + 1.toByte(), + 'x', + 3.14, + -2.72f, + 42424242, + 239239239239239L, + 42.toShort(), + true, + byteArrayOf((-1).toByte()), + charArrayOf('y'), + doubleArrayOf(-3.14159), + floatArrayOf(2.7218f), + intArrayOf(424242), + longArrayOf(239239239239L), + shortArrayOf((-43).toShort()), + booleanArrayOf(false, true), + "lol", + arrayOf("rofl") +) +fun foo() {} + +fun box(): String { + // Construct an annotation with exactly the same parameters, check that the proxy created by Kotlin and by Java reflection are the same and have the same hash code + val a1 = Anno::class.constructors.single().call( + 1.toByte(), + 'x', + 3.14, + -2.72f, + 42424242, + 239239239239239L, + 42.toShort(), + true, + byteArrayOf((-1).toByte()), + charArrayOf('y'), + doubleArrayOf(-3.14159), + floatArrayOf(2.7218f), + intArrayOf(424242), + longArrayOf(239239239239L), + shortArrayOf((-43).toShort()), + booleanArrayOf(false, true), + "lol", + arrayOf("rofl") + ) + + val a2 = ::foo.annotations.single() as Anno + + assertEquals(a1, a2) + assertEquals(a2, a1) + assertEquals(a1.hashCode(), a2.hashCode()) + + assertEquals("@tests.createAnnotation.primitivesAndArrays.Anno(b=1, c=x, d=3.14, f=-2.72, i=42424242, j=239239239239239, s=42, z=true, " + + "ba=[-1], ca=[y], da=[-3.14159], fa=[2.7218], ia=[424242], ja=[239239239239], sa=[-43], za=[false, true], " + + "str=lol, stra=[rofl])", a1.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/enumValuesValueOf.kt b/src/test/java/kotlinx/reflect/lite/testData/functions/enumValuesValueOf.kt new file mode 100644 index 0000000..f0f0bdf --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/functions/enumValuesValueOf.kt @@ -0,0 +1,15 @@ + +package tests.functions.enumValuesValueOf + +import kotlin.test.assertEquals + +enum class E { X, Y, Z } + +fun box(): String { + assertEquals("fun values(): kotlin.Array", E::values.toString()) + assertEquals(listOf(E.X, E.Y, E.Z), E::values.call().toList()) + assertEquals("fun valueOf(kotlin.String): tests.functions.enumValuesValueOf.E", E::valueOf.toString()) + assertEquals(E.Y, E::valueOf.call("Y")) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/functionFromStdlib.kt b/src/test/java/kotlinx/reflect/lite/testData/functions/functionFromStdlib.kt new file mode 100644 index 0000000..edcdfe1 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/functions/functionFromStdlib.kt @@ -0,0 +1,10 @@ +package tests.functions.functionFromStdlib + +import kotlin.reflect.KFunction1 +import kotlin.reflect.jvm.isAccessible + +fun doStuff(fn: KFunction1) = fn.call("oK") + +fun box(): String { + return doStuff(String::capitalize.apply { isAccessible = true }) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/genericOverriddenFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/functions/genericOverriddenFunction.kt new file mode 100644 index 0000000..c55e519 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/functions/genericOverriddenFunction.kt @@ -0,0 +1,18 @@ + + +package tests.functions.genericOverriddenFunction + +import kotlin.test.assertEquals + +interface H { + fun foo(): T? +} + +interface A : H + +fun box(): String { + assertEquals("tests.functions.genericOverriddenFunction.A?", A::foo.returnType.toString()) + assertEquals("T?", H::foo.returnType.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/isAccessibleOnAllMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/functions/isAccessibleOnAllMembers.kt new file mode 100644 index 0000000..e119a9d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/functions/isAccessibleOnAllMembers.kt @@ -0,0 +1,18 @@ +package tests.functions.isAccessibleOnAllMembers + +import kotlin.reflect.jvm.isAccessible + +fun box(): String { + val members = Observer::class.members + for (member in members) { + member.isAccessible = true + } + return members.single { it.name == "result" }.call(Observer()) as String +} + +class Observer : AutoCloseable { + override fun close() { + } + + private fun result() = "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/platformName.kt b/src/test/java/kotlinx/reflect/lite/testData/functions/platformName.kt new file mode 100644 index 0000000..25a8b9c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/functions/platformName.kt @@ -0,0 +1,6 @@ +package tests.functions.platformName + +@JvmName("Fail") +fun OK() {} + +fun box() = ::OK.name \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/simpleNames.kt b/src/test/java/kotlinx/reflect/lite/testData/functions/simpleNames.kt new file mode 100644 index 0000000..eeb332f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/functions/simpleNames.kt @@ -0,0 +1,18 @@ +package tests.functions.simpleNames + +import kotlin.test.assertEquals + +fun foo() {} + +class A { + fun bar() = "" +} + +fun Int.baz() = this + +fun box(): String { + assertEquals("foo", ::foo.name) + assertEquals("bar", A::bar.name) + assertEquals("baz", Int::baz.name) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/isInstance/isInstanceCastAndSafeCast.kt b/src/test/java/kotlinx/reflect/lite/testData/isInstance/isInstanceCastAndSafeCast.kt new file mode 100644 index 0000000..c9f85e3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/isInstance/isInstanceCastAndSafeCast.kt @@ -0,0 +1,58 @@ +package tests.isInstance.isInstanceCastAndSafeCast + +import kotlin.reflect.KClass +import kotlin.reflect.cast +import kotlin.reflect.safeCast +import kotlin.test.* + +fun testInstance(value: Any?, klass: KClass<*>) { + assertTrue(klass.isInstance(value)) + assertEquals(value, klass.safeCast(value)) + assertEquals(value, klass.cast(value)) +} + +fun testNotInstance(value: Any?, klass: KClass<*>) { + assertFalse(klass.isInstance(value)) + assertNull(klass.safeCast(value)) + try { + klass.cast(value) + fail("Value should not be an instance of $klass: $value") + } + catch (e: Exception) { /* OK */ } +} + +fun box(): String { + testInstance(Any(), Any::class) + testInstance("", String::class) + testInstance("", Any::class) + testNotInstance(Any(), String::class) + testNotInstance(null, Any::class) + testNotInstance(null, String::class) + + testInstance(arrayOf(""), Array::class) + testInstance(arrayOf(""), Array::class) + testNotInstance(arrayOf(Any()), Array::class) + + testInstance(listOf(""), List::class) + testInstance(listOf(""), Collection::class) + // TODO: support MutableList::class (KT-11754) + // testNotInstance(listOf(""), MutableList::class) + + testInstance(42, Int::class) + testInstance(42, Int::class.javaPrimitiveType!!.kotlin) + testInstance(42, Int::class.javaObjectType!!.kotlin) + + testNotInstance(3.14, Int::class) + + // Function types + + testInstance(fun() {}, Function0::class) + testNotInstance(fun() {}, Function1::class) + testNotInstance(fun() {}, Function2::class) + + testNotInstance(::testInstance, Function0::class) + testNotInstance(::testInstance, Function1::class) + testInstance(::testInstance, Function2::class) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/array.kt b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/array.kt new file mode 100644 index 0000000..ca6e034 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/array.kt @@ -0,0 +1,18 @@ +package tests.kClassInAnnotation.array + +import kotlin.reflect.KClass + +@Retention(AnnotationRetention.RUNTIME) +annotation class Ann(val args: Array>) + +class O +class K + +@Ann(arrayOf(O::class, K::class)) class MyClass + +fun box(): String { + val args = MyClass::class.java.getAnnotation(Ann::class.java).args + val argName1 = args[0].simpleName ?: "fail 1" + val argName2 = args[1].simpleName ?: "fail 2" + return argName1 + argName2 +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/basic.kt b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/basic.kt new file mode 100644 index 0000000..779f05a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/basic.kt @@ -0,0 +1,15 @@ +package tests.kClassInAnnotation.basic + +import kotlin.reflect.KClass + +@Retention(AnnotationRetention.RUNTIME) +annotation class Ann(val arg: KClass<*>) + +class OK + +@Ann(OK::class) class MyClass + +fun box(): String { + val argName = MyClass::class.java.getAnnotation(Ann::class.java).arg.simpleName ?: "fail 1" + return argName +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/checkcast.kt b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/checkcast.kt new file mode 100644 index 0000000..bf9fc19 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/checkcast.kt @@ -0,0 +1,12 @@ +package tests.kClassInAnnotation.checkcast + +import kotlin.reflect.KClass + +fun box(): String { + try { + String::class.java as KClass + } catch (e: Exception) { + return "OK" + } + return "fail" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/forceWrapping.kt b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/forceWrapping.kt new file mode 100644 index 0000000..006f01c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/forceWrapping.kt @@ -0,0 +1,21 @@ +package tests.kClassInAnnotation.forceWrapping + +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +annotation class Anno( + val klass: KClass<*>, + val kClasses: Array>, + vararg val kClassesVararg: KClass<*> +) + +@Anno(String::class, arrayOf(Int::class), Double::class) +fun foo() {} + +fun box(): String { + val k = ::foo.annotations.single() as Anno + assertEquals(String::class, k.klass) + assertEquals(Int::class, k.kClasses[0]) + assertEquals(Double::class, k.kClassesVararg[0]) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/vararg.kt b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/vararg.kt new file mode 100644 index 0000000..1f47206 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/vararg.kt @@ -0,0 +1,18 @@ +package tests.kClassInAnnotation.vararg + +import kotlin.reflect.KClass + +@Retention(AnnotationRetention.RUNTIME) +annotation class Ann(vararg val args: KClass<*>) + +class O +class K + +@Ann(O::class, K::class) class MyClass + +fun box(): String { + val args = MyClass::class.java.getAnnotation(Ann::class.java).args + val argName1 = args[0].simpleName ?: "fail 1" + val argName2 = args[1].simpleName ?: "fail 2" + return argName1 + argName2 +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/wrappingForCallableReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/wrappingForCallableReferences.kt new file mode 100644 index 0000000..28c303f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/wrappingForCallableReferences.kt @@ -0,0 +1,41 @@ +package tests.kClassInAnnotation.wrappingForCallableReferences + +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +annotation class Anno( + val klass: KClass<*>, + val kClasses: Array>, + vararg val kClassesVararg: KClass<*> +) + +@Anno(String::class, arrayOf(Int::class), Double::class) +fun foo() {} + +fun Anno.checkReference(expected: Any?, x: Anno.() -> Any?) { + assertEquals(expected, x()) +} + +fun Anno.checkReferenceArray(expected: Any?, x: Anno.() -> Array) { + assertEquals(expected, x()[0]) +} + +fun checkBoundReference(expected: Any?, x: () -> Any?) { + assertEquals(expected, x()) +} + +fun checkBoundReferenceArray(expected: Any?, x: () -> Array) { + assertEquals(expected, x()[0]) +} + +fun box(): String { + val k = ::foo.annotations.single() as Anno + k.checkReference(String::class, Anno::klass) + k.checkReferenceArray(Int::class, Anno::kClasses) + k.checkReferenceArray(Double::class, Anno::kClassesVararg) + + checkBoundReference(String::class, k::klass) + checkBoundReferenceArray(Int::class, k::kClasses) + checkBoundReferenceArray(Double::class, k::kClassesVararg) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/parameterNamesAndNullability.kt b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/parameterNamesAndNullability.kt new file mode 100644 index 0000000..6e0f1c2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/parameterNamesAndNullability.kt @@ -0,0 +1,45 @@ +package tests.lambdaClasses.parameterNamesAndNullability + +import kotlin.reflect.KParameter +import kotlin.reflect.jvm.reflect +import kotlin.test.assertEquals +import kotlin.test.assertNull + +fun lambda() { + val f = { x: Int, y: String? -> } + + val g = f.reflect()!! + + // TODO: maybe change this name + assertEquals("", g.name) + assertEquals(listOf("x", "y"), g.parameters.map { it.name }) + assertEquals(listOf(false, true), g.parameters.map { it.type.isMarkedNullable }) +} + +fun funExpr() { + val f = fun(x: Int, y: String?) {} + + val g = f.reflect()!! + + // TODO: maybe change this name + assertEquals("", g.name) + assertEquals(listOf("x", "y"), g.parameters.map { it.name }) + assertEquals(listOf(false, true), g.parameters.map { it.type.isMarkedNullable }) +} + +fun extensionFunExpr() { + val f = fun String.(): String = this + + val g = f.reflect()!! + + assertEquals(KParameter.Kind.EXTENSION_RECEIVER, g.parameters.single().kind) + assertEquals(null, g.parameters.single().name) +} + +fun box(): String { + lambda() + funExpr() + extensionFunExpr() + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt new file mode 100644 index 0000000..300b9a0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt @@ -0,0 +1,9 @@ +package tests.lambdaClasses.reflectOnDefaultWithInlineClassArgument + +import kotlin.reflect.jvm.reflect + +inline class C(val x: Int) + +fun C.f(x: (String) -> Unit = { OK: String -> }) = x.reflect()?.parameters?.singleOrNull()?.name + +fun box(): String = C(0).f() ?: "null" \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt new file mode 100644 index 0000000..3559e35 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt @@ -0,0 +1,11 @@ +package tests.lambdaClasses.reflectOnLambdaInArrayConstructor + +import kotlin.reflect.jvm.* +import kotlin.test.assertNotNull + +fun box(): String { + assertNotNull({}.reflect()) + assertNotNull(Array(1) { {} }.single().reflect()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInConstructor.kt new file mode 100644 index 0000000..85dbf5b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInConstructor.kt @@ -0,0 +1,15 @@ +package tests.lambdaClasses.reflectOnLambdaInConstructor + +import kotlin.reflect.jvm.reflect + +class C { + val o = { O: String -> } + val k = { K: String -> } + + constructor(y: Int) + constructor(y: String) +} + +fun box(): String = + (C(0).o.reflect()?.parameters?.singleOrNull()?.name ?: "null") + + (C("").k.reflect()?.parameters?.singleOrNull()?.name ?: "null") \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInField.kt b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInField.kt new file mode 100644 index 0000000..998b9da --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInField.kt @@ -0,0 +1,11 @@ +package tests.lambdaClasses.reflectOnLambdaInField + +import kotlin.reflect.jvm.reflect + +class C { + val x = { OK: String -> } +} + +fun box(): String { + return C().x.reflect()?.parameters?.singleOrNull()?.name ?: "null" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInStaticField.kt b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInStaticField.kt new file mode 100644 index 0000000..025a28d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInStaticField.kt @@ -0,0 +1,9 @@ +package tests.lambdaClasses.reflectOnLambdaInStaticField + +import kotlin.reflect.jvm.reflect + +val x = { OK: String -> } + +fun box(): String { + return x.reflect()?.parameters?.singleOrNull()?.name ?: "null" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnSuspendLambdaInField.kt b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnSuspendLambdaInField.kt new file mode 100644 index 0000000..14cfd84 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnSuspendLambdaInField.kt @@ -0,0 +1,11 @@ +package tests.lambdaClasses.reflectOnSuspendLambdaInField + +import kotlin.reflect.jvm.reflect + +class C { + val x: suspend (String) -> Unit = { OK: String -> } +} + +fun box(): String { + return C().x.reflect()?.parameters?.singleOrNull()?.name ?: "null" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt new file mode 100644 index 0000000..10324f3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt @@ -0,0 +1,33 @@ +package tests.mapping.constructor + +import kotlin.reflect.* +import kotlin.reflect.jvm.* + +class K { + class Nested + inner class Inner +} + +class Secondary { + constructor(x: Int) {} +} + +fun check(f: KFunction) { + assert(f.javaMethod == null) { "Fail f method" } + assert(f.javaConstructor != null) { "Fail f constructor" } + val c = f.javaConstructor!! + + assert(c.kotlinFunction != null) { "Fail m function" } + val ff = c.kotlinFunction!! + + assert(f == ff) { "Fail f != ff" } +} + +fun box(): String { + check(::K) + check(K::Nested) + check(K::Inner) + check(::Secondary) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt new file mode 100644 index 0000000..138c0e5 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt @@ -0,0 +1,31 @@ +package tests.mapping.extensionProperty + +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +class K(var value: Long) + +var K.ext: Double + get() = value.toDouble() + set(value) { + this.value = value.toLong() + } + +val fileFacadeClass = object {}::class.java.enclosingClass + +fun box(): String { + val p = K::ext + + val getter = p.javaGetter!! + val setter = p.javaSetter!! + + assertEquals(getter, fileFacadeClass.getMethod("getExt", K::class.java)) + assertEquals(setter, fileFacadeClass.getMethod("setExt", K::class.java, Double::class.java)) + + val k = K(42L) + assert(getter.invoke(null, k) == 42.0) { "Fail k getter" } + setter.invoke(null, k, -239.0) + assert(getter.invoke(null, k) == -239.0) { "Fail k setter" } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt new file mode 100644 index 0000000..c3187e2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt @@ -0,0 +1,29 @@ +package tests.mapping.functions + +import kotlin.reflect.* +import kotlin.reflect.jvm.* + +class K { + fun foo(s: String): Int = s.length +} +fun bar(s: String): Int = s.length +fun String.baz(): Int = this.length + +fun check(f: KFunction) { + assert(f.javaConstructor == null) { "Fail f constructor" } + assert(f.javaMethod != null) { "Fail f method" } + val m = f.javaMethod!! + + assert(m.kotlinFunction != null) { "Fail m function" } + val ff = m.kotlinFunction!! + + assert(f == ff) { "Fail f != ff" } +} + +fun box(): String { + check(K::foo) + check(::bar) + check(String::baz) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/inlineClassPrimaryVal.kt new file mode 100644 index 0000000..7db61d3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/inlineClassPrimaryVal.kt @@ -0,0 +1,38 @@ +package tests.mapping.inlineClasses.inlineClassPrimaryVal + +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +inline class Z1(val publicX: Int) { + companion object { + val publicXRef = Z1::publicX + val publicXBoundRef = Z1(42)::publicX + } +} + +inline class Z2(internal val internalX: Int) { + companion object { + val internalXRef = Z2::internalX + val internalXBoundRef = Z2(42)::internalX + } +} + +inline class Z3(private val privateX: Int) { + companion object { + val privateXRef = Z3::privateX + val privateXBoundRef = Z3(42)::privateX + } +} + +fun box(): String { + assertEquals("getPublicX", Z1.publicXRef.javaGetter!!.name) + assertEquals("getPublicX", Z1.publicXBoundRef.javaGetter!!.name) + + assertEquals(null, Z2.internalXRef.javaGetter) + assertEquals(null, Z2.internalXBoundRef.javaGetter) + + assertEquals(null, Z3.privateXRef.javaGetter) + assertEquals(null, Z3.privateXBoundRef.javaGetter) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt new file mode 100644 index 0000000..17dbbc2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt @@ -0,0 +1,45 @@ + +package tests.mapping.inlineClasses.suspendFunctionWithInlineClassInSignature + +import kotlin.reflect.* +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +inline class Z(val value: String) + +class S { + suspend fun consumeZ(z: Z) {} + suspend fun produceZ(): Z = Z("") + suspend fun consumeAndProduceZ(z: Z): Z = z +} + +fun box(): String { + val members = S::class.members.filterIsInstance>().associateBy(KFunction<*>::name) + + members["consumeZ"]!!.let { cz -> + val czj = cz.javaMethod!! + assertTrue(czj.name.startsWith("consumeZ-"), czj.name) + assertEquals("java.lang.String, kotlin.coroutines.Continuation", czj.parameterTypes.joinToString { it.name }) + val czjk = czj.kotlinFunction + assertEquals(cz, czjk) + } + + members["produceZ"]!!.let { pz -> + val pzj = pz.javaMethod!! + assertTrue(pzj.name.startsWith("produceZ-"), pzj.name) + assertEquals("kotlin.coroutines.Continuation", pzj.parameterTypes.joinToString { it.name }) + val pzjk = pzj!!.kotlinFunction + assertEquals(pz, pzjk) + } + + members["consumeAndProduceZ"]!!.let { cpz -> + val cpzj = cpz.javaMethod!! + assertTrue(cpzj.name.startsWith("consumeAndProduceZ-"), cpzj.name) + assertEquals("java.lang.String, kotlin.coroutines.Continuation", cpzj.parameterTypes.joinToString { it.name }) + val cpzjk = cpzj!!.kotlinFunction + assertEquals(cpz, cpzjk) + } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt new file mode 100644 index 0000000..ebf3993 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt @@ -0,0 +1,22 @@ +package tests.mapping.inlineReifiedFun + +import kotlin.reflect.* +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +inline fun f() = 1 + +fun g() {} + +class Foo { + inline fun h(t: T) = 1 +} + +fun box(): String { + assertEquals(::g as Any?, ::g.javaMethod!!.kotlinFunction) + + val h = Foo::class.members.single { it.name == "h" } as KFunction<*> + assertEquals(h, h.javaMethod!!.kotlinFunction as Any?) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/companionObjectFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/companionObjectFunction.kt new file mode 100644 index 0000000..e26f638 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/companionObjectFunction.kt @@ -0,0 +1,35 @@ +package tests.mapping.jvmStatic.companionObjectFunction + +import kotlin.reflect.KFunction +import kotlin.reflect.jvm.* +import kotlin.test.* + +class C { + companion object { + @JvmStatic + fun foo(s: String): Int = s.length + } +} + +fun box(): String { + val foo = C.Companion::class.members.single { it.name == "foo" } as KFunction<*> + + val j = foo.javaMethod ?: return "Fail: no Java method found for C::foo" + assertEquals(3, j.invoke(C, "abc")) + + val k = j.kotlinFunction ?: return "Fail: no Kotlin function found for Java method C::foo" + assertEquals(3, k.call(C, "def")) + + + val staticMethod = C::class.java.getDeclaredMethod("foo", String::class.java) + val k2 = staticMethod.kotlinFunction ?: + return "Fail: no Kotlin function found for static bridge for @JvmStatic method in companion object C::foo" + assertEquals(3, k2.call(C, "ghi")) + + assertFailsWith(NullPointerException::class) { k2.call(null, "")!! } + + val j2 = k2.javaMethod + assertEquals(j, j2) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/objectFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/objectFunction.kt new file mode 100644 index 0000000..02f5202 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/objectFunction.kt @@ -0,0 +1,22 @@ +package tests.mapping.jvmStatic.objectFunction + +import kotlin.reflect.KFunction +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +object O { + @JvmStatic + fun foo(s: String): Int = s.length +} + +fun box(): String { + val foo = O::class.members.single { it.name == "foo" } as KFunction<*> + + val j = foo.javaMethod ?: return "Fail: no Java method found for O::foo" + assertEquals(3, j.invoke(null, "abc")) + + val k = j.kotlinFunction ?: return "Fail: no Kotlin function found for Java method O::foo" + assertEquals(3, k.call(O, "def")) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt new file mode 100644 index 0000000..c94391e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt @@ -0,0 +1,30 @@ +package tests.mapping.lateinitProperty + +import kotlin.reflect.jvm.* +import kotlin.test.* + +class K { + lateinit var value: String +} + +fun box(): String { + val p = K::value + + assertNotNull(p.javaField, "Fail p field") + + val getter = p.javaGetter!! + val setter = p.javaSetter!! + + assertEquals(K::class.java.getMethod("getValue"), getter) + assertEquals(K::class.java.getMethod("setValue", String::class.java), setter) + + assertNull(p.getter.javaConstructor) + assertNull(p.setter.javaConstructor) + + val k = K() + assertFails("Fail k getter") { getter.invoke(k) } // lateinit not yet initialized + setter.invoke(k, "foo") + assertEquals("foo", getter.invoke(k), "Fail k setter") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/mappedClassIsEqualToClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/mappedClassIsEqualToClassLiteral.kt new file mode 100644 index 0000000..fd85f59 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/mappedClassIsEqualToClassLiteral.kt @@ -0,0 +1,14 @@ +package tests.mapping.mappedClassIsEqualToClassLiteral + +class A + +fun box(): String { + val a1 = A::class.java.kotlin + val a2 = A::class + + if (a1 != a2) return "Fail equals" + if (a1.hashCode() != a2.hashCode()) return "Fail hashCode" + if (a1.toString() != a2.toString()) return "Fail toString" + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt new file mode 100644 index 0000000..b006863 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt @@ -0,0 +1,28 @@ +package tests.mapping.memberProperty + +import kotlin.reflect.jvm.* +import kotlin.test.* + +class K(var value: Long) + +fun box(): String { + val p = K::value + + assertNotNull(p.javaField, "Fail p field") + + val getter = p.javaGetter!! + val setter = p.javaSetter!! + + assertEquals(K::class.java.getMethod("getValue"), getter) + assertEquals(K::class.java.getMethod("setValue", Long::class.java), setter) + + assertNull(p.getter.javaConstructor) + assertNull(p.setter.javaConstructor) + + val k = K(42L) + assertEquals(42L, getter.invoke(k), "Fail k getter") + setter.invoke(k, -239L) + assertEquals(-239L, getter.invoke(k), "Fail k setter") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt new file mode 100644 index 0000000..032c922 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt @@ -0,0 +1,26 @@ +package tests.mapping.methodsFromSuperInterface + +import kotlin.reflect.jvm.javaMethod +import kotlin.test.assertEquals + +interface A1 { + fun a1() +} + +interface A2 { + fun a2() +} + +interface B1 : A1 +interface B2 : A1, A2 + +interface C : B2 + +abstract class D : B1, C + +fun box(): String { + assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A1.a1()", D::a1.javaMethod!!.toString()) + assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A2.a2()", D::a2.javaMethod!!.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt new file mode 100644 index 0000000..0e15d7b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt @@ -0,0 +1,25 @@ +package tests.mapping.propertyAccessorsWithJvmName + +import kotlin.reflect.jvm.* + +var state: String = "value" + @JvmName("getter") + get + @JvmName("setter") + set + +fun box(): String { + val p = ::state + + if (p.name != "state") return "Fail name: ${p.name}" + if (p.get() != "value") return "Fail get: ${p.get()}" + p.set("OK") + + val getterName = p.javaGetter!!.getName() + if (getterName != "getter") return "Fail getter name: $getterName" + + val setterName = p.javaSetter!!.getName() + if (setterName != "setter") return "Fail setter name: $setterName" + + return p.get() +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt new file mode 100644 index 0000000..3a059a0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt @@ -0,0 +1,16 @@ +package tests.mapping.syntheticFields + +import kotlin.reflect.jvm.kotlinProperty + +enum class A { + // There's a synthetic field "$VALUES" here +} + +fun box(): String { + for (field in A::class.java.getDeclaredFields()) { + val prop = field.kotlinProperty + if (prop != null) return "Fail, property found: $prop" + } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt new file mode 100644 index 0000000..cf7ab36 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt @@ -0,0 +1,30 @@ +package tests.mapping.topLevelProperty + +import kotlin.reflect.jvm.* +import kotlin.test.* + +var topLevel = "123" + +val fileFacadeClass = object {}::class.java.enclosingClass + +fun box(): String { + val p = ::topLevel + + assertNotNull(p.javaField, "Fail p field") + assertEquals(p.javaField!!.getDeclaringClass(), fileFacadeClass) + + val getter = p.javaGetter!! + val setter = p.javaSetter!! + + assertEquals(fileFacadeClass.getMethod("getTopLevel"), getter) + assertEquals(fileFacadeClass.getMethod("setTopLevel", String::class.java), setter) + + assertNull(p.getter.javaConstructor) + assertNull(p.setter.javaConstructor) + + assertEquals("123", getter.invoke(null), "Fail k getter") + setter.invoke(null, "456") + assertEquals("456", getter.invoke(null), "Fail k setter") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/annotationConstructorParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/annotationConstructorParameters.kt new file mode 100644 index 0000000..8acc220 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/annotationConstructorParameters.kt @@ -0,0 +1,47 @@ +package tests.mapping.types.annotationConstructorParameters + +import java.lang.reflect.GenericArrayType +import java.lang.reflect.ParameterizedType +import kotlin.reflect.KClass +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +annotation class Z +enum class E + +annotation class Anno( + val b: Byte, + val s: String, + val ss: Array, + val z: Z, + val zs: Array, + val e: E, + val es: Array, + val k: KClass<*>, + val ka: Array> +) + +fun tmp(): Array> = null!! + +fun box(): String { + val t = Anno::class.constructors.single().parameters.map { it.type.javaType } + + assertEquals(Byte::class.java, t[0]) + assertEquals(String::class.java, t[1]) + assertEquals(Array::class.java, t[2]) + assertEquals(Z::class.java, t[3]) + assertEquals(Array::class.java, t[4]) + assertEquals(E::class.java, t[5]) + assertEquals(Array::class.java, t[6]) + + assertTrue(t[7] is ParameterizedType) + assertEquals(Class::class.java, (t[7] as ParameterizedType).rawType) + + assertTrue(t[8] is GenericArrayType) + val e = (t[8] as GenericArrayType).genericComponentType + assertTrue(e is ParameterizedType) + assertEquals(Class::class.java, (e as ParameterizedType).rawType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt new file mode 100644 index 0000000..cb1d470 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt @@ -0,0 +1,30 @@ +package tests.mapping.types.array + +import java.lang.reflect.GenericArrayType +import java.lang.reflect.TypeVariable +import java.lang.reflect.ParameterizedType +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +fun foo(strings: Array, integers: Array, objectArrays: Array>) {} + +fun bar(): Array> = null!! +class A { + fun baz(): Array = null!! +} + +fun box(): String { + assertEquals(Array::class.java, ::foo.parameters[0].type.javaType) + assertEquals(Array::class.java, ::foo.parameters[1].type.javaType) + assertEquals(Array>::class.java, ::foo.parameters[2].type.javaType) + + val g = ::bar.returnType.javaType + if (g !is GenericArrayType || g.genericComponentType !is ParameterizedType) + return "Fail: should be array of parameterized type, but was $g (${g.javaClass})" + + val h = A::baz.returnType.javaType + if (h !is GenericArrayType || h.genericComponentType !is TypeVariable<*>) + return "Fail: should be array of type variable, but was $h (${h.javaClass})" + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt new file mode 100644 index 0000000..ac9fe0b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt @@ -0,0 +1,25 @@ +package tests.mapping.types.constructors + +import kotlin.reflect.* +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +class A(d: Double, s: String, parent: A?) { + class Nested(a: A) + inner class Inner(nested: Nested) +} + +enum class E(val i: Int) { ENTRY(1) } + +fun box(): String { + assertEquals(listOf(java.lang.Double.TYPE, String::class.java, A::class.java), ::A.parameters.map { it.type.javaType }) + assertEquals(listOf(A::class.java), A::Nested.parameters.map { it.type.javaType }) + assertEquals(listOf(A::class.java, A.Nested::class.java), A::Inner.parameters.map { it.type.javaType }) + assertEquals(listOf(java.lang.Integer.TYPE), E::class.constructors.single().parameters.map { it.type.javaType }) + + assertEquals(A::class.java, ::A.returnType.javaType) + assertEquals(A.Nested::class.java, A::Nested.returnType.javaType) + assertEquals(A.Inner::class.java, A::Inner.returnType.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt new file mode 100644 index 0000000..f2ac8b0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt @@ -0,0 +1,33 @@ +package tests.mapping.types.genericArrayElementType + +import java.lang.reflect.ParameterizedType +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class Bar +fun arrayOfInvBar(): Array = null!! +fun arrayOfInBar(): Array = null!! +fun arrayOfOutBar(): Array = null!! + +fun arrayOfInvList(): Array> = null!! +fun arrayOfInList(): Array> = null!! +fun arrayOfOutList(): Array> = null!! + +fun box(): String { + // NB: in "Array", Java type of X is always Any::class.java because this is the JVM signature generated by the compiler + + assertEquals(Bar::class.java, ::arrayOfInvBar.returnType.arguments.single().type!!.javaType) + assertEquals(Any::class.java, ::arrayOfInBar.returnType.arguments.single().type!!.javaType) + assertEquals(Bar::class.java, ::arrayOfOutBar.returnType.arguments.single().type!!.javaType) + + val invList = ::arrayOfInvList.returnType.arguments.single().type!!.javaType + assertTrue(invList is ParameterizedType && invList.rawType == List::class.java, invList.toString()) + + assertEquals(Any::class.java, ::arrayOfInList.returnType.arguments.single().type!!.javaType) + + val outList = ::arrayOfOutList.returnType.arguments.single().type!!.javaType + assertTrue(outList is ParameterizedType && outList.rawType == List::class.java, outList.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassInSignature.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassInSignature.kt new file mode 100644 index 0000000..ad70ce5 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassInSignature.kt @@ -0,0 +1,26 @@ +package tests.mapping.types.inlineClassInSignature + +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +inline class S(val value: String) + +fun S.foo(x: Int, s: S): S = this + +/* TODO: Support calling members of inline classes in reflection (KT-26748) +inline class T(val s: S) { + fun bar(u: S): T = this +} +*/ + +fun box(): String { + assertEquals(listOf(String::class.java, Int::class.java, String::class.java), S::foo.parameters.map { it.type.javaType }) + assertEquals(String::class.java, S::foo.returnType.javaType) + +/* + assertEquals(listOf(), T::bar.parameters.map { it.type.javaType }) + assertEquals(String::class.java, T::bar.returnType.javaType) +*/ + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassPrimaryVal.kt new file mode 100644 index 0000000..27ba083 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassPrimaryVal.kt @@ -0,0 +1,59 @@ +package tests.mapping.types.inlineClassPrimaryVal + +import kotlin.reflect.KCallable +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +inline class Z1(val publicX: Int) { + companion object { + val publicXRef = Z1::publicX + val publicXBoundRef = Z1(42)::publicX + } +} + +inline class Z2(internal val internalX: Int) { + companion object { + val internalXRef = Z2::internalX + val internalXBoundRef = Z2(42)::internalX + } +} + +inline class Z3(private val privateX: Int) { + companion object { + val privateXRef = Z3::privateX + val privateXBoundRef = Z3(42)::privateX + } +} + +inline class ZZ(val x: Z1) + +fun KCallable<*>.getJavaTypesOfParams() = parameters.map { it.type.javaType }.toString() +fun KCallable<*>.getJavaTypeOfResult() = returnType.javaType.toString() + +fun box(): String { + assertEquals("[class tests.mapping.types.inlineClassPrimaryVal.Z1]", Z1.publicXRef.getJavaTypesOfParams()) + assertEquals("int", Z1.publicXRef.getJavaTypeOfResult()) + + assertEquals("[]", Z1.publicXBoundRef.getJavaTypesOfParams()) + assertEquals("int", Z1.publicXBoundRef.getJavaTypeOfResult()) + + assertEquals("[class tests.mapping.types.inlineClassPrimaryVal.Z2]", Z2.internalXRef.getJavaTypesOfParams()) + assertEquals("int", Z2.internalXRef.getJavaTypeOfResult()) + + assertEquals("[]", Z2.internalXBoundRef.getJavaTypesOfParams()) + assertEquals("int", Z2.internalXBoundRef.getJavaTypeOfResult()) + + assertEquals("[class tests.mapping.types.inlineClassPrimaryVal.Z3]", Z3.privateXRef.getJavaTypesOfParams()) + assertEquals("int", Z3.privateXRef.getJavaTypeOfResult()) + + assertEquals("[]", Z3.privateXBoundRef.getJavaTypesOfParams()) + assertEquals("int", Z3.privateXBoundRef.getJavaTypeOfResult()) + + + assertEquals("[class tests.mapping.types.inlineClassPrimaryVal.ZZ]", ZZ::x.getJavaTypesOfParams()) + + // KT-28170 + assertEquals("int", ZZ::x.getJavaTypeOfResult()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/innerGenericTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/innerGenericTypeArgument.kt new file mode 100644 index 0000000..ec668f9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/innerGenericTypeArgument.kt @@ -0,0 +1,31 @@ +package tests.mapping.types.innerGenericTypeArgument + +// "IOOBE: Invalid index 4, size is 4" for java.lang.reflect.ParameterizedType on Android + + +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals + +class Outer { + inner class Inner { + inner class Innermost + } +} + +fun foo(): Outer.Inner.Innermost = null!! + +fun box(): String { + assertEquals( + listOf( + Any::class.java, + Any::class.java, + String::class.java, + Float::class.javaObjectType, + Int::class.javaObjectType, + Number::class.java + ), + ::foo.returnType.arguments.map { it.type!!.javaType } + ) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt new file mode 100644 index 0000000..8463c79 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt @@ -0,0 +1,25 @@ +package tests.mapping.types.memberFunctions + +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals + +class A { + fun foo(t: Long?): Long = t!! +} + +object O { + @JvmStatic + fun bar(a: A): String = "" +} + +fun box(): String { + val foo = A::foo + assertEquals(listOf(A::class.java, java.lang.Long::class.java), foo.parameters.map { it.type.javaType }) + assertEquals(java.lang.Long.TYPE, foo.returnType.javaType) + + val bar = O::class.members.single { it.name == "bar" } + assertEquals(listOf(O::class.java, A::class.java), bar.parameters.map { it.type.javaType }) + assertEquals(String::class.java, bar.returnType.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/overrideAnyWithPrimitive.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/overrideAnyWithPrimitive.kt new file mode 100644 index 0000000..0482b53 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/overrideAnyWithPrimitive.kt @@ -0,0 +1,25 @@ +package tests.mapping.types.overrideAnyWithPrimitive + +import kotlin.reflect.jvm.* +import kotlin.test.* + +interface I { + fun foo(): Any +} + +class A : I { + override fun foo(): Int = 0 + fun bar(x: Long): Int = x.toInt() +} + +fun box(): String { + assertEquals(Integer::class.java, A::foo.returnType.javaType) + assertNotEquals(Integer.TYPE, A::foo.returnType.javaType) + + assertNotEquals(Integer::class.java, A::bar.returnType.javaType) + assertEquals(Integer.TYPE, A::bar.returnType.javaType) + + assertEquals(java.lang.Long.TYPE, A::bar.parameters.last().type.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt new file mode 100644 index 0000000..079ab0c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt @@ -0,0 +1,22 @@ +package tests.mapping.types.parameterizedTypeArgument + +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals + +fun listOfStrings(): List = null!! + +class Foo +class Bar +fun fooOfInvBar(): Foo = null!! +fun fooOfInBar(): Foo = null!! +fun fooOfOutBar(): Foo = null!! + +fun box(): String { + assertEquals(String::class.java, ::listOfStrings.returnType.arguments.single().type!!.javaType) + + assertEquals(Bar::class.java, ::fooOfInvBar.returnType.arguments.single().type!!.javaType) + assertEquals(Bar::class.java, ::fooOfInBar.returnType.arguments.single().type!!.javaType) + assertEquals(Bar::class.java, ::fooOfOutBar.returnType.arguments.single().type!!.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt new file mode 100644 index 0000000..c834ec0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt @@ -0,0 +1,41 @@ +package tests.mapping.types.parameterizedTypes + +import java.lang.reflect.ParameterizedType +import kotlin.reflect.* +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals + +class A(private var foo: List) + +object O { + @JvmStatic + private var bar: List = listOf() +} + +fun topLevel(): List = listOf() +fun Any.extension(): List = listOf() + +fun assertGenericType(type: KType) { + val javaType = type.javaType + if (javaType !is ParameterizedType) { + throw AssertionError("Type should be a parameterized type, but was $javaType (${javaType.javaClass})") + } +} + +fun box(): String { + val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*> + assertGenericType(foo.returnType) + assertGenericType(foo.getter.returnType) + assertGenericType(foo.setter.parameters.last().type) + + val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*> + assertGenericType(bar.returnType) + assertGenericType(bar.getter.returnType) + assertGenericType(bar.setter.parameters.last().type) + + assertGenericType(::topLevel.returnType) + assertGenericType(Any::extension.returnType) + assertGenericType(::A.parameters.single().type) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt new file mode 100644 index 0000000..cb0c3d8 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt @@ -0,0 +1,26 @@ +package tests.mapping.types.propertyAccessors + +import kotlin.reflect.KMutableProperty +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals + +class A(private var foo: String) + +object O { + @JvmStatic + private var bar: String = "" +} + +fun box(): String { + val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*> + assertEquals(listOf(A::class.java), foo.parameters.map { it.type.javaType }) + assertEquals(listOf(A::class.java), foo.getter.parameters.map { it.type.javaType }) + assertEquals(listOf(A::class.java, String::class.java), foo.setter.parameters.map { it.type.javaType }) + + val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*> + assertEquals(listOf(O::class.java), bar.parameters.map { it.type.javaType }) + assertEquals(listOf(O::class.java), bar.getter.parameters.map { it.type.javaType }) + assertEquals(listOf(O::class.java, String::class.java), bar.setter.parameters.map { it.type.javaType }) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt new file mode 100644 index 0000000..cccc70b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt @@ -0,0 +1,30 @@ +package tests.mapping.types.supertypes + +import java.lang.reflect.ParameterizedType +import java.lang.reflect.TypeVariable +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.test.fail + +open class Klass +interface Interface +interface Interface2 + +class A : Interface, Klass(), Interface2 + +fun box(): String { + val (i, k, i2) = A::class.supertypes.map { it.javaType } + + i as? ParameterizedType ?: fail("Not a parameterized type: $i") + assertEquals(Interface::class.java, i.rawType) + val args = i.actualTypeArguments + assertEquals(String::class.java, args[0], "Not String: ${args[0]}") + assertTrue(args[1].let { it is TypeVariable<*> && it.name == "Z" && it.genericDeclaration == A::class.java }, "Not Z: ${args[1]}") + + assertEquals(Klass::class.java, k) + + assertEquals(Interface2::class.java, i2) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/suspendFun.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/suspendFun.kt new file mode 100644 index 0000000..1ef0347 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/suspendFun.kt @@ -0,0 +1,15 @@ +package tests.mapping.types.suspendFun + +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals + +interface A { + suspend fun f(param: String): MutableList +} + +fun box(): String { + val type = A::class.members.single { it.name == "f" }.returnType.javaType + assertEquals("java.util.List", type.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt new file mode 100644 index 0000000..e0e0fe7 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt @@ -0,0 +1,17 @@ +package tests.mapping.types.topLevelFunctions + +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +fun free(s: String): Int = s.length + +fun Any.extension() {} + +fun box(): String { + assertEquals(java.lang.Integer.TYPE, ::free.returnType.javaType) + assertEquals(String::class.java, ::free.parameters.single().type.javaType) + + assertEquals(Any::class.java, Any::extension.parameters.single().type.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt new file mode 100644 index 0000000..6f913ae --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt @@ -0,0 +1,23 @@ +package tests.mapping.types.typeParameters + +import java.lang.reflect.TypeVariable +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +class A { + fun foo(t: T) {} +} + +fun box(): String { + val f = A::foo + val t = f.parameters.last().type.javaType + if (t !is TypeVariable<*>) return "Fail, t should be a type variable: $t" + + assertEquals("T", t.name) + assertEquals(A::class.java, (t.genericDeclaration as Class<*>)) + + val tp = A::class.typeParameters + assertEquals(CharSequence::class.java, tp.single().upperBounds.single().javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt new file mode 100644 index 0000000..b74846e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt @@ -0,0 +1,23 @@ +package tests.mapping.types.unit + +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +fun foo(unitParam: Unit, nullableUnitParam: Unit?): Unit {} + +var bar: Unit = Unit + +fun box(): String { + assert(Unit::class.java != java.lang.Void.TYPE) + + assertEquals(Unit::class.java, ::foo.parameters[0].type.javaType) + assertEquals(Unit::class.java, ::foo.parameters[1].type.javaType) + assertEquals(java.lang.Void.TYPE, ::foo.returnType.javaType) + + assertEquals(Unit::class.java, ::bar.returnType.javaType) + assertEquals(Unit::class.java, ::bar.getter.returnType.javaType) + assertEquals(Unit::class.java, ::bar.setter.parameters.single().type.javaType) + assertEquals(java.lang.Void.TYPE, ::bar.setter.returnType.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt new file mode 100644 index 0000000..2d4355f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt @@ -0,0 +1,29 @@ +package tests.methodsFromAny.adaptedCallableReferencesNotEqualToCallablesFromAPI + +import kotlin.reflect.* +import kotlin.test.assertNotEquals + +class A { + fun foo(s: String = "", vararg xs: Long): String = "foo" +} + +fun checkNotEqual(x: Any, y: Any) { + assertNotEquals(x, y) + assertNotEquals(y, x) +} + +fun coercionToUnit(f: (A, String, LongArray) -> Unit): Any = f +fun varargToElement(f: (A, String, Long, Long) -> String): Any = f +fun defaultAndVararg(f: (A) -> String): Any = f +fun allOfTheAbove(f: (A) -> Unit): Any = f + +fun box(): String { + val foo = A::class.members.single { it.name == "foo" } + + checkNotEqual(coercionToUnit(A::foo), foo) + checkNotEqual(varargToElement(A::foo), foo) + checkNotEqual(defaultAndVararg(A::foo), foo) + checkNotEqual(allOfTheAbove(A::foo), foo) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/builtinFunctionsToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/builtinFunctionsToString.kt new file mode 100644 index 0000000..17267be --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/builtinFunctionsToString.kt @@ -0,0 +1,23 @@ +package tests.methodsFromAny.builtinFunctionsToString + +import kotlin.test.assertEquals +import java.util.* + +fun assertToString(s: String, x: Any) { + assertEquals(s, x.toString()) +} + +fun box(): String { + assertToString("fun kotlin.collections.Map.getOrDefault(K, V): V", Map<*, *>::getOrDefault) + assertToString("fun java.util.HashMap.getOrDefault(K, V): V", HashMap<*, *>::getOrDefault) + + // TODO: uncomment once KT-11754 is fixed + // assertToString("", MutableList<*>::removeAt) + + assertToString("fun kotlin.collections.Collection.contains(E): kotlin.Boolean", Collection<*>::contains) + assertToString("fun kotlin.collections.Set.contains(E): kotlin.Boolean", Set<*>::contains) + + assertToString("fun kotlin.collections.Collection.isEmpty(): kotlin.Boolean", Collection<*>::isEmpty) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt new file mode 100644 index 0000000..677fee0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt @@ -0,0 +1,22 @@ +package tests.methodsFromAny.callableReferencesEqualToCallablesFromAPI + +import kotlin.reflect.* +import kotlin.test.assertEquals + +class A { + fun foo() = "foo" + val bar = "bar" +} + +fun checkEqual(x: Any, y: Any) { + assertEquals(x, y) + assertEquals(y, x) + assertEquals(x.hashCode(), y.hashCode()) +} + +fun box(): String { + checkEqual(A::foo, A::class.members.single { it.name == "foo" }) + checkEqual(A::bar, A::class.members.single { it.name == "bar" }) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/classToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/classToString.kt new file mode 100644 index 0000000..ce06e2a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/classToString.kt @@ -0,0 +1,31 @@ + +package tests.methodsFromAny.classToString + +import kotlin.test.* + +class A { + class Nested + + companion object +} + +fun box(): String { + assertEquals("class tests.methodsFromAny.classToString.A", "${A::class}") + assertEquals("class tests.methodsFromAny.classToString.A\$Nested", "${A.Nested::class}") + assertEquals("class tests.methodsFromAny.classToString.A\$Companion", "${A.Companion::class}") + + assertEquals("class kotlin.Any", "${Any::class}") + assertEquals("class kotlin.Int", "${Int::class}") + assertEquals("class kotlin.Int\$Companion", "${Int.Companion::class}") + assertEquals("class kotlin.IntArray", "${IntArray::class}") + assertEquals("class kotlin.String", "${String::class}") + assertEquals("class kotlin.String", "${java.lang.String::class}") + + assertEquals("class kotlin.Array", "${Array::class}") + assertEquals("class kotlin.Array", "${Array::class}") + assertEquals("class kotlin.Array", "${Array>::class}") + + assertEquals("class java.lang.Runnable", "${Runnable::class}") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/extensionPropertyReceiverToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/extensionPropertyReceiverToString.kt new file mode 100644 index 0000000..8f717ea --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/extensionPropertyReceiverToString.kt @@ -0,0 +1,88 @@ +package tests.methodsFromAny.extensionPropertyReceiverToString + +import kotlin.reflect.KProperty1 +import kotlin.test.assertEquals + +fun check(expected: String, p: KProperty1<*, *>) { + var s = p.toString() + + // Strip "val" or "var" + assert(s.startsWith("val ") || s.startsWith("var ")) { "Fail val/var: $s" } + s = s.substring(4) + + // Strip property type + s = s.substringBeforeLast(':') + + // Strip property name, leave only receiver class + s = s.substringBeforeLast('.') + + assertEquals(expected, s) +} + +val Boolean.x: Any get() = this +val Char.x: Any get() = this +val Byte.x: Any get() = this +val Short.x: Any get() = this +val Int.x: Any get() = this +val Float.x: Any get() = this +val Long.x: Any get() = this +val Double.x: Any get() = this + +val BooleanArray.x: Any get() = this +val CharArray.x: Any get() = this +val ByteArray.x: Any get() = this +val ShortArray.x: Any get() = this +val IntArray.x: Any get() = this +val FloatArray.x: Any get() = this +val LongArray.x: Any get() = this +val DoubleArray.x: Any get() = this + +val Array.a1: Any get() = this +val Array.a2: Any get() = this +val Array>.a3: Any get() = this +val Array.a4: Any get() = this + +val Any?.n1: Any get() = Any() +val Int?.n2: Any get() = Any() +val Array?.n3: Any get() = Any() +val Array.n4: Any get() = Any() +val Array?.n5: Any get() = Any() + +val Map.m: Any get() = this +val List>>.l: Any get() = this + +fun box(): String { + check("kotlin.Boolean", Boolean::x) + check("kotlin.Char", Char::x) + check("kotlin.Byte", Byte::x) + check("kotlin.Short", Short::x) + check("kotlin.Int", Int::x) + check("kotlin.Float", Float::x) + check("kotlin.Long", Long::x) + check("kotlin.Double", Double::x) + + check("kotlin.BooleanArray", BooleanArray::x) + check("kotlin.CharArray", CharArray::x) + check("kotlin.ByteArray", ByteArray::x) + check("kotlin.ShortArray", ShortArray::x) + check("kotlin.IntArray", IntArray::x) + check("kotlin.FloatArray", FloatArray::x) + check("kotlin.LongArray", LongArray::x) + check("kotlin.DoubleArray", DoubleArray::x) + + check("kotlin.Any?", Any?::n1) + check("kotlin.Int?", Int?::n2) + check("kotlin.Array?", Array?::n3) + check("kotlin.Array", Array::n4) + check("kotlin.Array?", Array?::n5) + + check("kotlin.Array", Array::a1) + check("kotlin.Array", Array::a2) + check("kotlin.Array>", Array>::a3) + check("kotlin.Array", Array::a4) + + check("kotlin.collections.Map", Map::m) + check("kotlin.collections.List>>", List>>::l) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideEqualsHashCode.kt new file mode 100644 index 0000000..b2b0fd6 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideEqualsHashCode.kt @@ -0,0 +1,24 @@ +package tests.methodsFromAny.fakeOverrideEqualsHashCode + +import kotlin.test.assertNotEquals + +open class A { + fun foo(t: T) {} +} + +open class B : A() + +class C : B() + +fun box(): String { + val afoo = A::class.members.single { it.name == "foo" } + val bfoo = B::class.members.single { it.name == "foo" } + val cfoo = C::class.members.single { it.name == "foo" } + + assertNotEquals(afoo, bfoo) + assertNotEquals(afoo.hashCode(), bfoo.hashCode()) + assertNotEquals(bfoo, cfoo) + assertNotEquals(bfoo.hashCode(), cfoo.hashCode()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString.kt new file mode 100644 index 0000000..59cd5be --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString.kt @@ -0,0 +1,26 @@ +package tests.methodsFromAny.fakeOverrideToString + +import kotlin.test.assertEquals + +open class A { + fun foo(t: T) {} +} + +open class B : A() + +class C : B() + +fun box(): String { + assertEquals("fun tests.methodsFromAny.fakeOverrideToString.A.foo(T): kotlin.Unit", A::foo.toString()) + assertEquals("fun tests.methodsFromAny.fakeOverrideToString.B.foo(U): kotlin.Unit", B::foo.toString()) + assertEquals("fun tests.methodsFromAny.fakeOverrideToString.C.foo(kotlin.String): kotlin.Unit", C::foo.toString()) + + val afoo = A::class.members.single { it.name == "foo" } + assertEquals("fun tests.methodsFromAny.fakeOverrideToString.A.foo(T): kotlin.Unit", afoo.toString()) + val bfoo = B::class.members.single { it.name == "foo" } + assertEquals("fun tests.methodsFromAny.fakeOverrideToString.B.foo(U): kotlin.Unit", bfoo.toString()) + val cfoo = C::class.members.single { it.name == "foo" } + assertEquals("fun tests.methodsFromAny.fakeOverrideToString.C.foo(kotlin.String): kotlin.Unit", cfoo.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString2.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString2.kt new file mode 100644 index 0000000..e1fa588 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString2.kt @@ -0,0 +1,32 @@ +package tests.methodsFromAny.fakeOverrideToString2 + +import kotlin.test.assertEquals + +interface I1 { + fun f() + val x: Int +} + +interface I2 { + fun f() + val x: Int +} + +interface I3 { + fun f() + val x: Int +} + +interface I : I2, I1, I3 + +fun box(): String { + assertEquals("fun tests.methodsFromAny.fakeOverrideToString2.I.f(): kotlin.Unit", I::f.toString()) + assertEquals("val tests.methodsFromAny.fakeOverrideToString2.I.x: kotlin.Int", I::x.toString()) + + val f = I::class.members.single { it.name == "f" } + assertEquals("fun tests.methodsFromAny.fakeOverrideToString2.I.f(): kotlin.Unit", f.toString()) + val x = I::class.members.single { it.name == "x" } + assertEquals("val tests.methodsFromAny.fakeOverrideToString2.I.x: kotlin.Int", x.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionEqualsHashCode.kt new file mode 100644 index 0000000..68fde69 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionEqualsHashCode.kt @@ -0,0 +1,33 @@ +package tests.methodsFromAny.functionEqualsHashCode + +import kotlin.test.* + +fun top() = 42 + +fun Int.intExt(): Int = this + +class A { + fun mem() {} +} + +class B { + fun mem() {} +} + + +fun checkEqual(x: Any, y: Any) { + assertEquals(x, y) + assertEquals(x.hashCode(), y.hashCode(), "Elements are equal but their hash codes are not: ${x.hashCode()} != ${y.hashCode()}") +} + +fun box(): String { + checkEqual(::top, ::top) + checkEqual(Int::intExt, Int::intExt) + checkEqual(A::mem, A::mem) + + assertFalse(::top == Int::intExt) + assertFalse(::top == A::mem) + assertFalse(A::mem == B::mem) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibMultiFileFacade.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibMultiFileFacade.kt new file mode 100644 index 0000000..a6865af --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibMultiFileFacade.kt @@ -0,0 +1,16 @@ +package tests.methodsFromAny.functionFromStdlibMultiFileFacade + +// KT-12630 KotlinReflectionInternalError on referencing some functions from stdlib + + +import kotlin.test.* + +fun box(): String { + val asIterable = List::asIterable + assertEquals("fun kotlin.collections.Iterable.asIterable(): kotlin.collections.Iterable", asIterable.toString()) + + val lazyOf: (String) -> Lazy = ::lazyOf + assertEquals("fun lazyOf(T): kotlin.Lazy", lazyOf.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibSingleFileFacade.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibSingleFileFacade.kt new file mode 100644 index 0000000..f4b7ad4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibSingleFileFacade.kt @@ -0,0 +1,13 @@ +package tests.methodsFromAny.functionFromStdlibSingleFileFacade + +// KT-12630 KotlinReflectionInternalError on referencing some functions from stdlib + + +import kotlin.test.* + +fun box(): String { + val hashCode = Any?::hashCode + assertEquals("fun kotlin.Any?.hashCode(): kotlin.Int", hashCode.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionToString.kt new file mode 100644 index 0000000..f10e9dd --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionToString.kt @@ -0,0 +1,26 @@ + + +package tests.methodsFromAny.functionToString + +import kotlin.test.assertEquals + +fun top() = 42 + +fun String.ext(): Int = 0 +fun IntRange?.ext2(): Array = arrayOfNulls(0) + +class A { + fun mem(): String = "" +} + +fun assertToString(s: String, x: Any) { + assertEquals(s, x.toString()) +} + +fun box(): String { + assertToString("fun top(): kotlin.Int", ::top) + assertToString("fun kotlin.String.ext(): kotlin.Int", String::ext) + assertToString("fun kotlin.ranges.IntRange?.ext2(): kotlin.Array", IntRange::ext2) + assertToString("fun tests.methodsFromAny.functionToString.A.mem(): kotlin.String", A::mem) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsHashCode.kt new file mode 100644 index 0000000..dac4e93 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsHashCode.kt @@ -0,0 +1,28 @@ +package tests.methodsFromAny.parametersEqualsHashCode + +import kotlin.test.* + +class A { + fun foo(s: String, x: Int) {} + fun bar(x: Int) {} + val baz = 42 +} + +fun box(): String { + // Dispatch receiver parameters of different callables are not equal + assertNotEquals(A::foo.parameters[0], A::bar.parameters[0]) + assertNotEquals(A::foo.parameters[0], A::baz.parameters[0]) + + assertNotEquals(A::foo.parameters[1], A::bar.parameters[1]) + assertNotEquals(A::foo.parameters[1], A::foo.parameters[2]) + assertNotEquals(A::bar.parameters[1], A::foo.parameters[2]) + + assertEquals(A::foo.parameters[0], A::foo.parameters[0]) + assertEquals(A::foo.parameters[0].hashCode(), A::foo.parameters[0].hashCode()) + assertEquals(A::foo.parameters[1], A::foo.parameters[1]) + assertEquals(A::foo.parameters[1].hashCode(), A::foo.parameters[1].hashCode()) + assertEquals(A::bar.parameters[0], A::bar.parameters[0]) + assertEquals(A::bar.parameters[0].hashCode(), A::bar.parameters[0].hashCode()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsWithClearCaches.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsWithClearCaches.kt new file mode 100644 index 0000000..bf15ff0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsWithClearCaches.kt @@ -0,0 +1,46 @@ +package tests.methodsFromAny.parametersEqualsWithClearCaches + +// FILE: box.kt + +import kotlin.reflect.KMutableProperty +import kotlin.test.assertEquals + +inline fun check(message: String, generate: () -> Any?) { + val x1: Any? + val x2: Any? + try { + x1 = generate() + + // Force clear the internal maps, as if the weak values in them are garbage-collected. + kotlin.reflect.jvm.internal.ReflectionFactoryImpl.clearCaches() + + x2 = generate() + } catch (e: Throwable) { + throw AssertionError("Fail $message", e) + } + + assertEquals(x1, x2, "Fail equals $message") + assertEquals(x2, x1, "Fail equals $message") + assertEquals(x1.hashCode(), x2.hashCode(), "Fail hashCode $message") +} + +class C(c: Any) { + fun Any.a(a: Any): Any = a + + var X.x: X + get() = this + set(value) {} +} + +fun box(): String { + check("constructor parameter") { C::class.constructors.single().parameters.single() } + check("instance parameter") { C::class.members.single { it.name == "a" }.parameters[0] } + check("value parameter") { C::class.members.single { it.name == "a" }.parameters[1] } + + check("extension receiver parameter") { (C::class.members.single { it.name == "x" } as KMutableProperty<*>).parameters[1] } + + // TODO: depends on KT-13490 + // check("property setter parameter") { (C::class.members.single { it.name == "x" } as KMutableProperty<*>).setter.parameters[2] } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersToString.kt new file mode 100644 index 0000000..1ecad24 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersToString.kt @@ -0,0 +1,30 @@ +package tests.methodsFromAny.parametersToString + +import kotlin.test.* + +fun Int.foo(s: String) {} + +class A { + fun bar() {} +} + +fun baz(name: String) {} + +fun box(): String { + assertEquals( + listOf("extension receiver parameter of ${Int::foo}", "parameter #1 s of ${Int::foo}"), + Int::foo.parameters.map(Any::toString) + ) + + assertEquals( + listOf("instance parameter of ${A::bar}"), + A::bar.parameters.map(Any::toString) + ) + + assertEquals( + listOf("parameter #0 name of ${::baz}"), + ::baz.parameters.map(Any::toString) + ) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyEqualsHashCode.kt new file mode 100644 index 0000000..8912f97 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyEqualsHashCode.kt @@ -0,0 +1,31 @@ +package tests.methodsFromAny.propertyEqualsHashCode + +import kotlin.test.* + +val top = 42 +var top2 = -23 + +val Int.intExt: Int get() = this +val Char.charExt: Int get() = this.toInt() + +class A(var mem: String) +class B(var mem: String) + + +fun checkEqual(x: Any, y: Any) { + assertEquals(x, y) + assertEquals(x.hashCode(), y.hashCode(), "Elements are equal but their hash codes are not: ${x.hashCode()} != ${y.hashCode()}") +} + +fun box(): String { + checkEqual(::top, ::top) + checkEqual(::top2, ::top2) + checkEqual(Int::intExt, Int::intExt) + checkEqual(A::mem, A::mem) + + assertFalse(::top == ::top2) + assertFalse(Int::intExt == Char::charExt) + assertFalse(A::mem == B::mem) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyToString.kt new file mode 100644 index 0000000..28f43f9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyToString.kt @@ -0,0 +1,34 @@ + + +package tests.methodsFromAny.propertyToString + +import kotlin.test.assertEquals + +val top = 42 +var top2 = -23 + +val String.ext: Int get() = 0 +var IntRange?.ext2: Int get() = 0; set(value) {} + +class A(val mem: String) +class B(var mem: String) + +fun assertToString(s: String, x: Any) { + assertEquals(s, x.toString()) +} + +fun box(): String { + assertToString("val top: kotlin.Int", ::top) + assertToString("var top2: kotlin.Int", ::top2) + assertToString("val kotlin.String.ext: kotlin.Int", String::ext) + assertToString("var kotlin.ranges.IntRange?.ext2: kotlin.Int", IntRange::ext2) + assertToString("val tests.methodsFromAny.propertyToString.A.mem: kotlin.String", A::mem) + assertToString("var tests.methodsFromAny.propertyToString.B.mem: kotlin.String", B::mem) + assertToString("getter of val top: kotlin.Int", ::top.getter) + assertToString("getter of var top2: kotlin.Int", ::top2.getter) + assertToString("setter of var top2: kotlin.Int", ::top2.setter) + assertToString("getter of val tests.methodsFromAny.propertyToString.A.mem: kotlin.String", A::mem.getter) + assertToString("getter of var tests.methodsFromAny.propertyToString.B.mem: kotlin.String", B::mem.getter) + assertToString("setter of var tests.methodsFromAny.propertyToString.B.mem: kotlin.String", B::mem.setter) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeEqualsHashCode.kt new file mode 100644 index 0000000..d2b5810 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeEqualsHashCode.kt @@ -0,0 +1,30 @@ +package tests.methodsFromAny.typeEqualsHashCode + +import kotlin.reflect.KType +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals + +fun unit(p: Unit): Unit {} + +fun nullable(s: String): String? = s + +class A { + fun typeParam(t: T): T = t +} + + +fun box(): String { + fun check(t1: KType, t2: KType) { + assertEquals(t1, t2) + assertEquals(t1.hashCode(), t2.hashCode()) + } + + check(::unit.parameters.single().type, ::unit.returnType) + + assertNotEquals(::nullable.parameters.single().type, ::nullable.returnType) + + val typeParam = A::class.members.single { it.name == "typeParam" } + check(typeParam.parameters.last().type, typeParam.returnType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersEqualsHashCode.kt new file mode 100644 index 0000000..ca5a491 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersEqualsHashCode.kt @@ -0,0 +1,39 @@ +package tests.methodsFromAny.typeParametersEqualsHashCode + +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals + +class A +class B + +class Fun { + fun foo(): T = null!! +} + +class Fourple + +fun box(): String { + assertEquals(A::class.typeParameters, A::class.typeParameters) + assertEquals(A::class.typeParameters.single().hashCode(), A::class.typeParameters.single().hashCode()) + + fun getFoo() = Fun::class.members.single { it.name == "foo" } + assertEquals(getFoo().typeParameters, getFoo().typeParameters) + assertEquals(getFoo().typeParameters.single().hashCode(), getFoo().typeParameters.single().hashCode()) + + assertNotEquals(A::class.typeParameters.single(), B::class.typeParameters.single()) + + val fi = Fourple::class.typeParameters + val fj = Fourple::class.typeParameters + for (i in 0..fi.size - 1) { + for (j in 0..fj.size - 1) { + if (i == j) { + assertEquals(fi[i], fj[j]) + assertEquals(fi[i].hashCode(), fj[j].hashCode()) + } else { + assertNotEquals(fi[i], fj[j]) + } + } + } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersToString.kt new file mode 100644 index 0000000..a3b822d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersToString.kt @@ -0,0 +1,15 @@ +package tests.methodsFromAny.typeParametersToString + +import kotlin.test.assertEquals + +interface Variance +class OneBound> +class SeveralBounds where T : Enum, T : Variance + +fun box(): String { + assertEquals("[A, in B, out C, D]", Variance::class.typeParameters.toString()) + assertEquals("[T]", OneBound::class.typeParameters.toString()) + assertEquals("[T]", SeveralBounds::class.typeParameters.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToString.kt new file mode 100644 index 0000000..401de40 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToString.kt @@ -0,0 +1,39 @@ + + +package tests.methodsFromAny.typeToString + +import kotlin.test.assertEquals + +fun String?.foo(x: Int, y: Array, z: IntArray, w: List>>) {} + +class A { + fun bar(t: T, u: U): T? = null +} + +fun baz(inProjection: A, outProjection: A) {} + +fun box(): String { + assertEquals( + listOf( + "kotlin.String?", + "kotlin.Int", + "kotlin.Array", + "kotlin.IntArray", + "kotlin.collections.List>>" + ), + String?::foo.parameters.map { it.type.toString() } + ) + + assertEquals("kotlin.Unit", String?::foo.returnType.toString()) + + val bar = A::class.members.single { it.name == "bar" } + assertEquals(listOf("tests.methodsFromAny.typeToString.A", "T", "U"), bar.parameters.map { it.type.toString() }) + assertEquals("T?", bar.returnType.toString()) + + assertEquals( + listOf("tests.methodsFromAny.typeToString.A", "tests.methodsFromAny.typeToString.A"), + ::baz.parameters.map { it.type.toString() } + ) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToStringInnerGeneric.kt b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToStringInnerGeneric.kt new file mode 100644 index 0000000..d0c58a5 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToStringInnerGeneric.kt @@ -0,0 +1,18 @@ + + +package tests.methodsFromAny.typeToStringInnerGeneric + +import kotlin.test.assertEquals + +class A { + inner class B { + inner class C + } +} + +fun foo(): A.B.C = null!! + +fun box(): String { + assertEquals("tests.methodsFromAny.typeToStringInnerGeneric.A.B.C", ::foo.returnType.toString()) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableModality.kt b/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableModality.kt new file mode 100644 index 0000000..4ee5da7 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableModality.kt @@ -0,0 +1,51 @@ +package tests.modifiers.callableModality + +import kotlin.test.assertTrue +import kotlin.test.assertFalse + +interface Interface { + open fun openFun() {} + abstract fun abstractFun() +} + +abstract class AbstractClass { + final val finalVal = Unit + open val openVal = Unit + abstract var abstractVar: Unit +} + +fun box(): String { + assertFalse(Interface::openFun.isFinal) + assertTrue(Interface::openFun.isOpen) + assertFalse(Interface::openFun.isAbstract) + + assertFalse(Interface::abstractFun.isFinal) + assertFalse(Interface::abstractFun.isOpen) + assertTrue(Interface::abstractFun.isAbstract) + + assertTrue(AbstractClass::finalVal.isFinal) + assertFalse(AbstractClass::finalVal.isOpen) + assertFalse(AbstractClass::finalVal.isAbstract) + assertTrue(AbstractClass::finalVal.getter.isFinal) + assertFalse(AbstractClass::finalVal.getter.isOpen) + assertFalse(AbstractClass::finalVal.getter.isAbstract) + + assertFalse(AbstractClass::openVal.isFinal) + assertTrue(AbstractClass::openVal.isOpen) + assertFalse(AbstractClass::openVal.isAbstract) + assertFalse(AbstractClass::openVal.getter.isFinal) + assertTrue(AbstractClass::openVal.getter.isOpen) + assertFalse(AbstractClass::openVal.getter.isAbstract) + + assertFalse(AbstractClass::abstractVar.isFinal) + assertFalse(AbstractClass::abstractVar.isOpen) + assertTrue(AbstractClass::abstractVar.isAbstract) + assertFalse(AbstractClass::abstractVar.getter.isFinal) + assertFalse(AbstractClass::abstractVar.getter.isOpen) + assertTrue(AbstractClass::abstractVar.getter.isAbstract) + assertFalse(AbstractClass::abstractVar.setter.isFinal) + assertFalse(AbstractClass::abstractVar.setter.isOpen) + assertTrue(AbstractClass::abstractVar.setter.isAbstract) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableVisibility.kt b/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableVisibility.kt new file mode 100644 index 0000000..6f75b26 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableVisibility.kt @@ -0,0 +1,55 @@ +package tests.modifiers.callableVisibility + +import kotlin.reflect.KFunction +import kotlin.reflect.KProperty +import kotlin.reflect.KVisibility +import kotlin.test.assertEquals + +open class Foo { + public fun publicFun() {} + protected fun protectedFun() {} + internal fun internalFun() {} + private fun privateFun() {} + private fun privateToThisFun(): T = null!! + + fun getProtectedFun() = this::protectedFun + fun getPrivateFun() = this::privateFun + fun getPrivateToThisFun(): KFunction<*> = this::privateToThisFun + + public val publicVal = Unit + protected val protectedVar = Unit + internal val internalVal = Unit + private val privateVal = Unit + private val privateToThisVal: T? = null + + fun getProtectedVar() = this::protectedVar + fun getPrivateVal() = this::privateVal + fun getPrivateToThisVal(): KProperty<*> = this::privateToThisVal + + public var publicVarPrivateSetter = Unit + private set + + fun getPublicVarPrivateSetter() = this::publicVarPrivateSetter +} + +fun box(): String { + val f = Foo() + + assertEquals(KVisibility.PUBLIC, f::publicFun.visibility) + assertEquals(KVisibility.PROTECTED, f.getProtectedFun().visibility) + assertEquals(KVisibility.INTERNAL, f::internalFun.visibility) + assertEquals(KVisibility.PRIVATE, f.getPrivateFun().visibility) + assertEquals(KVisibility.PRIVATE, f.getPrivateToThisFun().visibility) + + assertEquals(KVisibility.PUBLIC, f::publicVal.visibility) + assertEquals(KVisibility.PROTECTED, f.getProtectedVar().visibility) + assertEquals(KVisibility.INTERNAL, f::internalVal.visibility) + assertEquals(KVisibility.PRIVATE, f.getPrivateVal().visibility) + assertEquals(KVisibility.PRIVATE, f.getPrivateToThisVal().visibility) + + assertEquals(KVisibility.PUBLIC, f.getPublicVarPrivateSetter().visibility) + assertEquals(KVisibility.PUBLIC, f.getPublicVarPrivateSetter().getter.visibility) + assertEquals(KVisibility.PRIVATE, f.getPublicVarPrivateSetter().setter.visibility) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/classModality.kt b/src/test/java/kotlinx/reflect/lite/testData/modifiers/classModality.kt new file mode 100644 index 0000000..116881f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/modifiers/classModality.kt @@ -0,0 +1,56 @@ +package tests.modifiers.classModality + +import kotlin.test.assertTrue +import kotlin.test.assertFalse + +class FinalClass { + companion object Companion +} +open class OpenClass +abstract class AbstractClass +interface Interface +enum class EnumClass +enum class EnumClassWithAbstractMember { ; abstract fun foo() } +annotation class AnnotationClass +object Object + +fun box(): String { + assertTrue(FinalClass::class.isFinal) + assertFalse(FinalClass::class.isOpen) + assertFalse(FinalClass::class.isAbstract) + + assertTrue(FinalClass.Companion::class.isFinal) + assertFalse(FinalClass.Companion::class.isOpen) + assertFalse(FinalClass.Companion::class.isAbstract) + + assertFalse(OpenClass::class.isFinal) + assertTrue(OpenClass::class.isOpen) + assertFalse(OpenClass::class.isAbstract) + + assertFalse(AbstractClass::class.isFinal) + assertFalse(AbstractClass::class.isOpen) + assertTrue(AbstractClass::class.isAbstract) + + assertFalse(Interface::class.isFinal) + assertFalse(Interface::class.isOpen) + assertTrue(Interface::class.isAbstract) + + assertTrue(EnumClass::class.isFinal) + assertFalse(EnumClass::class.isOpen) + assertFalse(EnumClass::class.isAbstract) + + assertTrue(EnumClassWithAbstractMember::class.isFinal) + assertFalse(EnumClassWithAbstractMember::class.isOpen) + assertFalse(EnumClassWithAbstractMember::class.isAbstract) + + // Note that unlike in JVM, annotation classes are final in Kotlin + assertTrue(AnnotationClass::class.isFinal) + assertFalse(AnnotationClass::class.isOpen) + assertFalse(AnnotationClass::class.isAbstract) + + assertTrue(Object::class.isFinal) + assertFalse(Object::class.isOpen) + assertFalse(Object::class.isAbstract) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/classVisibility.kt b/src/test/java/kotlinx/reflect/lite/testData/modifiers/classVisibility.kt new file mode 100644 index 0000000..f7f58e0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/modifiers/classVisibility.kt @@ -0,0 +1,29 @@ +package tests.modifiers.classVisibility + +import kotlin.reflect.KClass +import kotlin.reflect.KVisibility +import kotlin.test.assertEquals + +class DefaultVisibilityClass +public class PublicClass { + protected class ProtectedClass + fun getProtectedClass(): KClass<*> = ProtectedClass::class +} +internal class InternalClass +private class PrivateClass + +fun box(): String { + assertEquals(KVisibility.PUBLIC, DefaultVisibilityClass::class.visibility) + assertEquals(KVisibility.PUBLIC, PublicClass::class.visibility) + assertEquals(KVisibility.PROTECTED, PublicClass().getProtectedClass().visibility) + assertEquals(KVisibility.INTERNAL, InternalClass::class.visibility) + assertEquals(KVisibility.PRIVATE, PrivateClass::class.visibility) + + class Local + assertEquals(null, Local::class.visibility) + + val anonymous = object {} + assertEquals(null, anonymous::class.visibility) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/functions.kt b/src/test/java/kotlinx/reflect/lite/testData/modifiers/functions.kt new file mode 100644 index 0000000..8e999fd --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/modifiers/functions.kt @@ -0,0 +1,59 @@ +package tests.modifiers.functions + +import kotlin.test.assertTrue +import kotlin.test.assertFalse + +inline fun inline() {} +class External { external fun external() } +operator fun Unit.invoke() {} +infix fun Unit.infix(unit: Unit) {} +class Suspend { suspend fun suspend() {} } + +val externalGetter = Unit + external get + +inline var inlineProperty: Unit + get() = Unit + set(value) {} + +fun box(): String { + assertTrue(::inline.isInline) + assertFalse(::inline.isExternal) + assertFalse(::inline.isOperator) + assertFalse(::inline.isInfix) + assertFalse(::inline.isSuspend) + + assertFalse(External::external.isInline) + assertTrue(External::external.isExternal) + assertFalse(External::external.isOperator) + assertFalse(External::external.isInfix) + assertFalse(External::external.isSuspend) + + assertFalse(Unit::invoke.isInline) + assertFalse(Unit::invoke.isExternal) + assertTrue(Unit::invoke.isOperator) + assertFalse(Unit::invoke.isInfix) + assertFalse(Unit::invoke.isSuspend) + + assertFalse(Unit::infix.isInline) + assertFalse(Unit::infix.isExternal) + assertFalse(Unit::infix.isOperator) + assertTrue(Unit::infix.isInfix) + assertFalse(Unit::infix.isSuspend) + + assertFalse(Suspend::suspend.isInline) + assertFalse(Suspend::suspend.isExternal) + assertFalse(Suspend::suspend.isOperator) + assertFalse(Suspend::suspend.isInfix) + assertTrue(Suspend::suspend.isSuspend) + + assertTrue(::externalGetter.getter.isExternal) + assertFalse(::externalGetter.getter.isInline) + + assertFalse(::inlineProperty.getter.isExternal) + assertTrue(::inlineProperty.getter.isInline) + assertTrue(::inlineProperty.setter.isInline) + assertFalse(::inlineProperty.isSuspend) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/properties.kt b/src/test/java/kotlinx/reflect/lite/testData/modifiers/properties.kt new file mode 100644 index 0000000..8b3c63d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/modifiers/properties.kt @@ -0,0 +1,22 @@ +package tests.modifiers.properties + +import kotlin.test.assertTrue +import kotlin.test.assertFalse + +const val const = "const" +val nonConst = "nonConst" + +class A { + lateinit var lateinit: Unit + var nonLateinit = Unit +} + +fun box(): String { + assertTrue(::const.isConst) + assertFalse(::nonConst.isConst) + + assertTrue(A::lateinit.isLateinit) + assertFalse(A::nonLateinit.isLateinit) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/modifiers/typeParameters.kt new file mode 100644 index 0000000..2d5a03d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/modifiers/typeParameters.kt @@ -0,0 +1,15 @@ +package tests.modifiers.typeParameters + +import kotlin.test.assertTrue +import kotlin.test.assertFalse + +class A { + fun nonReified(): T = null!! + inline fun reified(): U = null!! +} + +fun box(): String { + assertFalse(A::class.members.single { it.name == "nonReified" }.typeParameters.single().isReified) + assertTrue(A::class.members.single { it.name == "reified" }.typeParameters.single().isReified) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt new file mode 100644 index 0000000..efdbfbc --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt @@ -0,0 +1,20 @@ +package tests.parameters.bigArity + +import kotlin.test.assertEquals + +class A + +data class BigDataClass( + val p00: A, val p01: A, val p02: A, val p03: A, val p04: A, val p05: A, val p06: A, val p07: A, val p08: A, val p09: A, + val p10: A, val p11: A, val p12: A, val p13: A, val p14: A, val p15: A, val p16: A, val p17: A, val p18: A, val p19: A, + val p20: A, val p21: A, val p22: A, val p23: A, val p24: A, val p25: A, val p26: A, val p27: A, val p28: A, val p29: A +) + +fun box(): String { + assertEquals( + "[null, p00, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, " + + "p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29]", + BigDataClass::copy.parameters.map { it.name }.toString() + ) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt new file mode 100644 index 0000000..9614fb1 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt @@ -0,0 +1,25 @@ +package tests.parameters.boundInnerClassConstructor + +import kotlin.reflect.KParameter +import kotlin.test.assertEquals + +class Outer(val s1: String) { + inner class Inner(val s2: String, val s3: String = "K") { + val result = s1 + s2 + s3 + } +} + +fun KParameter.check(name: String) { + assertEquals(name, this.name!!) + assertEquals(KParameter.Kind.VALUE, this.kind) +} + +fun box(): String { + val ctor = Outer("O")::Inner + val ctorPararms = ctor.parameters + + ctorPararms[0].check("s2") + ctorPararms[1].check("s3") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt new file mode 100644 index 0000000..83e65e5 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt @@ -0,0 +1,23 @@ +package tests.parameters.boundObjectMemberReferences + +import kotlin.reflect.* +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +object Host { + fun foo(i: Int, s: String) {} +} + +fun box(): String { + val fooParams = Host::foo.parameters + + assertEquals(2, fooParams.size) + + assertEquals("i", fooParams[0].name) + assertEquals(Int::class.java, fooParams[0].type.javaType) + + assertEquals("s", fooParams[1].name) + assertEquals(String::class.java, fooParams[1].type.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt new file mode 100644 index 0000000..103db76 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt @@ -0,0 +1,31 @@ +package tests.parameters.boundReferences + +import kotlin.reflect.* +import kotlin.test.* + +class C { + fun foo() {} + var bar = "OK" +} + +fun C.extFun(i: Int) {} + +fun KParameter.check(name: String) { + assertEquals(name, this.name!!) + assertEquals(KParameter.Kind.VALUE, this.kind) +} + +fun box(): String { + val cFoo = C()::foo + val cBar = C()::bar + val cExtFun = C()::extFun + + assertEquals(0, cFoo.parameters.size) + assertEquals(0, cBar.getter.parameters.size) + assertEquals(1, cBar.setter.parameters.size) + + assertEquals(1, cExtFun.parameters.size) + cExtFun.parameters[0].check("i") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt new file mode 100644 index 0000000..e6e96c6 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt @@ -0,0 +1,26 @@ +package tests.parameters.isOptional + +import kotlin.test.* + +open class A { + open fun foo(x: Int, y: Int = 1) {} +} + +class B : A() { + override fun foo(x: Int, y: Int) {} +} + +class C : A() + + +fun Int.extFun() {} + +fun box(): String { + assertEquals(listOf(false, false, true), A::foo.parameters.map { it.isOptional }) + assertEquals(listOf(false, false, true), B::foo.parameters.map { it.isOptional }) + assertEquals(listOf(false, false, true), C::foo.parameters.map { it.isOptional }) + + assertFalse(Int::extFun.parameters.single().isOptional) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt new file mode 100644 index 0000000..fa49fab --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt @@ -0,0 +1,26 @@ +package tests.parameters.propertySetter + +import kotlin.reflect.* +import kotlin.test.assertEquals + +var default: Int = 0 + +var defaultAnnotated: Int = 0 + public set + +var custom: Int = 0 + set(myName: Int) {} + +fun checkPropertySetterParam(property: KMutableProperty<*>, name: String?) { + val parameter = property.setter.parameters.single() + assertEquals(0, parameter.index) + assertEquals(name, parameter.name) +} + +fun box(): String { + checkPropertySetterParam(::default, null) + checkPropertySetterParam(::defaultAnnotated, null) + checkPropertySetterParam(::custom, "myName") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt new file mode 100644 index 0000000..291ec44 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -0,0 +1,20 @@ +package tests.properties.accessors.extensionPropertyAccessors + +import kotlin.test.assertEquals + +var state: String = "" + +var String.prop: String + get() = length.toString() + set(value) { state = this + value } + +fun box(): String { + val prop = String::prop + + assertEquals("3", prop.getter.invoke("abc")) + assertEquals("5", prop.getter("defgh")) + + prop.setter("O", "K") + + return state +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt new file mode 100644 index 0000000..d750a3e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt @@ -0,0 +1,17 @@ +package tests.properties.accessors.memberPropertyAccessors + +import kotlin.test.assertEquals + +class C(var state: String) + +fun box(): String { + val prop = C::state + + val c = C("1") + assertEquals("1", prop.getter.invoke(c)) + assertEquals("1", prop.getter(c)) + + prop.setter(c, "OK") + + return prop.get(c) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt new file mode 100644 index 0000000..0831418 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -0,0 +1,16 @@ +package tests.properties.accessors.topLevelPropertyAccessors + +import kotlin.test.assertEquals + +var state: String = "" + +fun box(): String { + val prop = ::state + + assertEquals("", prop.getter.invoke()) + assertEquals("", prop.getter()) + + prop.setter("OK") + + return prop.get() +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/genericOverriddenProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/genericOverriddenProperty.kt new file mode 100644 index 0000000..a597302 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/genericOverriddenProperty.kt @@ -0,0 +1,19 @@ + +// KT-13700 Exception obtaining descriptor for property reference + +package tests.properties.genericOverriddenProperty + +import kotlin.test.assertEquals + +interface H { + val parent : T? +} + +interface A : H + +fun box(): String { + assertEquals("tests.properties.genericOverriddenProperty.A?", A::parent.returnType.toString()) + assertEquals("T?", H::parent.returnType.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/genericProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/genericProperty.kt new file mode 100644 index 0000000..e6919ae --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/genericProperty.kt @@ -0,0 +1,12 @@ + +package tests.properties.genericProperty + +import kotlin.test.assertEquals + +data class Box(val element: T) + +fun box(): String { + val p = Box::element + assertEquals("val tests.properties.genericProperty.Box.element: T", p.toString()) + return p.call(Box("OK")) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt new file mode 100644 index 0000000..59f3660 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt @@ -0,0 +1,20 @@ +package tests.properties.getDelegate.booleanPropertyNameStartsWithIs + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +object Delegate { + operator fun getValue(instance: Any?, property: KProperty<*>) = true +} + +class Foo { + val isOK: Boolean by Delegate +} + +fun box(): String { + val foo = Foo() + assertEquals(Delegate, Foo::isOK.apply { isAccessible = true }.getDelegate(foo)) + assertEquals(Delegate, foo::isOK.apply { isAccessible = true }.getDelegate()) + return if (foo.isOK) "OK" else "Fail" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/boundExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/boundExtensionProperty.kt new file mode 100644 index 0000000..c1c7e6e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/boundExtensionProperty.kt @@ -0,0 +1,25 @@ +package tests.properties.getDelegate.boundExtensionProperty + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +object Delegate { + var storage = "" + operator fun getValue(instance: Any?, property: KProperty<*>) = storage + operator fun setValue(instance: Any?, property: KProperty<*>, value: String) { storage = value } +} + +class Foo + +var Foo.result: String by Delegate + +fun box(): String { + val foo = Foo() + foo.result = "Fail" + val d = (foo::result).apply { isAccessible = true }.getDelegate() as Delegate + foo.result = "OK" + assertEquals(d, (foo::result).apply { isAccessible = true }.getDelegate()) + assertEquals(d, (Foo()::result).apply { isAccessible = true }.getDelegate()) + return d.getValue(foo, Foo::result) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/extensionProperty.kt new file mode 100644 index 0000000..7d5bad0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/extensionProperty.kt @@ -0,0 +1,24 @@ +package tests.properties.getDelegate.extensionProperty + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +object Delegate { + var storage = "" + operator fun getValue(instance: Any?, property: KProperty<*>) = storage + operator fun setValue(instance: Any?, property: KProperty<*>, value: String) { storage = value } +} + +class Foo + +var Foo.result: String by Delegate + +fun box(): String { + val foo = Foo() + foo.result = "Fail" + val d = Foo::result.apply { isAccessible = true }.getDelegate(foo) as Delegate + foo.result = "OK" + assertEquals(d, Foo::result.apply { isAccessible = true }.getDelegate(foo)) + return d.getValue(foo, Foo::result) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/fakeOverride.kt new file mode 100644 index 0000000..33ee21e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/fakeOverride.kt @@ -0,0 +1,24 @@ +package tests.properties.getDelegate.fakeOverride + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +object Delegate { + operator fun getValue(instance: Any?, property: KProperty<*>) = "OK" +} + +open class Base { + val x: String by Delegate +} + +class Derived : Base() + +fun box(): String { + val d = Derived() + assertEquals( + (Base::x).apply { isAccessible = true }.getDelegate(d), + (Derived::x).apply { isAccessible = true }.getDelegate(d) + ) + return d.x +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/kPropertyForDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/kPropertyForDelegatedProperty.kt new file mode 100644 index 0000000..0cf48c9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/kPropertyForDelegatedProperty.kt @@ -0,0 +1,31 @@ +package tests.properties.getDelegate.kPropertyForDelegatedProperty + +import kotlin.reflect.KProperty +import kotlin.reflect.KProperty0 +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +var ref: KProperty<*>? = null + +class Delegate { + var storage = "" + operator fun provideDelegate(instance: Any?, property: KProperty<*>): Delegate { + ref = property + return this + } + operator fun getValue(instance: Any?, property: KProperty<*>): String = storage + operator fun setValue(instance: Any?, property: KProperty<*>, value: String) { storage = value } +} + +var result: String by Delegate() + +fun box(): String { + result + val prop = ref as KProperty0<*> + + result = "Fail" + val d = prop.apply { isAccessible = true }.getDelegate() as Delegate + result = "OK" + assertEquals(d, prop.apply { isAccessible = true }.getDelegate()) + return result +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberExtensionProperty.kt new file mode 100644 index 0000000..1d38932 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberExtensionProperty.kt @@ -0,0 +1,28 @@ +package tests.properties.getDelegate.memberExtensionProperty + +import kotlin.reflect.* +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +object Delegate { + var storage = "" + operator fun getValue(instance: Any?, property: KProperty<*>) = storage + operator fun setValue(instance: Any?, property: KProperty<*>, value: String) { storage = value } +} + +class Bar + +class Foo { + var Bar.result: String by Delegate +} + +fun box(): String { + val foo = Foo() + val bar = Bar() + with(foo) { bar.result = "Fail" } + val prop = Foo::class.members.single { it.name == "result" } as KMutableProperty2 + val d = prop.apply { isAccessible = true }.getDelegate(foo, bar) as Delegate + with(foo) { bar.result = "OK" } + assertEquals(d, prop.apply { isAccessible = true }.getDelegate(foo, bar)) + return d.getValue(foo, prop) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberProperty.kt new file mode 100644 index 0000000..cff750d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberProperty.kt @@ -0,0 +1,24 @@ +package tests.properties.getDelegate.memberProperty + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +object Delegate { + var storage = "" + operator fun getValue(instance: Any?, property: KProperty<*>) = storage + operator fun setValue(instance: Any?, property: KProperty<*>, value: String) { storage = value } +} + +class Foo { + var result: String by Delegate +} + +fun box(): String { + val foo = Foo() + foo.result = "Fail" + val d = (Foo::result).apply { isAccessible = true }.getDelegate(foo) as Delegate + foo.result = "OK" + assertEquals(d, (Foo::result).apply { isAccessible = true }.getDelegate(foo)) + return d.getValue(foo, Foo::result) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt new file mode 100644 index 0000000..91570b4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt @@ -0,0 +1,33 @@ +package tests.properties.getDelegate.method.delegateMethodIsNonOverridable + +import kotlin.reflect.* +import kotlin.reflect.jvm.isAccessible + +val a = 1 +val b = 2 + +fun KProperty0<*>.test(): String = + (apply { isAccessible = true }.getDelegate() as KProperty<*>).name + +open class C { + open val x by run { ::a } + open val y by ::a + + val xc = ::x.test() + val yc = ::y.test() +} + +class D : C() { + override val x by run { ::b } + override val y by ::b + + val xd = ::x.test() + val yd = ::y.test() +} + +fun box(): String { + val result = D().run { "$xc $yc $xd $yd" } + if (result != "a a b b") return "Fail: $result" + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/nameClashClassAndCompanion.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/nameClashClassAndCompanion.kt new file mode 100644 index 0000000..d17ab10 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/nameClashClassAndCompanion.kt @@ -0,0 +1,25 @@ +package tests.properties.getDelegate.nameClashClassAndCompanion + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +class Delegate(val value: String) { + operator fun getValue(instance: Any?, property: KProperty<*>) = value +} + +class Foo { + val x: String by Delegate("class") + + companion object { + val x: String by Delegate("companion") + } +} + +fun box(): String { + val foo = Foo() + assertEquals("class", ((foo::x).apply { isAccessible = true }.getDelegate() as Delegate).value) + assertEquals("class", ((Foo::x).apply { isAccessible = true }.getDelegate(foo) as Delegate).value) + assertEquals("companion", ((Foo.Companion::x).apply { isAccessible = true }.getDelegate() as Delegate).value) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/notDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/notDelegatedProperty.kt new file mode 100644 index 0000000..4eafeb5 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/notDelegatedProperty.kt @@ -0,0 +1,28 @@ +package tests.properties.getDelegate.notDelegatedProperty + +import kotlin.reflect.KProperty2 +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +val topLevel: Boolean = true +val String.extension: Boolean get() = true + +class Foo { + val member: Boolean = true + val String.memberExtension: Boolean get() = true +} + +fun box(): String { + assertNull(::topLevel.apply { isAccessible = true }.getDelegate()) + + assertNull(String::extension.apply { isAccessible = true }.getDelegate("")) + assertNull(""::extension.apply { isAccessible = true }.getDelegate()) + + assertNull(Foo::member.apply { isAccessible = true }.getDelegate(Foo())) + assertNull(Foo()::member.apply { isAccessible = true }.getDelegate()) + + val me = Foo::class.members.single { it.name == "memberExtension" } as KProperty2 + assertNull(me.apply { isAccessible = true }.getDelegate(Foo(), "")) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/overrideDelegatedByDelegated.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/overrideDelegatedByDelegated.kt new file mode 100644 index 0000000..f12c90a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/overrideDelegatedByDelegated.kt @@ -0,0 +1,36 @@ +package tests.properties.getDelegate.overrideDelegatedByDelegated + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +class Delegate(val value: String) { + operator fun getValue(instance: Any?, property: KProperty<*>) = value +} + +open class Base { + open val x: String by Delegate("Base") +} + +class Derived : Base() { + override val x: String by Delegate("Derived") +} + +fun check(expected: String, delegate: Any?) { + if (delegate == null) throw AssertionError("getDelegate returned null") + assertEquals(expected, (delegate as Delegate).value) +} + +fun box(): String { + val base = Base() + val derived = Derived() + + check("Base", (Base::x).apply { isAccessible = true }.getDelegate(base)) + check("Base", (base::x).apply { isAccessible = true }.getDelegate()) + check("Derived", (Derived::x).apply { isAccessible = true }.getDelegate(derived)) + check("Derived", (derived::x).apply { isAccessible = true }.getDelegate()) + + check("Base", (Base::x).apply { isAccessible = true }.getDelegate(derived)) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/topLevelProperty.kt new file mode 100644 index 0000000..150de8d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/topLevelProperty.kt @@ -0,0 +1,22 @@ +package tests.properties.getDelegate.topLevelProperty + +import kotlin.reflect.KProperty +import kotlin.reflect.jvm.isAccessible +import kotlin.test.* + +object Delegate { + var storage = "" + operator fun getValue(instance: Any?, property: KProperty<*>) = storage + operator fun setValue(instance: Any?, property: KProperty<*>, value: String) { storage = value } +} + +var result: String by Delegate + +fun box(): String { + result = "Fail" + val p = (::result).apply { isAccessible = true } + val d = p.getDelegate() as Delegate + result = "OK" + assertEquals(d, (::result).apply { isAccessible = true }.getDelegate()) + return d.getValue(null, p) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/defaultImpls.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/defaultImpls.kt new file mode 100644 index 0000000..030aa5c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/defaultImpls.kt @@ -0,0 +1,22 @@ +package tests.properties.localDelegated.defaultImpls + +import kotlin.reflect.KProperty +import kotlin.test.assertEquals + +object Delegate { + operator fun getValue(z: Any?, p: KProperty<*>): String? { + assertEquals("val x: kotlin.String?", p.toString()) + return "OK" + } +} + +interface Foo { + fun bar(): String { + val x by Delegate + return x!! + } +} + +object O : Foo + +fun box(): String = O.bar() \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inLambda.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inLambda.kt new file mode 100644 index 0000000..54387e9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inLambda.kt @@ -0,0 +1,13 @@ +package tests.properties.localDelegated.inLambda + +import kotlin.reflect.* + +fun eval(fn: () -> T) = fn() + +inline operator fun String.getValue(t:Any?, p: KProperty<*>): String = + if (p.returnType.classifier == String::class) this else "fail" + +fun box() = eval { + val x by "OK" + x +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inlineFun.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inlineFun.kt new file mode 100644 index 0000000..d979091 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inlineFun.kt @@ -0,0 +1,25 @@ +package tests.properties.localDelegated.inlineFun + +import kotlin.reflect.* +import kotlin.test.assertEquals + +object Delegate { + lateinit var property: KProperty<*> + + operator fun getValue(instance: Any?, kProperty: KProperty<*>) { + property = kProperty + } +} + +class Foo { + inline fun foo() { + val x by Delegate + x + } +} + +fun box(): String { + Foo().foo() + assertEquals("val x: kotlin.Unit", Delegate.property.toString()) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localAndNonLocal.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localAndNonLocal.kt new file mode 100644 index 0000000..5852b41 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localAndNonLocal.kt @@ -0,0 +1,33 @@ +package tests.properties.localDelegated.localAndNonLocal + +import kotlin.reflect.KProperty + +object Delegate { + operator fun getValue(thiz: Any?, property: KProperty<*>): String { + return property.name + ":" + property.returnType + } +} + +class C { + val a by Delegate + + fun test(): String { + if (a != "a:kotlin.String") return "Fail a: $a" + + val b by Delegate + if (b != "b:kotlin.String") return "Fail b: $b" + + return "OK" + } +} + +val x by Delegate + +fun box(): String { + if (x != "x:kotlin.String") return "Fail x: $x" + + val y by Delegate + if (y != "y:kotlin.String") return "Fail y: $y" + + return C().test() +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localDelegatedProperty.kt new file mode 100644 index 0000000..ac68cbb --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localDelegatedProperty.kt @@ -0,0 +1,74 @@ +package tests.properties.localDelegated.localDelegatedProperty + +import kotlin.reflect.* +import kotlin.test.* + +object Delegate { + lateinit var property: KProperty<*> + + operator fun getValue(instance: Any?, kProperty: KProperty<*>): List { + property = kProperty + return emptyList() + } + + operator fun setValue(instance: Any?, kProperty: KProperty<*>, value: List) { + throw AssertionError() + } +} + +fun check(expectedName: String, p: KProperty0<*>): String? { + assertEquals(expectedName, p.name) + assertEquals(emptyList(), p.parameters) + assertEquals(emptyList(), p.typeParameters) + assertEquals(null, p.visibility) // "local" visibility is not representable with reflection API + assertEquals("kotlin.collections.List", p.returnType.toString()) + assertTrue(p.isFinal) + assertFalse(p.isOpen) + assertFalse(p.isAbstract) + assertFalse(p.isLateinit) + assertFalse(p.isConst) + + // TODO: support getDelegate for local delegated properties + assertEquals(null, (p as KProperty0<*>).getDelegate()) + + assertEquals(emptyList(), p.getter.parameters) + assertEquals("kotlin.collections.List", p.getter.returnType.toString()) + + // TODO: support annotations + assertEquals(emptyList(), p.annotations) + + try { + p.call() + return "Fail: reflective call of a local delegated property should fail because it's not supported" + } catch (e: UnsupportedOperationException) { /* ok */ } + + if (p is KMutableProperty0<*>) { + assertEquals(listOf("kotlin.collections.List"), p.setter.parameters.map { it.type.toString() }) + assertEquals("kotlin.Unit", p.setter.returnType.toString()) + + try { + p.setter.call() + return "Fail: reflective call of a local delegated property setter should fail because it's not supported" + } catch (e: UnsupportedOperationException) { /* ok */ } + } + + return null +} + +annotation class Anno + +fun box(): String { + @Anno + val localVal by Delegate + localVal + + check("localVal", Delegate.property as KProperty0<*>)?.let { error -> return error } + + @Anno + var localVar by Delegate + localVar + + check("localVar", Delegate.property as KProperty0<*>)?.let { error -> return error } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/variableOfGenericType.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/variableOfGenericType.kt new file mode 100644 index 0000000..496fb79 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/variableOfGenericType.kt @@ -0,0 +1,30 @@ +package tests.properties.localDelegated.variableOfGenericType + +import kotlin.reflect.* +import kotlin.test.* + +class Delegate(val value: T) { + lateinit var property: KProperty<*> + + operator fun getValue(instance: Any?, kProperty: KProperty<*>): T { + property = kProperty + return value + } +} + +class A { + inner class B { + fun foo() { + val delegate = Delegate, Z>>(emptyMap()) + val c: Map, Z> by delegate + c + + assertEquals("kotlin.collections.Map, Z>", delegate.property.returnType.toString()) + } + } +} + +fun box(): String { + A().B().foo() + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/privateJvmStaticVarInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/privateJvmStaticVarInObject.kt new file mode 100644 index 0000000..ad93af1 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/privateJvmStaticVarInObject.kt @@ -0,0 +1,27 @@ +package tests.properties.privateJvmStaticVarInObject + +import kotlin.reflect.* +import kotlin.reflect.jvm.* + +object Obj { + @JvmStatic + private var result: String = "Fail" +} + +fun box(): String { + val p = Obj::class.members.single { it.name == "result" } as KMutableProperty1 + p.isAccessible = true + + try { + p.set(null, "OK") + return "Fail: set should check that first argument is Obj" + } catch (e: IllegalArgumentException) {} + + try { + p.get(null) + return "Fail: get should check that first argument is Obj" + } catch (e: IllegalArgumentException) {} + + p.set(Obj, "OK") + return p.get(Obj) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt new file mode 100644 index 0000000..5c204ee --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt @@ -0,0 +1,22 @@ +package tests.properties.propertyOfNestedClassAndArrayType + +import kotlin.reflect.KMutableProperty1 + +class A { + class B(val result: String) + + var p: A.B? = null + var q: Array>? = null +} + +fun box(): String { + val a = A() + + val aq = A::class.members.single { it.name == "q" } as KMutableProperty1>> + aq.set(a, arrayOf(arrayOf(A.B("array")))) + if (a.q!![0][0].result != "array") return "Fail array" + + val ap = A::class.members.single { it.name == "p" } as KMutableProperty1 + ap.set(a, A.B("OK")) + return a.p!!.result +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/publicClassValAccessible.kt new file mode 100644 index 0000000..088f8eb --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/publicClassValAccessible.kt @@ -0,0 +1,14 @@ +package tests.properties.publicClassValAccessible + +import kotlin.reflect.jvm.isAccessible + +class Result { + public val value: String = "OK" +} + +fun box(): String { + val p = Result::value + p.isAccessible = false + // setAccessible(false) should have no effect on the accessibility of a public reflection object + return p.get(Result()) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/declarationSiteVariance.kt b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/declarationSiteVariance.kt new file mode 100644 index 0000000..a2478d7 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/declarationSiteVariance.kt @@ -0,0 +1,23 @@ +package tests.typeParameters.declarationSiteVariance + +import kotlin.reflect.KVariance +import kotlin.test.assertEquals + +class Triple { + fun foo(): T = null!! +} + +fun box(): String { + assertEquals( + listOf( + KVariance.IN, + KVariance.INVARIANT, + KVariance.OUT + ), + Triple::class.typeParameters.map { it.variance } + ) + + assertEquals(KVariance.INVARIANT, Triple::class.members.single { it.name == "foo" }.typeParameters.single().variance) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/innerGenericParameter.kt b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/innerGenericParameter.kt new file mode 100644 index 0000000..5effe2d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/innerGenericParameter.kt @@ -0,0 +1,27 @@ +package tests.typeParameters.innerGenericParameter + +import kotlin.reflect.KVariance +import kotlin.test.assertEquals + +class A { + inner class B { + fun test(u: U): T? = null + } +} + +fun box(): String { + val fn = A.B::class.members.single { it.name == "test" } + + val t = A::class.typeParameters.single() + val u = A.B::class.typeParameters.single() + + assertEquals("T", t.name) + assertEquals(KVariance.OUT, t.variance) + assertEquals("U", u.name) + assertEquals(KVariance.IN, u.variance) + + assertEquals(t, fn.returnType.classifier) + assertEquals(u, fn.parameters[1].type.classifier) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/typeParametersAndNames.kt b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/typeParametersAndNames.kt new file mode 100644 index 0000000..ce8fd45 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/typeParametersAndNames.kt @@ -0,0 +1,36 @@ +package tests.typeParameters.typeParametersAndNames + +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +class F { + fun foo() {} + val B.bar: B get() = this +} + +class C { + fun baz() {} + fun quux() {} +} + +fun get(klass: KClass<*>, memberName: String? = null): List = + (if (memberName != null) + klass.members.single { it.name == memberName }.typeParameters + else + klass.typeParameters) + .map { it.name } + +fun box(): String { + assertEquals(listOf(), get(F::class)) + assertEquals(listOf("A"), get(F::class, "foo")) + assertEquals(listOf("B"), get(F::class, "bar")) + + assertEquals(listOf("D"), get(C::class)) + assertEquals(listOf(), get(C::class, "baz")) + assertEquals(listOf("E", "G"), get(C::class, "quux")) + + assertEquals(listOf("T"), get(Comparable::class)) + assertEquals(listOf(), get(String::class)) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/upperBounds.kt b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/upperBounds.kt new file mode 100644 index 0000000..b83d086 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/typeParameters/upperBounds.kt @@ -0,0 +1,59 @@ +package tests.typeParameters.upperBounds + +import kotlin.reflect.KTypeProjection +import kotlin.reflect.KVariance +import kotlin.test.assertEquals + +class DefaultBound +class NullableAnyBound +class NotNullAnyBound +class TwoBounds where T : Comparable + +class OtherParameterBound + +class RecursiveGeneric> + +class FunctionTypeParameter { + fun foo(): Cloneable = null!! +} + +// helper functions to obtain KType instances +fun nullableAny(): Any? = null +fun notNullAny(): Any = null!! + +fun box(): String { + assertEquals(listOf(::nullableAny.returnType), DefaultBound::class.typeParameters.single().upperBounds) + assertEquals(listOf(::nullableAny.returnType), NullableAnyBound::class.typeParameters.single().upperBounds) + assertEquals(listOf(::notNullAny.returnType), NotNullAnyBound::class.typeParameters.single().upperBounds) + + TwoBounds::class.typeParameters.single().let { + val (cl, cm) = it.upperBounds + assertEquals(Cloneable::class, cl.classifier) + assertEquals(listOf(), cl.arguments) + + assertEquals(Comparable::class, cm.classifier) + val cmt = cm.arguments.single() + assertEquals(KVariance.INVARIANT, cmt.variance) + assertEquals(it, cmt.type!!.classifier) + } + + OtherParameterBound::class.typeParameters.let { + val (t, u) = it + assertEquals(u, t.upperBounds.single().classifier) + assertEquals(Number::class, u.upperBounds.single().classifier) + } + + FunctionTypeParameter::class.members.single { it.name == "foo" }.let { foo -> + assertEquals(foo.returnType, foo.typeParameters.single().upperBounds.single()) + } + + val recursiveGenericTypeParameter = RecursiveGeneric::class.typeParameters.single() + val recursiveGenericBound = recursiveGenericTypeParameter.upperBounds.single() + assertEquals(Enum::class, recursiveGenericBound.classifier) + recursiveGenericBound.arguments.single().let { projection -> + assertEquals(KVariance.INVARIANT, projection.variance) + assertEquals(recursiveGenericTypeParameter, projection.type!!.classifier) + } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsClass.kt b/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsClass.kt new file mode 100644 index 0000000..d063d82 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsClass.kt @@ -0,0 +1,25 @@ +package tests.types.classifierIsClass + +import kotlin.test.assertEquals + +class Outer { + class Nested + + inner class Inner +} + +fun outer(): Outer = null!! +fun nested(): Outer.Nested = null!! +fun inner(): Outer.Inner = null!! + +fun array(): Array = null!! + +fun box(): String { + assertEquals(Outer::class, ::outer.returnType.classifier) + assertEquals(Outer.Nested::class, ::nested.returnType.classifier) + assertEquals(Outer.Inner::class, ::inner.returnType.classifier) + + assertEquals(Array::class, ::array.returnType.classifier) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsTypeParameter.kt b/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsTypeParameter.kt new file mode 100644 index 0000000..8901912 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsTypeParameter.kt @@ -0,0 +1,23 @@ +package tests.types.classifierIsTypeParameter + +import kotlin.reflect.KTypeParameter +import kotlin.test.* + +class A { + fun foo(): T = null!! + fun bar(): Array? = null!! +} + +fun box(): String { + val t = A::class.members.single { it.name == "foo" }.returnType + assertFalse(t.isMarkedNullable) + val tc = t.classifier + if (tc !is KTypeParameter) fail(tc.toString()) + assertEquals("T", tc.name) + + val u = A::class.members.single { it.name == "bar" }.returnType + assertTrue(u.isMarkedNullable) + assertEquals(Array::class, u.classifier) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/classifiersOfBuiltInTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/types/classifiersOfBuiltInTypes.kt new file mode 100644 index 0000000..66dd5b0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/classifiersOfBuiltInTypes.kt @@ -0,0 +1,112 @@ +package tests.types.classifiersOfBuiltInTypes + +import kotlin.reflect.KClass +import kotlin.reflect.KFunction +import kotlin.test.assertEquals + +fun primitives( + p01: Boolean, + p02: Byte, + p03: Char, + p04: Double, + p05: Float, + p06: Int, + p07: Long, + p08: Short +) {} + +fun nullablePrimitives( + p01: Boolean?, + p02: Byte?, + p03: Char?, + p04: Double?, + p05: Float?, + p06: Int?, + p07: Long?, + p08: Short? +) {} + +fun primitiveArrays( + p01: BooleanArray, + p02: ByteArray, + p03: CharArray, + p04: DoubleArray, + p05: FloatArray, + p06: IntArray, + p07: LongArray, + p08: ShortArray +) {} + +fun others( + p1: Array<*>, + p2: Array, + p3: Array?>, + p4: List<*>, + p5: List?, + p6: Map.Entry, + p7: Unit?, + p8: String, + p9: Nothing +) {} + +inline fun wrapper(): KClass = T::class + +fun check(f: KFunction<*>, vararg expected: KClass<*>) { + val actual = f.parameters.map { it.type.classifier as KClass<*> } + for ((e, a) in expected.toList().zip(actual)) { + assertEquals(e, a, "$e (${e.java}) != $a (${a.java})") + } +} + +fun box(): String { + check( + ::primitives, + Boolean::class, + Byte::class, + Char::class, + Double::class, + Float::class, + Int::class, + Long::class, + Short::class + ) + + check( + ::nullablePrimitives, + wrapper(), + wrapper(), + wrapper(), + wrapper(), + wrapper(), + wrapper(), + wrapper(), + wrapper() + ) + + check( + ::primitiveArrays, + BooleanArray::class, + ByteArray::class, + CharArray::class, + DoubleArray::class, + FloatArray::class, + IntArray::class, + LongArray::class, + ShortArray::class + ) + + check( + ::others, + Array::class, + Array::class, + Array?>::class, + List::class, + List::class, + Map.Entry::class, + Unit::class, + String::class, + Nothing::class + ) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/equalsForClassAndTypeParameterWithSameFqName.kt b/src/test/java/kotlinx/reflect/lite/testData/types/equalsForClassAndTypeParameterWithSameFqName.kt new file mode 100644 index 0000000..ca2acf6 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/equalsForClassAndTypeParameterWithSameFqName.kt @@ -0,0 +1,24 @@ + +// FIR incorrectly resolves typeParameterType's return type to the nested class `A.T`. + +package tests.types.equalsForClassAndTypeParameterWithSameFqName + +class A { + class T + + fun typeParameterType(): T? = null + fun nestedClassType(): A.T? = null +} + +fun box(): String { + val typeParameterType = A<*>::typeParameterType.returnType + val classType = A<*>::nestedClassType.returnType + + if (typeParameterType == classType) + return "Fail 1: type parameter's type constructor shouldn't be equal to the class with the same FQ name" + + if (classType == typeParameterType) + return "Fail 2: class' type constructor shouldn't be equal to the type parameter with the same FQ name" + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/innerGenericArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/types/innerGenericArguments.kt new file mode 100644 index 0000000..5dffbef --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/innerGenericArguments.kt @@ -0,0 +1,32 @@ +package tests.types.innerGenericArguments + +import kotlin.test.* + +class Outer { + inner class Inner { + inner class Innermost + } +} + +fun foo(): Outer.Inner.Innermost = null!! + +fun box(): String { + val types = ::foo.returnType.arguments.map { it.type!! } + + assertEquals( + listOf( + Any::class, + Any::class, + String::class, + Float::class, + Int::class, + Number::class + ), + types.map { it.classifier } + ) + + assertFalse(types[0].isMarkedNullable) + assertTrue(types[1].isMarkedNullable) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfClass.kt b/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfClass.kt new file mode 100644 index 0000000..a462a46 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfClass.kt @@ -0,0 +1,20 @@ +package tests.types.jvmErasureOfClass + +import kotlin.reflect.jvm.jvmErasure +import kotlin.test.assertEquals + +fun string(): String = null!! +fun array(): Array = null!! + +fun collection(): Collection = null!! +fun mutableCollection(): MutableCollection = null!! + +fun box(): String { + assertEquals(String::class, ::string.returnType.jvmErasure) + assertEquals(Array::class, ::array.returnType.jvmErasure) + + assertEquals(Collection::class, ::collection.returnType.jvmErasure) + assertEquals(MutableCollection::class, ::mutableCollection.returnType.jvmErasure) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfTypeParameter.kt b/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfTypeParameter.kt new file mode 100644 index 0000000..a7e40b2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfTypeParameter.kt @@ -0,0 +1,45 @@ +package tests.types.jvmErasureOfTypeParameter + +import kotlin.reflect.jvm.jvmErasure +import kotlin.reflect.KClass +import kotlin.test.assertEquals + +open class O + +class A { + fun simple(): T = null!! + fun string(): T = null!! + fun nullableString(): T = null!! + fun otherTypeParameter(): T = null!! + fun > otherTypeParameterWithBound(): T = null!! + + fun twoInterfaces1(): T where T : Comparable<*> = null!! + fun > twoInterfaces2(): T where T : Cloneable = null!! + fun interfaceAndClass1(): T where T : O = null!! + fun interfaceAndClass2(): T where T : Cloneable = null!! + + fun arrayOfAny(): Array = null!! + fun arrayOfNumber(): Array = null!! + fun arrayOfArrayOfCloneable(): Array> where T : Cloneable, T : Comparable<*> = null!! +} + +fun get(name: String): KClass<*> = A::class.members.single { it.name == name }.returnType.jvmErasure + +fun box(): String { + assertEquals(Any::class, get("simple")) + assertEquals(String::class, get("string")) + assertEquals(String::class, get("nullableString")) + assertEquals(Any::class, get("otherTypeParameter")) + assertEquals(List::class, get("otherTypeParameterWithBound")) + + assertEquals(Cloneable::class, get("twoInterfaces1")) + assertEquals(Comparable::class, get("twoInterfaces2")) + assertEquals(O::class, get("interfaceAndClass1")) + assertEquals(O::class, get("interfaceAndClass2")) + + assertEquals(Array::class, get("arrayOfAny")) + assertEquals(Array::class, get("arrayOfNumber")) + assertEquals(Array>::class, get("arrayOfArrayOfCloneable")) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/typeArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/types/typeArguments.kt new file mode 100644 index 0000000..246360a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/typeArguments.kt @@ -0,0 +1,42 @@ +package tests.types.typeArguments + +import kotlin.reflect.KTypeProjection +import kotlin.reflect.KVariance +import kotlin.test.assertEquals + +fun string(): String = null!! + +class Fourple +fun projections(): Fourple = null!! + +fun array(): Array = null!! + +fun list(): List = null!! + +fun box(): String { + val string = ::string.returnType + assertEquals(listOf(), string.arguments) + + assertEquals( + listOf( + KTypeProjection.invariant(string), + KTypeProjection.contravariant(string), + KTypeProjection.covariant(string), + KTypeProjection.STAR + ), + ::projections.returnType.arguments + ) + assertEquals( + listOf(string, string, string, null), + ::projections.returnType.arguments.map(KTypeProjection::type) + ) + + val outNumber = ::array.returnType.arguments.single() + assertEquals(KVariance.OUT, outNumber.variance) + assertEquals(Number::class, outNumber.type?.classifier) + + // There should be no use-site variance, despite the fact that the corresponding parameter has 'out' variance + assertEquals(KVariance.INVARIANT, ::list.returnType.arguments.single().variance) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/useSiteVariance.kt b/src/test/java/kotlinx/reflect/lite/testData/types/useSiteVariance.kt new file mode 100644 index 0000000..3e6f538 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/types/useSiteVariance.kt @@ -0,0 +1,26 @@ +package tests.types.useSiteVariance + +import kotlin.reflect.KVariance +import kotlin.test.assertEquals + +class Fourple +fun foo(): Fourple = null!! + +fun listOfStrings(): List = null!! + +fun box(): String { + assertEquals( + listOf( + KVariance.INVARIANT, + KVariance.IN, + KVariance.OUT, + null + ), + ::foo.returnType.arguments.map { it.variance } + ) + + // Declaration-site variance should have no effect on the variance of the type projection: + assertEquals(KVariance.INVARIANT, ::listOfStrings.returnType.arguments.first().variance) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/tests/KClassTests.kt b/src/test/java/kotlinx/reflect/lite/tests/KClassTests.kt new file mode 100644 index 0000000..e887a70 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/tests/KClassTests.kt @@ -0,0 +1,42 @@ +package kotlinx.reflect.lite.tests + +import org.junit.* + +class KClassTests { + @Test + fun testClassSimpleName() = test("classes.classSimpleName") { tests.classes.classSimpleName.box() } + + @Test + fun testLocalClassSimpleName() = test("classes.localClassSimpleName") { tests.classes.localClassSimpleName.box() } + + @Test + fun testNestedClasses() = test("classes.nestedClasses") { tests.classes.nestedClasses.box() } + + @Test + fun testQualifiedName() = test("classes.qualifiedName") { tests.classes.qualifiedName.box() } + + @Ignore + @Test + fun testQualifiedNameOfStandardClasses() = test("classes.qualifiedNameOfStandardClasses") { tests.classes.qualifiedNameOfStandardClasses.box() } + + @Test + fun testSealedSubClasses() = test("classes.sealedSubclasses") { tests.classes.sealedSubclasses.box() } + + // constructors + @Test + fun testClassesWithoutConstructors() = test("classes.classesWithoutConstructors") { tests.constructors.classesWithoutConstructors.box() } + + @Test + fun testConstructorName() = test("classes.constructorName") { tests.constructors.constructorName.box() } + + @Ignore + @Test + fun testEnumEntry() = test("classes.enumEntry") { tests.constructors.enumEntry.box() } + + @Test + fun testSimpleGetConstructors() = test("classes.simpleGetConstructors") { tests.constructors.simpleGetConstructors.box() } + + // members + @Test + fun testClassMembers() = test("classes.classMembers") { tests.classes.classMembers.box() } +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt new file mode 100644 index 0000000..5dd65de --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -0,0 +1,16 @@ +package kotlinx.reflect.lite.tests + +import kotlinx.reflect.lite.* + +internal fun Class.toLiteKClass() = ReflectionLite.loadClassMetadata(this) + +internal inline fun test(name: String, box: () -> String) { + print("$name: ") + try { + val res = box() + println(res) + } catch (e: Throwable) { + println("EXCEPTION: ${e.message}") + throw e + } +} From 04d7b75b14230087d72b0736d8045629c0e7f6ee Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 16 Feb 2022 22:07:40 +0300 Subject: [PATCH 06/74] Update kotlinx-metadata-jvm to 0.4.2 Added KotlinCommonMetadata for reading metadata from .kotlin_builtins file --- build.gradle.kts | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0c22344..be85792 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib") testImplementation("org.jetbrains.kotlin:kotlin-stdlib") testImplementation("org.jetbrains.kotlin:kotlin-test") - implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0") + implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.4.2") testImplementation("junit:junit:4.12") } diff --git a/gradle.properties b/gradle.properties index 81723f8..4995137 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,5 +2,5 @@ version=0.1.0-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.6.10 -kotlinx_metadata_version=0.3.0 +kotlinx_metadata_version=0.4.2 pluginPublishVersion=0.10.1 \ No newline at end of file From 1184613c2097b9972956d5c2815700a40f7e389a Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 16 Feb 2022 22:11:17 +0300 Subject: [PATCH 07/74] Consistent way to delegate KClass implementation to ClassDescriptor --- .../reflect/lite/KDeclarationContainer.kt | 3 +- .../java/kotlinx/reflect/lite/KProperty.kt | 20 ++--- .../reflect/lite/descriptors/descriptors.kt | 19 ++-- .../impl/AbstractCallableDescriptor.kt | 6 +- .../descriptors/impl/ClassDescriptorImpl.kt | 89 ++++++++++++++++--- .../impl/ConstructorDescriptorImpl.kt | 3 +- .../impl/FunctionDescriptorImpl.kt | 5 +- .../lite/descriptors/impl/KotlinType.kt | 4 +- .../descriptors/impl/ModuleDescriptorImpl.kt | 7 +- .../impl/PropertyDescriptorImpl.kt | 5 +- .../kotlinx/reflect/lite/impl/KClassImpl.kt | 66 ++------------ .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 5 +- .../reflect/lite/impl/ReflectionLiteImpl.kt | 6 +- 13 files changed, 128 insertions(+), 110 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt index 4b9d2ec..a5c2096 100644 --- a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt +++ b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt @@ -7,7 +7,8 @@ package kotlinx.reflect.lite interface KDeclarationContainer { /** * All functions and properties accessible in this container. - * TODO: inherited members are not supported yet + * TODO: inherited, static and extension members are not supported yet + * NOTE: kotlinx-metadata-jvm can not provide inherited and static members - it's a low level api */ public val members: Collection> } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/KProperty.kt b/src/main/java/kotlinx/reflect/lite/KProperty.kt index 937d057..8941784 100644 --- a/src/main/java/kotlinx/reflect/lite/KProperty.kt +++ b/src/main/java/kotlinx/reflect/lite/KProperty.kt @@ -23,8 +23,8 @@ public interface KProperty : KCallable { public val isConst: Boolean /** The getter of this property, used to obtain the value of the property. */ - private val getter: Getter - get() = TODO() + public val getter: Getter + get() = TODO("Not implemented yet") /** * Represents a property accessor, which is a `get` or `set` method declared alongside the property. @@ -47,14 +47,14 @@ public interface KProperty : KCallable { /** * Represents a property declared as a `var`. */ -public interface KMutableProperty : kotlin.reflect.KProperty { +public interface KMutableProperty : KProperty { /** The setter of this mutable property, used to change the value of the property. */ public val setter: Setter /** * Setter of the property is a `set` method declared alongside the property. */ - public interface Setter : kotlin.reflect.KProperty.Accessor, kotlin.reflect.KFunction + public interface Setter : KProperty.Accessor, KFunction } @@ -63,7 +63,7 @@ public interface KMutableProperty : kotlin.reflect.KProperty { * Such property is either originally declared in a receiverless context such as a package, * or has the receiver bound to it. */ -public interface KProperty0 : kotlin.reflect.KProperty, () -> V { +public interface KProperty0 : KProperty, () -> V { /** * Returns the current value of the property. */ @@ -84,7 +84,7 @@ public interface KProperty0 : kotlin.reflect.KProperty, () -> V { * * Can be used as a function that takes 0 arguments and returns the value of the property type [V]. */ - public interface Getter : kotlin.reflect.KProperty.Getter, () -> V + public interface Getter : KProperty.Getter, () -> V } /** @@ -115,7 +115,7 @@ public interface KMutableProperty0 : KProperty0, KMutableProperty { * @param T the type of the receiver which should be used to obtain the value of the property. * @param V the type of the property value. */ -public interface KProperty1 : kotlin.reflect.KProperty, (T) -> V { +public interface KProperty1 : KProperty, (T) -> V { /** * Returns the current value of the property. * @@ -149,7 +149,7 @@ public interface KProperty1 : kotlin.reflect.KProperty, (T) -> V { * * Can be used as a function that takes an argument of type [T] (the receiver) and returns the value of the property type [V]. */ - public interface Getter : kotlin.reflect.KProperty.Getter, (T) -> V + public interface Getter : KProperty.Getter, (T) -> V } /** @@ -187,7 +187,7 @@ public interface KMutableProperty1 : KProperty1, KMutableProperty * the type of the extension receiver. * @param V the type of the property value. */ -public interface KProperty2 : kotlin.reflect.KProperty, (D, E) -> V { +public interface KProperty2 : KProperty, (D, E) -> V { /** * Returns the current value of the property. In case of the extension property in a class, * the instance of the class should be passed first and the instance of the extension receiver second. @@ -221,7 +221,7 @@ public interface KProperty2 : kotlin.reflect.KProperty, (D, E) - * Can be used as a function that takes an argument of type [D] (the first receiver), an argument of type [E] (the second receiver) * and returns the value of the property type [V]. */ - public interface Getter : kotlin.reflect.KProperty.Getter, (D, E) -> V + public interface Getter : KProperty.Getter, (D, E) -> V } /** diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 617cf32..1874cba 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -3,11 +3,11 @@ package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.KotlinType -import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.descriptors.impl.TypeParameterTable import kotlinx.reflect.lite.name.* internal interface ModuleDescriptor { - fun findClass(name: ClassName): ClassDescriptor + fun findClass(name: ClassName): ClassDescriptor<*> } internal interface Annotated { @@ -33,18 +33,23 @@ internal interface DeclarationDescriptor : Annotated { internal interface DeclarationContainerDescriptor -internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierDescriptor { +internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierDescriptor { + val jClass: Class<*> + val kmClass: KmClass val classId: ClassId val module: ModuleDescriptor - val kClass: KClassImpl<*> + + val simpleName: String? + val qualifiedName: String? val constructors: List - val nestedClasses: List - val sealedSubclasses: List + val nestedClasses: List> + val sealedSubclasses: List> val properties: List val functions: List val memberScope: MemberScope + val typeParameterTable: TypeParameterTable val typeParameters: List val supertypes: List @@ -72,7 +77,7 @@ internal class MemberScope( internal interface CallableDescriptor : DeclarationDescriptor { val module: ModuleDescriptor - val containingClass: ClassDescriptor? + val containingClass: ClassDescriptor<*>? val valueParameters: List diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt index eb60130..3bb8749 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt @@ -5,13 +5,13 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.CallableDescriptor -abstract class AbstractCallableDescriptor : CallableDescriptor { - protected abstract val flags: Flags +internal interface AbstractCallableDescriptor : CallableDescriptor { + val flags: Flags override val visibility: KVisibility? get() = flags.toVisibility() - internal abstract val typeParameterTable: TypeParameterTable + val typeParameterTable: TypeParameterTable override val isFinal: Boolean get() = Flag.Common.IS_FINAL(flags) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index 1fc3f95..5311d13 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -1,7 +1,10 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* +import kotlinx.metadata.internal.common.* +import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.builtins.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ConstructorDescriptor @@ -11,25 +14,85 @@ import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.PropertyDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* -internal class ClassDescriptorImpl internal constructor( - val kmClass: KmClass, - override val module: ModuleDescriptor, - override val classId: ClassId, - override val kClass: KClassImpl<*> -) : ClassDescriptor { +internal class ClassDescriptorImpl internal constructor( + override val jClass: Class +) : ClassDescriptor { + + override val kmClass: KmClass = jClass.getKmClass() + + override val module = ModuleDescriptorImpl(jClass.safeClassLoader) + + override val classId: ClassId = jClass.classId + + private fun Class<*>.getKmClass(): KmClass { + val builtinClassId = JavaToKotlinClassMap.mapJavaToKotlin(FqName(name)) + return if (builtinClassId != null) { + val packageName = builtinClassId.packageFqName + // kotlin.collections -> kotlin/collections/collections.kotlin_builtins + val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" + val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() + ?: error("No builtins metadata file found: $resourcePath") // TODO: return null + val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() + ?: error("Incompatible metadata version: $resourcePath") // TODO + packageFragment.classes.find { it.name == builtinClassId.asClassName() } + ?: error("Built-in class not found: $builtinClassId in $resourcePath") + } else { + val header = getAnnotation(Metadata::class.java)?.let { + KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) + } ?: error("@Metadata annotation was not found for ${name} ") + val metadata = KotlinClassMetadata.read(header) + (metadata as? KotlinClassMetadata.Class)?.toKmClass() + ?: error("KotlinClassMetadata.Class metadata is only supported for now") + } + } + override val name: Name get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') + override val simpleName: String? + get() { + if (jClass.isAnonymousClass) return null + + val classId = jClass.classId + return when { + classId.isLocal -> calculateLocalClassName(jClass) + else -> classId.shortClassName + } + } + + override val qualifiedName: String? + get() { + if (jClass.isAnonymousClass) return null + + val classId = jClass.classId + return when { + classId.isLocal -> null + else -> classId.asSingleFqName().asString() + } + } + + private fun calculateLocalClassName(jClass: Class<*>): String { + val name = jClass.simpleName + jClass.enclosingMethod?.let { method -> + return name.substringAfter(method.name + "$") + } + jClass.enclosingConstructor?.let { constructor -> + return name.substringAfter(constructor.name + "$") + } + return name.substringAfter('$') + } + override val constructors: List get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this) } - override val nestedClasses: List - get() = kmClass.nestedClasses.map { module.findClass(classId.createNestedClassId(it).asClassName()) } + override val nestedClasses: List> + get() = kmClass.nestedClasses.map { module.findClass(classId.createNestedClassId(it).asClassName()) } - override val sealedSubclasses: List - get() = kmClass.sealedSubclasses.map(module::findClass) + override val sealedSubclasses: List> + get() = kmClass.sealedSubclasses.map { module.findClass(it) } override val properties: List get() = kmClass.properties.map { PropertyDescriptorImpl(it, module, this) } @@ -48,11 +111,11 @@ internal class ClassDescriptorImpl internal constructor( override val visibility: KVisibility? get() = kmClass.flags.toVisibility() - internal val typeParameterTable: TypeParameterTable = + override val typeParameterTable: TypeParameterTable = kmClass.typeParameters.toTypeParameters(this, module, containingClass?.typeParameterTable) - internal val containingClass: ClassDescriptorImpl? - get() = classId.getOuterClassId()?.let { module.findClass(it.asClassName()) as ClassDescriptorImpl? } + internal val containingClass: ClassDescriptor<*>? + get() = classId.getOuterClassId()?.let { module.findClass(it.asClassName()) } override val typeParameters: List get() = typeParameterTable.typeParameters diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index b039069..e17dae1 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -1,6 +1,7 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ConstructorDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor @@ -11,7 +12,7 @@ import kotlinx.reflect.lite.name.* internal class ConstructorDescriptorImpl( val kmCons: KmConstructor, override val module: ModuleDescriptor, - override val containingClass: ClassDescriptorImpl + override val containingClass: ClassDescriptor<*> ) : AbstractFunctionDescriptor(), ConstructorDescriptor { override val flags: Flags get() = kmCons.flags diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 3e99e93..8211bb9 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -1,6 +1,7 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.FunctionDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor @@ -8,7 +9,7 @@ import kotlinx.reflect.lite.descriptors.ValueParameterDescriptor import kotlinx.reflect.lite.descriptors.ValueParameterDescriptorImpl import kotlinx.reflect.lite.name.* -abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor(), FunctionDescriptor { +abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, FunctionDescriptor { override val isInline: Boolean get() = Flag.Function.IS_INLINE(flags) override val isExternal: Boolean @@ -24,7 +25,7 @@ abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor(), Functi internal class FunctionDescriptorImpl( val kmFunction: KmFunction, override val module: ModuleDescriptor, - override val containingClass: ClassDescriptorImpl? + override val containingClass: ClassDescriptor<*>? ) : AbstractFunctionDescriptor() { override val flags: Flags get() = kmFunction.flags diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 4045c7c..6bf8b49 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -42,7 +42,7 @@ internal class TypeProjection( internal fun KmType.toKotlinType(module: ModuleDescriptor, typeParameterTable: TypeParameterTable): KotlinType { val classifier = classifier.let { classifier -> when (classifier) { - is KmClassifier.Class -> module.findClass(classifier.name) + is KmClassifier.Class -> module.findClass(classifier.name) is KmClassifier.TypeParameter -> typeParameterTable.get(classifier.id) is KmClassifier.TypeAlias -> TODO() } @@ -74,7 +74,7 @@ internal fun List.toTypeParameters( internal val ClassifierDescriptor.kotlinType: KotlinType get() = KotlinType( this, - (this as? ClassDescriptor)?.typeParameters?.map { + (this as? ClassDescriptor<*>)?.typeParameters?.map { TypeProjection(it.kotlinType, false, KVariance.INVARIANT) }.orEmpty(), false diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index 60c5a4c..544c7a8 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -4,14 +4,13 @@ import kotlinx.metadata.* import kotlinx.reflect.lite.builtins.* import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor -import kotlinx.reflect.lite.impl.KClassImpl import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* -internal class ModuleDescriptorImpl(private val classLoader: ClassLoader) : ModuleDescriptor { - override fun findClass(name: ClassName): ClassDescriptor { +internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : ModuleDescriptor { + override fun findClass (name: ClassName): ClassDescriptor { val fqName = (JavaToKotlinClassMap.mapKotlinToJava(FqName(name.replace('/', '.'))) ?: ClassId(name)).asJavaLookupFqName() val jClass = classLoader.tryLoadClass(fqName) ?: error("Failed to load the class: $fqName") - return KClassImpl(jClass).descriptor + return ClassDescriptorImpl(jClass as Class) } } \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index d5596db..1515317 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -1,6 +1,7 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.PropertyDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor @@ -10,8 +11,8 @@ import kotlinx.reflect.lite.name.* internal class PropertyDescriptorImpl( val kmProperty: KmProperty, override val module: ModuleDescriptor, - override val containingClass: ClassDescriptorImpl? -) : AbstractCallableDescriptor(), PropertyDescriptor { + override val containingClass: ClassDescriptor<*>? +) : AbstractCallableDescriptor, PropertyDescriptor { override val flags: Flags get() = kmProperty.flags diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index fe56e48..f40d3ac 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -1,64 +1,17 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.ClassDescriptor -import kotlinx.reflect.lite.descriptors.impl.ClassDescriptorImpl -import kotlinx.reflect.lite.descriptors.impl.ModuleDescriptorImpl -import kotlinx.reflect.lite.internal.* -import kotlinx.reflect.lite.misc.* -internal class KClassImpl( - val jClass: Class +internal class KClassImpl( + private val descriptor: ClassDescriptor ) : KClass { - val descriptor: ClassDescriptor by ReflectProperties.lazySoft { - createClassDescriptor() - } - - private fun createClassDescriptor(): ClassDescriptor { - val header = jClass.getAnnotation(Metadata::class.java)?.let { - KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) - } ?: error("@Metadata annotation was not found for ${jClass.name} ") - val metadata = KotlinClassMetadata.read(header) - val kmClass = (metadata as? KotlinClassMetadata.Class)?.toKmClass() - ?: error("KotlinClassMetadata.Class metadata is only supported for now") - val module = ModuleDescriptorImpl(jClass.safeClassLoader) - return ClassDescriptorImpl(kmClass, module, jClass.classId, this@KClassImpl) - } - override val simpleName: String? - get() { - if (jClass.isAnonymousClass) return null - - val classId = jClass.classId - return when { - classId.isLocal -> calculateLocalClassName(jClass) - else -> classId.shortClassName - } - } + get() = descriptor.simpleName override val qualifiedName: String? - get() { - if (jClass.isAnonymousClass) return null - - val classId = jClass.classId - return when { - classId.isLocal -> null - else -> classId.asSingleFqName().asString() - } - } - - private fun calculateLocalClassName(jClass: Class<*>): String { - val name = jClass.simpleName - jClass.enclosingMethod?.let { method -> - return name.substringAfter(method.name + "$") - } - jClass.enclosingConstructor?.let { constructor -> - return name.substringAfter(constructor.name + "$") - } - return name.substringAfter('$') - } + get() = descriptor.qualifiedName override val constructors: Collection> get() = @@ -72,18 +25,11 @@ internal class KClassImpl( } override val nestedClasses: Collection> - get() = descriptor.nestedClasses.map { nestedClassDesc -> - nestedClassDesc.kClass.jClass.let { KClassImpl(it) } - } + get() = descriptor.nestedClasses.map(::KClassImpl) override val sealedSubclasses: List> - get() = descriptor.sealedSubclasses.mapNotNull { subclassDesc -> - @Suppress("UNCHECKED_CAST") - val jClass = subclassDesc.kClass.jClass as Class? - jClass?.let { KClassImpl(it) } - } + get() = descriptor.sealedSubclasses.map(::KClassImpl) - // TODO: inherited members override val members: Collection> get() = descriptor.functions.map(::KFunctionImpl) + descriptor.properties.map(::KPropertyImpl) diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 895cf4b..51acb26 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -11,10 +11,9 @@ internal class KTypeImpl( override val classifier: KClassifier? get() = when (val descriptor = type.classifierDescriptor) { - is ClassDescriptor -> { - val jClass = descriptor.kClass.jClass + is ClassDescriptor<*> -> { // TODO array types - KClassImpl(jClass) + KClassImpl(descriptor) } is TypeParameterDescriptor -> KTypeParameterImpl(descriptor) is TypeAliasDescriptor -> TODO("Type alias classifiers are not yet supported") diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 5e6c676..8ba655f 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -17,10 +17,12 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.impl.ClassDescriptorImpl internal object ReflectionLiteImpl { // TODO some entry point API - fun loadClassMetadata(klass: Class): KClass { - return KClassImpl(klass) + fun loadClassMetadata(jClass: Class): KClass { + val descriptor = ClassDescriptorImpl(jClass) + return KClassImpl(descriptor) } } \ No newline at end of file From 3f84f57b4888f30316bfbc3ad2e8661e71bcb29c Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 16 Feb 2022 22:11:50 +0300 Subject: [PATCH 08/74] Some tests for parameter and type api --- .../lite/testData/classes/classMembers.kt | 6 +++++ .../lite/testData/parameters/bigArity.kt | 8 +++++++ .../parameters/boundInnerClassConstructor.kt | 11 ++++++++-- .../parameters/boundObjectMemberReferences.kt | 21 +++++++++++++----- .../testData/parameters/boundReferences.kt | 22 +++++++++++++------ .../tests/{KClassTests.kt => KClassTest.kt} | 11 ++++++---- .../reflect/lite/tests/KParameterTest.kt | 17 ++++++++++++++ 7 files changed, 78 insertions(+), 18 deletions(-) rename src/test/java/kotlinx/reflect/lite/tests/{KClassTests.kt => KClassTest.kt} (95%) create mode 100644 src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt index 3818f64..473d7b9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt @@ -12,8 +12,14 @@ class Derived : Base() { val b = 20 fun bar() {} + + companion object { + fun staticFun() {} + } } +fun Derived.extFun() {} + fun box(): String { Derived::class.java.toLiteKClass().members.forEach { println(it.name) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt index efdbfbc..bd9309c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt @@ -1,5 +1,6 @@ package tests.parameters.bigArity +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals class A @@ -11,10 +12,17 @@ data class BigDataClass( ) fun box(): String { + // TODO: ::copy is not supported, kotlin.reflect.KCallable.parameters is called assertEquals( "[null, p00, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, " + "p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29]", BigDataClass::copy.parameters.map { it.name }.toString() ) + val kClass = BigDataClass::class.java.toLiteKClass() + assertEquals( + "[p00, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, " + + "p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29]", + kClass.constructors.first().parameters.map { it.name }.toString() + ) return "OK" } \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt index 9614fb1..483ade1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt @@ -1,7 +1,8 @@ package tests.parameters.boundInnerClassConstructor -import kotlin.reflect.KParameter +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals +import kotlinx.reflect.lite.KParameter class Outer(val s1: String) { inner class Inner(val s2: String, val s3: String = "K") { @@ -15,7 +16,13 @@ fun KParameter.check(name: String) { } fun box(): String { - val ctor = Outer("O")::Inner + // TODO: metadata of Outer("O")::Inner is KotlinClassMetadata.Synthetic + //val ctor = Outer("O")::Inner::class.java.toLiteKClass().constructors.first() + + // as KotlinClassMetadata.Class is only supported now, extract Inner via nestedClasses api + val innerClass = Outer("O")::class.java.toLiteKClass().nestedClasses.first() + assertEquals("Inner", innerClass.simpleName) + val ctor = innerClass.constructors.first() val ctorPararms = ctor.parameters ctorPararms[0].check("s2") diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt index 83e65e5..d58508d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt @@ -1,23 +1,34 @@ package tests.parameters.boundObjectMemberReferences +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.reflect.* import kotlin.reflect.jvm.* -import kotlin.test.assertEquals +import kotlin.test.* object Host { fun foo(i: Int, s: String) {} } fun box(): String { - val fooParams = Host::foo.parameters + val foo = Host::class.java.toLiteKClass().members.find { it.name == "foo" } + ?: error("function foo is not found in the Host object") + val fooParams = foo.parameters - assertEquals(2, fooParams.size) + //assertEquals(2, fooParams.size) + + //assertEquals("i", fooParams[0].name) + // TODO: javaType is not KType.javaType is not supported + //assertEquals(Int::class.java, fooParams[0].type.javaType) assertEquals("i", fooParams[0].name) - assertEquals(Int::class.java, fooParams[0].type.javaType) + assertEquals("java.lang.Integer", (fooParams[0].type!!.classifier as KClassImpl<*>).qualifiedName) + + // TODO: javaType is not KType.javaType is not supported + //assertEquals(String::class.java, fooParams[1].type.javaType) assertEquals("s", fooParams[1].name) - assertEquals(String::class.java, fooParams[1].type.javaType) + assertEquals("java.lang.String", (fooParams[1].type!!.classifier as KClassImpl<*>).qualifiedName) return "OK" } \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt index 103db76..9a91065 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt @@ -1,6 +1,7 @@ package tests.parameters.boundReferences -import kotlin.reflect.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* import kotlin.test.* class C { @@ -16,16 +17,23 @@ fun KParameter.check(name: String) { } fun box(): String { - val cFoo = C()::foo - val cBar = C()::bar - val cExtFun = C()::extFun + val kClass = C::class.java.toLiteKClass() + val cFoo = kClass.members.find { it.name == "foo" } as KFunction + val cBar = kClass.members.find { it.name == "bar" } as KProperty + // TODO extesnion functions are not supported yet + val cExtFun = kClass.members.find { it.name == "extFun" } as KFunction assertEquals(0, cFoo.parameters.size) + // TODO assertEquals(0, cBar.getter.parameters.size) - assertEquals(1, cBar.setter.parameters.size) + assertFalse(cBar.isConst) + assertFalse(cBar.isLateinit) - assertEquals(1, cExtFun.parameters.size) - cExtFun.parameters[0].check("i") + // TODO mutable properties are not supported yet + //assertEquals(1, cBar.setter.parameters.size) + + //assertEquals(1, cExtFun.parameters.size) + //cExtFun.parameters[0].check("i") return "OK" } \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/tests/KClassTests.kt b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt similarity index 95% rename from src/test/java/kotlinx/reflect/lite/tests/KClassTests.kt rename to src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt index e887a70..ce8a156 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KClassTests.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt @@ -2,16 +2,14 @@ package kotlinx.reflect.lite.tests import org.junit.* -class KClassTests { +class KClassTest { + // names @Test fun testClassSimpleName() = test("classes.classSimpleName") { tests.classes.classSimpleName.box() } @Test fun testLocalClassSimpleName() = test("classes.localClassSimpleName") { tests.classes.localClassSimpleName.box() } - @Test - fun testNestedClasses() = test("classes.nestedClasses") { tests.classes.nestedClasses.box() } - @Test fun testQualifiedName() = test("classes.qualifiedName") { tests.classes.qualifiedName.box() } @@ -19,6 +17,11 @@ class KClassTests { @Test fun testQualifiedNameOfStandardClasses() = test("classes.qualifiedNameOfStandardClasses") { tests.classes.qualifiedNameOfStandardClasses.box() } + // nested classes + @Test + fun testNestedClasses() = test("classes.nestedClasses") { tests.classes.nestedClasses.box() } + + // sealed classes @Test fun testSealedSubClasses() = test("classes.sealedSubclasses") { tests.classes.sealedSubclasses.box() } diff --git a/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt new file mode 100644 index 0000000..abd3ed3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt @@ -0,0 +1,17 @@ +package kotlinx.reflect.lite.tests + +import org.junit.* + +class KParameterTest { + @Test + fun testBigArity() = test("parameters.bigArity") { tests.parameters.bigArity.box() } + + @Test + fun testBoundInnerClassConstructor() = test("parameters.boundInnerClassConstructor") { tests.parameters.boundInnerClassConstructor.box() } + + @Test + fun testBoundObjectMemberReferences() = test("parameters.boundObjectMemberReferences") { tests.parameters.boundObjectMemberReferences.box() } + + @Test + fun testBoundReferences() = test("parameters.boundReferences") { tests.parameters.boundReferences.box() } +} \ No newline at end of file From 78767406c16eefd724ef7525b87f060c81db0d3e Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 18 Jul 2022 10:21:43 +0200 Subject: [PATCH 09/74] Update Kotlin to 1.7.10 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index be85792..e7be224 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - kotlin("jvm") version "1.6.10" + kotlin("jvm") version "1.7.10" `java-gradle-plugin` `maven-publish` } From 5dc9c079f7b0cead4477eb4ad828b782e81738eb Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 18 Jul 2022 10:26:30 +0200 Subject: [PATCH 10/74] Support inherited class members --- .../reflect/lite/descriptors/descriptors.kt | 23 +++++-- .../descriptors/impl/ClassDescriptorImpl.kt | 67 ++++++++++++++----- .../impl/ConstructorDescriptorImpl.kt | 20 +++++- .../kotlinx/reflect/lite/impl/KClassImpl.kt | 8 +-- .../reflect/lite/impl/ReflectionLiteImpl.kt | 3 +- 5 files changed, 93 insertions(+), 28 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 1874cba..82d2e31 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -2,9 +2,12 @@ package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.impl.KotlinType import kotlinx.reflect.lite.descriptors.impl.TypeParameterTable +import kotlinx.reflect.lite.impl.KCallableImpl import kotlinx.reflect.lite.name.* +import java.lang.reflect.* internal interface ModuleDescriptor { fun findClass(name: ClassName): ClassDescriptor<*> @@ -31,7 +34,17 @@ internal interface DeclarationDescriptor : Annotated { val name: Name } -internal interface DeclarationContainerDescriptor +internal interface DeclarationContainerDescriptor { + val jClass: Class<*> + + val declaredMembers: Collection> + val allMembers: Collection> + + fun findConstructorBySignature(desc: String): Constructor<*>? + fun findMethodBySignature(name: String, desc: String): Method? + fun findDefaultConstructor(desc: String): Constructor<*>? + fun findDefaultMethod(name: String, desc: String, isMember: Boolean): Method? +} internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierDescriptor { val jClass: Class<*> @@ -49,6 +62,8 @@ internal interface ClassDescriptor : DeclarationContainerDescriptor, Clas val functions: List val memberScope: MemberScope + val containingClass: ClassDescriptor<*>? + val typeParameterTable: TypeParameterTable val typeParameters: List val supertypes: List @@ -57,7 +72,7 @@ internal interface ClassDescriptor : DeclarationContainerDescriptor, Clas val isInterface: Boolean val isObject: Boolean - val isCompanionObject: Boolean + val isCompanion: Boolean val isFinal: Boolean val isOpen: Boolean @@ -65,7 +80,6 @@ internal interface ClassDescriptor : DeclarationContainerDescriptor, Clas val isSealed: Boolean val isData: Boolean val isInner: Boolean - val isCompanion: Boolean val isFun: Boolean val isValue: Boolean } @@ -78,6 +92,7 @@ internal class MemberScope( internal interface CallableDescriptor : DeclarationDescriptor { val module: ModuleDescriptor val containingClass: ClassDescriptor<*>? + val container: DeclarationContainerDescriptor val valueParameters: List @@ -147,4 +162,4 @@ internal interface TypeParameterDescriptor : ClassifierDescriptor { val isReified: Boolean } -internal interface TypeAliasDescriptor : ClassifierDescriptor \ No newline at end of file +internal interface TypeAliasDescriptor : ClassifierDescriptor diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index 5311d13..3fea3c4 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -10,25 +10,53 @@ import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ConstructorDescriptor import kotlinx.reflect.lite.descriptors.FunctionDescriptor import kotlinx.reflect.lite.descriptors.MemberScope -import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.PropertyDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor -import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* internal class ClassDescriptorImpl internal constructor( override val jClass: Class -) : ClassDescriptor { +) : ClassDescriptor, DeclarationContainerDescriptorImpl() { override val kmClass: KmClass = jClass.getKmClass() override val module = ModuleDescriptorImpl(jClass.safeClassLoader) - override val classId: ClassId = jClass.classId + override val classId: ClassId = RuntimeTypeMapper.mapJvmClassToKotlinClassId(jClass) private fun Class<*>.getKmClass(): KmClass { - val builtinClassId = JavaToKotlinClassMap.mapJavaToKotlin(FqName(name)) + val className = jClass.name + val builtinClassId = when (className) { + "[Ljava.lang.Object;" -> ClassId(FqName("kotlin"), "Array") + // TODO: move this into mapJavaToKotlin + "[Z" -> ClassId(FqName("kotlin"), "BooleanArray") + "[B" -> ClassId(FqName("kotlin"), "ByteArray") + "[C" -> ClassId(FqName("kotlin"), "CharArray") + "[D" -> ClassId(FqName("kotlin"), "DoubleArray") + "[F" -> ClassId(FqName("kotlin"), "FloatArray") + "[I" -> ClassId(FqName("kotlin"), "IntArray") + "[J" -> ClassId(FqName("kotlin"), "LongArray") + "[S" -> ClassId(FqName("kotlin"), "ShortArray") + "java.lang.Void" -> ClassId(FqName("kotlin"), "Nothing") // TODO: ??? + else -> when { + jClass.isPrimitive -> { + when (jClass) { + Boolean::class.java -> ClassId(FqName("kotlin"), "Boolean") + Byte::class.java -> ClassId(FqName("kotlin"), "Byte") + Char::class.java -> ClassId(FqName("kotlin"), "Char") + Double::class.java -> ClassId(FqName("kotlin"), "Double") + Float::class.java -> ClassId(FqName("kotlin"), "Float") + Int::class.java -> ClassId(FqName("kotlin"), "Int") + Long::class.java -> ClassId(FqName("kotlin"), "Long") + Short::class.java -> ClassId(FqName("kotlin"), "Short") + else -> error(jClass) + } + } + else -> JavaToKotlinClassMap.mapJavaToKotlin(jClass.classId.asSingleFqName()) + } + } return if (builtinClassId != null) { val packageName = builtinClassId.packageFqName // kotlin.collections -> kotlin/collections/collections.kotlin_builtins @@ -86,7 +114,7 @@ internal class ClassDescriptorImpl internal constructor( } override val constructors: List - get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this) } + get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this, this) } override val nestedClasses: List> get() = kmClass.nestedClasses.map { module.findClass(classId.createNestedClassId(it).asClassName()) } @@ -95,26 +123,35 @@ internal class ClassDescriptorImpl internal constructor( get() = kmClass.sealedSubclasses.map { module.findClass(it) } override val properties: List - get() = kmClass.properties.map { PropertyDescriptorImpl(it, module, this) } + get() = kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) } override val functions: List - get() = kmClass.functions.map { FunctionDescriptorImpl(it, module, this) } + get() = kmClass.functions.map { + FunctionDescriptorImpl(it, module, this, this) + } // TODO: static members - // TODO: function and property fake overrides override val memberScope: MemberScope get() = MemberScope( - kmClass.properties.map { PropertyDescriptorImpl(it, module, this) }, - kmClass.functions.map { FunctionDescriptorImpl(it, module, this) } + kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) }.let { realProperties -> + realProperties + addPropertyFakeOverrides(this, realProperties) + }, + kmClass.functions.map { FunctionDescriptorImpl(it, module, this, this) }.let { realFunctions -> + realFunctions + addFunctionFakeOverrides(this, realFunctions) + } ) + // TODO: static scope + override val staticScope: MemberScope + get() = MemberScope(emptyList(), emptyList()) + override val visibility: KVisibility? get() = kmClass.flags.toVisibility() override val typeParameterTable: TypeParameterTable = kmClass.typeParameters.toTypeParameters(this, module, containingClass?.typeParameterTable) - internal val containingClass: ClassDescriptor<*>? + override val containingClass: ClassDescriptor<*>? get() = classId.getOuterClassId()?.let { module.findClass(it.asClassName()) } override val typeParameters: List @@ -127,7 +164,7 @@ internal class ClassDescriptorImpl internal constructor( get() = Flag.Class.IS_INTERFACE(kmClass.flags) override val isObject: Boolean get() = Flag.Class.IS_OBJECT(kmClass.flags) - override val isCompanionObject: Boolean + override val isCompanion: Boolean get() = Flag.Class.IS_COMPANION_OBJECT(kmClass.flags) override val isFinal: Boolean get() = Flag.Common.IS_FINAL(kmClass.flags) @@ -141,10 +178,8 @@ internal class ClassDescriptorImpl internal constructor( get() = Flag.Class.IS_DATA(kmClass.flags) override val isInner: Boolean get() = Flag.Class.IS_INNER(kmClass.flags) - override val isCompanion: Boolean - get() = Flag.Class.IS_COMPANION_OBJECT(kmClass.flags) override val isFun: Boolean get() = Flag.Class.IS_FUN(kmClass.flags) override val isValue: Boolean get() = Flag.Class.IS_VALUE(kmClass.flags) -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index e17dae1..912e9df 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -12,7 +12,8 @@ import kotlinx.reflect.lite.name.* internal class ConstructorDescriptorImpl( val kmCons: KmConstructor, override val module: ModuleDescriptor, - override val containingClass: ClassDescriptor<*> + override val containingClass: ClassDescriptor<*>, + override val container: DeclarationContainerDescriptor ) : AbstractFunctionDescriptor(), ConstructorDescriptor { override val flags: Flags get() = kmCons.flags @@ -31,6 +32,21 @@ internal class ConstructorDescriptorImpl( override val typeParameters: List get() = emptyList() + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = if (containingClass.isInner) ReceiverParameterDescriptorImpl(containingClass.containingClass!!.defaultType, this) else null + + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = null + override val returnType: KotlinType get() = containingClass.kotlinType -} \ No newline at end of file + + private val jvmSignature: JvmFunctionSignature.KotlinConstructor + get() = JvmFunctionSignature.KotlinConstructor(kmCons.signature ?: error("No constructor signature for ${kmCons}")) + + override val member: Member? + get() = container.findConstructorBySignature(jvmSignature.constructorDesc) + + override val defaultMember: Member? + get() = container.findDefaultConstructor(jvmSignature.constructorDesc) +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index f40d3ac..8c7a9c3 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -4,7 +4,7 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.ClassDescriptor internal class KClassImpl( - private val descriptor: ClassDescriptor + val descriptor: ClassDescriptor ) : KClass { override val simpleName: String? @@ -15,7 +15,7 @@ internal class KClassImpl( override val constructors: Collection> get() = - if (descriptor.isInterface || descriptor.isObject || descriptor.isCompanionObject) { + if (descriptor.isInterface || descriptor.isObject || descriptor.isCompanion) { emptyList() } else { descriptor.constructors.map { @@ -31,7 +31,7 @@ internal class KClassImpl( get() = descriptor.sealedSubclasses.map(::KClassImpl) override val members: Collection> - get() = descriptor.functions.map(::KFunctionImpl) + descriptor.properties.map(::KPropertyImpl) + get() = descriptor.allMembers override val visibility: KVisibility? get() = descriptor.visibility @@ -60,4 +60,4 @@ internal class KClassImpl( get() = descriptor.isFun override val isValue: Boolean get() = descriptor.isValue -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 8ba655f..2712ec7 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -20,9 +20,8 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.ClassDescriptorImpl internal object ReflectionLiteImpl { - // TODO some entry point API fun loadClassMetadata(jClass: Class): KClass { - val descriptor = ClassDescriptorImpl(jClass) + val descriptor = ClassDescriptorImpl(jClass) return KClassImpl(descriptor) } } \ No newline at end of file From a5276f0d46b45fd09bf6ef8b6d844c5ca69a5f24 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 18 Jul 2022 10:30:18 +0200 Subject: [PATCH 11/74] KCallable: call, callBy --- .../java/kotlinx/reflect/lite/KCallable.kt | 4 +- .../java/kotlinx/reflect/lite/KProperty.kt | 7 +- .../kotlinx/reflect/lite/builtins/JvmAbi.kt | 11 + .../java/kotlinx/reflect/lite/calls/Caller.kt | 29 +++ .../kotlinx/reflect/lite/calls/CallerImpl.kt | 245 ++++++++++++++++++ .../reflect/lite/calls/ThrowingCaller.kt | 19 ++ .../reflect/lite/descriptors/descriptors.kt | 26 +- .../impl/AbstractCallableDescriptor.kt | 2 +- .../impl/ConstructorDescriptorImpl.kt | 10 +- .../DeclarationContainerDescriptorImpl.kt | 206 +++++++++++++++ .../impl/FunctionDescriptorImpl.kt | 82 +++++- .../lite/descriptors/impl/KotlinType.kt | 20 +- .../impl/PropertyDescriptorImpl.kt | 123 ++++++++- .../impl/ReceiverParameterDescriptorImpl.kt | 11 + .../reflect/lite/impl/KCallableImpl.kt | 95 ++++++- .../reflect/lite/impl/KFunctionImpl.kt | 2 +- .../reflect/lite/impl/KParameterImpl.kt | 12 +- .../reflect/lite/impl/KPropertyImpl.kt | 12 +- .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 5 +- .../impl/KotlinReflectionInternalError.kt | 8 + .../java/kotlinx/reflect/lite/impl/util.kt | 211 +++++++++++++++ .../reflect/lite/misc/JvmClassMapping.kt | 86 ++++++ .../reflect/lite/misc/RuntimeTypeMapper.kt | 195 ++++++++++++++ .../java/kotlinx/reflect/lite/misc/util.kt | 29 ++- .../java/kotlinx/reflect/lite/name/names.kt | 3 + .../reflect/lite/testData/call/bigArity.kt | 11 +- .../call/cannotCallEnumConstructor.kt | 11 +- .../testData/call/equalsHashCodeToString.kt | 56 ++-- .../lite/testData/call/exceptionHappened.kt | 4 +- .../lite/testData/call/fakeOverride.kt | 6 +- .../testData/call/fakeOverrideSubstituted.kt | 6 +- .../testData/call/innerClassConstructor.kt | 12 +- .../lite/testData/call/localClassMember.kt | 10 +- .../testData/call/memberOfGenericClass.kt | 9 +- .../lite/testData/call/simpleConstructor.kt | 7 +- .../testData/call/simpleMemberFunction.kt | 8 +- .../testData/call/simpleTopLevelFunctions.kt | 2 +- .../testData/callBy/simpleMemberFunciton.kt | 16 +- .../lite/testData/classes/classSimpleName.kt | 5 +- .../lite/testData/classes/qualifiedName.kt | 6 +- .../testData/parameters/boundReferences.kt | 10 +- .../reflect/lite/tests/KCallableTest.kt | 43 +++ .../kotlinx/reflect/lite/tests/testUtil.kt | 11 +- 43 files changed, 1556 insertions(+), 130 deletions(-) create mode 100644 src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt create mode 100644 src/main/java/kotlinx/reflect/lite/calls/Caller.kt create mode 100644 src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/DeclarationContainerDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/util.kt create mode 100644 src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt create mode 100644 src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt create mode 100644 src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt diff --git a/src/main/java/kotlinx/reflect/lite/KCallable.kt b/src/main/java/kotlinx/reflect/lite/KCallable.kt index 6c3f04d..cf29650 100644 --- a/src/main/java/kotlinx/reflect/lite/KCallable.kt +++ b/src/main/java/kotlinx/reflect/lite/KCallable.kt @@ -44,14 +44,14 @@ public interface KCallable : KAnnotatedElement { * Throws an exception if the number of specified arguments is not equal to the size of [parameters], * or if their types do not match the types of the parameters. */ - private fun call(vararg args: Any?): R = TODO() + public fun call(vararg args: Any?): R /** * Calls this callable with the specified mapping of parameters to arguments and returns the result. * If a parameter is not found in the mapping and is not optional (as per [KParameter.isOptional]), * or its type does not match the type of the provided value, an exception is thrown. */ - private fun callBy(args: Map): R = TODO() + public fun callBy(args: Map): R /** * Visibility of this callable, or `null` if its visibility cannot be represented in Kotlin. diff --git a/src/main/java/kotlinx/reflect/lite/KProperty.kt b/src/main/java/kotlinx/reflect/lite/KProperty.kt index 8941784..48fa2dc 100644 --- a/src/main/java/kotlinx/reflect/lite/KProperty.kt +++ b/src/main/java/kotlinx/reflect/lite/KProperty.kt @@ -24,7 +24,6 @@ public interface KProperty : KCallable { /** The getter of this property, used to obtain the value of the property. */ public val getter: Getter - get() = TODO("Not implemented yet") /** * Represents a property accessor, which is a `get` or `set` method declared alongside the property. @@ -75,7 +74,7 @@ public interface KProperty0 : KProperty, () -> V { * for more information. */ @SinceKotlin("1.1") - public fun getDelegate(): Any? + private fun getDelegate(): Any? = TODO() override val getter: Getter @@ -140,7 +139,7 @@ public interface KProperty1 : KProperty, (T) -> V { * @see [kotlin.reflect.full.getExtensionDelegate] // [KProperty1.getExtensionDelegate] */ @SinceKotlin("1.1") - public fun getDelegate(receiver: T): Any? + private fun getDelegate(receiver: T): Any? = TODO() override val getter: Getter @@ -211,7 +210,7 @@ public interface KProperty2 : KProperty, (D, E) -> V { * @see [kotlin.reflect.full.getExtensionDelegate] // [KProperty2.getExtensionDelegate] */ @SinceKotlin("1.1") - public fun getDelegate(receiver1: D, receiver2: E): Any? + private fun getDelegate(receiver1: D, receiver2: E): Any? = TODO() override val getter: Getter diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt new file mode 100644 index 0000000..9c89bd2 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt @@ -0,0 +1,11 @@ +package kotlinx.reflect.lite.builtins + +object JvmAbi { + fun getterName(name: String): String = "get" + name.capitalize() + + const val INSTANCE_FIELD = "INSTANCE" + const val DEFAULT_PARAMS_IMPL_SUFFIX = "\$default" + const val DEFAULT_IMPLS_CLASS_NAME = "DefaultImpls" + const val DEFAULT_IMPLS_SUFFIX = "$$DEFAULT_IMPLS_CLASS_NAME" + const val IMPL_SUFFIX_FOR_INLINE_CLASS_MEMBERS = "-impl" +} diff --git a/src/main/java/kotlinx/reflect/lite/calls/Caller.kt b/src/main/java/kotlinx/reflect/lite/calls/Caller.kt new file mode 100644 index 0000000..ab6d915 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/calls/Caller.kt @@ -0,0 +1,29 @@ +// Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/Caller.kt +package kotlinx.reflect.lite.calls + +import java.lang.reflect.Member +import java.lang.reflect.Type + +internal interface Caller { + val member: M + + val returnType: Type + + val parameterTypes: List + + fun checkArguments(args: Array<*>) { + if (arity != args.size) { + throw IllegalArgumentException("Callable expects $arity arguments, but ${args.size} were provided.") + } + } + + fun call(args: Array<*>): Any? +} + +internal val Caller<*>.arity: Int + get() = parameterTypes.size + +/** + * A marker interface that signifies that this caller has a "bound receiver" object which should be used as the dispatch receiver instance. + */ +interface BoundCaller \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt new file mode 100644 index 0000000..537685f --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt @@ -0,0 +1,245 @@ +// Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/CallerImpl.kt +package kotlinx.reflect.lite.calls + +import java.lang.reflect.Member +import java.lang.reflect.Modifier +import java.lang.reflect.Type +import java.lang.reflect.Constructor as ReflectConstructor +import java.lang.reflect.Field as ReflectField +import java.lang.reflect.Method as ReflectMethod + +internal sealed class CallerImpl( + final override val member: M, + final override val returnType: Type, + val instanceClass: Class<*>?, + valueParameterTypes: Array +) : Caller { + override val parameterTypes: List = + instanceClass?.let { listOf(it, *valueParameterTypes) } ?: valueParameterTypes.toList() + + protected fun checkObjectInstance(obj: Any?) { + if (obj == null || !member.declaringClass.isInstance(obj)) { + throw IllegalArgumentException("An object member requires the object instance passed as the first argument.") + } + } + + class Constructor(constructor: ReflectConstructor<*>) : CallerImpl>( + constructor, + constructor.declaringClass, + constructor.declaringClass.let { klass -> + val outerClass = klass.declaringClass + if (outerClass != null && !Modifier.isStatic(klass.modifiers)) outerClass else null + }, + constructor.genericParameterTypes + ) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return member.newInstance(*args) + } + } + + // TODO fix 'callBy' for bound (and non-bound) inner class constructor references + // See https://youtrack.jetbrains.com/issue/KT-14990 + class BoundConstructor(constructor: ReflectConstructor<*>, private val boundReceiver: Any?) : BoundCaller, + CallerImpl>( + constructor, constructor.declaringClass, null, + constructor.genericParameterTypes + ) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return member.newInstance(boundReceiver, *args) + } + } + + class AccessorForHiddenConstructor( + constructor: ReflectConstructor<*> + ) : CallerImpl>( + constructor, constructor.declaringClass, null, + constructor.genericParameterTypes.dropLast() + ) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return member.newInstance(*args, null) + } + } + + class AccessorForHiddenBoundConstructor( + constructor: ReflectConstructor<*>, + private val boundReceiver: Any? + ) : CallerImpl>( + constructor, constructor.declaringClass, + null, + constructor.genericParameterTypes.dropFirstAndLast() + ), BoundCaller { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return member.newInstance(boundReceiver, *args, null) + } + } + + sealed class Method( + method: ReflectMethod, + requiresInstance: Boolean = !Modifier.isStatic(method.modifiers), + parameterTypes: Array = method.genericParameterTypes + ) : CallerImpl( + method, + method.genericReturnType, + if (requiresInstance) method.declaringClass else null, + parameterTypes + ) { + private val isVoidMethod = returnType == Void.TYPE + + protected fun callMethod(instance: Any?, args: Array<*>): Any? { + val result = member.invoke(instance, *args) + + // If this is a Unit function, the method returns void, Method#invoke returns null, while we should return Unit + return if (isVoidMethod) Unit else result + } + + class Static(method: ReflectMethod) : Method(method) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return callMethod(null, args) + } + } + + class Instance(method: ReflectMethod) : Method(method) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return callMethod(args[0], args.dropFirst()) + } + } + + class JvmStaticInObject(method: ReflectMethod) : Method(method, requiresInstance = true) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + checkObjectInstance(args.firstOrNull()) + return callMethod(null, args.dropFirst()) + } + } + + class BoundStatic(method: ReflectMethod, private val boundReceiver: Any?) : BoundCaller, Method( + method, requiresInstance = false, parameterTypes = method.genericParameterTypes.dropFirst() + ) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return callMethod(null, arrayOf(boundReceiver, *args)) + } + } + + class BoundInstance(method: ReflectMethod, private val boundReceiver: Any?) : BoundCaller, + Method(method, requiresInstance = false) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return callMethod(boundReceiver, args) + } + } + + class BoundJvmStaticInObject(method: ReflectMethod) : BoundCaller, Method(method, requiresInstance = false) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return callMethod(null, args) + } + } + } + + sealed class FieldGetter( + field: ReflectField, + requiresInstance: Boolean + ) : CallerImpl( + field, + field.genericType, + if (requiresInstance) field.declaringClass else null, + emptyArray() + ) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return member.get(if (instanceClass != null) args.first() else null) + } + + class Static(field: ReflectField) : FieldGetter(field, requiresInstance = false) + + class Instance(field: ReflectField) : FieldGetter(field, requiresInstance = true) + + class JvmStaticInObject(field: ReflectField) : FieldGetter(field, requiresInstance = true) { + override fun checkArguments(args: Array<*>) { + super.checkArguments(args) + checkObjectInstance(args.firstOrNull()) + } + } + + class BoundInstance(field: ReflectField, private val boundReceiver: Any?) : BoundCaller, + FieldGetter(field, requiresInstance = false) { + override fun call(args: Array<*>): Any? { + checkArguments(args) + return member.get(boundReceiver) + } + } + + class BoundJvmStaticInObject(field: ReflectField) : BoundCaller, FieldGetter(field, requiresInstance = false) + } + + sealed class FieldSetter( + field: ReflectField, + private val notNull: Boolean, + requiresInstance: Boolean + ) : CallerImpl( + field, + Void.TYPE, + if (requiresInstance) field.declaringClass else null, + arrayOf(field.genericType) + ) { + override fun checkArguments(args: Array<*>) { + super.checkArguments(args) + if (notNull && args.last() == null) { + throw IllegalArgumentException("null is not allowed as a value for this property.") + } + } + + override fun call(args: Array<*>): Any? { + checkArguments(args) + return member.set(if (instanceClass != null) args.first() else null, args.last()) + } + + class Static(field: ReflectField, notNull: Boolean) : FieldSetter(field, notNull, requiresInstance = false) + + class Instance(field: ReflectField, notNull: Boolean) : FieldSetter(field, notNull, requiresInstance = true) + + class JvmStaticInObject(field: ReflectField, notNull: Boolean) : FieldSetter(field, notNull, requiresInstance = true) { + override fun checkArguments(args: Array<*>) { + super.checkArguments(args) + checkObjectInstance(args.firstOrNull()) + } + } + + class BoundInstance(field: ReflectField, notNull: Boolean, private val boundReceiver: Any?) : BoundCaller, + FieldSetter(field, notNull, requiresInstance = false) { + override fun call(args: Array<*>): Any { + checkArguments(args) + return member.set(boundReceiver, args.first()) + } + } + + class BoundJvmStaticInObject(field: ReflectField, notNull: Boolean) : BoundCaller, + FieldSetter(field, notNull, requiresInstance = false) { + override fun call(args: Array<*>): Any { + checkArguments(args) + return member.set(null, args.last()) + } + } + } + + companion object { + @Suppress("UNCHECKED_CAST") + inline fun Array.dropFirst(): Array = + if (size <= 1) emptyArray() else copyOfRange(1, size) as Array + + @Suppress("UNCHECKED_CAST") + inline fun Array.dropLast(): Array = + if (size <= 1) emptyArray() else copyOfRange(0, size - 1) as Array + + @Suppress("UNCHECKED_CAST") + inline fun Array.dropFirstAndLast(): Array = + if (size <= 2) emptyArray() else copyOfRange(1, size - 1) as Array + } +} diff --git a/src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt b/src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt new file mode 100644 index 0000000..df37305 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt @@ -0,0 +1,19 @@ +// Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/ThrowingCaller.kt +package kotlinx.reflect.lite.calls + +import java.lang.reflect.Type + +internal object ThrowingCaller : Caller { + override val member: Nothing? + get() = null + + override val parameterTypes: List + get() = emptyList() + + override val returnType: Type + get() = Void.TYPE + + override fun call(args: Array<*>): Any? { + throw UnsupportedOperationException("call/callBy are not supported for this declaration.") + } +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 82d2e31..c6d3f77 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -47,7 +47,6 @@ internal interface DeclarationContainerDescriptor { } internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierDescriptor { - val jClass: Class<*> val kmClass: KmClass val classId: ClassId val module: ModuleDescriptor @@ -94,6 +93,8 @@ internal interface CallableDescriptor : DeclarationDescriptor { val containingClass: ClassDescriptor<*>? val container: DeclarationContainerDescriptor + val dispatchReceiverParameter: ReceiverParameterDescriptor? + val extensionReceiverParameter: ReceiverParameterDescriptor? val valueParameters: List val typeParameters: List @@ -102,9 +103,16 @@ internal interface CallableDescriptor : DeclarationDescriptor { val visibility: KVisibility? + private val isBound: Boolean + get() = TODO() + val isFinal: Boolean val isOpen: Boolean val isAbstract: Boolean + val isReal: Boolean + + val caller: Caller<*> + val defaultCaller: Caller<*>? } internal interface FunctionDescriptor : CallableDescriptor { @@ -113,6 +121,10 @@ internal interface FunctionDescriptor : CallableDescriptor { val isOperator: Boolean val isInfix: Boolean val isSuspend: Boolean + val isAnnotationConstructor: Boolean + + val member: Member? + val defaultMember: Member? } internal interface ParameterDescriptor : DeclarationDescriptor { @@ -122,26 +134,20 @@ internal interface ParameterDescriptor : DeclarationDescriptor { internal interface ValueParameterDescriptor : ParameterDescriptor { val declaresDefaultValue: Boolean - private val inheritsDefaultValue: Boolean - get() = TODO("Is not implemented yet (for KParameter.isOptional 2 case)") - val varargElementType: KotlinType? } internal interface ReceiverParameterDescriptor : ParameterDescriptor internal interface PropertyDescriptor : CallableDescriptor { - private val isVar: Boolean - get() = TODO() + val isVar: Boolean val isLateInit: Boolean val isConst: Boolean private val isDelegated: Boolean get() = TODO() - private val getter: PropertyGetterDescriptor? - get() = TODO() - private val setter: PropertySetterDescriptor? - get() = TODO() + val getter: PropertyGetterDescriptor? + val setter: PropertySetterDescriptor? } internal interface PropertyAccessorDescriptor : FunctionDescriptor { diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt index 3bb8749..686ff14 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt @@ -19,4 +19,4 @@ internal interface AbstractCallableDescriptor : CallableDescriptor { get() = Flag.Common.IS_OPEN(flags) override val isAbstract: Boolean get() = Flag.Common.IS_ABSTRACT(flags) -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index 912e9df..c6e62b5 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -1,13 +1,11 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* -import kotlinx.reflect.lite.descriptors.ClassDescriptor -import kotlinx.reflect.lite.descriptors.ConstructorDescriptor -import kotlinx.reflect.lite.descriptors.ModuleDescriptor -import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor -import kotlinx.reflect.lite.descriptors.ValueParameterDescriptor -import kotlinx.reflect.lite.descriptors.ValueParameterDescriptorImpl +import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* +import java.lang.reflect.* internal class ConstructorDescriptorImpl( val kmCons: KmConstructor, diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/DeclarationContainerDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/DeclarationContainerDescriptorImpl.kt new file mode 100644 index 0000000..935a6ac --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/DeclarationContainerDescriptorImpl.kt @@ -0,0 +1,206 @@ +// Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.impl.KotlinReflectionInternalError +import kotlinx.reflect.lite.internal.* +import kotlinx.reflect.lite.misc.* +import java.lang.reflect.* + +internal abstract class DeclarationContainerDescriptorImpl : DeclarationContainerDescriptor { + protected open val methodOwner: Class<*> + get() = jClass.wrapperByPrimitive ?: jClass + + abstract val memberScope: MemberScope + abstract val staticScope: MemberScope + + abstract val constructors: Collection + abstract val properties: Collection + abstract val functions: Collection + + val declaredNonStaticMembers: Collection> + get() = getMembers(memberScope, MemberBelonginess.DECLARED) + + val declaredStaticMembers: Collection> + get() = getMembers(staticScope, MemberBelonginess.DECLARED) + + val inheritedNonStaticMembers: Collection> + get() = getMembers(memberScope, MemberBelonginess.INHERITED) + + val inheritedStaticMembers: Collection> + get() = getMembers(staticScope, MemberBelonginess.INHERITED) + + val allNonStaticMembers: Collection> + by ReflectProperties.lazySoft { declaredNonStaticMembers + inheritedNonStaticMembers } + val allStaticMembers: Collection> + by ReflectProperties.lazySoft { declaredStaticMembers + inheritedStaticMembers } + override val declaredMembers: Collection> + by ReflectProperties.lazySoft { declaredNonStaticMembers + declaredStaticMembers } + override val allMembers: Collection> + by ReflectProperties.lazySoft { allNonStaticMembers + allStaticMembers } + + private fun getMembers(scope: MemberScope, belonginess: MemberBelonginess): Collection> = + (scope.functions + scope.properties).mapNotNull { descriptor -> + if (belonginess.accept(descriptor)) createKCallable(descriptor) else null + }.toList() + + protected enum class MemberBelonginess { + DECLARED, + INHERITED; + + fun accept(member: CallableDescriptor): Boolean = + member.isReal == (this == DECLARED) + } + + private fun Class<*>.lookupMethod( + name: String, parameterTypes: Array>, returnType: Class<*>, isStaticDefault: Boolean + ): Method? { + // Static "$default" method in any class takes an instance of that class as the first parameter. + if (isStaticDefault) { + parameterTypes[0] = this + } + + tryGetMethod(name, parameterTypes, returnType)?.let { return it } + + superclass?.lookupMethod(name, parameterTypes, returnType, isStaticDefault)?.let { return it } + + // TODO: avoid exponential complexity here + for (superInterface in interfaces) { + superInterface.lookupMethod(name, parameterTypes, returnType, isStaticDefault)?.let { return it } + + // Static "$default" methods should be looked up in each DefaultImpls class, see KT-33430 + if (isStaticDefault) { + val defaultImpls = superInterface.safeClassLoader.tryLoadClass(superInterface.name + JvmAbi.DEFAULT_IMPLS_SUFFIX) + if (defaultImpls != null) { + parameterTypes[0] = superInterface + defaultImpls.tryGetMethod(name, parameterTypes, returnType)?.let { return it } + } + } + } + + return null + } + + private fun Class<*>.tryGetMethod(name: String, parameterTypes: Array>, returnType: Class<*>): Method? = + try { + val result = getDeclaredMethod(name, *parameterTypes) + + if (result.returnType == returnType) result + else { + // If we've found a method with an unexpected return type, it's likely that there are several methods in this class + // with the given parameter types and Java reflection API has returned not the one we're looking for. + // Falling back to enumerating all methods in the class in this (rather rare) case. + // Example: class A(val x: Int) { fun getX(): String = ... } + declaredMethods.firstOrNull { method -> + method.name == name && method.returnType == returnType && method.parameterTypes.contentEquals(parameterTypes) + } + } + } catch (e: NoSuchMethodException) { + null + } + + private fun Class<*>.tryGetConstructor(parameterTypes: List>): Constructor<*>? = + try { + getDeclaredConstructor(*parameterTypes.toTypedArray()) + } catch (e: NoSuchMethodException) { + null + } + + override fun findMethodBySignature(name: String, desc: String): Method? { + if (name == "") return null + + val parameterTypes = loadParameterTypes(desc).toTypedArray() + val returnType = loadReturnType(desc) + methodOwner.lookupMethod(name, parameterTypes, returnType, false)?.let { return it } + + // Methods from java.lang.Object (equals, hashCode, toString) cannot be found in the interface via + // Class.getMethod/getDeclaredMethod, so for interfaces, we also look in java.lang.Object. + if (methodOwner.isInterface) { + Any::class.java.lookupMethod(name, parameterTypes, returnType, false)?.let { return it } + } + + return null + } + + override fun findDefaultMethod(name: String, desc: String, isMember: Boolean): Method? { + if (name == "") return null + + val parameterTypes = arrayListOf>() + if (isMember) { + // Note that this value is replaced inside the lookupMethod call below, for each class/interface in the hierarchy. + parameterTypes.add(jClass) + } + addParametersAndMasks(parameterTypes, desc, false) + + return methodOwner.lookupMethod( + name + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, parameterTypes.toTypedArray(), loadReturnType(desc), isStaticDefault = isMember + ) + } + + override fun findConstructorBySignature(desc: String): Constructor<*>? = + jClass.tryGetConstructor(loadParameterTypes(desc)) + + override fun findDefaultConstructor(desc: String): Constructor<*>? = + jClass.tryGetConstructor(arrayListOf>().also { parameterTypes -> + addParametersAndMasks(parameterTypes, desc, true) + }) + + + + private fun addParametersAndMasks(result: MutableList>, desc: String, isConstructor: Boolean) { + val valueParameters = loadParameterTypes(desc) + result.addAll(valueParameters) + repeat((valueParameters.size + Integer.SIZE - 1) / Integer.SIZE) { + result.add(Integer.TYPE) + } + result.add(if (isConstructor) DEFAULT_CONSTRUCTOR_MARKER else Any::class.java) + } + + private fun loadParameterTypes(desc: String): List> { + val result = arrayListOf>() + + var begin = 1 + while (desc[begin] != ')') { + var end = begin + while (desc[end] == '[') end++ + @Suppress("SpellCheckingInspection") + when (desc[end]) { + in "VZCBSIFJD" -> end++ + 'L' -> end = desc.indexOf(';', begin) + 1 + else -> throw KotlinReflectionInternalError("Unknown type prefix in the method signature: $desc") + } + + result.add(parseType(desc, begin, end)) + begin = end + } + + return result + } + + private fun parseType(desc: String, begin: Int, end: Int): Class<*> = + when (desc[begin]) { + 'L' -> jClass.safeClassLoader.loadClass(desc.substring(begin + 1, end - 1).replace('/', '.')) + '[' -> parseType(desc, begin + 1, end).createArrayType() + 'V' -> Void.TYPE + 'Z' -> Boolean::class.java + 'C' -> Char::class.java + 'B' -> Byte::class.java + 'S' -> Short::class.java + 'I' -> Int::class.java + 'F' -> Float::class.java + 'J' -> Long::class.java + 'D' -> Double::class.java + else -> throw KotlinReflectionInternalError("Unknown type prefix in the method signature: $desc") + } + + private fun loadReturnType(desc: String): Class<*> = + parseType(desc, desc.indexOf(')') + 1, desc.length) + + companion object { + private val DEFAULT_CONSTRUCTOR_MARKER = Class.forName("kotlin.jvm.internal.DefaultConstructorMarker") + + internal val LOCAL_PROPERTY_SIGNATURE = "".toRegex() + } +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 8211bb9..5f9d0b2 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -1,15 +1,15 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* -import kotlinx.reflect.lite.descriptors.ClassDescriptor -import kotlinx.reflect.lite.descriptors.FunctionDescriptor -import kotlinx.reflect.lite.descriptors.ModuleDescriptor -import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor -import kotlinx.reflect.lite.descriptors.ValueParameterDescriptor -import kotlinx.reflect.lite.descriptors.ValueParameterDescriptorImpl +import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.calls.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* +import java.lang.reflect.* -abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, FunctionDescriptor { +internal abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, FunctionDescriptor { override val isInline: Boolean get() = Flag.Function.IS_INLINE(flags) override val isExternal: Boolean @@ -20,12 +20,59 @@ abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, Function get() = Flag.Function.IS_INFIX(flags) override val isSuspend: Boolean get() = Flag.Function.IS_SUSPEND(flags) + override val isReal: Boolean + get() = true + + override val isAnnotationConstructor: Boolean + get() = name == "" && container.jClass.isAnnotation + + override val caller: Caller<*> + get() = createCaller(member) + + override val defaultCaller: Caller<*>? + get() = defaultMember?.let { createCaller(it) } + + private fun createCaller(member: Member?) = + when (member) { + is Constructor<*> -> + createConstructorCaller(member) + is Method -> when { + !Modifier.isStatic(member.modifiers) -> + createInstanceMethodCaller(member) + containingClass?.isCompanion == false -> + createJvmStaticInObjectCaller(member) + else -> + createStaticMethodCaller(member) + } + else -> throw KotlinReflectionInternalError("Could not compute caller for function: $this (member = $member)") + } + + // TODO: support bound receiver -> CallerImpl.BoundConstructor + private fun createConstructorCaller(member: Constructor<*>): CallerImpl> { + return CallerImpl.Constructor(member) + } + + // TODO: support bound receiver -> CallerImpl.Method.BoundInstance + private fun createInstanceMethodCaller(member: Method): CallerImpl { + return CallerImpl.Method.Instance(member) + } + + // TODO: support bound receiver -> CallerImpl.Method.BoundInstance + private fun createStaticMethodCaller(member: Method): CallerImpl { + return CallerImpl.Method.Static(member) + } + + // TODO: support bound receiver -> CallerImpl.Method.BoundInstance + private fun createJvmStaticInObjectCaller(member: Method): CallerImpl { + return CallerImpl.Method.JvmStaticInObject(member) + } } internal class FunctionDescriptorImpl( val kmFunction: KmFunction, override val module: ModuleDescriptor, - override val containingClass: ClassDescriptor<*>? + override val containingClass: ClassDescriptor<*>?, + override val container: DeclarationContainerDescriptor ) : AbstractFunctionDescriptor() { override val flags: Flags get() = kmFunction.flags @@ -44,6 +91,23 @@ internal class FunctionDescriptorImpl( override val typeParameters: List get() = typeParameterTable.typeParameters + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = containingClass?.let { ReceiverParameterDescriptorImpl(it.defaultType, this) } + + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = kmFunction.receiverParameterType?.let { + ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) + } + override val returnType: KotlinType get() = kmFunction.returnType.toKotlinType(module, typeParameterTable) -} \ No newline at end of file + + private val jvmSignature: JvmFunctionSignature.KotlinFunction + get() = JvmFunctionSignature.KotlinFunction(kmFunction.signature ?: error("No signature for ${kmFunction}")) + + override val member: Member? + get() = container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) + + override val defaultMember: Member? + get() = container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 6bf8b49..51b5812 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -2,6 +2,7 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.reflect.lite.KVariance +import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.Annotated import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ClassifierDescriptor @@ -10,12 +11,10 @@ import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor internal class KotlinType( - val classifierDescriptor: ClassifierDescriptor, + val descriptor: ClassifierDescriptor, val arguments: List, - val isMarkedNullable: Boolean -) : Annotated { - -} + val isMarkedNullable: Boolean // todo pass annotations +) : Annotated internal class TypeParameterTable( val typeParameters: List, @@ -80,9 +79,18 @@ internal val ClassifierDescriptor.kotlinType: KotlinType false ) +internal val ClassifierDescriptor.defaultType: KotlinType + get() = KotlinType( + this, + (this as? ClassDescriptor<*>)?.typeParameters?.map { + TypeProjection(it.defaultType, false, KVariance.INVARIANT) + }.orEmpty(), + false + ) + private fun KmVariance.toVariance(): KVariance = when (this) { KmVariance.INVARIANT -> KVariance.INVARIANT KmVariance.IN -> KVariance.IN KmVariance.OUT -> KVariance.OUT - } \ No newline at end of file + } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 1515317..cb756d0 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -1,17 +1,18 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* -import kotlinx.reflect.lite.descriptors.ClassDescriptor -import kotlinx.reflect.lite.descriptors.ModuleDescriptor -import kotlinx.reflect.lite.descriptors.PropertyDescriptor -import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor -import kotlinx.reflect.lite.descriptors.ValueParameterDescriptor +import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.calls.Caller +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* +import java.lang.reflect.* internal class PropertyDescriptorImpl( val kmProperty: KmProperty, override val module: ModuleDescriptor, - override val containingClass: ClassDescriptor<*>? + override val containingClass: ClassDescriptor<*>?, + override val container: DeclarationContainerDescriptor ) : AbstractCallableDescriptor, PropertyDescriptor { override val flags: Flags get() = kmProperty.flags @@ -35,4 +36,112 @@ internal class PropertyDescriptorImpl( get() = Flag.Property.IS_CONST(flags) override val isLateInit: Boolean get() = Flag.Property.IS_LATEINIT(flags) -} \ No newline at end of file + override val isVar: Boolean + get() = Flag.Property.IS_VAR(flags) + override val isReal: Boolean + get() = true + + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = containingClass?.let { ReceiverParameterDescriptorImpl(it.defaultType, this) } + + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = kmProperty.receiverParameterType?.let { ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) } + + override val getter: PropertyGetterDescriptor? + get() = if (Flag.Property.HAS_GETTER(flags)) PropertyGetterDescriptorImpl(this) else null + + override val setter: PropertySetterDescriptor? + get() = if (Flag.Property.HAS_SETTER(flags)) PropertySetterDescriptorImpl(this) else null + + override val caller: Caller<*> + get() = getter?.caller ?: error("The property has no getter") + + override val defaultCaller: Caller<*> + get() = getter?.defaultCaller ?: error("The property has no getter") +} + +internal class PropertyGetterDescriptorImpl( + override val property: PropertyDescriptorImpl +) : AbstractFunctionDescriptor(), PropertyGetterDescriptor { + override val name: Name + get() = "" + + override val module: ModuleDescriptor + get() = property.module + override val containingClass: ClassDescriptor<*>? + get() = property.containingClass + override val container: DeclarationContainerDescriptor + get() = property.container + + override val typeParameterTable: TypeParameterTable + get() = property.typeParameterTable + override val valueParameters: List + get() = emptyList() + override val typeParameters: List + get() = property.typeParameters + override val returnType: KotlinType + get() = property.returnType + + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = property.dispatchReceiverParameter + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = property.extensionReceiverParameter + + override val isReal: Boolean + get() = property.isReal + + override val flags: Flags + get() = property.kmProperty.getterFlags + + private val jvmSignature: JvmFunctionSignature.KotlinFunction + get() = JvmFunctionSignature.KotlinFunction(property.kmProperty.getterSignature ?: error("No getter signature for ${property.kmProperty}")) + + override val member: Member? + get() = container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) + + override val defaultMember: Member? + get() = container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) +} + +internal class PropertySetterDescriptorImpl( + override val property: PropertyDescriptorImpl +) : AbstractFunctionDescriptor(), PropertySetterDescriptor { + override val name: Name + get() = "" + + override val module: ModuleDescriptor + get() = property.module + override val containingClass: ClassDescriptor<*>? + get() = property.containingClass + override val container: DeclarationContainerDescriptor + get() = property.container + + override val typeParameterTable: TypeParameterTable + get() = property.typeParameterTable + override val valueParameters: List = + listOf(ValueParameterDescriptorImpl(property.kmProperty.setterParameter!!, this, 0)) + override val typeParameters: List + get() = property.typeParameters + override val returnType: KotlinType + get() = module.findClass("kotlin/Unit").kotlinType + + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = property.dispatchReceiverParameter + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = property.extensionReceiverParameter + + override val isReal: Boolean + get() = property.isReal + + override val flags: Flags + get() = property.kmProperty.setterFlags + + private val jvmSignature: JvmFunctionSignature.KotlinFunction + get() = JvmFunctionSignature.KotlinFunction(property.kmProperty.getterSignature ?: error("No getter signature for ${property.kmProperty}")) + + override val member: Member? + get() = container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) + + override val defaultMember: Member? + get() = container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt new file mode 100644 index 0000000..4e870b6 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt @@ -0,0 +1,11 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.reflect.lite.descriptors.* + +internal class ReceiverParameterDescriptorImpl( + override val type: KotlinType, + override val containingDeclaration: CallableDescriptor +) : ReceiverParameterDescriptor { + override val name: String + get() = "" +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 11cf75c..b65ffb3 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -2,6 +2,10 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* +import java.util.ArrayList +import kotlin.coroutines.* +import kotlin.reflect.jvm.* +import kotlin.reflect.jvm.internal.* internal abstract class KCallableImpl: KCallable { abstract val descriptor: CallableDescriptor @@ -10,10 +14,27 @@ internal abstract class KCallableImpl: KCallable { get() { val descriptor = descriptor val result = mutableListOf() - // TODO bound parameter - for ((index, i) in descriptor.valueParameters.indices.withIndex()) { - result.add(KParameterImpl(descriptor.valueParameters[i], index, KParameter.Kind.VALUE)) + var index = 0 + // TODO bound receiver + val instanceReceiver = descriptor.dispatchReceiverParameter + + if (instanceReceiver != null) { + result.add(KParameterImpl(instanceReceiver, index++, KParameter.Kind.INSTANCE)) + } + + val extensionReceiver = descriptor.extensionReceiverParameter + if (extensionReceiver != null) { + result.add(KParameterImpl(extensionReceiver, index++, KParameter.Kind.EXTENSION_RECEIVER)) } + + for (valueParameterDesc in descriptor.valueParameters) { + result.add(KParameterImpl(valueParameterDesc, index++, KParameter.Kind.VALUE)) + } + + // Constructor parameters of Java annotations are not ordered in any way, we order them by name here to be more stable. + // Note that positional call (via "call") is not allowed unless there's a single non-"value" parameter, + // so the order of parameters of Java annotation constructors here can be arbitrary + // TODO annotation constructors return result } @@ -25,4 +46,70 @@ internal abstract class KCallableImpl: KCallable { override val returnType: KType get() = KTypeImpl(descriptor.returnType) -} \ No newline at end of file + + @Suppress("UNCHECKED_CAST") + override fun call(vararg args: Any?): R { + return descriptor.caller.call(args) as R + } + + override fun callBy(args: Map): R { + return callDefaultMethod(args, null) + } + + // See ArgumentGenerator#generate + internal fun callDefaultMethod(args: Map, continuationArgument: Continuation<*>?): R { + val parameters = parameters + val arguments = ArrayList(parameters.size) + var mask = 0 + val masks = ArrayList(1) + var index = 0 + var anyOptional = false + + for (parameter in parameters) { + if (index != 0 && index % Integer.SIZE == 0) { + masks.add(mask) + mask = 0 + } + + when { + args.containsKey(parameter) -> { + arguments.add(args[parameter]) + } + parameter.isOptional -> { + TODO("Support optional parameters") + anyOptional = true + } + parameter.isVararg -> { + TODO("Support vararg parameters") + } + else -> { + throw IllegalArgumentException("No argument provided for a required parameter: $parameter") + } + } + + if (parameter.kind == KParameter.Kind.VALUE) { + index++ + } + } + + if (continuationArgument != null) { + arguments.add(continuationArgument) + } + + if (!anyOptional) { + return call(*arguments.toTypedArray()) + } + + masks.add(mask) + + val caller = descriptor.defaultCaller ?: throw KotlinReflectionInternalError("This callable does not support a default call: $descriptor") + + arguments.addAll(masks) + + // DefaultConstructorMarker or MethodHandle + arguments.add(null) + + @Suppress("UNCHECKED_CAST") + return caller.call(arguments.toTypedArray()) as R + } +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt index f51c29d..fd33aeb 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt @@ -26,4 +26,4 @@ internal class KFunctionImpl( get() = descriptor.isFinal override val isOpen: Boolean get() = descriptor.isOpen -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt index f795f56..b31e25f 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -14,9 +14,17 @@ internal class KParameterImpl( override val type: KType? get() = descriptor.type?.let(::KTypeImpl) - override val isOptional: Boolean // TODO: inheritsDefaultValue + override val isOptional: Boolean get() = (descriptor as? ValueParameterDescriptor)?.declaresDefaultValue ?: false override val isVararg: Boolean get() = (descriptor is ValueParameterDescriptor) && descriptor.varargElementType != null -} \ No newline at end of file + + override fun equals(other: Any?) = + other is KParameterImpl && + descriptor.containingDeclaration == other.descriptor.containingDeclaration && + index == other.index + + override fun hashCode() = + (descriptor.containingDeclaration.hashCode() * 31) + index.hashCode() +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt index 5c53be4..94fd646 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt @@ -2,13 +2,18 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.impl.* -internal class KPropertyImpl( +internal class KPropertyImpl( override val descriptor: PropertyDescriptor ) : KCallableImpl(), KProperty { override val name: String get() = descriptor.name + override fun call(vararg args: Any?): T { + TODO("Not yet implemented") + } + override val isFinal: Boolean get() = descriptor.isFinal override val isAbstract: Boolean @@ -23,4 +28,7 @@ internal class KPropertyImpl( override val isLateinit: Boolean get() = descriptor.isLateInit -} \ No newline at end of file + + override val getter: KProperty.Getter + get() = TODO("Not yet implemented") +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 51acb26..97d3f76 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -7,10 +7,9 @@ import kotlinx.reflect.lite.descriptors.impl.KotlinType internal class KTypeImpl( val type: KotlinType ): KType { - override val classifier: KClassifier? get() = - when (val descriptor = type.classifierDescriptor) { + when (val descriptor = type.descriptor) { is ClassDescriptor<*> -> { // TODO array types KClassImpl(descriptor) @@ -40,4 +39,4 @@ internal class KTypeImpl( override val isMarkedNullable: Boolean get() = type.isMarkedNullable -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt b/src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt new file mode 100644 index 0000000..859f2e0 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt @@ -0,0 +1,8 @@ +// Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KotlinReflectionInternalError.kt +package kotlinx.reflect.lite.impl + +/** + * Signals that Kotlin reflection had reached an inconsistent state from which it cannot recover. + * @suppress + */ +class KotlinReflectionInternalError(message: String) : Error(message) diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt new file mode 100644 index 0000000..cfe8334 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -0,0 +1,211 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.metadata.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.calls.* +import kotlinx.reflect.lite.calls.Caller +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.CallableDescriptor +import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.descriptors.impl.KotlinType +import java.lang.reflect.* + +internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { + if (descriptor is PropertyDescriptor) { + // TODO: implement properties + return KPropertyImpl(descriptor) + } + if (descriptor is FunctionDescriptor) { + return KFunctionImpl(descriptor) + } + throw KotlinReflectionInternalError("Unsupported callable: $descriptor") +} + +internal fun overrides(derived: D, base: D): Boolean { + require(derived.name == base.name) { "Names should be equal: $derived, $base" } + if (derived is PropertyDescriptor && base is PropertyDescriptor) { + // TODO (!) + return true + } else if (derived is FunctionDescriptor && base is FunctionDescriptor) { + // TODO (!) + return true + } else { + error("Unknown members: $derived, $base") + } +} + +internal fun addFakeOverrides( + klass: ClassDescriptor<*>, + realMembers: List, + selector: (ClassDescriptor<*>) -> List, + createFakeOverride: (List) -> D +): List { + val fromDerived = realMembers.groupBy(CallableDescriptor::name) + + val fromBase = mutableMapOf>() + for (supertype in klass.supertypes) { + val superclass = supertype.descriptor as? ClassDescriptor<*> ?: continue + val allMembers = selector(superclass).filter { it.visibility != KVisibility.PRIVATE } + for ((name, members) in allMembers.groupBy(CallableDescriptor::name)) { + fromBase.getOrPut(name) { ArrayList(1) }.addAll(members) + } + } + + val result = mutableListOf() + for ((name, members) in fromBase) { + val notOverridden = members.filterNot { baseMember -> + fromDerived[name].orEmpty().any { derivedMember -> overrides(derivedMember, baseMember)} + } + if (notOverridden.isEmpty()) continue + // TODO (!): if > 1, group by extension receiver and parameter types + // TODO: filterOutOverridden (so that `isAbstract = notOverridden.all { it.isAbstract }` would work) + result.add(createFakeOverride(notOverridden)) + } + + return result +} + +internal fun addPropertyFakeOverrides(klass: ClassDescriptor<*>, realProperties: List): List = + addFakeOverrides(klass, realProperties, { it.memberScope.properties }) { members -> + val representative = members.first() + // TODO (!): type substitution + FakeOverridePropertyDescriptor( + klass.module, + klass, + null, // todo: representative.extensionReceiverParameter + representative.valueParameters, + representative.typeParameters, + representative.returnType, + members + ) + } + +internal fun addFunctionFakeOverrides(klass: ClassDescriptor<*>, realFunctions: List): List = + addFakeOverrides(klass, realFunctions, { it.memberScope.functions }) { members -> + // TODO (!): type substitution + val representative = members.first() + FakeOverrideFunctionDescriptor( + klass.module, + klass, + null, // todo: representative.extensionReceiverParameter + representative.valueParameters, + representative.typeParameters, + representative.returnType, + members + ) + } + +internal abstract class FakeOverrideCallableMemberDescriptor( + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptor<*>, + override val extensionReceiverParameter: ReceiverParameterDescriptor?, + override val valueParameters: List, + override val typeParameters: List, + override val returnType: KotlinType, + val overridden: List +) : CallableDescriptor, AbstractFunctionDescriptor() { + init { + require(overridden.isNotEmpty()) + } + + override val flags: Flags + get() = TODO("Not yet implemented") + + override val name: String + get() = overridden.first().name + override val visibility: KVisibility? + get() = overridden.first().visibility + + override val container: DeclarationContainerDescriptor + get() = containingClass + + override val typeParameterTable: TypeParameterTable + get() = TODO("Not yet implemented") + + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = ReceiverParameterDescriptorImpl(containingClass.defaultType, this) + + override val isFinal: Boolean + get() = overridden.any(CallableDescriptor::isFinal) + override val isAbstract: Boolean + get() = overridden.all(CallableDescriptor::isAbstract) + override val isOpen: Boolean + get() = !isFinal && !isAbstract + + override val isReal: Boolean + get() = false +} + +internal class FakeOverrideFunctionDescriptor( + module: ModuleDescriptor, + containingClass: ClassDescriptor<*>, + extensionReceiverParameter: ReceiverParameterDescriptor?, + valueParameters: List, + typeParameters: List, + returnType: KotlinType, + overridden: List +) : FakeOverrideCallableMemberDescriptor( + module, containingClass, extensionReceiverParameter, valueParameters, typeParameters, returnType, overridden +) { + @Suppress("UNCHECKED_CAST") + val overriddenFunctions: List + get() = super.overridden as List + + override val isInline: Boolean + get() = overriddenFunctions.first().isInline // TODO? + override val isOperator: Boolean + get() = overriddenFunctions.first().isOperator // TODO? + override val isInfix: Boolean + get() = overriddenFunctions.first().isInfix // TODO? + override val isSuspend: Boolean + get() = overriddenFunctions.first().isSuspend // TODO? + override val isExternal: Boolean + get() = TODO("Not yet implemented") + + override val member: Member? + get() = overriddenFunctions.first().member + + override val defaultMember: Member? + get() = overriddenFunctions.first().defaultMember +} + +internal class FakeOverridePropertyDescriptor( + module: ModuleDescriptor, + containingClass: ClassDescriptor<*>, + extensionReceiverParameter: ReceiverParameterDescriptor?, + valueParameters: List, + typeParameters: List, + returnType: KotlinType, + overridden: List +) : FakeOverrideCallableMemberDescriptor( + module, containingClass, extensionReceiverParameter, valueParameters, typeParameters, returnType, overridden +), PropertyDescriptor { + @Suppress("UNCHECKED_CAST") + val overriddenProperties: List + get() = super.overridden as List + + override val typeParameterTable: TypeParameterTable + get() = TODO() + + override val isVar: Boolean + get() = overriddenProperties.any(PropertyDescriptor::isVar) + override val isLateInit: Boolean + get() = false + override val isConst: Boolean + get() = false + + override val getter: PropertyGetterDescriptor? + get() = TODO("Not yet implemented") + + override val setter: PropertySetterDescriptor? + get() = TODO("Not yet implemented") + + override val caller: Caller<*> + get() = TODO("Not yet implemented") + + override val member: Member? + get() = TODO("Not yet implemented") + + override val defaultMember: Member? + get() = TODO("Not yet implemented") +} diff --git a/src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt new file mode 100644 index 0000000..b5d4848 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt @@ -0,0 +1,86 @@ +// Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/runtime/kotlin/jvm/JvmClassMapping.kt +package kotlinx.reflect.lite.misc + +import java.lang.Boolean as JavaLangBoolean +import java.lang.Byte as JavaLangByte +import java.lang.Character as JavaLangCharacter +import java.lang.Double as JavaLangDouble +import java.lang.Float as JavaLangFloat +import java.lang.Integer as JavaLangInteger +import java.lang.Long as JavaLangLong +import java.lang.Short as JavaLangShort +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.impl.KClassImpl + +/** + * Returns a Java [Class] instance corresponding to the given [KClass] instance. + */ +public val KClass.java: Class + get() = (this as KClassImpl).descriptor.jClass as Class // TODO: revealing the descriptor + +/** + * Returns a Java [Class] instance representing the primitive type corresponding to the given [KClass] if it exists. + */ +public val KClass.javaPrimitiveType: Class? + get() { + val thisJClass = this.java + if (thisJClass.isPrimitive) return thisJClass as Class + + return when (thisJClass.name) { + "java.lang.Boolean" -> Boolean::class.java + "java.lang.Character" -> Char::class.java + "java.lang.Byte" -> Byte::class.java + "java.lang.Short" -> Short::class.java + "java.lang.Integer" -> Int::class.java + "java.lang.Float" -> Float::class.java + "java.lang.Long" -> Long::class.java + "java.lang.Double" -> Double::class.java + "java.lang.Void" -> Void.TYPE + else -> null + } as Class? + } + +/** + * Returns a Java [Class] instance corresponding to the given [KClass] instance. + * In case of primitive types it returns corresponding wrapper classes. + */ +public val KClass.javaObjectType: Class + get() { + val thisJClass = this.java + if (!thisJClass.isPrimitive) return thisJClass as Class + + return when (thisJClass.name) { + "boolean" -> JavaLangBoolean::class.java + "char" -> JavaLangCharacter::class.java + "byte" -> JavaLangByte::class.java + "short" -> JavaLangShort::class.java + "int" -> JavaLangInteger::class.java + "float" -> JavaLangFloat::class.java + "long" -> JavaLangLong::class.java + "double" -> JavaLangDouble::class.java + "void" -> Void::class.java + else -> thisJClass + } as Class + } + +/** + * Returns the runtime Java class of this object. + */ +public inline val T.javaClass: Class + @Suppress("UsePropertyAccessSyntax") + get() = (this as java.lang.Object).getClass() as Class + +@Deprecated("Use 'java' property to get Java class corresponding to this Kotlin class or cast this instance to Any if you really want to get the runtime Java class of this implementation of KClass.", ReplaceWith("(this as Any).javaClass"), level = DeprecationLevel.ERROR) +public inline val KClass.javaClass: Class> + @JvmName("getRuntimeClassOfKClassInstance") + @Suppress("UsePropertyAccessSyntax") + get() = (this as java.lang.Object).getClass() as Class> + +/** + * Checks if array can contain element of type [T]. + */ +@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE") +public fun Array<*>.isArrayOf(): Boolean = + T::class.java.isAssignableFrom(this::class.java.componentType) diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt new file mode 100644 index 0000000..e5f636e --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -0,0 +1,195 @@ +// Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +package kotlinx.reflect.lite.misc + +import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.FunctionDescriptor +import kotlinx.reflect.lite.descriptors.PropertyDescriptor +import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.descriptors.impl.FunctionDescriptorImpl +import kotlinx.reflect.lite.impl.KotlinReflectionInternalError +import kotlinx.reflect.lite.name.* +import java.lang.reflect.* + +sealed class JvmFunctionSignature { + abstract fun asString(): String + + class KotlinFunction(val signature: JvmMethodSignature) : JvmFunctionSignature() { + private val _signature = signature.asString() + + val methodName: String get() = signature.name + val methodDesc: String get() = signature.desc + + override fun asString(): String = _signature + } + + class KotlinConstructor(val signature: JvmMethodSignature) : JvmFunctionSignature() { + private val _signature = signature.asString() + + val constructorDesc: String get() = signature.desc + + override fun asString(): String = _signature + } + + class JavaMethod(val method: Method) : JvmFunctionSignature() { + override fun asString(): String = method.signature + } + + class JavaConstructor(val constructor: Constructor<*>) : JvmFunctionSignature() { + override fun asString(): String = + constructor.parameterTypes.joinToString(separator = "", prefix = "(", postfix = ")V") { it.desc } + } + + class FakeJavaAnnotationConstructor(val jClass: Class<*>) : JvmFunctionSignature() { + // Java annotations do not impose any order of methods inside them, so we consider them lexicographic here for stability + val methods = jClass.declaredMethods.sortedBy { it.name } + + override fun asString(): String = + methods.joinToString(separator = "", prefix = "(", postfix = ")V") { it.returnType.desc } + } +} + +internal sealed class JvmPropertySignature { + /** + * Returns the JVM signature of the getter of this property. In case the property doesn't have a getter, + * constructs the signature of its imaginary default getter. See CallableReference#getSignature for more information + */ + abstract fun asString(): String + + class KotlinProperty( + private val descriptor: PropertyDescriptorImpl, + val fieldSignature: JvmFieldSignature?, + val getterSignature: JvmMethodSignature?, + val setterSignature: JvmMethodSignature? + ) : JvmPropertySignature() { + private val string: String = getterSignature?.asString() ?: run { + val (name, desc) = fieldSignature ?: throw KotlinReflectionInternalError("No field signature for property: $descriptor") + JvmAbi.getterName(name) + getManglingSuffix() + "()" + desc + } + + private fun getManglingSuffix(): String { + val containingClass = descriptor.containingClass + if (descriptor.visibility == KVisibility.INTERNAL && containingClass is ClassDescriptorImpl) { + val moduleName = containingClass.kmClass.moduleName ?: "main" + return "$" + sanitizeAsJavaIdentifier(moduleName) + } + if (descriptor.visibility == KVisibility.PRIVATE && containingClass == null) { + //(descriptor.container as KPackageImpl) + // TODO +/* + val packagePartSource = (descriptor as DeserializedPropertyDescriptor).containerSource + if (packagePartSource is JvmPackagePartSource && packagePartSource.facadeClassName != null) { + return "$" + packagePartSource.simpleName.asString() + } +*/ + } + return "" + } + + override fun asString(): String = string + } + + class JavaMethodProperty(val getterMethod: Method, val setterMethod: Method?) : JvmPropertySignature() { + override fun asString(): String = getterMethod.signature + } + + class JavaField(val field: Field) : JvmPropertySignature() { + override fun asString(): String = + JvmAbi.getterName(field.name) + "()" + field.type.desc + } + + class MappedKotlinProperty( + val getterSignature: JvmFunctionSignature.KotlinFunction, + val setterSignature: JvmFunctionSignature.KotlinFunction? + ) : JvmPropertySignature() { + override fun asString(): String = getterSignature.asString() + } +} + +private val Method.signature: String + get() = name + + parameterTypes.joinToString(separator = "", prefix = "(", postfix = ")") { it.desc } + + returnType.desc + +internal object RuntimeTypeMapper { + private val JAVA_LANG_VOID = ClassId.topLevel(FqName("java.lang.Void")) + + fun mapSignature(funcDesc: FunctionDescriptor): JvmFunctionSignature { + if (funcDesc is FunctionDescriptorImpl) { + return JvmFunctionSignature.KotlinFunction(funcDesc.kmFunction.signature ?: error("No signature for ${funcDesc.kmFunction}")) + } + if (funcDesc is ConstructorDescriptorImpl) { + return JvmFunctionSignature.KotlinConstructor(funcDesc.kmCons.signature ?: error("No constructor signature for ${funcDesc.kmCons}")) + } +// if (function is PropertyGetterDescriptorImpl) { +// return JvmFunctionSignature.KotlinFunction(function.property.property.getterSignature ?: error("No getter signature for ${function.render()}")) +// } +// if (function is PropertySetterDescriptorImpl) { +// return JvmFunctionSignature.KotlinFunction(function.property.property.setterSignature ?: error("No setter signature for ${function.render()}")) +// } +// if (function is FakeOverrideFunctionDescriptor) { +// return mapSignature(function.overriddenFunctions.first()) +// } + + throw KotlinReflectionInternalError("Unknown origin of $funcDesc (${funcDesc.javaClass})") + } + + fun mapPropertySignature(possiblyOverriddenProperty: PropertyDescriptor): JvmPropertySignature { + val property = possiblyOverriddenProperty + + if (property is PropertyDescriptorImpl) { + return JvmPropertySignature.KotlinProperty( + property, + property.kmProperty.fieldSignature, + property.kmProperty.getterSignature, + property.kmProperty.setterSignature + ) + } + + // todo fake override property +// if (property is FakeOverridePropertyDescriptor) { +// return mapPropertySignature(property.overriddenProperties.first()) +// } + + TODO() + } + + + private fun isKnownBuiltInFunction(descriptor: FunctionDescriptor): Boolean { + // if (DescriptorFactory.isEnumValueOfMethod(descriptor) || DescriptorFactory.isEnumValuesMethod(descriptor)) return true + + // if (descriptor.name == CloneableClassScope.CLONE_NAME && descriptor.valueParameters.isEmpty()) return true + + return false + } + +// private fun mapName(descriptor: CallableMemberDescriptor): String = +// descriptor.name + + fun mapJvmClassToKotlinClassId(klass: Class<*>): ClassId { + if (klass.isArray) { + klass.componentType.primitiveType?.let { + return ClassId(FqName("kotlin"), it.arrayTypeName) + } + return ClassId.topLevel(StandardNames.FQ_NAMES.array) + } + + if (klass == Void.TYPE) return JAVA_LANG_VOID + + klass.primitiveType?.let { + return ClassId(StandardNames.BUILT_INS_PACKAGE_FQ_NAME, it.typeName) + } + + val classId = klass.classId + if (!classId.isLocal) { + JavaToKotlinClassMap.mapJavaToKotlin(classId.asSingleFqName())?.let { return it } + } + + return classId + } + + private val Class<*>.primitiveType: PrimitiveType? + get() = if (isPrimitive) JvmPrimitiveType.get(simpleName).primitiveType else null +} diff --git a/src/main/java/kotlinx/reflect/lite/misc/util.kt b/src/main/java/kotlinx/reflect/lite/misc/util.kt index 8ada0d7..9b66e84 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/util.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/util.kt @@ -1,9 +1,10 @@ +// Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/reflectClassUtil.kt package kotlinx.reflect.lite.misc -import kotlinx.reflect.lite.name.* -import java.lang.reflect.Array import java.lang.reflect.ParameterizedType import java.lang.reflect.Type +import kotlinx.reflect.lite.name.* +import java.lang.reflect.Array val Class<*>.safeClassLoader: ClassLoader get() = classLoader ?: ClassLoader.getSystemClassLoader() @@ -32,7 +33,7 @@ val Class<*>.functionClassArity: Int? get() = FUNCTION_CLASSES[this] /** - * NOTE: does not perform a Java -> Kotlin mapping. If this is not expected, consider using KClassImpl#classId instead TODO + * NOTE: does not perform a Java -> Kotlin mapping. If this is not expected, consider using KClassImpl#classId instead */ val Class<*>.classId: ClassId get() = when { @@ -46,11 +47,21 @@ val Class<*>.classId: ClassId } val Class<*>.desc: String - get() { - if (this == Void.TYPE) return "V" - // This is a clever exploitation of a format returned by Class.getName(): for arrays, it's almost an internal name, - // but with '.' instead of '/' - return createArrayType().name.substring(1).replace('.', '/') + get() = when { + isPrimitive -> when (name) { + "boolean" -> "Z" + "char" -> "C" + "byte" -> "B" + "short" -> "S" + "int" -> "I" + "float" -> "F" + "long" -> "J" + "double" -> "D" + "void" -> "V" + else -> throw IllegalArgumentException("Unsupported primitive type: $this") + } + isArray -> name.replace('.', '/') + else -> "L${name.replace('.', '/')};" } fun Class<*>.createArrayType(): Class<*> = @@ -74,4 +85,4 @@ fun ClassLoader.tryLoadClass(fqName: String) = Class.forName(fqName, false, this) } catch (e: ClassNotFoundException) { null - } \ No newline at end of file + } diff --git a/src/main/java/kotlinx/reflect/lite/name/names.kt b/src/main/java/kotlinx/reflect/lite/name/names.kt index 4f0812b..6cd600b 100644 --- a/src/main/java/kotlinx/reflect/lite/name/names.kt +++ b/src/main/java/kotlinx/reflect/lite/name/names.kt @@ -74,3 +74,6 @@ data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val } private val SANITIZE_AS_JAVA_INVALID_CHARACTERS = "[^\\p{L}\\p{Digit}]".toRegex() + +fun sanitizeAsJavaIdentifier(name: String): String = + SANITIZE_AS_JAVA_INVALID_CHARACTERS.replace(name, "_") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt index 1a944cf..7e3b665 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -1,5 +1,7 @@ package tests.call.bigArity +import kotlinx.reflect.lite.tests.* + class A { fun foo( p00: A, p01: A, p02: A, p03: A, p04: A, p05: A, p06: A, p07: A, p08: A, p09: A, @@ -12,10 +14,9 @@ class A { fun box(): String { val a = A() - val o = A::foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "O") - - val foo = A::class.members.single { it.name == "foo" } - val k = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "K") + val foo = (A::class.java).toLiteKClass().members.single { it.name == "foo" } + val o = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "O") as String // todo necessary type cast + val k = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "K") as String return o + k -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt index 8099c55..7adebde 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -1,17 +1,16 @@ package tests.call.cannotCallEnumConstructor -import kotlin.reflect.jvm.isAccessible +import kotlinx.reflect.lite.tests.* enum class E fun box(): String { try { - val c = E::class.constructors.single() - c.isAccessible = true + val c = (E::class.java).toLiteKClass().constructors.single() + //c.isAccessible = true // todo KCallable.isAccessible c.call() return "Fail: constructing an enum class should not be allowed" - } - catch (e: Throwable) { + } catch (e: Throwable) { return "OK" } -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt index 600a11c..2899106 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -2,28 +2,46 @@ package tests.call.equalsHashCodeToString +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + class A data class D(val s: String) fun box(): String { + val aEquals = (A::class.java).toLiteKClass().getMemberByName("equals") as KFunction + val aHashCode = (A::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction + val aToString = (A::class.java).toLiteKClass().getMemberByName("toString") as KFunction val a = A() - assert(A::equals.call(a, a)) - assert(!A::equals.call(a, 0)) - assert(A::hashCode.call(a) == A::hashCode.call(a)) - assert(A::toString.call(a).startsWith("tests.call.equalsHashCodeToString.A@")) - - assert(D::equals.call(D("foo"), D("foo"))) - assert(!D::equals.call(D("foo"), D("bar"))) - assert(D::hashCode.call(D("foo")) == D::hashCode.call(D("foo"))) - assert(D::toString.call(D("foo")) == "D(s=foo)") - - assert(Int::equals.call(-1, -1)) - assert(Int::hashCode.call(0) != Int::hashCode.call(1)) - assert(Int::toString.call(42) == "42") - - assert(String::equals.call("beer", "beer")) - String::hashCode.call("beer") - - return String::toString.call("OK") -} \ No newline at end of file + assert(aEquals.call(a, a)) + assert(!aEquals.call(a, 0)) + assert(aHashCode.call(a) == aHashCode.call(a)) + assert(aHashCode.call(a) == A::hashCode.call(a)) + assert(aToString.call(a).startsWith("tests.call.equalsHashCodeToString.A@")) + + val dEquals = (A::class.java).toLiteKClass().getMemberByName("equals") as KFunction + val dHashCode = (A::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction + val dToString = (A::class.java).toLiteKClass().getMemberByName("toString") as KFunction + + assert(dEquals.call(D("foo"), D("foo"))) + assert(!dEquals.call(D("foo"), D("bar"))) + assert(dHashCode.call(D("foo")) == D::hashCode.call(D("foo"))) + assert(dToString.call(D("foo")) == "D(s=foo)") + + val intEquals = (Int::class.java).toLiteKClass().getMemberByName("equals") as KFunction + val intHashCode = (Int::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction + val intToString = (Int::class.java).toLiteKClass().getMemberByName("toString") as KFunction + assert(intEquals.call(-1, -1)) + assert(intHashCode.call(0) != Int::hashCode.call(1)) + assert(intToString.call(42) == "42") + + //val stringEquals = String::class.java.getFunctionByName("equals") as KFunction +// val stringHashcode = String::class.java.getFunctionByName("hashCode") as KFunction +// val stringToString = String::class.java.getFunctionByName("toString") as KFunction +// assert(stringEquals.call("beer", "beer")) +// stringHashcode.call("beer") + + //return stringToString.call("OK") + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt index 19cd930..2582bc4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -6,6 +6,8 @@ fun fail(message: String) { throw AssertionError(message) } +// todo top-level functions + fun box(): String { try { ::fail.call("OK") @@ -14,4 +16,4 @@ fun box(): String { } return "Fail: no exception was thrown" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt index 92a9f80..8eaeec4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt @@ -1,5 +1,7 @@ package tests.call.fakeOverride +import kotlinx.reflect.lite.tests.* + open class A { fun foo() = "OK" } @@ -7,6 +9,6 @@ open class A { class B : A() fun box(): String { - val foo = B::class.members.single { it.name == "foo" } + val foo = (B::class.java).toLiteKClass().getMemberByName("foo") return foo.call(B()) as String -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt index 4230208..a2ef49c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt @@ -1,5 +1,7 @@ package tests.call.fakeOverrideSubstituted +import kotlinx.reflect.lite.tests.* + open class A(val t: T) { fun foo() = t } @@ -7,6 +9,6 @@ open class A(val t: T) { class B(s: String) : A(s) fun box(): String { - val foo = B::class.members.single { it.name == "foo" } + val foo = (B::class.java).toLiteKClass().members.single { it.name == "foo" } return foo.call(B("OK")) as String -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt index 4b4ab0f..bb970ba 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt @@ -1,10 +1,18 @@ package tests.call.innerClassConstructor +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + class A { class Nested(val result: String) inner class Inner(val result: String) } fun box(): String { - return (A::Nested).call("O").result + (A::Inner).call((::A).call(), "K").result -} \ No newline at end of file + val nested = (A::class.java).toLiteKClass().nestedClasses.single { it.simpleName == "Nested" } as KClass + val inner = (A::class.java).toLiteKClass().nestedClasses.single { it.simpleName == "Inner" } as KClass + val aCons = (A::class.java).toLiteKClass().getPrimaryConstructor() + val nestedCons = nested.getPrimaryConstructor() + val innerCons = inner.getPrimaryConstructor() + return nestedCons.call("O").result + innerCons.call(aCons.call(), "K").result +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt index a73e10d..e7990f4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt @@ -1,9 +1,13 @@ package tests.call.localClassMember +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + fun box(): String { class Local { fun result(s: String) = s } - - return Local::result.call(Local(), "OK") -} \ No newline at end of file + val localCons = (Local::class.java).toLiteKClass().getPrimaryConstructor() + val result = (Local::class.java).toLiteKClass().getMemberByName("result") as KFunction + return result.call(localCons.call(), "OK") +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt index 6c9d3cd..0104d9c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt @@ -1,5 +1,8 @@ package tests.call.memberOfGenericClass +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + var result = "Fail" class A { @@ -9,6 +12,8 @@ class A { } fun box(): String { - (A::foo).call(A(), "OK") + val a = (A::class.java).toLiteKClass() + val foo = a.getMemberByName("foo") + foo.call(a.getPrimaryConstructor().call(), "OK") return result -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt index b015ae6..16f7d1d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt @@ -1,8 +1,11 @@ package tests.call.simpleConstructor +import kotlinx.reflect.lite.tests.* + class A(val result: String) fun box(): String { - val a = (::A).call("OK") + val aCons = (A::class.java).toLiteKClass().constructors.first() + val a = aCons.call("OK") return a.result -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt index 19bef5b..8762405 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt @@ -1,11 +1,15 @@ package tests.call.simpleMemberFunction +import kotlinx.reflect.lite.tests.* + class A { fun foo(x: Int, y: Int) = x + y } fun box(): String { - val x = (A::foo).call(A(), 42, 239) + val foo = (A::class.java).toLiteKClass().getMemberByName("foo") + + val x = foo.call(A(), 42, 239) if (x != 281) return "Fail: $x" try { @@ -15,4 +19,4 @@ fun box(): String { catch (e: Exception) {} return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt index 0028055..b2fa7bc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt @@ -26,4 +26,4 @@ fun box(): String { (::bar).call("OK") return state -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt index c239cda..dad278d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt @@ -1,10 +1,16 @@ package tests.callBy.simpleMemberFunciton -class A(val result: String = "OK") { - fun foo(x: Int = 42): String { - assert(x == 42) { x } - return result +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + +class A { + fun foo(x: Int): String { + assert(x == 42) { return "42" } + return "OK" } } -fun box(): String = A::foo.callBy(mapOf(A::foo.parameters.first() to A())) \ No newline at end of file +fun box(): String { + val foo = (A::class.java).toLiteKClass().getMemberByName("foo") as KFunction + return foo.callBy(mapOf(foo.parameters[0] to A(), foo.parameters[1] to 42)) +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt index 740c460..c5c7de7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt @@ -7,7 +7,8 @@ class Klass fun box(): String { assertEquals("Klass", Klass::class.java.toLiteKClass().simpleName) - assertEquals("Date", java.util.Date::class.java.toLiteKClass().simpleName) - assertEquals("ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().simpleName) + // TODO ClassDescriptors for java classes are not supported + // assertEquals("Date", java.util.Date::class.java.toLiteKClass().simpleName) + //assertEquals("ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().simpleName) return "OK" } \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt index 19279af..bf42e64 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -15,9 +15,9 @@ fun box(): String { assertEquals("tests.classes.qualifiedName.Klass.Nested", Klass.Nested::class.java.toLiteKClass().qualifiedName) assertEquals("tests.classes.qualifiedName.Klass.Nested\$With\$Dollars", Klass.`Nested$With$Dollars`::class.java.toLiteKClass().qualifiedName) assertEquals("tests.classes.qualifiedName.Klass.Companion", Klass.Companion::class.java.toLiteKClass().qualifiedName) - - assertEquals("java.util.Date", java.util.Date::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().qualifiedName) + // TODO ClassDescriptors for java classes are not supported + //assertEquals("java.util.Date", java.util.Date::class.java.toLiteKClass().qualifiedName) + //assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().qualifiedName) class Local assertEquals(null, Local::class.java.toLiteKClass().qualifiedName) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt index 9a91065..0898bb3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt @@ -20,12 +20,10 @@ fun box(): String { val kClass = C::class.java.toLiteKClass() val cFoo = kClass.members.find { it.name == "foo" } as KFunction val cBar = kClass.members.find { it.name == "bar" } as KProperty - // TODO extesnion functions are not supported yet - val cExtFun = kClass.members.find { it.name == "extFun" } as KFunction + // TODO extension functions are not supported yet + //val cExtFun = kClass.members.find { it.name == "extFun" } as KFunction - assertEquals(0, cFoo.parameters.size) - // TODO - assertEquals(0, cBar.getter.parameters.size) + assertEquals(1, cFoo.parameters.size) assertFalse(cBar.isConst) assertFalse(cBar.isLateinit) @@ -36,4 +34,4 @@ fun box(): String { //cExtFun.parameters[0].check("i") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt new file mode 100644 index 0000000..49af3b9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -0,0 +1,43 @@ +package kotlinx.reflect.lite.tests + +import org.junit.* + +class KCallableTest { + // call + @Test + fun testSimpleMemberFunction() = test("call.simpleMemberFunction") { tests.call.simpleMemberFunction.box() } + + @Test + fun testSimpleConstructor() = test("call.simpleConstructor") { tests.call.simpleConstructor.box() } + + @Test + fun testBigArity() = test("call.bigArity") { tests.call.bigArity.box() } + + @Test + fun testCannotCallEnumConstructor() = test("call.cannotCallEnumConstructor") { tests.call.cannotCallEnumConstructor.box() } + + @Test + fun testEqualsHashCodeToString() = test("call.equalsHashCodeToString") { tests.call.equalsHashCodeToString.box() } + + @Test + fun testFakeOverride() = test("call.fakeOverride") { tests.call.fakeOverride.box() } + + @Test + fun testFakeOverrideSubstituted() = test("call.fakeOverrideSubstituted") { tests.call.fakeOverrideSubstituted.box() } + + @Test + fun testInnerClassConstructor() = test("call.innerClassConstructor") { tests.call.innerClassConstructor.box() } + + @Test + fun testLocalClassMember() = test("call.localClassMember") { tests.call.localClassMember.box() } + + @Test + fun testMemberOfGenericClass() = test("call.memberOfGenericClass") { tests.call.memberOfGenericClass.box() } + + @Test + fun testSimpleTopLevelFunctions() = test("call.simpleTopLevelFunctions") { tests.call.simpleTopLevelFunctions.box() } + + // callBy + @Test + fun testSimpleMemberFunciton() = test("call.simpleMemberFunciton") { tests.callBy.simpleMemberFunciton.box() } +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 5dd65de..d2eaa2a 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -4,11 +4,20 @@ import kotlinx.reflect.lite.* internal fun Class.toLiteKClass() = ReflectionLite.loadClassMetadata(this) +internal fun KClass.getMemberByName(name: String) = + members.single { it.name == name } + +internal fun KClass.getPrimaryConstructor() = constructors.first() as KFunction + internal inline fun test(name: String, box: () -> String) { print("$name: ") try { val res = box() - println(res) + if (res != "OK") { + error("INCORRECT RESULT: $res") + } else { + println(res) + } } catch (e: Throwable) { println("EXCEPTION: ${e.message}") throw e From d02ab874c98f66e693c235fef6f92435b8261c0d Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 19 Jul 2022 13:47:53 +0200 Subject: [PATCH 12/74] Copy source notes --- .../java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt | 1 + src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt | 1 + src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt index fb1d9ea..4272b27 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt @@ -1,3 +1,4 @@ +// Partially copied from: https://github.com/JetBrains/kotlin/blob/9d09b9605fe5a32a40a84718aebeab6ca6234ab8/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.builtins.StandardNames.FQ_NAMES diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt index 9c89bd2..aa4e866 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt @@ -1,3 +1,4 @@ +// Partially copied: https://github.com/JetBrains/kotlin/blob/69a13a32691ea3b952f763aa958e276128474718/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.kt package kotlinx.reflect.lite.builtins object JvmAbi { diff --git a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt index 08c50ab..6b237e4 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt @@ -1,3 +1,4 @@ +// Partially copied from: https://github.com/JetBrains/kotlin/blob/b573532d8cbf9bf5347adb40d0774c21c2d35dc0/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.name.* @@ -42,4 +43,4 @@ internal object StandardNames { class ClassIds { val any = ClassId(BUILT_INS_PACKAGE_FQ_NAME, "Any") } -} \ No newline at end of file +} From bb632b95366430d74f9f5a77cf344d870a9af39f Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Fri, 22 Jul 2022 17:16:23 +0200 Subject: [PATCH 13/74] Class member properties implemented: KProperty0, KProperty1 --- .../java/kotlinx/reflect/lite/KProperty.kt | 2 +- .../reflect/lite/descriptors/descriptors.kt | 2 +- .../impl/AbstractCallableDescriptor.kt | 2 +- .../impl/PropertyDescriptorImpl.kt | 121 ++++++++++------- .../impl/ValueParameterDescriptorImpl.kt | 27 +++- .../kotlinx/reflect/lite/descriptors/util.kt | 21 ++- .../reflect/lite/impl/KCallableImpl.kt | 7 + .../reflect/lite/impl/KFunctionImpl.kt | 7 - .../reflect/lite/impl/KPropertyImpl.kt | 127 +++++++++++++++--- .../java/kotlinx/reflect/lite/impl/util.kt | 23 +++- .../testData/parameters/boundReferences.kt | 2 +- .../accessors/memberPropertyAccessors.kt | 6 +- .../reflect/lite/tests/KPropertyTest.kt | 11 ++ .../kotlinx/reflect/lite/tests/testUtil.kt | 7 +- 14 files changed, 279 insertions(+), 86 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt diff --git a/src/main/java/kotlinx/reflect/lite/KProperty.kt b/src/main/java/kotlinx/reflect/lite/KProperty.kt index 48fa2dc..a8e08a6 100644 --- a/src/main/java/kotlinx/reflect/lite/KProperty.kt +++ b/src/main/java/kotlinx/reflect/lite/KProperty.kt @@ -12,7 +12,7 @@ public interface KProperty : KCallable { * for more information. */ @SinceKotlin("1.1") - public val isLateinit: Boolean + public val isLateInit: Boolean /** * `true` if this property is `const`. diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index c6d3f77..cfdb2dc 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -90,7 +90,7 @@ internal class MemberScope( internal interface CallableDescriptor : DeclarationDescriptor { val module: ModuleDescriptor - val containingClass: ClassDescriptor<*>? + val containingClass: ClassDescriptor<*>? // todo do we need them both? val container: DeclarationContainerDescriptor val dispatchReceiverParameter: ReceiverParameterDescriptor? diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt index 686ff14..e17701e 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt @@ -8,7 +8,7 @@ import kotlinx.reflect.lite.descriptors.CallableDescriptor internal interface AbstractCallableDescriptor : CallableDescriptor { val flags: Flags - override val visibility: KVisibility? + override val visibility: KVisibility? // todo add DescriptorVisibility maybe for consistency get() = flags.toVisibility() val typeParameterTable: TypeParameterTable diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index cb756d0..85c8d8d 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -2,8 +2,11 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.misc.JvmPropertySignature import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -42,10 +45,14 @@ internal class PropertyDescriptorImpl( get() = true override val dispatchReceiverParameter: ReceiverParameterDescriptor? - get() = containingClass?.let { ReceiverParameterDescriptorImpl(it.defaultType, this) } + get() = containingClass?.let { + ReceiverParameterDescriptorImpl(it.defaultType, this) + } override val extensionReceiverParameter: ReceiverParameterDescriptor? - get() = kmProperty.receiverParameterType?.let { ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) } + get() = kmProperty.receiverParameterType?.let { + ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) + } override val getter: PropertyGetterDescriptor? get() = if (Flag.Property.HAS_GETTER(flags)) PropertyGetterDescriptorImpl(this) else null @@ -60,12 +67,9 @@ internal class PropertyDescriptorImpl( get() = getter?.defaultCaller ?: error("The property has no getter") } -internal class PropertyGetterDescriptorImpl( +internal abstract class PropertyAccessorDescriptorImpl( override val property: PropertyDescriptorImpl -) : AbstractFunctionDescriptor(), PropertyGetterDescriptor { - override val name: Name - get() = "" - +) : AbstractFunctionDescriptor(), PropertyAccessorDescriptor { override val module: ModuleDescriptor get() = property.module override val containingClass: ClassDescriptor<*>? @@ -90,58 +94,83 @@ internal class PropertyGetterDescriptorImpl( override val isReal: Boolean get() = property.isReal - override val flags: Flags - get() = property.kmProperty.getterFlags + // TODO create abstract property jvmSignature + // TODO abstract and override jvmSignature for PropertyAccessorDescriptor + val jvmSignature: JvmPropertySignature.KotlinProperty + get() = JvmPropertySignature.KotlinProperty( + property, + property.kmProperty.fieldSignature, + property.kmProperty.getterSignature, + property.kmProperty.setterSignature + ) - private val jvmSignature: JvmFunctionSignature.KotlinFunction - get() = JvmFunctionSignature.KotlinFunction(property.kmProperty.getterSignature ?: error("No getter signature for ${property.kmProperty}")) - - override val member: Member? - get() = container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) + abstract override val member: Method? override val defaultMember: Member? - get() = container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) + get() = null // TODO: no defaultMember for properties + + // TODO: support: JavaField, JavaMethodProperty, MappedKotlinProperty + override val caller: Caller<*> + get() { + val accessor = member + return when { + accessor == null -> { + // todo inlineClassAwareCaller + if (property.isUnderlyingPropertyOfInlineClass() && + property.visibility == KVisibility.INTERNAL + ) { + TODO("Inline class aware caller is not supported yet") + } else { + TODO("Implement PropertyDescriptor.javaField") + } + } + !Modifier.isStatic(accessor.modifiers) -> + // todo isBound + CallerImpl.Method.Instance(accessor) + isJvmStaticProperty() -> + // todo isBound + CallerImpl.Method.JvmStaticInObject(accessor) + else -> + // todo isBound + CallerImpl.Method.Static(accessor) + } + } + + fun isJvmStaticProperty(): Boolean { + return TODO("Implement isJvmStaticProperty: check annotations") + } } -internal class PropertySetterDescriptorImpl( +internal class PropertyGetterDescriptorImpl( override val property: PropertyDescriptorImpl -) : AbstractFunctionDescriptor(), PropertySetterDescriptor { +) : PropertyAccessorDescriptorImpl(property), PropertyGetterDescriptor { override val name: Name - get() = "" - - override val module: ModuleDescriptor - get() = property.module - override val containingClass: ClassDescriptor<*>? - get() = property.containingClass - override val container: DeclarationContainerDescriptor - get() = property.container + get() = "" - override val typeParameterTable: TypeParameterTable - get() = property.typeParameterTable - override val valueParameters: List = - listOf(ValueParameterDescriptorImpl(property.kmProperty.setterParameter!!, this, 0)) - override val typeParameters: List - get() = property.typeParameters - override val returnType: KotlinType - get() = module.findClass("kotlin/Unit").kotlinType + override val flags: Flags + get() = property.kmProperty.getterFlags - override val dispatchReceiverParameter: ReceiverParameterDescriptor? - get() = property.dispatchReceiverParameter - override val extensionReceiverParameter: ReceiverParameterDescriptor? - get() = property.extensionReceiverParameter + override val member: Method? + get() = jvmSignature.getterSignature?.let { signature -> + property.container.findMethodBySignature(signature.name, signature.desc) + } +} - override val isReal: Boolean - get() = property.isReal +internal class PropertySetterDescriptorImpl( + override val property: PropertyDescriptorImpl +) : PropertyAccessorDescriptorImpl(property), PropertySetterDescriptor { + override val name: Name + get() = "" override val flags: Flags get() = property.kmProperty.setterFlags - private val jvmSignature: JvmFunctionSignature.KotlinFunction - get() = JvmFunctionSignature.KotlinFunction(property.kmProperty.getterSignature ?: error("No getter signature for ${property.kmProperty}")) + override val member: Method? + get() = jvmSignature.setterSignature?.let { signature -> + property.container.findMethodBySignature(signature.name, signature.desc) + } +} + +// todo KProperty2Descriptor - override val member: Member? - get() = container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) - override val defaultMember: Member? - get() = container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) -} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt index 4d8c6ae..261475d 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt @@ -12,12 +12,33 @@ internal class ValueParameterDescriptorImpl( override val name: Name get() = kmValueParam.name - override val type: KotlinType? - get() = kmValueParam.type?.toKotlinType(containingDeclaration.module, containingDeclaration.typeParameterTable) + // todo implement annotations + + override val type: KotlinType + get() = kmValueParam.type.toKotlinType(containingDeclaration.module, containingDeclaration.typeParameterTable) override val declaresDefaultValue: Boolean get() = Flag.ValueParameter.DECLARES_DEFAULT_VALUE(kmValueParam.flags) override val varargElementType: KotlinType? get() = kmValueParam.varargElementType?.toKotlinType(containingDeclaration.module, containingDeclaration.typeParameterTable) -} \ No newline at end of file +} + +internal class PropertySetterParameterDescriptor( + private val kmSetterParam: KmValueParameter?, + private val setter: PropertySetterDescriptorImpl, +) : ValueParameterDescriptor { + override val name: Name + get() = kmSetterParam?.name ?: "" + + // todo implement annotations + + override val containingDeclaration: CallableDescriptor + get() = setter + override val type: KotlinType + get() = setter.property.returnType + override val declaresDefaultValue: Boolean + get() = false + override val varargElementType: KotlinType? + get() = null +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt index 1cff8f3..7487551 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt @@ -2,6 +2,9 @@ package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.descriptors.impl.ClassDescriptorImpl +import kotlinx.reflect.lite.impl.* internal fun Flags.toVisibility(): KVisibility? = when { @@ -19,4 +22,20 @@ internal fun KmVariance.toVariance(): KVariance = KmVariance.INVARIANT -> KVariance.INVARIANT KmVariance.IN -> KVariance.IN KmVariance.OUT -> KVariance.OUT - } \ No newline at end of file + } + +internal fun CallableDescriptor.isGetterOfUnderlyingPropertyOfInlineClass() = + this is PropertyGetterDescriptor && property.isUnderlyingPropertyOfInlineClass() + +internal fun CallableDescriptor.isUnderlyingPropertyOfInlineClass(): Boolean { + if (this !is PropertyDescriptor || extensionReceiverParameter != null) return false + val container = containingClass + return container is ClassDescriptorImpl && container.kmClass.inlineClassUnderlyingPropertyName == name +} + +// TODO: do we need it? +internal fun DeclarationDescriptor?.toInlineClass(): Class<*>? = + if (this is ClassDescriptor<*> && isValue) + this.jClass + else + null diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index b65ffb3..84ace60 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -47,6 +47,13 @@ internal abstract class KCallableImpl: KCallable { override val returnType: KType get() = KTypeImpl(descriptor.returnType) + override val isAbstract: Boolean + get() = descriptor.isAbstract + override val isFinal: Boolean + get() = descriptor.isFinal + override val isOpen: Boolean + get() = descriptor.isOpen + @Suppress("UNCHECKED_CAST") override fun call(vararg args: Any?): R { return descriptor.caller.call(args) as R diff --git a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt index fd33aeb..3279fa4 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt @@ -19,11 +19,4 @@ internal class KFunctionImpl( get() = descriptor.isInfix override val isSuspend: Boolean get() = descriptor.isSuspend - - override val isAbstract: Boolean - get() = descriptor.isAbstract - override val isFinal: Boolean - get() = descriptor.isFinal - override val isOpen: Boolean - get() = descriptor.isOpen } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt index 94fd646..1a32a29 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt @@ -2,33 +2,124 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.impl.* -internal class KPropertyImpl( +internal abstract class KPropertyImpl( override val descriptor: PropertyDescriptor ) : KCallableImpl(), KProperty { override val name: String get() = descriptor.name - override fun call(vararg args: Any?): T { - TODO("Not yet implemented") - } - - override val isFinal: Boolean - get() = descriptor.isFinal - override val isAbstract: Boolean - get() = descriptor.isAbstract - override val isOpen: Boolean - get() = descriptor.isOpen + override val isConst: Boolean + get() = descriptor.isConst + override val isLateInit: Boolean + get() = descriptor.isLateInit override val isSuspend: Boolean get() = false - override val isConst: Boolean - get() = descriptor.isConst + override fun call(vararg args: Any?): T = getter.call(args) - override val isLateinit: Boolean - get() = descriptor.isLateInit + abstract override val getter: KProperty.Getter + + abstract class Accessor : KCallableImpl(), KProperty.Accessor, KFunction { + abstract override val descriptor: PropertyAccessorDescriptor + + abstract override val property: KPropertyImpl + + override val isInline: Boolean get() = descriptor.isInline + override val isExternal: Boolean get() = descriptor.isExternal + override val isOperator: Boolean get() = descriptor.isOperator + override val isInfix: Boolean get() = descriptor.isInfix + override val isSuspend: Boolean get() = descriptor.isSuspend + override val isFinal: Boolean get() = descriptor.isFinal + override val isAbstract: Boolean get() = descriptor.isAbstract + override val isOpen: Boolean get() = descriptor.isOpen // todo check inherrited proeprties + } + + abstract class Getter : Accessor(), KProperty.Getter { + override val name: String get() = "" - override val getter: KProperty.Getter - get() = TODO("Not yet implemented") + override val descriptor: PropertyGetterDescriptor + get() = property.descriptor.getter ?: TODO("create default property getter") + + override fun toString(): String = "getter of $property" + + override fun equals(other: Any?): Boolean = + other is Getter<*> && property == other.property + + override fun hashCode(): Int = property.hashCode() + } + + abstract class Setter : Accessor(), KMutableProperty.Setter { + override val name: String get() = "" + + override val descriptor: PropertySetterDescriptor + get() = property.descriptor.setter ?: TODO("create default property setter") + + override fun toString(): String = "setter of $property" + + override fun equals(other: Any?): Boolean = + other is Setter<*> && property == other.property + + override fun hashCode(): Int = property.hashCode() + } +} + +internal open class KProperty0Impl( + override val descriptor: PropertyDescriptor +): KPropertyImpl(descriptor), KProperty0 { + override val getter: KProperty0.Getter + get() = Getter(this) + + override fun get(): V = getter.call() + + override fun invoke(): V = get() + + class Getter( + override val property: KProperty0Impl + ) : KPropertyImpl.Getter(), KProperty0.Getter { + override fun invoke(): R = property.get() + } +} + +internal open class KMutableProperty0Impl( + override val descriptor: PropertyDescriptor +): KProperty0Impl(descriptor), KMutableProperty0 { + + override val setter: Setter + get() = Setter(this) + + override fun set(value: V) = setter.call(value) + + class Setter(override val property: KMutableProperty0Impl) : KPropertyImpl.Setter(), KMutableProperty0.Setter { + override fun invoke(value: R): Unit = property.set(value) + } +} + +internal open class KProperty1Impl( + override val descriptor: PropertyDescriptor +): KPropertyImpl(descriptor), KProperty1 { + override val getter: KProperty1.Getter + get() = Getter(this) + + override fun get(receiver: T): V = getter.call(receiver) + + override fun invoke(receiver: T): V = get(receiver) + + class Getter(override val property: KProperty1Impl) :KPropertyImpl.Getter(), KProperty1.Getter { + override fun invoke(receiver: T): V = property.get(receiver) + } +} + +internal open class KMutableProperty1Impl( + override val descriptor: PropertyDescriptor +): KProperty1Impl(descriptor), KMutableProperty1 { + + override val setter: Setter + get() = Setter(this) + + override fun set(receiver: T, value: V) = setter.call(receiver, value) + + class Setter(override val property: KMutableProperty1Impl) : KPropertyImpl.Setter(), KMutableProperty1.Setter { + override fun invoke(receiver: T, value: V): Unit = property.set(receiver, value) + } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index cfe8334..98f857d 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -2,8 +2,7 @@ package kotlinx.reflect.lite.impl import kotlinx.metadata.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.calls.* -import kotlinx.reflect.lite.calls.Caller +3import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.CallableDescriptor import kotlinx.reflect.lite.descriptors.impl.* @@ -12,8 +11,24 @@ import java.lang.reflect.* internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { if (descriptor is PropertyDescriptor) { - // TODO: implement properties - return KPropertyImpl(descriptor) + val receiverCount = (descriptor.dispatchReceiverParameter?.let { 1 } ?: 0) + + (descriptor.extensionReceiverParameter?.let { 1 } ?: 0) + + when { + descriptor.isVar -> + when (receiverCount) { + 0 -> return KMutableProperty0Impl(descriptor) + 1 -> return KMutableProperty1Impl(descriptor) + else -> TODO("Implement mutable properties for other numbers of receivers") +// 2 -> return KMutableProperty2Impl(container, descriptor) + } + else -> when (receiverCount) { + 0 -> return KProperty0Impl(descriptor) + 1 -> return KProperty1Impl(descriptor) + else -> TODO("Implement properties for other numbers of receivers") +// 2 -> return KProperty2Impl(container, descriptor) + } + } } if (descriptor is FunctionDescriptor) { return KFunctionImpl(descriptor) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt index 0898bb3..e6604ae 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt @@ -25,7 +25,7 @@ fun box(): String { assertEquals(1, cFoo.parameters.size) assertFalse(cBar.isConst) - assertFalse(cBar.isLateinit) + assertFalse(cBar.isLateInit) // TODO mutable properties are not supported yet //assertEquals(1, cBar.setter.parameters.size) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt index d750a3e..579a9ec 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt @@ -1,11 +1,13 @@ package tests.properties.accessors.memberPropertyAccessors +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals class C(var state: String) fun box(): String { - val prop = C::state + val prop = C::class.java.toLiteKClass().getPropertyByName("state") as KMutableProperty1 val c = C("1") assertEquals("1", prop.getter.invoke(c)) @@ -14,4 +16,4 @@ fun box(): String { prop.setter(c, "OK") return prop.get(c) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt new file mode 100644 index 0000000..69e11ce --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt @@ -0,0 +1,11 @@ +package kotlinx.reflect.lite.tests + +import org.junit.* + +class KPropertyTest { + // accessors + @Test + fun testMemberPropertyAccessors() = test("properties.accessors.memberPropertyAccessors.box()") { tests.properties.accessors.memberPropertyAccessors.box() } + + +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index d2eaa2a..811edfc 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -5,7 +5,12 @@ import kotlinx.reflect.lite.* internal fun Class.toLiteKClass() = ReflectionLite.loadClassMetadata(this) internal fun KClass.getMemberByName(name: String) = - members.single { it.name == name } + members.single { it.name == name } + +internal fun KClass<*>.getPropertyByName(name: String) = + members.single { it.name == name } + +// todo util function getFunctionByName to cast internal fun KClass.getPrimaryConstructor() = constructors.first() as KFunction From 8fe9422c92d1c8eb9e2a76678e28c042be210688 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 25 Jul 2022 02:53:23 +0200 Subject: [PATCH 14/74] Java to Kotlin reflection mapping: kotlinClass, kotlinFunction, kotlinProperty WIP --- .../java/kotlinx/reflect/lite/KPackage.kt | 3 + .../kotlinx/reflect/lite/ReflectionLite.kt | 2 +- .../reflect/lite/descriptors/descriptors.kt | 12 +- ...asedDeclarationContainerDescriptorImpl.kt} | 8 +- .../descriptors/impl/ClassDescriptorImpl.kt | 103 +++++++++--------- .../impl/ConstructorDescriptorImpl.kt | 2 +- .../impl/FunctionDescriptorImpl.kt | 2 +- .../descriptors/impl/ModuleDescriptorImpl.kt | 56 +++++++++- .../descriptors/impl/PackageDescriptorImpl.kt | 38 +++++++ .../impl/PropertyDescriptorImpl.kt | 8 +- .../kotlinx/reflect/lite/impl/KClassImpl.kt | 7 +- .../lite/impl/KDeclarationContainerImpl.kt | 12 ++ .../kotlinx/reflect/lite/impl/KPackageImpl.kt | 8 ++ .../reflect/lite/impl/ReflectJvmMapping.kt | 77 +++++++++++++ .../reflect/lite/impl/ReflectionLiteImpl.kt | 25 ++++- .../java/kotlinx/reflect/lite/impl/util.kt | 4 +- .../accessors/extensionPropertyAccessors.kt | 10 +- .../accessors/topLevelPropertyAccessors.kt | 7 +- .../reflect/lite/tests/KPropertyTest.kt | 6 +- .../kotlinx/reflect/lite/tests/testUtil.kt | 2 +- 20 files changed, 305 insertions(+), 87 deletions(-) create mode 100644 src/main/java/kotlinx/reflect/lite/KPackage.kt rename src/main/java/kotlinx/reflect/lite/descriptors/impl/{DeclarationContainerDescriptorImpl.kt => ClassBasedDeclarationContainerDescriptorImpl.kt} (96%) create mode 100644 src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt diff --git a/src/main/java/kotlinx/reflect/lite/KPackage.kt b/src/main/java/kotlinx/reflect/lite/KPackage.kt new file mode 100644 index 0000000..c46bf65 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/KPackage.kt @@ -0,0 +1,3 @@ +package kotlinx.reflect.lite + +interface KPackage : KDeclarationContainer diff --git a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt index e4dcc8c..fec6484 100644 --- a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt +++ b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt @@ -25,7 +25,7 @@ object ReflectionLite { /** * Metadata for the given [klass] if this is a Kotlin class, or `null` otherwise. */ - fun loadClassMetadata(klass: Class): KClass { + fun loadClassMetadata(klass: Class): KDeclarationContainer { return ReflectionLiteImpl.loadClassMetadata(klass) } } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index cfdb2dc..e9f28ea 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -34,8 +34,9 @@ internal interface DeclarationDescriptor : Annotated { val name: Name } -internal interface DeclarationContainerDescriptor { +internal interface ClassBasedDeclarationContainerDescriptor { val jClass: Class<*> + val module: ModuleDescriptor val declaredMembers: Collection> val allMembers: Collection> @@ -46,10 +47,9 @@ internal interface DeclarationContainerDescriptor { fun findDefaultMethod(name: String, desc: String, isMember: Boolean): Method? } -internal interface ClassDescriptor : DeclarationContainerDescriptor, ClassifierDescriptor { +internal interface ClassDescriptor : ClassBasedDeclarationContainerDescriptor, ClassifierDescriptor { val kmClass: KmClass val classId: ClassId - val module: ModuleDescriptor val simpleName: String? val qualifiedName: String? @@ -83,6 +83,10 @@ internal interface ClassDescriptor : DeclarationContainerDescriptor, Clas val isValue: Boolean } +internal interface PackageDescriptor : ClassBasedDeclarationContainerDescriptor, ClassifierDescriptor { + val kmPackage: KmPackage +} + internal class MemberScope( val properties: List, val functions: List @@ -91,7 +95,7 @@ internal class MemberScope( internal interface CallableDescriptor : DeclarationDescriptor { val module: ModuleDescriptor val containingClass: ClassDescriptor<*>? // todo do we need them both? - val container: DeclarationContainerDescriptor + val container: ClassBasedDeclarationContainerDescriptor val dispatchReceiverParameter: ReceiverParameterDescriptor? val extensionReceiverParameter: ReceiverParameterDescriptor? diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/DeclarationContainerDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt similarity index 96% rename from src/main/java/kotlinx/reflect/lite/descriptors/impl/DeclarationContainerDescriptorImpl.kt rename to src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt index 935a6ac..24d5d13 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/DeclarationContainerDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt @@ -9,17 +9,15 @@ import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.* import java.lang.reflect.* -internal abstract class DeclarationContainerDescriptorImpl : DeclarationContainerDescriptor { +internal abstract class ClassBasedDeclarationContainerDescriptorImpl( + override val jClass: Class<*> +) : ClassBasedDeclarationContainerDescriptor { protected open val methodOwner: Class<*> get() = jClass.wrapperByPrimitive ?: jClass abstract val memberScope: MemberScope abstract val staticScope: MemberScope - abstract val constructors: Collection - abstract val properties: Collection - abstract val functions: Collection - val declaredNonStaticMembers: Collection> get() = getMembers(memberScope, MemberBelonginess.DECLARED) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index 3fea3c4..8fa8c4b 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -18,64 +18,64 @@ import kotlinx.reflect.lite.name.* internal class ClassDescriptorImpl internal constructor( override val jClass: Class -) : ClassDescriptor, DeclarationContainerDescriptorImpl() { - - override val kmClass: KmClass = jClass.getKmClass() +) : ClassDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { override val module = ModuleDescriptorImpl(jClass.safeClassLoader) - override val classId: ClassId = RuntimeTypeMapper.mapJvmClassToKotlinClassId(jClass) - - private fun Class<*>.getKmClass(): KmClass { - val className = jClass.name - val builtinClassId = when (className) { - "[Ljava.lang.Object;" -> ClassId(FqName("kotlin"), "Array") - // TODO: move this into mapJavaToKotlin - "[Z" -> ClassId(FqName("kotlin"), "BooleanArray") - "[B" -> ClassId(FqName("kotlin"), "ByteArray") - "[C" -> ClassId(FqName("kotlin"), "CharArray") - "[D" -> ClassId(FqName("kotlin"), "DoubleArray") - "[F" -> ClassId(FqName("kotlin"), "FloatArray") - "[I" -> ClassId(FqName("kotlin"), "IntArray") - "[J" -> ClassId(FqName("kotlin"), "LongArray") - "[S" -> ClassId(FqName("kotlin"), "ShortArray") - "java.lang.Void" -> ClassId(FqName("kotlin"), "Nothing") // TODO: ??? - else -> when { - jClass.isPrimitive -> { - when (jClass) { - Boolean::class.java -> ClassId(FqName("kotlin"), "Boolean") - Byte::class.java -> ClassId(FqName("kotlin"), "Byte") - Char::class.java -> ClassId(FqName("kotlin"), "Char") - Double::class.java -> ClassId(FqName("kotlin"), "Double") - Float::class.java -> ClassId(FqName("kotlin"), "Float") - Int::class.java -> ClassId(FqName("kotlin"), "Int") - Long::class.java -> ClassId(FqName("kotlin"), "Long") - Short::class.java -> ClassId(FqName("kotlin"), "Short") - else -> error(jClass) + override val kmClass: KmClass + get() { + val className = jClass.name + val builtinClassId = when (className) { + "[Ljava.lang.Object;" -> ClassId(FqName("kotlin"), "Array") + // TODO: move this into mapJavaToKotlin + "[Z" -> ClassId(FqName("kotlin"), "BooleanArray") + "[B" -> ClassId(FqName("kotlin"), "ByteArray") + "[C" -> ClassId(FqName("kotlin"), "CharArray") + "[D" -> ClassId(FqName("kotlin"), "DoubleArray") + "[F" -> ClassId(FqName("kotlin"), "FloatArray") + "[I" -> ClassId(FqName("kotlin"), "IntArray") + "[J" -> ClassId(FqName("kotlin"), "LongArray") + "[S" -> ClassId(FqName("kotlin"), "ShortArray") + "java.lang.Void" -> ClassId(FqName("kotlin"), "Nothing") // TODO: ??? + else -> when { + jClass.isPrimitive -> { + when (jClass) { + Boolean::class.java -> ClassId(FqName("kotlin"), "Boolean") + Byte::class.java -> ClassId(FqName("kotlin"), "Byte") + Char::class.java -> ClassId(FqName("kotlin"), "Char") + Double::class.java -> ClassId(FqName("kotlin"), "Double") + Float::class.java -> ClassId(FqName("kotlin"), "Float") + Int::class.java -> ClassId(FqName("kotlin"), "Int") + Long::class.java -> ClassId(FqName("kotlin"), "Long") + Short::class.java -> ClassId(FqName("kotlin"), "Short") + else -> error(jClass) + } } + else -> JavaToKotlinClassMap.mapJavaToKotlin(jClass.classId.asSingleFqName()) + } + } + if (builtinClassId != null) { + val packageName = builtinClassId.packageFqName + // kotlin.collections -> kotlin/collections/collections.kotlin_builtins + val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" + val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() + ?: error("No builtins metadata file found: $resourcePath") // TODO: return null + val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() + ?: error("Incompatible metadata version: $resourcePath") // TODO + return packageFragment.classes.find { it.name == builtinClassId.asClassName() } + ?: error("Built-in class not found: $builtinClassId in $resourcePath") + } else { + val header = jClass.getAnnotation(Metadata::class.java)?.let { + KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) + } ?: error("@Metadata annotation was not found for ${jClass.name} ") + return when (val metadata = KotlinClassMetadata.read(header)) { + is KotlinClassMetadata.Class -> metadata.toKmClass() + else -> error("Can not create ClassDescriptor for metadata of type $metadata") } - else -> JavaToKotlinClassMap.mapJavaToKotlin(jClass.classId.asSingleFqName()) } } - return if (builtinClassId != null) { - val packageName = builtinClassId.packageFqName - // kotlin.collections -> kotlin/collections/collections.kotlin_builtins - val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" - val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() - ?: error("No builtins metadata file found: $resourcePath") // TODO: return null - val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() - ?: error("Incompatible metadata version: $resourcePath") // TODO - packageFragment.classes.find { it.name == builtinClassId.asClassName() } - ?: error("Built-in class not found: $builtinClassId in $resourcePath") - } else { - val header = getAnnotation(Metadata::class.java)?.let { - KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) - } ?: error("@Metadata annotation was not found for ${name} ") - val metadata = KotlinClassMetadata.read(header) - (metadata as? KotlinClassMetadata.Class)?.toKmClass() - ?: error("KotlinClassMetadata.Class metadata is only supported for now") - } - } + + override val classId: ClassId = RuntimeTypeMapper.mapJvmClassToKotlinClassId(jClass) override val name: Name get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') @@ -130,7 +130,6 @@ internal class ClassDescriptorImpl internal constructor( FunctionDescriptorImpl(it, module, this, this) } - // TODO: static members override val memberScope: MemberScope get() = MemberScope( kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) }.let { realProperties -> diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index c6e62b5..b8068aa 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -11,7 +11,7 @@ internal class ConstructorDescriptorImpl( val kmCons: KmConstructor, override val module: ModuleDescriptor, override val containingClass: ClassDescriptor<*>, - override val container: DeclarationContainerDescriptor + override val container: ClassBasedDeclarationContainerDescriptor ) : AbstractFunctionDescriptor(), ConstructorDescriptor { override val flags: Flags get() = kmCons.flags diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 5f9d0b2..3aa1a29 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -72,7 +72,7 @@ internal class FunctionDescriptorImpl( val kmFunction: KmFunction, override val module: ModuleDescriptor, override val containingClass: ClassDescriptor<*>?, - override val container: DeclarationContainerDescriptor + override val container: ClassBasedDeclarationContainerDescriptor ) : AbstractFunctionDescriptor() { override val flags: Flags get() = kmFunction.flags diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index 544c7a8..e5dd2e6 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -1,6 +1,8 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* +import kotlinx.metadata.internal.common.* +import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.builtins.* import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor @@ -13,4 +15,56 @@ internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : Mod val jClass = classLoader.tryLoadClass(fqName) ?: error("Failed to load the class: $fqName") return ClassDescriptorImpl(jClass as Class) } -} \ No newline at end of file + + // TODO: fix creation of ClassDescriptor + internal fun Class<*>.getKmClass(): KmClass { + val className = name + val builtinClassId = when (className) { + "[Ljava.lang.Object;" -> ClassId(FqName("kotlin"), "Array") + // TODO: move this into mapJavaToKotlin + "[Z" -> ClassId(FqName("kotlin"), "BooleanArray") + "[B" -> ClassId(FqName("kotlin"), "ByteArray") + "[C" -> ClassId(FqName("kotlin"), "CharArray") + "[D" -> ClassId(FqName("kotlin"), "DoubleArray") + "[F" -> ClassId(FqName("kotlin"), "FloatArray") + "[I" -> ClassId(FqName("kotlin"), "IntArray") + "[J" -> ClassId(FqName("kotlin"), "LongArray") + "[S" -> ClassId(FqName("kotlin"), "ShortArray") + "java.lang.Void" -> ClassId(FqName("kotlin"), "Nothing") // TODO: ??? + else -> when { + this.isPrimitive -> { + when (this) { + Boolean::class.java -> ClassId(FqName("kotlin"), "Boolean") + Byte::class.java -> ClassId(FqName("kotlin"), "Byte") + Char::class.java -> ClassId(FqName("kotlin"), "Char") + Double::class.java -> ClassId(FqName("kotlin"), "Double") + Float::class.java -> ClassId(FqName("kotlin"), "Float") + Int::class.java -> ClassId(FqName("kotlin"), "Int") + Long::class.java -> ClassId(FqName("kotlin"), "Long") + Short::class.java -> ClassId(FqName("kotlin"), "Short") + else -> error(this) + } + } + else -> JavaToKotlinClassMap.mapJavaToKotlin(classId.asSingleFqName()) + } + } + return if (builtinClassId != null) { + val packageName = builtinClassId.packageFqName + // kotlin.collections -> kotlin/collections/collections.kotlin_builtins + val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" + val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() + ?: error("No builtins metadata file found: $resourcePath") // TODO: return null + val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() + ?: error("Incompatible metadata version: $resourcePath") // TODO + packageFragment.classes.find { it.name == builtinClassId.asClassName() } + ?: error("Built-in class not found: $builtinClassId in $resourcePath") + } else { + val header = getAnnotation(Metadata::class.java)?.let { + KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) + } ?: error("@Metadata annotation was not found for ${name} ") + val metadata = KotlinClassMetadata.read(header) + (metadata as? KotlinClassMetadata.Class)?.toKmClass() + ?: error("KotlinClassMetadata.Class metadata is only supported for now") + } + } +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt new file mode 100644 index 0000000..213f4c0 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt @@ -0,0 +1,38 @@ +package kotlinx.reflect.lite.descriptors.impl + +import kotlinx.metadata.* +import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.misc.* +import kotlinx.reflect.lite.name.* + +internal class PackageDescriptorImpl( + override val jClass: Class +) : PackageDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { + + override val module = ModuleDescriptorImpl(jClass.safeClassLoader) + + override val kmPackage: KmPackage + get() { + val header = jClass.getAnnotation(Metadata::class.java)?.let { + KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) + } ?: error("@Metadata annotation was not found for ${jClass.name} ") + return when (val metadata = KotlinClassMetadata.read(header)) { + is KotlinClassMetadata.FileFacade -> metadata.toKmPackage() + else -> error("Can not create PackageDescriptor for metadata of type $metadata") + } + } + + override val memberScope: MemberScope + get() = MemberScope( + kmPackage.properties.map { PropertyDescriptorImpl(it, module, null, this) }, + kmPackage.functions.map { FunctionDescriptorImpl(it, module, null, this) } + ) + + // TODO: static scope + override val staticScope: MemberScope + get() = MemberScope(emptyList(), emptyList()) + + override val name: Name + get() = kmPackage.moduleName ?: error("kmPackage ${kmPackage} does not have a name") +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 85c8d8d..0d05999 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -7,7 +7,6 @@ import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.misc.JvmPropertySignature -import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -15,7 +14,7 @@ internal class PropertyDescriptorImpl( val kmProperty: KmProperty, override val module: ModuleDescriptor, override val containingClass: ClassDescriptor<*>?, - override val container: DeclarationContainerDescriptor + override val container: ClassBasedDeclarationContainerDescriptor ) : AbstractCallableDescriptor, PropertyDescriptor { override val flags: Flags get() = kmProperty.flags @@ -74,7 +73,7 @@ internal abstract class PropertyAccessorDescriptorImpl( get() = property.module override val containingClass: ClassDescriptor<*>? get() = property.containingClass - override val container: DeclarationContainerDescriptor + override val container: ClassBasedDeclarationContainerDescriptor get() = property.container override val typeParameterTable: TypeParameterTable @@ -137,7 +136,8 @@ internal abstract class PropertyAccessorDescriptorImpl( } fun isJvmStaticProperty(): Boolean { - return TODO("Implement isJvmStaticProperty: check annotations") + return false + TODO("Implement isJvmStaticProperty: check annotations") } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index 8c7a9c3..f548b16 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -4,8 +4,8 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.ClassDescriptor internal class KClassImpl( - val descriptor: ClassDescriptor -) : KClass { + override val descriptor: ClassDescriptor +) : KClass, KDeclarationContainerImpl() { override val simpleName: String? get() = descriptor.simpleName @@ -30,9 +30,6 @@ internal class KClassImpl( override val sealedSubclasses: List> get() = descriptor.sealedSubclasses.map(::KClassImpl) - override val members: Collection> - get() = descriptor.allMembers - override val visibility: KVisibility? get() = descriptor.visibility diff --git a/src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt new file mode 100644 index 0000000..904d112 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt @@ -0,0 +1,12 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.ClassBasedDeclarationContainerDescriptor + +internal abstract class KDeclarationContainerImpl : KDeclarationContainer { + + abstract val descriptor: ClassBasedDeclarationContainerDescriptor + + override val members: Collection> + get() = descriptor.allMembers +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt new file mode 100644 index 0000000..9385664 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt @@ -0,0 +1,8 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* + +internal class KPackageImpl( + override val descriptor: PackageDescriptor +) : KPackage, KDeclarationContainerImpl() diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt new file mode 100644 index 0000000..4eb24a3 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -0,0 +1,77 @@ +// Some logic copied from: https://github.com/JetBrains/kotlin/blob/26cdb2f928982dad7f0c9ab8e3bd509665d9d537/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.impl.* +import java.lang.reflect.* + +val Class.kotlinClass: KDeclarationContainer + @JvmName("getKotlinClass") + get() = ReflectionLiteImpl.loadClassMetadata(this) + +private fun Member.getKPackage(): KDeclarationContainer? = + when (declaringClass.getAnnotation(Metadata::class.java)?.kind) { + 2, 4, 5 -> KPackageImpl(PackageDescriptorImpl(declaringClass)) + else -> null + } + +/** + * Returns a [KClass] instance representing the companion object of a given class, + * or `null` if the class doesn't have a companion object. + */ +@SinceKotlin("1.1") +val KDeclarationContainer.companionObject: KClass<*>? + get() { + if (this !is KClass<*>) return null + return nestedClasses.firstOrNull { + (it as KClassImpl<*>).descriptor.isCompanion + } + } + +/** + * Returns a [KProperty] instance corresponding to the given Java [Field] instance, + * or `null` if this field cannot be represented by a Kotlin property + * (for example, if it is a synthetic field). + */ +// TODO renamed for now for resolution +val Field.kotlinLiteProperty: KProperty<*>? + get() { + if (isSynthetic) return null + + // TODO: optimize (search by name) + + val kotlinPackage = getKPackage() + if (kotlinPackage != null) { + return kotlinPackage.members.filterIsInstance>().firstOrNull { it.name == this.name } + } + // TODO comapare by javaField: { it.javaField == this } + return declaringClass.kotlinClass.members.filterIsInstance>().firstOrNull { it.name == this.name } + } + +/** + * Returns a [KFunction] instance corresponding to the given Java [Method] instance, + * or `null` if this method cannot be represented by a Kotlin function. + */ +val Method.kotlinLiteFunction: KFunction<*>? + get() { + if (Modifier.isStatic(modifiers)) { + val kotlinPackage = getKPackage() + if (kotlinPackage != null) { + // TODO comapare by javaMethod: { it.javaField == this } + return kotlinPackage.members.filterIsInstance>().firstOrNull { it.name == this.name } + } + + // For static bridge method generated for a @JvmStatic function in the companion object, also try to find the latter + val companion = declaringClass.kotlinClass.companionObject + if (companion != null) { + companion.members.filterIsInstance>().firstOrNull { + // TODO comapare by javaMethod: { it.javaField == this } + //val m = it.javaMethod +// m != null && m.name == this.name && +// m.parameterTypes!!.contentEquals(this.parameterTypes) && m.returnType == this.returnType + it.name == this.name + }?.let { return it } + } + } + return declaringClass.kotlinClass.members.filterIsInstance>().firstOrNull { it.name == this.name } + } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 2712ec7..80aa145 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -16,12 +16,27 @@ package kotlinx.reflect.lite.impl +import kotlinx.metadata.* +import kotlinx.metadata.internal.common.* +import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.descriptors.impl.ClassDescriptorImpl +import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.misc.* +import kotlinx.reflect.lite.name.* internal object ReflectionLiteImpl { - fun loadClassMetadata(jClass: Class): KClass { - val descriptor = ClassDescriptorImpl(jClass) - return KClassImpl(descriptor) + fun loadClassMetadata(jClass: Class): KDeclarationContainer { + return when (jClass.getAnnotation(Metadata::class.java)?.kind) { + // if the class may be builtin or it's kind == CLASS_KIND -> try create a KClass + // TODO: null case, check if is primitive or isAray + null, 1 -> KClassImpl(ClassDescriptorImpl(jClass)) + // if it's kind == FILE_FACADE_KIND -> try create a KPackage + // TODO: support header kinds MULTI_FILE_CLASS_FACADE_KIND, MULTI_FILE_CLASS_PART_KIND + 2 -> KPackageImpl(PackageDescriptorImpl(jClass)) + else -> throw KotlinReflectionInternalError("Can not load class metadata for $jClass") + } } -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 98f857d..851df67 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -2,7 +2,7 @@ package kotlinx.reflect.lite.impl import kotlinx.metadata.* import kotlinx.reflect.lite.* -3import kotlinx.reflect.lite.calls.Caller +import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.CallableDescriptor import kotlinx.reflect.lite.descriptors.impl.* @@ -131,7 +131,7 @@ internal abstract class FakeOverrideCallableMemberDescriptor( override val visibility: KVisibility? get() = overridden.first().visibility - override val container: DeclarationContainerDescriptor + override val container: ClassBasedDeclarationContainerDescriptor get() = containingClass override val typeParameterTable: TypeParameterTable diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index 291ec44..e7b4791 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -1,9 +1,13 @@ package tests.properties.accessors.extensionPropertyAccessors -import kotlin.test.assertEquals +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.reflect.jvm.* +import kotlin.test.* var state: String = "" +// TODO: implement top-level extension proeprties var String.prop: String get() = length.toString() set(value) { state = this + value } @@ -11,10 +15,12 @@ var String.prop: String fun box(): String { val prop = String::prop + val a = ::state.javaField!!.kotlinLiteProperty + assertEquals("3", prop.getter.invoke("abc")) assertEquals("5", prop.getter("defgh")) prop.setter("O", "K") return state -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index 0831418..32498b5 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -1,11 +1,14 @@ package tests.properties.accessors.topLevelPropertyAccessors +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlin.reflect.jvm.* import kotlin.test.assertEquals var state: String = "" fun box(): String { - val prop = ::state + val prop = ::state.javaField!!.kotlinLiteProperty as KMutableProperty0 assertEquals("", prop.getter.invoke()) assertEquals("", prop.getter()) @@ -13,4 +16,4 @@ fun box(): String { prop.setter("OK") return prop.get() -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt index 69e11ce..15f908a 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt @@ -5,7 +5,11 @@ import org.junit.* class KPropertyTest { // accessors @Test - fun testMemberPropertyAccessors() = test("properties.accessors.memberPropertyAccessors.box()") { tests.properties.accessors.memberPropertyAccessors.box() } + fun testMemberPropertyAccessors() = test("properties.accessors.memberPropertyAccessors") { tests.properties.accessors.memberPropertyAccessors.box() } + @Test + fun testExtensionPropertyAccessors() = test("properties.accessors.extensionPropertyAccessors") { tests.properties.accessors.extensionPropertyAccessors.box() } + @Test + fun testTopLevelPropertyAccessors() = test("properties.accessors.topLevelPropertyAccessors") { tests.properties.accessors.topLevelPropertyAccessors.box() } } diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 811edfc..8244db5 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -2,7 +2,7 @@ package kotlinx.reflect.lite.tests import kotlinx.reflect.lite.* -internal fun Class.toLiteKClass() = ReflectionLite.loadClassMetadata(this) +internal fun Class.toLiteKClass() = ReflectionLite.loadClassMetadata(this) as KClass internal fun KClass.getMemberByName(name: String) = members.single { it.name == name } From 50f00051551647283e1f485df949af9560bb9e03 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 25 Jul 2022 17:11:45 +0200 Subject: [PATCH 15/74] Kotlin to Java reflection: KProperty<*>.javaField --- .../reflect/lite/descriptors/descriptors.kt | 4 +++ .../impl/PropertyDescriptorImpl.kt | 36 ++++++++++++------- .../reflect/lite/impl/ReflectJvmMapping.kt | 11 ++++++ .../java/kotlinx/reflect/lite/impl/util.kt | 11 ++++-- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index e9f28ea..14fde4f 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -6,6 +6,7 @@ import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.impl.KotlinType import kotlinx.reflect.lite.descriptors.impl.TypeParameterTable import kotlinx.reflect.lite.impl.KCallableImpl +import kotlinx.reflect.lite.misc.JvmPropertySignature import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -150,6 +151,9 @@ internal interface PropertyDescriptor : CallableDescriptor { private val isDelegated: Boolean get() = TODO() + val jvmSignature: JvmPropertySignature.KotlinProperty + val javaField: Field? + val getter: PropertyGetterDescriptor? val setter: PropertySetterDescriptor? } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 0d05999..70687fa 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -53,6 +53,28 @@ internal class PropertyDescriptorImpl( ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) } + // TODO: also support overriden properties + override val jvmSignature: JvmPropertySignature.KotlinProperty + get() = JvmPropertySignature.KotlinProperty( + this, + kmProperty.fieldSignature, + kmProperty.getterSignature, + kmProperty.setterSignature + ) + + // Logic from: https://github.com/JetBrains/kotlin/blob/3b5179686eaba0a71bcca53c2cc922a54cc9241f/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt#L51 + override val javaField: Field? + get() = jvmSignature.fieldSignature?.let { + // TODO: support propertyWithBackingFieldInOuterClass + // TODO: support JavaField, JavaMethodProperty, MappedKotlinProperty + val owner = containingClass?.jClass ?: container.jClass + try { + owner.getDeclaredField(it.name) + } catch (e: NoSuchFieldException) { + null + } + } + override val getter: PropertyGetterDescriptor? get() = if (Flag.Property.HAS_GETTER(flags)) PropertyGetterDescriptorImpl(this) else null @@ -93,16 +115,6 @@ internal abstract class PropertyAccessorDescriptorImpl( override val isReal: Boolean get() = property.isReal - // TODO create abstract property jvmSignature - // TODO abstract and override jvmSignature for PropertyAccessorDescriptor - val jvmSignature: JvmPropertySignature.KotlinProperty - get() = JvmPropertySignature.KotlinProperty( - property, - property.kmProperty.fieldSignature, - property.kmProperty.getterSignature, - property.kmProperty.setterSignature - ) - abstract override val member: Method? override val defaultMember: Member? @@ -151,7 +163,7 @@ internal class PropertyGetterDescriptorImpl( get() = property.kmProperty.getterFlags override val member: Method? - get() = jvmSignature.getterSignature?.let { signature -> + get() = property.jvmSignature.getterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } } @@ -166,7 +178,7 @@ internal class PropertySetterDescriptorImpl( get() = property.kmProperty.setterFlags override val member: Method? - get() = jvmSignature.setterSignature?.let { signature -> + get() = property.jvmSignature.setterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index 4eb24a3..08040ab 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -5,6 +5,17 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.* import java.lang.reflect.* +// Kotlin reflection -> Java reflection + +/** + * Returns a Java [Field] instance corresponding to the backing field of the given property, + * or `null` if the property has no backing field. + */ +val KProperty<*>.javaField: Field? + get() = (this as KPropertyImpl).descriptor.javaField + +// Java reflection -> Kotlin reflection + val Class.kotlinClass: KDeclarationContainer @JvmName("getKotlinClass") get() = ReflectionLiteImpl.loadClassMetadata(this) diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 851df67..ad6e953 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -1,12 +1,13 @@ package kotlinx.reflect.lite.impl import kotlinx.metadata.* -import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.CallableDescriptor +import kotlinx.reflect.lite.KVisibility import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.descriptors.impl.KotlinType +import kotlinx.reflect.lite.calls.* +import kotlinx.reflect.lite.misc.JvmPropertySignature import java.lang.reflect.* internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { @@ -209,6 +210,12 @@ internal class FakeOverridePropertyDescriptor( override val isConst: Boolean get() = false + override val jvmSignature: JvmPropertySignature.KotlinProperty + get() = TODO("Not yet implemented") + + override val javaField: Field? + get() = TODO("Not yet implemented") + override val getter: PropertyGetterDescriptor? get() = TODO("Not yet implemented") From 08640566b64476315c3f22d1daec8835322bb868 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 26 Jul 2022 13:46:49 +0200 Subject: [PATCH 16/74] Fix tests for KProperty accessors --- src/main/java/kotlinx/reflect/lite/impl/util.kt | 1 - .../accessors/extensionPropertyAccessors.kt | 9 +++------ .../accessors/topLevelPropertyAccessors.kt | 14 +++++++------- .../java/kotlinx/reflect/lite/tests/testUtil.kt | 5 +++-- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index ad6e953..8c61b3a 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -2,7 +2,6 @@ package kotlinx.reflect.lite.impl import kotlinx.metadata.* import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.CallableDescriptor import kotlinx.reflect.lite.KVisibility import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.descriptors.impl.KotlinType diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index e7b4791..5f7af8d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -1,21 +1,18 @@ package tests.properties.accessors.extensionPropertyAccessors -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import kotlinx.reflect.lite.tests.* -import kotlin.reflect.jvm.* import kotlin.test.* var state: String = "" -// TODO: implement top-level extension proeprties var String.prop: String get() = length.toString() set(value) { state = this + value } fun box(): String { - val prop = String::prop - - val a = ::state.javaField!!.kotlinLiteProperty + val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").toKDeclarationContainer() + val prop = clazz.getPropertyByName("prop") as KMutableProperty1 assertEquals("3", prop.getter.invoke("abc")) assertEquals("5", prop.getter("defgh")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index 32498b5..9c56312 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -1,19 +1,19 @@ package tests.properties.accessors.topLevelPropertyAccessors import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals var state: String = "" fun box(): String { - val prop = ::state.javaField!!.kotlinLiteProperty as KMutableProperty0 + val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").toKDeclarationContainer() + val state = clazz.getPropertyByName("state") as KMutableProperty0 - assertEquals("", prop.getter.invoke()) - assertEquals("", prop.getter()) + assertEquals("", state.getter.invoke()) + assertEquals("", state.getter()) - prop.setter("OK") + state.setter("OK") - return prop.get() + return state.get() } diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 8244db5..31e0960 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -2,12 +2,13 @@ package kotlinx.reflect.lite.tests import kotlinx.reflect.lite.* -internal fun Class.toLiteKClass() = ReflectionLite.loadClassMetadata(this) as KClass +internal fun Class.toKDeclarationContainer() = ReflectionLite.loadClassMetadata(this) +internal fun Class.toLiteKClass() = toKDeclarationContainer() as KClass internal fun KClass.getMemberByName(name: String) = members.single { it.name == name } -internal fun KClass<*>.getPropertyByName(name: String) = +internal fun KDeclarationContainer.getPropertyByName(name: String) = members.single { it.name == name } // todo util function getFunctionByName to cast From 3e6788fd43eabd21c0e8bdf612a0ac7d0a2cdc2e Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 26 Jul 2022 16:31:23 +0200 Subject: [PATCH 17/74] some test fixes --- .../reflect/lite/testData/call/bigArity.kt | 2 +- .../lite/testData/call/equalsHashCodeToString.kt | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt index 7e3b665..2402023 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -14,7 +14,7 @@ class A { fun box(): String { val a = A() - val foo = (A::class.java).toLiteKClass().members.single { it.name == "foo" } + val foo = (A::class.java).toLiteKClass().getMemberByName("foo") val o = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "O") as String // todo necessary type cast val k = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "K") as String diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt index 2899106..7c7e22c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -36,12 +36,11 @@ fun box(): String { assert(intHashCode.call(0) != Int::hashCode.call(1)) assert(intToString.call(42) == "42") - //val stringEquals = String::class.java.getFunctionByName("equals") as KFunction -// val stringHashcode = String::class.java.getFunctionByName("hashCode") as KFunction -// val stringToString = String::class.java.getFunctionByName("toString") as KFunction -// assert(stringEquals.call("beer", "beer")) -// stringHashcode.call("beer") - - //return stringToString.call("OK") - return "OK" + val stringEquals = (String::class.java).toLiteKClass().getMemberByName("equals") as KFunction + val stringHashcode = (String::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction + val stringToString = (String::class.java).toLiteKClass().getMemberByName("toString") as KFunction + assert(stringEquals.call("beer", "beer")) + stringHashcode.call("beer") + + return stringToString.call("OK") } From d9a8667ee3e5db930886c5d03792b7d6cc581b98 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 27 Jul 2022 13:36:38 +0200 Subject: [PATCH 18/74] KProperty: - fix valueParameters for accessors - support access to private properties via the javaField --- .../lite/descriptors/impl/KotlinType.kt | 4 + .../impl/PropertyDescriptorImpl.kt | 61 +++++++++++- .../lite/testData/call/exceptionHappened.kt | 7 +- .../call/incorrectNumberOfArguments.kt | 98 +++++++++---------- .../accessors/extensionPropertyAccessors.kt | 4 +- .../accessors/memberPropertyAccessors.kt | 2 +- .../accessors/topLevelPropertyAccessors.kt | 4 +- .../reflect/lite/tests/KCallableTest.kt | 6 ++ .../kotlinx/reflect/lite/tests/testUtil.kt | 11 +-- 9 files changed, 128 insertions(+), 69 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 51b5812..7a27c77 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -16,6 +16,10 @@ internal class KotlinType( val isMarkedNullable: Boolean // todo pass annotations ) : Annotated +internal fun KotlinType.isNullableType(): Boolean = + // TODO: check if this is correct + isMarkedNullable || (descriptor is TypeParameterDescriptor && descriptor.upperBounds.any { it.isNullableType() }) + internal class TypeParameterTable( val typeParameters: List, private val parent: TypeParameterTable? = null diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 70687fa..d1822f8 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -6,6 +6,7 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.impl.KotlinReflectionInternalError import kotlinx.reflect.lite.misc.JvmPropertySignature import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -100,8 +101,6 @@ internal abstract class PropertyAccessorDescriptorImpl( override val typeParameterTable: TypeParameterTable get() = property.typeParameterTable - override val valueParameters: List - get() = emptyList() override val typeParameters: List get() = property.typeParameters override val returnType: KotlinType @@ -132,7 +131,9 @@ internal abstract class PropertyAccessorDescriptorImpl( ) { TODO("Inline class aware caller is not supported yet") } else { - TODO("Implement PropertyDescriptor.javaField") + val javaField = property.javaField + ?: throw KotlinReflectionInternalError("No accessors or field is found for property $property") + computeFieldCaller(javaField) } } !Modifier.isStatic(accessor.modifiers) -> @@ -147,10 +148,30 @@ internal abstract class PropertyAccessorDescriptorImpl( } } - fun isJvmStaticProperty(): Boolean { + protected abstract fun computeFieldCaller(field: Field): Caller<*> + + protected fun isJvmStaticProperty(): Boolean { return false TODO("Implement isJvmStaticProperty: check annotations") } + + // Logic from: https://github.com/JetBrains/kotlin/blob/3b5179686eaba0a71bcca53c2cc922a54cc9241f/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt#L321-L320 + protected fun PropertyDescriptor.isJvmFieldPropertyInCompanionObject(): Boolean { + val container = containingClass + if (container == null || !container.isCompanion) return false + val outerClass = container.containingClass + return when { + // TODO: support isAnnotationClass, || outerClass?.isAnnotationClass == true + outerClass?.isInterface == true -> + // TODO + // this is DeserializedPropertyDescriptor && JvmProtoBufUtil.isMovedFromInterfaceCompanion(proto) + false + else -> true + } + } + + protected fun isNotNullProperty(): Boolean = + !property.returnType.isNullableType() } internal class PropertyGetterDescriptorImpl( @@ -162,10 +183,26 @@ internal class PropertyGetterDescriptorImpl( override val flags: Flags get() = property.kmProperty.getterFlags + override val valueParameters: List + get() = emptyList() + override val member: Method? get() = property.jvmSignature.getterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } + + override fun computeFieldCaller(field: Field): Caller<*> = when { + property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> + // TODO: bound receiver + // if (isBound) CallerImpl.FieldGetter.BoundInstance(field, boundReceiver) + CallerImpl.FieldGetter.Instance(field) + isJvmStaticProperty() -> + // TODO: bound receiver + // if (isBound) CallerImpl.FieldGetter.BoundJvmStaticInObject(field) + CallerImpl.FieldGetter.JvmStaticInObject(field) + else -> + CallerImpl.FieldGetter.Static(field) + } } internal class PropertySetterDescriptorImpl( @@ -177,10 +214,26 @@ internal class PropertySetterDescriptorImpl( override val flags: Flags get() = property.kmProperty.setterFlags + override val valueParameters: List + get() = listOf(PropertySetterParameterDescriptor(property.kmProperty.setterParameter, this)) + override val member: Method? get() = property.jvmSignature.setterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } + + override fun computeFieldCaller(field: Field): Caller<*> = when { + property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> + // TODO: bound receiver + // if (isBound) CallerImpl.FieldSetter.BoundInstance(field, isNotNullProperty(), boundReceiver) + CallerImpl.FieldSetter.Instance(field, isNotNullProperty()) + isJvmStaticProperty() -> + // TODO: bound receiver + // if (isBound) CallerImpl.FieldSetter.BoundJvmStaticInObject(field, isNotNullProperty()) + CallerImpl.FieldSetter.JvmStaticInObject(field, isNotNullProperty()) + else -> + CallerImpl.FieldSetter.Static(field, isNotNullProperty()) + } } // todo KProperty2Descriptor diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt index 2582bc4..da27714 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -1,16 +1,17 @@ package tests.call.exceptionHappened +import kotlinx.reflect.lite.tests.* import java.lang.reflect.InvocationTargetException fun fail(message: String) { throw AssertionError(message) } -// todo top-level functions - fun box(): String { + val clazz = Class.forName("tests.call.exceptionHappened.ExceptionHappenedKt").toLiteKDeclarationContainer() + val fail = clazz.getMemberByName("fail") try { - ::fail.call("OK") + fail.call("OK") } catch (e: InvocationTargetException) { return e.getTargetException().message.toString() } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index 9dfc168..c74d953 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -1,24 +1,23 @@ package tests.call.incorrectNumberOfArguments -import kotlin.reflect.jvm.isAccessible -import kotlin.reflect.KCallable -import kotlin.reflect.KFunction -import kotlin.reflect.KMutableProperty +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* var foo: String = "" class A(private var bar: String = "") { - fun getBar() = A::bar + fun getBar() = (A::class.java).toLiteKClass().getMemberByName("bar") } object O { @JvmStatic private var baz: String = "" - @JvmStatic - fun getBaz() = (O::class.members.single { it.name == "baz" } as KMutableProperty<*>).apply { isAccessible = true } + @JvmStatic // TODO: support isAccessible + //fun getBaz() = (O::class.members.single { it.name == "baz" } as KMutableProperty<*>).apply { isAccessible = true } + fun getBaz() = (O::class.java).toLiteKClass().getMemberByName("baz") as KMutableProperty<*> - fun getGetBaz() = O::class.members.single { it.name == "getBaz" } as KFunction<*> + fun getGetBaz() = (O::class.java).toLiteKClass().getMemberByName("getBaz") as KFunction<*> } fun check(callable: KCallable<*>, vararg args: Any?) { @@ -45,24 +44,27 @@ fun check(callable: KCallable<*>, vararg args: Any?) { } fun box(): String { - check(::box, null) - check(::box, "") - - check(::A) - check(::A, null, "") + val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").toLiteKDeclarationContainer() + val box = clazz.getMemberByName("box") + check(box, null) + check(box, "") - check(O.getGetBaz()) - check(O.getGetBaz(), null, "") + val aCons = A::class.java.toLiteKClass().getPrimaryConstructor() + check(aCons) + check(aCons, null, "") + val getGetBaz = (O::class.java).toLiteKClass().getMemberByName("getGetBaz") + check(getGetBaz) + check(getGetBaz, null, "") - val f = ::foo + val f = clazz.getMemberByName("foo") as KMutableProperty0 check(f, null) - check(f, null, null) + // TODO: args array of size 2 is wrapped into another array of size 1 +// check(f, null, null) check(f, arrayOf(null)) check(f, "") check(f.getter, null) - check(f.getter, null, null) check(f.getter, arrayOf(null)) check(f.getter, "") @@ -70,36 +72,34 @@ fun box(): String { check(f.setter, null, null) check(f.setter, null, "") - - val b = A().getBar() - - check(b) - check(b, null, null) - check(b, "", "") - - check(b.getter) - check(b.getter, null, null) - check(b.getter, "", "") - - check(b.setter) - check(b.setter, null) - check(b.setter, "") - - - val z = O.getBaz() - - check(z) - check(z, null, null) - check(z, "", "") - - check(z.getter) - check(z.getter, null, null) - check(z.getter, "", "") - - check(z.setter) - check(z.setter, null) - check(z.setter, "") - + // TODO: KCallable<*>.isAccessible + // val b = A().getBar() + // check(b) +// check(b, null, null) +// check(b, "", "") +// +// check(b.getter) +// check(b.getter, null, null) +// check(b.getter, "", "") +// +// check(b.setter) +// check(b.setter, null) +// check(b.setter, "") +// + +// val z = O.getBaz() +// +// check(z) +// check(z, null, null) +// check(z, "", "") +// +// check(z.getter) +// check(z.getter, null, null) +// check(z.getter, "", "") +// +// check(z.setter) +// check(z.setter, null) +// check(z.setter, "") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index 5f7af8d..f9ad53d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -11,8 +11,8 @@ var String.prop: String set(value) { state = this + value } fun box(): String { - val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").toKDeclarationContainer() - val prop = clazz.getPropertyByName("prop") as KMutableProperty1 + val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").toLiteKDeclarationContainer() + val prop = clazz.getMemberByName("prop") as KMutableProperty1 assertEquals("3", prop.getter.invoke("abc")) assertEquals("5", prop.getter("defgh")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt index 579a9ec..21a5f4f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt @@ -7,7 +7,7 @@ import kotlin.test.assertEquals class C(var state: String) fun box(): String { - val prop = C::class.java.toLiteKClass().getPropertyByName("state") as KMutableProperty1 + val prop = C::class.java.toLiteKClass().getMemberByName("state") as KMutableProperty1 val c = C("1") assertEquals("1", prop.getter.invoke(c)) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index 9c56312..91b3f9b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -7,8 +7,8 @@ import kotlin.test.assertEquals var state: String = "" fun box(): String { - val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").toKDeclarationContainer() - val state = clazz.getPropertyByName("state") as KMutableProperty0 + val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").toLiteKDeclarationContainer() + val state = clazz.getMemberByName("state") as KMutableProperty0 assertEquals("", state.getter.invoke()) assertEquals("", state.getter()) diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index 49af3b9..11908d8 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -19,12 +19,18 @@ class KCallableTest { @Test fun testEqualsHashCodeToString() = test("call.equalsHashCodeToString") { tests.call.equalsHashCodeToString.box() } + @Test + fun testExceptionHappened() = test("call.exceptionHappened") { tests.call.exceptionHappened.box() } + @Test fun testFakeOverride() = test("call.fakeOverride") { tests.call.fakeOverride.box() } @Test fun testFakeOverrideSubstituted() = test("call.fakeOverrideSubstituted") { tests.call.fakeOverrideSubstituted.box() } + @Test + fun testIncorrectNumberOfArguments() = test("call.incorrectNumberOfArguments") { tests.call.incorrectNumberOfArguments.box() } + @Test fun testInnerClassConstructor() = test("call.innerClassConstructor") { tests.call.innerClassConstructor.box() } diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 31e0960..239e286 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -2,17 +2,12 @@ package kotlinx.reflect.lite.tests import kotlinx.reflect.lite.* -internal fun Class.toKDeclarationContainer() = ReflectionLite.loadClassMetadata(this) -internal fun Class.toLiteKClass() = toKDeclarationContainer() as KClass +internal fun Class.toLiteKDeclarationContainer() = ReflectionLite.loadClassMetadata(this) +internal fun Class.toLiteKClass() = toLiteKDeclarationContainer() as KClass -internal fun KClass.getMemberByName(name: String) = +internal fun KDeclarationContainer.getMemberByName(name: String) = members.single { it.name == name } -internal fun KDeclarationContainer.getPropertyByName(name: String) = - members.single { it.name == name } - -// todo util function getFunctionByName to cast - internal fun KClass.getPrimaryConstructor() = constructors.first() as KFunction internal inline fun test(name: String, box: () -> String) { From ee59510bc54e01a451a674bd9b3fff23b7115fd1 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 27 Jul 2022 18:26:57 +0200 Subject: [PATCH 19/74] Kotlin -> Java reflection mapping Implemented: - KProperty<*>.javaGetter - KMutableProperty<*>.javaSetter - KFunction<*>.javaMethod - KCallable<*>.isAccessible --- .../reflect/lite/impl/KCallablesJvm.kt | 68 +++++++++++++++++++ .../reflect/lite/impl/ReflectJvmMapping.kt | 35 +++++++++- 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt new file mode 100644 index 0000000..4da687c --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt @@ -0,0 +1,68 @@ +// Copied from: https://github.com/JetBrains/kotlin/blob/a7c80f2df1fb3efdb139914a36d37692574f0034/core/reflection.jvm/src/kotlin/reflect/jvm/KCallablesJvm.kt +@file:JvmName("KCallablesJvm") +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* +import java.lang.reflect.AccessibleObject + +/** + * Provides a way to suppress JVM access checks for a callable. + * + * @getter returns `true` if JVM access checks are suppressed for this callable object. + * For a property, that means that all its accessors (getter, and setter for `var` properties) are accessible. + * + * @setter if set to `true`, suppresses JVM access checks for this callable object. + * For a property, both accessors are made accessible. + * + * @see [java.lang.reflect.AccessibleObject] + */ +var KCallable<*>.isAccessible: Boolean + get() { + return when (this) { + is KMutableProperty -> + javaField?.isAccessible ?: true && + javaGetter?.isAccessible ?: true && + javaSetter?.isAccessible ?: true + is KProperty -> + javaField?.isAccessible ?: true && + javaGetter?.isAccessible ?: true + is KProperty.Getter -> + property.javaField?.isAccessible ?: true && + javaMethod?.isAccessible ?: true + is KMutableProperty.Setter<*> -> + property.javaField?.isAccessible ?: true && + javaMethod?.isAccessible ?: true + is KFunction -> + javaMethod?.isAccessible ?: true && + ((this as? KCallableImpl<*>)?.descriptor?.defaultCaller?.member as? AccessibleObject)?.isAccessible ?: true && + this.javaConstructor?.isAccessible ?: true + else -> throw UnsupportedOperationException("Unknown callable: $this ($javaClass)") + } + } + set(value) { + when (this) { + is KMutableProperty -> { + javaField?.isAccessible = value + javaGetter?.isAccessible = value + javaSetter?.isAccessible = value + } + is KProperty -> { + javaField?.isAccessible = value + javaGetter?.isAccessible = value + } + is KProperty.Getter -> { + property.javaField?.isAccessible = value + javaMethod?.isAccessible = value + } + is KMutableProperty.Setter<*> -> { + property.javaField?.isAccessible = value + javaMethod?.isAccessible = value + } + is KFunction -> { + javaMethod?.isAccessible = value + ((this as? KCallableImpl<*>)?.descriptor?.defaultCaller?.member as? AccessibleObject)?.isAccessible = true + this.javaConstructor?.isAccessible = value + } + else -> throw UnsupportedOperationException("Unknown callable: $this ($javaClass)") + } + } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index 08040ab..b97970b 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -12,7 +12,40 @@ import java.lang.reflect.* * or `null` if the property has no backing field. */ val KProperty<*>.javaField: Field? - get() = (this as KPropertyImpl).descriptor.javaField + get() = (this as? KPropertyImpl)?.descriptor?.javaField + +/** + * Returns a Java [Method] instance corresponding to the getter of the given property, + * or `null` if the property has no getter, for example in case of a simple private `val` in a class. + */ +val KProperty<*>.javaGetter: Method? + get() = getter.javaMethod + +/** + * Returns a Java [Method] instance corresponding to the setter of the given mutable property, + * or `null` if the property has no setter, for example in case of a simple private `var` in a class. + */ +val KMutableProperty<*>.javaSetter: Method? + get() = setter.javaMethod + +/** + * Returns a Java [Method] instance corresponding to the given Kotlin function, + * or `null` if this function is a constructor or cannot be represented by a Java [Method]. + */ +val KFunction<*>.javaMethod: Method? + get() = (this as? KCallableImpl<*>)?.let { + return it.descriptor.caller.member as? Method + } + +/** + * Returns a Java [Constructor] instance corresponding to the given Kotlin function, + * or `null` if this function is not a constructor or cannot be represented by a Java [Constructor]. + */ +@Suppress("UNCHECKED_CAST") +val KFunction.javaConstructor: Constructor? + get() = (this as? KCallableImpl<*>)?.let { + return it.descriptor.caller.member as? Constructor + } // Java reflection -> Kotlin reflection From 497d751eeb7ee5b6ba78805f1a246f53e4d5784f Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 27 Jul 2022 18:29:23 +0200 Subject: [PATCH 20/74] Test for private fields access: comparing the behaviour of reflect.lite and kotlin.reflect on the expected use-case from "incorrectNumberOfArguments" test --- .../testData/call/accessPrivateProperties.kt | 38 +++++++++++ .../call/incorrectNumberOfArguments.kt | 66 +++++++++++++------ 2 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt new file mode 100644 index 0000000..2d3fb21 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt @@ -0,0 +1,38 @@ +package tests.call.accessPrivateProperties + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.reflect.jvm.* +import kotlin.test.* + +private class A(private var bar: String = "") { + fun getBar() = (A::class.java).toLiteKClass().getMemberByName("bar") + fun getKotlinReflectBar() = A::bar +} + +// Test case refering the tests.call.incorrectNumberOfArguments.testAccessPrivateBarProperty() +fun box(): String { + // kotlinx.reflect.lite + val getBar = A().getBar() as KMutableProperty1 + val bar = tests.call.incorrectNumberOfArguments.A::class.java.toLiteKClass().getMemberByName("bar") + bar.isAccessible = true + try { + getBar.call(A()) + } catch (e: Throwable) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$FieldGetter cannot access a member of class tests.call.accessPrivateProperties.A with modifiers \"private\"", e.message) + } + + // via kotlin.reflect + val kotlinReflectGetBar = A().getKotlinReflectBar() + val kotlinReflectBar = A::class.members.first { it.name == "bar" } + kotlinReflectBar.isAccessible = true + assertEquals(null, kotlinReflectGetBar.javaGetter) + assertEquals(null, kotlinReflectGetBar.javaSetter) + try { + kotlinReflectGetBar.call(A()) + } catch (e: Throwable) { + assertEquals("java.lang.IllegalAccessException: class kotlin.reflect.jvm.internal.calls.CallerImpl\$FieldGetter cannot access a member of class tests.call.accessPrivateProperties.A with modifiers \"private\"", e.message) + } + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index c74d953..4d3bbf7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -1,6 +1,7 @@ package tests.call.incorrectNumberOfArguments import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* var foo: String = "" @@ -13,9 +14,8 @@ object O { @JvmStatic private var baz: String = "" - @JvmStatic // TODO: support isAccessible - //fun getBaz() = (O::class.members.single { it.name == "baz" } as KMutableProperty<*>).apply { isAccessible = true } - fun getBaz() = (O::class.java).toLiteKClass().getMemberByName("baz") as KMutableProperty<*> + @JvmStatic + fun getBaz() = ((O::class.java).toLiteKClass().getMemberByName("baz") as KMutableProperty<*>).apply { isAccessible = true } fun getGetBaz() = (O::class.java).toLiteKClass().getMemberByName("getBaz") as KFunction<*> } @@ -43,24 +43,31 @@ fun check(callable: KCallable<*>, vararg args: Any?) { } } -fun box(): String { +private fun testBox() { val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").toLiteKDeclarationContainer() val box = clazz.getMemberByName("box") check(box, null) check(box, "") +} +private fun testAConstructor() { val aCons = A::class.java.toLiteKClass().getPrimaryConstructor() check(aCons) check(aCons, null, "") +} +private fun testGetBaz() { val getGetBaz = (O::class.java).toLiteKClass().getMemberByName("getGetBaz") check(getGetBaz) check(getGetBaz, null, "") +} +private fun testFoo() { + val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").toLiteKDeclarationContainer() val f = clazz.getMemberByName("foo") as KMutableProperty0 check(f, null) // TODO: args array of size 2 is wrapped into another array of size 1 -// check(f, null, null) + // check(f, null, null) check(f, arrayOf(null)) check(f, "") @@ -71,10 +78,15 @@ fun box(): String { check(f.setter) check(f.setter, null, null) check(f.setter, null, "") +} - // TODO: KCallable<*>.isAccessible - // val b = A().getBar() - // check(b) +private fun testAccessPrivateBarProperty() { + val b = A().getBar() as KMutableProperty1 + val bar = A::class.java.toLiteKClass().getMemberByName("bar") + bar.isAccessible = true + // TODO: kotlinx.reflect.lite.calls.CallerImpl$FieldGetter cannot access a member of class tests.call.incorrectNumberOfArguments.A with modifiers "private" + b.call(A()) +// check(b) // check(b, null, null) // check(b, "", "") // @@ -86,20 +98,32 @@ fun box(): String { // check(b.setter, null) // check(b.setter, "") // +// b.set(A(), "45") +// assertEquals("4646", b.get(A())) +} -// val z = O.getBaz() -// -// check(z) -// check(z, null, null) -// check(z, "", "") -// -// check(z.getter) -// check(z.getter, null, null) -// check(z.getter, "", "") -// -// check(z.setter) -// check(z.setter, null) -// check(z.setter, "") +private fun testAccessPrivateBazProperty() { + val z = O.getBaz() + + check(z) + check(z, null, null) + check(z, "", "") + check(z.getter) + check(z.getter, null, null) + check(z.getter, "", "") + + check(z.setter) + check(z.setter, null) + check(z.setter, "") +} + +fun box(): String { + testBox() + testAConstructor() + testGetBaz() + testFoo() + // testAccessPrivateBarProperty() + // testAccessPrivateBazProperty() return "OK" } From 1d9c6832c9c8df3d4c59742f9b6104be7a659b5f Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 27 Jul 2022 20:44:18 +0200 Subject: [PATCH 21/74] Moved unsupported tests to the separate directory --- .../annotations/annotationRetentionAnnotation.kt | 0 .../annotations/genericExtensionProperty.kt | 0 .../{testData => unusedTestData}/annotations/localClassLiteral.kt | 0 .../annotations/onTypes/arrayKClass.kt | 0 .../annotations/onTypes/classLiteralWithExpectedType.kt | 0 .../annotations/onTypes/differentArgumentTypes.kt | 0 .../annotations/onTypes/differentPositions.kt | 0 .../{testData => unusedTestData}/annotations/privateAnnotation.kt | 0 .../{testData => unusedTestData}/annotations/propertyAccessors.kt | 0 .../annotations/propertyWithoutBackingField.kt | 0 .../lite/{testData => unusedTestData}/annotations/retentions.kt | 0 .../lite/{testData => unusedTestData}/annotations/setparam.kt | 0 .../annotations/simpleClassAnnotation.kt | 0 .../annotations/simpleConstructorAnnotation.kt | 0 .../annotations/simpleFunAnnotation.kt | 0 .../annotations/simpleParamAnnotation.kt | 0 .../annotations/simpleValAnnotation.kt | 0 .../lite/{testData => unusedTestData}/builtins/collections.kt | 0 .../lite/{testData => unusedTestData}/builtins/enumNameOrdinal.kt | 0 .../lite/{testData => unusedTestData}/builtins/stringLength.kt | 0 .../call/bound/companionObjectPropertyAccessors.kt | 0 .../{testData => unusedTestData}/call/bound/extensionFunction.kt | 0 .../call/bound/extensionPropertyAccessors.kt | 0 .../call/bound/innerClassConstructor.kt | 0 .../call/bound/jvmStaticCompanionObjectPropertyAccessors.kt | 0 .../call/bound/jvmStaticObjectFunction.kt | 0 .../call/bound/jvmStaticObjectPropertyAccessors.kt | 0 .../{testData => unusedTestData}/call/bound/memberFunction.kt | 0 .../call/bound/memberPropertyAccessors.kt | 0 .../{testData => unusedTestData}/call/bound/objectFunction.kt | 0 .../call/bound/objectPropertyAccessors.kt | 0 .../call/inlineClasses/constructorWithInlineClassParameters.kt | 0 .../call/inlineClasses/fieldAccessors.kt | 0 .../call/inlineClasses/functionsWithInlineClassParameters.kt | 0 .../call/inlineClasses/inlineClassConstructor.kt | 0 .../call/inlineClasses/internalPrimaryValOfInlineClass.kt | 0 .../call/inlineClasses/jvmStaticFieldInObject.kt | 0 .../call/inlineClasses/jvmStaticFunction.kt | 0 .../call/inlineClasses/nonOverridingFunOfInlineClass.kt | 0 .../call/inlineClasses/nonOverridingVarOfInlineClass.kt | 0 .../call/inlineClasses/overridingFunOfInlineClass.kt | 0 .../call/inlineClasses/overridingVarOfInlineClass.kt | 0 .../call/inlineClasses/primaryValOfInlineClass.kt | 0 .../{testData => unusedTestData}/call/inlineClasses/properties.kt | 0 .../classLiterals/annotationClassLiteral.kt | 0 .../lite/{testData => unusedTestData}/classLiterals/arrays.kt | 0 .../lite/{testData => unusedTestData}/classLiterals/bareArray.kt | 0 .../classLiterals/builtinClassLiterals.kt | 0 .../{testData => unusedTestData}/classLiterals/genericArrays.kt | 0 .../{testData => unusedTestData}/classLiterals/genericClass.kt | 0 .../{testData => unusedTestData}/classLiterals/lambdaClass.kt | 0 .../classLiterals/reifiedTypeClassLiteral.kt | 0 .../createAnnotation/annotationType.kt | 0 .../createAnnotation/arrayOfKClasses.kt | 0 .../createAnnotation/createJdkAnnotationInstance.kt | 0 .../createAnnotation/enumKClassAnnotation.kt | 0 .../createAnnotation/equalsHashCodeToString.kt | 0 .../createAnnotation/floatingPointParameters.kt | 0 .../createAnnotation/parameterNamedEquals.kt | 0 .../createAnnotation/primitivesAndArrays.kt | 0 .../{testData => unusedTestData}/functions/enumValuesValueOf.kt | 0 .../{testData => unusedTestData}/functions/functionFromStdlib.kt | 0 .../functions/genericOverriddenFunction.kt | 0 .../functions/isAccessibleOnAllMembers.kt | 0 .../lite/{testData => unusedTestData}/functions/platformName.kt | 0 .../lite/{testData => unusedTestData}/functions/simpleNames.kt | 0 .../isInstance/isInstanceCastAndSafeCast.kt | 0 .../lite/{testData => unusedTestData}/kClassInAnnotation/array.kt | 0 .../lite/{testData => unusedTestData}/kClassInAnnotation/basic.kt | 0 .../{testData => unusedTestData}/kClassInAnnotation/checkcast.kt | 0 .../kClassInAnnotation/forceWrapping.kt | 0 .../{testData => unusedTestData}/kClassInAnnotation/vararg.kt | 0 .../kClassInAnnotation/wrappingForCallableReferences.kt | 0 .../lambdaClasses/parameterNamesAndNullability.kt | 0 .../lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt | 0 .../lambdaClasses/reflectOnLambdaInArrayConstructor.kt | 0 .../lambdaClasses/reflectOnLambdaInConstructor.kt | 0 .../lambdaClasses/reflectOnLambdaInField.kt | 0 .../lambdaClasses/reflectOnLambdaInStaticField.kt | 0 .../lambdaClasses/reflectOnSuspendLambdaInField.kt | 0 .../lite/{testData => unusedTestData}/mapping/constructor.kt | 0 .../{testData => unusedTestData}/mapping/extensionProperty.kt | 0 .../lite/{testData => unusedTestData}/mapping/functions.kt | 0 .../mapping/inlineClasses/inlineClassPrimaryVal.kt | 0 .../inlineClasses/suspendFunctionWithInlineClassInSignature.kt | 0 .../lite/{testData => unusedTestData}/mapping/inlineReifiedFun.kt | 0 .../mapping/jvmStatic/companionObjectFunction.kt | 0 .../mapping/jvmStatic/objectFunction.kt | 0 .../lite/{testData => unusedTestData}/mapping/lateinitProperty.kt | 0 .../mapping/mappedClassIsEqualToClassLiteral.kt | 0 .../lite/{testData => unusedTestData}/mapping/memberProperty.kt | 0 .../mapping/methodsFromSuperInterface.kt | 0 .../mapping/propertyAccessorsWithJvmName.kt | 0 .../lite/{testData => unusedTestData}/mapping/syntheticFields.kt | 0 .../lite/{testData => unusedTestData}/mapping/topLevelProperty.kt | 0 .../mapping/types/annotationConstructorParameters.kt | 0 .../lite/{testData => unusedTestData}/mapping/types/array.kt | 0 .../{testData => unusedTestData}/mapping/types/constructors.kt | 0 .../mapping/types/genericArrayElementType.kt | 0 .../mapping/types/inlineClassInSignature.kt | 0 .../mapping/types/inlineClassPrimaryVal.kt | 0 .../mapping/types/innerGenericTypeArgument.kt | 0 .../{testData => unusedTestData}/mapping/types/memberFunctions.kt | 0 .../mapping/types/overrideAnyWithPrimitive.kt | 0 .../mapping/types/parameterizedTypeArgument.kt | 0 .../mapping/types/parameterizedTypes.kt | 0 .../mapping/types/propertyAccessors.kt | 0 .../lite/{testData => unusedTestData}/mapping/types/supertypes.kt | 0 .../lite/{testData => unusedTestData}/mapping/types/suspendFun.kt | 0 .../mapping/types/topLevelFunctions.kt | 0 .../{testData => unusedTestData}/mapping/types/typeParameters.kt | 0 .../lite/{testData => unusedTestData}/mapping/types/unit.kt | 0 .../adaptedCallableReferencesNotEqualToCallablesFromAPI.kt | 0 .../methodsFromAny/builtinFunctionsToString.kt | 0 .../methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt | 0 .../{testData => unusedTestData}/methodsFromAny/classToString.kt | 0 .../methodsFromAny/extensionPropertyReceiverToString.kt | 0 .../methodsFromAny/fakeOverrideEqualsHashCode.kt | 0 .../methodsFromAny/fakeOverrideToString.kt | 0 .../methodsFromAny/fakeOverrideToString2.kt | 0 .../methodsFromAny/functionEqualsHashCode.kt | 0 .../methodsFromAny/functionFromStdlibMultiFileFacade.kt | 0 .../methodsFromAny/functionFromStdlibSingleFileFacade.kt | 0 .../methodsFromAny/functionToString.kt | 0 .../methodsFromAny/parametersEqualsHashCode.kt | 0 .../methodsFromAny/parametersEqualsWithClearCaches.kt | 0 .../methodsFromAny/parametersToString.kt | 0 .../methodsFromAny/propertyEqualsHashCode.kt | 0 .../methodsFromAny/propertyToString.kt | 0 .../methodsFromAny/typeEqualsHashCode.kt | 0 .../methodsFromAny/typeParametersEqualsHashCode.kt | 0 .../methodsFromAny/typeParametersToString.kt | 0 .../{testData => unusedTestData}/methodsFromAny/typeToString.kt | 0 .../methodsFromAny/typeToStringInnerGeneric.kt | 0 .../{testData => unusedTestData}/modifiers/callableModality.kt | 0 .../{testData => unusedTestData}/modifiers/callableVisibility.kt | 0 .../lite/{testData => unusedTestData}/modifiers/classModality.kt | 0 .../{testData => unusedTestData}/modifiers/classVisibility.kt | 0 .../lite/{testData => unusedTestData}/modifiers/functions.kt | 0 .../lite/{testData => unusedTestData}/modifiers/properties.kt | 0 .../lite/{testData => unusedTestData}/modifiers/typeParameters.kt | 0 .../properties/getDelegate/booleanPropertyNameStartsWithIs.kt | 0 .../properties/getDelegate/boundExtensionProperty.kt | 0 .../properties/getDelegate/extensionProperty.kt | 0 .../properties/getDelegate/fakeOverride.kt | 0 .../properties/getDelegate/kPropertyForDelegatedProperty.kt | 0 .../properties/getDelegate/memberExtensionProperty.kt | 0 .../properties/getDelegate/memberProperty.kt | 0 .../getDelegate/method/delegateMethodIsNonOverridable.kt | 0 .../properties/getDelegate/nameClashClassAndCompanion.kt | 0 .../properties/getDelegate/notDelegatedProperty.kt | 0 .../properties/getDelegate/overrideDelegatedByDelegated.kt | 0 .../properties/getDelegate/topLevelProperty.kt | 0 .../properties/localDelegated/defaultImpls.kt | 0 .../properties/localDelegated/inLambda.kt | 0 .../properties/localDelegated/inlineFun.kt | 0 .../properties/localDelegated/localAndNonLocal.kt | 0 .../properties/localDelegated/localDelegatedProperty.kt | 0 .../properties/localDelegated/variableOfGenericType.kt | 0 .../typeParameters/declarationSiteVariance.kt | 0 .../typeParameters/innerGenericParameter.kt | 0 .../typeParameters/typeParametersAndNames.kt | 0 .../{testData => unusedTestData}/typeParameters/upperBounds.kt | 0 .../lite/{testData => unusedTestData}/types/classifierIsClass.kt | 0 .../types/classifierIsTypeParameter.kt | 0 .../types/classifiersOfBuiltInTypes.kt | 0 .../types/equalsForClassAndTypeParameterWithSameFqName.kt | 0 .../{testData => unusedTestData}/types/innerGenericArguments.kt | 0 .../lite/{testData => unusedTestData}/types/jvmErasureOfClass.kt | 0 .../types/jvmErasureOfTypeParameter.kt | 0 .../lite/{testData => unusedTestData}/types/typeArguments.kt | 0 .../lite/{testData => unusedTestData}/types/useSiteVariance.kt | 0 172 files changed, 0 insertions(+), 0 deletions(-) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/annotationRetentionAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/genericExtensionProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/localClassLiteral.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/onTypes/arrayKClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/onTypes/classLiteralWithExpectedType.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/onTypes/differentArgumentTypes.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/onTypes/differentPositions.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/privateAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/propertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/propertyWithoutBackingField.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/retentions.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/setparam.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/simpleClassAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/simpleConstructorAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/simpleFunAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/simpleParamAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/annotations/simpleValAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/builtins/collections.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/builtins/enumNameOrdinal.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/builtins/stringLength.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/companionObjectPropertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/extensionFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/extensionPropertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/innerClassConstructor.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/jvmStaticObjectFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/jvmStaticObjectPropertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/memberFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/memberPropertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/objectFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/bound/objectPropertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/constructorWithInlineClassParameters.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/fieldAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/functionsWithInlineClassParameters.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/inlineClassConstructor.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/internalPrimaryValOfInlineClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/jvmStaticFieldInObject.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/jvmStaticFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/nonOverridingFunOfInlineClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/nonOverridingVarOfInlineClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/overridingFunOfInlineClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/overridingVarOfInlineClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/primaryValOfInlineClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/call/inlineClasses/properties.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/annotationClassLiteral.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/arrays.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/bareArray.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/builtinClassLiterals.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/genericArrays.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/genericClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/lambdaClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classLiterals/reifiedTypeClassLiteral.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/annotationType.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/arrayOfKClasses.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/createJdkAnnotationInstance.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/enumKClassAnnotation.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/equalsHashCodeToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/floatingPointParameters.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/parameterNamedEquals.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/createAnnotation/primitivesAndArrays.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/functions/enumValuesValueOf.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/functions/functionFromStdlib.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/functions/genericOverriddenFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/functions/isAccessibleOnAllMembers.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/functions/platformName.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/functions/simpleNames.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/isInstance/isInstanceCastAndSafeCast.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/kClassInAnnotation/array.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/kClassInAnnotation/basic.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/kClassInAnnotation/checkcast.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/kClassInAnnotation/forceWrapping.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/kClassInAnnotation/vararg.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/kClassInAnnotation/wrappingForCallableReferences.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/lambdaClasses/parameterNamesAndNullability.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/lambdaClasses/reflectOnLambdaInArrayConstructor.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/lambdaClasses/reflectOnLambdaInConstructor.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/lambdaClasses/reflectOnLambdaInField.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/lambdaClasses/reflectOnLambdaInStaticField.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/lambdaClasses/reflectOnSuspendLambdaInField.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/constructor.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/extensionProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/functions.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/inlineClasses/inlineClassPrimaryVal.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/inlineReifiedFun.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/jvmStatic/companionObjectFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/jvmStatic/objectFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/lateinitProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/mappedClassIsEqualToClassLiteral.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/memberProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/methodsFromSuperInterface.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/propertyAccessorsWithJvmName.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/syntheticFields.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/topLevelProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/annotationConstructorParameters.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/array.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/constructors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/genericArrayElementType.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/inlineClassInSignature.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/inlineClassPrimaryVal.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/innerGenericTypeArgument.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/memberFunctions.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/overrideAnyWithPrimitive.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/parameterizedTypeArgument.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/parameterizedTypes.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/propertyAccessors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/supertypes.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/suspendFun.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/topLevelFunctions.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/typeParameters.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/mapping/types/unit.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/builtinFunctionsToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/classToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/extensionPropertyReceiverToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/fakeOverrideEqualsHashCode.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/fakeOverrideToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/fakeOverrideToString2.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/functionEqualsHashCode.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/functionFromStdlibMultiFileFacade.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/functionFromStdlibSingleFileFacade.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/functionToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/parametersEqualsHashCode.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/parametersEqualsWithClearCaches.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/parametersToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/propertyEqualsHashCode.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/propertyToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/typeEqualsHashCode.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/typeParametersEqualsHashCode.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/typeParametersToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/typeToString.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/methodsFromAny/typeToStringInnerGeneric.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/modifiers/callableModality.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/modifiers/callableVisibility.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/modifiers/classModality.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/modifiers/classVisibility.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/modifiers/functions.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/modifiers/properties.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/modifiers/typeParameters.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/booleanPropertyNameStartsWithIs.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/boundExtensionProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/extensionProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/fakeOverride.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/kPropertyForDelegatedProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/memberExtensionProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/memberProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/method/delegateMethodIsNonOverridable.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/nameClashClassAndCompanion.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/notDelegatedProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/overrideDelegatedByDelegated.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/getDelegate/topLevelProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/localDelegated/defaultImpls.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/localDelegated/inLambda.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/localDelegated/inlineFun.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/localDelegated/localAndNonLocal.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/localDelegated/localDelegatedProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/localDelegated/variableOfGenericType.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/typeParameters/declarationSiteVariance.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/typeParameters/innerGenericParameter.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/typeParameters/typeParametersAndNames.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/typeParameters/upperBounds.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/classifierIsClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/classifierIsTypeParameter.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/classifiersOfBuiltInTypes.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/equalsForClassAndTypeParameterWithSameFqName.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/innerGenericArguments.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/jvmErasureOfClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/jvmErasureOfTypeParameter.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/typeArguments.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/types/useSiteVariance.kt (100%) diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/annotationRetentionAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/annotationRetentionAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/annotationRetentionAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/annotationRetentionAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/genericExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/genericExtensionProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/genericExtensionProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/genericExtensionProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/localClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/localClassLiteral.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/localClassLiteral.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/localClassLiteral.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/arrayKClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/arrayKClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/arrayKClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/arrayKClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/classLiteralWithExpectedType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/classLiteralWithExpectedType.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/classLiteralWithExpectedType.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/classLiteralWithExpectedType.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentArgumentTypes.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentArgumentTypes.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentArgumentTypes.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentArgumentTypes.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentPositions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentPositions.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/onTypes/differentPositions.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentPositions.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/privateAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/privateAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/privateAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/privateAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/propertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/propertyWithoutBackingField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyWithoutBackingField.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/propertyWithoutBackingField.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyWithoutBackingField.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/retentions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/retentions.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/retentions.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/retentions.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/setparam.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/setparam.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/setparam.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/setparam.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleClassAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleClassAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/simpleClassAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleClassAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleConstructorAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleConstructorAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/simpleConstructorAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleConstructorAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleFunAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleFunAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/simpleFunAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleFunAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleParamAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleParamAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/simpleParamAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleParamAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/annotations/simpleValAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleValAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/annotations/simpleValAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleValAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/builtins/collections.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/collections.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/builtins/collections.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/collections.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/builtins/enumNameOrdinal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/enumNameOrdinal.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/builtins/enumNameOrdinal.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/enumNameOrdinal.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/builtins/stringLength.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/stringLength.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/builtins/stringLength.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/stringLength.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/companionObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/companionObjectPropertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/companionObjectPropertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/companionObjectPropertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionPropertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/extensionPropertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionPropertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/innerClassConstructor.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/innerClassConstructor.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/innerClassConstructor.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectPropertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/jvmStaticObjectPropertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectPropertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/memberFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberPropertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/memberPropertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberPropertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/objectFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bound/objectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectPropertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/bound/objectPropertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectPropertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/constructorWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/constructorWithInlineClassParameters.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/fieldAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/fieldAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/fieldAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/fieldAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/functionsWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/functionsWithInlineClassParameters.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/functionsWithInlineClassParameters.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/functionsWithInlineClassParameters.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/inlineClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/inlineClassConstructor.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/inlineClassConstructor.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/inlineClassConstructor.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/internalPrimaryValOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/internalPrimaryValOfInlineClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/internalPrimaryValOfInlineClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/internalPrimaryValOfInlineClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFieldInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFieldInObject.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFieldInObject.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFieldInObject.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/jvmStaticFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingFunOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingFunOfInlineClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingFunOfInlineClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingFunOfInlineClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingVarOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingVarOfInlineClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/nonOverridingVarOfInlineClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingVarOfInlineClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingFunOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingFunOfInlineClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingFunOfInlineClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingFunOfInlineClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingVarOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingVarOfInlineClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/overridingVarOfInlineClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingVarOfInlineClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/primaryValOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/primaryValOfInlineClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/primaryValOfInlineClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/primaryValOfInlineClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/properties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/properties.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/call/inlineClasses/properties.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/properties.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/annotationClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/annotationClassLiteral.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/annotationClassLiteral.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/annotationClassLiteral.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/arrays.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/arrays.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/arrays.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/arrays.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/bareArray.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/bareArray.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/bareArray.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/bareArray.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/builtinClassLiterals.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/builtinClassLiterals.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/builtinClassLiterals.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/builtinClassLiterals.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericArrays.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericArrays.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericArrays.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericArrays.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/genericClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/lambdaClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/lambdaClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/lambdaClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/lambdaClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classLiterals/reifiedTypeClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/reifiedTypeClassLiteral.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classLiterals/reifiedTypeClassLiteral.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/reifiedTypeClassLiteral.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/annotationType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/annotationType.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/annotationType.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/annotationType.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/arrayOfKClasses.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/arrayOfKClasses.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/arrayOfKClasses.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/arrayOfKClasses.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/createJdkAnnotationInstance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/createJdkAnnotationInstance.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/createJdkAnnotationInstance.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/createJdkAnnotationInstance.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/enumKClassAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/enumKClassAnnotation.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/enumKClassAnnotation.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/enumKClassAnnotation.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/equalsHashCodeToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/equalsHashCodeToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/equalsHashCodeToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/floatingPointParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/floatingPointParameters.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/floatingPointParameters.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/floatingPointParameters.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/parameterNamedEquals.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/parameterNamedEquals.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/parameterNamedEquals.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/parameterNamedEquals.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/createAnnotation/primitivesAndArrays.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/primitivesAndArrays.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/createAnnotation/primitivesAndArrays.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/primitivesAndArrays.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/enumValuesValueOf.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/enumValuesValueOf.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/functions/enumValuesValueOf.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/functions/enumValuesValueOf.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/functionFromStdlib.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/functionFromStdlib.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/functions/functionFromStdlib.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/functions/functionFromStdlib.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/genericOverriddenFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/genericOverriddenFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/functions/genericOverriddenFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/functions/genericOverriddenFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/isAccessibleOnAllMembers.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/isAccessibleOnAllMembers.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/functions/isAccessibleOnAllMembers.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/functions/isAccessibleOnAllMembers.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/platformName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/platformName.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/functions/platformName.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/functions/platformName.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/functions/simpleNames.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/simpleNames.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/functions/simpleNames.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/functions/simpleNames.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/isInstance/isInstanceCastAndSafeCast.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/isInstance/isInstanceCastAndSafeCast.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/isInstance/isInstanceCastAndSafeCast.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/isInstance/isInstanceCastAndSafeCast.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/array.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/array.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/array.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/array.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/basic.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/basic.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/basic.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/basic.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/checkcast.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/checkcast.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/checkcast.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/checkcast.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/forceWrapping.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/forceWrapping.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/forceWrapping.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/forceWrapping.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/vararg.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/vararg.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/vararg.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/vararg.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/wrappingForCallableReferences.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/wrappingForCallableReferences.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/kClassInAnnotation/wrappingForCallableReferences.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/wrappingForCallableReferences.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/parameterNamesAndNullability.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/parameterNamesAndNullability.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/parameterNamesAndNullability.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/parameterNamesAndNullability.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInConstructor.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInConstructor.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInConstructor.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInField.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInStaticField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInStaticField.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnLambdaInStaticField.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInStaticField.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnSuspendLambdaInField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnSuspendLambdaInField.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/lambdaClasses/reflectOnSuspendLambdaInField.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnSuspendLambdaInField.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructor.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructor.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/extensionProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/extensionProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/functions.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/functions.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/inlineClassPrimaryVal.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/inlineClassPrimaryVal.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/inlineClassPrimaryVal.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineReifiedFun.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineReifiedFun.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/companionObjectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/companionObjectFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/companionObjectFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/companionObjectFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/objectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/objectFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/jvmStatic/objectFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/objectFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/lateinitProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/lateinitProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/mappedClassIsEqualToClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/mappedClassIsEqualToClassLiteral.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/mappedClassIsEqualToClassLiteral.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/mappedClassIsEqualToClassLiteral.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/memberProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/memberProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromSuperInterface.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromSuperInterface.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/propertyAccessorsWithJvmName.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/propertyAccessorsWithJvmName.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/syntheticFields.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/syntheticFields.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/topLevelProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/topLevelProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/annotationConstructorParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/annotationConstructorParameters.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/annotationConstructorParameters.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/annotationConstructorParameters.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/array.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/array.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/genericArrayElementType.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/genericArrayElementType.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassInSignature.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassInSignature.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassInSignature.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassInSignature.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassPrimaryVal.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/inlineClassPrimaryVal.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassPrimaryVal.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/innerGenericTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/innerGenericTypeArgument.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/innerGenericTypeArgument.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/innerGenericTypeArgument.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/memberFunctions.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/memberFunctions.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/overrideAnyWithPrimitive.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/overrideAnyWithPrimitive.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/overrideAnyWithPrimitive.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/overrideAnyWithPrimitive.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypeArgument.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypeArgument.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypes.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypes.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/propertyAccessors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/propertyAccessors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/supertypes.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/supertypes.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/suspendFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/suspendFun.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/suspendFun.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/suspendFun.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/topLevelFunctions.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/topLevelFunctions.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/typeParameters.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/typeParameters.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/unit.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/unit.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/builtinFunctionsToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/builtinFunctionsToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/builtinFunctionsToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/builtinFunctionsToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/classToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/classToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/classToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/classToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/extensionPropertyReceiverToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/extensionPropertyReceiverToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/extensionPropertyReceiverToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/extensionPropertyReceiverToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideEqualsHashCode.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideEqualsHashCode.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideEqualsHashCode.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString2.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString2.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/fakeOverrideToString2.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString2.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionEqualsHashCode.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionEqualsHashCode.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionEqualsHashCode.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibMultiFileFacade.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibMultiFileFacade.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibMultiFileFacade.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibMultiFileFacade.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibSingleFileFacade.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibSingleFileFacade.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionFromStdlibSingleFileFacade.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibSingleFileFacade.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/functionToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsHashCode.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsHashCode.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsHashCode.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsWithClearCaches.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsWithClearCaches.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersEqualsWithClearCaches.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsWithClearCaches.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/parametersToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyEqualsHashCode.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyEqualsHashCode.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyEqualsHashCode.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/propertyToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeEqualsHashCode.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeEqualsHashCode.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeEqualsHashCode.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersEqualsHashCode.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersEqualsHashCode.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersEqualsHashCode.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeParametersToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToString.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToString.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToString.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToStringInnerGeneric.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToStringInnerGeneric.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/methodsFromAny/typeToStringInnerGeneric.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToStringInnerGeneric.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableModality.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableModality.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/modifiers/callableModality.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableModality.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/callableVisibility.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableVisibility.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/modifiers/callableVisibility.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableVisibility.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/classModality.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classModality.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/modifiers/classModality.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classModality.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/classVisibility.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classVisibility.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/modifiers/classVisibility.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classVisibility.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/functions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/functions.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/modifiers/functions.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/functions.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/properties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/properties.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/modifiers/properties.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/properties.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/modifiers/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/typeParameters.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/modifiers/typeParameters.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/typeParameters.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/boundExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/boundExtensionProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/boundExtensionProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/boundExtensionProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/extensionProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/extensionProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/extensionProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/fakeOverride.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/fakeOverride.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/fakeOverride.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/kPropertyForDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/kPropertyForDelegatedProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/kPropertyForDelegatedProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/kPropertyForDelegatedProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberExtensionProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberExtensionProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberExtensionProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/memberProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/nameClashClassAndCompanion.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/nameClashClassAndCompanion.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/nameClashClassAndCompanion.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/nameClashClassAndCompanion.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/notDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/notDelegatedProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/notDelegatedProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/notDelegatedProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/overrideDelegatedByDelegated.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/overrideDelegatedByDelegated.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/overrideDelegatedByDelegated.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/overrideDelegatedByDelegated.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/topLevelProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/getDelegate/topLevelProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/topLevelProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/defaultImpls.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/defaultImpls.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/defaultImpls.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/defaultImpls.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inLambda.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inLambda.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inLambda.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inLambda.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inlineFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inlineFun.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/inlineFun.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inlineFun.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localAndNonLocal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localAndNonLocal.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localAndNonLocal.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localAndNonLocal.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localDelegatedProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/localDelegatedProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localDelegatedProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/variableOfGenericType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/variableOfGenericType.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/localDelegated/variableOfGenericType.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/variableOfGenericType.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/declarationSiteVariance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/declarationSiteVariance.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/typeParameters/declarationSiteVariance.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/declarationSiteVariance.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/innerGenericParameter.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/innerGenericParameter.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/typeParameters/innerGenericParameter.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/innerGenericParameter.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/typeParametersAndNames.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/typeParametersAndNames.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/typeParameters/typeParametersAndNames.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/typeParametersAndNames.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/typeParameters/upperBounds.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/upperBounds.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/typeParameters/upperBounds.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/upperBounds.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/classifierIsClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/classifierIsTypeParameter.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsTypeParameter.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/classifierIsTypeParameter.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsTypeParameter.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/classifiersOfBuiltInTypes.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifiersOfBuiltInTypes.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/classifiersOfBuiltInTypes.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifiersOfBuiltInTypes.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/equalsForClassAndTypeParameterWithSameFqName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/equalsForClassAndTypeParameterWithSameFqName.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/equalsForClassAndTypeParameterWithSameFqName.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/equalsForClassAndTypeParameterWithSameFqName.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/innerGenericArguments.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/innerGenericArguments.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/innerGenericArguments.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/innerGenericArguments.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfTypeParameter.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfTypeParameter.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/jvmErasureOfTypeParameter.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfTypeParameter.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/typeArguments.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/typeArguments.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/typeArguments.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/typeArguments.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/types/useSiteVariance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/useSiteVariance.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/types/useSiteVariance.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/types/useSiteVariance.kt From c0313535faa98e0aa6e9742c9253630144f66b50 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 28 Jul 2022 00:27:58 +0200 Subject: [PATCH 22/74] Lazy initialization for callable descriptors --- .../impl/ConstructorDescriptorImpl.kt | 16 ++-- .../impl/FunctionDescriptorImpl.kt | 26 +++--- .../impl/PropertyDescriptorImpl.kt | 88 ++++++++++--------- 3 files changed, 74 insertions(+), 56 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index b8068aa..4295075 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -3,6 +3,7 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -39,12 +40,15 @@ internal class ConstructorDescriptorImpl( override val returnType: KotlinType get() = containingClass.kotlinType - private val jvmSignature: JvmFunctionSignature.KotlinConstructor - get() = JvmFunctionSignature.KotlinConstructor(kmCons.signature ?: error("No constructor signature for ${kmCons}")) + private val jvmSignature: JvmFunctionSignature.KotlinConstructor by ReflectProperties.lazy { + JvmFunctionSignature.KotlinConstructor(kmCons.signature ?: error("No constructor signature for ${kmCons}")) + } - override val member: Member? - get() = container.findConstructorBySignature(jvmSignature.constructorDesc) + override val member: Member? by ReflectProperties.lazy { + container.findConstructorBySignature(jvmSignature.constructorDesc) + } - override val defaultMember: Member? - get() = container.findDefaultConstructor(jvmSignature.constructorDesc) + override val defaultMember: Member? by ReflectProperties.lazy { + container.findDefaultConstructor(jvmSignature.constructorDesc) + } } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 3aa1a29..bf90225 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -5,6 +5,7 @@ import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -26,11 +27,13 @@ internal abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, override val isAnnotationConstructor: Boolean get() = name == "" && container.jClass.isAnnotation - override val caller: Caller<*> - get() = createCaller(member) + override val caller: Caller<*> by ReflectProperties.lazy { + createCaller(member) + } - override val defaultCaller: Caller<*>? - get() = defaultMember?.let { createCaller(it) } + override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + defaultMember?.let { createCaller(it) } + } private fun createCaller(member: Member?) = when (member) { @@ -102,12 +105,15 @@ internal class FunctionDescriptorImpl( override val returnType: KotlinType get() = kmFunction.returnType.toKotlinType(module, typeParameterTable) - private val jvmSignature: JvmFunctionSignature.KotlinFunction - get() = JvmFunctionSignature.KotlinFunction(kmFunction.signature ?: error("No signature for ${kmFunction}")) + private val jvmSignature: JvmFunctionSignature.KotlinFunction by ReflectProperties.lazy { + JvmFunctionSignature.KotlinFunction(kmFunction.signature ?: error("No signature for ${kmFunction}")) + } - override val member: Member? - get() = container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) + override val member: Member? by ReflectProperties.lazy { + container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) + } - override val defaultMember: Member? - get() = container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) + override val defaultMember: Member? by ReflectProperties.lazy { + container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) + } } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index d1822f8..f795367 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -7,6 +7,7 @@ import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.impl.KotlinReflectionInternalError +import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.JvmPropertySignature import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -55,17 +56,18 @@ internal class PropertyDescriptorImpl( } // TODO: also support overriden properties - override val jvmSignature: JvmPropertySignature.KotlinProperty - get() = JvmPropertySignature.KotlinProperty( + override val jvmSignature: JvmPropertySignature.KotlinProperty by ReflectProperties.lazy { + JvmPropertySignature.KotlinProperty( this, kmProperty.fieldSignature, kmProperty.getterSignature, kmProperty.setterSignature ) + } // Logic from: https://github.com/JetBrains/kotlin/blob/3b5179686eaba0a71bcca53c2cc922a54cc9241f/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt#L51 - override val javaField: Field? - get() = jvmSignature.fieldSignature?.let { + override val javaField: Field? by ReflectProperties.lazy { + jvmSignature.fieldSignature?.let { // TODO: support propertyWithBackingFieldInOuterClass // TODO: support JavaField, JavaMethodProperty, MappedKotlinProperty val owner = containingClass?.jClass ?: container.jClass @@ -75,18 +77,23 @@ internal class PropertyDescriptorImpl( null } } + } - override val getter: PropertyGetterDescriptor? - get() = if (Flag.Property.HAS_GETTER(flags)) PropertyGetterDescriptorImpl(this) else null + override val getter: PropertyGetterDescriptor? by ReflectProperties.lazy { + if (Flag.Property.HAS_GETTER(flags)) PropertyGetterDescriptorImpl(this) else null + } - override val setter: PropertySetterDescriptor? - get() = if (Flag.Property.HAS_SETTER(flags)) PropertySetterDescriptorImpl(this) else null + override val setter: PropertySetterDescriptor? by ReflectProperties.lazy { + if (Flag.Property.HAS_SETTER(flags)) PropertySetterDescriptorImpl(this) else null + } - override val caller: Caller<*> - get() = getter?.caller ?: error("The property has no getter") + override val caller: Caller<*> by ReflectProperties.lazy { + getter?.caller ?: error("The property has no getter") + } - override val defaultCaller: Caller<*> - get() = getter?.defaultCaller ?: error("The property has no getter") + override val defaultCaller: Caller<*> by ReflectProperties.lazy { + getter?.defaultCaller ?: error("The property has no getter") + } } internal abstract class PropertyAccessorDescriptorImpl( @@ -120,33 +127,32 @@ internal abstract class PropertyAccessorDescriptorImpl( get() = null // TODO: no defaultMember for properties // TODO: support: JavaField, JavaMethodProperty, MappedKotlinProperty - override val caller: Caller<*> - get() { - val accessor = member - return when { - accessor == null -> { - // todo inlineClassAwareCaller - if (property.isUnderlyingPropertyOfInlineClass() && - property.visibility == KVisibility.INTERNAL - ) { - TODO("Inline class aware caller is not supported yet") - } else { - val javaField = property.javaField - ?: throw KotlinReflectionInternalError("No accessors or field is found for property $property") - computeFieldCaller(javaField) - } + override val caller: Caller<*> by ReflectProperties.lazy { + val accessor = member + when { + accessor == null -> { + // todo inlineClassAwareCaller + if (property.isUnderlyingPropertyOfInlineClass() && + property.visibility == KVisibility.INTERNAL + ) { + TODO("Inline class aware caller is not supported yet") + } else { + val javaField = property.javaField + ?: throw KotlinReflectionInternalError("No accessors or field is found for property $property") + computeFieldCaller(javaField) } - !Modifier.isStatic(accessor.modifiers) -> - // todo isBound - CallerImpl.Method.Instance(accessor) - isJvmStaticProperty() -> - // todo isBound - CallerImpl.Method.JvmStaticInObject(accessor) - else -> - // todo isBound - CallerImpl.Method.Static(accessor) } + !Modifier.isStatic(accessor.modifiers) -> + // todo isBound + CallerImpl.Method.Instance(accessor) + isJvmStaticProperty() -> + // todo isBound + CallerImpl.Method.JvmStaticInObject(accessor) + else -> + // todo isBound + CallerImpl.Method.Static(accessor) } + } protected abstract fun computeFieldCaller(field: Field): Caller<*> @@ -186,10 +192,11 @@ internal class PropertyGetterDescriptorImpl( override val valueParameters: List get() = emptyList() - override val member: Method? - get() = property.jvmSignature.getterSignature?.let { signature -> + override val member: Method? by ReflectProperties.lazy { + property.jvmSignature.getterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } + } override fun computeFieldCaller(field: Field): Caller<*> = when { property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> @@ -217,10 +224,11 @@ internal class PropertySetterDescriptorImpl( override val valueParameters: List get() = listOf(PropertySetterParameterDescriptor(property.kmProperty.setterParameter, this)) - override val member: Method? - get() = property.jvmSignature.setterSignature?.let { signature -> + override val member: Method? by ReflectProperties.lazy { + property.jvmSignature.setterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } + } override fun computeFieldCaller(field: Field): Caller<*> = when { property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> From 54c7e08a0323a898ea5ac1d073d94b964ab4ba29 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 28 Jul 2022 00:28:42 +0200 Subject: [PATCH 23/74] Support overridden properties --- .../java/kotlinx/reflect/lite/impl/util.kt | 172 +++++++++++++++--- .../reflect/lite/misc/RuntimeTypeMapper.kt | 11 +- .../lite/testData/call/protectedMembers.kt | 18 +- 3 files changed, 159 insertions(+), 42 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 8c61b3a..27ee5b9 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -1,11 +1,12 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* +import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.KVisibility import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.descriptors.impl.KotlinType import kotlinx.reflect.lite.calls.* +import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.JvmPropertySignature import java.lang.reflect.* @@ -118,14 +119,11 @@ internal abstract class FakeOverrideCallableMemberDescriptor( override val typeParameters: List, override val returnType: KotlinType, val overridden: List -) : CallableDescriptor, AbstractFunctionDescriptor() { +) : CallableDescriptor { init { require(overridden.isNotEmpty()) } - override val flags: Flags - get() = TODO("Not yet implemented") - override val name: String get() = overridden.first().name override val visibility: KVisibility? @@ -134,9 +132,6 @@ internal abstract class FakeOverrideCallableMemberDescriptor( override val container: ClassBasedDeclarationContainerDescriptor get() = containingClass - override val typeParameterTable: TypeParameterTable - get() = TODO("Not yet implemented") - override val dispatchReceiverParameter: ReceiverParameterDescriptor? get() = ReceiverParameterDescriptorImpl(containingClass.defaultType, this) @@ -161,7 +156,7 @@ internal class FakeOverrideFunctionDescriptor( overridden: List ) : FakeOverrideCallableMemberDescriptor( module, containingClass, extensionReceiverParameter, valueParameters, typeParameters, returnType, overridden -) { +), FunctionDescriptor { @Suppress("UNCHECKED_CAST") val overriddenFunctions: List get() = super.overridden as List @@ -175,15 +170,30 @@ internal class FakeOverrideFunctionDescriptor( override val isSuspend: Boolean get() = overriddenFunctions.first().isSuspend // TODO? override val isExternal: Boolean - get() = TODO("Not yet implemented") + get() = overriddenFunctions.first().isExternal - override val member: Member? - get() = overriddenFunctions.first().member + override val isAnnotationConstructor: Boolean + get() = overriddenFunctions.first().isAnnotationConstructor + + override val member: Member? by ReflectProperties.lazy { + overriddenFunctions.first().member + } - override val defaultMember: Member? - get() = overriddenFunctions.first().defaultMember + override val defaultMember: Member? by ReflectProperties.lazy { + overriddenFunctions.first().defaultMember + } + + override val caller: Caller<*> by ReflectProperties.lazy { + overriddenFunctions.first().caller + } + + override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + overriddenFunctions.first().defaultCaller + } } +// TODO: fix inheritance hierarchy for overridden properties + internal class FakeOverridePropertyDescriptor( module: ModuleDescriptor, containingClass: ClassDescriptor<*>, @@ -194,14 +204,11 @@ internal class FakeOverridePropertyDescriptor( overridden: List ) : FakeOverrideCallableMemberDescriptor( module, containingClass, extensionReceiverParameter, valueParameters, typeParameters, returnType, overridden -), PropertyDescriptor { +), PropertyDescriptor { @Suppress("UNCHECKED_CAST") val overriddenProperties: List get() = super.overridden as List - override val typeParameterTable: TypeParameterTable - get() = TODO() - override val isVar: Boolean get() = overriddenProperties.any(PropertyDescriptor::isVar) override val isLateInit: Boolean @@ -209,24 +216,129 @@ internal class FakeOverridePropertyDescriptor( override val isConst: Boolean get() = false - override val jvmSignature: JvmPropertySignature.KotlinProperty - get() = TODO("Not yet implemented") + override val jvmSignature: JvmPropertySignature.KotlinProperty by ReflectProperties.lazy { + // TODO: inherit this from PropertyDescriptorImpl + val property = overriddenProperties.first() as PropertyDescriptorImpl + JvmPropertySignature.KotlinProperty( + property, + property.kmProperty.fieldSignature, + property.kmProperty.getterSignature, + property.kmProperty.setterSignature + ) + } - override val javaField: Field? - get() = TODO("Not yet implemented") + override val javaField: Field? by ReflectProperties.lazy { + // TODO: copied from PropertyDescriptorImpl, inherit the implementation + jvmSignature.fieldSignature?.let { + // TODO: support propertyWithBackingFieldInOuterClass + // TODO: support JavaField, JavaMethodProperty, MappedKotlinProperty + val owner = containingClass?.jClass ?: container.jClass + try { + owner.getDeclaredField(it.name) + } catch (e: NoSuchFieldException) { + null + } + } + } override val getter: PropertyGetterDescriptor? - get() = TODO("Not yet implemented") + get() = FakeOverridePropertyGetterDescriptor(this) override val setter: PropertySetterDescriptor? - get() = TODO("Not yet implemented") + get() = if (isVar) FakeOverridePropertySetterDescriptor(this) else null + + override val caller: Caller<*> by ReflectProperties.lazy { + getter?.caller ?: error("The property has no getter") + } + + override val defaultCaller: Caller<*> by ReflectProperties.lazy { + getter?.defaultCaller ?: error("The property has no getter") + } +} + +internal class FakeOverridePropertyGetterDescriptor( + override val property: FakeOverridePropertyDescriptor +) : FakeOverrideCallableMemberDescriptor( + property.module, + property.containingClass, + property.extensionReceiverParameter, + property.valueParameters, + property.typeParameters, + property.returnType, + property.overriddenProperties.mapNotNull(PropertyDescriptor::getter) +), PropertyGetterDescriptor { + @Suppress("UNCHECKED_CAST") + private val overriddenPropertyGetters: List + get() = super.overridden as List + + override val isInline: Boolean + get() = overriddenPropertyGetters.first().isInline // TODO? + override val isOperator: Boolean get() = false + override val isInfix: Boolean get() = false + override val isSuspend: Boolean get() = false + override val isExternal: Boolean + get() = overriddenPropertyGetters.first().isExternal - override val caller: Caller<*> - get() = TODO("Not yet implemented") + override val isAnnotationConstructor: Boolean + get() = overriddenPropertyGetters.first().isAnnotationConstructor + + override val member: Member? by ReflectProperties.lazy { + overriddenPropertyGetters.first().member + } - override val member: Member? - get() = TODO("Not yet implemented") + override val defaultMember: Member? by ReflectProperties.lazy { + overriddenPropertyGetters.first().defaultMember + } + + override val caller: Caller<*> by ReflectProperties.lazy { + overriddenPropertyGetters.first().caller + } + + override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + overriddenPropertyGetters.first().defaultCaller + } +} + +internal class FakeOverridePropertySetterDescriptor( + override val property: FakeOverridePropertyDescriptor +) : FakeOverrideCallableMemberDescriptor( + property.module, + property.containingClass, + property.extensionReceiverParameter, + property.valueParameters, + property.typeParameters, + property.returnType, + property.overriddenProperties.mapNotNull(PropertyDescriptor::setter) +), PropertySetterDescriptor { + @Suppress("UNCHECKED_CAST") + private val overriddenPropertySetters: List + get() = super.overridden as List - override val defaultMember: Member? - get() = TODO("Not yet implemented") + override val isInline: Boolean + get() = overriddenPropertySetters.first().isInline // TODO? + override val isOperator: Boolean get() = false + override val isInfix: Boolean get() = false + override val isSuspend: Boolean get() = false + + override val isExternal: Boolean + get() = overriddenPropertySetters.first().isExternal + + override val isAnnotationConstructor: Boolean + get() = overriddenPropertySetters.first().isAnnotationConstructor + + override val member: Member? by ReflectProperties.lazy { + overriddenPropertySetters.first().member + } + + override val defaultMember: Member? by ReflectProperties.lazy { + overriddenPropertySetters.first().defaultMember + } + + override val caller: Caller<*> by ReflectProperties.lazy { + overriddenPropertySetters.first().caller + } + + override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + overriddenPropertySetters.first().defaultCaller + } } diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index e5f636e..706eabc 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -9,7 +9,8 @@ import kotlinx.reflect.lite.descriptors.FunctionDescriptor import kotlinx.reflect.lite.descriptors.PropertyDescriptor import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.descriptors.impl.FunctionDescriptorImpl -import kotlinx.reflect.lite.impl.KotlinReflectionInternalError +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.impl.FakeOverridePropertyDescriptor import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -148,11 +149,9 @@ internal object RuntimeTypeMapper { ) } - // todo fake override property -// if (property is FakeOverridePropertyDescriptor) { -// return mapPropertySignature(property.overriddenProperties.first()) -// } - + if (property is FakeOverridePropertyDescriptor) { + return mapPropertySignature(property.overriddenProperties.first()) + } TODO() } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index 8e94aac..df12ab0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -1,7 +1,8 @@ package tests.call.protectedMembers -import kotlin.reflect.* -import kotlin.reflect.jvm.isAccessible +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.* abstract class Base { @@ -16,19 +17,24 @@ abstract class Base { class Derived : Base() -fun member(name: String): KCallable<*> = Derived::class.members.single { it.name == name }.apply { isAccessible = true } +fun member(name: String): KCallable<*> = (Derived::class.java).toLiteKClass().members.single { it.name == name }.apply { isAccessible = true } fun box(): String { val a = Derived() - assertEquals("1", member("protectedVal").call(a)) + // TODO: protectedVal.call(a) throws an exception "object is not an instance of declaring class", the same bu as in `propertyGetterAndGetFunctionDifferentReturnType` test + // protectedVal.invoke() -- ok + //assertEquals("1", (member("protectedVal") as KProperty1).call(a)) + assertEquals("1", (member("protectedVal") as KProperty1).invoke(a)) val publicVarProtectedSet = member("publicVarProtectedSet") as KMutableProperty1 publicVarProtectedSet.setter.call(a, "2") assertEquals("2", publicVarProtectedSet.getter.call(a)) - assertEquals("2", publicVarProtectedSet.call(a)) + assertEquals("2", publicVarProtectedSet.invoke(a)) + // TODO: the same issue as above, publicVarProtectedSet.call(a) throws + // assertEquals("2", publicVarProtectedSet.call(a)) assertEquals("3", member("protectedFun").call(a)) return "OK" -} \ No newline at end of file +} From 73b6f47b8d229dd502b8b262c0265adbbf59bf77 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 28 Jul 2022 00:30:17 +0200 Subject: [PATCH 24/74] More tests for KCallable<*>.call --- .../testData/call/accessPrivateProperties.kt | 2 +- .../reflect/lite/testData/call/bigArity.kt | 2 +- .../call/cannotCallEnumConstructor.kt | 3 +- .../testData/call/fakeOverrideSubstituted.kt | 2 +- .../call/incorrectNumberOfArguments.kt | 29 ++++++++++--------- .../reflect/lite/testData/call/jvmStatic.kt | 10 +++++-- .../jvmStaticInObjectIncorrectReceiver.kt | 6 ++-- .../testData/call/memberOfGenericClass.kt | 1 - ...GetterAndGetFunctionDifferentReturnType.kt | 11 +++++-- .../reflect/lite/tests/KCallableTest.kt | 12 ++++++++ 10 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt index 2d3fb21..eb79cbd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt @@ -11,7 +11,7 @@ private class A(private var bar: String = "") { fun getKotlinReflectBar() = A::bar } -// Test case refering the tests.call.incorrectNumberOfArguments.testAccessPrivateBarProperty() +// Test case referring the tests.call.incorrectNumberOfArguments.testAccessPrivateBarProperty() fun box(): String { // kotlinx.reflect.lite val getBar = A().getBar() as KMutableProperty1 diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt index 2402023..8ce4c32 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -15,7 +15,7 @@ class A { fun box(): String { val a = A() val foo = (A::class.java).toLiteKClass().getMemberByName("foo") - val o = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "O") as String // todo necessary type cast + val o = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "O") as String val k = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "K") as String return o + k diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt index 7adebde..6bfaa23 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -1,5 +1,6 @@ package tests.call.cannotCallEnumConstructor +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* enum class E @@ -7,7 +8,7 @@ enum class E fun box(): String { try { val c = (E::class.java).toLiteKClass().constructors.single() - //c.isAccessible = true // todo KCallable.isAccessible + c.isAccessible = true c.call() return "Fail: constructing an enum class should not be allowed" } catch (e: Throwable) { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt index a2ef49c..9a469a0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt @@ -9,6 +9,6 @@ open class A(val t: T) { class B(s: String) : A(s) fun box(): String { - val foo = (B::class.java).toLiteKClass().members.single { it.name == "foo" } + val foo = (B::class.java).toLiteKClass().getMemberByName("foo") return foo.call(B("OK")) as String } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index 4d3bbf7..e3f9458 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -3,6 +3,7 @@ package tests.call.incorrectNumberOfArguments import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* +import kotlin.test.* var foo: String = "" @@ -86,20 +87,20 @@ private fun testAccessPrivateBarProperty() { bar.isAccessible = true // TODO: kotlinx.reflect.lite.calls.CallerImpl$FieldGetter cannot access a member of class tests.call.incorrectNumberOfArguments.A with modifiers "private" b.call(A()) -// check(b) -// check(b, null, null) -// check(b, "", "") -// -// check(b.getter) -// check(b.getter, null, null) -// check(b.getter, "", "") -// -// check(b.setter) -// check(b.setter, null) -// check(b.setter, "") -// -// b.set(A(), "45") -// assertEquals("4646", b.get(A())) + check(b) + check(b, null, null) + check(b, "", "") + + check(b.getter) + check(b.getter, null, null) + check(b.getter, "", "") + + check(b.setter) + check(b.setter, null) + check(b.setter, "") + + b.set(A(), "45") + assertEquals("45", b.get(A())) } private fun testAccessPrivateBazProperty() { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt index 76113ae..cbde065 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt @@ -1,5 +1,7 @@ package tests.call.jvmStatic +import kotlinx.reflect.lite.tests.* + object Obj { @JvmStatic fun foo() {} @@ -13,7 +15,9 @@ class C { } fun box(): String { - (Obj::class.members.single { it.name == "foo" }).call(Obj) - (C.Companion::class.members.single { it.name == "bar" }).call(C.Companion) + val foo = (Obj::class.java).toLiteKClass().getMemberByName("foo") + foo.call(Obj) + val bar = C.Companion::class.java.toLiteKClass().getMemberByName("bar") + bar.call(C.Companion) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt index e9bbdf3..1e924bb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt @@ -1,5 +1,7 @@ package tests.call.jvmStaticInObjectIncorrectReceiver +import kotlinx.reflect.lite.tests.* + object Obj { @JvmStatic fun foo(s: String) {} @@ -10,7 +12,7 @@ object Obj { @JvmStatic fun sly(obj: Obj) {} - operator fun get(name: String) = Obj::class.members.single { it.name == name } + operator fun get(name: String) = (Obj::class.java).toLiteKClass().members.single { it.name == name } } fun box(): String { @@ -41,4 +43,4 @@ fun box(): String { } catch (e: IllegalArgumentException) {} return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt index 0104d9c..0ba1a83 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt @@ -1,6 +1,5 @@ package tests.call.memberOfGenericClass -import kotlinx.reflect.lite.* import kotlinx.reflect.lite.tests.* var result = "Fail" diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt index de6e02e..b9a6937 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt @@ -1,9 +1,16 @@ package tests.call.propertyGetterAndGetFunctionDifferentReturnType +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + data class Foo(val id: String) { fun getId() = -42 // Fail } fun box(): String { - return Foo::id.call(Foo("OK")) -} \ No newline at end of file + val id = Foo::class.java.toLiteKClass().getMemberByName("id") as KProperty1 + // TODO: `id.call(Foo("abs"))` fails with the error: "object is not an instance of declaring class", expected the same as `id.invoke(Foo("abc))` + // id.call(Foo("abc")) + id.invoke(Foo("dfdc")) + return id.get(Foo("OK")) +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index 11908d8..eb2a7f7 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -43,6 +43,18 @@ class KCallableTest { @Test fun testSimpleTopLevelFunctions() = test("call.simpleTopLevelFunctions") { tests.call.simpleTopLevelFunctions.box() } + @Test + fun testJvmStatic() = test("call.jvmStatic") { tests.call.jvmStatic.box() } + + @Test + fun testJvmStaticInObjectIncorrectReceiver() = test("call.jvmStaticInObjectIncorrectReceiver") { tests.call.jvmStaticInObjectIncorrectReceiver.box() } + + @Test + fun testPropertyGetterAndGetFunctionDifferentReturnType() = test("call.propertyGetterAndGetFunctionDifferentReturnType") { tests.call.propertyGetterAndGetFunctionDifferentReturnType.box() } + + @Test + fun testProtectedMembers() = test("call.protectedMembers") { tests.call.protectedMembers.box() } + // callBy @Test fun testSimpleMemberFunciton() = test("call.simpleMemberFunciton") { tests.callBy.simpleMemberFunciton.box() } From f54ac167eed08f2f57bc78faad422d6140763766 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 28 Jul 2022 00:49:18 +0200 Subject: [PATCH 25/74] More tests for top-level and extension functions --- .../reflect/lite/impl/ReflectionLiteImpl.kt | 2 +- .../reflect/lite/testData/call/returnUnit.kt | 17 +++++++++++------ .../testData/call/simpleTopLevelFunctions.kt | 14 ++++++++++---- .../kotlinx/reflect/lite/tests/KCallableTest.kt | 3 +++ .../java/kotlinx/reflect/lite/tests/testUtil.kt | 1 + 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 80aa145..b561808 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -31,7 +31,7 @@ internal object ReflectionLiteImpl { fun loadClassMetadata(jClass: Class): KDeclarationContainer { return when (jClass.getAnnotation(Metadata::class.java)?.kind) { // if the class may be builtin or it's kind == CLASS_KIND -> try create a KClass - // TODO: null case, check if is primitive or isAray + // TODO: null case, check if is primitive or isArray null, 1 -> KClassImpl(ClassDescriptorImpl(jClass)) // if it's kind == FILE_FACADE_KIND -> try create a KPackage // TODO: support header kinds MULTI_FILE_CLASS_FACADE_KIND, MULTI_FILE_CLASS_PART_KIND diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt index aa26b9a..7dffae1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt @@ -1,5 +1,6 @@ package tests.call.returnUnit +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals fun foo() {} @@ -15,12 +16,16 @@ object O { fun nullableUnit(unit: Boolean): Unit? = if (unit) Unit else null fun box(): String { - assertEquals(Unit, ::foo.call()) - assertEquals(Unit, A::bar.call(A())) - assertEquals(Unit, O::class.members.single { it.name == "baz" }.call(O)) + val clazz = Class.forName("tests.call.returnUnit.ReturnUnitKt").toLiteKDeclarationContainer() + val foo = clazz.getMemberByName("foo") + assertEquals(Unit, foo.call()) + val bar = A::class.java.toLiteKClass().getMemberByName("bar") + assertEquals(Unit, bar.call(A())) + assertEquals(Unit, (O::class.java.toLiteKClass()).members.single { it.name == "baz" }.call(O)) - assertEquals(Unit, (::nullableUnit).call(true)) - assertEquals(null, (::nullableUnit).call(false)) + val nullableUnit = clazz.getMemberByName("nullableUnit") + assertEquals(Unit, nullableUnit.call(true)) + assertEquals(null, nullableUnit.call(false)) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt index b2fa7bc..605bf04 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt @@ -1,5 +1,8 @@ package tests.call.simpleTopLevelFunctions +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* + fun String.foo(): Int = length var state = "Fail" @@ -9,21 +12,24 @@ fun bar(result: String) { } fun box(): String { - val f = (String::foo).call("abc") + val clazz = Class.forName("tests.call.simpleTopLevelFunctions.SimpleTopLevelFunctionsKt").kotlinClass + val foo = clazz.getMemberByName("foo") + val f = foo.call("abc") if (f != 3) return "Fail: $f" try { - (String::foo).call() + foo.call() return "Fail: IllegalArgumentException should have been thrown" } catch (e: IllegalArgumentException) {} try { - (String::foo).call(42) + foo.call(42) return "Fail: IllegalArgumentException should have been thrown" } catch (e: IllegalArgumentException) {} - (::bar).call("OK") + val bar = clazz.getMemberByName("bar") + bar.call("OK") return state } diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index eb2a7f7..baad73b 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -55,6 +55,9 @@ class KCallableTest { @Test fun testProtectedMembers() = test("call.protectedMembers") { tests.call.protectedMembers.box() } + @Test + fun testReturnUnit() = test("call.returnUnit") { tests.call.returnUnit.box() } + // callBy @Test fun testSimpleMemberFunciton() = test("call.simpleMemberFunciton") { tests.callBy.simpleMemberFunciton.box() } diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 239e286..3b5ad7a 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -2,6 +2,7 @@ package kotlinx.reflect.lite.tests import kotlinx.reflect.lite.* +// TODO: replace with Class.kotlinClass everywhere in tests internal fun Class.toLiteKDeclarationContainer() = ReflectionLite.loadClassMetadata(this) internal fun Class.toLiteKClass() = toLiteKDeclarationContainer() as KClass From 9bd29fe3dc7c6043f1f30c838559b6cbf531c90e Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 28 Jul 2022 02:06:35 +0200 Subject: [PATCH 26/74] Easy optional parameters supported --- .../lite/descriptors/impl/KotlinType.kt | 18 +++++++++ .../reflect/lite/impl/KCallableImpl.kt | 7 ++-- .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 37 +++++++++++++++++++ .../reflect/lite/impl/ReflectJvmMapping.kt | 14 +++++++ .../testData/callBy/primitiveDefaultValues.kt | 9 ++++- .../lite/testData/callBy/simpleConstructor.kt | 8 +++- .../testData/callBy/simpleMemberFunciton.kt | 3 +- .../testData/callBy/simpleTopLevelFunction.kt | 10 ++++- .../reflect/lite/tests/KCallableTest.kt | 11 +++++- 9 files changed, 108 insertions(+), 9 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 7a27c77..34fdf26 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -9,6 +9,7 @@ import kotlinx.reflect.lite.descriptors.ClassifierDescriptor import kotlinx.reflect.lite.descriptors.DeclarationDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor +import java.lang.reflect.* internal class KotlinType( val descriptor: ClassifierDescriptor, @@ -92,6 +93,23 @@ internal val ClassifierDescriptor.defaultType: KotlinType false ) +// Copied from here: https://github.com/JetBrains/kotlin/blob/0a6d010d1c7258e25be8e4d99a44a5ab0e66ded2/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt#L260 +internal fun defaultPrimitiveValue(type: Type?): Any? = + if (type is Class<*>) { + when (type.name) { + "java.lang.Boolean" -> false + "java.lang.Character" -> 0.toChar() + "java.lang.Byte" -> 0.toByte() + "java.lang.Short" -> 0.toShort() + "java.lang.Integer" -> 0 + "java.lang.Float" -> 0f + "java.lang.Long" -> 0L + "java.lang.Double" -> 0.0 + "java.lang.Void" -> throw IllegalStateException("Parameter with void type is illegal") + else -> throw UnsupportedOperationException("Unknown primitive: $type") + } + } else null + private fun KmVariance.toVariance(): KVariance = when (this) { KmVariance.INVARIANT -> KVariance.INVARIANT diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 84ace60..3c93b76 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -2,10 +2,9 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.impl.* import java.util.ArrayList import kotlin.coroutines.* -import kotlin.reflect.jvm.* -import kotlin.reflect.jvm.internal.* internal abstract class KCallableImpl: KCallable { abstract val descriptor: CallableDescriptor @@ -83,7 +82,9 @@ internal abstract class KCallableImpl: KCallable { arguments.add(args[parameter]) } parameter.isOptional -> { - TODO("Support optional parameters") + // TODO: support inline class type + arguments.add(defaultPrimitiveValue(parameter.type?.javaType)) + mask = mask or (1 shl (index % Integer.SIZE)) anyOptional = true } parameter.isVararg -> { diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 97d3f76..137ae51 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -3,9 +3,12 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.impl.KotlinType +import java.lang.reflect.* internal class KTypeImpl( val type: KotlinType + // TODO: support computeJavaType: + // https://github.com/JetBrains/kotlin/blob/fb296b5b95a56fe380bdbe7c9f61d092bd21f275/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTypeImpl.kt#L40 ): KType { override val classifier: KClassifier? get() = @@ -40,3 +43,37 @@ internal class KTypeImpl( override val isMarkedNullable: Boolean get() = type.isMarkedNullable } + +// Logis from: https://github.com/JetBrains/kotlin/blob/a6b51da3081b11dc2167a0cbb8ebca6f0e805d03/libraries/stdlib/jvm/src/kotlin/reflect/TypesJVM.kt#L37 +fun KType.computeJavaType(forceWrapper: Boolean = false): Type { + when (val classifier = classifier) { + // TODO: support KTypeParameter + // is KTypeParameter -> return TypeVariableImpl(classifier) + is KClass<*> -> { + // TODO: forceWrapper + val jClass = (classifier as KClassImpl<*>).descriptor.jClass + val arguments = arguments + if (arguments.isEmpty()) return jClass + + if (jClass.isArray) { + if (jClass.componentType.isPrimitive) return jClass + + val (variance, elementType) = arguments.singleOrNull() + ?: throw IllegalArgumentException("kotlin.Array must have exactly one type argument: $this") + return when (variance) { + // Array is always erased to Object[], and Array<*> is Object[]. + null, KVariance.IN -> jClass + KVariance.INVARIANT, KVariance.OUT -> { + val javaElementType = elementType!!.computeJavaType() + if (javaElementType is Class<*>) jClass else TODO("GenericArrayTypeImpl(javaElementType)") + } + } + } + + // TODO: support inner type + // return createPossiblyInnerType(jClass, arguments) + } + else -> throw UnsupportedOperationException("Unsupported type classifier: $this") + } + throw UnsupportedOperationException("Unsupported type classifier: $this") +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index b97970b..eb7b821 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -2,6 +2,12 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.KClass +import kotlinx.reflect.lite.KDeclarationContainer +import kotlinx.reflect.lite.KFunction +import kotlinx.reflect.lite.KMutableProperty +import kotlinx.reflect.lite.KProperty +import kotlinx.reflect.lite.KType import kotlinx.reflect.lite.descriptors.impl.* import java.lang.reflect.* @@ -72,6 +78,14 @@ val KDeclarationContainer.companionObject: KClass<*>? } } +/** + * Returns a Java [Type] instance corresponding to the given Kotlin type. + * Note that one Kotlin type may correspond to different JVM types depending on where it appears. For example, [Unit] corresponds to + * the JVM class [Unit] when it's the type of a parameter, or to `void` when it's the return type of a function. + */ +val KType.javaType: Type + get() = this.computeJavaType() + /** * Returns a [KProperty] instance corresponding to the given Java [Field] instance, * or `null` if this field cannot be represented by a Kotlin property diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt index 13b6f32..85b6183 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt @@ -1,5 +1,8 @@ package tests.callBy.primitiveDefaultValues +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals fun primitives( @@ -23,6 +26,8 @@ fun primitives( } fun box(): String { - ::primitives.callBy(emptyMap()) + val clazz = Class.forName("tests.callBy.primitiveDefaultValues.PrimitiveDefaultValuesKt").kotlinClass + val primitives = clazz.getMemberByName("primitives") + primitives.callBy(mapOf()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt index ad7cfd8..8427847 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt @@ -1,5 +1,11 @@ package tests.callBy.simpleConstructor +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* + class A(val result: String = "OK") -fun box(): String = ::A.callBy(mapOf()).result \ No newline at end of file +fun box(): String { + val aCons = (A::class.java.kotlinClass as KClass).constructors.first() + return aCons.callBy(mapOf()).result +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt index dad278d..f3318de 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt @@ -1,6 +1,7 @@ package tests.callBy.simpleMemberFunciton import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* class A { @@ -11,6 +12,6 @@ class A { } fun box(): String { - val foo = (A::class.java).toLiteKClass().getMemberByName("foo") as KFunction + val foo = (A::class.java).kotlinClass.getMemberByName("foo") as KFunction return foo.callBy(mapOf(foo.parameters[0] to A(), foo.parameters[1] to 42)) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt index 57bdc98..5bd5a43 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt @@ -1,5 +1,13 @@ package tests.callBy.simpleTopLevelFunction +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* + fun foo(result: String = "OK") = result -fun box(): String = ::foo.callBy(mapOf()) \ No newline at end of file +fun box(): String { + val clazz = Class.forName("tests.callBy.simpleTopLevelFunction.SimpleTopLevelFunctionKt").kotlinClass + val foo = clazz.getMemberByName("foo") as KFunction + return foo.callBy(mapOf()) +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index baad73b..d066fba 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -60,5 +60,14 @@ class KCallableTest { // callBy @Test - fun testSimpleMemberFunciton() = test("call.simpleMemberFunciton") { tests.callBy.simpleMemberFunciton.box() } + fun testSimpleMemberFunciton() = test("callBy.simpleMemberFunciton") { tests.callBy.simpleMemberFunciton.box() } + + @Test + fun testSimpleTopLevelFunction() = test("callBy.simpleTopLevelFunction") { tests.callBy.simpleTopLevelFunction.box() } + + @Test + fun testSimpleConstructorCallBy() = test("callBy.simpleConstructor") { tests.callBy.simpleConstructor.box() } + + @Test + fun testPrimitiveDefaultValuesCallBy() = test("callBy.primitiveDefaultValues") { tests.callBy.primitiveDefaultValues.box() } } From 2bfa10ffa0a3af3f7cb4ffce9d1a8017d689f837 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 28 Jul 2022 13:37:43 +0200 Subject: [PATCH 27/74] Added java.lang.String as a primitive type for optional parameters --- .../java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 34fdf26..3b9a077 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -105,6 +105,7 @@ internal fun defaultPrimitiveValue(type: Type?): Any? = "java.lang.Float" -> 0f "java.lang.Long" -> 0L "java.lang.Double" -> 0.0 + "java.lang.String" -> "" "java.lang.Void" -> throw IllegalStateException("Parameter with void type is illegal") else -> throw UnsupportedOperationException("Unknown primitive: $type") } From 9fd5a562e2750bf877e61fb35b3e9d284fc716fb Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 28 Jul 2022 16:13:30 +0200 Subject: [PATCH 28/74] More tests for callBy --- .../lite/testData/callBy/manyMaskArguments.kt | 15 ++++++++------- .../testData/callBy/nonDefaultParameterOmitted.kt | 13 +++++++++---- .../reflect/lite/testData/callBy/nullValue.kt | 7 +++++-- ...ryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt | 8 ++++++-- .../testData/callBy/primitiveDefaultValues.kt | 1 - .../kotlinx/reflect/lite/tests/KCallableTest.kt | 14 ++++++++++++++ 6 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt index c4c70ea..77d1e54 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt @@ -1,5 +1,6 @@ package tests.callBy.manyMaskArguments +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals // Generate: @@ -48,7 +49,7 @@ class A { p39: Int = 39, p40: Int = 40, p41: Int = 41, - p42: Int, + p42: Int = 42, p43: Int = 43, p44: Int = 44, p45: Int = 45, @@ -87,11 +88,11 @@ class A { } fun box(): String { - val f = A::class.members.single { it.name == "foo" } - val parameters = f.parameters - f.callBy(mapOf( - parameters.first() to A(), - parameters.single { it.name == "p42" } to 239 + val foo = (A::class.java).kotlinClass.members.single { it.name == "foo" } + val parameters = foo.parameters + foo.callBy(mapOf( + //parameters.first() to A() + //parameters.single { it.name == "p42" } to 239 )) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt index 7709432..b0e1926 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt @@ -1,10 +1,15 @@ package tests.callBy.nonDefaultParameterOmitted +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + fun foo(x: Int, y: Int = 2) = x + y fun box(): String { + val foo = Class.forName("tests.callBy.nonDefaultParameterOmitted.NonDefaultParameterOmittedKt").kotlinClass.getMemberByName("foo") try { - ::foo.callBy(mapOf()) + foo.callBy(mapOf()) return "Fail: IllegalArgumentException must have been thrown" } catch (e: IllegalArgumentException) { @@ -12,12 +17,12 @@ fun box(): String { } try { - ::foo.callBy(mapOf(::foo.parameters.last() to 1)) + foo.callBy(mapOf(foo.parameters.last() to 1)) return "Fail: IllegalArgumentException must have been thrown" } catch (e: IllegalArgumentException) { // OK } - + assertEquals(25, foo.callBy(mapOf(foo.parameters[0] to 10, foo.parameters[1] to 15))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt index b7ecd22..b82e043 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt @@ -1,5 +1,7 @@ package tests.callBy.nullValue +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertNull fun foo(x: String? = "Fail") { @@ -7,6 +9,7 @@ fun foo(x: String? = "Fail") { } fun box(): String { - ::foo.callBy(mapOf(::foo.parameters.single() to null)) + val foo = Class.forName("tests.callBy.nullValue.NullValueKt").kotlinClass.getMemberByName("foo") + foo.callBy(mapOf(foo.parameters.single() to null)) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt index b65d5d9..484f761 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt @@ -1,5 +1,7 @@ package tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals fun foo(result: String = "foo") { @@ -15,6 +17,8 @@ fun foo(result: String = "foo") { } fun box(): String { - ::foo.callBy(mapOf(::foo.parameters.single() to "box")) + val clazz = Class.forName("tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.OrdinaryMethodIsInvokedWhenNoDefaultValuesAreUsedKt").kotlinClass + val foo = clazz.getMemberByName("foo") + foo.callBy(mapOf(foo.parameters.single() to "box")) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt index 85b6183..a8fe409 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt @@ -1,6 +1,5 @@ package tests.callBy.primitiveDefaultValues -import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index d066fba..65efe96 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -70,4 +70,18 @@ class KCallableTest { @Test fun testPrimitiveDefaultValuesCallBy() = test("callBy.primitiveDefaultValues") { tests.callBy.primitiveDefaultValues.box() } + + @Test + fun testOrdinaryMethodIsInvokedWhenNoDefaultValuesAreUsed() = test("callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed") { tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.box() } + + @Test + fun testNullValue() = test("callBy.nullValue") { tests.callBy.nullValue.box() } + + @Test + fun testNonDefaultParameterOmitted() = test("callBy.nonDefaultParameterOmitted") { tests.callBy.nonDefaultParameterOmitted.box() } + + @Test + fun testManyMaskArguments() = test("callBy.manyMaskArguments") { tests.callBy.manyMaskArguments.box() } + + } From de05b75faaa878118fbb7f48fce90e2de079a355 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Fri, 29 Jul 2022 01:14:18 +0200 Subject: [PATCH 29/74] Update kotlin to 1.7.10 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4995137..fdc200e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ version=0.1.0-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.6.10 +kotlin_version=1.7.10 kotlinx_metadata_version=0.4.2 -pluginPublishVersion=0.10.1 \ No newline at end of file +pluginPublishVersion=0.10.1 From 90a9918a3efdf0d93080c7ecff221e6cf817b57e Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Fri, 29 Jul 2022 01:52:32 +0200 Subject: [PATCH 30/74] Code cleanup WIP --- .../lite/builtins/JavaToKotlinClassMap.kt | 2 +- .../kotlinx/reflect/lite/builtins/JvmAbi.kt | 2 +- .../reflect/lite/builtins/JvmPrimitiveType.kt | 2 +- .../reflect/lite/builtins/PrimitiveType.kt | 2 +- .../kotlinx/reflect/lite/calls/CallerImpl.kt | 89 ------------- .../reflect/lite/calls/ThrowingCaller.kt | 19 --- .../descriptors/impl/ClassDescriptorImpl.kt | 5 +- .../descriptors/impl/ModuleDescriptorImpl.kt | 52 -------- .../impl/PropertyDescriptorImpl.kt | 41 ++---- .../impl/ValueParameterDescriptorImpl.kt | 4 - .../kotlinx/reflect/lite/descriptors/util.kt | 16 --- .../reflect/lite/impl/KCallableImpl.kt | 43 +++---- .../reflect/lite/impl/ReflectJvmMapping.kt | 22 +--- .../java/kotlinx/reflect/lite/impl/util.kt | 2 - .../reflect/lite/misc/JvmClassMapping.kt | 86 ------------- .../reflect/lite/misc/RuntimeTypeMapper.kt | 120 +----------------- .../java/kotlinx/reflect/lite/misc/util.kt | 49 ------- .../java/kotlinx/reflect/lite/name/names.kt | 6 +- 18 files changed, 44 insertions(+), 518 deletions(-) delete mode 100644 src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt delete mode 100644 src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt index 4272b27..cd1fdba 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt @@ -5,7 +5,7 @@ import kotlinx.reflect.lite.builtins.StandardNames.FQ_NAMES import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* -object JavaToKotlinClassMap { +internal object JavaToKotlinClassMap { private const val BIG_FUNCTION_ARITY = 23 private const val NUMBERED_FUNCTION_PREFIX = "kotlin.Function" diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt index aa4e866..8bccab7 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt @@ -1,7 +1,7 @@ // Partially copied: https://github.com/JetBrains/kotlin/blob/69a13a32691ea3b952f763aa958e276128474718/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.kt package kotlinx.reflect.lite.builtins -object JvmAbi { +internal object JvmAbi { fun getterName(name: String): String = "get" + name.capitalize() const val INSTANCE_FIELD = "INSTANCE" diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt index 30d46ea..5609f22 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt @@ -2,7 +2,7 @@ package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.name.* -enum class JvmPrimitiveType(val primitiveType: PrimitiveType, val javaKeywordName: String, wrapperClassName: String) { +internal enum class JvmPrimitiveType(val primitiveType: PrimitiveType, val javaKeywordName: String, wrapperClassName: String) { BOOLEAN(PrimitiveType.BOOLEAN, "boolean", "Boolean"), CHAR(PrimitiveType.CHAR, "char", "Character"), BYTE(PrimitiveType.BYTE, "byte", "Byte"), diff --git a/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt index 9dcf76b..a859e89 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt @@ -2,7 +2,7 @@ package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.name.* -enum class PrimitiveType(val typeName: Name) { +internal enum class PrimitiveType(val typeName: Name) { BOOLEAN("Boolean"), CHAR("Char"), BYTE("Byte"), SHORT("Short"), INT("Int"), FLOAT("Float"), LONG("Long"), DOUBLE("Double"); val arrayTypeName: Name = typeName + "Array" diff --git a/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt index 537685f..7c37cda 100644 --- a/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt @@ -38,45 +38,6 @@ internal sealed class CallerImpl( } } - // TODO fix 'callBy' for bound (and non-bound) inner class constructor references - // See https://youtrack.jetbrains.com/issue/KT-14990 - class BoundConstructor(constructor: ReflectConstructor<*>, private val boundReceiver: Any?) : BoundCaller, - CallerImpl>( - constructor, constructor.declaringClass, null, - constructor.genericParameterTypes - ) { - override fun call(args: Array<*>): Any? { - checkArguments(args) - return member.newInstance(boundReceiver, *args) - } - } - - class AccessorForHiddenConstructor( - constructor: ReflectConstructor<*> - ) : CallerImpl>( - constructor, constructor.declaringClass, null, - constructor.genericParameterTypes.dropLast() - ) { - override fun call(args: Array<*>): Any? { - checkArguments(args) - return member.newInstance(*args, null) - } - } - - class AccessorForHiddenBoundConstructor( - constructor: ReflectConstructor<*>, - private val boundReceiver: Any? - ) : CallerImpl>( - constructor, constructor.declaringClass, - null, - constructor.genericParameterTypes.dropFirstAndLast() - ), BoundCaller { - override fun call(args: Array<*>): Any? { - checkArguments(args) - return member.newInstance(boundReceiver, *args, null) - } - } - sealed class Method( method: ReflectMethod, requiresInstance: Boolean = !Modifier.isStatic(method.modifiers), @@ -117,30 +78,6 @@ internal sealed class CallerImpl( return callMethod(null, args.dropFirst()) } } - - class BoundStatic(method: ReflectMethod, private val boundReceiver: Any?) : BoundCaller, Method( - method, requiresInstance = false, parameterTypes = method.genericParameterTypes.dropFirst() - ) { - override fun call(args: Array<*>): Any? { - checkArguments(args) - return callMethod(null, arrayOf(boundReceiver, *args)) - } - } - - class BoundInstance(method: ReflectMethod, private val boundReceiver: Any?) : BoundCaller, - Method(method, requiresInstance = false) { - override fun call(args: Array<*>): Any? { - checkArguments(args) - return callMethod(boundReceiver, args) - } - } - - class BoundJvmStaticInObject(method: ReflectMethod) : BoundCaller, Method(method, requiresInstance = false) { - override fun call(args: Array<*>): Any? { - checkArguments(args) - return callMethod(null, args) - } - } } sealed class FieldGetter( @@ -167,16 +104,6 @@ internal sealed class CallerImpl( checkObjectInstance(args.firstOrNull()) } } - - class BoundInstance(field: ReflectField, private val boundReceiver: Any?) : BoundCaller, - FieldGetter(field, requiresInstance = false) { - override fun call(args: Array<*>): Any? { - checkArguments(args) - return member.get(boundReceiver) - } - } - - class BoundJvmStaticInObject(field: ReflectField) : BoundCaller, FieldGetter(field, requiresInstance = false) } sealed class FieldSetter( @@ -211,22 +138,6 @@ internal sealed class CallerImpl( checkObjectInstance(args.firstOrNull()) } } - - class BoundInstance(field: ReflectField, notNull: Boolean, private val boundReceiver: Any?) : BoundCaller, - FieldSetter(field, notNull, requiresInstance = false) { - override fun call(args: Array<*>): Any { - checkArguments(args) - return member.set(boundReceiver, args.first()) - } - } - - class BoundJvmStaticInObject(field: ReflectField, notNull: Boolean) : BoundCaller, - FieldSetter(field, notNull, requiresInstance = false) { - override fun call(args: Array<*>): Any { - checkArguments(args) - return member.set(null, args.last()) - } - } } companion object { diff --git a/src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt b/src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt deleted file mode 100644 index df37305..0000000 --- a/src/main/java/kotlinx/reflect/lite/calls/ThrowingCaller.kt +++ /dev/null @@ -1,19 +0,0 @@ -// Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/ThrowingCaller.kt -package kotlinx.reflect.lite.calls - -import java.lang.reflect.Type - -internal object ThrowingCaller : Caller { - override val member: Nothing? - get() = null - - override val parameterTypes: List - get() = emptyList() - - override val returnType: Type - get() = Void.TYPE - - override fun call(args: Array<*>): Any? { - throw UnsupportedOperationException("call/callBy are not supported for this declaration.") - } -} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index 8fa8c4b..23db52a 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -27,7 +27,6 @@ internal class ClassDescriptorImpl internal constructor( val className = jClass.name val builtinClassId = when (className) { "[Ljava.lang.Object;" -> ClassId(FqName("kotlin"), "Array") - // TODO: move this into mapJavaToKotlin "[Z" -> ClassId(FqName("kotlin"), "BooleanArray") "[B" -> ClassId(FqName("kotlin"), "ByteArray") "[C" -> ClassId(FqName("kotlin"), "CharArray") @@ -59,9 +58,9 @@ internal class ClassDescriptorImpl internal constructor( // kotlin.collections -> kotlin/collections/collections.kotlin_builtins val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() - ?: error("No builtins metadata file found: $resourcePath") // TODO: return null + ?: error("No builtins metadata file found: $resourcePath") val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() - ?: error("Incompatible metadata version: $resourcePath") // TODO + ?: error("Incompatible metadata version: $resourcePath") return packageFragment.classes.find { it.name == builtinClassId.asClassName() } ?: error("Built-in class not found: $builtinClassId in $resourcePath") } else { diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index e5dd2e6..7c64ce7 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -15,56 +15,4 @@ internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : Mod val jClass = classLoader.tryLoadClass(fqName) ?: error("Failed to load the class: $fqName") return ClassDescriptorImpl(jClass as Class) } - - // TODO: fix creation of ClassDescriptor - internal fun Class<*>.getKmClass(): KmClass { - val className = name - val builtinClassId = when (className) { - "[Ljava.lang.Object;" -> ClassId(FqName("kotlin"), "Array") - // TODO: move this into mapJavaToKotlin - "[Z" -> ClassId(FqName("kotlin"), "BooleanArray") - "[B" -> ClassId(FqName("kotlin"), "ByteArray") - "[C" -> ClassId(FqName("kotlin"), "CharArray") - "[D" -> ClassId(FqName("kotlin"), "DoubleArray") - "[F" -> ClassId(FqName("kotlin"), "FloatArray") - "[I" -> ClassId(FqName("kotlin"), "IntArray") - "[J" -> ClassId(FqName("kotlin"), "LongArray") - "[S" -> ClassId(FqName("kotlin"), "ShortArray") - "java.lang.Void" -> ClassId(FqName("kotlin"), "Nothing") // TODO: ??? - else -> when { - this.isPrimitive -> { - when (this) { - Boolean::class.java -> ClassId(FqName("kotlin"), "Boolean") - Byte::class.java -> ClassId(FqName("kotlin"), "Byte") - Char::class.java -> ClassId(FqName("kotlin"), "Char") - Double::class.java -> ClassId(FqName("kotlin"), "Double") - Float::class.java -> ClassId(FqName("kotlin"), "Float") - Int::class.java -> ClassId(FqName("kotlin"), "Int") - Long::class.java -> ClassId(FqName("kotlin"), "Long") - Short::class.java -> ClassId(FqName("kotlin"), "Short") - else -> error(this) - } - } - else -> JavaToKotlinClassMap.mapJavaToKotlin(classId.asSingleFqName()) - } - } - return if (builtinClassId != null) { - val packageName = builtinClassId.packageFqName - // kotlin.collections -> kotlin/collections/collections.kotlin_builtins - val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" - val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() - ?: error("No builtins metadata file found: $resourcePath") // TODO: return null - val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() - ?: error("Incompatible metadata version: $resourcePath") // TODO - packageFragment.classes.find { it.name == builtinClassId.asClassName() } - ?: error("Built-in class not found: $builtinClassId in $resourcePath") - } else { - val header = getAnnotation(Metadata::class.java)?.let { - KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) - } ?: error("@Metadata annotation was not found for ${name} ") - val metadata = KotlinClassMetadata.read(header) - (metadata as? KotlinClassMetadata.Class)?.toKmClass() - ?: error("KotlinClassMetadata.Class metadata is only supported for now") - } - } } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index f795367..bfa2ccf 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -6,11 +6,14 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.impl.KClassImpl import kotlinx.reflect.lite.impl.KotlinReflectionInternalError import kotlinx.reflect.lite.internal.* +import kotlinx.reflect.lite.internal.ReflectProperties import kotlinx.reflect.lite.misc.JvmPropertySignature import kotlinx.reflect.lite.name.* import java.lang.reflect.* +import kotlin.reflect.jvm.internal.* internal class PropertyDescriptorImpl( val kmProperty: KmProperty, @@ -55,7 +58,6 @@ internal class PropertyDescriptorImpl( ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) } - // TODO: also support overriden properties override val jvmSignature: JvmPropertySignature.KotlinProperty by ReflectProperties.lazy { JvmPropertySignature.KotlinProperty( this, @@ -68,8 +70,6 @@ internal class PropertyDescriptorImpl( // Logic from: https://github.com/JetBrains/kotlin/blob/3b5179686eaba0a71bcca53c2cc922a54cc9241f/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt#L51 override val javaField: Field? by ReflectProperties.lazy { jvmSignature.fieldSignature?.let { - // TODO: support propertyWithBackingFieldInOuterClass - // TODO: support JavaField, JavaMethodProperty, MappedKotlinProperty val owner = containingClass?.jClass ?: container.jClass try { owner.getDeclaredField(it.name) @@ -124,23 +124,15 @@ internal abstract class PropertyAccessorDescriptorImpl( abstract override val member: Method? override val defaultMember: Member? - get() = null // TODO: no defaultMember for properties + get() = null - // TODO: support: JavaField, JavaMethodProperty, MappedKotlinProperty override val caller: Caller<*> by ReflectProperties.lazy { val accessor = member when { accessor == null -> { - // todo inlineClassAwareCaller - if (property.isUnderlyingPropertyOfInlineClass() && - property.visibility == KVisibility.INTERNAL - ) { - TODO("Inline class aware caller is not supported yet") - } else { - val javaField = property.javaField - ?: throw KotlinReflectionInternalError("No accessors or field is found for property $property") - computeFieldCaller(javaField) - } + val javaField = property.javaField + ?: throw KotlinReflectionInternalError("No accessors or field is found for property $property") + computeFieldCaller(javaField) } !Modifier.isStatic(accessor.modifiers) -> // todo isBound @@ -157,8 +149,10 @@ internal abstract class PropertyAccessorDescriptorImpl( protected abstract fun computeFieldCaller(field: Field): Caller<*> protected fun isJvmStaticProperty(): Boolean { - return false - TODO("Implement isJvmStaticProperty: check annotations") + val annotationsMethodSignature = property.kmProperty.syntheticMethodForAnnotations ?: return false + val kClass = property.container as? KClassImpl<*> ?: return false + val annotationsMethod = kClass.descriptor.jClass.declaredMethods.single { it.name == annotationsMethodSignature.name } + return annotationsMethod.getDeclaredAnnotation(JvmStatic::class.java) != null } // Logic from: https://github.com/JetBrains/kotlin/blob/3b5179686eaba0a71bcca53c2cc922a54cc9241f/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt#L321-L320 @@ -166,14 +160,7 @@ internal abstract class PropertyAccessorDescriptorImpl( val container = containingClass if (container == null || !container.isCompanion) return false val outerClass = container.containingClass - return when { - // TODO: support isAnnotationClass, || outerClass?.isAnnotationClass == true - outerClass?.isInterface == true -> - // TODO - // this is DeserializedPropertyDescriptor && JvmProtoBufUtil.isMovedFromInterfaceCompanion(proto) - false - else -> true - } + return outerClass?.isInterface != true } protected fun isNotNullProperty(): Boolean = @@ -201,11 +188,9 @@ internal class PropertyGetterDescriptorImpl( override fun computeFieldCaller(field: Field): Caller<*> = when { property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> // TODO: bound receiver - // if (isBound) CallerImpl.FieldGetter.BoundInstance(field, boundReceiver) CallerImpl.FieldGetter.Instance(field) isJvmStaticProperty() -> // TODO: bound receiver - // if (isBound) CallerImpl.FieldGetter.BoundJvmStaticInObject(field) CallerImpl.FieldGetter.JvmStaticInObject(field) else -> CallerImpl.FieldGetter.Static(field) @@ -233,11 +218,9 @@ internal class PropertySetterDescriptorImpl( override fun computeFieldCaller(field: Field): Caller<*> = when { property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> // TODO: bound receiver - // if (isBound) CallerImpl.FieldSetter.BoundInstance(field, isNotNullProperty(), boundReceiver) CallerImpl.FieldSetter.Instance(field, isNotNullProperty()) isJvmStaticProperty() -> // TODO: bound receiver - // if (isBound) CallerImpl.FieldSetter.BoundJvmStaticInObject(field, isNotNullProperty()) CallerImpl.FieldSetter.JvmStaticInObject(field, isNotNullProperty()) else -> CallerImpl.FieldSetter.Static(field, isNotNullProperty()) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt index 261475d..54d84bb 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt @@ -12,8 +12,6 @@ internal class ValueParameterDescriptorImpl( override val name: Name get() = kmValueParam.name - // todo implement annotations - override val type: KotlinType get() = kmValueParam.type.toKotlinType(containingDeclaration.module, containingDeclaration.typeParameterTable) @@ -31,8 +29,6 @@ internal class PropertySetterParameterDescriptor( override val name: Name get() = kmSetterParam?.name ?: "" - // todo implement annotations - override val containingDeclaration: CallableDescriptor get() = setter override val type: KotlinType diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt index 7487551..fdba5a9 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt @@ -23,19 +23,3 @@ internal fun KmVariance.toVariance(): KVariance = KmVariance.IN -> KVariance.IN KmVariance.OUT -> KVariance.OUT } - -internal fun CallableDescriptor.isGetterOfUnderlyingPropertyOfInlineClass() = - this is PropertyGetterDescriptor && property.isUnderlyingPropertyOfInlineClass() - -internal fun CallableDescriptor.isUnderlyingPropertyOfInlineClass(): Boolean { - if (this !is PropertyDescriptor || extensionReceiverParameter != null) return false - val container = containingClass - return container is ClassDescriptorImpl && container.kmClass.inlineClassUnderlyingPropertyName == name -} - -// TODO: do we need it? -internal fun DeclarationDescriptor?.toInlineClass(): Class<*>? = - if (this is ClassDescriptor<*> && isValue) - this.jClass - else - null diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 3c93b76..7c18bd1 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -3,39 +3,33 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.internal.* import java.util.ArrayList import kotlin.coroutines.* internal abstract class KCallableImpl: KCallable { abstract val descriptor: CallableDescriptor - override val parameters: List - get() { - val descriptor = descriptor - val result = mutableListOf() - var index = 0 - // TODO bound receiver - val instanceReceiver = descriptor.dispatchReceiverParameter - - if (instanceReceiver != null) { - result.add(KParameterImpl(instanceReceiver, index++, KParameter.Kind.INSTANCE)) - } + override val parameters: List by ReflectProperties.lazy { + val descriptor = descriptor + val result = mutableListOf() + var index = 0 + val instanceReceiver = descriptor.dispatchReceiverParameter - val extensionReceiver = descriptor.extensionReceiverParameter - if (extensionReceiver != null) { - result.add(KParameterImpl(extensionReceiver, index++, KParameter.Kind.EXTENSION_RECEIVER)) - } + if (instanceReceiver != null) { + result.add(KParameterImpl(instanceReceiver, index++, KParameter.Kind.INSTANCE)) + } - for (valueParameterDesc in descriptor.valueParameters) { - result.add(KParameterImpl(valueParameterDesc, index++, KParameter.Kind.VALUE)) - } + val extensionReceiver = descriptor.extensionReceiverParameter + if (extensionReceiver != null) { + result.add(KParameterImpl(extensionReceiver, index++, KParameter.Kind.EXTENSION_RECEIVER)) + } - // Constructor parameters of Java annotations are not ordered in any way, we order them by name here to be more stable. - // Note that positional call (via "call") is not allowed unless there's a single non-"value" parameter, - // so the order of parameters of Java annotation constructors here can be arbitrary - // TODO annotation constructors - return result + for (valueParameterDesc in descriptor.valueParameters) { + result.add(KParameterImpl(valueParameterDesc, index++, KParameter.Kind.VALUE)) } + result + } override val visibility: KVisibility? get() = descriptor.visibility @@ -62,7 +56,7 @@ internal abstract class KCallableImpl: KCallable { return callDefaultMethod(args, null) } - // See ArgumentGenerator#generate + // Logic from: https://github.com/JetBrains/kotlin/blob/ea836fd46a1fef07d77c96f9d7e8d7807f793453/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KCallableImpl.kt#L116 internal fun callDefaultMethod(args: Map, continuationArgument: Continuation<*>?): R { val parameters = parameters val arguments = ArrayList(parameters.size) @@ -82,7 +76,6 @@ internal abstract class KCallableImpl: KCallable { arguments.add(args[parameter]) } parameter.isOptional -> { - // TODO: support inline class type arguments.add(defaultPrimitiveValue(parameter.type?.javaType)) mask = mask or (1 shl (index % Integer.SIZE)) anyOptional = true diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index eb7b821..07568b3 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -2,12 +2,6 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.KClass -import kotlinx.reflect.lite.KDeclarationContainer -import kotlinx.reflect.lite.KFunction -import kotlinx.reflect.lite.KMutableProperty -import kotlinx.reflect.lite.KProperty -import kotlinx.reflect.lite.KType import kotlinx.reflect.lite.descriptors.impl.* import java.lang.reflect.* @@ -53,6 +47,12 @@ val KFunction.javaConstructor: Constructor? return it.descriptor.caller.member as? Constructor } +/** + * Returns a Java [Class] instance corresponding to the given [KClass] instance. + */ +public val KClass.java: Class + get() = (this as KClassImpl).descriptor.jClass as Class + // Java reflection -> Kotlin reflection val Class.kotlinClass: KDeclarationContainer @@ -91,18 +91,13 @@ val KType.javaType: Type * or `null` if this field cannot be represented by a Kotlin property * (for example, if it is a synthetic field). */ -// TODO renamed for now for resolution val Field.kotlinLiteProperty: KProperty<*>? get() { if (isSynthetic) return null - - // TODO: optimize (search by name) - val kotlinPackage = getKPackage() if (kotlinPackage != null) { return kotlinPackage.members.filterIsInstance>().firstOrNull { it.name == this.name } } - // TODO comapare by javaField: { it.javaField == this } return declaringClass.kotlinClass.members.filterIsInstance>().firstOrNull { it.name == this.name } } @@ -115,7 +110,6 @@ val Method.kotlinLiteFunction: KFunction<*>? if (Modifier.isStatic(modifiers)) { val kotlinPackage = getKPackage() if (kotlinPackage != null) { - // TODO comapare by javaMethod: { it.javaField == this } return kotlinPackage.members.filterIsInstance>().firstOrNull { it.name == this.name } } @@ -123,10 +117,6 @@ val Method.kotlinLiteFunction: KFunction<*>? val companion = declaringClass.kotlinClass.companionObject if (companion != null) { companion.members.filterIsInstance>().firstOrNull { - // TODO comapare by javaMethod: { it.javaField == this } - //val m = it.javaMethod -// m != null && m.name == this.name && -// m.parameterTypes!!.contentEquals(this.parameterTypes) && m.returnType == this.returnType it.name == this.name }?.let { return it } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 27ee5b9..56adec8 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -21,13 +21,11 @@ internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { 0 -> return KMutableProperty0Impl(descriptor) 1 -> return KMutableProperty1Impl(descriptor) else -> TODO("Implement mutable properties for other numbers of receivers") -// 2 -> return KMutableProperty2Impl(container, descriptor) } else -> when (receiverCount) { 0 -> return KProperty0Impl(descriptor) 1 -> return KProperty1Impl(descriptor) else -> TODO("Implement properties for other numbers of receivers") -// 2 -> return KProperty2Impl(container, descriptor) } } } diff --git a/src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt deleted file mode 100644 index b5d4848..0000000 --- a/src/main/java/kotlinx/reflect/lite/misc/JvmClassMapping.kt +++ /dev/null @@ -1,86 +0,0 @@ -// Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/runtime/kotlin/jvm/JvmClassMapping.kt -package kotlinx.reflect.lite.misc - -import java.lang.Boolean as JavaLangBoolean -import java.lang.Byte as JavaLangByte -import java.lang.Character as JavaLangCharacter -import java.lang.Double as JavaLangDouble -import java.lang.Float as JavaLangFloat -import java.lang.Integer as JavaLangInteger -import java.lang.Long as JavaLangLong -import java.lang.Short as JavaLangShort -import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.descriptors.impl.* -import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.impl.KClassImpl - -/** - * Returns a Java [Class] instance corresponding to the given [KClass] instance. - */ -public val KClass.java: Class - get() = (this as KClassImpl).descriptor.jClass as Class // TODO: revealing the descriptor - -/** - * Returns a Java [Class] instance representing the primitive type corresponding to the given [KClass] if it exists. - */ -public val KClass.javaPrimitiveType: Class? - get() { - val thisJClass = this.java - if (thisJClass.isPrimitive) return thisJClass as Class - - return when (thisJClass.name) { - "java.lang.Boolean" -> Boolean::class.java - "java.lang.Character" -> Char::class.java - "java.lang.Byte" -> Byte::class.java - "java.lang.Short" -> Short::class.java - "java.lang.Integer" -> Int::class.java - "java.lang.Float" -> Float::class.java - "java.lang.Long" -> Long::class.java - "java.lang.Double" -> Double::class.java - "java.lang.Void" -> Void.TYPE - else -> null - } as Class? - } - -/** - * Returns a Java [Class] instance corresponding to the given [KClass] instance. - * In case of primitive types it returns corresponding wrapper classes. - */ -public val KClass.javaObjectType: Class - get() { - val thisJClass = this.java - if (!thisJClass.isPrimitive) return thisJClass as Class - - return when (thisJClass.name) { - "boolean" -> JavaLangBoolean::class.java - "char" -> JavaLangCharacter::class.java - "byte" -> JavaLangByte::class.java - "short" -> JavaLangShort::class.java - "int" -> JavaLangInteger::class.java - "float" -> JavaLangFloat::class.java - "long" -> JavaLangLong::class.java - "double" -> JavaLangDouble::class.java - "void" -> Void::class.java - else -> thisJClass - } as Class - } - -/** - * Returns the runtime Java class of this object. - */ -public inline val T.javaClass: Class - @Suppress("UsePropertyAccessSyntax") - get() = (this as java.lang.Object).getClass() as Class - -@Deprecated("Use 'java' property to get Java class corresponding to this Kotlin class or cast this instance to Any if you really want to get the runtime Java class of this implementation of KClass.", ReplaceWith("(this as Any).javaClass"), level = DeprecationLevel.ERROR) -public inline val KClass.javaClass: Class> - @JvmName("getRuntimeClassOfKClassInstance") - @Suppress("UsePropertyAccessSyntax") - get() = (this as java.lang.Object).getClass() as Class> - -/** - * Checks if array can contain element of type [T]. - */ -@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE") -public fun Array<*>.isArrayOf(): Boolean = - T::class.java.isAssignableFrom(this::class.java.componentType) diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index 706eabc..c98c386 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -33,140 +33,22 @@ sealed class JvmFunctionSignature { override fun asString(): String = _signature } - - class JavaMethod(val method: Method) : JvmFunctionSignature() { - override fun asString(): String = method.signature - } - - class JavaConstructor(val constructor: Constructor<*>) : JvmFunctionSignature() { - override fun asString(): String = - constructor.parameterTypes.joinToString(separator = "", prefix = "(", postfix = ")V") { it.desc } - } - - class FakeJavaAnnotationConstructor(val jClass: Class<*>) : JvmFunctionSignature() { - // Java annotations do not impose any order of methods inside them, so we consider them lexicographic here for stability - val methods = jClass.declaredMethods.sortedBy { it.name } - - override fun asString(): String = - methods.joinToString(separator = "", prefix = "(", postfix = ")V") { it.returnType.desc } - } } internal sealed class JvmPropertySignature { - /** - * Returns the JVM signature of the getter of this property. In case the property doesn't have a getter, - * constructs the signature of its imaginary default getter. See CallableReference#getSignature for more information - */ - abstract fun asString(): String class KotlinProperty( private val descriptor: PropertyDescriptorImpl, val fieldSignature: JvmFieldSignature?, val getterSignature: JvmMethodSignature?, val setterSignature: JvmMethodSignature? - ) : JvmPropertySignature() { - private val string: String = getterSignature?.asString() ?: run { - val (name, desc) = fieldSignature ?: throw KotlinReflectionInternalError("No field signature for property: $descriptor") - JvmAbi.getterName(name) + getManglingSuffix() + "()" + desc - } - - private fun getManglingSuffix(): String { - val containingClass = descriptor.containingClass - if (descriptor.visibility == KVisibility.INTERNAL && containingClass is ClassDescriptorImpl) { - val moduleName = containingClass.kmClass.moduleName ?: "main" - return "$" + sanitizeAsJavaIdentifier(moduleName) - } - if (descriptor.visibility == KVisibility.PRIVATE && containingClass == null) { - //(descriptor.container as KPackageImpl) - // TODO -/* - val packagePartSource = (descriptor as DeserializedPropertyDescriptor).containerSource - if (packagePartSource is JvmPackagePartSource && packagePartSource.facadeClassName != null) { - return "$" + packagePartSource.simpleName.asString() - } -*/ - } - return "" - } - - override fun asString(): String = string - } - - class JavaMethodProperty(val getterMethod: Method, val setterMethod: Method?) : JvmPropertySignature() { - override fun asString(): String = getterMethod.signature - } - - class JavaField(val field: Field) : JvmPropertySignature() { - override fun asString(): String = - JvmAbi.getterName(field.name) + "()" + field.type.desc - } + ) : JvmPropertySignature() - class MappedKotlinProperty( - val getterSignature: JvmFunctionSignature.KotlinFunction, - val setterSignature: JvmFunctionSignature.KotlinFunction? - ) : JvmPropertySignature() { - override fun asString(): String = getterSignature.asString() - } } -private val Method.signature: String - get() = name + - parameterTypes.joinToString(separator = "", prefix = "(", postfix = ")") { it.desc } + - returnType.desc - internal object RuntimeTypeMapper { private val JAVA_LANG_VOID = ClassId.topLevel(FqName("java.lang.Void")) - fun mapSignature(funcDesc: FunctionDescriptor): JvmFunctionSignature { - if (funcDesc is FunctionDescriptorImpl) { - return JvmFunctionSignature.KotlinFunction(funcDesc.kmFunction.signature ?: error("No signature for ${funcDesc.kmFunction}")) - } - if (funcDesc is ConstructorDescriptorImpl) { - return JvmFunctionSignature.KotlinConstructor(funcDesc.kmCons.signature ?: error("No constructor signature for ${funcDesc.kmCons}")) - } -// if (function is PropertyGetterDescriptorImpl) { -// return JvmFunctionSignature.KotlinFunction(function.property.property.getterSignature ?: error("No getter signature for ${function.render()}")) -// } -// if (function is PropertySetterDescriptorImpl) { -// return JvmFunctionSignature.KotlinFunction(function.property.property.setterSignature ?: error("No setter signature for ${function.render()}")) -// } -// if (function is FakeOverrideFunctionDescriptor) { -// return mapSignature(function.overriddenFunctions.first()) -// } - - throw KotlinReflectionInternalError("Unknown origin of $funcDesc (${funcDesc.javaClass})") - } - - fun mapPropertySignature(possiblyOverriddenProperty: PropertyDescriptor): JvmPropertySignature { - val property = possiblyOverriddenProperty - - if (property is PropertyDescriptorImpl) { - return JvmPropertySignature.KotlinProperty( - property, - property.kmProperty.fieldSignature, - property.kmProperty.getterSignature, - property.kmProperty.setterSignature - ) - } - - if (property is FakeOverridePropertyDescriptor) { - return mapPropertySignature(property.overriddenProperties.first()) - } - TODO() - } - - - private fun isKnownBuiltInFunction(descriptor: FunctionDescriptor): Boolean { - // if (DescriptorFactory.isEnumValueOfMethod(descriptor) || DescriptorFactory.isEnumValuesMethod(descriptor)) return true - - // if (descriptor.name == CloneableClassScope.CLONE_NAME && descriptor.valueParameters.isEmpty()) return true - - return false - } - -// private fun mapName(descriptor: CallableMemberDescriptor): String = -// descriptor.name - fun mapJvmClassToKotlinClassId(klass: Class<*>): ClassId { if (klass.isArray) { klass.componentType.primitiveType?.let { diff --git a/src/main/java/kotlinx/reflect/lite/misc/util.kt b/src/main/java/kotlinx/reflect/lite/misc/util.kt index 9b66e84..6b19861 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/util.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/util.kt @@ -1,8 +1,6 @@ // Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/reflectClassUtil.kt package kotlinx.reflect.lite.misc -import java.lang.reflect.ParameterizedType -import java.lang.reflect.Type import kotlinx.reflect.lite.name.* import java.lang.reflect.Array @@ -11,27 +9,11 @@ val Class<*>.safeClassLoader: ClassLoader private val PRIMITIVE_CLASSES = listOf(Boolean::class, Byte::class, Char::class, Double::class, Float::class, Int::class, Long::class, Short::class) -private val WRAPPER_TO_PRIMITIVE = PRIMITIVE_CLASSES.map { it.javaObjectType to it.javaPrimitiveType }.toMap() private val PRIMITIVE_TO_WRAPPER = PRIMITIVE_CLASSES.map { it.javaPrimitiveType to it.javaObjectType }.toMap() -val Class<*>.primitiveByWrapper: Class<*>? - get() = WRAPPER_TO_PRIMITIVE[this] - val Class<*>.wrapperByPrimitive: Class<*>? get() = PRIMITIVE_TO_WRAPPER[this] -private val FUNCTION_CLASSES = - listOf( - Function0::class.java, Function1::class.java, Function2::class.java, Function3::class.java, Function4::class.java, - Function5::class.java, Function6::class.java, Function7::class.java, Function8::class.java, Function9::class.java, - Function10::class.java, Function11::class.java, Function12::class.java, Function13::class.java, Function14::class.java, - Function15::class.java, Function16::class.java, Function17::class.java, Function18::class.java, Function19::class.java, - Function20::class.java, Function21::class.java, Function22::class.java - ).mapIndexed { i, clazz -> clazz to i }.toMap() - -val Class<*>.functionClassArity: Int? - get() = FUNCTION_CLASSES[this] - /** * NOTE: does not perform a Java -> Kotlin mapping. If this is not expected, consider using KClassImpl#classId instead */ @@ -46,40 +28,9 @@ val Class<*>.classId: ClassId else -> declaringClass?.classId?.createNestedClassId(simpleName) ?: ClassId.topLevel(FqName(name)) } -val Class<*>.desc: String - get() = when { - isPrimitive -> when (name) { - "boolean" -> "Z" - "char" -> "C" - "byte" -> "B" - "short" -> "S" - "int" -> "I" - "float" -> "F" - "long" -> "J" - "double" -> "D" - "void" -> "V" - else -> throw IllegalArgumentException("Unsupported primitive type: $this") - } - isArray -> name.replace('.', '/') - else -> "L${name.replace('.', '/')};" - } - fun Class<*>.createArrayType(): Class<*> = Array.newInstance(this, 0)::class.java -/** - * @return all arguments of a parameterized type, including those of outer classes in case this type represents an inner generic. - * The returned list starts with the arguments to the innermost class, then continues with those of its outer class, and so on. - * For example, for the type `Outer.Inner` the result would be `[C, D, A, B]`. - */ -val Type.parameterizedTypeArguments: List - get() { - if (this !is ParameterizedType) return emptyList() - if (ownerType == null) return actualTypeArguments.toList() - - return generateSequence(this) { it.ownerType as? ParameterizedType }.flatMap { it.actualTypeArguments.asSequence() }.toList() - } - fun ClassLoader.tryLoadClass(fqName: String) = try { Class.forName(fqName, false, this) diff --git a/src/main/java/kotlinx/reflect/lite/name/names.kt b/src/main/java/kotlinx/reflect/lite/name/names.kt index 6cd600b..554cb11 100644 --- a/src/main/java/kotlinx/reflect/lite/name/names.kt +++ b/src/main/java/kotlinx/reflect/lite/name/names.kt @@ -26,6 +26,7 @@ data class FqName(val fqName: String) { } } +// Partially from: https://github.com/JetBrains/kotlin/blob/ea836fd46a1fef07d77c96f9d7e8d7807f793453/core/compiler.common/src/org/jetbrains/kotlin/name/ClassId.java#L34 data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val isLocal: Boolean = false) { constructor(packageFqName: FqName, relativeClassName: Name) : this(packageFqName, FqName(relativeClassName)) @@ -72,8 +73,3 @@ data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val ClassId(topLevelFqName.parent(), FqName(topLevelFqName.shortName())) } } - -private val SANITIZE_AS_JAVA_INVALID_CHARACTERS = "[^\\p{L}\\p{Digit}]".toRegex() - -fun sanitizeAsJavaIdentifier(name: String): String = - SANITIZE_AS_JAVA_INVALID_CHARACTERS.replace(name, "_") From 3c0365db43dfbeb9d626e0ae953c7ce05487cc57 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Fri, 29 Jul 2022 13:19:38 +0200 Subject: [PATCH 31/74] move more unsupported tests to unusedTestData --- .../testData/callBy/boundJvmStaticInObject.kt | 16 ---------------- .../constructorWithInlineClassParameters.kt | 14 +++++++------- .../callBy/boundExtensionFunction.kt | 0 .../callBy/boundExtensionPropertyAcessor.kt | 0 .../callBy/boundJvmStaticInObject.kt | 16 ++++++++++++++++ .../callBy/companionObject.kt | 2 +- .../callBy/defaultAndNonDefaultIntertwined.kt | 0 .../callBy/defaultInSuperClass.kt | 0 .../callBy/defaultInSuperInterface.kt | 0 .../callBy/emptyVarArg.kt | 0 .../callBy/extensionFunction.kt | 0 .../callBy/inlineClassDefaultArguments.kt | 0 .../inlineClassFunctionsAndConstructors.kt | 0 .../callBy/manyArgumentsOnlyOneDefault.kt | 0 .../classes/objectInstance.kt | 0 15 files changed, 24 insertions(+), 24 deletions(-) delete mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/boundExtensionFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/boundExtensionPropertyAcessor.kt (100%) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/companionObject.kt (99%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/defaultAndNonDefaultIntertwined.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/defaultInSuperClass.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/defaultInSuperInterface.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/emptyVarArg.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/extensionFunction.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/inlineClassDefaultArguments.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/inlineClassFunctionsAndConstructors.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/manyArgumentsOnlyOneDefault.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classes/objectInstance.kt (100%) diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt deleted file mode 100644 index 5ffd978..0000000 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt +++ /dev/null @@ -1,16 +0,0 @@ -package tests.callBy.boundJvmStaticInObject - -object Host { - @JvmStatic fun concat(s1: String, s2: String, s3: String = "K", s4: String = "x") = - s1 + s2 + s3 + s4 -} - -fun box(): String { - val concat = Host::concat - val concatParams = concat.parameters - return concat.callBy(mapOf( - concatParams[0] to "", - concatParams[1] to "O", - concatParams[3] to "" - )) -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt index 786d29d..d75946e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt @@ -11,18 +11,18 @@ class Outer(val z1: Z) { } inline class InlineOuter(val z1: Z) { - @Suppress("INNER_CLASS_INSIDE_INLINE_CLASS") - inner class Inner(val z2: Z) { - val test = "$z1 $z2" - } + //@Suppress("INNER_CLASS_INSIDE_INLINE_CLASS") +// inner class Inner(val z2: Z) { +// val test = "$z1 $z2" +// } } fun box(): String { assertEquals(Z(1), ::Outer.call(Z(1)).z1) assertEquals("Z(x=1) Z(x=2)", Outer::Inner.call(Outer(Z(1)), Z(2)).test) assertEquals("Z(x=1) Z(x=3)", Outer(Z(1))::Inner.call(Z(3)).test) - assertEquals("Z(x=1) Z(x=2)", InlineOuter::Inner.call(InlineOuter(Z(1)), Z(2)).test) - assertEquals("Z(x=1) Z(x=3)", InlineOuter(Z(1))::Inner.call(Z(3)).test) +// assertEquals("Z(x=1) Z(x=2)", InlineOuter::Inner.call(InlineOuter(Z(1)), Z(2)).test) +// assertEquals("Z(x=1) Z(x=3)", InlineOuter(Z(1))::Inner.call(Z(3)).test) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessor.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt new file mode 100644 index 0000000..5975098 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt @@ -0,0 +1,16 @@ +package tests.callBy.boundJvmStaticInObject + +//object Host { +// @JvmStatic fun concat(s1: String, s2: String, s3: String = "K", s4: String = "x") = +// s1 + s2 + s3 + s4 +//} +// +//fun box(): String { +// val concat = Host::concat +// val concatParams = concat.parameters +// return concat.callBy(mapOf( +// concatParams[0] to "", +// concatParams[1] to "O", +// concatParams[3] to "" +// )) +//} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/companionObject.kt similarity index 99% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/companionObject.kt index f5f08e0..6088301 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/companionObject.kt @@ -28,4 +28,4 @@ fun box(): String { ))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultAndNonDefaultIntertwined.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultAndNonDefaultIntertwined.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperClass.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClass.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperClass.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperInterface.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperInterface.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperInterface.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/emptyVarArg.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/emptyVarArg.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/emptyVarArg.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/emptyVarArg.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/extensionFunction.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/extensionFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassDefaultArguments.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassDefaultArguments.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassDefaultArguments.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassDefaultArguments.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassFunctionsAndConstructors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassFunctionsAndConstructors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassFunctionsAndConstructors.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassFunctionsAndConstructors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/manyArgumentsOnlyOneDefault.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/manyArgumentsOnlyOneDefault.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/objectInstance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/objectInstance.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classes/objectInstance.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classes/objectInstance.kt From 13627f91a267ed3492dc7eaab1ac538525a33ffc Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Fri, 29 Jul 2022 13:57:01 +0200 Subject: [PATCH 32/74] Some visibility fixes and refactoring --- ...ClassBasedDeclarationContainerDescriptorImpl.kt | 14 ++++++-------- .../descriptors/impl/ConstructorDescriptorImpl.kt | 2 +- .../descriptors/impl/FunctionDescriptorImpl.kt | 6 +----- .../reflect/lite/descriptors/impl/KotlinType.kt | 7 +------ .../descriptors/impl/PropertyDescriptorImpl.kt | 4 ---- .../kotlinx/reflect/lite/impl/KCallableImpl.kt | 2 +- .../reflect/lite/impl/ReflectionLiteImpl.kt | 8 -------- src/main/java/kotlinx/reflect/lite/impl/util.kt | 14 +++++++------- 8 files changed, 17 insertions(+), 40 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt index 24d5d13..845860f 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt @@ -18,21 +18,21 @@ internal abstract class ClassBasedDeclarationContainerDescriptorImpl( abstract val memberScope: MemberScope abstract val staticScope: MemberScope - val declaredNonStaticMembers: Collection> + private val declaredNonStaticMembers: Collection> get() = getMembers(memberScope, MemberBelonginess.DECLARED) - val declaredStaticMembers: Collection> + private val declaredStaticMembers: Collection> get() = getMembers(staticScope, MemberBelonginess.DECLARED) - val inheritedNonStaticMembers: Collection> + private val inheritedNonStaticMembers: Collection> get() = getMembers(memberScope, MemberBelonginess.INHERITED) - val inheritedStaticMembers: Collection> + private val inheritedStaticMembers: Collection> get() = getMembers(staticScope, MemberBelonginess.INHERITED) - val allNonStaticMembers: Collection> + private val allNonStaticMembers: Collection> by ReflectProperties.lazySoft { declaredNonStaticMembers + inheritedNonStaticMembers } - val allStaticMembers: Collection> + private val allStaticMembers: Collection> by ReflectProperties.lazySoft { declaredStaticMembers + inheritedStaticMembers } override val declaredMembers: Collection> by ReflectProperties.lazySoft { declaredNonStaticMembers + declaredStaticMembers } @@ -198,7 +198,5 @@ internal abstract class ClassBasedDeclarationContainerDescriptorImpl( companion object { private val DEFAULT_CONSTRUCTOR_MARKER = Class.forName("kotlin.jvm.internal.DefaultConstructorMarker") - - internal val LOCAL_PROPERTY_SIGNATURE = "".toRegex() } } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index 4295075..6e8efec 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -9,7 +9,7 @@ import kotlinx.reflect.lite.name.* import java.lang.reflect.* internal class ConstructorDescriptorImpl( - val kmCons: KmConstructor, + private val kmCons: KmConstructor, override val module: ModuleDescriptor, override val containingClass: ClassDescriptor<*>, override val container: ClassBasedDeclarationContainerDescriptor diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index bf90225..84cba41 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -50,29 +50,25 @@ internal abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, else -> throw KotlinReflectionInternalError("Could not compute caller for function: $this (member = $member)") } - // TODO: support bound receiver -> CallerImpl.BoundConstructor private fun createConstructorCaller(member: Constructor<*>): CallerImpl> { return CallerImpl.Constructor(member) } - // TODO: support bound receiver -> CallerImpl.Method.BoundInstance private fun createInstanceMethodCaller(member: Method): CallerImpl { return CallerImpl.Method.Instance(member) } - // TODO: support bound receiver -> CallerImpl.Method.BoundInstance private fun createStaticMethodCaller(member: Method): CallerImpl { return CallerImpl.Method.Static(member) } - // TODO: support bound receiver -> CallerImpl.Method.BoundInstance private fun createJvmStaticInObjectCaller(member: Method): CallerImpl { return CallerImpl.Method.JvmStaticInObject(member) } } internal class FunctionDescriptorImpl( - val kmFunction: KmFunction, + private val kmFunction: KmFunction, override val module: ModuleDescriptor, override val containingClass: ClassDescriptor<*>?, override val container: ClassBasedDeclarationContainerDescriptor diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 3b9a077..99fb627 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -30,11 +30,6 @@ internal class TypeParameterTable( fun get(id: Int): TypeParameterDescriptor = getOrNull(id) ?: error("Unknown type parameter with id=$id") - - companion object { - @JvmField - val EMPTY = TypeParameterTable(emptyList()) - } } internal class TypeProjection( @@ -48,7 +43,7 @@ internal fun KmType.toKotlinType(module: ModuleDescriptor, typeParameterTable: T when (classifier) { is KmClassifier.Class -> module.findClass(classifier.name) is KmClassifier.TypeParameter -> typeParameterTable.get(classifier.id) - is KmClassifier.TypeAlias -> TODO() + is KmClassifier.TypeAlias -> TODO("Support KmClassifier.TypeAlias") } } return KotlinType( diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index bfa2ccf..76c8426 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -187,10 +187,8 @@ internal class PropertyGetterDescriptorImpl( override fun computeFieldCaller(field: Field): Caller<*> = when { property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> - // TODO: bound receiver CallerImpl.FieldGetter.Instance(field) isJvmStaticProperty() -> - // TODO: bound receiver CallerImpl.FieldGetter.JvmStaticInObject(field) else -> CallerImpl.FieldGetter.Static(field) @@ -217,10 +215,8 @@ internal class PropertySetterDescriptorImpl( override fun computeFieldCaller(field: Field): Caller<*> = when { property.isJvmFieldPropertyInCompanionObject() || !Modifier.isStatic(field.modifiers) -> - // TODO: bound receiver CallerImpl.FieldSetter.Instance(field, isNotNullProperty()) isJvmStaticProperty() -> - // TODO: bound receiver CallerImpl.FieldSetter.JvmStaticInObject(field, isNotNullProperty()) else -> CallerImpl.FieldSetter.Static(field, isNotNullProperty()) diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 7c18bd1..92c8872 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -57,7 +57,7 @@ internal abstract class KCallableImpl: KCallable { } // Logic from: https://github.com/JetBrains/kotlin/blob/ea836fd46a1fef07d77c96f9d7e8d7807f793453/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KCallableImpl.kt#L116 - internal fun callDefaultMethod(args: Map, continuationArgument: Continuation<*>?): R { + private fun callDefaultMethod(args: Map, continuationArgument: Continuation<*>?): R { val parameters = parameters val arguments = ArrayList(parameters.size) var mask = 0 diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index b561808..a87ab93 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -16,16 +16,8 @@ package kotlinx.reflect.lite.impl -import kotlinx.metadata.* -import kotlinx.metadata.internal.common.* -import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.builtins.* -import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.impl.* -import kotlinx.reflect.lite.misc.* -import kotlinx.reflect.lite.name.* internal object ReflectionLiteImpl { fun loadClassMetadata(jClass: Class): KDeclarationContainer { diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 56adec8..3b69496 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -17,14 +17,14 @@ internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { when { descriptor.isVar -> - when (receiverCount) { - 0 -> return KMutableProperty0Impl(descriptor) - 1 -> return KMutableProperty1Impl(descriptor) + return when (receiverCount) { + 0 -> KMutableProperty0Impl(descriptor) + 1 -> KMutableProperty1Impl(descriptor) else -> TODO("Implement mutable properties for other numbers of receivers") - } - else -> when (receiverCount) { - 0 -> return KProperty0Impl(descriptor) - 1 -> return KProperty1Impl(descriptor) + } + else -> return when (receiverCount) { + 0 -> KProperty0Impl(descriptor) + 1 -> KProperty1Impl(descriptor) else -> TODO("Implement properties for other numbers of receivers") } } From f067ce416abc7817eba8080108b4e25615cffebe Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 1 Aug 2022 02:12:40 +0200 Subject: [PATCH 33/74] Fixed creation default caller creation + manyMaskArguments test --- .../impl/FunctionDescriptorImpl.kt | 27 +++++++++++++++---- .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 2 +- .../reflect/lite/misc/RuntimeTypeMapper.kt | 8 ------ .../lite/testData/callBy/manyMaskArguments.kt | 7 +++-- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 84cba41..9ee5430 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -4,11 +4,11 @@ import kotlinx.metadata.* import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.internal.* -import kotlinx.reflect.lite.misc.* +import kotlinx.reflect.lite.impl.KotlinReflectionInternalError +import kotlinx.reflect.lite.internal.ReflectProperties import kotlinx.reflect.lite.name.* import java.lang.reflect.* +import kotlinx.reflect.lite.misc.JvmFunctionSignature internal abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, FunctionDescriptor { override val isInline: Boolean @@ -32,9 +32,26 @@ internal abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, } override val defaultCaller: Caller<*>? by ReflectProperties.lazy { - defaultMember?.let { createCaller(it) } + defaultMember?.let { createDefaultCaller(it) } } + private fun createDefaultCaller(member: Member?) = + when (member) { + is Constructor<*> -> + createConstructorCaller(member) + is Method -> when { + // Note that static $default methods for @JvmStatic functions are generated differently in objects and companion objects. + // In objects, $default's signature does _not_ contain the additional object instance parameter, + // as opposed to companion objects where the first parameter is the companion object instance. + member.declaredAnnotations.find { it.annotationClass.java.name == "kotlin.jvm.JvmStatic" } != null && + containingClass?.isCompanion == false -> + createJvmStaticInObjectCaller(member) + else -> + createStaticMethodCaller(member) + } + else -> null + } + private fun createCaller(member: Member?) = when (member) { is Constructor<*> -> @@ -110,6 +127,6 @@ internal class FunctionDescriptorImpl( } override val defaultMember: Member? by ReflectProperties.lazy { - container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(caller.member!!.modifiers)) + container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(member!!.modifiers)) } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 137ae51..dbdb1ee 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -44,7 +44,7 @@ internal class KTypeImpl( get() = type.isMarkedNullable } -// Logis from: https://github.com/JetBrains/kotlin/blob/a6b51da3081b11dc2167a0cbb8ebca6f0e805d03/libraries/stdlib/jvm/src/kotlin/reflect/TypesJVM.kt#L37 +// Logic from: https://github.com/JetBrains/kotlin/blob/a6b51da3081b11dc2167a0cbb8ebca6f0e805d03/libraries/stdlib/jvm/src/kotlin/reflect/TypesJVM.kt#L37 fun KType.computeJavaType(forceWrapper: Boolean = false): Type { when (val classifier = classifier) { // TODO: support KTypeParameter diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index c98c386..32a771f 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -2,17 +2,9 @@ package kotlinx.reflect.lite.misc import kotlinx.metadata.jvm.* -import kotlinx.reflect.lite.* import kotlinx.reflect.lite.builtins.* -import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.FunctionDescriptor -import kotlinx.reflect.lite.descriptors.PropertyDescriptor import kotlinx.reflect.lite.descriptors.impl.* -import kotlinx.reflect.lite.descriptors.impl.FunctionDescriptorImpl -import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.impl.FakeOverridePropertyDescriptor import kotlinx.reflect.lite.name.* -import java.lang.reflect.* sealed class JvmFunctionSignature { abstract fun asString(): String diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt index 77d1e54..195ab07 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt @@ -49,7 +49,7 @@ class A { p39: Int = 39, p40: Int = 40, p41: Int = 41, - p42: Int = 42, + p42: Int, p43: Int = 43, p44: Int = 44, p45: Int = 45, @@ -89,10 +89,9 @@ class A { fun box(): String { val foo = (A::class.java).kotlinClass.members.single { it.name == "foo" } - val parameters = foo.parameters foo.callBy(mapOf( - //parameters.first() to A() - //parameters.single { it.name == "p42" } to 239 + foo.parameters.first() to A(), + foo.parameters.single { it.name == "p42" } to 239 )) return "OK" } From 910a0c9d9450c2d4013ba0f14234e151535ec980 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 1 Aug 2022 12:21:20 +0200 Subject: [PATCH 34/74] More tests for KCallable<*>.callBy --- .../impl/FunctionDescriptorImpl.kt | 15 +++++---- .../reflect/lite/impl/ReflectJvmMapping.kt | 3 ++ .../callBy/boundExtensionFunctionWA.kt | 22 +++++++++++++ .../callBy/boundExtensionPropertyAcessorWA.kt | 25 ++++++++++++++ .../testData/callBy/boundJvmStaticInObject.kt | 23 +++++++++++++ .../callBy/companionObject.kt | 3 +- .../callBy/extensionFunction.kt | 6 ++-- .../callBy/jvmStaticInCompanionObject.kt | 5 +-- .../lite/testData/callBy/jvmStaticInObject.kt | 5 +-- .../manyArgumentsNoneDefaultConstructor.kt | 7 ++-- .../manyArgumentsNoneDefaultFunction.kt | 5 +-- .../callBy/manyArgumentsOnlyOneDefault.kt | 5 +-- .../reflect/lite/tests/KCallableTest.kt | 27 +++++++++++++++ .../callBy/boundJvmStaticInObject.kt | 33 +++++++++++-------- .../callBy/inlineClassMembers.kt | 0 15 files changed, 150 insertions(+), 34 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/callBy/companionObject.kt (84%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/callBy/extensionFunction.kt (55%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/callBy/manyArgumentsOnlyOneDefault.kt (94%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/callBy/inlineClassMembers.kt (100%) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 9ee5430..d8a437f 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -35,19 +35,20 @@ internal abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, defaultMember?.let { createDefaultCaller(it) } } - private fun createDefaultCaller(member: Member?) = - when (member) { + private fun createDefaultCaller(defaultMember: Member) = + when (defaultMember) { is Constructor<*> -> - createConstructorCaller(member) + createConstructorCaller(defaultMember) is Method -> when { // Note that static $default methods for @JvmStatic functions are generated differently in objects and companion objects. // In objects, $default's signature does _not_ contain the additional object instance parameter, // as opposed to companion objects where the first parameter is the companion object instance. - member.declaredAnnotations.find { it.annotationClass.java.name == "kotlin.jvm.JvmStatic" } != null && - containingClass?.isCompanion == false -> - createJvmStaticInObjectCaller(member) + // TODO implement Annotated + (this.member as Method).declaredAnnotations.find { it.annotationClass.java.name == "kotlin.jvm.JvmStatic" } != null && + containingClass?.isCompanion == false -> + createJvmStaticInObjectCaller(defaultMember) else -> - createStaticMethodCaller(member) + createStaticMethodCaller(defaultMember) } else -> null } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index 07568b3..5f8eded 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -55,6 +55,9 @@ public val KClass.java: Class // Java reflection -> Kotlin reflection +/** + * Returns a [KDeclarationContainer] instance representing a Kotlin class or package. + */ val Class.kotlinClass: KDeclarationContainer @JvmName("getKotlinClass") get() = ReflectionLiteImpl.loadClassMetadata(this) diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt new file mode 100644 index 0000000..52ec57d --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt @@ -0,0 +1,22 @@ +package tests.callBy.boundExtensionFunctionWA + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* + +// WA for the use-case from this test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt +/** + * val sExtFun = "O"::extFun + * sExtFun.callBy(mapOf(sExtFun.parameters[0] to "K")) + */ + +fun String.extFun(k: String, s: String = "") = this + k + s + +fun box(): String { + val sExtFun = Class.forName("tests.callBy.boundExtensionFunctionWA.BoundExtensionFunctionWAKt").kotlinClass. + getMemberByName("extFun") as KFunction + return sExtFun.callBy(mapOf( + sExtFun.parameters[0] to "O", + sExtFun.parameters[1] to "K" + )) +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt new file mode 100644 index 0000000..f72b66c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt @@ -0,0 +1,25 @@ +package tests.callBy.boundExtensionPropertyAcessorWA + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* + +// WA for the use-case from this test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt +/** + * val String.plusK: String + * get() = this + "K" + * + * ("O"::plusK).getter.callBy(mapOf()) + */ + +val String.plusK: String + get() = this + "K" + +fun box(): String { + val plusK = Class.forName("tests.callBy.boundExtensionPropertyAcessorWA.BoundExtensionPropertyAcessorWAKt").kotlinClass. + getMemberByName("plusK") as KProperty1 + return plusK.getter.callBy(mapOf( + plusK.parameters[0] to "O" + ) + ) +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt new file mode 100644 index 0000000..6d5aaa2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt @@ -0,0 +1,23 @@ +package tests.callBy.boundJvmStaticInObjectWA + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* + +// WA for the use-case from this test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt + +object Host { + @JvmStatic fun concat(s1: String, s2: String, s3: String = "K", s4: String = "x") = + s1 + s2 + s3 + s4 +} + +fun box(): String { + val concat = (Host::class.java).kotlinClass.getMemberByName("concat") as KFunction + val concatParams = concat.parameters + return concat.callBy(mapOf( + concatParams[0] to Host, + concatParams[1] to "", + concatParams[2] to "O", + concatParams[4] to "" + )) +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/companionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt similarity index 84% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/companionObject.kt rename to src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt index 6088301..a1b719f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/companionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt @@ -1,5 +1,6 @@ package tests.callBy.companionObject +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals class C { @@ -9,7 +10,7 @@ class C { } fun box(): String { - val f = C.Companion::class.members.single { it.name == "foo" } + val f = (C.Companion::class.java).kotlinClass.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt similarity index 55% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/extensionFunction.kt rename to src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt index fdeb59d..3ef4706 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/extensionFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt @@ -1,11 +1,13 @@ package tests.callBy.extensionFunction +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals fun String.sum(other: String = "b") = this + other fun box(): String { - val f = String::sum + val f = Class.forName("tests.callBy.extensionFunction.ExtensionFunctionKt").kotlinClass.getMemberByName("sum") assertEquals("ab", f.callBy(mapOf(f.parameters.first() to "a"))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt index 1af744b..856944a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt @@ -2,6 +2,7 @@ package tests.callBy.jvmStaticInCompanionObject // KT-12915 IAE on callBy of JvmStatic function with default arguments +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals class C { @@ -12,7 +13,7 @@ class C { } fun box(): String { - val f = C.Companion::class.members.single { it.name == "foo" } + val f = (C.Companion::class.java).kotlinClass.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { @@ -31,4 +32,4 @@ fun box(): String { ))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt index 18380e9..2b84091 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt @@ -1,5 +1,6 @@ package tests.callBy.jvmStaticInObject +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals object Obj { @@ -8,7 +9,7 @@ object Obj { } fun box(): String { - val f = Obj::class.members.single { it.name == "foo" } + val f = (Obj::class.java).kotlinClass.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { @@ -27,4 +28,4 @@ fun box(): String { ))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt index 56338eb..6503f2d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt @@ -1,5 +1,7 @@ package tests.callBy.manyArgumentsNoneDefaultConstructor +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals // Generate: @@ -87,7 +89,8 @@ class A( } fun box(): String { - val f = A::class.constructors.single() + val aClass = (A::class.java).kotlinClass as KClass + val f = aClass.constructors.single() val parameters = f.parameters f.callBy(mapOf( @@ -95,4 +98,4 @@ fun box(): String { )) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt index 8253f82..3f83763 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt @@ -1,5 +1,6 @@ package tests.callBy.manyArgumentsNoneDefaultFunction +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals // Generate: @@ -87,7 +88,7 @@ class A { } fun box(): String { - val f = A::class.members.single { it.name == "foo" } + val f = (A::class.java).kotlinClass.members.single { it.name == "foo" } val parameters = f.parameters f.callBy(mapOf( @@ -96,4 +97,4 @@ fun box(): String { )) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/manyArgumentsOnlyOneDefault.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt similarity index 94% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/manyArgumentsOnlyOneDefault.kt rename to src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt index c1eecda..a293536 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/manyArgumentsOnlyOneDefault.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt @@ -1,5 +1,6 @@ package tests.callBy.manyArgumentsOnlyOneDefault +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals // Generate: @@ -87,7 +88,7 @@ class A { } fun box(): String { - val f = A::class.members.single { it.name == "foo" } + val f = (A::class.java).kotlinClass.members.single { it.name == "foo" } val parameters = f.parameters f.callBy(mapOf( @@ -96,4 +97,4 @@ fun box(): String { )) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index 65efe96..dbaf525 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -83,5 +83,32 @@ class KCallableTest { @Test fun testManyMaskArguments() = test("callBy.manyMaskArguments") { tests.callBy.manyMaskArguments.box() } + @Test + fun testManyArgumentsNoneDefaultFunction() = test("callBy.manyArgumentsNoneDefaultFunction") { tests.callBy.manyArgumentsNoneDefaultFunction.box() } + + @Test + fun testManyArgumentsNoneDefaultConstructor() = test("callBy.manyArgumentsNoneDefaultConstructor") { tests.callBy.manyArgumentsNoneDefaultConstructor.box() } + + @Test + fun testJvmStaticInObject() = test("callBy.jvmStaticInObject") { tests.callBy.jvmStaticInObject.box() } + + @Test + fun testJvmStaticInCompanionObject() = test("callBy.jvmStaticInCompanionObject") { tests.callBy.jvmStaticInCompanionObject.box() } + + @Test + fun testManyArgumentsOnlyOneDefault() = test("callBy.manyArgumentsOnlyOneDefault") { tests.callBy.manyArgumentsOnlyOneDefault.box() } + @Test + fun testExtensionFunction() = test("callBy.extensionFunction") { tests.callBy.extensionFunction.box() } + + @Test + fun testBoundExtensionFunctionWA() = test("callBy.boundExtensionFunctionWA") { tests.callBy.boundExtensionFunctionWA.box() } + + @Test + fun testBoundExtensionPropertyAcessorWA() = test("callBy.boundExtensionPropertyAcessorWA") { tests.callBy.boundExtensionPropertyAcessorWA.box() } + @Test + fun testBoundJvmStaticInObjectWA() = test("callBy.boundJvmStaticInObjectWA") { tests.callBy.boundJvmStaticInObjectWA.box() } + + @Test + fun testCompanionObject() = test("callBy.companionObject") { tests.callBy.companionObject.box() } } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt index 5975098..4f058a6 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt @@ -1,16 +1,21 @@ package tests.callBy.boundJvmStaticInObject -//object Host { -// @JvmStatic fun concat(s1: String, s2: String, s3: String = "K", s4: String = "x") = -// s1 + s2 + s3 + s4 -//} -// -//fun box(): String { -// val concat = Host::concat -// val concatParams = concat.parameters -// return concat.callBy(mapOf( -// concatParams[0] to "", -// concatParams[1] to "O", -// concatParams[3] to "" -// )) -//} +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* + +object Host { + @JvmStatic fun concat(s1: String, s2: String, s3: String = "K", s4: String = "x") = + s1 + s2 + s3 + s4 +} + +fun box(): String { + val concat = (Host::class.java).kotlinClass.getMemberByName("concat") as KFunction + val concatParams = concat.parameters + return concat.callBy(mapOf( + concatParams[0] to Host, + concatParams[1] to "", + concatParams[2] to "O", + concatParams[4] to "" + )) +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassMembers.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassMembers.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/inlineClassMembers.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassMembers.kt From 414a973e6dc9105623d9b1ba279c6d75c057f923 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 1 Aug 2022 16:16:52 +0200 Subject: [PATCH 35/74] KCallable<*>.callBy tests: WA for bound receiver use-cases --- ...nObject.kt => boundJvmStaticInObjectWA.kt} | 0 .../callBy/defaultAndNonDefaultIntertwined.kt | 22 +++++++++++++++++ .../callBy/defaultInSuperClassFakeOverride.kt | 24 +++++++++++++++++++ .../reflect/lite/tests/KCallableTest.kt | 10 ++++++++ .../callBy/defaultAndNonDefaultIntertwined.kt | 17 ------------- 5 files changed, 56 insertions(+), 17 deletions(-) rename src/test/java/kotlinx/reflect/lite/testData/callBy/{boundJvmStaticInObject.kt => boundJvmStaticInObjectWA.kt} (100%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultAndNonDefaultIntertwined.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObject.kt rename to src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt new file mode 100644 index 0000000..898ac02 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt @@ -0,0 +1,22 @@ +package tests.callBy.defaultAndNonDefaultIntertwined + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +fun foo(a: String, b: String = "b", c: String, d: String = "d", e: String) = + a + b + c + d + e + +fun box(): String { + val foo = Class.forName("tests.callBy.defaultAndNonDefaultIntertwined.DefaultAndNonDefaultIntertwinedKt").kotlinClass + .getMemberByName("foo") as KFunction + val p = foo.parameters + assertEquals("abcde", foo.callBy(mapOf( + p[0] to "a", + p[2] to "c", + p[4] to "e" + ))) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt new file mode 100644 index 0000000..3ca2b28 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt @@ -0,0 +1,24 @@ +package tests.callBy.defaultInSuperClassFakeOverride + +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + +// Part of this test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperClass.kt +// TODO: support descriptors for overrides (for now descriptors for fake overrides only are supported) +open class A { + open fun foo(a: String, b: String = "b") = b + a +} + +class B : A() + +fun box(): String { + val f = (B::class.java).kotlinClass.getMemberByName("foo") + + assertEquals("ba", f.callBy(mapOf( + f.parameters.first() to B(), + f.parameters.single { it.name == "a" } to "a" + ))) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index dbaf525..99e9ffc 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -83,6 +83,9 @@ class KCallableTest { @Test fun testManyMaskArguments() = test("callBy.manyMaskArguments") { tests.callBy.manyMaskArguments.box() } + @Test + fun testDefaultAndNonDefaultIntertwined() = test("callBy.defaultAndNonDefaultIntertwined") { tests.callBy.defaultAndNonDefaultIntertwined.box() } + @Test fun testManyArgumentsNoneDefaultFunction() = test("callBy.manyArgumentsNoneDefaultFunction") { tests.callBy.manyArgumentsNoneDefaultFunction.box() } @@ -106,9 +109,16 @@ class KCallableTest { @Test fun testBoundExtensionPropertyAcessorWA() = test("callBy.boundExtensionPropertyAcessorWA") { tests.callBy.boundExtensionPropertyAcessorWA.box() } + @Test fun testBoundJvmStaticInObjectWA() = test("callBy.boundJvmStaticInObjectWA") { tests.callBy.boundJvmStaticInObjectWA.box() } @Test fun testCompanionObject() = test("callBy.companionObject") { tests.callBy.companionObject.box() } + + @Test + fun testDefaultInSuperClassFakeOverride() = test("callBy.defaultInSuperClassFakeOverride") { tests.callBy.defaultInSuperClassFakeOverride.box() } + + @Test + fun testDefaultInSuperInterface() = test("callBy.defaultInSuperInterface") { tests.callBy.defaultInSuperInterface.box() } } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultAndNonDefaultIntertwined.kt deleted file mode 100644 index 9e72870..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultAndNonDefaultIntertwined.kt +++ /dev/null @@ -1,17 +0,0 @@ -package tests.callBy.defaultAndNonDefaultIntertwined - -import kotlin.test.assertEquals - -fun foo(a: String, b: String = "b", c: String, d: String = "d", e: String) = - a + b + c + d + e - -fun box(): String { - val p = ::foo.parameters - assertEquals("abcde", ::foo.callBy(mapOf( - p[0] to "a", - p[2] to "c", - p[4] to "e" - ))) - - return "OK" -} \ No newline at end of file From 4c35c3681ab8b2c5f9f1a629190b8bd58bb95f3c Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 3 Aug 2022 18:22:21 +0200 Subject: [PATCH 36/74] KCallable<*>.parameters: more tests added --- .../java/kotlinx/reflect/lite/KParameter.kt | 2 +- .../reflect/lite/descriptors/descriptors.kt | 2 +- .../reflect/lite/impl/KParameterImpl.kt | 10 +++-- .../lite/testData/parameters/bigArity.kt | 13 ++---- .../parameters/boundInnerClassConstructor.kt | 32 -------------- .../parameters/boundObjectMemberReferences.kt | 34 --------------- .../testData/parameters/boundReferences.kt | 37 ---------------- .../functionParameterNameAndIndex.kt | 36 ++++++++++++++++ .../parameters/innerClassConstructor.kt | 31 ++++++++++++++ ...anceExtensionReceiverAndValueParameters.kt | 42 +++++++++++++++++++ .../instanceParameterOfFakeOverride.kt | 26 ++++++++++++ .../testData/parameters/isMarkedNullable.kt | 22 ++++++++++ .../lite/testData/parameters/isOptional.kt | 12 +++--- .../reflect/lite/testData/parameters/kinds.kt | 21 ++++++++++ .../parameters/objectMemberReferences.kt | 26 ++++++++++++ .../testData/parameters/propertySetter.kt | 15 ++++--- .../lite/testData/parameters/references.kt | 34 +++++++++++++++ .../reflect/lite/tests/KParameterTest.kt | 29 +++++++++++-- .../parameters/boundInnerClassConstructor.kt | 27 ++++++++++++ .../parameters/boundObjectMemberReferences.kt | 23 ++++++++++ .../parameters/boundReferences.kt | 31 ++++++++++++++ ...nceExtensionReceiverAndValueParameters1.kt | 36 ++++++++++++++++ .../instanceParameterOfFakeOverride1.kt | 30 +++++++++++++ .../isOptionalOverridesParameters.kt | 26 ++++++++++++ 24 files changed, 464 insertions(+), 133 deletions(-) delete mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt diff --git a/src/main/java/kotlinx/reflect/lite/KParameter.kt b/src/main/java/kotlinx/reflect/lite/KParameter.kt index 60345fd..e21ae5a 100644 --- a/src/main/java/kotlinx/reflect/lite/KParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KParameter.kt @@ -39,7 +39,7 @@ public interface KParameter : KAnnotatedElement { * Type of this parameter. For a `vararg` parameter, this is the type of the corresponding array, * not the individual element. */ - public val type: KType? + public val type: KType /** * Kind of this parameter. diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 14fde4f..65e3afa 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -134,7 +134,7 @@ internal interface FunctionDescriptor : CallableDescriptor { internal interface ParameterDescriptor : DeclarationDescriptor { val containingDeclaration: CallableDescriptor - val type: KotlinType? + val type: KotlinType } internal interface ValueParameterDescriptor : ParameterDescriptor { diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt index b31e25f..cf7e981 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -8,11 +8,13 @@ internal class KParameterImpl( override val index: Int, override val kind: KParameter.Kind ): KParameter { - override val name: String - get() = descriptor.name + override val name: String? + get() = (descriptor as? ValueParameterDescriptor)?.let { + if (it.name.startsWith("<")) null else it.name + } - override val type: KType? - get() = descriptor.type?.let(::KTypeImpl) + override val type: KType + get() = descriptor.type.let(::KTypeImpl) override val isOptional: Boolean get() = (descriptor as? ValueParameterDescriptor)?.declaresDefaultValue ?: false diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt index bd9309c..c569dd1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt @@ -1,5 +1,6 @@ package tests.parameters.bigArity +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals @@ -12,17 +13,11 @@ data class BigDataClass( ) fun box(): String { - // TODO: ::copy is not supported, kotlin.reflect.KCallable.parameters is called + val copy = (BigDataClass::class.java).kotlinClass.getMemberByName("copy") assertEquals( "[null, p00, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, " + "p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29]", - BigDataClass::copy.parameters.map { it.name }.toString() - ) - val kClass = BigDataClass::class.java.toLiteKClass() - assertEquals( - "[p00, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, " + - "p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29]", - kClass.constructors.first().parameters.map { it.name }.toString() + copy.parameters.map { it.name }.toString() ) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt deleted file mode 100644 index 483ade1..0000000 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundInnerClassConstructor.kt +++ /dev/null @@ -1,32 +0,0 @@ -package tests.parameters.boundInnerClassConstructor - -import kotlinx.reflect.lite.tests.* -import kotlin.test.assertEquals -import kotlinx.reflect.lite.KParameter - -class Outer(val s1: String) { - inner class Inner(val s2: String, val s3: String = "K") { - val result = s1 + s2 + s3 - } -} - -fun KParameter.check(name: String) { - assertEquals(name, this.name!!) - assertEquals(KParameter.Kind.VALUE, this.kind) -} - -fun box(): String { - // TODO: metadata of Outer("O")::Inner is KotlinClassMetadata.Synthetic - //val ctor = Outer("O")::Inner::class.java.toLiteKClass().constructors.first() - - // as KotlinClassMetadata.Class is only supported now, extract Inner via nestedClasses api - val innerClass = Outer("O")::class.java.toLiteKClass().nestedClasses.first() - assertEquals("Inner", innerClass.simpleName) - val ctor = innerClass.constructors.first() - val ctorPararms = ctor.parameters - - ctorPararms[0].check("s2") - ctorPararms[1].check("s3") - - return "OK" -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt deleted file mode 100644 index d58508d..0000000 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundObjectMemberReferences.kt +++ /dev/null @@ -1,34 +0,0 @@ -package tests.parameters.boundObjectMemberReferences - -import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.tests.* -import kotlin.reflect.* -import kotlin.reflect.jvm.* -import kotlin.test.* - -object Host { - fun foo(i: Int, s: String) {} -} - -fun box(): String { - val foo = Host::class.java.toLiteKClass().members.find { it.name == "foo" } - ?: error("function foo is not found in the Host object") - val fooParams = foo.parameters - - //assertEquals(2, fooParams.size) - - //assertEquals("i", fooParams[0].name) - // TODO: javaType is not KType.javaType is not supported - //assertEquals(Int::class.java, fooParams[0].type.javaType) - - assertEquals("i", fooParams[0].name) - assertEquals("java.lang.Integer", (fooParams[0].type!!.classifier as KClassImpl<*>).qualifiedName) - - // TODO: javaType is not KType.javaType is not supported - //assertEquals(String::class.java, fooParams[1].type.javaType) - - assertEquals("s", fooParams[1].name) - assertEquals("java.lang.String", (fooParams[1].type!!.classifier as KClassImpl<*>).qualifiedName) - - return "OK" -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt deleted file mode 100644 index e6604ae..0000000 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/boundReferences.kt +++ /dev/null @@ -1,37 +0,0 @@ -package tests.parameters.boundReferences - -import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.tests.* -import kotlin.test.* - -class C { - fun foo() {} - var bar = "OK" -} - -fun C.extFun(i: Int) {} - -fun KParameter.check(name: String) { - assertEquals(name, this.name!!) - assertEquals(KParameter.Kind.VALUE, this.kind) -} - -fun box(): String { - val kClass = C::class.java.toLiteKClass() - val cFoo = kClass.members.find { it.name == "foo" } as KFunction - val cBar = kClass.members.find { it.name == "bar" } as KProperty - // TODO extension functions are not supported yet - //val cExtFun = kClass.members.find { it.name == "extFun" } as KFunction - - assertEquals(1, cFoo.parameters.size) - assertFalse(cBar.isConst) - assertFalse(cBar.isLateInit) - - // TODO mutable properties are not supported yet - //assertEquals(1, cBar.setter.parameters.size) - - //assertEquals(1, cExtFun.parameters.size) - //cExtFun.parameters[0].check("i") - - return "OK" -} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt new file mode 100644 index 0000000..7092178 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt @@ -0,0 +1,36 @@ +package tests.parameters.functionParameterNameAndIndex + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +fun foo(bar: String): Int = bar.length + +class A(val c: String) { + fun foz(baz: Int) {} + + fun Double.mext(mez: Long) {} +} + +fun Int.qux(zux: String) {} + +fun checkParameters(f: KCallable<*>, names: List) { + val params = f.parameters + assertEquals(names, params.map { it.name }) + assertEquals(params.indices.toList(), params.map { it.index }) +} + +fun box(): String { + val clazz = Class.forName("tests.parameters.functionParameterNameAndIndex.FunctionParameterNameAndIndexKt").kotlinClass + checkParameters(clazz.getMemberByName("box"), listOf()) + checkParameters(clazz.getMemberByName("foo"), listOf("bar")) + checkParameters((A::class.java).kotlinClass.getMemberByName("foz"), listOf(null, "baz")) + checkParameters(clazz.getMemberByName("qux"), listOf(null, "zux")) + + checkParameters((A::class.java).kotlinClass.getMemberByName("mext"), listOf(null, null, "mez")) + + checkParameters(((A::class.java).kotlinClass as KClass).constructors.first(), listOf("c")) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt new file mode 100644 index 0000000..89f11b3 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt @@ -0,0 +1,31 @@ +package tests.parameters.innerClassConstructor + +// Logic from this test, but inner class constructor has no bound receiver: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt +// Bound receivers not supported for now + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlin.test.assertEquals + +class Outer(val s1: String) { + inner class Inner(val s2: String, val s3: String = "K") { + val result = s1 + s2 + s3 + } +} + +fun KParameter.check(name: String?, kind: KParameter.Kind) { + assertEquals(name, this.name) + assertEquals(kind, this.kind) +} + +fun box(): String { + val inner = ((Outer::class.java).kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" } + val ctor = inner.constructors.first() + val ctorPararms = ctor.parameters + + ctorPararms[0].check(null, KParameter.Kind.INSTANCE) + ctorPararms[1].check("s2", KParameter.Kind.VALUE) + ctorPararms[2].check("s3", KParameter.Kind.VALUE) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt new file mode 100644 index 0000000..2b590e4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt @@ -0,0 +1,42 @@ +package tests.parameters.instanceExtensionReceiverAndValueParameters + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +class A { + fun String.memExt(param: Int) {} +} + +fun topLevel() {} + +fun Int.ext(vararg o: Any) {} + +fun KParameter.check(name: String?, kind: KParameter.Kind) { + assertEquals(name, this.name) + assertEquals(kind, this.kind) +} + +fun box(): String { + (A::class.java).kotlinClass.getMemberByName("memExt").let { + assertEquals(3, it.parameters.size) + it.parameters[0].check(null, KParameter.Kind.INSTANCE) + it.parameters[1].check(null, KParameter.Kind.EXTENSION_RECEIVER) + it.parameters[2].check("param", KParameter.Kind.VALUE) + } + + Class.forName("tests.parameters.instanceExtensionReceiverAndValueParameters.InstanceExtensionReceiverAndValueParametersKt") + .kotlinClass.getMemberByName("topLevel").let { + assertEquals(0, it.parameters.size) + } + + Class.forName("tests.parameters.instanceExtensionReceiverAndValueParameters.InstanceExtensionReceiverAndValueParametersKt") + .kotlinClass.getMemberByName("ext").let { + assertEquals(2, it.parameters.size) + it.parameters[0].check(null, KParameter.Kind.EXTENSION_RECEIVER) + it.parameters[1].check("o", KParameter.Kind.VALUE) + } + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt new file mode 100644 index 0000000..5f0d6d0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt @@ -0,0 +1,26 @@ +package tests.parameters.instanceParameterOfFakeOverride + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +open class A { + val property = "OK" + + fun function() {} +} + +class B : A() + +fun box(): String { + val bProperty = (B::class.java).kotlinClass.getMemberByName("property") + assertEquals(KParameter.Kind.INSTANCE, bProperty.parameters[0].kind) + assertEquals(B::class.java, bProperty.parameters[0].type.javaType) + + val bFunction = (B::class.java).kotlinClass.getMemberByName("function") + assertEquals(KParameter.Kind.INSTANCE, bFunction.parameters[0].kind) + assertEquals(B::class.java, bFunction.parameters[0].type.javaType) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt new file mode 100644 index 0000000..5a5a1ba --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt @@ -0,0 +1,22 @@ +package tests.parameters.isMarkedNullable + +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class A { + fun foo(p1: String, p2: String?, p3: T, p4: U, p5: U?) { } +} + +fun Any?.ext() {} + +fun box(): String { + val ps = (A::class.java).kotlinClass.getMemberByName("foo").parameters.map { it.type.isMarkedNullable } + assertEquals(listOf(false, false, true, false, false, true), ps) + + val ext = Class.forName("tests.parameters.isMarkedNullable.IsMarkedNullableKt").kotlinClass.getMemberByName("ext") + assertTrue(ext.parameters.single().type.isMarkedNullable) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt index e6e96c6..7952f07 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt @@ -1,7 +1,11 @@ package tests.parameters.isOptional +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.* +// Part of the test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt +// Only fake overrides are supported for now open class A { open fun foo(x: Int, y: Int = 1) {} } @@ -16,11 +20,9 @@ class C : A() fun Int.extFun() {} fun box(): String { - assertEquals(listOf(false, false, true), A::foo.parameters.map { it.isOptional }) - assertEquals(listOf(false, false, true), B::foo.parameters.map { it.isOptional }) - assertEquals(listOf(false, false, true), C::foo.parameters.map { it.isOptional }) + assertEquals(listOf(false, false, true), (A::class.java).kotlinClass.getMemberByName("foo").parameters.map { it.isOptional }) - assertFalse(Int::extFun.parameters.single().isOptional) + assertFalse(Class.forName("tests.parameters.isOptional.IsOptionalKt").kotlinClass.getMemberByName("extFun").parameters.single().isOptional) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt new file mode 100644 index 0000000..3664fb9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt @@ -0,0 +1,21 @@ +package tests.parameters.kinds + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +class A { + fun Int.foo(x: String) {} + + inner class Inner(s: String) {} +} + +fun box(): String { + val foo = A::class.java.kotlinClass.getMemberByName("foo") + val inner = (A::class.java.kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" } + assertEquals(listOf(KParameter.Kind.INSTANCE, KParameter.Kind.EXTENSION_RECEIVER, KParameter.Kind.VALUE), foo.parameters.map { it.kind }) + assertEquals(listOf(KParameter.Kind.INSTANCE, KParameter.Kind.VALUE), inner.constructors.first().parameters.map { it.kind }) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt new file mode 100644 index 0000000..bdd364a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt @@ -0,0 +1,26 @@ +package tests.parameters.objectMemberReferences + +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +object Host { + fun foo(i: Int, s: String) {} +} + +fun box(): String { + val fooParams = (Host::class.java).kotlinClass.getMemberByName("foo").parameters + + assertEquals(3, fooParams.size) + + assertEquals(null, fooParams[0].name) + assertEquals("i", fooParams[1].name) + // TODO: now fooParams[1].type.javaType == java.lang.Integer + assertEquals(Int::class.java, fooParams[1].type.javaType) + + assertEquals("s", fooParams[2].name) + // TODO: now fooParams[1].type.javaType == java.lang.String + assertEquals(String::class.java, fooParams[2].type.javaType) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt index fa49fab..b73adbd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt @@ -1,6 +1,8 @@ package tests.parameters.propertySetter -import kotlin.reflect.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals var default: Int = 0 @@ -11,16 +13,17 @@ var defaultAnnotated: Int = 0 var custom: Int = 0 set(myName: Int) {} -fun checkPropertySetterParam(property: KMutableProperty<*>, name: String?) { +fun checkPropertySetterParam(property: KMutableProperty0<*>, name: String?) { val parameter = property.setter.parameters.single() assertEquals(0, parameter.index) assertEquals(name, parameter.name) } fun box(): String { - checkPropertySetterParam(::default, null) - checkPropertySetterParam(::defaultAnnotated, null) - checkPropertySetterParam(::custom, "myName") + val clazz = Class.forName("tests.parameters.propertySetter.PropertySetterKt").kotlinClass + checkPropertySetterParam(clazz.getMemberByName("default") as KMutableProperty0, null) + checkPropertySetterParam(clazz.getMemberByName("defaultAnnotated") as KMutableProperty0, null) + checkPropertySetterParam(clazz.getMemberByName("custom") as KMutableProperty0, "myName") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt new file mode 100644 index 0000000..5b12573 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt @@ -0,0 +1,34 @@ +package tests.parameters.references + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + +class C { + fun foo() {} + var bar = "OK" +} + +fun C.extFun(i: Int) {} + +fun KParameter.check(name: String?, kind: KParameter.Kind) { + assertEquals(name, this.name) + assertEquals(kind, this.kind) +} + +fun box(): String { + val cFoo = (C::class.java).kotlinClass.getMemberByName("foo") + val cBar = (C::class.java).kotlinClass.getMemberByName("bar") as KMutableProperty1 + val cExtFun = Class.forName("tests.parameters.references.ReferencesKt").kotlinClass.getMemberByName("extFun") + + assertEquals(1, cFoo.parameters.size) + assertEquals(1, cBar.getter.parameters.size) + assertEquals(2, cBar.setter.parameters.size) + + assertEquals(2, cExtFun.parameters.size) + cExtFun.parameters[0].check(null, KParameter.Kind.EXTENSION_RECEIVER) + cExtFun.parameters[1].check("i", KParameter.Kind.VALUE) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt index abd3ed3..d6c952d 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt @@ -7,11 +7,32 @@ class KParameterTest { fun testBigArity() = test("parameters.bigArity") { tests.parameters.bigArity.box() } @Test - fun testBoundInnerClassConstructor() = test("parameters.boundInnerClassConstructor") { tests.parameters.boundInnerClassConstructor.box() } + fun testInnerClassConstructor() = test("parameters.innerClassConstructor") { tests.parameters.innerClassConstructor.box() } @Test - fun testBoundObjectMemberReferences() = test("parameters.boundObjectMemberReferences") { tests.parameters.boundObjectMemberReferences.box() } + fun testObjectMemberReferences() = test("parameters.objectMemberReferences") { tests.parameters.objectMemberReferences.box() } @Test - fun testBoundReferences() = test("parameters.boundReferences") { tests.parameters.boundReferences.box() } -} \ No newline at end of file + fun testReferences() = test("parameters.references") { tests.parameters.references.box() } + + @Test + fun testFunctionParameterNameAndIndex() = test("parameters.functionParameterNameAndIndex") { tests.parameters.functionParameterNameAndIndex.box() } + + @Test + fun testInstanceExtensionReceiverAndValueParameters() = test("parameters.instanceExtensionReceiverAndValueParameters") { tests.parameters.instanceExtensionReceiverAndValueParameters.box() } + + @Test + fun testInstanceParameterOfFakeOverride() = test("parameters.instanceParameterOfFakeOverride") { tests.parameters.instanceParameterOfFakeOverride.box() } + + @Test + fun testIsMarkedNullable() = test("parameters.isMarkedNullable") { tests.parameters.isMarkedNullable.box() } + + @Test + fun testIsOptional() = test("parameters.isOptional") { tests.parameters.isOptional.box() } + + @Test + fun testKinds() = test("parameters.kinds") { tests.parameters.kinds.box() } + + @Test + fun testPropertySetter() = test("parameters.propertySetter") { tests.parameters.propertySetter.box() } +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt new file mode 100644 index 0000000..8b40213 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt @@ -0,0 +1,27 @@ +package tests.parameters.boundInnerClassConstructor + +// Simi + +import kotlin.reflect.KParameter +import kotlin.test.assertEquals + +class Outer(val s1: String) { + inner class Inner(val s2: String, val s3: String = "K") { + val result = s1 + s2 + s3 + } +} + +fun KParameter.check(name: String) { + assertEquals(name, this.name!!) + assertEquals(KParameter.Kind.VALUE, this.kind) +} + +fun box(): String { + val ctor = Outer("O")::Inner + val ctorPararms = ctor.parameters + + ctorPararms[0].check("s2") + ctorPararms[1].check("s3") + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt new file mode 100644 index 0000000..83e65e5 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt @@ -0,0 +1,23 @@ +package tests.parameters.boundObjectMemberReferences + +import kotlin.reflect.* +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +object Host { + fun foo(i: Int, s: String) {} +} + +fun box(): String { + val fooParams = Host::foo.parameters + + assertEquals(2, fooParams.size) + + assertEquals("i", fooParams[0].name) + assertEquals(Int::class.java, fooParams[0].type.javaType) + + assertEquals("s", fooParams[1].name) + assertEquals(String::class.java, fooParams[1].type.javaType) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt new file mode 100644 index 0000000..103db76 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt @@ -0,0 +1,31 @@ +package tests.parameters.boundReferences + +import kotlin.reflect.* +import kotlin.test.* + +class C { + fun foo() {} + var bar = "OK" +} + +fun C.extFun(i: Int) {} + +fun KParameter.check(name: String) { + assertEquals(name, this.name!!) + assertEquals(KParameter.Kind.VALUE, this.kind) +} + +fun box(): String { + val cFoo = C()::foo + val cBar = C()::bar + val cExtFun = C()::extFun + + assertEquals(0, cFoo.parameters.size) + assertEquals(0, cBar.getter.parameters.size) + assertEquals(1, cBar.setter.parameters.size) + + assertEquals(1, cExtFun.parameters.size) + cExtFun.parameters[0].check("i") + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt new file mode 100644 index 0000000..139e0c4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt @@ -0,0 +1,36 @@ +package tests.parameters.instanceExtensionReceiverAndValueParameters1 + +import kotlin.reflect.full.* +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class A { + fun String.memExt(param: Int) {} +} + +fun topLevel() {} + +fun Int.ext(vararg o: Any) {} + +fun box(): String { + A::class.members.single { it.name == "memExt" }.let { + assertNotNull(it.instanceParameter) + assertNotNull(it.extensionReceiverParameter) + assertEquals(1, it.valueParameters.size) + } + + ::topLevel.let { + assertNull(it.instanceParameter) + assertNull(it.extensionReceiverParameter) + assertEquals(0, it.valueParameters.size) + } + + Int::ext.let { + assertNull(it.instanceParameter) + assertNotNull(it.extensionReceiverParameter) + assertEquals(1, it.valueParameters.size) + } + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt new file mode 100644 index 0000000..2c780d4 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt @@ -0,0 +1,30 @@ +package tests.parameters.instanceParameterOfFakeOverride1 + +import kotlin.reflect.full.instanceParameter +import kotlin.reflect.jvm.jvmErasure +import kotlin.reflect.jvm.javaType +import kotlin.test.assertEquals + +open class A { + val property = "OK" + + fun function() {} +} + +class B : A() + +fun box(): String { + assertEquals(B::class, B::property.instanceParameter!!.type.jvmErasure) + assertEquals(B::class.java, B::property.instanceParameter!!.type.javaType) + assertEquals(B::class, B::function.instanceParameter!!.type.jvmErasure) + assertEquals(B::class.java, B::function.instanceParameter!!.type.javaType) + + val property = B::class.members.single { it.name == "property" } + val function = B::class.members.single { it.name == "function" } + assertEquals(B::class, property.instanceParameter!!.type.jvmErasure) + assertEquals(B::class.java, property.instanceParameter!!.type.javaType) + assertEquals(B::class, function.instanceParameter!!.type.jvmErasure) + assertEquals(B::class.java, function.instanceParameter!!.type.javaType) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt new file mode 100644 index 0000000..b149499 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt @@ -0,0 +1,26 @@ +package tests.parameters.isOptionalOverridesParameters + +import kotlin.test.* + +open class A { + open fun foo(x: Int, y: Int = 1) {} +} + +class B : A() { + override fun foo(x: Int, y: Int) {} +} + +class C : A() + + +fun Int.extFun() {} + +fun box(): String { + assertEquals(listOf(false, false, true), A::foo.parameters.map { it.isOptional }) + assertEquals(listOf(false, false, true), B::foo.parameters.map { it.isOptional }) + assertEquals(listOf(false, false, true), C::foo.parameters.map { it.isOptional }) + + assertFalse(Int::extFun.parameters.single().isOptional) + + return "OK" +} From 83284b8297dcb1ba40dfb3c9a70999b66ea81f49 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 3 Aug 2022 19:01:59 +0200 Subject: [PATCH 37/74] KProperty.isAccessible: more tests added --- .../isAccessible/privateClassVar.kt | 38 ++++++++++++++++ ...vatePropertyCallIsAccessibleOnAccessors.kt | 44 +++++++++++++++++++ .../isAccessible/privateToThisAccessors.kt | 20 +++++++++ .../isAccessible/protectedClassVar.kt | 37 ++++++++++++++++ .../publicClassValAccessible.kt | 8 ++-- .../propertyOfNestedClassAndArrayType.kt | 9 ++-- .../properties/allVsDeclared.kt | 25 +++++++++++ .../callPrivatePropertyFromGetProperties.kt | 22 ++++++++++ .../properties/fakeOverridesInSubclass.kt | 17 +++++++ ...nericClassLiteralPropertyReceiverIsStar.kt | 13 ++++++ .../properties/genericOverriddenProperty.kt | 0 .../properties/genericProperty.kt | 0 ...getExtensionPropertiesMutableVsReadonly.kt | 29 ++++++++++++ .../getPropertiesMutableVsReadonly.kt | 22 ++++++++++ .../properties/invokeKProperty.kt | 9 ++++ .../annotationCompanionWithAnnotation.kt | 19 ++++++++ .../properties/jvmField/interfaceCompanion.kt | 21 +++++++++ .../interfaceCompanionWithAnnotation.kt | 19 ++++++++ .../memberAndMemberExtensionWithSameName.kt | 26 +++++++++++ .../properties/privateClassVal.kt | 31 +++++++++++++ .../privateFakeOverrideFromSuperclass.kt | 10 +++++ .../properties/privateJvmStaticVarInObject.kt | 0 .../properties/simpleGetProperties.kt | 23 ++++++++++ 23 files changed, 435 insertions(+), 7 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt rename src/test/java/kotlinx/reflect/lite/testData/properties/{ => isAccessible}/publicClassValAccessible.kt (58%) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/genericOverriddenProperty.kt (100%) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/genericProperty.kt (100%) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/properties/privateJvmStaticVarInObject.kt (100%) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt new file mode 100644 index 0000000..3f2ef5a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt @@ -0,0 +1,38 @@ +package tests.properties.privateClassVar + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + +class A { + private var value = 0 + + fun ref() = (A::class.java).kotlinClass.getMemberByName("value") as KMutableProperty1 +} + +fun box(): String { + val a = A() + val p = a.ref() + try { + p.set(a, 1) + return "Fail: private property is accessible by default" + } catch(e: IllegalAccessException) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$FieldSetter cannot access a member of class tests.properties.privateClassVar.A with modifiers \"private\"", e.message) + } + + p.isAccessible = true + + p.set(a, 2) + p.get(a) + + p.isAccessible = false + try { + p.set(a, 3) + return "Fail: setAccessible(false) had no effect" + } catch(e: IllegalAccessException) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$FieldSetter cannot access a member of class tests.properties.privateClassVar.A with modifiers \"private\"", e.message) + } + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt new file mode 100644 index 0000000..244af7b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt @@ -0,0 +1,44 @@ +package tests.properties.privatePropertyCallIsAccessibleOnAccessors + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + +class A(private var foo: String) + +fun box(): String { + val a = A("") + val foo = (A::class.java).kotlinClass.getMemberByName("foo") as KMutableProperty1 + + assertTrue(!foo.isAccessible) + assertTrue(!foo.getter.isAccessible) + assertTrue(!foo.setter.isAccessible) + + val setter = foo.setter + setter.isAccessible = true + assertTrue(setter.isAccessible) + assertTrue(foo.setter.isAccessible) + + // After we invoked isAccessible on a setter, the underlying field and thus the getter are also accessible + assertTrue(foo.isAccessible) + assertTrue(foo.getter.isAccessible) + setter.call(a, "A") + assertEquals("A", foo.getter.call(a)) + + setter.isAccessible = false + assertFalse(setter.isAccessible) + assertFalse(foo.setter.isAccessible) + assertFalse(foo.getter.isAccessible) + assertFalse(foo.isAccessible) + + val getter = foo.getter + getter.isAccessible = true + assertTrue(setter.isAccessible) + assertTrue(foo.setter.isAccessible) + assertTrue(foo.isAccessible) + assertTrue(foo.getter.isAccessible) + assertTrue(getter.isAccessible) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt new file mode 100644 index 0000000..13cf28e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt @@ -0,0 +1,20 @@ +package tests.properties.privateToThisAccessors + +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* + +class K { + private var t: T + get() = "OK" as T + set(value) {} + + fun run(): String { + val p = (K::class.java).kotlinClass.getMemberByName("t") as KMutableProperty1, String> + p.isAccessible = true + p.set(this as K, "") + return p.get(this) as String + } +} + +fun box() = K().run() diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt new file mode 100644 index 0000000..93c7a84 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt @@ -0,0 +1,37 @@ +package tests.properties.protectedClassVar + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + +class A(param: String) { + protected var v: String = param + + fun ref() = (A::class.java).kotlinClass.getMemberByName("v") as KMutableProperty1 +} + +fun box(): String { + val a = A(":(") + val f = a.ref() + + try { + f.get(a) + return "Fail: protected property getter is accessible by default" + } catch (e: IllegalAccessException) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$Method cannot access a member of class tests.properties.protectedClassVar.A with modifiers \"protected final\"", e.message) + } + + try { + f.set(a, ":D") + return "Fail: protected property setter is accessible by default" + } catch (e: IllegalAccessException) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$Method cannot access a member of class tests.properties.protectedClassVar.A with modifiers \"protected final\"", e.message) + } + + f.isAccessible = true + + f.set(a, ":)") + + return if (f.get(a) != ":)") "Fail: ${f.get(a)}" else "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt similarity index 58% rename from src/test/java/kotlinx/reflect/lite/testData/properties/publicClassValAccessible.kt rename to src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt index 088f8eb..9f4ced2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/publicClassValAccessible.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt @@ -1,14 +1,16 @@ package tests.properties.publicClassValAccessible -import kotlin.reflect.jvm.isAccessible +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* class Result { public val value: String = "OK" } fun box(): String { - val p = Result::value + val p = (Result::class.java).kotlinClass.getMemberByName("value") as KProperty1 p.isAccessible = false // setAccessible(false) should have no effect on the accessibility of a public reflection object return p.get(Result()) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt index 5c204ee..506d105 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt @@ -1,6 +1,7 @@ package tests.properties.propertyOfNestedClassAndArrayType -import kotlin.reflect.KMutableProperty1 +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* class A { class B(val result: String) @@ -12,11 +13,11 @@ class A { fun box(): String { val a = A() - val aq = A::class.members.single { it.name == "q" } as KMutableProperty1>> + val aq = (A::class.java).kotlinClass.members.single { it.name == "q" } as KMutableProperty1>> aq.set(a, arrayOf(arrayOf(A.B("array")))) if (a.q!![0][0].result != "array") return "Fail array" - val ap = A::class.members.single { it.name == "p" } as KMutableProperty1 + val ap = (A::class.java).kotlinClass.members.single { it.name == "p" } as KMutableProperty1 ap.set(a, A.B("OK")) return a.p!!.result -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt new file mode 100644 index 0000000..b63bfe1 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt @@ -0,0 +1,25 @@ +package tests.properties.allVsDeclared + +import kotlin.reflect.full.* +import kotlin.test.* + +open class Super { + val a: Int = 1 + val String.b: String get() = this +} + +class Sub : Super() { + val c: Double = 1.0 + val Char.d: Char get() = this +} + +fun box(): String { + val sub = Sub::class + + assertEquals(listOf("a", "c"), sub.memberProperties.map { it.name }.sorted()) + assertEquals(listOf("b", "d"), sub.memberExtensionProperties.map { it.name }.sorted()) + assertEquals(listOf("c"), sub.declaredMemberProperties.map { it.name }) + assertEquals(listOf("d"), sub.declaredMemberExtensionProperties.map { it.name }) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt new file mode 100644 index 0000000..6942011 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt @@ -0,0 +1,22 @@ +package tests.properties.callPrivatePropertyFromGetProperties + +import kotlin.reflect.KProperty1 +import kotlin.reflect.full.* +import kotlin.reflect.jvm.isAccessible + +class K(private val value: String) + +fun box(): String { + val p = K::class.memberProperties.single() as KProperty1 + + try { + return p.get(K("Fail: private property should not be accessible by default")) + } + catch (e: IllegalCallableAccessException) { + // OK + } + + p.isAccessible = true + + return p.get(K("OK")) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt new file mode 100644 index 0000000..b68b06c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt @@ -0,0 +1,17 @@ +package tests.properties.fakeOverridesInSubclass + +import kotlin.reflect.full.* +import kotlin.test.* + +open class Super(val r: String) + +class Sub(r: String) : Super(r) + +fun box(): String { + val props = Sub::class.declaredMemberProperties + if (!props.isEmpty()) return "Fail $props" + + val allProps = Sub::class.memberProperties + assertEquals(listOf("r"), allProps.map { it.name }) + return allProps.single().get(Sub("OK")) as String +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt new file mode 100644 index 0000000..d943015 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt @@ -0,0 +1,13 @@ +package tests.properties.genericClassLiteralPropertyReceiverIsStar + +import kotlin.reflect.* +import kotlin.reflect.full.* + +class A { + val result = "OK" +} + +fun box(): String { + val k: KProperty1, *> = A::class.memberProperties.single() + return k.get(A()) as String +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/genericOverriddenProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericOverriddenProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/genericOverriddenProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericOverriddenProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/genericProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericProperty.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/genericProperty.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericProperty.kt diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt new file mode 100644 index 0000000..f568b73 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt @@ -0,0 +1,29 @@ +package tests.properties.getExtensionPropertiesMutableVsReadonly + +import kotlin.reflect.* +import kotlin.reflect.full.* + +var storage = "before" + +class A { + val String.readonly: String + get() = this + + var String.mutable: String + get() = storage + set(value) { storage = value } +} + +fun box(): String { + val props = A::class.memberExtensionProperties + val readonly = props.single { it.name == "readonly" } + assert(readonly !is KMutableProperty2) { "Fail 1: $readonly" } + val mutable = props.single { it.name == "mutable" } + assert(mutable is KMutableProperty2) { "Fail 2: $mutable" } + + val a = A() + mutable as KMutableProperty2 + assert(mutable.get(a, "") == "before") { "Fail 3: ${mutable.get(a, "")}" } + mutable.set(a, "", "OK") + return mutable.get(a, "") +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt new file mode 100644 index 0000000..178fbdf --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt @@ -0,0 +1,22 @@ +package tests.properties.getPropertiesMutableVsReadonly + +import kotlin.reflect.* +import kotlin.reflect.full.* + +class A(val readonly: String) { + var mutable: String = "before" +} + +fun box(): String { + val props = A::class.memberProperties + val readonly = props.single { it.name == "readonly" } + assert(readonly !is KMutableProperty1) { "Fail 1: $readonly" } + val mutable = props.single { it.name == "mutable" } + assert(mutable is KMutableProperty1) { "Fail 2: $mutable" } + + val a = A("") + mutable as KMutableProperty1 + assert(mutable.get(a) == "before") { "Fail 3: ${mutable.get(a)}" } + mutable.set(a, "OK") + return mutable.get(a) +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt new file mode 100644 index 0000000..b598753 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt @@ -0,0 +1,9 @@ +package tests.properties.invokeKProperty + +import kotlin.reflect.full.declaredMemberProperties + +class A(val foo: String) + +fun box(): String { + return (A::class.declaredMemberProperties.single()).invoke(A("OK")) as String +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt new file mode 100644 index 0000000..a139feb --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt @@ -0,0 +1,19 @@ +package tests.properties.jvmField.annotationCompanionWithAnnotation + +import kotlin.reflect.full.declaredMemberProperties + +annotation class Ann(val value: String) + +public class Bar(public val value: String) + +annotation class Foo { + companion object { + @JvmField @Ann("O") + val FOO = Bar("K") + } +} + +fun box(): String { + val field = Foo.Companion::class.declaredMemberProperties.single() + return (field.annotations.single() as Ann).value + (field.get(Foo.Companion) as Bar).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt new file mode 100644 index 0000000..905bd13 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt @@ -0,0 +1,21 @@ +package tests.properties.jvmField.interfaceCompanion + +import kotlin.reflect.KProperty1 +import kotlin.reflect.full.memberProperties +import kotlin.reflect.full.companionObject + +class Bar(val value: String) + +interface Foo { + + companion object { + @JvmField + val z = Bar("OK") + } +} + + +fun box(): String { + val field = Foo::class.companionObject!!.memberProperties.single() as KProperty1 + return field.get(Foo.Companion).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt new file mode 100644 index 0000000..ca0ec4f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt @@ -0,0 +1,19 @@ +package tests.properties.jvmField.interfaceCompanionWithAnnotation + +import kotlin.reflect.full.declaredMemberProperties + +annotation class Ann(val value: String) + +public class Bar(public val value: String) + +interface Foo { + companion object { + @JvmField @Ann("O") + val FOO = Bar("K") + } +} + +fun box(): String { + val field = Foo.Companion::class.declaredMemberProperties.single() + return (field.annotations.single() as Ann).value + (field.get(Foo.Companion) as Bar).value +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt new file mode 100644 index 0000000..6d0bbaf --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt @@ -0,0 +1,26 @@ +package tests.properties.memberAndMemberExtensionWithSameName + +import kotlin.reflect.* +import kotlin.reflect.full.* + +class A { + val foo: String = "member" + val Unit.foo: String get() = "extension" +} + +fun box(): String { + run { + val foo: KProperty1 = A::class.memberProperties.single() + assert(foo.name == "foo") { "Fail name: $foo (${foo.name})" } + assert(foo.get(A()) == "member") { "Fail value: ${foo.get(A())}" } + } + + run { + val foo: KProperty2 = A::class.memberExtensionProperties.single() + assert(foo.name == "foo") { "Fail name: $foo (${foo.name})" } + foo as KProperty2 + assert(foo.get(A(), Unit) == "extension") { "Fail value: ${foo.get(A(), Unit)}" } + } + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt new file mode 100644 index 0000000..8622690 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt @@ -0,0 +1,31 @@ +package tests.properties.privateClassVal + +import kotlin.reflect.KProperty1 +import kotlin.reflect.full.* +import kotlin.reflect.jvm.isAccessible + +class Result { + private val value = "OK" + + fun ref() = Result::class.memberProperties.single() as KProperty1 +} + +fun box(): String { + val p = Result().ref() + try { + p.get(Result()) + return "Fail: private property is accessible by default" + } catch(e: IllegalCallableAccessException) { } + + p.isAccessible = true + + val r = p.get(Result()) + + p.isAccessible = false + try { + p.get(Result()) + return "Fail: setAccessible(false) had no effect" + } catch(e: IllegalCallableAccessException) { } + + return r +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt new file mode 100644 index 0000000..95adf0c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt @@ -0,0 +1,10 @@ +package tests.properties.privateFakeOverrideFromSuperclass + +import kotlin.reflect.full.* + +open class A(private val p: Int) +class B : A(42) + +fun box() = + if (B::class.memberProperties.isEmpty()) "OK" + else "Fail: invisible fake overrides should not appear in KClass.memberProperties" \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/privateJvmStaticVarInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateJvmStaticVarInObject.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/properties/privateJvmStaticVarInObject.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateJvmStaticVarInObject.kt diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties.kt new file mode 100644 index 0000000..272f391 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties.kt @@ -0,0 +1,23 @@ +package tests.properties.simpleGetProperties + +import kotlin.reflect.full.* + +class A(param: String) { + val int: Int get() = 42 + val string: String = param + var anyVar: Any? = null + + val List.extensionToList: Unit get() {} + + fun notAProperty() {} +} + +fun box(): String { + val props = A::class.memberProperties + + val names = props.map { it.name }.sorted() + assert(names == listOf("anyVar", "int", "string")) { "Fail names: $props" } + + val stringProp = props.firstOrNull { it.name == "string" } ?: return "Fail, string not found: $props" + return stringProp.get(A("OK")) as String +} \ No newline at end of file From 0c8c97e1cd6622d15affafc8ee1dbca953d71d7c Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 4 Aug 2022 01:04:48 +0200 Subject: [PATCH 38/74] More tests for KProperty --- .../impl/PropertyDescriptorImpl.kt | 7 +--- .../reflect/lite/impl/KPropertyImpl.kt | 29 +++++++++++++++ .../java/kotlinx/reflect/lite/impl/util.kt | 6 ++-- .../testData/properties/invokeKProperty.kt | 11 ++++++ .../callPrivatePropertyFromGetProperties.kt | 24 +++++++++++++ .../isAccessible/privateClassVal.kt | 36 +++++++++++++++++++ .../privateJvmStaticVarInObject.kt | 8 ++--- .../properties/simpleGetProperties.kt | 24 +++++++++++++ .../callPrivatePropertyFromGetProperties.kt | 22 ------------ .../getPropertiesMutableVsReadonly.kt | 9 ++--- .../properties/invokeKProperty.kt | 9 ----- .../properties/privateClassVal.kt | 31 ---------------- ...tProperties.kt => simpleGetProperties1.kt} | 4 +-- 13 files changed, 140 insertions(+), 80 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData/properties => testData/properties/isAccessible}/privateJvmStaticVarInObject.kt (73%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt rename src/test/java/kotlinx/reflect/lite/unusedTestData/properties/{simpleGetProperties.kt => simpleGetProperties1.kt} (92%) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 76c8426..6f4328d 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -135,13 +135,10 @@ internal abstract class PropertyAccessorDescriptorImpl( computeFieldCaller(javaField) } !Modifier.isStatic(accessor.modifiers) -> - // todo isBound CallerImpl.Method.Instance(accessor) isJvmStaticProperty() -> - // todo isBound CallerImpl.Method.JvmStaticInObject(accessor) else -> - // todo isBound CallerImpl.Method.Static(accessor) } } @@ -150,8 +147,7 @@ internal abstract class PropertyAccessorDescriptorImpl( protected fun isJvmStaticProperty(): Boolean { val annotationsMethodSignature = property.kmProperty.syntheticMethodForAnnotations ?: return false - val kClass = property.container as? KClassImpl<*> ?: return false - val annotationsMethod = kClass.descriptor.jClass.declaredMethods.single { it.name == annotationsMethodSignature.name } + val annotationsMethod = property.container.jClass.declaredMethods.single { it.name == annotationsMethodSignature.name } return annotationsMethod.getDeclaredAnnotation(JvmStatic::class.java) != null } @@ -223,6 +219,5 @@ internal class PropertySetterDescriptorImpl( } } -// todo KProperty2Descriptor diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt index 1a32a29..18ab5a2 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt @@ -123,3 +123,32 @@ internal open class KMutableProperty1Impl( override fun invoke(receiver: T, value: V): Unit = property.set(receiver, value) } } + +internal open class KProperty2Impl( + override val descriptor: PropertyDescriptor +): KPropertyImpl(descriptor), KProperty2 { + override val getter: Getter + get() = Getter(this) + + override fun get(receiver1: D, receiver2: E): V = getter.call(receiver1, receiver2) + + override fun invoke(receiver1: D, receiver2: E): V = get(receiver1, receiver2) + + class Getter(override val property: KProperty2Impl) :KPropertyImpl.Getter(), KProperty2.Getter { + override fun invoke(receiver1: D, receiver2: E): V = property.get(receiver1, receiver2) + } +} + +internal open class KMutableProperty2Impl( + override val descriptor: PropertyDescriptor +): KProperty2Impl(descriptor), KMutableProperty2 { + + override val setter: Setter + get() = Setter(this) + + override fun set(receiver1: D, receiver2: E, value: V) = setter.call(receiver1, receiver2, value) + + class Setter(override val property: KMutableProperty2Impl) : KPropertyImpl.Setter(), KMutableProperty2.Setter { + override fun invoke(receiver1: D, receiver2: E, value: V): Unit = property.set(receiver1, receiver2, value) + } +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 3b69496..fba9b10 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -20,12 +20,14 @@ internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { return when (receiverCount) { 0 -> KMutableProperty0Impl(descriptor) 1 -> KMutableProperty1Impl(descriptor) - else -> TODO("Implement mutable properties for other numbers of receivers") + 2 -> KMutableProperty2Impl(descriptor) + else -> error("Property with $receiverCount receivers is not possible") } else -> return when (receiverCount) { 0 -> KProperty0Impl(descriptor) 1 -> KProperty1Impl(descriptor) - else -> TODO("Implement properties for other numbers of receivers") + 2 -> KProperty2Impl(descriptor) + else -> error("Property with $receiverCount receivers is not possible") } } } diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt new file mode 100644 index 0000000..c02996f --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt @@ -0,0 +1,11 @@ +package tests.properties.invokeKProperty + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* + +class A(val foo: String) + +fun box(): String { + return ((A::class.java).kotlinClass.getMemberByName("foo") as KProperty1).invoke(A("OK")) as String +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt new file mode 100644 index 0000000..9f3cd49 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt @@ -0,0 +1,24 @@ +package tests.properties.callPrivatePropertyFromGetProperties + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + +class K(private val value: String) + +fun box(): String { + val p = (K::class.java).kotlinClass.getMemberByName("value") as KProperty1 + + try { + return p.get(K("Fail: private property should not be accessible by default")) + } + catch (e: IllegalAccessException) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$FieldGetter cannot access a member of class tests.properties.callPrivatePropertyFromGetProperties.K with modifiers \"private final\"", e.message) + // OK + } + + p.isAccessible = true + + return p.get(K("OK")) +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt new file mode 100644 index 0000000..f4a8887 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt @@ -0,0 +1,36 @@ +package tests.properties.privateClassVal + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.* + +class Result { + private val value = "OK" + + fun ref() = (Result::class.java).kotlinClass.getMemberByName("value") as KProperty1 +} + +fun box(): String { + val p = Result().ref() + try { + p.get(Result()) + return "Fail: private property is accessible by default" + } catch(e: IllegalAccessException) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$FieldGetter cannot access a member of class tests.properties.privateClassVal.Result with modifiers \"private final\"", e.message) + } + + p.isAccessible = true + + val r = p.get(Result()) + + p.isAccessible = false + try { + p.get(Result()) + return "Fail: setAccessible(false) had no effect" + } catch(e: IllegalAccessException) { + assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$FieldGetter cannot access a member of class tests.properties.privateClassVal.Result with modifiers \"private final\"", e.message) + } + + return r +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateJvmStaticVarInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt similarity index 73% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateJvmStaticVarInObject.kt rename to src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt index ad93af1..251d659 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateJvmStaticVarInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt @@ -1,7 +1,7 @@ package tests.properties.privateJvmStaticVarInObject -import kotlin.reflect.* -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* object Obj { @JvmStatic @@ -9,7 +9,7 @@ object Obj { } fun box(): String { - val p = Obj::class.members.single { it.name == "result" } as KMutableProperty1 + val p = (Obj::class.java).kotlinClass.members.single { it.name == "result" } as KMutableProperty1 p.isAccessible = true try { @@ -24,4 +24,4 @@ fun box(): String { p.set(Obj, "OK") return p.get(Obj) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt new file mode 100644 index 0000000..c9779ae --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt @@ -0,0 +1,24 @@ +package tests.properties.simpleGetProperties + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* + +class A(param: String) { + val int: Int get() = 42 + val string: String = param + var anyVar: Any? = null + + val List.extensionToList: Unit get() {} + + fun notAProperty() {} +} + +fun box(): String { + val props = (A::class.java).kotlinClass.members.filterIsInstance>() + + val names = props.map { it.name }.sorted() + assert(names == listOf("anyVar", "extensionToList", "int", "string")) { "Fail names: $props" } + + val stringProp = props.firstOrNull { it.name == "string" } as? KProperty1 ?: return "Fail, string not found: $props" + return stringProp.get(A("OK")) as String +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt deleted file mode 100644 index 6942011..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/callPrivatePropertyFromGetProperties.kt +++ /dev/null @@ -1,22 +0,0 @@ -package tests.properties.callPrivatePropertyFromGetProperties - -import kotlin.reflect.KProperty1 -import kotlin.reflect.full.* -import kotlin.reflect.jvm.isAccessible - -class K(private val value: String) - -fun box(): String { - val p = K::class.memberProperties.single() as KProperty1 - - try { - return p.get(K("Fail: private property should not be accessible by default")) - } - catch (e: IllegalCallableAccessException) { - // OK - } - - p.isAccessible = true - - return p.get(K("OK")) -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt index 178fbdf..6912d6b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt @@ -1,5 +1,6 @@ package tests.properties.getPropertiesMutableVsReadonly +import kotlinx.reflect.lite.impl.* import kotlin.reflect.* import kotlin.reflect.full.* @@ -8,10 +9,10 @@ class A(val readonly: String) { } fun box(): String { - val props = A::class.memberProperties - val readonly = props.single { it.name == "readonly" } + val props = (A::class.java).kotlinClass.members + val readonly = props.single { it.name == "readonly" } as KProperty1 assert(readonly !is KMutableProperty1) { "Fail 1: $readonly" } - val mutable = props.single { it.name == "mutable" } + val mutable = props.single { it.name == "mutable" } as KMutableProperty1 assert(mutable is KMutableProperty1) { "Fail 2: $mutable" } val a = A("") @@ -19,4 +20,4 @@ fun box(): String { assert(mutable.get(a) == "before") { "Fail 3: ${mutable.get(a)}" } mutable.set(a, "OK") return mutable.get(a) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt deleted file mode 100644 index b598753..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/invokeKProperty.kt +++ /dev/null @@ -1,9 +0,0 @@ -package tests.properties.invokeKProperty - -import kotlin.reflect.full.declaredMemberProperties - -class A(val foo: String) - -fun box(): String { - return (A::class.declaredMemberProperties.single()).invoke(A("OK")) as String -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt deleted file mode 100644 index 8622690..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateClassVal.kt +++ /dev/null @@ -1,31 +0,0 @@ -package tests.properties.privateClassVal - -import kotlin.reflect.KProperty1 -import kotlin.reflect.full.* -import kotlin.reflect.jvm.isAccessible - -class Result { - private val value = "OK" - - fun ref() = Result::class.memberProperties.single() as KProperty1 -} - -fun box(): String { - val p = Result().ref() - try { - p.get(Result()) - return "Fail: private property is accessible by default" - } catch(e: IllegalCallableAccessException) { } - - p.isAccessible = true - - val r = p.get(Result()) - - p.isAccessible = false - try { - p.get(Result()) - return "Fail: setAccessible(false) had no effect" - } catch(e: IllegalCallableAccessException) { } - - return r -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties1.kt similarity index 92% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties1.kt index 272f391..2ddf3f0 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties1.kt @@ -1,4 +1,4 @@ -package tests.properties.simpleGetProperties +package tests.properties.simpleGetProperties1 import kotlin.reflect.full.* @@ -20,4 +20,4 @@ fun box(): String { val stringProp = props.firstOrNull { it.name == "string" } ?: return "Fail, string not found: $props" return stringProp.get(A("OK")) as String -} \ No newline at end of file +} From 29ff391538a3e71451f852c14ff66400f6cad244 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 4 Aug 2022 17:14:24 +0200 Subject: [PATCH 39/74] Tests for ReflectionMapping (javaMethod, kotlinFunction, javaConstructor) --- .../reflect/lite/descriptors/descriptors.kt | 3 + ...BasedDeclarationContainerDescriptorImpl.kt | 6 ++ .../impl/ConstructorDescriptorImpl.kt | 11 +++ .../impl/FunctionDescriptorImpl.kt | 11 +++ .../impl/PropertyDescriptorImpl.kt | 6 ++ .../kotlinx/reflect/lite/impl/KClassImpl.kt | 5 ++ .../reflect/lite/impl/KFunctionImpl.kt | 6 ++ .../reflect/lite/impl/ReflectJvmMapping.kt | 88 +++++++++++++++---- .../java/kotlinx/reflect/lite/impl/util.kt | 19 ++-- .../mapping/constructor.kt | 14 +-- .../mapping/functions.kt | 14 +-- .../kotlinx/reflect/lite/tests/MappingTest.kt | 11 +++ 12 files changed, 159 insertions(+), 35 deletions(-) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/constructor.kt (51%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/functions.kt (56%) create mode 100644 src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 65e3afa..ef7a765 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -1,6 +1,7 @@ package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* +import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.impl.KotlinType @@ -128,6 +129,8 @@ internal interface FunctionDescriptor : CallableDescriptor { val isSuspend: Boolean val isAnnotationConstructor: Boolean + val signature: JvmMethodSignature? + val member: Member? val defaultMember: Member? } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt index 845860f..c6e542d 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt @@ -199,4 +199,10 @@ internal abstract class ClassBasedDeclarationContainerDescriptorImpl( companion object { private val DEFAULT_CONSTRUCTOR_MARKER = Class.forName("kotlin.jvm.internal.DefaultConstructorMarker") } + + override fun equals(other: Any?): Boolean { + return other is ClassBasedDeclarationContainerDescriptor && jClass == other.jClass + } + + override fun hashCode(): Int = jClass.hashCode() } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index 6e8efec..0eef12e 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -20,6 +20,9 @@ internal class ConstructorDescriptorImpl( override val name: Name get() = "" + override val signature: JvmMethodSignature? + get() = kmCons.signature + override val valueParameters: List get() = kmCons.valueParameters.mapIndexed { index, parameter -> ValueParameterDescriptorImpl(parameter, this, index) @@ -51,4 +54,12 @@ internal class ConstructorDescriptorImpl( override val defaultMember: Member? by ReflectProperties.lazy { container.findDefaultConstructor(jvmSignature.constructorDesc) } + + override fun equals(other: Any?): Boolean { + val that = (other as? FunctionDescriptor) ?: return false + return container == that.container && name == that.name && signature == that.signature + } + + override fun hashCode(): Int = + (container.hashCode() * 31 + name.hashCode()) * 31 + signature.hashCode() } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index d8a437f..97cae91 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -97,6 +97,9 @@ internal class FunctionDescriptorImpl( override val name: Name get() = kmFunction.name + override val signature: JvmMethodSignature? + get() = kmFunction.signature + override val valueParameters: List get() = kmFunction.valueParameters.mapIndexed { index, kmValueParam -> ValueParameterDescriptorImpl(kmValueParam, this, index) @@ -130,4 +133,12 @@ internal class FunctionDescriptorImpl( override val defaultMember: Member? by ReflectProperties.lazy { container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(member!!.modifiers)) } + + override fun equals(other: Any?): Boolean { + val that = (other as? FunctionDescriptor) ?: return false + return container == that.container && name == that.name && signature == that.signature + } + + override fun hashCode(): Int = + (container.hashCode() * 31 + name.hashCode()) * 31 + signature.hashCode() } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 6f4328d..ced85ed 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -169,6 +169,9 @@ internal class PropertyGetterDescriptorImpl( override val name: Name get() = "" + override val signature: JvmMethodSignature? + get() = property.kmProperty.getterSignature + override val flags: Flags get() = property.kmProperty.getterFlags @@ -197,6 +200,9 @@ internal class PropertySetterDescriptorImpl( override val name: Name get() = "" + override val signature: JvmMethodSignature? + get() = property.kmProperty.setterSignature + override val flags: Flags get() = property.kmProperty.setterFlags diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index f548b16..a03bb5f 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -57,4 +57,9 @@ internal class KClassImpl( get() = descriptor.isFun override val isValue: Boolean get() = descriptor.isValue + + override fun equals(other: Any?): Boolean = + other is KClassImpl<*> && descriptor == other.descriptor + + override fun hashCode(): Int = descriptor.hashCode() } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt index 3279fa4..fc8cc1e 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt @@ -2,6 +2,7 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* +import kotlin.reflect.jvm.internal.* internal class KFunctionImpl( override val descriptor: FunctionDescriptor @@ -19,4 +20,9 @@ internal class KFunctionImpl( get() = descriptor.isInfix override val isSuspend: Boolean get() = descriptor.isSuspend + + override fun equals(other: Any?): Boolean = + other is KFunctionImpl && descriptor == other.descriptor + + override fun hashCode(): Int = descriptor.hashCode() } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index 5f8eded..e1f7844 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -53,21 +53,6 @@ val KFunction.javaConstructor: Constructor? public val KClass.java: Class get() = (this as KClassImpl).descriptor.jClass as Class -// Java reflection -> Kotlin reflection - -/** - * Returns a [KDeclarationContainer] instance representing a Kotlin class or package. - */ -val Class.kotlinClass: KDeclarationContainer - @JvmName("getKotlinClass") - get() = ReflectionLiteImpl.loadClassMetadata(this) - -private fun Member.getKPackage(): KDeclarationContainer? = - when (declaringClass.getAnnotation(Metadata::class.java)?.kind) { - 2, 4, 5 -> KPackageImpl(PackageDescriptorImpl(declaringClass)) - else -> null - } - /** * Returns a [KClass] instance representing the companion object of a given class, * or `null` if the class doesn't have a companion object. @@ -89,12 +74,71 @@ val KDeclarationContainer.companionObject: KClass<*>? val KType.javaType: Type get() = this.computeJavaType() +/** + * Returns a Java [Class] instance representing the primitive type corresponding to the given [KDeclarationContainer] if it exists. + */ +public val KDeclarationContainer.javaPrimitiveType: Class<*>? + get() { + val thisJClass = (this as KDeclarationContainerImpl).descriptor.jClass + if (thisJClass.isPrimitive) return thisJClass + + return when (thisJClass.name) { + "java.lang.Boolean" -> Boolean::class.java + "java.lang.Character" -> Char::class.java + "java.lang.Byte" -> Byte::class.java + "java.lang.Short" -> Short::class.java + "java.lang.Integer" -> Int::class.java + "java.lang.Float" -> Float::class.java + "java.lang.Long" -> Long::class.java + "java.lang.Double" -> Double::class.java + "java.lang.Void" -> Void.TYPE + else -> null + } + } + +/** + * Returns a Java [Class] instance corresponding to the given [KClass] instance. In case of primitive types it returns corresponding wrapper classes. + */ +public val KDeclarationContainer.javaObjectType: Class<*> + get() { + val thisJClass = (this as KDeclarationContainerImpl).descriptor.jClass + if (!thisJClass.isPrimitive) return thisJClass + + return when (thisJClass.name) { + "boolean" -> java.lang.Boolean::class.java + "char" -> Character::class.java + "byte" -> java.lang.Byte::class.java + "short" -> java.lang.Short::class.java + "int" -> Integer::class.java + "float" -> java.lang.Float::class.java + "long" -> java.lang.Long::class.java + "double" -> java.lang.Double::class.java + "void" -> Void::class.java + else -> thisJClass + } + } + +// Java reflection -> Kotlin reflection + +/** + * Returns a [KDeclarationContainer] instance representing a Kotlin class or package. + */ +val Class.kotlinClass: KDeclarationContainer + @JvmName("getKotlinClass") + get() = ReflectionLiteImpl.loadClassMetadata(this) + +private fun Member.getKPackage(): KDeclarationContainer? = + when (declaringClass.getAnnotation(Metadata::class.java)?.kind) { + 2, 4, 5 -> KPackageImpl(PackageDescriptorImpl(declaringClass)) + else -> null + } + /** * Returns a [KProperty] instance corresponding to the given Java [Field] instance, * or `null` if this field cannot be represented by a Kotlin property * (for example, if it is a synthetic field). */ -val Field.kotlinLiteProperty: KProperty<*>? +val Field.kotlinProperty: KProperty<*>? get() { if (isSynthetic) return null val kotlinPackage = getKPackage() @@ -108,7 +152,7 @@ val Field.kotlinLiteProperty: KProperty<*>? * Returns a [KFunction] instance corresponding to the given Java [Method] instance, * or `null` if this method cannot be represented by a Kotlin function. */ -val Method.kotlinLiteFunction: KFunction<*>? +val Method.kotlinFunction: KFunction<*>? get() { if (Modifier.isStatic(modifiers)) { val kotlinPackage = getKPackage() @@ -126,3 +170,13 @@ val Method.kotlinLiteFunction: KFunction<*>? } return declaringClass.kotlinClass.members.filterIsInstance>().firstOrNull { it.name == this.name } } + +/** + * Returns a [KFunction] instance corresponding to the given Java [Constructor] instance, + * or `null` if this constructor cannot be represented by a Kotlin function + * (for example, if it is a synthetic constructor). + */ +val Constructor.kotlinFunction: KFunction? + get() { + return (declaringClass.kotlinClass as KClass).constructors.firstOrNull { it.javaConstructor == this } + } diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index fba9b10..ced0407 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -161,14 +161,17 @@ internal class FakeOverrideFunctionDescriptor( val overriddenFunctions: List get() = super.overridden as List + override val signature: JvmMethodSignature? + get() = overriddenFunctions.first().signature + override val isInline: Boolean - get() = overriddenFunctions.first().isInline // TODO? + get() = overriddenFunctions.first().isInline override val isOperator: Boolean - get() = overriddenFunctions.first().isOperator // TODO? + get() = overriddenFunctions.first().isOperator override val isInfix: Boolean - get() = overriddenFunctions.first().isInfix // TODO? + get() = overriddenFunctions.first().isInfix override val isSuspend: Boolean - get() = overriddenFunctions.first().isSuspend // TODO? + get() = overriddenFunctions.first().isSuspend override val isExternal: Boolean get() = overriddenFunctions.first().isExternal @@ -271,8 +274,11 @@ internal class FakeOverridePropertyGetterDescriptor( private val overriddenPropertyGetters: List get() = super.overridden as List + override val signature: JvmMethodSignature? + get() = overriddenPropertyGetters.first().signature + override val isInline: Boolean - get() = overriddenPropertyGetters.first().isInline // TODO? + get() = overriddenPropertyGetters.first().isInline override val isOperator: Boolean get() = false override val isInfix: Boolean get() = false override val isSuspend: Boolean get() = false @@ -314,6 +320,9 @@ internal class FakeOverridePropertySetterDescriptor( private val overriddenPropertySetters: List get() = super.overridden as List + override val signature: JvmMethodSignature? + get() = overriddenPropertySetters.first().signature + override val isInline: Boolean get() = overriddenPropertySetters.first().isInline // TODO? override val isOperator: Boolean get() = false diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt similarity index 51% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructor.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt index 10324f3..604f86b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt @@ -1,7 +1,7 @@ package tests.mapping.constructor -import kotlin.reflect.* -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* class K { class Nested @@ -24,10 +24,10 @@ fun check(f: KFunction) { } fun box(): String { - check(::K) - check(K::Nested) - check(K::Inner) - check(::Secondary) + check((K::class.java.kotlinClass as KClass).constructors.first()) + check(((K::class.java.kotlinClass as KClass).nestedClasses.first() as KClass).constructors.first()) + check(((K::class.java.kotlinClass as KClass).nestedClasses.first() as KClass).constructors.first()) + check((Secondary::class.java.kotlinClass as KClass).constructors.first()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/functions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt similarity index 56% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/functions.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt index c3187e2..fcac719 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/functions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt @@ -1,7 +1,8 @@ package tests.mapping.functions -import kotlin.reflect.* -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* class K { fun foo(s: String): Int = s.length @@ -21,9 +22,10 @@ fun check(f: KFunction) { } fun box(): String { - check(K::foo) - check(::bar) - check(String::baz) + check((K::class.java.kotlinClass).getMemberByName("foo") as KFunction) + val clazz = Class.forName("tests.mapping.functions.FunctionsKt").kotlinClass + check(clazz.getMemberByName("bar") as KFunction) + check(clazz.getMemberByName("baz") as KFunction) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt new file mode 100644 index 0000000..c974607 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt @@ -0,0 +1,11 @@ +package kotlinx.reflect.lite.tests + +import org.junit.* + +class MappingTest { + @Test + fun testConstructor() = test("mapping.constructor") { tests.mapping.constructor.box() } + + @Test + fun testFunctions() = test("mapping.functions") { tests.mapping.functions.box() } +} From 827bfdc3c4861853802e6f4260f2555fb596f830 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 4 Aug 2022 18:49:46 +0200 Subject: [PATCH 40/74] Tests for ReflectionMapping (javaMethod, kotlinProperty) --- .../reflect/lite/descriptors/descriptors.kt | 3 ++ .../impl/PropertyDescriptorImpl.kt | 21 +++++++++- .../reflect/lite/impl/KPropertyImpl.kt | 5 +++ .../java/kotlinx/reflect/lite/impl/util.kt | 5 +++ .../mapping/extensionProperty.kt | 9 +++-- .../interfaceCompanionPropertyWithJvmField.kt | 21 ++++++++++ .../mapping/topLevelProperty.kt | 11 ++++-- .../constructorWithInlineClassParameters.kt | 21 ++++++++++ .../mapping/inlineClassPrimaryVal.kt | 38 +++++++++++++++++++ .../mapping/methodsFromObject.kt | 35 +++++++++++++++++ .../unusedTestData/mapping/openSuspendFun.kt | 21 ++++++++++ .../unusedTestData/mapping/privateProperty.kt | 18 +++++++++ 12 files changed, 201 insertions(+), 7 deletions(-) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/extensionProperty.kt (72%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/topLevelProperty.kt (69%) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/privateProperty.kt diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index ef7a765..51cafca 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -154,6 +154,9 @@ internal interface PropertyDescriptor : CallableDescriptor { private val isDelegated: Boolean get() = TODO() + val isMovedFromInterfaceCompanion: Boolean + + val signature: JvmFieldSignature? val jvmSignature: JvmPropertySignature.KotlinProperty val javaField: Field? diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index ced85ed..f191b54 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -47,6 +47,8 @@ internal class PropertyDescriptorImpl( get() = Flag.Property.IS_VAR(flags) override val isReal: Boolean get() = true + override val isMovedFromInterfaceCompanion: Boolean + get() = JvmFlag.Property.IS_MOVED_FROM_INTERFACE_COMPANION(kmProperty.jvmFlags) override val dispatchReceiverParameter: ReceiverParameterDescriptor? get() = containingClass?.let { @@ -58,6 +60,9 @@ internal class PropertyDescriptorImpl( ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) } + override val signature: JvmFieldSignature? + get() = kmProperty.fieldSignature + override val jvmSignature: JvmPropertySignature.KotlinProperty by ReflectProperties.lazy { JvmPropertySignature.KotlinProperty( this, @@ -70,7 +75,11 @@ internal class PropertyDescriptorImpl( // Logic from: https://github.com/JetBrains/kotlin/blob/3b5179686eaba0a71bcca53c2cc922a54cc9241f/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt#L51 override val javaField: Field? by ReflectProperties.lazy { jvmSignature.fieldSignature?.let { - val owner = containingClass?.jClass ?: container.jClass + val owner = if (isMovedFromInterfaceCompanion) { + container.jClass.enclosingClass + } else { + containingClass?.jClass ?: container.jClass + } try { owner.getDeclaredField(it.name) } catch (e: NoSuchFieldException) { @@ -94,6 +103,14 @@ internal class PropertyDescriptorImpl( override val defaultCaller: Caller<*> by ReflectProperties.lazy { getter?.defaultCaller ?: error("The property has no getter") } + + override fun equals(other: Any?): Boolean { + val that = (other as? PropertyDescriptor) ?: return false + return container == that.container && name == that.name && signature == that.signature + } + + override fun hashCode(): Int = + (container.hashCode() * 31 + name.hashCode()) * 31 + signature.hashCode() } internal abstract class PropertyAccessorDescriptorImpl( @@ -143,6 +160,8 @@ internal abstract class PropertyAccessorDescriptorImpl( } } + + protected abstract fun computeFieldCaller(field: Field): Caller<*> protected fun isJvmStaticProperty(): Boolean { diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt index 18ab5a2..1fe5482 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt @@ -20,6 +20,11 @@ internal abstract class KPropertyImpl( abstract override val getter: KProperty.Getter + override fun equals(other: Any?): Boolean = + other is KPropertyImpl<*> && descriptor == other.descriptor + + override fun hashCode(): Int = descriptor.hashCode() + abstract class Accessor : KCallableImpl(), KProperty.Accessor, KFunction { abstract override val descriptor: PropertyAccessorDescriptor diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index ced0407..e8555fa 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -218,6 +218,11 @@ internal class FakeOverridePropertyDescriptor( get() = false override val isConst: Boolean get() = false + override val isMovedFromInterfaceCompanion: Boolean + get() = overriddenProperties.first().isMovedFromInterfaceCompanion + + override val signature: JvmFieldSignature? + get() = overriddenProperties.first().signature override val jvmSignature: JvmPropertySignature.KotlinProperty by ReflectProperties.lazy { // TODO: inherit this from PropertyDescriptorImpl diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt similarity index 72% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/extensionProperty.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt index 138c0e5..50fc688 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/extensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt @@ -1,6 +1,8 @@ package tests.mapping.extensionProperty -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals class K(var value: Long) @@ -14,7 +16,8 @@ var K.ext: Double val fileFacadeClass = object {}::class.java.enclosingClass fun box(): String { - val p = K::ext + val clazz = Class.forName("tests.mapping.extensionProperty.ExtensionPropertyKt").kotlinClass + val p = clazz.getMemberByName("ext") as KMutableProperty1 val getter = p.javaGetter!! val setter = p.javaSetter!! @@ -28,4 +31,4 @@ fun box(): String { assert(getter.invoke(null, k) == -239.0) { "Fail k setter" } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt new file mode 100644 index 0000000..cd750e2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt @@ -0,0 +1,21 @@ +package tests.mapping.interfaceCompanionPropertyWithJvmField + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.reflect.jvm.* +import kotlin.test.* + +interface Foo { + companion object { + @JvmField + val value = "OK" + } +} + +fun box(): String { + val value = Foo.Companion::class.java.kotlinClass.getMemberByName("value") as KProperty1 + val field = value.javaField + assertNotNull(field, "javaField not found for property declared in the interface's companion object") + return field.get(null) as String +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt similarity index 69% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/topLevelProperty.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt index cf7ab36..c03c362 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/topLevelProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt @@ -1,6 +1,8 @@ package tests.mapping.topLevelProperty -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.* var topLevel = "123" @@ -8,11 +10,14 @@ var topLevel = "123" val fileFacadeClass = object {}::class.java.enclosingClass fun box(): String { - val p = ::topLevel + val p = Class.forName("tests.mapping.topLevelProperty.TopLevelPropertyKt").kotlinClass.getMemberByName("topLevel") as KMutableProperty0 assertNotNull(p.javaField, "Fail p field") assertEquals(p.javaField!!.getDeclaringClass(), fileFacadeClass) + val pp = p.javaField!!.kotlinProperty + assert(p == pp) { "Fail p != pp" } + val getter = p.javaGetter!! val setter = p.javaSetter!! @@ -27,4 +32,4 @@ fun box(): String { assertEquals("456", getter.invoke(null), "Fail k setter") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt new file mode 100644 index 0000000..14483ec --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt @@ -0,0 +1,21 @@ +package tests.mapping.constructorWithInlineClassParameters + +import kotlin.reflect.full.primaryConstructor +import kotlin.reflect.jvm.javaConstructor +import kotlin.reflect.jvm.kotlinFunction +import kotlin.test.assertEquals + +inline class Z(val x: Int) + +class Test(val x: Z) + +fun box(): String { + val kctor1 = Test::class.primaryConstructor ?: throw AssertionError("No primary constructor") + val jctor1 = kctor1.javaConstructor ?: throw AssertionError("No javaConstructor for $kctor1") + val kctor2 = jctor1.kotlinFunction ?: throw AssertionError("No kotlinFunction for $jctor1") + + assertEquals(kctor1, kctor2) + assertEquals("[x]", kctor2.parameters.map { it.name }.toString()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt new file mode 100644 index 0000000..670ee93 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt @@ -0,0 +1,38 @@ +package tests.mapping.inlineClassPrimaryVal + +import kotlin.reflect.jvm.* +import kotlin.test.assertEquals + +inline class Z1(val publicX: Int) { + companion object { + val publicXRef = Z1::publicX + val publicXBoundRef = Z1(42)::publicX + } +} + +inline class Z2(internal val internalX: Int) { + companion object { + val internalXRef = Z2::internalX + val internalXBoundRef = Z2(42)::internalX + } +} + +inline class Z3(private val privateX: Int) { + companion object { + val privateXRef = Z3::privateX + val privateXBoundRef = Z3(42)::privateX + } +} + +fun box(): String { + assertEquals("getPublicX", Z1.publicXRef.javaGetter!!.name) + assertEquals("getPublicX", Z1.publicXBoundRef.javaGetter!!.name) + + assertEquals(null, Z2.internalXRef.javaGetter) + assertEquals(null, Z2.internalXBoundRef.javaGetter) + + assertEquals(null, Z3.privateXRef.javaGetter) + assertEquals(null, Z3.privateXBoundRef.javaGetter) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt new file mode 100644 index 0000000..d74e19a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt @@ -0,0 +1,35 @@ +package tests.mapping.methodsFromObject + +import kotlin.reflect.KClass +import kotlin.reflect.full.memberFunctions +import kotlin.reflect.jvm.javaMethod +import kotlin.test.assertEquals + +annotation class A +interface I +class C + +interface MyCustomMembers { + fun equals(): Boolean + fun hashCode(hehe: Int): Int + fun toString(hehe: String): Any +} + +interface MyCloneable : Cloneable + +fun KClass<*>.functions() = memberFunctions.map { it.javaMethod!!.name }.sorted() + +fun box(): String { + assertEquals(listOf("equals", "hashCode", "toString"), A::class.functions()) + assertEquals(listOf("equals", "hashCode", "toString"), I::class.functions()) + assertEquals(listOf("equals", "hashCode", "toString"), C::class.functions()) + + assertEquals( + listOf("equals", "equals", "hashCode", "hashCode", "toString", "toString"), + MyCustomMembers::class.functions() + ) + + assertEquals(listOf("clone", "equals", "hashCode", "toString"), MyCloneable::class.functions()) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt new file mode 100644 index 0000000..9282786 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt @@ -0,0 +1,21 @@ +package tests.mapping.openSuspendFun + +import kotlin.reflect.full.declaredMemberFunctions +import kotlin.reflect.jvm.javaMethod +import kotlin.test.assertEquals + +open class Aaa { + suspend open fun aaa() {} +} + +class Bbb { + suspend fun bbb() {} +} + +fun box(): String { + val bbb = Bbb::class.declaredMemberFunctions.first { it.name == "bbb" }.javaMethod + assertEquals("bbb", bbb!!.name) + val aaa = Aaa::class.declaredMemberFunctions.first { it.name == "aaa" }.javaMethod + assertEquals("aaa", aaa!!.name) + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/privateProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/privateProperty.kt new file mode 100644 index 0000000..0ed598c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/privateProperty.kt @@ -0,0 +1,18 @@ +package tests.mapping.privateProperty + +import kotlin.reflect.* +import kotlin.reflect.full.* +import kotlin.reflect.jvm.* +import kotlin.test.* + +class K(private var value: Long) + +fun box(): String { + val p = K::class.declaredMemberProperties.single() as KMutableProperty1 + + assertNotNull(p.javaField, "Fail p field") + assertNull(p.javaGetter, "Fail p getter") + assertNull(p.javaSetter, "Fail p setter") + + return "OK" +} \ No newline at end of file From 30458e9ea075647f79686f82096b5e029d160049 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 4 Aug 2022 19:37:01 +0200 Subject: [PATCH 41/74] Tests for ReflectionMapping (javaType), fixed types of callable parameters --- .../reflect/lite/impl/KCallableImpl.kt | 6 +-- .../reflect/lite/impl/KParameterImpl.kt | 21 ++++++++- .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 17 +++---- .../reflect/lite/impl/ReflectJvmMapping.kt | 46 +------------------ .../java/kotlinx/reflect/lite/impl/util.kt | 5 ++ .../parameters/objectMemberReferences.kt | 2 - .../mapping/types/constructors.kt | 24 ++++++---- 7 files changed, 48 insertions(+), 73 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 92c8872..9641fce 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -17,16 +17,16 @@ internal abstract class KCallableImpl: KCallable { val instanceReceiver = descriptor.dispatchReceiverParameter if (instanceReceiver != null) { - result.add(KParameterImpl(instanceReceiver, index++, KParameter.Kind.INSTANCE)) + result.add(KParameterImpl(instanceReceiver, index++, KParameter.Kind.INSTANCE, descriptor)) } val extensionReceiver = descriptor.extensionReceiverParameter if (extensionReceiver != null) { - result.add(KParameterImpl(extensionReceiver, index++, KParameter.Kind.EXTENSION_RECEIVER)) + result.add(KParameterImpl(extensionReceiver, index++, KParameter.Kind.EXTENSION_RECEIVER, descriptor)) } for (valueParameterDesc in descriptor.valueParameters) { - result.add(KParameterImpl(valueParameterDesc, index++, KParameter.Kind.VALUE)) + result.add(KParameterImpl(valueParameterDesc, index++, KParameter.Kind.VALUE, descriptor)) } result } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt index cf7e981..92cc6f7 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -6,15 +6,32 @@ import kotlinx.reflect.lite.descriptors.* internal class KParameterImpl( val descriptor: ParameterDescriptor, override val index: Int, - override val kind: KParameter.Kind + override val kind: KParameter.Kind, + val containingCallable: CallableDescriptor ): KParameter { override val name: String? get() = (descriptor as? ValueParameterDescriptor)?.let { if (it.name.startsWith("<")) null else it.name } + // Logic from here: https://github.com/JetBrains/kotlin/blob/1f1790d60e837347d99921dd1fb4f00e6ec868d2/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KParameterImpl.kt#L42 override val type: KType - get() = descriptor.type.let(::KTypeImpl) + get() = KTypeImpl(descriptor.type) { + val descriptor = descriptor + + if (descriptor is ReceiverParameterDescriptor && + containingCallable.instanceReceiverParameter == descriptor && + !containingCallable.isReal + ) { + // In case of fake overrides, dispatch receiver type should be computed manually because Caller.parameterTypes returns + // types from Java reflection where receiver is always the declaring class of the original declaration + // (not the class where the fake override is generated, which is returned by KParameter.type) + containingCallable.containingClass?.jClass + ?: throw KotlinReflectionInternalError("Cannot determine receiver Java type of inherited declaration: $descriptor") + } else { + containingCallable.caller.parameterTypes[index] + } + } override val isOptional: Boolean get() = (descriptor as? ValueParameterDescriptor)?.declaresDefaultValue ?: false diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index dbdb1ee..63922b1 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -6,15 +6,13 @@ import kotlinx.reflect.lite.descriptors.impl.KotlinType import java.lang.reflect.* internal class KTypeImpl( - val type: KotlinType - // TODO: support computeJavaType: - // https://github.com/JetBrains/kotlin/blob/fb296b5b95a56fe380bdbe7c9f61d092bd21f275/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KTypeImpl.kt#L40 + val type: KotlinType, + val computeJavaType: (() -> Type)? = null ): KType { override val classifier: KClassifier? get() = when (val descriptor = type.descriptor) { is ClassDescriptor<*> -> { - // TODO array types KClassImpl(descriptor) } is TypeParameterDescriptor -> KTypeParameterImpl(descriptor) @@ -42,15 +40,15 @@ internal class KTypeImpl( override val isMarkedNullable: Boolean get() = type.isMarkedNullable + + val javaType: Type? + get() = computeJavaType?.invoke() } // Logic from: https://github.com/JetBrains/kotlin/blob/a6b51da3081b11dc2167a0cbb8ebca6f0e805d03/libraries/stdlib/jvm/src/kotlin/reflect/TypesJVM.kt#L37 -fun KType.computeJavaType(forceWrapper: Boolean = false): Type { +fun KType.computeJavaType(): Type { when (val classifier = classifier) { - // TODO: support KTypeParameter - // is KTypeParameter -> return TypeVariableImpl(classifier) is KClass<*> -> { - // TODO: forceWrapper val jClass = (classifier as KClassImpl<*>).descriptor.jClass val arguments = arguments if (arguments.isEmpty()) return jClass @@ -69,9 +67,6 @@ fun KType.computeJavaType(forceWrapper: Boolean = false): Type { } } } - - // TODO: support inner type - // return createPossiblyInnerType(jClass, arguments) } else -> throw UnsupportedOperationException("Unsupported type classifier: $this") } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index e1f7844..9ffcd15 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -72,51 +72,7 @@ val KDeclarationContainer.companionObject: KClass<*>? * the JVM class [Unit] when it's the type of a parameter, or to `void` when it's the return type of a function. */ val KType.javaType: Type - get() = this.computeJavaType() - -/** - * Returns a Java [Class] instance representing the primitive type corresponding to the given [KDeclarationContainer] if it exists. - */ -public val KDeclarationContainer.javaPrimitiveType: Class<*>? - get() { - val thisJClass = (this as KDeclarationContainerImpl).descriptor.jClass - if (thisJClass.isPrimitive) return thisJClass - - return when (thisJClass.name) { - "java.lang.Boolean" -> Boolean::class.java - "java.lang.Character" -> Char::class.java - "java.lang.Byte" -> Byte::class.java - "java.lang.Short" -> Short::class.java - "java.lang.Integer" -> Int::class.java - "java.lang.Float" -> Float::class.java - "java.lang.Long" -> Long::class.java - "java.lang.Double" -> Double::class.java - "java.lang.Void" -> Void.TYPE - else -> null - } - } - -/** - * Returns a Java [Class] instance corresponding to the given [KClass] instance. In case of primitive types it returns corresponding wrapper classes. - */ -public val KDeclarationContainer.javaObjectType: Class<*> - get() { - val thisJClass = (this as KDeclarationContainerImpl).descriptor.jClass - if (!thisJClass.isPrimitive) return thisJClass - - return when (thisJClass.name) { - "boolean" -> java.lang.Boolean::class.java - "char" -> Character::class.java - "byte" -> java.lang.Byte::class.java - "short" -> java.lang.Short::class.java - "int" -> Integer::class.java - "float" -> java.lang.Float::class.java - "long" -> java.lang.Long::class.java - "double" -> java.lang.Double::class.java - "void" -> Void::class.java - else -> thisJClass - } - } + get() = (this as KTypeImpl).javaType ?: this.computeJavaType() // Java reflection -> Kotlin reflection diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index e8555fa..419e1c4 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -37,6 +37,11 @@ internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { throw KotlinReflectionInternalError("Unsupported callable: $descriptor") } +internal val CallableDescriptor.instanceReceiverParameter: ReceiverParameterDescriptor? + get() = + if (dispatchReceiverParameter != null) containingClass?.let { ReceiverParameterDescriptorImpl(it.defaultType, this) } + else null + internal fun overrides(derived: D, base: D): Boolean { require(derived.name == base.name) { "Names should be equal: $derived, $base" } if (derived is PropertyDescriptor && base is PropertyDescriptor) { diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt index bdd364a..5284f3a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt @@ -15,11 +15,9 @@ fun box(): String { assertEquals(null, fooParams[0].name) assertEquals("i", fooParams[1].name) - // TODO: now fooParams[1].type.javaType == java.lang.Integer assertEquals(Int::class.java, fooParams[1].type.javaType) assertEquals("s", fooParams[2].name) - // TODO: now fooParams[1].type.javaType == java.lang.String assertEquals(String::class.java, fooParams[2].type.javaType) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt index ac9fe0b..61c6649 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt @@ -1,7 +1,7 @@ package tests.mapping.types.constructors -import kotlin.reflect.* -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals class A(d: Double, s: String, parent: A?) { @@ -12,14 +12,18 @@ class A(d: Double, s: String, parent: A?) { enum class E(val i: Int) { ENTRY(1) } fun box(): String { - assertEquals(listOf(java.lang.Double.TYPE, String::class.java, A::class.java), ::A.parameters.map { it.type.javaType }) - assertEquals(listOf(A::class.java), A::Nested.parameters.map { it.type.javaType }) - assertEquals(listOf(A::class.java, A.Nested::class.java), A::Inner.parameters.map { it.type.javaType }) - assertEquals(listOf(java.lang.Integer.TYPE), E::class.constructors.single().parameters.map { it.type.javaType }) + val aCons = (A::class.java.kotlinClass as KClass).constructors.first() + assertEquals(listOf(java.lang.Double.TYPE, String::class.java, A::class.java), aCons.parameters.map { it.type.javaType }) + val aNestedCons = (A::class.java.kotlinClass as KClass).nestedClasses.single { it.simpleName == "Nested" }.constructors.first() + assertEquals(listOf(A::class.java), aNestedCons.parameters.map { it.type.javaType }) + val aInnerCons = (A::class.java.kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" }.constructors.first() + assertEquals(listOf(A::class.java, A.Nested::class.java), aInnerCons.parameters.map { it.type.javaType }) + val eCons = (E::class.java.kotlinClass as KClass).constructors.single() + assertEquals(listOf(java.lang.Integer.TYPE), eCons.parameters.map { it.type.javaType }) - assertEquals(A::class.java, ::A.returnType.javaType) - assertEquals(A.Nested::class.java, A::Nested.returnType.javaType) - assertEquals(A.Inner::class.java, A::Inner.returnType.javaType) + assertEquals(A::class.java, aCons.returnType.javaType) + assertEquals(A.Nested::class.java, aNestedCons.returnType.javaType) + assertEquals(A.Inner::class.java, aInnerCons.returnType.javaType) return "OK" -} \ No newline at end of file +} From 7fa40f26521bfc09328aef7b92959f6b6b6b5b19 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Sat, 6 Aug 2022 22:57:54 +0200 Subject: [PATCH 42/74] More tests for ReflectionMapping (javaType) --- .../descriptors/impl/ModuleDescriptorImpl.kt | 13 +++++- .../reflect/lite/impl/KCallableImpl.kt | 4 +- .../kotlinx/reflect/lite/impl/KClassImpl.kt | 22 +++++++++- .../kotlinx/reflect/lite/impl/KTypeImpl.kt | 39 +++++++++++++++-- .../mapping/types/array.kt | 19 +++++--- .../mapping/types/constructors.kt | 0 .../mapping/types/genericArrayElementType.kt | 43 +++++++++++++++++++ .../mapping/types/memberFunctions.kt | 9 ++-- .../types/parameterizedTypeArgument.kt | 31 +++++++++++++ .../mapping/types/parameterizedTypes.kt | 21 +++++---- .../mapping/types/propertyAccessors.kt | 10 ++--- .../mapping/types/supertypes.kt | 7 +-- .../mapping/types/topLevelFunctions.kt | 22 ++++++++++ .../mapping/types/typeParameters.kt | 10 +++-- .../lite/testData/mapping/types/unit.kt | 27 ++++++++++++ .../kotlinx/reflect/lite/tests/MappingTest.kt | 43 +++++++++++++++++++ .../mapping/types/genericArrayElementType.kt | 33 -------------- .../types/parameterizedTypeArgument.kt | 22 ---------- .../mapping/types/topLevelFunctions.kt | 17 -------- .../lite/unusedTestData/mapping/types/unit.kt | 23 ---------- 20 files changed, 282 insertions(+), 133 deletions(-) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/types/array.kt (51%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/types/constructors.kt (100%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/types/memberFunctions.kt (72%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/types/parameterizedTypes.kt (55%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/types/propertyAccessors.kt (74%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/types/supertypes.kt (83%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/types/typeParameters.kt (66%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/genericArrayElementType.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypeArgument.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/topLevelFunctions.kt delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/unit.kt diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index 7c64ce7..177ba56 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -12,7 +12,18 @@ import kotlinx.reflect.lite.name.* internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : ModuleDescriptor { override fun findClass (name: ClassName): ClassDescriptor { val fqName = (JavaToKotlinClassMap.mapKotlinToJava(FqName(name.replace('/', '.'))) ?: ClassId(name)).asJavaLookupFqName() - val jClass = classLoader.tryLoadClass(fqName) ?: error("Failed to load the class: $fqName") + val jClass = when (fqName) { + "kotlin.BooleanArray" -> BooleanArray::class.java + "kotlin.ByteArray" -> ByteArray::class.java + "kotlin.CharArray" -> CharArray::class.java + "kotlin.DoubleArray" -> DoubleArray::class.java + "kotlin.FloatArray" -> FloatArray::class.java + "kotlin.IntArray" -> IntArray::class.java + "kotlin.LongArray" -> LongArray::class.java + "kotlin.ShortArray" -> ShortArray::class.java + "kotlin.Array" -> Array::class.java + else -> classLoader.tryLoadClass(fqName) ?: error("Failed to load the class: $fqName") + } return ClassDescriptorImpl(jClass as Class) } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 9641fce..e66b5f3 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -38,7 +38,9 @@ internal abstract class KCallableImpl: KCallable { get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } override val returnType: KType - get() = KTypeImpl(descriptor.returnType) + get() = KTypeImpl(descriptor.returnType) { + descriptor.caller.returnType + } override val isAbstract: Boolean get() = descriptor.isAbstract diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index a03bb5f..f633228 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -2,6 +2,7 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.internal.* internal class KClassImpl( override val descriptor: ClassDescriptor @@ -36,8 +37,25 @@ internal class KClassImpl( override val typeParameters: List get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } - override val supertypes: List - get() = descriptor.supertypes.map(::KTypeImpl) + // Logic from: https://github.com/JetBrains/kotlin/blob/bfa3f89aeb727518703f0a167153cb048724a6d1/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt#L124 + override val supertypes: List by ReflectProperties.lazySoft { + val kotlinTypes = descriptor.supertypes + val result = ArrayList(kotlinTypes.size) + kotlinTypes.mapTo(result) { kotlinType -> + KTypeImpl(kotlinType) { + val superClass = kotlinType.descriptor + if (superClass !is ClassDescriptor<*>) throw KotlinReflectionInternalError("Supertype not a class: $superClass") + val superJavaClass = superClass.jClass + if (descriptor.jClass.superclass == superJavaClass) { + descriptor.jClass.genericSuperclass + } else { + val index = descriptor.jClass.interfaces.indexOf(superJavaClass) + if (index < 0) throw KotlinReflectionInternalError("No superclass of $this in Java reflection for $superClass") + descriptor.jClass.genericInterfaces[index] + } + } + } + } override val isFinal: Boolean get() = descriptor.isFinal diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 63922b1..32843e2 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -24,11 +24,30 @@ internal class KTypeImpl( get() { val typeArguments = type.arguments if (typeArguments.isEmpty()) return emptyList() - return typeArguments.map { typeProjection -> + return typeArguments.mapIndexed { i, typeProjection -> if (typeProjection.isStarProjection) { KTypeProjection.STAR } else { - val type = KTypeImpl(typeProjection.type) + val type = KTypeImpl(typeProjection.type, + if (computeJavaType == null) null else fun(): Type { + return when (val javaType = javaType) { + is Class<*> -> { + // It's either an array or a raw type. + if (javaType.isArray) javaType.componentType else Any::class.java + } + is GenericArrayType -> { + if (i != 0) throw KotlinReflectionInternalError("Array type has been queried for a non-0th argument: $this") + javaType.genericComponentType + } + is ParameterizedType -> { + val argument = javaType.parameterizedTypeArguments[i] + // In "Foo", the JVM type of the first type argument should be "Bar", not "? extends Bar" + if (argument !is WildcardType) argument + else argument.lowerBounds.firstOrNull() ?: argument.upperBounds.first() + } + else -> throw KotlinReflectionInternalError("Non-generic type has been queried for arguments: $this") + } + }) when (typeProjection.projectionKind) { KVariance.INVARIANT -> KTypeProjection.invariant(type) KVariance.IN -> KTypeProjection.contravariant(type) @@ -70,5 +89,19 @@ fun KType.computeJavaType(): Type { } else -> throw UnsupportedOperationException("Unsupported type classifier: $this") } - throw UnsupportedOperationException("Unsupported type classifier: $this") + throw UnsupportedOperationException("Unsupported type classifier: ${this.classifier}") } + +// Logic from here: https://github.com/JetBrains/kotlin/blob/fb296b5b95a56fe380bdbe7c9f61d092bd21f275/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/reflectClassUtil.kt#L92 +/** + * @return all arguments of a parameterized type, including those of outer classes in case this type represents an inner generic. + * The returned list starts with the arguments to the innermost class, then continues with those of its outer class, and so on. + * For example, for the type `Outer.Inner` the result would be `[C, D, A, B]`. + */ +val Type.parameterizedTypeArguments: List + get() { + if (this !is ParameterizedType) return emptyList() + if (ownerType == null) return actualTypeArguments.toList() + + return generateSequence(this) { it.ownerType as? ParameterizedType }.flatMap { it.actualTypeArguments.asSequence() }.toList() + } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/array.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt similarity index 51% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/array.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt index cb1d470..eccdef9 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/array.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt @@ -1,9 +1,11 @@ package tests.mapping.types.array +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import java.lang.reflect.GenericArrayType import java.lang.reflect.TypeVariable import java.lang.reflect.ParameterizedType -import kotlin.reflect.jvm.* import kotlin.test.assertEquals fun foo(strings: Array, integers: Array, objectArrays: Array>) {} @@ -14,17 +16,20 @@ class A { } fun box(): String { - assertEquals(Array::class.java, ::foo.parameters[0].type.javaType) - assertEquals(Array::class.java, ::foo.parameters[1].type.javaType) - assertEquals(Array>::class.java, ::foo.parameters[2].type.javaType) + val foo = Class.forName("tests.mapping.types.array.ArrayKt").kotlinClass.getMemberByName("foo") + assertEquals(Array::class.java, foo.parameters[0].type.javaType) + assertEquals(Array::class.java, foo.parameters[1].type.javaType) + assertEquals(Array>::class.java, foo.parameters[2].type.javaType) - val g = ::bar.returnType.javaType + val bar = Class.forName("tests.mapping.types.array.ArrayKt").kotlinClass.getMemberByName("bar") + val g = bar.returnType.javaType if (g !is GenericArrayType || g.genericComponentType !is ParameterizedType) return "Fail: should be array of parameterized type, but was $g (${g.javaClass})" - val h = A::baz.returnType.javaType + val baz = A::class.java.kotlinClass.getMemberByName("baz") as KFunction> + val h = baz.returnType.javaType if (h !is GenericArrayType || h.genericComponentType !is TypeVariable<*>) return "Fail: should be array of type variable, but was $h (${h.javaClass})" return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/constructors.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt new file mode 100644 index 0000000..d3077cd --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt @@ -0,0 +1,43 @@ +package tests.mapping.types.genericArrayElementType + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import java.lang.reflect.* +import kotlin.test.* + +class Bar +fun arrayOfInvBar(): Array = null!! +fun arrayOfInBar(): Array = null!! +fun arrayOfOutBar(): Array = null!! + +fun arrayOfInvList(): Array> = null!! +fun arrayOfInList(): Array> = null!! +fun arrayOfOutList(): Array> = null!! + +fun box(): String { + // NB: in "Array", Java type of X is always Any::class.java because this is the JVM signature generated by the compiler + + val clazz = Class.forName("tests.mapping.types.genericArrayElementType.GenericArrayElementTypeKt").kotlinClass + val arrayOfInvBar = clazz.getMemberByName("arrayOfInvBar") as KFunction> + assertEquals(Bar::class.java, arrayOfInvBar.returnType.arguments.single().type!!.javaType) + + val arrayOfInBar = clazz.getMemberByName("arrayOfInBar") as KFunction> + assertEquals(Any::class.java, arrayOfInBar.returnType.arguments.single().type!!.javaType) + + val arrayOfOutBar = clazz.getMemberByName("arrayOfOutBar") as KFunction> + assertEquals(Bar::class.java, arrayOfOutBar.returnType.arguments.single().type!!.javaType) + + val arrayOfInvList = clazz.getMemberByName("arrayOfInvList") as KFunction>> + val invList = arrayOfInvList.returnType.arguments.single().type!!.javaType + assertTrue(invList is ParameterizedType && invList.rawType == List::class.java, invList.toString()) + + val arrayOfInList = clazz.getMemberByName("arrayOfInList") as KFunction>> + assertEquals(Any::class.java, arrayOfInList.returnType.arguments.single().type!!.javaType) + + val arrayOfOutList = clazz.getMemberByName("arrayOfOutList") as KFunction>> + val outList = arrayOfOutList.returnType.arguments.single().type!!.javaType + assertTrue(outList is ParameterizedType && outList.rawType == List::class.java, outList.toString()) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/memberFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt similarity index 72% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/memberFunctions.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt index 8463c79..1d09ae3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/memberFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt @@ -1,6 +1,7 @@ package tests.mapping.types.memberFunctions -import kotlin.reflect.jvm.javaType +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals class A { @@ -13,13 +14,13 @@ object O { } fun box(): String { - val foo = A::foo + val foo = A::class.java.kotlinClass.getMemberByName("foo") assertEquals(listOf(A::class.java, java.lang.Long::class.java), foo.parameters.map { it.type.javaType }) assertEquals(java.lang.Long.TYPE, foo.returnType.javaType) - val bar = O::class.members.single { it.name == "bar" } + val bar = O::class.java.kotlinClass.members.single { it.name == "bar" } assertEquals(listOf(O::class.java, A::class.java), bar.parameters.map { it.type.javaType }) assertEquals(String::class.java, bar.returnType.javaType) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt new file mode 100644 index 0000000..15633d9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt @@ -0,0 +1,31 @@ +package tests.mapping.types.parameterizedTypeArgument + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +fun listOfStrings(): List = null!! + +class Foo +class Bar +fun fooOfInvBar(): Foo = null!! +fun fooOfInBar(): Foo = null!! +fun fooOfOutBar(): Foo = null!! + +fun box(): String { + val clazz = Class.forName("tests.mapping.types.parameterizedTypeArgument.ParameterizedTypeArgumentKt").kotlinClass + val listOfStrings = clazz.getMemberByName("listOfStrings") as KFunction> + assertEquals(String::class.java, listOfStrings.returnType.arguments.single().type!!.javaType) + + val fooOfInvBar = clazz.getMemberByName("fooOfInvBar") as KFunction> + assertEquals(Bar::class.java, fooOfInvBar.returnType.arguments.single().type!!.javaType) + + val fooOfInBar = clazz.getMemberByName("fooOfInBar") as KFunction> + assertEquals(Bar::class.java, fooOfInBar.returnType.arguments.single().type!!.javaType) + + val fooOfOutBar = clazz.getMemberByName("fooOfOutBar") as KFunction> + assertEquals(Bar::class.java, fooOfOutBar.returnType.arguments.single().type!!.javaType) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt similarity index 55% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypes.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt index c834ec0..acb1986 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt @@ -1,8 +1,9 @@ package tests.mapping.types.parameterizedTypes +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import java.lang.reflect.ParameterizedType -import kotlin.reflect.* -import kotlin.reflect.jvm.javaType import kotlin.test.assertEquals class A(private var foo: List) @@ -23,19 +24,23 @@ fun assertGenericType(type: KType) { } fun box(): String { - val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*> + val foo = A::class.java.kotlinClass.members.single { it.name == "foo" } as KMutableProperty<*> assertGenericType(foo.returnType) assertGenericType(foo.getter.returnType) assertGenericType(foo.setter.parameters.last().type) - val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*> + val bar = O::class.java.kotlinClass.members.single { it.name == "bar" } as KMutableProperty<*> assertGenericType(bar.returnType) assertGenericType(bar.getter.returnType) assertGenericType(bar.setter.parameters.last().type) - assertGenericType(::topLevel.returnType) - assertGenericType(Any::extension.returnType) - assertGenericType(::A.parameters.single().type) + val clazz = Class.forName("tests.mapping.types.parameterizedTypes.ParameterizedTypesKt").kotlinClass + val topLevel = clazz.getMemberByName("topLevel") + assertGenericType(topLevel.returnType) + val extension = clazz.getMemberByName("extension") + assertGenericType(extension.returnType) + assertGenericType((A::class.java.kotlinClass as KClass).constructors.first().parameters.single().type) + return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt similarity index 74% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/propertyAccessors.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt index cb0c3d8..8510e69 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/propertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt @@ -1,7 +1,7 @@ package tests.mapping.types.propertyAccessors -import kotlin.reflect.KMutableProperty -import kotlin.reflect.jvm.javaType +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals class A(private var foo: String) @@ -12,15 +12,15 @@ object O { } fun box(): String { - val foo = A::class.members.single { it.name == "foo" } as KMutableProperty<*> + val foo = A::class.java.kotlinClass.members.single { it.name == "foo" } as KMutableProperty<*> assertEquals(listOf(A::class.java), foo.parameters.map { it.type.javaType }) assertEquals(listOf(A::class.java), foo.getter.parameters.map { it.type.javaType }) assertEquals(listOf(A::class.java, String::class.java), foo.setter.parameters.map { it.type.javaType }) - val bar = O::class.members.single { it.name == "bar" } as KMutableProperty<*> + val bar = O::class.java.kotlinClass.members.single { it.name == "bar" } as KMutableProperty<*> assertEquals(listOf(O::class.java), bar.parameters.map { it.type.javaType }) assertEquals(listOf(O::class.java), bar.getter.parameters.map { it.type.javaType }) assertEquals(listOf(O::class.java, String::class.java), bar.setter.parameters.map { it.type.javaType }) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/supertypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt similarity index 83% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/supertypes.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt index cccc70b..bd1a895 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/supertypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt @@ -1,8 +1,9 @@ package tests.mapping.types.supertypes +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import java.lang.reflect.ParameterizedType import java.lang.reflect.TypeVariable -import kotlin.reflect.jvm.javaType import kotlin.test.assertEquals import kotlin.test.assertTrue import kotlin.test.fail @@ -14,7 +15,7 @@ interface Interface2 class A : Interface, Klass(), Interface2 fun box(): String { - val (i, k, i2) = A::class.supertypes.map { it.javaType } + val (i, k, i2) = (A::class.java.kotlinClass as KClass>).supertypes.map { it.javaType } i as? ParameterizedType ?: fail("Not a parameterized type: $i") assertEquals(Interface::class.java, i.rawType) @@ -27,4 +28,4 @@ fun box(): String { assertEquals(Interface2::class.java, i2) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt new file mode 100644 index 0000000..e43c06a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt @@ -0,0 +1,22 @@ +package tests.mapping.types.topLevelFunctions + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +fun free(s: String): Int = s.length + +fun Any.extension() {} + +fun box(): String { + val clazz = Class.forName("tests.mapping.types.topLevelFunctions.TopLevelFunctionsKt").kotlinClass + val free = clazz.getMemberByName("free") as KFunction + val extension = clazz.getMemberByName("extension") as KFunction + assertEquals(java.lang.Integer.TYPE, free.returnType.javaType) + assertEquals(String::class.java, free.parameters.single().type.javaType) + + assertEquals(Any::class.java, extension.parameters.single().type.javaType) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt similarity index 66% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/typeParameters.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt index 6f913ae..595c07d 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/typeParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt @@ -1,7 +1,9 @@ package tests.mapping.types.typeParameters +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import java.lang.reflect.TypeVariable -import kotlin.reflect.jvm.* import kotlin.test.assertEquals class A { @@ -9,15 +11,15 @@ class A { } fun box(): String { - val f = A::foo + val f = A::class.java.kotlinClass.getMemberByName("foo") as KFunction val t = f.parameters.last().type.javaType if (t !is TypeVariable<*>) return "Fail, t should be a type variable: $t" assertEquals("T", t.name) assertEquals(A::class.java, (t.genericDeclaration as Class<*>)) - val tp = A::class.typeParameters + val tp = (A::class.java.kotlinClass as KClass>).typeParameters assertEquals(CharSequence::class.java, tp.single().upperBounds.single().javaType) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt new file mode 100644 index 0000000..505d56e --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt @@ -0,0 +1,27 @@ +package tests.mapping.types.unit + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +fun foo(unitParam: Unit, nullableUnitParam: Unit?): Unit {} + +var bar: Unit = Unit + +fun box(): String { + assert(Unit::class.java != java.lang.Void.TYPE) + + val foo = Class.forName("tests.mapping.types.unit.UnitKt").kotlinClass.getMemberByName("foo") as KFunction + assertEquals(Unit::class.java, foo.parameters[0].type.javaType) + assertEquals(Unit::class.java, foo.parameters[1].type.javaType) + assertEquals(java.lang.Void.TYPE, foo.returnType.javaType) + + val bar = Class.forName("tests.mapping.types.unit.UnitKt").kotlinClass.getMemberByName("bar") as KMutableProperty0 + assertEquals(Unit::class.java, bar.returnType.javaType) + assertEquals(Unit::class.java, bar.getter.returnType.javaType) + assertEquals(Unit::class.java, bar.setter.parameters.single().type.javaType) + assertEquals(java.lang.Void.TYPE, bar.setter.returnType.javaType) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt index c974607..867685f 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt @@ -8,4 +8,47 @@ class MappingTest { @Test fun testFunctions() = test("mapping.functions") { tests.mapping.functions.box() } + + @Test + fun testExtensionProperty() = test("mapping.extensionProperty") { tests.mapping.extensionProperty.box() } + + @Test + fun testTopLevelProperty() = test("mapping.topLevelProperty") { tests.mapping.topLevelProperty.box() } + + @Test + fun testInterfaceCompanionPropertyWithJvmField() = test("mapping.interfaceCompanionPropertyWithJvmField") { tests.mapping.interfaceCompanionPropertyWithJvmField.box() } + + // javaType + @Test + fun testTypesConstructors() = test("mapping.mapping.types.constructors") { tests.mapping.types.constructors.box() } + + @Test + fun testTypesTopLevelFunctions() = test("mapping.mapping.types.topLevelFunctions") { tests.mapping.types.topLevelFunctions.box() } + + @Test + fun testTypesMemberFunctions() = test("mapping.mapping.types.memberFunctions") { tests.mapping.types.memberFunctions.box() } + + @Test + fun testTypesPropertyAccessors() = test("mapping.mapping.types.propertyAccessors") { tests.mapping.types.propertyAccessors.box() } + + @Test + fun testTypesArray() = test("mapping.mapping.types.array") { tests.mapping.types.array.box() } + + @Test + fun testTypesGenericArrayElementType() = test("mapping.mapping.types.genericArrayElementType") { tests.mapping.types.genericArrayElementType.box() } + + @Test + fun testTypesTypeParameters() = test("mapping.mapping.types.typeParameters") { tests.mapping.types.typeParameters.box() } + + @Test + fun testTypesParameterizedTypeArgument() = test("mapping.mapping.types.parameterizedTypeArgument") { tests.mapping.types.parameterizedTypeArgument.box() } + + @Test + fun testTypesParameterizedTypes() = test("mapping.mapping.types.parameterizedTypes") { tests.mapping.types.parameterizedTypes.box() } + + @Test + fun testTypesSupertypes() = test("mapping.mapping.types.supertypes") { tests.mapping.types.supertypes.box() } + + @Test + fun testTypesUnit() = test("mapping.mapping.types.unit") { tests.mapping.types.unit.box() } } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/genericArrayElementType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/genericArrayElementType.kt deleted file mode 100644 index f2ac8b0..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/genericArrayElementType.kt +++ /dev/null @@ -1,33 +0,0 @@ -package tests.mapping.types.genericArrayElementType - -import java.lang.reflect.ParameterizedType -import kotlin.reflect.jvm.javaType -import kotlin.test.assertEquals -import kotlin.test.assertTrue - -class Bar -fun arrayOfInvBar(): Array = null!! -fun arrayOfInBar(): Array = null!! -fun arrayOfOutBar(): Array = null!! - -fun arrayOfInvList(): Array> = null!! -fun arrayOfInList(): Array> = null!! -fun arrayOfOutList(): Array> = null!! - -fun box(): String { - // NB: in "Array", Java type of X is always Any::class.java because this is the JVM signature generated by the compiler - - assertEquals(Bar::class.java, ::arrayOfInvBar.returnType.arguments.single().type!!.javaType) - assertEquals(Any::class.java, ::arrayOfInBar.returnType.arguments.single().type!!.javaType) - assertEquals(Bar::class.java, ::arrayOfOutBar.returnType.arguments.single().type!!.javaType) - - val invList = ::arrayOfInvList.returnType.arguments.single().type!!.javaType - assertTrue(invList is ParameterizedType && invList.rawType == List::class.java, invList.toString()) - - assertEquals(Any::class.java, ::arrayOfInList.returnType.arguments.single().type!!.javaType) - - val outList = ::arrayOfOutList.returnType.arguments.single().type!!.javaType - assertTrue(outList is ParameterizedType && outList.rawType == List::class.java, outList.toString()) - - return "OK" -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypeArgument.kt deleted file mode 100644 index 079ab0c..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/parameterizedTypeArgument.kt +++ /dev/null @@ -1,22 +0,0 @@ -package tests.mapping.types.parameterizedTypeArgument - -import kotlin.reflect.jvm.javaType -import kotlin.test.assertEquals - -fun listOfStrings(): List = null!! - -class Foo -class Bar -fun fooOfInvBar(): Foo = null!! -fun fooOfInBar(): Foo = null!! -fun fooOfOutBar(): Foo = null!! - -fun box(): String { - assertEquals(String::class.java, ::listOfStrings.returnType.arguments.single().type!!.javaType) - - assertEquals(Bar::class.java, ::fooOfInvBar.returnType.arguments.single().type!!.javaType) - assertEquals(Bar::class.java, ::fooOfInBar.returnType.arguments.single().type!!.javaType) - assertEquals(Bar::class.java, ::fooOfOutBar.returnType.arguments.single().type!!.javaType) - - return "OK" -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/topLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/topLevelFunctions.kt deleted file mode 100644 index e0e0fe7..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/topLevelFunctions.kt +++ /dev/null @@ -1,17 +0,0 @@ -package tests.mapping.types.topLevelFunctions - -import kotlin.reflect.jvm.* -import kotlin.test.assertEquals - -fun free(s: String): Int = s.length - -fun Any.extension() {} - -fun box(): String { - assertEquals(java.lang.Integer.TYPE, ::free.returnType.javaType) - assertEquals(String::class.java, ::free.parameters.single().type.javaType) - - assertEquals(Any::class.java, Any::extension.parameters.single().type.javaType) - - return "OK" -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/unit.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/unit.kt deleted file mode 100644 index b74846e..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/unit.kt +++ /dev/null @@ -1,23 +0,0 @@ -package tests.mapping.types.unit - -import kotlin.reflect.jvm.* -import kotlin.test.assertEquals - -fun foo(unitParam: Unit, nullableUnitParam: Unit?): Unit {} - -var bar: Unit = Unit - -fun box(): String { - assert(Unit::class.java != java.lang.Void.TYPE) - - assertEquals(Unit::class.java, ::foo.parameters[0].type.javaType) - assertEquals(Unit::class.java, ::foo.parameters[1].type.javaType) - assertEquals(java.lang.Void.TYPE, ::foo.returnType.javaType) - - assertEquals(Unit::class.java, ::bar.returnType.javaType) - assertEquals(Unit::class.java, ::bar.getter.returnType.javaType) - assertEquals(Unit::class.java, ::bar.setter.parameters.single().type.javaType) - assertEquals(java.lang.Void.TYPE, ::bar.setter.returnType.javaType) - - return "OK" -} \ No newline at end of file From 8fededb26ad22fa1c0971ca55be32afd7aaafa54 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Sat, 6 Aug 2022 23:55:58 +0200 Subject: [PATCH 43/74] More tests for ReflectJvmMapping --- .../lite/testData/mapping/inlineReifiedFun.kt | 24 ++++++++++++ .../mapping/lateinitProperty.kt | 8 ++-- .../mapping/memberProperty.kt | 8 ++-- .../methodsFromObjectWithoutCustomMembers.kt | 37 +++++++++++++++++++ .../mapping/methodsFromSuperInterface.kt | 10 +++-- .../mapping/privateProperty.kt | 10 ++--- .../mapping/propertyAccessorsWithJvmName.kt | 9 +++-- .../mapping/syntheticFields.kt | 4 +- .../kotlinx/reflect/lite/tests/MappingTest.kt | 24 ++++++++++++ .../mapping/inlineReifiedFun.kt | 22 ----------- .../mapping/methodsFromObject.kt | 20 +++++----- 11 files changed, 124 insertions(+), 52 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/lateinitProperty.kt (77%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/memberProperty.kt (76%) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/methodsFromSuperInterface.kt (54%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/privateProperty.kt (57%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/propertyAccessorsWithJvmName.kt (65%) rename src/test/java/kotlinx/reflect/lite/{unusedTestData => testData}/mapping/syntheticFields.kt (85%) delete mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineReifiedFun.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt new file mode 100644 index 0000000..2854d5c --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt @@ -0,0 +1,24 @@ +package tests.mapping.inlineReifiedFun + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.test.assertEquals + +inline fun f() = 1 + +fun g() {} + +class Foo { + inline fun h(t: T) = 1 +} + +fun box(): String { + val g = Class.forName("tests.mapping.inlineReifiedFun.InlineReifiedFunKt").kotlinClass.getMemberByName("g") as KFunction<*> + assertEquals(g as Any?, g.javaMethod!!.kotlinFunction) + + val h = Foo::class.java.kotlinClass.members.single { it.name == "h" } as KFunction<*> + assertEquals(h, h.javaMethod!!.kotlinFunction as Any?) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/lateinitProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt similarity index 77% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/lateinitProperty.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt index c94391e..cac6d7a 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/lateinitProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt @@ -1,6 +1,8 @@ package tests.mapping.lateinitProperty -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.tests.* import kotlin.test.* class K { @@ -8,7 +10,7 @@ class K { } fun box(): String { - val p = K::value + val p = K::class.java.kotlinClass.getMemberByName("value") as KMutableProperty1 assertNotNull(p.javaField, "Fail p field") @@ -27,4 +29,4 @@ fun box(): String { assertEquals("foo", getter.invoke(k), "Fail k setter") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt similarity index 76% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/memberProperty.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt index b006863..4c8a11f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/memberProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt @@ -1,12 +1,14 @@ package tests.mapping.memberProperty -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.* class K(var value: Long) fun box(): String { - val p = K::value + val p = K::class.java.kotlinClass.getMemberByName("value") as KMutableProperty1 assertNotNull(p.javaField, "Fail p field") @@ -25,4 +27,4 @@ fun box(): String { assertEquals(-239L, getter.invoke(k), "Fail k setter") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt new file mode 100644 index 0000000..53af3dc --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt @@ -0,0 +1,37 @@ +// Part of the test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt + +package tests.mapping.methodsFromObjectWithoutCustomMembers + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlin.test.assertEquals + +annotation class A +interface I +class C + +interface MyCustomMembers { + fun equals(): Boolean + fun hashCode(hehe: Int): Int + fun toString(hehe: String): Any +} + +interface MyCloneable : Cloneable + +fun KClass<*>.functions() = members.filterIsInstance>().map { it.javaMethod!!.name }.sorted() + +fun box(): String { + assertEquals(listOf("equals", "hashCode", "toString"), (A::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (I::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (C::class.java.kotlinClass as KClass<*>).functions()) + + // Now we can get only declared functions: equals(), hashCode(), toString() +// assertEquals( +// listOf("equals", "equals", "hashCode", "hashCode", "toString", "toString"), +// (MyCustomMembers::class.java.kotlinClass as KClass<*>).functions() +// ) + + assertEquals(listOf("clone", "equals", "hashCode", "toString"), (MyCloneable::class.java.kotlinClass as KClass<*>).functions()) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt similarity index 54% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromSuperInterface.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt index 032c922..4ccd8f4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromSuperInterface.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt @@ -1,6 +1,8 @@ package tests.mapping.methodsFromSuperInterface -import kotlin.reflect.jvm.javaMethod +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals interface A1 { @@ -19,8 +21,8 @@ interface C : B2 abstract class D : B1, C fun box(): String { - assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A1.a1()", D::a1.javaMethod!!.toString()) - assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A2.a2()", D::a2.javaMethod!!.toString()) + assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A1.a1()", (D::class.java.kotlinClass.getMemberByName("a1") as KFunction<*>).javaMethod.toString()) + assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A2.a2()", (D::class.java.kotlinClass.getMemberByName("a2") as KFunction<*>).javaMethod!!.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/privateProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt similarity index 57% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/privateProperty.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt index 0ed598c..05a5d7c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/privateProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt @@ -1,18 +1,18 @@ package tests.mapping.privateProperty -import kotlin.reflect.* -import kotlin.reflect.full.* -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* import kotlin.test.* class K(private var value: Long) fun box(): String { - val p = K::class.declaredMemberProperties.single() as KMutableProperty1 + val p = (K::class.java.kotlinClass).getMemberByName("value") as KMutableProperty1 assertNotNull(p.javaField, "Fail p field") assertNull(p.javaGetter, "Fail p getter") assertNull(p.javaSetter, "Fail p setter") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/propertyAccessorsWithJvmName.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt similarity index 65% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/propertyAccessorsWithJvmName.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt index 0e15d7b..4c21512 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/propertyAccessorsWithJvmName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt @@ -1,6 +1,8 @@ package tests.mapping.propertyAccessorsWithJvmName -import kotlin.reflect.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* var state: String = "value" @JvmName("getter") @@ -9,7 +11,8 @@ var state: String = "value" set fun box(): String { - val p = ::state + val clazz = Class.forName("tests.mapping.propertyAccessorsWithJvmName.PropertyAccessorsWithJvmNameKt").kotlinClass + val p = clazz.getMemberByName("state") as KMutableProperty0 if (p.name != "state") return "Fail name: ${p.name}" if (p.get() != "value") return "Fail get: ${p.get()}" @@ -22,4 +25,4 @@ fun box(): String { if (setterName != "setter") return "Fail setter name: $setterName" return p.get() -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/syntheticFields.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt similarity index 85% rename from src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/syntheticFields.kt rename to src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt index 3a059a0..f8e83a3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/syntheticFields.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt @@ -1,6 +1,6 @@ package tests.mapping.syntheticFields -import kotlin.reflect.jvm.kotlinProperty +import kotlinx.reflect.lite.impl.kotlinProperty enum class A { // There's a synthetic field "$VALUES" here @@ -13,4 +13,4 @@ fun box(): String { } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt index 867685f..7a59166 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt @@ -18,6 +18,30 @@ class MappingTest { @Test fun testInterfaceCompanionPropertyWithJvmField() = test("mapping.interfaceCompanionPropertyWithJvmField") { tests.mapping.interfaceCompanionPropertyWithJvmField.box() } + @Test + fun testMemberProperty() = test("mapping.memberProperty") { tests.mapping.memberProperty.box() } + + @Test + fun testPrivateProperty() = test("mapping.privateProperty") { tests.mapping.privateProperty.box() } + + @Test + fun testPropertyAccessorsWithJvmName() = test("mapping.propertyAccessorsWithJvmName") { tests.mapping.propertyAccessorsWithJvmName.box() } + + @Test + fun testSyntheticFields() = test("mapping.syntheticFields") { tests.mapping.syntheticFields.box() } + + @Test + fun testMethodsFromSuperInterface() = test("mapping.methodsFromSuperInterface") { tests.mapping.methodsFromSuperInterface.box() } + + @Test + fun testMethodsFromObjectWithoutCustomMembers() = test("mapping.methodsFromObjectWithoutCustomMembers") { tests.mapping.methodsFromObjectWithoutCustomMembers.box() } + + @Test + fun testLateinitProperty() = test("mapping.lateinitProperty") { tests.mapping.lateinitProperty.box() } + + @Test + fun testInlineReifiedFun() = test("mapping.inlineReifiedFun") { tests.mapping.inlineReifiedFun.box() } + // javaType @Test fun testTypesConstructors() = test("mapping.mapping.types.constructors") { tests.mapping.types.constructors.box() } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineReifiedFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineReifiedFun.kt deleted file mode 100644 index ebf3993..0000000 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineReifiedFun.kt +++ /dev/null @@ -1,22 +0,0 @@ -package tests.mapping.inlineReifiedFun - -import kotlin.reflect.* -import kotlin.reflect.jvm.* -import kotlin.test.assertEquals - -inline fun f() = 1 - -fun g() {} - -class Foo { - inline fun h(t: T) = 1 -} - -fun box(): String { - assertEquals(::g as Any?, ::g.javaMethod!!.kotlinFunction) - - val h = Foo::class.members.single { it.name == "h" } as KFunction<*> - assertEquals(h, h.javaMethod!!.kotlinFunction as Any?) - - return "OK" -} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt index d74e19a..b4bf7e3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt @@ -1,8 +1,7 @@ package tests.mapping.methodsFromObject -import kotlin.reflect.KClass -import kotlin.reflect.full.memberFunctions -import kotlin.reflect.jvm.javaMethod +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals annotation class A @@ -17,19 +16,20 @@ interface MyCustomMembers { interface MyCloneable : Cloneable -fun KClass<*>.functions() = memberFunctions.map { it.javaMethod!!.name }.sorted() +fun KClass<*>.functions() = members.filterIsInstance>().map { it.javaMethod!!.name }.sorted() fun box(): String { - assertEquals(listOf("equals", "hashCode", "toString"), A::class.functions()) - assertEquals(listOf("equals", "hashCode", "toString"), I::class.functions()) - assertEquals(listOf("equals", "hashCode", "toString"), C::class.functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (A::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (I::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (C::class.java.kotlinClass as KClass<*>).functions()) + // Now we can get only declared functions: equals(), hashCode(), toString() assertEquals( listOf("equals", "equals", "hashCode", "hashCode", "toString", "toString"), - MyCustomMembers::class.functions() + (MyCustomMembers::class.java.kotlinClass as KClass<*>).functions() ) - assertEquals(listOf("clone", "equals", "hashCode", "toString"), MyCloneable::class.functions()) + assertEquals(listOf("clone", "equals", "hashCode", "toString"), (MyCloneable::class.java.kotlinClass as KClass<*>).functions()) return "OK" -} \ No newline at end of file +} From 542ea8b098a4615e7b002d73e084b7ddca2dd7ad Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Sun, 7 Aug 2022 00:07:44 +0200 Subject: [PATCH 44/74] Fix defaultPrimitiveValue --- .../lite/descriptors/impl/KotlinType.kt | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 99fb627..5717d62 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -90,18 +90,18 @@ internal val ClassifierDescriptor.defaultType: KotlinType // Copied from here: https://github.com/JetBrains/kotlin/blob/0a6d010d1c7258e25be8e4d99a44a5ab0e66ded2/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt#L260 internal fun defaultPrimitiveValue(type: Type?): Any? = - if (type is Class<*>) { - when (type.name) { - "java.lang.Boolean" -> false - "java.lang.Character" -> 0.toChar() - "java.lang.Byte" -> 0.toByte() - "java.lang.Short" -> 0.toShort() - "java.lang.Integer" -> 0 - "java.lang.Float" -> 0f - "java.lang.Long" -> 0L - "java.lang.Double" -> 0.0 - "java.lang.String" -> "" - "java.lang.Void" -> throw IllegalStateException("Parameter with void type is illegal") + if (type is Class<*> && type.isPrimitive) { + when (type) { + Boolean::class.java -> false + Char::class.java -> 0.toChar() + Byte::class.java -> 0.toByte() + Short::class.java -> 0.toShort() + Int::class.java -> 0 + Float::class.java -> 0f + Long::class.java -> 0L + Double::class.java -> 0.0 + String::class.java -> "" + Void.TYPE -> throw IllegalStateException("Parameter with void type is illegal") else -> throw UnsupportedOperationException("Unknown primitive: $type") } } else null From 83726b20b1f84862c3fc0c9a880030c7592deb7d Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Sun, 7 Aug 2022 00:12:19 +0200 Subject: [PATCH 45/74] Tests for properties --- .../reflect/lite/tests/KPropertyTest.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt index 15f908a..dd0f100 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt @@ -12,4 +12,42 @@ class KPropertyTest { @Test fun testTopLevelPropertyAccessors() = test("properties.accessors.topLevelPropertyAccessors") { tests.properties.accessors.topLevelPropertyAccessors.box() } + + //-- + @Test + fun testPropertyOfNestedClassAndArrayType() = test("properties.accessors.propertyOfNestedClassAndArrayType") { tests.properties.propertyOfNestedClassAndArrayType.box() } + + @Test + fun testInvokeKProperty() = test("properties.accessors.invokeKProperty") { tests.properties.invokeKProperty.box() } + + @Test + fun testSimpleGetProperties() = test("properties.accessors.simpleGetProperties") { tests.properties.simpleGetProperties.box() } + + // isAccessible + @Test + fun testAccessPrivateProperties() = test("properties.accessors.accessPrivateProperties") { tests.call.accessPrivateProperties.box() } + + @Test + fun testPublicClassValAccessible() = test("properties.publicClassValAccessible") { tests.properties.publicClassValAccessible.box() } + + @Test + fun testPrivateToThisAccessors() = test("properties.privateToThisAccessors") { tests.properties.privateToThisAccessors.box() } + + @Test + fun testProtectedClassVar() = test("properties.protectedClassVar") { tests.properties.protectedClassVar.box() } + + @Test + fun testPrivateClassVar() = test("properties.privateClassVar") { tests.properties.privateClassVar.box() } + + @Test + fun testPrivatePropertyCallIsAccessibleOnAccessors() = test("properties.privatePropertyCallIsAccessibleOnAccessors") { tests.properties.privatePropertyCallIsAccessibleOnAccessors.box() } + + @Test + fun testPrivateJvmStaticVarInObject() = test("properties.privateJvmStaticVarInObject") { tests.properties.privateJvmStaticVarInObject.box() } + + @Test + fun testPrivateClassVal() = test("properties.privateClassVal") { tests.properties.privateClassVal.box() } + + @Test + fun testCallPrivatePropertyFromGetProperties() = test("properties.callPrivatePropertyFromGetProperties") { tests.properties.callPrivatePropertyFromGetProperties.box() } } From e42791b6d8312703a6d727f4fa914b5271163d3a Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 8 Aug 2022 14:16:16 +0200 Subject: [PATCH 46/74] KCallables.callSuspend implementation --- .../reflect/lite/impl/KCallableImpl.kt | 18 ++++++++- .../kotlinx/reflect/lite/impl/KCallables.kt | 21 ++++++++++ src/test/java/kotlinx/reflect/lite/helpers.kt | 39 +++++++++++++++++++ .../lambdaClasses/reflectOnLambdaInField.kt | 3 +- .../lambdaClasses/reflectOnLambdaInSuspend.kt | 26 +++++++++++++ .../reflectOnLambdaInSuspendLambda.kt | 16 ++++++++ 6 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KCallables.kt create mode 100644 src/test/java/kotlinx/reflect/lite/helpers.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index e66b5f3..984d797 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -4,6 +4,7 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.internal.* +import java.lang.reflect.* import java.util.ArrayList import kotlin.coroutines.* @@ -39,7 +40,7 @@ internal abstract class KCallableImpl: KCallable { override val returnType: KType get() = KTypeImpl(descriptor.returnType) { - descriptor.caller.returnType + extractContinuationArgument() ?: descriptor.caller.returnType } override val isAbstract: Boolean @@ -115,4 +116,19 @@ internal abstract class KCallableImpl: KCallable { @Suppress("UNCHECKED_CAST") return caller.call(arguments.toTypedArray()) as R } + + private fun extractContinuationArgument(): Type? { + if ((descriptor as? FunctionDescriptor)?.isSuspend == true) { + // kotlin.coroutines.Continuation + val continuationType = descriptor.caller.parameterTypes.lastOrNull() as? ParameterizedType + if (continuationType?.rawType == Continuation::class.java) { + // ? super java.lang.String + val wildcard = continuationType.actualTypeArguments.single() as? WildcardType + // java.lang.String + return wildcard?.lowerBounds?.first() + } + } + + return null + } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt new file mode 100644 index 0000000..9be7318 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt @@ -0,0 +1,21 @@ +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* +import kotlin.coroutines.intrinsics.* + +/** + * Calls a callable in the current suspend context. If the callable is not a suspend function, behaves as [KCallable.call]. + * Otherwise, calls the suspend function with current continuation. + */ +@SinceKotlin("1.3") +suspend fun KCallable.callSuspend(vararg args: Any?): R { + if (!this.isSuspend) return call(*args) + if (this !is KFunction<*>) throw IllegalArgumentException("Cannot callSuspend on a property $this: suspend properties are not supported yet") + val result = suspendCoroutineUninterceptedOrReturn { call(*args, it) } + // If suspend function returns Unit and tail-call, it might appear, that it returns not Unit, + // see comment above replaceReturnsUnitMarkersWithPushingUnitOnStack for explanation. + // In this case, return Unit manually. + @Suppress("UNCHECKED_CAST") + if (returnType.classifier == Unit::class && !returnType.isMarkedNullable) return (Unit as R) + return result +} diff --git a/src/test/java/kotlinx/reflect/lite/helpers.kt b/src/test/java/kotlinx/reflect/lite/helpers.kt new file mode 100644 index 0000000..bdcbb1b --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/helpers.kt @@ -0,0 +1,39 @@ +package helpers + +import kotlin.coroutines.* + +fun handleResultContinuation(x: (T) -> Unit): Continuation = object: Continuation { + override val context = EmptyCoroutineContext + override fun resumeWith(result: Result) { + x(result.getOrThrow()) + } +} + + +fun handleExceptionContinuation(x: (Throwable) -> Unit): Continuation = object: Continuation { + override val context = EmptyCoroutineContext + override fun resumeWith(result: Result) { + result.exceptionOrNull()?.let(x) + } +} + +open class EmptyContinuation(override val context: CoroutineContext = EmptyCoroutineContext) : Continuation { + companion object : EmptyContinuation() + override fun resumeWith(result: Result) { + result.getOrThrow() + } +} + +abstract class ContinuationAdapter : Continuation { + override val context: CoroutineContext = EmptyCoroutineContext + override fun resumeWith(result: Result) { + if (result.isSuccess) { + resume(result.getOrThrow()) + } else { + resumeWithException(result.exceptionOrNull()!!) + } + } + + abstract fun resumeWithException(exception: Throwable) + abstract fun resume(value: T) +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt index 998b9da..8e1381b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt @@ -7,5 +7,6 @@ class C { } fun box(): String { + return C().x.reflect()?.parameters?.singleOrNull()?.name ?: "null" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt new file mode 100644 index 0000000..997ffda --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt @@ -0,0 +1,26 @@ +package tests.lambdaClasses.reflectOnLambdaInSuspend + +// WITH_COROUTINES +// FILE: a.kt + +import helpers.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.coroutines.* + +suspend fun f() = { OK: String -> Unit } + +fun box(): String { + lateinit var x: (String) -> Unit +// suspend { +// x = f() +// }.startCoroutine(EmptyContinuation) + val clazz = Class.forName("tests.lambdaClasses.reflectOnLambdaInSuspend.ReflectOnLambdaInSuspendKt").kotlinClass + val f = clazz.getMemberByName("f") as KFunction<(String) -> Unit> + suspend { + f.callSuspend() + }.startCoroutine(EmptyContinuation) + return "OK" + // return x.reflect()?.parameters?.singleOrNull()?.name ?: "null" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt new file mode 100644 index 0000000..1462828 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt @@ -0,0 +1,16 @@ +package tests.lambdaClasses.reflectOnLambdaInSuspendLambda + +// WITH_COROUTINES +// FILE: a.kt + +import helpers.* +import kotlin.coroutines.* +import kotlin.reflect.jvm.reflect + +fun box(): String { + lateinit var x: (String) -> Unit + suspend { + x = { OK: String -> } + }.startCoroutine(EmptyContinuation) + return x.reflect()?.parameters?.singleOrNull()?.name ?: "null" +} \ No newline at end of file From d26167965cfe3afb0d28812e329ea0a2cde4a932 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 8 Aug 2022 14:39:45 +0200 Subject: [PATCH 47/74] Deprecate Class.toLiteKClass() from test utils and replace it with Class.kotlinClass --- .../testData/call/accessPrivateProperties.kt | 17 ++++- .../reflect/lite/testData/call/bigArity.kt | 72 +++++++++++++++++- .../call/cannotCallEnumConstructor.kt | 3 +- .../testData/call/equalsHashCodeToString.kt | 30 ++++---- .../lite/testData/call/exceptionHappened.kt | 3 +- .../lite/testData/call/fakeOverride.kt | 4 +- .../testData/call/fakeOverrideSubstituted.kt | 4 +- .../call/incorrectNumberOfArguments.kt | 16 ++-- .../testData/call/innerClassConstructor.kt | 9 ++- .../reflect/lite/testData/call/jvmStatic.kt | 6 +- .../jvmStaticInObjectIncorrectReceiver.kt | 4 +- .../lite/testData/call/localClassMember.kt | 6 +- .../testData/call/memberOfGenericClass.kt | 4 +- ...GetterAndGetFunctionDifferentReturnType.kt | 3 +- .../lite/testData/call/protectedMembers.kt | 4 +- .../reflect/lite/testData/call/returnUnit.kt | 8 +- .../lite/testData/call/simpleConstructor.kt | 4 +- .../testData/call/simpleMemberFunction.kt | 6 +- .../lite/testData/classes/classMembers.kt | 5 +- .../lite/testData/classes/classSimpleName.kt | 6 +- .../testData/classes/localClassSimpleName.kt | 16 ++-- .../lite/testData/classes/nestedClasses.kt | 9 ++- .../lite/testData/classes/qualifiedName.kt | 26 +++++-- .../classes/qualifiedNameOfStandardClasses.kt | 74 +++++++++++++------ .../lite/testData/classes/sealedSubclasses.kt | 13 ++-- .../classesWithoutConstructors.kt | 10 ++- .../testData/constructors/constructorName.kt | 6 +- .../lite/testData/constructors/enumEntry.kt | 6 +- .../constructors/simpleGetConstructors.kt | 23 ++++-- .../accessors/extensionPropertyAccessors.kt | 3 +- .../accessors/memberPropertyAccessors.kt | 3 +- .../accessors/topLevelPropertyAccessors.kt | 3 +- .../kotlinx/reflect/lite/tests/testUtil.kt | 8 +- 33 files changed, 290 insertions(+), 124 deletions(-) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt index eb79cbd..7327842 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt @@ -7,7 +7,7 @@ import kotlin.reflect.jvm.* import kotlin.test.* private class A(private var bar: String = "") { - fun getBar() = (A::class.java).toLiteKClass().getMemberByName("bar") + fun getBar() = ((A::class.java).kotlinClass as KClass).getMemberByName("bar") fun getKotlinReflectBar() = A::bar } @@ -15,12 +15,18 @@ private class A(private var bar: String = "") { fun box(): String { // kotlinx.reflect.lite val getBar = A().getBar() as KMutableProperty1 - val bar = tests.call.incorrectNumberOfArguments.A::class.java.toLiteKClass().getMemberByName("bar") + val bar = + (tests.call.incorrectNumberOfArguments.A::class.java.kotlinClass as KClass).getMemberByName( + "bar" + ) bar.isAccessible = true try { getBar.call(A()) } catch (e: Throwable) { - assertEquals("class kotlinx.reflect.lite.calls.CallerImpl\$FieldGetter cannot access a member of class tests.call.accessPrivateProperties.A with modifiers \"private\"", e.message) + assertEquals( + "class kotlinx.reflect.lite.calls.CallerImpl\$FieldGetter cannot access a member of class tests.call.accessPrivateProperties.A with modifiers \"private\"", + e.message + ) } // via kotlin.reflect @@ -32,7 +38,10 @@ fun box(): String { try { kotlinReflectGetBar.call(A()) } catch (e: Throwable) { - assertEquals("java.lang.IllegalAccessException: class kotlin.reflect.jvm.internal.calls.CallerImpl\$FieldGetter cannot access a member of class tests.call.accessPrivateProperties.A with modifiers \"private\"", e.message) + assertEquals( + "java.lang.IllegalAccessException: class kotlin.reflect.jvm.internal.calls.CallerImpl\$FieldGetter cannot access a member of class tests.call.accessPrivateProperties.A with modifiers \"private\"", + e.message + ) } return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt index 8ce4c32..05cb95c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -1,5 +1,7 @@ package tests.call.bigArity +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* class A { @@ -14,9 +16,73 @@ class A { fun box(): String { val a = A() - val foo = (A::class.java).toLiteKClass().getMemberByName("foo") - val o = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "O") as String - val k = foo.call(a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "K") as String + val foo = ((A::class.java).kotlinClass as KClass).getMemberByName("foo") + val o = foo.call( + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + "O" + ) as String + val k = foo.call( + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + a, + "K" + ) as String return o + k } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt index 6bfaa23..2564cae 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -1,5 +1,6 @@ package tests.call.cannotCallEnumConstructor +import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* @@ -7,7 +8,7 @@ enum class E fun box(): String { try { - val c = (E::class.java).toLiteKClass().constructors.single() + val c = ((E::class.java).kotlinClass as KClass).constructors.single() c.isAccessible = true c.call() return "Fail: constructing an enum class should not be allowed" diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt index 7c7e22c..8026366 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -1,8 +1,7 @@ - - package tests.call.equalsHashCodeToString import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* class A @@ -10,9 +9,9 @@ class A data class D(val s: String) fun box(): String { - val aEquals = (A::class.java).toLiteKClass().getMemberByName("equals") as KFunction - val aHashCode = (A::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction - val aToString = (A::class.java).toLiteKClass().getMemberByName("toString") as KFunction + val aEquals = ((A::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction + val aHashCode = ((A::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction + val aToString = ((A::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction val a = A() assert(aEquals.call(a, a)) assert(!aEquals.call(a, 0)) @@ -20,25 +19,28 @@ fun box(): String { assert(aHashCode.call(a) == A::hashCode.call(a)) assert(aToString.call(a).startsWith("tests.call.equalsHashCodeToString.A@")) - val dEquals = (A::class.java).toLiteKClass().getMemberByName("equals") as KFunction - val dHashCode = (A::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction - val dToString = (A::class.java).toLiteKClass().getMemberByName("toString") as KFunction + val dEquals = ((A::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction + val dHashCode = ((A::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction + val dToString = ((A::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction assert(dEquals.call(D("foo"), D("foo"))) assert(!dEquals.call(D("foo"), D("bar"))) assert(dHashCode.call(D("foo")) == D::hashCode.call(D("foo"))) assert(dToString.call(D("foo")) == "D(s=foo)") - val intEquals = (Int::class.java).toLiteKClass().getMemberByName("equals") as KFunction - val intHashCode = (Int::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction - val intToString = (Int::class.java).toLiteKClass().getMemberByName("toString") as KFunction + val intEquals = ((Int::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction + val intHashCode = ((Int::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction + val intToString = ((Int::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction assert(intEquals.call(-1, -1)) assert(intHashCode.call(0) != Int::hashCode.call(1)) assert(intToString.call(42) == "42") - val stringEquals = (String::class.java).toLiteKClass().getMemberByName("equals") as KFunction - val stringHashcode = (String::class.java).toLiteKClass().getMemberByName("hashCode") as KFunction - val stringToString = (String::class.java).toLiteKClass().getMemberByName("toString") as KFunction + val stringEquals = + ((String::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction + val stringHashcode = + ((String::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction + val stringToString = + ((String::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction assert(stringEquals.call("beer", "beer")) stringHashcode.call("beer") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt index da27714..b570a61 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -1,5 +1,6 @@ package tests.call.exceptionHappened +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.InvocationTargetException @@ -8,7 +9,7 @@ fun fail(message: String) { } fun box(): String { - val clazz = Class.forName("tests.call.exceptionHappened.ExceptionHappenedKt").toLiteKDeclarationContainer() + val clazz = Class.forName("tests.call.exceptionHappened.ExceptionHappenedKt").kotlinClass val fail = clazz.getMemberByName("fail") try { fail.call("OK") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt index 8eaeec4..178955a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt @@ -1,5 +1,7 @@ package tests.call.fakeOverride +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* open class A { @@ -9,6 +11,6 @@ open class A { class B : A() fun box(): String { - val foo = (B::class.java).toLiteKClass().getMemberByName("foo") + val foo = ((B::class.java).kotlinClass as KClass).getMemberByName("foo") return foo.call(B()) as String } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt index 9a469a0..9b5aab8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt @@ -1,6 +1,8 @@ package tests.call.fakeOverrideSubstituted import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* open class A(val t: T) { fun foo() = t @@ -9,6 +11,6 @@ open class A(val t: T) { class B(s: String) : A(s) fun box(): String { - val foo = (B::class.java).toLiteKClass().getMemberByName("foo") + val foo = ((B::class.java).kotlinClass as KClass).getMemberByName("foo") return foo.call(B("OK")) as String } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index e3f9458..23bb6bd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -8,7 +8,7 @@ import kotlin.test.* var foo: String = "" class A(private var bar: String = "") { - fun getBar() = (A::class.java).toLiteKClass().getMemberByName("bar") + fun getBar() = ((A::class.java).kotlinClass as KClass).getMemberByName("bar") } object O { @@ -16,9 +16,9 @@ object O { private var baz: String = "" @JvmStatic - fun getBaz() = ((O::class.java).toLiteKClass().getMemberByName("baz") as KMutableProperty<*>).apply { isAccessible = true } + fun getBaz() = (((O::class.java).kotlinClass as KClass).getMemberByName("baz") as KMutableProperty<*>).apply { isAccessible = true } - fun getGetBaz() = (O::class.java).toLiteKClass().getMemberByName("getBaz") as KFunction<*> + fun getGetBaz() = ((O::class.java).kotlinClass as KClass).getMemberByName("getBaz") as KFunction<*> } fun check(callable: KCallable<*>, vararg args: Any?) { @@ -45,26 +45,26 @@ fun check(callable: KCallable<*>, vararg args: Any?) { } private fun testBox() { - val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").toLiteKDeclarationContainer() + val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").kotlinClass val box = clazz.getMemberByName("box") check(box, null) check(box, "") } private fun testAConstructor() { - val aCons = A::class.java.toLiteKClass().getPrimaryConstructor() + val aCons = (A::class.java.kotlinClass as KClass).getPrimaryConstructor() check(aCons) check(aCons, null, "") } private fun testGetBaz() { - val getGetBaz = (O::class.java).toLiteKClass().getMemberByName("getGetBaz") + val getGetBaz = ((O::class.java).kotlinClass as KClass).getMemberByName("getGetBaz") check(getGetBaz) check(getGetBaz, null, "") } private fun testFoo() { - val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").toLiteKDeclarationContainer() + val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").kotlinClass val f = clazz.getMemberByName("foo") as KMutableProperty0 check(f, null) // TODO: args array of size 2 is wrapped into another array of size 1 @@ -83,7 +83,7 @@ private fun testFoo() { private fun testAccessPrivateBarProperty() { val b = A().getBar() as KMutableProperty1 - val bar = A::class.java.toLiteKClass().getMemberByName("bar") + val bar = (A::class.java.kotlinClass as KClass).getMemberByName("bar") bar.isAccessible = true // TODO: kotlinx.reflect.lite.calls.CallerImpl$FieldGetter cannot access a member of class tests.call.incorrectNumberOfArguments.A with modifiers "private" b.call(A()) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt index bb970ba..2656df3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt @@ -1,6 +1,7 @@ package tests.call.innerClassConstructor import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* class A { @@ -9,9 +10,11 @@ class A { } fun box(): String { - val nested = (A::class.java).toLiteKClass().nestedClasses.single { it.simpleName == "Nested" } as KClass - val inner = (A::class.java).toLiteKClass().nestedClasses.single { it.simpleName == "Inner" } as KClass - val aCons = (A::class.java).toLiteKClass().getPrimaryConstructor() + val nested = + ((A::class.java).kotlinClass as KClass).nestedClasses.single { it.simpleName == "Nested" } as KClass + val inner = + ((A::class.java).kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" } as KClass + val aCons = ((A::class.java).kotlinClass as KClass).getPrimaryConstructor() val nestedCons = nested.getPrimaryConstructor() val innerCons = inner.getPrimaryConstructor() return nestedCons.call("O").result + innerCons.call(aCons.call(), "K").result diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt index cbde065..e4b83e0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt @@ -1,6 +1,8 @@ package tests.call.jvmStatic import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* object Obj { @JvmStatic @@ -15,9 +17,9 @@ class C { } fun box(): String { - val foo = (Obj::class.java).toLiteKClass().getMemberByName("foo") + val foo = ((Obj::class.java).kotlinClass as KClass).getMemberByName("foo") foo.call(Obj) - val bar = C.Companion::class.java.toLiteKClass().getMemberByName("bar") + val bar = (C.Companion::class.java.kotlinClass as KClass).getMemberByName("bar") bar.call(C.Companion) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt index 1e924bb..83d853d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt @@ -1,6 +1,8 @@ package tests.call.jvmStaticInObjectIncorrectReceiver import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* object Obj { @JvmStatic @@ -12,7 +14,7 @@ object Obj { @JvmStatic fun sly(obj: Obj) {} - operator fun get(name: String) = (Obj::class.java).toLiteKClass().members.single { it.name == name } + operator fun get(name: String) = ((Obj::class.java).kotlinClass as KClass).members.single { it.name == name } } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt index e7990f4..a2547aa 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt @@ -1,13 +1,15 @@ package tests.call.localClassMember import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* fun box(): String { class Local { fun result(s: String) = s } - val localCons = (Local::class.java).toLiteKClass().getPrimaryConstructor() - val result = (Local::class.java).toLiteKClass().getMemberByName("result") as KFunction + + val localCons = ((Local::class.java).kotlinClass as KClass).getPrimaryConstructor() + val result = ((Local::class.java).kotlinClass as KClass).getMemberByName("result") as KFunction return result.call(localCons.call(), "OK") } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt index 0ba1a83..26337a1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt @@ -1,6 +1,8 @@ package tests.call.memberOfGenericClass import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* var result = "Fail" @@ -11,7 +13,7 @@ class A { } fun box(): String { - val a = (A::class.java).toLiteKClass() + val a = ((A::class.java).kotlinClass as KClass>) val foo = a.getMemberByName("foo") foo.call(a.getPrimaryConstructor().call(), "OK") return result diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt index b9a6937..3e59e4b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt @@ -1,6 +1,7 @@ package tests.call.propertyGetterAndGetFunctionDifferentReturnType import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* data class Foo(val id: String) { @@ -8,7 +9,7 @@ data class Foo(val id: String) { } fun box(): String { - val id = Foo::class.java.toLiteKClass().getMemberByName("id") as KProperty1 + val id = (Foo::class.java.kotlinClass as KClass).getMemberByName("id") as KProperty1 // TODO: `id.call(Foo("abs"))` fails with the error: "object is not an instance of declaring class", expected the same as `id.invoke(Foo("abc))` // id.call(Foo("abc")) id.invoke(Foo("dfdc")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index df12ab0..e911559 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -17,7 +17,9 @@ abstract class Base { class Derived : Base() -fun member(name: String): KCallable<*> = (Derived::class.java).toLiteKClass().members.single { it.name == name }.apply { isAccessible = true } +fun member(name: String): KCallable<*> = + ((Derived::class.java).kotlinClass as KClass).members.single { it.name == name } + .apply { isAccessible = true } fun box(): String { val a = Derived() diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt index 7dffae1..b4f9640 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt @@ -1,5 +1,7 @@ package tests.call.returnUnit +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals @@ -16,12 +18,12 @@ object O { fun nullableUnit(unit: Boolean): Unit? = if (unit) Unit else null fun box(): String { - val clazz = Class.forName("tests.call.returnUnit.ReturnUnitKt").toLiteKDeclarationContainer() + val clazz = Class.forName("tests.call.returnUnit.ReturnUnitKt").kotlinClass val foo = clazz.getMemberByName("foo") assertEquals(Unit, foo.call()) - val bar = A::class.java.toLiteKClass().getMemberByName("bar") + val bar = (A::class.java.kotlinClass as KClass).getMemberByName("bar") assertEquals(Unit, bar.call(A())) - assertEquals(Unit, (O::class.java.toLiteKClass()).members.single { it.name == "baz" }.call(O)) + assertEquals(Unit, ((O::class.java.kotlinClass as KClass)).members.single { it.name == "baz" }.call(O)) val nullableUnit = clazz.getMemberByName("nullableUnit") assertEquals(Unit, nullableUnit.call(true)) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt index 16f7d1d..b441a1d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt @@ -1,11 +1,13 @@ package tests.call.simpleConstructor import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* class A(val result: String) fun box(): String { - val aCons = (A::class.java).toLiteKClass().constructors.first() + val aCons = ((A::class.java).kotlinClass as KClass).constructors.first() val a = aCons.call("OK") return a.result } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt index 8762405..6b5db0d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt @@ -1,13 +1,15 @@ package tests.call.simpleMemberFunction import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* class A { fun foo(x: Int, y: Int) = x + y } fun box(): String { - val foo = (A::class.java).toLiteKClass().getMemberByName("foo") + val foo = ((A::class.java).kotlinClass as KClass).getMemberByName("foo") val x = foo.call(A(), 42, 239) if (x != 281) return "Fail: $x" @@ -15,8 +17,8 @@ fun box(): String { try { (A::foo).call() return "Fail: no exception" + } catch (e: Exception) { } - catch (e: Exception) {} return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt index 473d7b9..577af68 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt @@ -1,6 +1,9 @@ package tests.classes.classMembers import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* + open class Base { fun foo() {} @@ -21,7 +24,7 @@ class Derived : Base() { fun Derived.extFun() {} fun box(): String { - Derived::class.java.toLiteKClass().members.forEach { + (Derived::class.java.kotlinClass as KClass).members.forEach { println(it.name) } return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt index c5c7de7..4ae7ab8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt @@ -1,14 +1,16 @@ package tests.classes.classSimpleName import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import kotlin.test.assertEquals class Klass fun box(): String { - assertEquals("Klass", Klass::class.java.toLiteKClass().simpleName) + assertEquals("Klass", (Klass::class.java.kotlinClass as KClass).simpleName) // TODO ClassDescriptors for java classes are not supported // assertEquals("Date", java.util.Date::class.java.toLiteKClass().simpleName) //assertEquals("ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().simpleName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt index 865938d..82328ed 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt @@ -1,7 +1,7 @@ package tests.classes.localClassSimpleName import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals fun check(klass: KClass<*>, expectedName: String) { @@ -11,27 +11,27 @@ fun check(klass: KClass<*>, expectedName: String) { fun localInMethod() { fun localInMethod(unused: Any?) { class Local - check(Local::class.java.toLiteKClass(), "Local") + check((Local::class.java.kotlinClass as KClass), "Local") class `Local$With$Dollars` - check(`Local$With$Dollars`::class.java.toLiteKClass(), "Local\$With\$Dollars") + check((`Local$With$Dollars`::class.java.kotlinClass as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") } localInMethod(null) class Local - check(Local::class.java.toLiteKClass(), "Local") + check((Local::class.java.kotlinClass as KClass), "Local") class `Local$With$Dollars` - check(`Local$With$Dollars`::class.java.toLiteKClass(), "Local\$With\$Dollars") + check((`Local$With$Dollars`::class.java.kotlinClass as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") } class LocalInConstructor { init { class Local - check(Local::class.java.toLiteKClass(), "Local") + check((Local::class.java.kotlinClass as KClass), "Local") class `Local$With$Dollars` - check(`Local$With$Dollars`::class.java.toLiteKClass(), "Local\$With\$Dollars") + check((`Local$With$Dollars`::class.java.kotlinClass as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") } } @@ -39,4 +39,4 @@ fun box(): String { localInMethod() LocalInConstructor() return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt index dfc6e30..b6ac41c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt @@ -2,7 +2,7 @@ package tests.classes.nestedClasses import kotlin.test.assertEquals import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* class A { companion object {} @@ -15,9 +15,10 @@ fun nestedNames(c: KClass<*>) = c.nestedClasses.map { it.simpleName ?: throw Ass fun box(): String { // Kotlin class without nested classes - assertEquals(emptyList(), nestedNames(A.Inner::class.java.toLiteKClass())) + assertEquals(emptyList(), nestedNames((A.Inner::class.java.kotlinClass as KClass))) // Kotlin class with nested classes - assertEquals(listOf("Companion", "Inner", "Nested", "PrivateNested"), nestedNames(A::class.java.toLiteKClass())) + assertEquals(listOf("Companion", "Inner", "Nested", "PrivateNested"), + nestedNames((A::class.java.kotlinClass as KClass))) // Java class without nested classes //assertEquals(emptyList(), nestedNames(Error::class.java.toLiteKClass())) @@ -56,4 +57,4 @@ fun box(): String { // } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt index bf42e64..a24375b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -1,7 +1,8 @@ package tests.classes.qualifiedName -import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import kotlin.test.assertEquals class Klass { @@ -11,19 +12,28 @@ class Klass { } fun box(): String { - assertEquals("tests.classes.qualifiedName.Klass", Klass::class.java.toLiteKClass().qualifiedName) - assertEquals("tests.classes.qualifiedName.Klass.Nested", Klass.Nested::class.java.toLiteKClass().qualifiedName) - assertEquals("tests.classes.qualifiedName.Klass.Nested\$With\$Dollars", Klass.`Nested$With$Dollars`::class.java.toLiteKClass().qualifiedName) - assertEquals("tests.classes.qualifiedName.Klass.Companion", Klass.Companion::class.java.toLiteKClass().qualifiedName) + assertEquals("tests.classes.qualifiedName.Klass", (Klass::class.java.kotlinClass as KClass).qualifiedName) + assertEquals( + "tests.classes.qualifiedName.Klass.Nested", + (Klass.Nested::class.java.kotlinClass as KClass).qualifiedName + ) + assertEquals( + "tests.classes.qualifiedName.Klass.Nested\$With\$Dollars", + (Klass.`Nested$With$Dollars`::class.java.kotlinClass as KClass).qualifiedName + ) + assertEquals( + "tests.classes.qualifiedName.Klass.Companion", + (Klass.Companion::class.java.kotlinClass as KClass).qualifiedName + ) // TODO ClassDescriptors for java classes are not supported //assertEquals("java.util.Date", java.util.Date::class.java.toLiteKClass().qualifiedName) //assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().qualifiedName) class Local - assertEquals(null, Local::class.java.toLiteKClass().qualifiedName) + assertEquals(null, (Local::class.java.kotlinClass as KClass).qualifiedName) val o = object {} - assertEquals(null, o.javaClass.toLiteKClass().qualifiedName) + assertEquals(null, (o.javaClass.kotlinClass as KClass).qualifiedName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt index 36708f4..5413771 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt @@ -1,40 +1,66 @@ package tests.classes.qualifiedNameOfStandardClasses import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import kotlin.test.assertEquals fun box(): String { - assertEquals("kotlin.Any", Any::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.String", String::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.CharSequence", CharSequence::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Number", Number::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Int", Int::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Long", Long::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Any", (Any::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.String", (String::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.CharSequence", (CharSequence::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.Number", (Number::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.Int", (Int::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.Long", (Long::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.Array", Array::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Array", Array::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Array", Array>::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Array", (Array::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals("kotlin.Array", (Array::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals( + "kotlin.Array", + (Array>::class.java.kotlinClass as KClass>>).qualifiedName + ) - assertEquals("kotlin.IntArray", IntArray::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.DoubleArray", DoubleArray::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.IntArray", (IntArray::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.DoubleArray", (DoubleArray::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.Int.Companion", Int.Companion::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Double.Companion", Double.Companion::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Char.Companion", Char.Companion::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Int.Companion", (Int.Companion::class.java.kotlinClass as KClass).qualifiedName) + assertEquals( + "kotlin.Double.Companion", + (Double.Companion::class.java.kotlinClass as KClass).qualifiedName + ) + assertEquals( + "kotlin.Char.Companion", + (Char.Companion::class.java.kotlinClass as KClass).qualifiedName + ) - assertEquals("kotlin.ranges.IntRange", IntRange::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.ranges.IntRange", (IntRange::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.collections.List", List::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.collections.Map.Entry", Map.Entry::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.collections.List", (List::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals( + "kotlin.collections.Map.Entry", + (Map.Entry::class.java.kotlinClass as KClass>).qualifiedName + ) // TODO: KT-11754 - assertEquals("kotlin.collections.List", MutableList::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.collections.Map.Entry", MutableMap.MutableEntry::class.java.toLiteKClass().qualifiedName) + assertEquals( + "kotlin.collections.List", + (MutableList::class.java.kotlinClass as KClass>).qualifiedName + ) + assertEquals( + "kotlin.collections.Map.Entry", + (MutableMap.MutableEntry::class.java.kotlinClass as KClass>).qualifiedName + ) - assertEquals("kotlin.Function0", Function0::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Function1", Function1::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.Function5", Function5::class.java.toLiteKClass().qualifiedName) - assertEquals("kotlin.jvm.functions.FunctionN", Function42::class.java.toLiteKClass().qualifiedName) + assertEquals("kotlin.Function0", (Function0::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals("kotlin.Function1", (Function1::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals( + "kotlin.Function5", + (Function5::class.java.kotlinClass as KClass>).qualifiedName + ) + assertEquals( + "kotlin.jvm.functions.FunctionN", + (Function42::class.java.kotlinClass as KClass>).qualifiedName + ) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt index d6fec33..ffad9ec 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt @@ -1,7 +1,7 @@ package tests.classes.sealedSubclasses import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* import kotlin.test.assertEquals // -- @@ -28,13 +28,16 @@ sealed class SealedClassWithNoSubclasses fun sealedSubclassNames(c: KClass<*>) = c.sealedSubclasses.map { it.simpleName ?: throw AssertionError("Unnamed class: ${it}") }.sorted() fun box(): String { - assertEquals(listOf("TL1", "TL2"), sealedSubclassNames(SealedClassWithTopLevelSubclasses::class.java.toLiteKClass())) - assertEquals(listOf("N1", "N2"), sealedSubclassNames(SealedClassWithNestedSubclasses::class.java.toLiteKClass())) - assertEquals(emptyList(), sealedSubclassNames(SealedClassWithNoSubclasses::class.java.toLiteKClass())) + assertEquals(listOf("TL1", "TL2"), + sealedSubclassNames((SealedClassWithTopLevelSubclasses::class.java.kotlinClass as KClass))) + assertEquals(listOf("N1", "N2"), + sealedSubclassNames((SealedClassWithNestedSubclasses::class.java.kotlinClass as KClass))) + assertEquals(emptyList(), + sealedSubclassNames((SealedClassWithNoSubclasses::class.java.kotlinClass as KClass))) // assertEquals(emptyList(), sealedSubclassNames(String::class.java.toLiteKClass())) // assertEquals(emptyList(), sealedSubclassNames(Thread::class.java.toLiteKClass())) // assertEquals(emptyList(), sealedSubclassNames(FloatArray::class.java.toLiteKClass())) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt index cff33ac..09d03d4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt @@ -1,6 +1,8 @@ package tests.constructors.classesWithoutConstructors import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import kotlin.test.assertTrue interface Interface @@ -11,10 +13,10 @@ class C { } fun box(): String { - assertTrue(Interface::class.java.toLiteKClass().constructors.isEmpty()) - assertTrue(Obj::class.java.toLiteKClass().constructors.isEmpty()) - assertTrue(C.Companion::class.java.toLiteKClass().constructors.isEmpty()) + assertTrue((Interface::class.java.kotlinClass as KClass).constructors.isEmpty()) + assertTrue((Obj::class.java.kotlinClass as KClass).constructors.isEmpty()) + assertTrue((C.Companion::class.java.kotlinClass as KClass).constructors.isEmpty()) assertTrue(object {}::class.java.toLiteKClass().constructors.isEmpty()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt index 60ae354..b925bf3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt @@ -1,11 +1,13 @@ package tests.constructors.constructorName import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import kotlin.test.assertEquals class A fun box(): String { - assertEquals("", A::class.java.toLiteKClass().constructors.first().name) + assertEquals("", (A::class.java.kotlinClass as KClass).constructors.first().name) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt index ca224ef..ba53f80 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt @@ -1,5 +1,7 @@ package tests.constructors.enumEntry +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals @@ -18,7 +20,7 @@ enum class TestEnum(val id: String? = null) { fun box(): String { assertEquals(listOf("fun (kotlin.String?): tests.constructors.enumEntry.TestEnum"), TestEnum.ENUM1::class.java.toLiteKClass().constructors.map { it.toString() }) - assertEquals(listOf(), TestEnum.ENUM2::class.java.toLiteKClass().constructors.map { it.toString() }) + assertEquals(listOf(), (TestEnum.ENUM2::class.java.kotlinClass as KClass<*>).constructors.map { it.toString() }) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt index 154c3dc..b081133 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt @@ -1,8 +1,9 @@ package tests.constructors.simpleGetConstructors import kotlinx.reflect.lite.tests.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.* import java.util.Collections -import kotlin.reflect.* import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -19,14 +20,20 @@ class C { } fun box(): String { - assertEquals(3, A::class.java.toLiteKClass().constructors.size) - assertEquals(1, B::class.java.toLiteKClass().constructors.size) + assertEquals(3, (A::class.java.kotlinClass as KClass).constructors.size) + assertEquals(1, (B::class.java.kotlinClass as KClass).constructors.size) - assertTrue(Collections.disjoint(A::class.java.toLiteKClass().members, A::class.java.toLiteKClass().constructors)) - assertTrue(Collections.disjoint(B::class.java.toLiteKClass().members, B::class.java.toLiteKClass().constructors)) + assertTrue(Collections.disjoint( + (A::class.java.kotlinClass as KClass).members, + (A::class.java.kotlinClass as KClass).constructors + )) + assertTrue(Collections.disjoint( + (B::class.java.kotlinClass as KClass).members, + (B::class.java.kotlinClass as KClass).constructors + )) - assertEquals(1, C.Nested::class.java.toLiteKClass().constructors.size) - assertEquals(1, C.Inner::class.java.toLiteKClass().constructors.size) + assertEquals(1, (C.Nested::class.java.kotlinClass as KClass).constructors.size) + assertEquals(1, (C.Inner::class.java.kotlinClass as KClass).constructors.size) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index f9ad53d..03c5182 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -1,6 +1,7 @@ package tests.properties.accessors.extensionPropertyAccessors import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.* @@ -11,7 +12,7 @@ var String.prop: String set(value) { state = this + value } fun box(): String { - val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").toLiteKDeclarationContainer() + val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").kotlinClass val prop = clazz.getMemberByName("prop") as KMutableProperty1 assertEquals("3", prop.getter.invoke("abc")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt index 21a5f4f..2c26c20 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt @@ -1,13 +1,14 @@ package tests.properties.accessors.memberPropertyAccessors import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals class C(var state: String) fun box(): String { - val prop = C::class.java.toLiteKClass().getMemberByName("state") as KMutableProperty1 + val prop = (C::class.java.kotlinClass as KClass).getMemberByName("state") as KMutableProperty1 val c = C("1") assertEquals("1", prop.getter.invoke(c)) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index 91b3f9b..16e4e04 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -1,13 +1,14 @@ package tests.properties.accessors.topLevelPropertyAccessors import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals var state: String = "" fun box(): String { - val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").toLiteKDeclarationContainer() + val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").kotlinClass val state = clazz.getMemberByName("state") as KMutableProperty0 assertEquals("", state.getter.invoke()) diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 3b5ad7a..74c0ebb 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -1,10 +1,12 @@ package kotlinx.reflect.lite.tests import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* -// TODO: replace with Class.kotlinClass everywhere in tests -internal fun Class.toLiteKDeclarationContainer() = ReflectionLite.loadClassMetadata(this) -internal fun Class.toLiteKClass() = toLiteKDeclarationContainer() as KClass +@Deprecated( + message = "Better use the Class.kotlinClass: KDeclarationContainer extension", + replaceWith = ReplaceWith("(this.kotlinClass as KClass)", imports = arrayOf("kotlinx.reflect.lite.*, kotlinx.reflect.lite.impl.*"))) +internal fun Class.toLiteKClass() = kotlinClass as KClass internal fun KDeclarationContainer.getMemberByName(name: String) = members.single { it.name == name } From 02659c13e950f4436422fac030d29d60ed1165a3 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 8 Aug 2022 15:45:29 +0200 Subject: [PATCH 48/74] Get rid of ReflectProperties and replac with lazy initialization --- ...BasedDeclarationContainerDescriptorImpl.kt | 9 +- .../impl/ConstructorDescriptorImpl.kt | 7 +- .../impl/FunctionDescriptorImpl.kt | 11 +- .../impl/PropertyDescriptorImpl.kt | 23 ++-- .../reflect/lite/impl/KCallableImpl.kt | 3 +- .../kotlinx/reflect/lite/impl/KClassImpl.kt | 3 +- .../reflect/lite/impl/KFunctionImpl.kt | 1 - .../java/kotlinx/reflect/lite/impl/util.kt | 33 +++-- .../lite/internal/ReflectProperties.java | 113 ------------------ .../isAccessible/publicClassValAccessible.kt | 3 +- 10 files changed, 40 insertions(+), 166 deletions(-) delete mode 100644 src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt index c6e542d..64ba64b 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt @@ -5,7 +5,6 @@ import kotlinx.reflect.lite.builtins.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.impl.KotlinReflectionInternalError -import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.* import java.lang.reflect.* @@ -31,13 +30,13 @@ internal abstract class ClassBasedDeclarationContainerDescriptorImpl( get() = getMembers(staticScope, MemberBelonginess.INHERITED) private val allNonStaticMembers: Collection> - by ReflectProperties.lazySoft { declaredNonStaticMembers + inheritedNonStaticMembers } + by lazy { declaredNonStaticMembers + inheritedNonStaticMembers } private val allStaticMembers: Collection> - by ReflectProperties.lazySoft { declaredStaticMembers + inheritedStaticMembers } + by lazy { declaredStaticMembers + inheritedStaticMembers } override val declaredMembers: Collection> - by ReflectProperties.lazySoft { declaredNonStaticMembers + declaredStaticMembers } + by lazy { declaredNonStaticMembers + declaredStaticMembers } override val allMembers: Collection> - by ReflectProperties.lazySoft { allNonStaticMembers + allStaticMembers } + by lazy { allNonStaticMembers + allStaticMembers } private fun getMembers(scope: MemberScope, belonginess: MemberBelonginess): Collection> = (scope.functions + scope.properties).mapNotNull { descriptor -> diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index 0eef12e..bf66ef2 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -3,7 +3,6 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -43,15 +42,15 @@ internal class ConstructorDescriptorImpl( override val returnType: KotlinType get() = containingClass.kotlinType - private val jvmSignature: JvmFunctionSignature.KotlinConstructor by ReflectProperties.lazy { + private val jvmSignature: JvmFunctionSignature.KotlinConstructor by lazy { JvmFunctionSignature.KotlinConstructor(kmCons.signature ?: error("No constructor signature for ${kmCons}")) } - override val member: Member? by ReflectProperties.lazy { + override val member: Member? by lazy { container.findConstructorBySignature(jvmSignature.constructorDesc) } - override val defaultMember: Member? by ReflectProperties.lazy { + override val defaultMember: Member? by lazy { container.findDefaultConstructor(jvmSignature.constructorDesc) } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 97cae91..cda4a01 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -5,7 +5,6 @@ import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.impl.KotlinReflectionInternalError -import kotlinx.reflect.lite.internal.ReflectProperties import kotlinx.reflect.lite.name.* import java.lang.reflect.* import kotlinx.reflect.lite.misc.JvmFunctionSignature @@ -27,11 +26,11 @@ internal abstract class AbstractFunctionDescriptor : AbstractCallableDescriptor, override val isAnnotationConstructor: Boolean get() = name == "" && container.jClass.isAnnotation - override val caller: Caller<*> by ReflectProperties.lazy { + override val caller: Caller<*> by lazy { createCaller(member) } - override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + override val defaultCaller: Caller<*>? by lazy { defaultMember?.let { createDefaultCaller(it) } } @@ -122,15 +121,15 @@ internal class FunctionDescriptorImpl( override val returnType: KotlinType get() = kmFunction.returnType.toKotlinType(module, typeParameterTable) - private val jvmSignature: JvmFunctionSignature.KotlinFunction by ReflectProperties.lazy { + private val jvmSignature: JvmFunctionSignature.KotlinFunction by lazy { JvmFunctionSignature.KotlinFunction(kmFunction.signature ?: error("No signature for ${kmFunction}")) } - override val member: Member? by ReflectProperties.lazy { + override val member: Member? by lazy { container.findMethodBySignature(jvmSignature.methodName, jvmSignature.methodDesc) } - override val defaultMember: Member? by ReflectProperties.lazy { + override val defaultMember: Member? by lazy { container.findDefaultMethod(jvmSignature.methodName, jvmSignature.methodDesc, !Modifier.isStatic(member!!.modifiers)) } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index f191b54..3e72927 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -2,18 +2,13 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.metadata.jvm.* -import kotlinx.reflect.lite.* import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.impl.KClassImpl import kotlinx.reflect.lite.impl.KotlinReflectionInternalError -import kotlinx.reflect.lite.internal.* -import kotlinx.reflect.lite.internal.ReflectProperties import kotlinx.reflect.lite.misc.JvmPropertySignature import kotlinx.reflect.lite.name.* import java.lang.reflect.* -import kotlin.reflect.jvm.internal.* internal class PropertyDescriptorImpl( val kmProperty: KmProperty, @@ -63,7 +58,7 @@ internal class PropertyDescriptorImpl( override val signature: JvmFieldSignature? get() = kmProperty.fieldSignature - override val jvmSignature: JvmPropertySignature.KotlinProperty by ReflectProperties.lazy { + override val jvmSignature: JvmPropertySignature.KotlinProperty by lazy { JvmPropertySignature.KotlinProperty( this, kmProperty.fieldSignature, @@ -73,7 +68,7 @@ internal class PropertyDescriptorImpl( } // Logic from: https://github.com/JetBrains/kotlin/blob/3b5179686eaba0a71bcca53c2cc922a54cc9241f/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt#L51 - override val javaField: Field? by ReflectProperties.lazy { + override val javaField: Field? by lazy { jvmSignature.fieldSignature?.let { val owner = if (isMovedFromInterfaceCompanion) { container.jClass.enclosingClass @@ -88,19 +83,19 @@ internal class PropertyDescriptorImpl( } } - override val getter: PropertyGetterDescriptor? by ReflectProperties.lazy { + override val getter: PropertyGetterDescriptor? by lazy { if (Flag.Property.HAS_GETTER(flags)) PropertyGetterDescriptorImpl(this) else null } - override val setter: PropertySetterDescriptor? by ReflectProperties.lazy { + override val setter: PropertySetterDescriptor? by lazy { if (Flag.Property.HAS_SETTER(flags)) PropertySetterDescriptorImpl(this) else null } - override val caller: Caller<*> by ReflectProperties.lazy { + override val caller: Caller<*> by lazy { getter?.caller ?: error("The property has no getter") } - override val defaultCaller: Caller<*> by ReflectProperties.lazy { + override val defaultCaller: Caller<*> by lazy { getter?.defaultCaller ?: error("The property has no getter") } @@ -143,7 +138,7 @@ internal abstract class PropertyAccessorDescriptorImpl( override val defaultMember: Member? get() = null - override val caller: Caller<*> by ReflectProperties.lazy { + override val caller: Caller<*> by lazy { val accessor = member when { accessor == null -> { @@ -197,7 +192,7 @@ internal class PropertyGetterDescriptorImpl( override val valueParameters: List get() = emptyList() - override val member: Method? by ReflectProperties.lazy { + override val member: Method? by lazy { property.jvmSignature.getterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } @@ -228,7 +223,7 @@ internal class PropertySetterDescriptorImpl( override val valueParameters: List get() = listOf(PropertySetterParameterDescriptor(property.kmProperty.setterParameter, this)) - override val member: Method? by ReflectProperties.lazy { + override val member: Method? by lazy { property.jvmSignature.setterSignature?.let { signature -> property.container.findMethodBySignature(signature.name, signature.desc) } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index 984d797..e815d4f 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -3,7 +3,6 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.impl.* -import kotlinx.reflect.lite.internal.* import java.lang.reflect.* import java.util.ArrayList import kotlin.coroutines.* @@ -11,7 +10,7 @@ import kotlin.coroutines.* internal abstract class KCallableImpl: KCallable { abstract val descriptor: CallableDescriptor - override val parameters: List by ReflectProperties.lazy { + override val parameters: List by lazy { val descriptor = descriptor val result = mutableListOf() var index = 0 diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index f633228..8b1e9e6 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -2,7 +2,6 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.ClassDescriptor -import kotlinx.reflect.lite.internal.* internal class KClassImpl( override val descriptor: ClassDescriptor @@ -38,7 +37,7 @@ internal class KClassImpl( get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } // Logic from: https://github.com/JetBrains/kotlin/blob/bfa3f89aeb727518703f0a167153cb048724a6d1/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt#L124 - override val supertypes: List by ReflectProperties.lazySoft { + override val supertypes: List by lazy { val kotlinTypes = descriptor.supertypes val result = ArrayList(kotlinTypes.size) kotlinTypes.mapTo(result) { kotlinType -> diff --git a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt index fc8cc1e..4c0fc93 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt @@ -2,7 +2,6 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* -import kotlin.reflect.jvm.internal.* internal class KFunctionImpl( override val descriptor: FunctionDescriptor diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 419e1c4..3b5fe64 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -6,7 +6,6 @@ import kotlinx.reflect.lite.KVisibility import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.descriptors.impl.KotlinType import kotlinx.reflect.lite.calls.* -import kotlinx.reflect.lite.internal.* import kotlinx.reflect.lite.misc.JvmPropertySignature import java.lang.reflect.* @@ -183,19 +182,19 @@ internal class FakeOverrideFunctionDescriptor( override val isAnnotationConstructor: Boolean get() = overriddenFunctions.first().isAnnotationConstructor - override val member: Member? by ReflectProperties.lazy { + override val member: Member? by lazy { overriddenFunctions.first().member } - override val defaultMember: Member? by ReflectProperties.lazy { + override val defaultMember: Member? by lazy { overriddenFunctions.first().defaultMember } - override val caller: Caller<*> by ReflectProperties.lazy { + override val caller: Caller<*> by lazy { overriddenFunctions.first().caller } - override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + override val defaultCaller: Caller<*>? by lazy { overriddenFunctions.first().defaultCaller } } @@ -229,7 +228,7 @@ internal class FakeOverridePropertyDescriptor( override val signature: JvmFieldSignature? get() = overriddenProperties.first().signature - override val jvmSignature: JvmPropertySignature.KotlinProperty by ReflectProperties.lazy { + override val jvmSignature: JvmPropertySignature.KotlinProperty by lazy { // TODO: inherit this from PropertyDescriptorImpl val property = overriddenProperties.first() as PropertyDescriptorImpl JvmPropertySignature.KotlinProperty( @@ -240,7 +239,7 @@ internal class FakeOverridePropertyDescriptor( ) } - override val javaField: Field? by ReflectProperties.lazy { + override val javaField: Field? by lazy { // TODO: copied from PropertyDescriptorImpl, inherit the implementation jvmSignature.fieldSignature?.let { // TODO: support propertyWithBackingFieldInOuterClass @@ -260,11 +259,11 @@ internal class FakeOverridePropertyDescriptor( override val setter: PropertySetterDescriptor? get() = if (isVar) FakeOverridePropertySetterDescriptor(this) else null - override val caller: Caller<*> by ReflectProperties.lazy { + override val caller: Caller<*> by lazy { getter?.caller ?: error("The property has no getter") } - override val defaultCaller: Caller<*> by ReflectProperties.lazy { + override val defaultCaller: Caller<*> by lazy { getter?.defaultCaller ?: error("The property has no getter") } } @@ -298,19 +297,19 @@ internal class FakeOverridePropertyGetterDescriptor( override val isAnnotationConstructor: Boolean get() = overriddenPropertyGetters.first().isAnnotationConstructor - override val member: Member? by ReflectProperties.lazy { + override val member: Member? by lazy { overriddenPropertyGetters.first().member } - override val defaultMember: Member? by ReflectProperties.lazy { + override val defaultMember: Member? by lazy { overriddenPropertyGetters.first().defaultMember } - override val caller: Caller<*> by ReflectProperties.lazy { + override val caller: Caller<*> by lazy { overriddenPropertyGetters.first().caller } - override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + override val defaultCaller: Caller<*>? by lazy { overriddenPropertyGetters.first().defaultCaller } } @@ -345,19 +344,19 @@ internal class FakeOverridePropertySetterDescriptor( override val isAnnotationConstructor: Boolean get() = overriddenPropertySetters.first().isAnnotationConstructor - override val member: Member? by ReflectProperties.lazy { + override val member: Member? by lazy { overriddenPropertySetters.first().member } - override val defaultMember: Member? by ReflectProperties.lazy { + override val defaultMember: Member? by lazy { overriddenPropertySetters.first().defaultMember } - override val caller: Caller<*> by ReflectProperties.lazy { + override val caller: Caller<*> by lazy { overriddenPropertySetters.first().caller } - override val defaultCaller: Caller<*>? by ReflectProperties.lazy { + override val defaultCaller: Caller<*>? by lazy { overriddenPropertySetters.first().defaultCaller } } diff --git a/src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java b/src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java deleted file mode 100644 index 2510e6a..0000000 --- a/src/main/java/kotlinx/reflect/lite/internal/ReflectProperties.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2010-2015 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 kotlinx.reflect.lite.internal; - -import kotlin.jvm.functions.Function0; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.ref.SoftReference; - -public class ReflectProperties { - public static abstract class Val { - private static final Object NULL_VALUE = new Object() {}; - - @SuppressWarnings({"UnusedParameters", "unused"}) - public final T getValue(Object instance, Object metadata) { - return invoke(); - } - - public abstract T invoke(); - - protected Object escape(T value) { - return value == null ? NULL_VALUE : value; - } - - @SuppressWarnings("unchecked") - protected T unescape(Object value) { - return value == NULL_VALUE ? null : (T) value; - } - } - - // A delegate for a lazy property, whose initializer may be invoked multiple times including simultaneously from different threads - public static class LazyVal extends Val { - private final Function0 initializer; - private volatile Object value = null; - - public LazyVal(@NotNull Function0 initializer) { - this.initializer = initializer; - } - - @Override - public T invoke() { - Object cached = value; - if (cached != null) { - return unescape(cached); - } - - T result = initializer.invoke(); - value = escape(result); - - return result; - } - } - - // A delegate for a lazy property on a soft reference, whose initializer may be invoked multiple times - // including simultaneously from different threads - public static class LazySoftVal extends Val implements Function0 { - private final Function0 initializer; - private volatile SoftReference value = null; - - public LazySoftVal(@Nullable T initialValue, @NotNull Function0 initializer) { - this.initializer = initializer; - if (initialValue != null) { - this.value = new SoftReference(escape(initialValue)); - } - } - - @Override - public T invoke() { - SoftReference cached = value; - if (cached != null) { - Object result = cached.get(); - if (result != null) { - return unescape(result); - } - } - - T result = initializer.invoke(); - value = new SoftReference(escape(result)); - - return result; - } - } - - @NotNull - public static LazyVal lazy(@NotNull Function0 initializer) { - return new LazyVal(initializer); - } - - @NotNull - public static LazySoftVal lazySoft(@Nullable T initialValue, @NotNull Function0 initializer) { - return new LazySoftVal(initialValue, initializer); - } - - @NotNull - public static LazySoftVal lazySoft(@NotNull Function0 initializer) { - return lazySoft(null, initializer); - } -} diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt index 9f4ced2..f3ff05f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt @@ -10,7 +10,6 @@ class Result { fun box(): String { val p = (Result::class.java).kotlinClass.getMemberByName("value") as KProperty1 - p.isAccessible = false - // setAccessible(false) should have no effect on the accessibility of a public reflection object + p.isAccessible = false // should have no effect on the accessibility of a public reflection object return p.get(Result()) } From 61a186f7856c402a18d4dfac4b03257dd9c598b5 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 8 Aug 2022 18:43:55 +0200 Subject: [PATCH 49/74] ReflectJvmMapping class name --- src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index 9ffcd15..7c93a69 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -1,3 +1,5 @@ +@file:JvmName("ReflectJvmMapping") + // Some logic copied from: https://github.com/JetBrains/kotlin/blob/26cdb2f928982dad7f0c9ab8e3bd509665d9d537/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt package kotlinx.reflect.lite.impl From c87de552af70727b058aa590d2ee02d1493138bd Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 8 Aug 2022 19:54:41 +0200 Subject: [PATCH 50/74] Add KClass.primaryConstructor to the API --- .../reflect/lite/descriptors/descriptors.kt | 4 +++- .../descriptors/impl/ConstructorDescriptorImpl.kt | 3 +++ .../java/kotlinx/reflect/lite/impl/KCallables.kt | 2 ++ .../java/kotlinx/reflect/lite/impl/KClasses.kt | 15 +++++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/kotlinx/reflect/lite/impl/KClasses.kt diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 51cafca..9d31461 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -170,7 +170,9 @@ internal interface PropertyAccessorDescriptor : FunctionDescriptor { internal interface PropertyGetterDescriptor : PropertyAccessorDescriptor internal interface PropertySetterDescriptor : PropertyAccessorDescriptor -internal interface ConstructorDescriptor : FunctionDescriptor +internal interface ConstructorDescriptor : FunctionDescriptor { + val isPrimary: Boolean +} internal interface ClassifierDescriptor : DeclarationDescriptor diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index bf66ef2..734cb8a 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -22,6 +22,9 @@ internal class ConstructorDescriptorImpl( override val signature: JvmMethodSignature? get() = kmCons.signature + override val isPrimary: Boolean + get() = !Flag.Constructor.IS_SECONDARY(flags) + override val valueParameters: List get() = kmCons.valueParameters.mapIndexed { index, parameter -> ValueParameterDescriptorImpl(parameter, this, index) diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt index 9be7318..4d968d7 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt @@ -1,3 +1,5 @@ +@file:JvmName("KCallables") + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt b/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt new file mode 100644 index 0000000..95aa1a0 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt @@ -0,0 +1,15 @@ +@file:JvmName("KClasses") + +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.* + +/** + * Returns the primary constructor of this class, or `null` if this class has no primary constructor. + * See the [Kotlin language documentation](http://kotlinlang.org/docs/reference/classes.html#constructors) + * for more information. + */ +@SinceKotlin("1.1") +val KClass.primaryConstructor: KFunction? + get() = constructors.firstOrNull { it is ConstructorDescriptor && it.isPrimary } From d0b9bf506455fb4acfeca69913547d89dac39198 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 9 Aug 2022 16:31:30 +0200 Subject: [PATCH 51/74] Fixed visibility modifiers of some declarations to be internal --- .../java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt | 2 +- src/main/java/kotlinx/reflect/lite/misc/util.kt | 8 ++++---- src/main/java/kotlinx/reflect/lite/name/names.kt | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index 32a771f..1bd8d94 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -6,7 +6,7 @@ import kotlinx.reflect.lite.builtins.* import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.name.* -sealed class JvmFunctionSignature { +internal sealed class JvmFunctionSignature { abstract fun asString(): String class KotlinFunction(val signature: JvmMethodSignature) : JvmFunctionSignature() { diff --git a/src/main/java/kotlinx/reflect/lite/misc/util.kt b/src/main/java/kotlinx/reflect/lite/misc/util.kt index 6b19861..6e278f6 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/util.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/util.kt @@ -4,7 +4,7 @@ package kotlinx.reflect.lite.misc import kotlinx.reflect.lite.name.* import java.lang.reflect.Array -val Class<*>.safeClassLoader: ClassLoader +internal val Class<*>.safeClassLoader: ClassLoader get() = classLoader ?: ClassLoader.getSystemClassLoader() private val PRIMITIVE_CLASSES = @@ -17,7 +17,7 @@ val Class<*>.wrapperByPrimitive: Class<*>? /** * NOTE: does not perform a Java -> Kotlin mapping. If this is not expected, consider using KClassImpl#classId instead */ -val Class<*>.classId: ClassId +internal val Class<*>.classId: ClassId get() = when { isPrimitive -> throw IllegalArgumentException("Can't compute ClassId for primitive type: $this") isArray -> throw IllegalArgumentException("Can't compute ClassId for array type: $this") @@ -28,10 +28,10 @@ val Class<*>.classId: ClassId else -> declaringClass?.classId?.createNestedClassId(simpleName) ?: ClassId.topLevel(FqName(name)) } -fun Class<*>.createArrayType(): Class<*> = +internal fun Class<*>.createArrayType(): Class<*> = Array.newInstance(this, 0)::class.java -fun ClassLoader.tryLoadClass(fqName: String) = +internal fun ClassLoader.tryLoadClass(fqName: String) = try { Class.forName(fqName, false, this) } catch (e: ClassNotFoundException) { diff --git a/src/main/java/kotlinx/reflect/lite/name/names.kt b/src/main/java/kotlinx/reflect/lite/name/names.kt index 554cb11..5f31a13 100644 --- a/src/main/java/kotlinx/reflect/lite/name/names.kt +++ b/src/main/java/kotlinx/reflect/lite/name/names.kt @@ -5,7 +5,7 @@ import kotlinx.metadata.isLocal typealias Name = String -data class FqName(val fqName: String) { +internal data class FqName(val fqName: String) { val isRoot: Boolean get() = fqName.isEmpty() fun parent(): FqName = fqName.lastIndexOf('.').let { i -> @@ -27,7 +27,7 @@ data class FqName(val fqName: String) { } // Partially from: https://github.com/JetBrains/kotlin/blob/ea836fd46a1fef07d77c96f9d7e8d7807f793453/core/compiler.common/src/org/jetbrains/kotlin/name/ClassId.java#L34 -data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val isLocal: Boolean = false) { +internal data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val isLocal: Boolean = false) { constructor(packageFqName: FqName, relativeClassName: Name) : this(packageFqName, FqName(relativeClassName)) constructor(className: ClassName) : this( From e3aac87d63628c9df3e6a81071a3353985e443b8 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 10 Aug 2022 11:58:24 +0200 Subject: [PATCH 52/74] Fixed bug in `KClass.primaryConstructor` and added a test --- .../kotlinx/reflect/lite/impl/KClasses.kt | 2 +- .../constructors/primaryConstructor.kt | 56 +++++++++++++++++++ .../kotlinx/reflect/lite/tests/KClassTest.kt | 13 +++-- 3 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt b/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt index 95aa1a0..947f85b 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt @@ -12,4 +12,4 @@ import kotlinx.reflect.lite.descriptors.* */ @SinceKotlin("1.1") val KClass.primaryConstructor: KFunction? - get() = constructors.firstOrNull { it is ConstructorDescriptor && it.isPrimary } + get() = constructors.firstOrNull { ((it as KFunctionImpl).descriptor as ConstructorDescriptor).isPrimary } diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt new file mode 100644 index 0000000..241dfff --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt @@ -0,0 +1,56 @@ +package tests.constructors.primaryConstructor + +import kotlin.test.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* + +class OnlyPrimary + +class PrimaryWithSecondary(val s: String) { + constructor(x: Int) : this(x.toString()) + + override fun toString() = s +} + +class OnlySecondary { + constructor(s: String) +} + +class TwoSecondaries { + constructor(s: String) + constructor(d: Double) +} + +enum class En + +interface I +object O +class C { + companion object +} + +fun box(): String { + val p1 = (OnlyPrimary::class.java.kotlinClass as KClass).primaryConstructor + assertNotNull(p1) + assert(p1.call() is OnlyPrimary) + + val p2 = (PrimaryWithSecondary::class.java.kotlinClass as KClass).primaryConstructor + assertNotNull(p2) + assert(p2.call("beer").toString() == "beer") + + val p3 = (OnlySecondary::class.java.kotlinClass as KClass).primaryConstructor + assertNull(p3) + + val p4 = (TwoSecondaries::class.java.kotlinClass as KClass).primaryConstructor + assertNull(p4) + + assertNotNull((En::class.java.kotlinClass as KClass).primaryConstructor) + + assertNull((I::class.java.kotlinClass as KClass).primaryConstructor) + assertNull((O::class.java.kotlinClass as KClass).primaryConstructor) + assertNull((C.Companion::class.java.kotlinClass as KClass).primaryConstructor) + + assertNull((object {}::class.java.kotlinClass as KClass).primaryConstructor) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt index ce8a156..5f9bc2c 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt @@ -27,19 +27,22 @@ class KClassTest { // constructors @Test - fun testClassesWithoutConstructors() = test("classes.classesWithoutConstructors") { tests.constructors.classesWithoutConstructors.box() } + fun testClassesWithoutConstructors() = test("constructors.classesWithoutConstructors") { tests.constructors.classesWithoutConstructors.box() } @Test - fun testConstructorName() = test("classes.constructorName") { tests.constructors.constructorName.box() } + fun testConstructorName() = test("constructors.constructorName") { tests.constructors.constructorName.box() } @Ignore @Test - fun testEnumEntry() = test("classes.enumEntry") { tests.constructors.enumEntry.box() } + fun testEnumEntry() = test("constructors.enumEntry") { tests.constructors.enumEntry.box() } @Test - fun testSimpleGetConstructors() = test("classes.simpleGetConstructors") { tests.constructors.simpleGetConstructors.box() } + fun testSimpleGetConstructors() = test("constructors.simpleGetConstructors") { tests.constructors.simpleGetConstructors.box() } + + @Test + fun testPrimaryConstructor() = test("constructors.primaryConstructor") { tests.constructors.primaryConstructor.box() } // members @Test fun testClassMembers() = test("classes.classMembers") { tests.classes.classMembers.box() } -} \ No newline at end of file +} From 65677da6b9b4b796871c28b14ac2f7fdfd0d7a56 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 10 Aug 2022 15:30:33 +0200 Subject: [PATCH 53/74] Added JvmClassMapping class file with API for mapping Java to Kotlin classes: `Class.kotlin` and `KClass.java` API --- .../kotlinx/reflect/lite/ReflectionLite.kt | 31 ------------- .../descriptors/impl/PackageDescriptorImpl.kt | 1 + .../reflect/lite/impl/JvmClassMapping.kt | 27 +++++++++++ .../reflect/lite/impl/ReflectJvmMapping.kt | 20 +++----- .../reflect/lite/impl/ReflectionLiteImpl.kt | 30 ++++++++++-- .../testData/call/accessPrivateProperties.kt | 5 +- .../reflect/lite/testData/call/bigArity.kt | 2 +- .../call/cannotCallEnumConstructor.kt | 3 +- .../testData/call/equalsHashCodeToString.kt | 24 +++++----- .../lite/testData/call/exceptionHappened.kt | 2 +- .../lite/testData/call/fakeOverride.kt | 2 +- .../testData/call/fakeOverrideSubstituted.kt | 2 +- .../call/incorrectNumberOfArguments.kt | 16 +++---- .../testData/call/innerClassConstructor.kt | 6 +-- .../reflect/lite/testData/call/jvmStatic.kt | 4 +- .../jvmStaticInObjectIncorrectReceiver.kt | 3 +- .../lite/testData/call/localClassMember.kt | 4 +- .../testData/call/memberOfGenericClass.kt | 2 +- ...GetterAndGetFunctionDifferentReturnType.kt | 2 +- .../lite/testData/call/protectedMembers.kt | 3 +- .../reflect/lite/testData/call/returnUnit.kt | 6 +-- .../lite/testData/call/simpleConstructor.kt | 3 +- .../testData/call/simpleMemberFunction.kt | 2 +- .../testData/call/simpleTopLevelFunctions.kt | 2 +- .../callBy/boundExtensionFunctionWA.kt | 2 +- .../callBy/boundExtensionPropertyAcessorWA.kt | 2 +- .../callBy/boundJvmStaticInObjectWA.kt | 2 +- .../lite/testData/callBy/companionObject.kt | 2 +- .../callBy/defaultAndNonDefaultIntertwined.kt | 2 +- .../callBy/defaultInSuperClassFakeOverride.kt | 2 +- .../lite/testData/callBy/extensionFunction.kt | 2 +- .../callBy/jvmStaticInCompanionObject.kt | 2 +- .../lite/testData/callBy/jvmStaticInObject.kt | 2 +- .../manyArgumentsNoneDefaultConstructor.kt | 2 +- .../manyArgumentsNoneDefaultFunction.kt | 2 +- .../callBy/manyArgumentsOnlyOneDefault.kt | 2 +- .../lite/testData/callBy/manyMaskArguments.kt | 2 +- .../reflect/lite/testData/callBy/nullValue.kt | 2 +- ...thodIsInvokedWhenNoDefaultValuesAreUsed.kt | 2 +- .../testData/callBy/primitiveDefaultValues.kt | 2 +- .../lite/testData/callBy/simpleConstructor.kt | 2 +- .../testData/callBy/simpleMemberFunciton.kt | 2 +- .../testData/callBy/simpleTopLevelFunction.kt | 2 +- .../lite/testData/classes/classMembers.kt | 3 +- .../lite/testData/classes/classSimpleName.kt | 3 +- .../testData/classes/localClassSimpleName.kt | 12 ++--- .../lite/testData/classes/nestedClasses.kt | 4 +- .../lite/testData/classes/qualifiedName.kt | 12 ++--- .../classes/qualifiedNameOfStandardClasses.kt | 46 +++++++++---------- .../lite/testData/classes/sealedSubclasses.kt | 6 +-- .../classesWithoutConstructors.kt | 6 +-- .../testData/constructors/constructorName.kt | 3 +- .../lite/testData/constructors/enumEntry.kt | 2 +- .../constructors/primaryConstructor.kt | 18 ++++---- .../constructors/simpleGetConstructors.kt | 17 ++++--- .../lite/testData/mapping/constructor.kt | 8 ++-- .../testData/mapping/extensionProperty.kt | 2 +- .../lite/testData/mapping/functions.kt | 4 +- .../lite/testData/mapping/inlineReifiedFun.kt | 4 +- .../interfaceCompanionPropertyWithJvmField.kt | 3 +- .../lite/testData/mapping/lateinitProperty.kt | 2 +- .../lite/testData/mapping/memberProperty.kt | 2 +- .../methodsFromObjectWithoutCustomMembers.kt | 8 ++-- .../mapping/methodsFromSuperInterface.kt | 4 +- .../lite/testData/mapping/privateProperty.kt | 2 +- .../mapping/propertyAccessorsWithJvmName.kt | 2 +- .../lite/testData/mapping/topLevelProperty.kt | 2 +- .../lite/testData/mapping/types/array.kt | 6 +-- .../testData/mapping/types/constructors.kt | 8 ++-- .../mapping/types/genericArrayElementType.kt | 2 +- .../testData/mapping/types/memberFunctions.kt | 4 +- .../types/parameterizedTypeArgument.kt | 2 +- .../mapping/types/parameterizedTypes.kt | 9 ++-- .../mapping/types/propertyAccessors.kt | 4 +- .../lite/testData/mapping/types/supertypes.kt | 2 +- .../mapping/types/topLevelFunctions.kt | 2 +- .../testData/mapping/types/typeParameters.kt | 4 +- .../lite/testData/mapping/types/unit.kt | 4 +- .../lite/testData/parameters/bigArity.kt | 2 +- .../functionParameterNameAndIndex.kt | 8 ++-- .../parameters/innerClassConstructor.kt | 2 +- ...anceExtensionReceiverAndValueParameters.kt | 6 +-- .../instanceParameterOfFakeOverride.kt | 4 +- .../testData/parameters/isMarkedNullable.kt | 4 +- .../lite/testData/parameters/isOptional.kt | 4 +- .../reflect/lite/testData/parameters/kinds.kt | 4 +- .../parameters/objectMemberReferences.kt | 2 +- .../testData/parameters/propertySetter.kt | 2 +- .../lite/testData/parameters/references.kt | 6 +-- .../accessors/extensionPropertyAccessors.kt | 2 +- .../accessors/memberPropertyAccessors.kt | 2 +- .../accessors/topLevelPropertyAccessors.kt | 2 +- .../testData/properties/invokeKProperty.kt | 2 +- .../callPrivatePropertyFromGetProperties.kt | 2 +- .../isAccessible/privateClassVal.kt | 2 +- .../isAccessible/privateClassVar.kt | 2 +- .../privateJvmStaticVarInObject.kt | 2 +- ...vatePropertyCallIsAccessibleOnAccessors.kt | 2 +- .../isAccessible/privateToThisAccessors.kt | 2 +- .../isAccessible/protectedClassVar.kt | 2 +- .../isAccessible/publicClassValAccessible.kt | 2 +- .../propertyOfNestedClassAndArrayType.kt | 4 +- .../properties/simpleGetProperties.kt | 2 +- .../kotlinx/reflect/lite/tests/testUtil.kt | 2 +- .../callBy/boundJvmStaticInObject.kt | 2 +- .../lambdaClasses/reflectOnLambdaInSuspend.kt | 2 +- .../mapping/methodsFromObject.kt | 10 ++-- .../getPropertiesMutableVsReadonly.kt | 3 +- 108 files changed, 277 insertions(+), 278 deletions(-) delete mode 100644 src/main/java/kotlinx/reflect/lite/ReflectionLite.kt create mode 100644 src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt diff --git a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt b/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt deleted file mode 100644 index fec6484..0000000 --- a/src/main/java/kotlinx/reflect/lite/ReflectionLite.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2010-2022 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 kotlinx.reflect.lite - -import kotlinx.reflect.lite.impl.* - -/** - * The entry point to the lite reflection on Kotlin metadata. - */ -object ReflectionLite { - /** - * Metadata for the given [klass] if this is a Kotlin class, or `null` otherwise. - */ - fun loadClassMetadata(klass: Class): KDeclarationContainer { - return ReflectionLiteImpl.loadClassMetadata(klass) - } -} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt index 213f4c0..595febc 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt @@ -19,6 +19,7 @@ internal class PackageDescriptorImpl( } ?: error("@Metadata annotation was not found for ${jClass.name} ") return when (val metadata = KotlinClassMetadata.read(header)) { is KotlinClassMetadata.FileFacade -> metadata.toKmPackage() + is KotlinClassMetadata.MultiFileClassPart -> metadata.toKmPackage() else -> error("Can not create PackageDescriptor for metadata of type $metadata") } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt new file mode 100644 index 0000000..b9cce01 --- /dev/null +++ b/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt @@ -0,0 +1,27 @@ +@file:JvmName("JvmClassMappingKt") + +package kotlinx.reflect.lite.impl + +import kotlinx.reflect.lite.* + +/** + * Returns a [KClass] instance corresponding to the given Java [Class] instance. + */ +val Class.kotlin: KClass + @JvmName("getKotlinClass") + get() = ReflectionLiteImpl.createKotlinClass(this) + +/** + * Returns a [KPackage] instance corresponding to the given Java [Class] instance. + */ +val Class.kotlinPackage: KPackage + @JvmName("getKotlinClass") + get() = ReflectionLiteImpl.createKotlinPackage(this) + + +/** + * Returns a Java [Class] instance corresponding to the given [KClass] instance. + */ +public val KClass.java: Class + @JvmName("getJavaClass") + get() = (this as KClassImpl).descriptor.jClass as Class diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index 7c93a69..c371de1 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -3,6 +3,7 @@ // Some logic copied from: https://github.com/JetBrains/kotlin/blob/26cdb2f928982dad7f0c9ab8e3bd509665d9d537/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt package kotlinx.reflect.lite.impl +import kotlinx.metadata.jvm.KotlinClassHeader import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.* import java.lang.reflect.* @@ -49,12 +50,6 @@ val KFunction.javaConstructor: Constructor? return it.descriptor.caller.member as? Constructor } -/** - * Returns a Java [Class] instance corresponding to the given [KClass] instance. - */ -public val KClass.java: Class - get() = (this as KClassImpl).descriptor.jClass as Class - /** * Returns a [KClass] instance representing the companion object of a given class, * or `null` if the class doesn't have a companion object. @@ -81,13 +76,12 @@ val KType.javaType: Type /** * Returns a [KDeclarationContainer] instance representing a Kotlin class or package. */ -val Class.kotlinClass: KDeclarationContainer - @JvmName("getKotlinClass") +internal val Class.kDeclarationContainer: KDeclarationContainer get() = ReflectionLiteImpl.loadClassMetadata(this) private fun Member.getKPackage(): KDeclarationContainer? = when (declaringClass.getAnnotation(Metadata::class.java)?.kind) { - 2, 4, 5 -> KPackageImpl(PackageDescriptorImpl(declaringClass)) + KotlinClassHeader.FILE_FACADE_KIND, KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND -> KPackageImpl(PackageDescriptorImpl(declaringClass)) else -> null } @@ -103,7 +97,7 @@ val Field.kotlinProperty: KProperty<*>? if (kotlinPackage != null) { return kotlinPackage.members.filterIsInstance>().firstOrNull { it.name == this.name } } - return declaringClass.kotlinClass.members.filterIsInstance>().firstOrNull { it.name == this.name } + return declaringClass.kDeclarationContainer.members.filterIsInstance>().firstOrNull { it.name == this.name } } /** @@ -119,14 +113,14 @@ val Method.kotlinFunction: KFunction<*>? } // For static bridge method generated for a @JvmStatic function in the companion object, also try to find the latter - val companion = declaringClass.kotlinClass.companionObject + val companion = declaringClass.kDeclarationContainer.companionObject if (companion != null) { companion.members.filterIsInstance>().firstOrNull { it.name == this.name }?.let { return it } } } - return declaringClass.kotlinClass.members.filterIsInstance>().firstOrNull { it.name == this.name } + return declaringClass.kDeclarationContainer.members.filterIsInstance>().firstOrNull { it.name == this.name } } /** @@ -136,5 +130,5 @@ val Method.kotlinFunction: KFunction<*>? */ val Constructor.kotlinFunction: KFunction? get() { - return (declaringClass.kotlinClass as KClass).constructors.firstOrNull { it.javaConstructor == this } + return (declaringClass.kotlin).constructors.firstOrNull { it.javaConstructor == this } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index a87ab93..b3aff72 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -16,19 +16,39 @@ package kotlinx.reflect.lite.impl +import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.impl.ReflectionLiteImpl.getMetadataAnnotation internal object ReflectionLiteImpl { fun loadClassMetadata(jClass: Class): KDeclarationContainer { - return when (jClass.getAnnotation(Metadata::class.java)?.kind) { - // if the class may be builtin or it's kind == CLASS_KIND -> try create a KClass - // TODO: null case, check if is primitive or isArray + return when (jClass.getMetadataAnnotation()?.kind) { + // if metadata == null, jClass may be builtin -> try to create KClass null, 1 -> KClassImpl(ClassDescriptorImpl(jClass)) - // if it's kind == FILE_FACADE_KIND -> try create a KPackage - // TODO: support header kinds MULTI_FILE_CLASS_FACADE_KIND, MULTI_FILE_CLASS_PART_KIND 2 -> KPackageImpl(PackageDescriptorImpl(jClass)) else -> throw KotlinReflectionInternalError("Can not load class metadata for $jClass") } } + + fun createKotlinClass(jClass: Class): KClass { + val metadata = jClass.getMetadataAnnotation() + if (metadata == null || metadata.kind == KotlinClassHeader.CLASS_KIND) { + return KClassImpl(ClassDescriptorImpl(jClass)) + } else { + throw KotlinReflectionInternalError("Could not create an instance of KClass from $jClass, the class file kind equals ${metadata.kind}") + } + } + + fun createKotlinPackage(jClass: Class): KPackage { + val metadata = jClass.getMetadataAnnotation() + // we can extract KmPackage only from these kinds of kotlin class files: FILE_FACADE_KIND, MULTI_FILE_CLASS_PART_KIND + if (metadata.kind == KotlinClassHeader.FILE_FACADE_KIND || metadata.kind == KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND) { + return KPackageImpl(PackageDescriptorImpl(jClass)) + } else { + throw KotlinReflectionInternalError("Could not create an instance of KPackage from $jClass, the class file kind equals ${metadata.kind}") + } + } + + private fun Class.getMetadataAnnotation() = getAnnotation(Metadata::class.java) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt index 7327842..d626e4c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt @@ -7,7 +7,7 @@ import kotlin.reflect.jvm.* import kotlin.test.* private class A(private var bar: String = "") { - fun getBar() = ((A::class.java).kotlinClass as KClass).getMemberByName("bar") + fun getBar() = ((A::class.java).kotlin).getMemberByName("bar") fun getKotlinReflectBar() = A::bar } @@ -15,8 +15,7 @@ private class A(private var bar: String = "") { fun box(): String { // kotlinx.reflect.lite val getBar = A().getBar() as KMutableProperty1 - val bar = - (tests.call.incorrectNumberOfArguments.A::class.java.kotlinClass as KClass).getMemberByName( + val bar = (A::class.java.kotlin).getMemberByName( "bar" ) bar.isAccessible = true diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt index 05cb95c..ed6f639 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -16,7 +16,7 @@ class A { fun box(): String { val a = A() - val foo = ((A::class.java).kotlinClass as KClass).getMemberByName("foo") + val foo = ((A::class.java).kotlin).getMemberByName("foo") val o = foo.call( a, a, diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt index 2564cae..5366fd0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -2,13 +2,12 @@ package tests.call.cannotCallEnumConstructor import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.tests.* enum class E fun box(): String { try { - val c = ((E::class.java).kotlinClass as KClass).constructors.single() + val c = ((E::class.java).kotlin).constructors.single() c.isAccessible = true c.call() return "Fail: constructing an enum class should not be allowed" diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt index 8026366..e9769b3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -9,9 +9,9 @@ class A data class D(val s: String) fun box(): String { - val aEquals = ((A::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction - val aHashCode = ((A::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction - val aToString = ((A::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction + val aEquals = (A::class.java).kotlin.getMemberByName("equals") as KFunction + val aHashCode = (A::class.java).kotlin.getMemberByName("hashCode") as KFunction + val aToString = (A::class.java).kotlin.getMemberByName("toString") as KFunction val a = A() assert(aEquals.call(a, a)) assert(!aEquals.call(a, 0)) @@ -19,28 +19,28 @@ fun box(): String { assert(aHashCode.call(a) == A::hashCode.call(a)) assert(aToString.call(a).startsWith("tests.call.equalsHashCodeToString.A@")) - val dEquals = ((A::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction - val dHashCode = ((A::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction - val dToString = ((A::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction + val dEquals = (A::class.java).kotlin.getMemberByName("equals") as KFunction + val dHashCode = (A::class.java).kotlin.getMemberByName("hashCode") as KFunction + val dToString = ((A::class.java).kotlin).getMemberByName("toString") as KFunction assert(dEquals.call(D("foo"), D("foo"))) assert(!dEquals.call(D("foo"), D("bar"))) assert(dHashCode.call(D("foo")) == D::hashCode.call(D("foo"))) assert(dToString.call(D("foo")) == "D(s=foo)") - val intEquals = ((Int::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction - val intHashCode = ((Int::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction - val intToString = ((Int::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction + val intEquals = ((Int::class.java).kDeclarationContainer as KClass).getMemberByName("equals") as KFunction + val intHashCode = ((Int::class.java).kDeclarationContainer as KClass).getMemberByName("hashCode") as KFunction + val intToString = ((Int::class.java).kDeclarationContainer as KClass).getMemberByName("toString") as KFunction assert(intEquals.call(-1, -1)) assert(intHashCode.call(0) != Int::hashCode.call(1)) assert(intToString.call(42) == "42") val stringEquals = - ((String::class.java).kotlinClass as KClass).getMemberByName("equals") as KFunction + ((String::class.java).kDeclarationContainer as KClass).getMemberByName("equals") as KFunction val stringHashcode = - ((String::class.java).kotlinClass as KClass).getMemberByName("hashCode") as KFunction + ((String::class.java).kDeclarationContainer as KClass).getMemberByName("hashCode") as KFunction val stringToString = - ((String::class.java).kotlinClass as KClass).getMemberByName("toString") as KFunction + ((String::class.java).kDeclarationContainer as KClass).getMemberByName("toString") as KFunction assert(stringEquals.call("beer", "beer")) stringHashcode.call("beer") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt index b570a61..87624cf 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -9,7 +9,7 @@ fun fail(message: String) { } fun box(): String { - val clazz = Class.forName("tests.call.exceptionHappened.ExceptionHappenedKt").kotlinClass + val clazz = Class.forName("tests.call.exceptionHappened.ExceptionHappenedKt").kDeclarationContainer val fail = clazz.getMemberByName("fail") try { fail.call("OK") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt index 178955a..3993e68 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt @@ -11,6 +11,6 @@ open class A { class B : A() fun box(): String { - val foo = ((B::class.java).kotlinClass as KClass).getMemberByName("foo") + val foo = (B::class.java).kotlin.getMemberByName("foo") return foo.call(B()) as String } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt index 9b5aab8..071daf4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt @@ -11,6 +11,6 @@ open class A(val t: T) { class B(s: String) : A(s) fun box(): String { - val foo = ((B::class.java).kotlinClass as KClass).getMemberByName("foo") + val foo = ((B::class.java).kotlin).getMemberByName("foo") return foo.call(B("OK")) as String } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index 23bb6bd..057b4a6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -8,7 +8,7 @@ import kotlin.test.* var foo: String = "" class A(private var bar: String = "") { - fun getBar() = ((A::class.java).kotlinClass as KClass).getMemberByName("bar") + fun getBar() = ((A::class.java).kotlin).getMemberByName("bar") } object O { @@ -16,9 +16,9 @@ object O { private var baz: String = "" @JvmStatic - fun getBaz() = (((O::class.java).kotlinClass as KClass).getMemberByName("baz") as KMutableProperty<*>).apply { isAccessible = true } + fun getBaz() = ((O::class.java).kotlin.getMemberByName("baz") as KMutableProperty<*>).apply { isAccessible = true } - fun getGetBaz() = ((O::class.java).kotlinClass as KClass).getMemberByName("getBaz") as KFunction<*> + fun getGetBaz() = ((O::class.java).kotlin).getMemberByName("getBaz") as KFunction<*> } fun check(callable: KCallable<*>, vararg args: Any?) { @@ -45,26 +45,26 @@ fun check(callable: KCallable<*>, vararg args: Any?) { } private fun testBox() { - val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").kotlinClass + val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").kDeclarationContainer val box = clazz.getMemberByName("box") check(box, null) check(box, "") } private fun testAConstructor() { - val aCons = (A::class.java.kotlinClass as KClass).getPrimaryConstructor() + val aCons = (A::class.java.kotlin).getPrimaryConstructor() check(aCons) check(aCons, null, "") } private fun testGetBaz() { - val getGetBaz = ((O::class.java).kotlinClass as KClass).getMemberByName("getGetBaz") + val getGetBaz = ((O::class.java).kotlin).getMemberByName("getGetBaz") check(getGetBaz) check(getGetBaz, null, "") } private fun testFoo() { - val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").kotlinClass + val clazz = Class.forName("tests.call.incorrectNumberOfArguments.IncorrectNumberOfArgumentsKt").kDeclarationContainer val f = clazz.getMemberByName("foo") as KMutableProperty0 check(f, null) // TODO: args array of size 2 is wrapped into another array of size 1 @@ -83,7 +83,7 @@ private fun testFoo() { private fun testAccessPrivateBarProperty() { val b = A().getBar() as KMutableProperty1 - val bar = (A::class.java.kotlinClass as KClass).getMemberByName("bar") + val bar = (A::class.java.kotlin).getMemberByName("bar") bar.isAccessible = true // TODO: kotlinx.reflect.lite.calls.CallerImpl$FieldGetter cannot access a member of class tests.call.incorrectNumberOfArguments.A with modifiers "private" b.call(A()) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt index 2656df3..78c4a17 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt @@ -11,10 +11,10 @@ class A { fun box(): String { val nested = - ((A::class.java).kotlinClass as KClass).nestedClasses.single { it.simpleName == "Nested" } as KClass + ((A::class.java).kotlin).nestedClasses.single { it.simpleName == "Nested" } as KClass val inner = - ((A::class.java).kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" } as KClass - val aCons = ((A::class.java).kotlinClass as KClass).getPrimaryConstructor() + ((A::class.java).kotlin).nestedClasses.single { it.simpleName == "Inner" } as KClass + val aCons = ((A::class.java).kotlin).getPrimaryConstructor() val nestedCons = nested.getPrimaryConstructor() val innerCons = inner.getPrimaryConstructor() return nestedCons.call("O").result + innerCons.call(aCons.call(), "K").result diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt index e4b83e0..06533c1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt @@ -17,9 +17,9 @@ class C { } fun box(): String { - val foo = ((Obj::class.java).kotlinClass as KClass).getMemberByName("foo") + val foo = ((Obj::class.java).kDeclarationContainer as KClass).getMemberByName("foo") foo.call(Obj) - val bar = (C.Companion::class.java.kotlinClass as KClass).getMemberByName("bar") + val bar = (C.Companion::class.java.kDeclarationContainer as KClass).getMemberByName("bar") bar.call(C.Companion) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt index 83d853d..5d1a340 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt @@ -1,6 +1,5 @@ package tests.call.jvmStaticInObjectIncorrectReceiver -import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* @@ -14,7 +13,7 @@ object Obj { @JvmStatic fun sly(obj: Obj) {} - operator fun get(name: String) = ((Obj::class.java).kotlinClass as KClass).members.single { it.name == name } + operator fun get(name: String) = ((Obj::class.java).kDeclarationContainer as KClass).members.single { it.name == name } } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt index a2547aa..22552b9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt @@ -9,7 +9,7 @@ fun box(): String { fun result(s: String) = s } - val localCons = ((Local::class.java).kotlinClass as KClass).getPrimaryConstructor() - val result = ((Local::class.java).kotlinClass as KClass).getMemberByName("result") as KFunction + val localCons = ((Local::class.java).kDeclarationContainer as KClass).getPrimaryConstructor() + val result = ((Local::class.java).kDeclarationContainer as KClass).getMemberByName("result") as KFunction return result.call(localCons.call(), "OK") } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt index 26337a1..38dba3e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt @@ -13,7 +13,7 @@ class A { } fun box(): String { - val a = ((A::class.java).kotlinClass as KClass>) + val a = ((A::class.java).kotlin) val foo = a.getMemberByName("foo") foo.call(a.getPrimaryConstructor().call(), "OK") return result diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt index 3e59e4b..63ee606 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt @@ -9,7 +9,7 @@ data class Foo(val id: String) { } fun box(): String { - val id = (Foo::class.java.kotlinClass as KClass).getMemberByName("id") as KProperty1 + val id = (Foo::class.java.kDeclarationContainer as KClass).getMemberByName("id") as KProperty1 // TODO: `id.call(Foo("abs"))` fails with the error: "object is not an instance of declaring class", expected the same as `id.invoke(Foo("abc))` // id.call(Foo("abc")) id.invoke(Foo("dfdc")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index e911559..bbc6075 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -2,7 +2,6 @@ package tests.call.protectedMembers import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.tests.* import kotlin.test.* abstract class Base { @@ -18,7 +17,7 @@ abstract class Base { class Derived : Base() fun member(name: String): KCallable<*> = - ((Derived::class.java).kotlinClass as KClass).members.single { it.name == name } + ((Derived::class.java).kDeclarationContainer as KClass).members.single { it.name == name } .apply { isAccessible = true } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt index b4f9640..78a08a3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt @@ -18,12 +18,12 @@ object O { fun nullableUnit(unit: Boolean): Unit? = if (unit) Unit else null fun box(): String { - val clazz = Class.forName("tests.call.returnUnit.ReturnUnitKt").kotlinClass + val clazz = Class.forName("tests.call.returnUnit.ReturnUnitKt").kDeclarationContainer val foo = clazz.getMemberByName("foo") assertEquals(Unit, foo.call()) - val bar = (A::class.java.kotlinClass as KClass).getMemberByName("bar") + val bar = (A::class.java.kotlin).getMemberByName("bar") assertEquals(Unit, bar.call(A())) - assertEquals(Unit, ((O::class.java.kotlinClass as KClass)).members.single { it.name == "baz" }.call(O)) + assertEquals(Unit, ((O::class.java.kotlin)).members.single { it.name == "baz" }.call(O)) val nullableUnit = clazz.getMemberByName("nullableUnit") assertEquals(Unit, nullableUnit.call(true)) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt index b441a1d..fe78de7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt @@ -1,13 +1,12 @@ package tests.call.simpleConstructor -import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* class A(val result: String) fun box(): String { - val aCons = ((A::class.java).kotlinClass as KClass).constructors.first() + val aCons = ((A::class.java).kotlin).constructors.first() val a = aCons.call("OK") return a.result } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt index 6b5db0d..db129a9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt @@ -9,7 +9,7 @@ class A { } fun box(): String { - val foo = ((A::class.java).kotlinClass as KClass).getMemberByName("foo") + val foo = ((A::class.java).kotlin).getMemberByName("foo") val x = foo.call(A(), 42, 239) if (x != 281) return "Fail: $x" diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt index 605bf04..7064b03 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt @@ -12,7 +12,7 @@ fun bar(result: String) { } fun box(): String { - val clazz = Class.forName("tests.call.simpleTopLevelFunctions.SimpleTopLevelFunctionsKt").kotlinClass + val clazz = Class.forName("tests.call.simpleTopLevelFunctions.SimpleTopLevelFunctionsKt").kDeclarationContainer val foo = clazz.getMemberByName("foo") val f = foo.call("abc") if (f != 3) return "Fail: $f" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt index 52ec57d..4cf931d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt @@ -13,7 +13,7 @@ import kotlinx.reflect.lite.tests.* fun String.extFun(k: String, s: String = "") = this + k + s fun box(): String { - val sExtFun = Class.forName("tests.callBy.boundExtensionFunctionWA.BoundExtensionFunctionWAKt").kotlinClass. + val sExtFun = Class.forName("tests.callBy.boundExtensionFunctionWA.BoundExtensionFunctionWAKt").kDeclarationContainer. getMemberByName("extFun") as KFunction return sExtFun.callBy(mapOf( sExtFun.parameters[0] to "O", diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt index f72b66c..bba8a2e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt @@ -16,7 +16,7 @@ val String.plusK: String get() = this + "K" fun box(): String { - val plusK = Class.forName("tests.callBy.boundExtensionPropertyAcessorWA.BoundExtensionPropertyAcessorWAKt").kotlinClass. + val plusK = Class.forName("tests.callBy.boundExtensionPropertyAcessorWA.BoundExtensionPropertyAcessorWAKt").kDeclarationContainer. getMemberByName("plusK") as KProperty1 return plusK.getter.callBy(mapOf( plusK.parameters[0] to "O" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt index 6d5aaa2..a209370 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt @@ -12,7 +12,7 @@ object Host { } fun box(): String { - val concat = (Host::class.java).kotlinClass.getMemberByName("concat") as KFunction + val concat = (Host::class.java).kDeclarationContainer.getMemberByName("concat") as KFunction val concatParams = concat.parameters return concat.callBy(mapOf( concatParams[0] to Host, diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt index a1b719f..55ffcd0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt @@ -10,7 +10,7 @@ class C { } fun box(): String { - val f = (C.Companion::class.java).kotlinClass.members.single { it.name == "foo" } + val f = (C.Companion::class.java).kDeclarationContainer.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt index 898ac02..0e1ab04 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt @@ -9,7 +9,7 @@ fun foo(a: String, b: String = "b", c: String, d: String = "d", e: String) = a + b + c + d + e fun box(): String { - val foo = Class.forName("tests.callBy.defaultAndNonDefaultIntertwined.DefaultAndNonDefaultIntertwinedKt").kotlinClass + val foo = Class.forName("tests.callBy.defaultAndNonDefaultIntertwined.DefaultAndNonDefaultIntertwinedKt").kDeclarationContainer .getMemberByName("foo") as KFunction val p = foo.parameters assertEquals("abcde", foo.callBy(mapOf( diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt index 3ca2b28..469cfb2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt @@ -13,7 +13,7 @@ open class A { class B : A() fun box(): String { - val f = (B::class.java).kotlinClass.getMemberByName("foo") + val f = (B::class.java).kDeclarationContainer.getMemberByName("foo") assertEquals("ba", f.callBy(mapOf( f.parameters.first() to B(), diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt index 3ef4706..0c003cb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt @@ -7,7 +7,7 @@ import kotlin.test.assertEquals fun String.sum(other: String = "b") = this + other fun box(): String { - val f = Class.forName("tests.callBy.extensionFunction.ExtensionFunctionKt").kotlinClass.getMemberByName("sum") + val f = Class.forName("tests.callBy.extensionFunction.ExtensionFunctionKt").kDeclarationContainer.getMemberByName("sum") assertEquals("ab", f.callBy(mapOf(f.parameters.first() to "a"))) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt index 856944a..71bb2bd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt @@ -13,7 +13,7 @@ class C { } fun box(): String { - val f = (C.Companion::class.java).kotlinClass.members.single { it.name == "foo" } + val f = (C.Companion::class.java).kDeclarationContainer.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt index 2b84091..badf395 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt @@ -9,7 +9,7 @@ object Obj { } fun box(): String { - val f = (Obj::class.java).kotlinClass.members.single { it.name == "foo" } + val f = (Obj::class.java).kDeclarationContainer.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt index 6503f2d..3c96a58 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt @@ -89,7 +89,7 @@ class A( } fun box(): String { - val aClass = (A::class.java).kotlinClass as KClass + val aClass = (A::class.java).kotlin val f = aClass.constructors.single() val parameters = f.parameters diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt index 3f83763..1050044 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt @@ -88,7 +88,7 @@ class A { } fun box(): String { - val f = (A::class.java).kotlinClass.members.single { it.name == "foo" } + val f = (A::class.java).kDeclarationContainer.members.single { it.name == "foo" } val parameters = f.parameters f.callBy(mapOf( diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt index a293536..d24e96b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt @@ -88,7 +88,7 @@ class A { } fun box(): String { - val f = (A::class.java).kotlinClass.members.single { it.name == "foo" } + val f = (A::class.java).kDeclarationContainer.members.single { it.name == "foo" } val parameters = f.parameters f.callBy(mapOf( diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt index 195ab07..59b93e8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt @@ -88,7 +88,7 @@ class A { } fun box(): String { - val foo = (A::class.java).kotlinClass.members.single { it.name == "foo" } + val foo = (A::class.java).kDeclarationContainer.members.single { it.name == "foo" } foo.callBy(mapOf( foo.parameters.first() to A(), foo.parameters.single { it.name == "p42" } to 239 diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt index b82e043..461a861 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt @@ -9,7 +9,7 @@ fun foo(x: String? = "Fail") { } fun box(): String { - val foo = Class.forName("tests.callBy.nullValue.NullValueKt").kotlinClass.getMemberByName("foo") + val foo = Class.forName("tests.callBy.nullValue.NullValueKt").kDeclarationContainer.getMemberByName("foo") foo.callBy(mapOf(foo.parameters.single() to null)) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt index 484f761..57d7bcf 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt @@ -17,7 +17,7 @@ fun foo(result: String = "foo") { } fun box(): String { - val clazz = Class.forName("tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.OrdinaryMethodIsInvokedWhenNoDefaultValuesAreUsedKt").kotlinClass + val clazz = Class.forName("tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.OrdinaryMethodIsInvokedWhenNoDefaultValuesAreUsedKt").kDeclarationContainer val foo = clazz.getMemberByName("foo") foo.callBy(mapOf(foo.parameters.single() to "box")) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt index a8fe409..7063dba 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt @@ -25,7 +25,7 @@ fun primitives( } fun box(): String { - val clazz = Class.forName("tests.callBy.primitiveDefaultValues.PrimitiveDefaultValuesKt").kotlinClass + val clazz = Class.forName("tests.callBy.primitiveDefaultValues.PrimitiveDefaultValuesKt").kDeclarationContainer val primitives = clazz.getMemberByName("primitives") primitives.callBy(mapOf()) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt index 8427847..7dea476 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt @@ -6,6 +6,6 @@ import kotlinx.reflect.lite.impl.* class A(val result: String = "OK") fun box(): String { - val aCons = (A::class.java.kotlinClass as KClass).constructors.first() + val aCons = (A::class.java.kotlin).constructors.first() return aCons.callBy(mapOf()).result } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt index f3318de..655872d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt @@ -12,6 +12,6 @@ class A { } fun box(): String { - val foo = (A::class.java).kotlinClass.getMemberByName("foo") as KFunction + val foo = (A::class.java).kDeclarationContainer.getMemberByName("foo") as KFunction return foo.callBy(mapOf(foo.parameters[0] to A(), foo.parameters[1] to 42)) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt index 5bd5a43..d215837 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt @@ -7,7 +7,7 @@ import kotlinx.reflect.lite.tests.* fun foo(result: String = "OK") = result fun box(): String { - val clazz = Class.forName("tests.callBy.simpleTopLevelFunction.SimpleTopLevelFunctionKt").kotlinClass + val clazz = Class.forName("tests.callBy.simpleTopLevelFunction.SimpleTopLevelFunctionKt").kDeclarationContainer val foo = clazz.getMemberByName("foo") as KFunction return foo.callBy(mapOf()) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt index 577af68..a3f99c4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt @@ -1,6 +1,5 @@ package tests.classes.classMembers -import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* @@ -24,7 +23,7 @@ class Derived : Base() { fun Derived.extFun() {} fun box(): String { - (Derived::class.java.kotlinClass as KClass).members.forEach { + (Derived::class.java.kDeclarationContainer as KClass).members.forEach { println(it.name) } return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt index 4ae7ab8..b35ffc7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt @@ -1,6 +1,5 @@ package tests.classes.classSimpleName -import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* import kotlin.test.assertEquals @@ -8,7 +7,7 @@ import kotlin.test.assertEquals class Klass fun box(): String { - assertEquals("Klass", (Klass::class.java.kotlinClass as KClass).simpleName) + assertEquals("Klass", (Klass::class.java.kDeclarationContainer as KClass).simpleName) // TODO ClassDescriptors for java classes are not supported // assertEquals("Date", java.util.Date::class.java.toLiteKClass().simpleName) //assertEquals("ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().simpleName) diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt index 82328ed..36cb661 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt @@ -11,27 +11,27 @@ fun check(klass: KClass<*>, expectedName: String) { fun localInMethod() { fun localInMethod(unused: Any?) { class Local - check((Local::class.java.kotlinClass as KClass), "Local") + check((Local::class.java.kDeclarationContainer as KClass), "Local") class `Local$With$Dollars` - check((`Local$With$Dollars`::class.java.kotlinClass as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") + check((`Local$With$Dollars`::class.java.kDeclarationContainer as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") } localInMethod(null) class Local - check((Local::class.java.kotlinClass as KClass), "Local") + check((Local::class.java.kDeclarationContainer as KClass), "Local") class `Local$With$Dollars` - check((`Local$With$Dollars`::class.java.kotlinClass as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") + check((`Local$With$Dollars`::class.java.kDeclarationContainer as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") } class LocalInConstructor { init { class Local - check((Local::class.java.kotlinClass as KClass), "Local") + check((Local::class.java.kDeclarationContainer as KClass), "Local") class `Local$With$Dollars` - check((`Local$With$Dollars`::class.java.kotlinClass as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") + check((`Local$With$Dollars`::class.java.kDeclarationContainer as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") } } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt index b6ac41c..78833e7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt @@ -15,10 +15,10 @@ fun nestedNames(c: KClass<*>) = c.nestedClasses.map { it.simpleName ?: throw Ass fun box(): String { // Kotlin class without nested classes - assertEquals(emptyList(), nestedNames((A.Inner::class.java.kotlinClass as KClass))) + assertEquals(emptyList(), nestedNames((A.Inner::class.java.kDeclarationContainer as KClass))) // Kotlin class with nested classes assertEquals(listOf("Companion", "Inner", "Nested", "PrivateNested"), - nestedNames((A::class.java.kotlinClass as KClass))) + nestedNames((A::class.java.kotlin))) // Java class without nested classes //assertEquals(emptyList(), nestedNames(Error::class.java.toLiteKClass())) diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt index a24375b..f11a4b8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -12,28 +12,28 @@ class Klass { } fun box(): String { - assertEquals("tests.classes.qualifiedName.Klass", (Klass::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("tests.classes.qualifiedName.Klass", (Klass::class.java.kDeclarationContainer as KClass).qualifiedName) assertEquals( "tests.classes.qualifiedName.Klass.Nested", - (Klass.Nested::class.java.kotlinClass as KClass).qualifiedName + (Klass.Nested::class.java.kDeclarationContainer as KClass).qualifiedName ) assertEquals( "tests.classes.qualifiedName.Klass.Nested\$With\$Dollars", - (Klass.`Nested$With$Dollars`::class.java.kotlinClass as KClass).qualifiedName + (Klass.`Nested$With$Dollars`::class.java.kDeclarationContainer as KClass).qualifiedName ) assertEquals( "tests.classes.qualifiedName.Klass.Companion", - (Klass.Companion::class.java.kotlinClass as KClass).qualifiedName + (Klass.Companion::class.java.kDeclarationContainer as KClass).qualifiedName ) // TODO ClassDescriptors for java classes are not supported //assertEquals("java.util.Date", java.util.Date::class.java.toLiteKClass().qualifiedName) //assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().qualifiedName) class Local - assertEquals(null, (Local::class.java.kotlinClass as KClass).qualifiedName) + assertEquals(null, (Local::class.java.kDeclarationContainer as KClass).qualifiedName) val o = object {} - assertEquals(null, (o.javaClass.kotlinClass as KClass).qualifiedName) + assertEquals(null, (o.javaClass.kDeclarationContainer as KClass).qualifiedName) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt index 5413771..8a803fe 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt @@ -6,60 +6,60 @@ import kotlinx.reflect.lite.* import kotlin.test.assertEquals fun box(): String { - assertEquals("kotlin.Any", (Any::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.String", (String::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.CharSequence", (CharSequence::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.Number", (Number::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.Int", (Int::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.Long", (Long::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.Any", (Any::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.String", (String::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.CharSequence", (CharSequence::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.Number", (Number::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.Int", (Int::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.Long", (Long::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.Array", (Array::class.java.kotlinClass as KClass>).qualifiedName) - assertEquals("kotlin.Array", (Array::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals("kotlin.Array", (Array::class.java.kDeclarationContainer as KClass>).qualifiedName) + assertEquals("kotlin.Array", (Array::class.java.kDeclarationContainer as KClass>).qualifiedName) assertEquals( "kotlin.Array", - (Array>::class.java.kotlinClass as KClass>>).qualifiedName + (Array>::class.java.kDeclarationContainer as KClass>>).qualifiedName ) - assertEquals("kotlin.IntArray", (IntArray::class.java.kotlinClass as KClass).qualifiedName) - assertEquals("kotlin.DoubleArray", (DoubleArray::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.IntArray", (IntArray::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.DoubleArray", (DoubleArray::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.Int.Companion", (Int.Companion::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.Int.Companion", (Int.Companion::class.java.kDeclarationContainer as KClass).qualifiedName) assertEquals( "kotlin.Double.Companion", - (Double.Companion::class.java.kotlinClass as KClass).qualifiedName + (Double.Companion::class.java.kDeclarationContainer as KClass).qualifiedName ) assertEquals( "kotlin.Char.Companion", - (Char.Companion::class.java.kotlinClass as KClass).qualifiedName + (Char.Companion::class.java.kDeclarationContainer as KClass).qualifiedName ) - assertEquals("kotlin.ranges.IntRange", (IntRange::class.java.kotlinClass as KClass).qualifiedName) + assertEquals("kotlin.ranges.IntRange", (IntRange::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.collections.List", (List::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals("kotlin.collections.List", (List::class.java.kDeclarationContainer as KClass>).qualifiedName) assertEquals( "kotlin.collections.Map.Entry", - (Map.Entry::class.java.kotlinClass as KClass>).qualifiedName + (Map.Entry::class.java.kDeclarationContainer as KClass>).qualifiedName ) // TODO: KT-11754 assertEquals( "kotlin.collections.List", - (MutableList::class.java.kotlinClass as KClass>).qualifiedName + (MutableList::class.java.kDeclarationContainer as KClass>).qualifiedName ) assertEquals( "kotlin.collections.Map.Entry", - (MutableMap.MutableEntry::class.java.kotlinClass as KClass>).qualifiedName + (MutableMap.MutableEntry::class.java.kDeclarationContainer as KClass>).qualifiedName ) - assertEquals("kotlin.Function0", (Function0::class.java.kotlinClass as KClass>).qualifiedName) - assertEquals("kotlin.Function1", (Function1::class.java.kotlinClass as KClass>).qualifiedName) + assertEquals("kotlin.Function0", (Function0::class.java.kDeclarationContainer as KClass>).qualifiedName) + assertEquals("kotlin.Function1", (Function1::class.java.kDeclarationContainer as KClass>).qualifiedName) assertEquals( "kotlin.Function5", - (Function5::class.java.kotlinClass as KClass>).qualifiedName + (Function5::class.java.kDeclarationContainer as KClass>).qualifiedName ) assertEquals( "kotlin.jvm.functions.FunctionN", - (Function42::class.java.kotlinClass as KClass>).qualifiedName + (Function42::class.java.kDeclarationContainer as KClass>).qualifiedName ) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt index ffad9ec..493e923 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt @@ -29,11 +29,11 @@ fun sealedSubclassNames(c: KClass<*>) = c.sealedSubclasses.map { it.simpleName ? fun box(): String { assertEquals(listOf("TL1", "TL2"), - sealedSubclassNames((SealedClassWithTopLevelSubclasses::class.java.kotlinClass as KClass))) + sealedSubclassNames((SealedClassWithTopLevelSubclasses::class.java.kDeclarationContainer as KClass))) assertEquals(listOf("N1", "N2"), - sealedSubclassNames((SealedClassWithNestedSubclasses::class.java.kotlinClass as KClass))) + sealedSubclassNames((SealedClassWithNestedSubclasses::class.java.kDeclarationContainer as KClass))) assertEquals(emptyList(), - sealedSubclassNames((SealedClassWithNoSubclasses::class.java.kotlinClass as KClass))) + sealedSubclassNames((SealedClassWithNoSubclasses::class.java.kDeclarationContainer as KClass))) // assertEquals(emptyList(), sealedSubclassNames(String::class.java.toLiteKClass())) // assertEquals(emptyList(), sealedSubclassNames(Thread::class.java.toLiteKClass())) diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt index 09d03d4..6fc6d69 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt @@ -13,9 +13,9 @@ class C { } fun box(): String { - assertTrue((Interface::class.java.kotlinClass as KClass).constructors.isEmpty()) - assertTrue((Obj::class.java.kotlinClass as KClass).constructors.isEmpty()) - assertTrue((C.Companion::class.java.kotlinClass as KClass).constructors.isEmpty()) + assertTrue((Interface::class.java.kDeclarationContainer as KClass).constructors.isEmpty()) + assertTrue((Obj::class.java.kDeclarationContainer as KClass).constructors.isEmpty()) + assertTrue((C.Companion::class.java.kDeclarationContainer as KClass).constructors.isEmpty()) assertTrue(object {}::class.java.toLiteKClass().constructors.isEmpty()) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt index b925bf3..3ea238a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt @@ -1,6 +1,5 @@ package tests.constructors.constructorName -import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* import kotlin.test.assertEquals @@ -8,6 +7,6 @@ import kotlin.test.assertEquals class A fun box(): String { - assertEquals("", (A::class.java.kotlinClass as KClass).constructors.first().name) + assertEquals("", (A::class.java.kotlin).constructors.first().name) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt index ba53f80..b133bc6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt @@ -20,7 +20,7 @@ enum class TestEnum(val id: String? = null) { fun box(): String { assertEquals(listOf("fun (kotlin.String?): tests.constructors.enumEntry.TestEnum"), TestEnum.ENUM1::class.java.toLiteKClass().constructors.map { it.toString() }) - assertEquals(listOf(), (TestEnum.ENUM2::class.java.kotlinClass as KClass<*>).constructors.map { it.toString() }) + assertEquals(listOf(), (TestEnum.ENUM2::class.java.kotlin).constructors.map { it.toString() }) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt index 241dfff..5872b72 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt @@ -30,27 +30,27 @@ class C { } fun box(): String { - val p1 = (OnlyPrimary::class.java.kotlinClass as KClass).primaryConstructor + val p1 = (OnlyPrimary::class.java.kDeclarationContainer as KClass).primaryConstructor assertNotNull(p1) assert(p1.call() is OnlyPrimary) - val p2 = (PrimaryWithSecondary::class.java.kotlinClass as KClass).primaryConstructor + val p2 = (PrimaryWithSecondary::class.java.kDeclarationContainer as KClass).primaryConstructor assertNotNull(p2) assert(p2.call("beer").toString() == "beer") - val p3 = (OnlySecondary::class.java.kotlinClass as KClass).primaryConstructor + val p3 = (OnlySecondary::class.java.kDeclarationContainer as KClass).primaryConstructor assertNull(p3) - val p4 = (TwoSecondaries::class.java.kotlinClass as KClass).primaryConstructor + val p4 = (TwoSecondaries::class.java.kDeclarationContainer as KClass).primaryConstructor assertNull(p4) - assertNotNull((En::class.java.kotlinClass as KClass).primaryConstructor) + assertNotNull((En::class.java.kDeclarationContainer as KClass).primaryConstructor) - assertNull((I::class.java.kotlinClass as KClass).primaryConstructor) - assertNull((O::class.java.kotlinClass as KClass).primaryConstructor) - assertNull((C.Companion::class.java.kotlinClass as KClass).primaryConstructor) + assertNull((I::class.java.kotlin).primaryConstructor) + assertNull((O::class.java.kotlin).primaryConstructor) + assertNull((C.Companion::class.java.kDeclarationContainer as KClass).primaryConstructor) - assertNull((object {}::class.java.kotlinClass as KClass).primaryConstructor) + assertNull((object {}::class.java.kDeclarationContainer as KClass).primaryConstructor) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt index b081133..8dd89b4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt @@ -1,6 +1,5 @@ package tests.constructors.simpleGetConstructors -import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* import java.util.Collections @@ -20,20 +19,20 @@ class C { } fun box(): String { - assertEquals(3, (A::class.java.kotlinClass as KClass).constructors.size) - assertEquals(1, (B::class.java.kotlinClass as KClass).constructors.size) + assertEquals(3, (A::class.java.kotlin).constructors.size) + assertEquals(1, (B::class.java.kotlin).constructors.size) assertTrue(Collections.disjoint( - (A::class.java.kotlinClass as KClass).members, - (A::class.java.kotlinClass as KClass).constructors + (A::class.java.kotlin).members, + (A::class.java.kotlin).constructors )) assertTrue(Collections.disjoint( - (B::class.java.kotlinClass as KClass).members, - (B::class.java.kotlinClass as KClass).constructors + (B::class.java.kotlin).members, + (B::class.java.kotlin).constructors )) - assertEquals(1, (C.Nested::class.java.kotlinClass as KClass).constructors.size) - assertEquals(1, (C.Inner::class.java.kotlinClass as KClass).constructors.size) + assertEquals(1, (C.Nested::class.java.kDeclarationContainer as KClass).constructors.size) + assertEquals(1, (C.Inner::class.java.kDeclarationContainer as KClass).constructors.size) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt index 604f86b..1edc463 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt @@ -24,10 +24,10 @@ fun check(f: KFunction) { } fun box(): String { - check((K::class.java.kotlinClass as KClass).constructors.first()) - check(((K::class.java.kotlinClass as KClass).nestedClasses.first() as KClass).constructors.first()) - check(((K::class.java.kotlinClass as KClass).nestedClasses.first() as KClass).constructors.first()) - check((Secondary::class.java.kotlinClass as KClass).constructors.first()) + check((K::class.java.kotlin).constructors.first()) + check(((K::class.java.kotlin).nestedClasses.first() as KClass).constructors.first()) + check(((K::class.java.kotlin).nestedClasses.first() as KClass).constructors.first()) + check((Secondary::class.java.kDeclarationContainer as KClass).constructors.first()) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt index 50fc688..889b7a8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt @@ -16,7 +16,7 @@ var K.ext: Double val fileFacadeClass = object {}::class.java.enclosingClass fun box(): String { - val clazz = Class.forName("tests.mapping.extensionProperty.ExtensionPropertyKt").kotlinClass + val clazz = Class.forName("tests.mapping.extensionProperty.ExtensionPropertyKt").kDeclarationContainer val p = clazz.getMemberByName("ext") as KMutableProperty1 val getter = p.javaGetter!! diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt index fcac719..a62daf1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt @@ -22,8 +22,8 @@ fun check(f: KFunction) { } fun box(): String { - check((K::class.java.kotlinClass).getMemberByName("foo") as KFunction) - val clazz = Class.forName("tests.mapping.functions.FunctionsKt").kotlinClass + check((K::class.java.kDeclarationContainer).getMemberByName("foo") as KFunction) + val clazz = Class.forName("tests.mapping.functions.FunctionsKt").kDeclarationContainer check(clazz.getMemberByName("bar") as KFunction) check(clazz.getMemberByName("baz") as KFunction) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt index 2854d5c..8eb2dd9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt @@ -14,10 +14,10 @@ class Foo { } fun box(): String { - val g = Class.forName("tests.mapping.inlineReifiedFun.InlineReifiedFunKt").kotlinClass.getMemberByName("g") as KFunction<*> + val g = Class.forName("tests.mapping.inlineReifiedFun.InlineReifiedFunKt").kDeclarationContainer.getMemberByName("g") as KFunction<*> assertEquals(g as Any?, g.javaMethod!!.kotlinFunction) - val h = Foo::class.java.kotlinClass.members.single { it.name == "h" } as KFunction<*> + val h = Foo::class.java.kDeclarationContainer.members.single { it.name == "h" } as KFunction<*> assertEquals(h, h.javaMethod!!.kotlinFunction as Any?) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt index cd750e2..f7f844e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt @@ -3,7 +3,6 @@ package tests.mapping.interfaceCompanionPropertyWithJvmField import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* -import kotlin.reflect.jvm.* import kotlin.test.* interface Foo { @@ -14,7 +13,7 @@ interface Foo { } fun box(): String { - val value = Foo.Companion::class.java.kotlinClass.getMemberByName("value") as KProperty1 + val value = Foo.Companion::class.java.kDeclarationContainer.getMemberByName("value") as KProperty1 val field = value.javaField assertNotNull(field, "javaField not found for property declared in the interface's companion object") return field.get(null) as String diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt index cac6d7a..c795a29 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt @@ -10,7 +10,7 @@ class K { } fun box(): String { - val p = K::class.java.kotlinClass.getMemberByName("value") as KMutableProperty1 + val p = K::class.java.kDeclarationContainer.getMemberByName("value") as KMutableProperty1 assertNotNull(p.javaField, "Fail p field") diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt index 4c8a11f..0289b7c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt @@ -8,7 +8,7 @@ import kotlin.test.* class K(var value: Long) fun box(): String { - val p = K::class.java.kotlinClass.getMemberByName("value") as KMutableProperty1 + val p = K::class.java.kDeclarationContainer.getMemberByName("value") as KMutableProperty1 assertNotNull(p.javaField, "Fail p field") diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt index 53af3dc..ddca7a1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt @@ -21,9 +21,9 @@ interface MyCloneable : Cloneable fun KClass<*>.functions() = members.filterIsInstance>().map { it.javaMethod!!.name }.sorted() fun box(): String { - assertEquals(listOf("equals", "hashCode", "toString"), (A::class.java.kotlinClass as KClass<*>).functions()) - assertEquals(listOf("equals", "hashCode", "toString"), (I::class.java.kotlinClass as KClass<*>).functions()) - assertEquals(listOf("equals", "hashCode", "toString"), (C::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (A::class.java.kotlin).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (I::class.java.kotlin).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (C::class.java.kotlin).functions()) // Now we can get only declared functions: equals(), hashCode(), toString() // assertEquals( @@ -31,7 +31,7 @@ fun box(): String { // (MyCustomMembers::class.java.kotlinClass as KClass<*>).functions() // ) - assertEquals(listOf("clone", "equals", "hashCode", "toString"), (MyCloneable::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("clone", "equals", "hashCode", "toString"), (MyCloneable::class.java.kotlin).functions()) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt index 4ccd8f4..7f7fce6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt @@ -21,8 +21,8 @@ interface C : B2 abstract class D : B1, C fun box(): String { - assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A1.a1()", (D::class.java.kotlinClass.getMemberByName("a1") as KFunction<*>).javaMethod.toString()) - assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A2.a2()", (D::class.java.kotlinClass.getMemberByName("a2") as KFunction<*>).javaMethod!!.toString()) + assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A1.a1()", (D::class.java.kDeclarationContainer.getMemberByName("a1") as KFunction<*>).javaMethod.toString()) + assertEquals("public abstract void tests.mapping.methodsFromSuperInterface.A2.a2()", (D::class.java.kDeclarationContainer.getMemberByName("a2") as KFunction<*>).javaMethod!!.toString()) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt index 05a5d7c..fb5286d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt @@ -8,7 +8,7 @@ import kotlin.test.* class K(private var value: Long) fun box(): String { - val p = (K::class.java.kotlinClass).getMemberByName("value") as KMutableProperty1 + val p = (K::class.java.kDeclarationContainer).getMemberByName("value") as KMutableProperty1 assertNotNull(p.javaField, "Fail p field") assertNull(p.javaGetter, "Fail p getter") diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt index 4c21512..4a4d0d5 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt @@ -11,7 +11,7 @@ var state: String = "value" set fun box(): String { - val clazz = Class.forName("tests.mapping.propertyAccessorsWithJvmName.PropertyAccessorsWithJvmNameKt").kotlinClass + val clazz = Class.forName("tests.mapping.propertyAccessorsWithJvmName.PropertyAccessorsWithJvmNameKt").kDeclarationContainer val p = clazz.getMemberByName("state") as KMutableProperty0 if (p.name != "state") return "Fail name: ${p.name}" diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt index c03c362..c86700f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt @@ -10,7 +10,7 @@ var topLevel = "123" val fileFacadeClass = object {}::class.java.enclosingClass fun box(): String { - val p = Class.forName("tests.mapping.topLevelProperty.TopLevelPropertyKt").kotlinClass.getMemberByName("topLevel") as KMutableProperty0 + val p = Class.forName("tests.mapping.topLevelProperty.TopLevelPropertyKt").kDeclarationContainer.getMemberByName("topLevel") as KMutableProperty0 assertNotNull(p.javaField, "Fail p field") assertEquals(p.javaField!!.getDeclaringClass(), fileFacadeClass) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt index eccdef9..e3b87aa 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt @@ -16,17 +16,17 @@ class A { } fun box(): String { - val foo = Class.forName("tests.mapping.types.array.ArrayKt").kotlinClass.getMemberByName("foo") + val foo = Class.forName("tests.mapping.types.array.ArrayKt").kDeclarationContainer.getMemberByName("foo") assertEquals(Array::class.java, foo.parameters[0].type.javaType) assertEquals(Array::class.java, foo.parameters[1].type.javaType) assertEquals(Array>::class.java, foo.parameters[2].type.javaType) - val bar = Class.forName("tests.mapping.types.array.ArrayKt").kotlinClass.getMemberByName("bar") + val bar = Class.forName("tests.mapping.types.array.ArrayKt").kDeclarationContainer.getMemberByName("bar") val g = bar.returnType.javaType if (g !is GenericArrayType || g.genericComponentType !is ParameterizedType) return "Fail: should be array of parameterized type, but was $g (${g.javaClass})" - val baz = A::class.java.kotlinClass.getMemberByName("baz") as KFunction> + val baz = A::class.java.kDeclarationContainer.getMemberByName("baz") as KFunction> val h = baz.returnType.javaType if (h !is GenericArrayType || h.genericComponentType !is TypeVariable<*>) return "Fail: should be array of type variable, but was $h (${h.javaClass})" diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt index 61c6649..afa6523 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt @@ -12,13 +12,13 @@ class A(d: Double, s: String, parent: A?) { enum class E(val i: Int) { ENTRY(1) } fun box(): String { - val aCons = (A::class.java.kotlinClass as KClass).constructors.first() + val aCons = (A::class.java.kotlin).constructors.first() assertEquals(listOf(java.lang.Double.TYPE, String::class.java, A::class.java), aCons.parameters.map { it.type.javaType }) - val aNestedCons = (A::class.java.kotlinClass as KClass).nestedClasses.single { it.simpleName == "Nested" }.constructors.first() + val aNestedCons = (A::class.java.kotlin).nestedClasses.single { it.simpleName == "Nested" }.constructors.first() assertEquals(listOf(A::class.java), aNestedCons.parameters.map { it.type.javaType }) - val aInnerCons = (A::class.java.kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" }.constructors.first() + val aInnerCons = (A::class.java.kotlin).nestedClasses.single { it.simpleName == "Inner" }.constructors.first() assertEquals(listOf(A::class.java, A.Nested::class.java), aInnerCons.parameters.map { it.type.javaType }) - val eCons = (E::class.java.kotlinClass as KClass).constructors.single() + val eCons = (E::class.java.kotlin).constructors.single() assertEquals(listOf(java.lang.Integer.TYPE), eCons.parameters.map { it.type.javaType }) assertEquals(A::class.java, aCons.returnType.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt index d3077cd..593012f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt @@ -18,7 +18,7 @@ fun arrayOfOutList(): Array> = null!! fun box(): String { // NB: in "Array", Java type of X is always Any::class.java because this is the JVM signature generated by the compiler - val clazz = Class.forName("tests.mapping.types.genericArrayElementType.GenericArrayElementTypeKt").kotlinClass + val clazz = Class.forName("tests.mapping.types.genericArrayElementType.GenericArrayElementTypeKt").kDeclarationContainer val arrayOfInvBar = clazz.getMemberByName("arrayOfInvBar") as KFunction> assertEquals(Bar::class.java, arrayOfInvBar.returnType.arguments.single().type!!.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt index 1d09ae3..977baed 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt @@ -14,11 +14,11 @@ object O { } fun box(): String { - val foo = A::class.java.kotlinClass.getMemberByName("foo") + val foo = A::class.java.kDeclarationContainer.getMemberByName("foo") assertEquals(listOf(A::class.java, java.lang.Long::class.java), foo.parameters.map { it.type.javaType }) assertEquals(java.lang.Long.TYPE, foo.returnType.javaType) - val bar = O::class.java.kotlinClass.members.single { it.name == "bar" } + val bar = O::class.java.kDeclarationContainer.members.single { it.name == "bar" } assertEquals(listOf(O::class.java, A::class.java), bar.parameters.map { it.type.javaType }) assertEquals(String::class.java, bar.returnType.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt index 15633d9..2eb1cde 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt @@ -14,7 +14,7 @@ fun fooOfInBar(): Foo = null!! fun fooOfOutBar(): Foo = null!! fun box(): String { - val clazz = Class.forName("tests.mapping.types.parameterizedTypeArgument.ParameterizedTypeArgumentKt").kotlinClass + val clazz = Class.forName("tests.mapping.types.parameterizedTypeArgument.ParameterizedTypeArgumentKt").kDeclarationContainer val listOfStrings = clazz.getMemberByName("listOfStrings") as KFunction> assertEquals(String::class.java, listOfStrings.returnType.arguments.single().type!!.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt index acb1986..176f5ea 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt @@ -4,7 +4,6 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.ParameterizedType -import kotlin.test.assertEquals class A(private var foo: List) @@ -24,23 +23,23 @@ fun assertGenericType(type: KType) { } fun box(): String { - val foo = A::class.java.kotlinClass.members.single { it.name == "foo" } as KMutableProperty<*> + val foo = A::class.java.kDeclarationContainer.members.single { it.name == "foo" } as KMutableProperty<*> assertGenericType(foo.returnType) assertGenericType(foo.getter.returnType) assertGenericType(foo.setter.parameters.last().type) - val bar = O::class.java.kotlinClass.members.single { it.name == "bar" } as KMutableProperty<*> + val bar = O::class.java.kDeclarationContainer.members.single { it.name == "bar" } as KMutableProperty<*> assertGenericType(bar.returnType) assertGenericType(bar.getter.returnType) assertGenericType(bar.setter.parameters.last().type) - val clazz = Class.forName("tests.mapping.types.parameterizedTypes.ParameterizedTypesKt").kotlinClass + val clazz = Class.forName("tests.mapping.types.parameterizedTypes.ParameterizedTypesKt").kDeclarationContainer val topLevel = clazz.getMemberByName("topLevel") assertGenericType(topLevel.returnType) val extension = clazz.getMemberByName("extension") assertGenericType(extension.returnType) - assertGenericType((A::class.java.kotlinClass as KClass).constructors.first().parameters.single().type) + assertGenericType((A::class.java.kotlin).constructors.first().parameters.single().type) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt index 8510e69..845fdca 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt @@ -12,12 +12,12 @@ object O { } fun box(): String { - val foo = A::class.java.kotlinClass.members.single { it.name == "foo" } as KMutableProperty<*> + val foo = A::class.java.kDeclarationContainer.members.single { it.name == "foo" } as KMutableProperty<*> assertEquals(listOf(A::class.java), foo.parameters.map { it.type.javaType }) assertEquals(listOf(A::class.java), foo.getter.parameters.map { it.type.javaType }) assertEquals(listOf(A::class.java, String::class.java), foo.setter.parameters.map { it.type.javaType }) - val bar = O::class.java.kotlinClass.members.single { it.name == "bar" } as KMutableProperty<*> + val bar = O::class.java.kDeclarationContainer.members.single { it.name == "bar" } as KMutableProperty<*> assertEquals(listOf(O::class.java), bar.parameters.map { it.type.javaType }) assertEquals(listOf(O::class.java), bar.getter.parameters.map { it.type.javaType }) assertEquals(listOf(O::class.java, String::class.java), bar.setter.parameters.map { it.type.javaType }) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt index bd1a895..ef1a9ad 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt @@ -15,7 +15,7 @@ interface Interface2 class A : Interface, Klass(), Interface2 fun box(): String { - val (i, k, i2) = (A::class.java.kotlinClass as KClass>).supertypes.map { it.javaType } + val (i, k, i2) = (A::class.java.kDeclarationContainer as KClass>).supertypes.map { it.javaType } i as? ParameterizedType ?: fail("Not a parameterized type: $i") assertEquals(Interface::class.java, i.rawType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt index e43c06a..91f5b63 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt @@ -10,7 +10,7 @@ fun free(s: String): Int = s.length fun Any.extension() {} fun box(): String { - val clazz = Class.forName("tests.mapping.types.topLevelFunctions.TopLevelFunctionsKt").kotlinClass + val clazz = Class.forName("tests.mapping.types.topLevelFunctions.TopLevelFunctionsKt").kDeclarationContainer val free = clazz.getMemberByName("free") as KFunction val extension = clazz.getMemberByName("extension") as KFunction assertEquals(java.lang.Integer.TYPE, free.returnType.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt index 595c07d..4d138dc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt @@ -11,14 +11,14 @@ class A { } fun box(): String { - val f = A::class.java.kotlinClass.getMemberByName("foo") as KFunction + val f = A::class.java.kDeclarationContainer.getMemberByName("foo") as KFunction val t = f.parameters.last().type.javaType if (t !is TypeVariable<*>) return "Fail, t should be a type variable: $t" assertEquals("T", t.name) assertEquals(A::class.java, (t.genericDeclaration as Class<*>)) - val tp = (A::class.java.kotlinClass as KClass>).typeParameters + val tp = (A::class.java.kDeclarationContainer as KClass>).typeParameters assertEquals(CharSequence::class.java, tp.single().upperBounds.single().javaType) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt index 505d56e..8e2813a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt @@ -12,12 +12,12 @@ var bar: Unit = Unit fun box(): String { assert(Unit::class.java != java.lang.Void.TYPE) - val foo = Class.forName("tests.mapping.types.unit.UnitKt").kotlinClass.getMemberByName("foo") as KFunction + val foo = Class.forName("tests.mapping.types.unit.UnitKt").kDeclarationContainer.getMemberByName("foo") as KFunction assertEquals(Unit::class.java, foo.parameters[0].type.javaType) assertEquals(Unit::class.java, foo.parameters[1].type.javaType) assertEquals(java.lang.Void.TYPE, foo.returnType.javaType) - val bar = Class.forName("tests.mapping.types.unit.UnitKt").kotlinClass.getMemberByName("bar") as KMutableProperty0 + val bar = Class.forName("tests.mapping.types.unit.UnitKt").kDeclarationContainer.getMemberByName("bar") as KMutableProperty0 assertEquals(Unit::class.java, bar.returnType.javaType) assertEquals(Unit::class.java, bar.getter.returnType.javaType) assertEquals(Unit::class.java, bar.setter.parameters.single().type.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt index c569dd1..653096f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt @@ -13,7 +13,7 @@ data class BigDataClass( ) fun box(): String { - val copy = (BigDataClass::class.java).kotlinClass.getMemberByName("copy") + val copy = (BigDataClass::class.java).kDeclarationContainer.getMemberByName("copy") assertEquals( "[null, p00, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, " + "p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29]", diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt index 7092178..a0aed8e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt @@ -22,15 +22,15 @@ fun checkParameters(f: KCallable<*>, names: List) { } fun box(): String { - val clazz = Class.forName("tests.parameters.functionParameterNameAndIndex.FunctionParameterNameAndIndexKt").kotlinClass + val clazz = Class.forName("tests.parameters.functionParameterNameAndIndex.FunctionParameterNameAndIndexKt").kDeclarationContainer checkParameters(clazz.getMemberByName("box"), listOf()) checkParameters(clazz.getMemberByName("foo"), listOf("bar")) - checkParameters((A::class.java).kotlinClass.getMemberByName("foz"), listOf(null, "baz")) + checkParameters((A::class.java).kDeclarationContainer.getMemberByName("foz"), listOf(null, "baz")) checkParameters(clazz.getMemberByName("qux"), listOf(null, "zux")) - checkParameters((A::class.java).kotlinClass.getMemberByName("mext"), listOf(null, null, "mez")) + checkParameters((A::class.java).kDeclarationContainer.getMemberByName("mext"), listOf(null, null, "mez")) - checkParameters(((A::class.java).kotlinClass as KClass).constructors.first(), listOf("c")) + checkParameters(((A::class.java).kotlin).constructors.first(), listOf("c")) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt index 89f11b3..742613e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt @@ -19,7 +19,7 @@ fun KParameter.check(name: String?, kind: KParameter.Kind) { } fun box(): String { - val inner = ((Outer::class.java).kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" } + val inner = ((Outer::class.java).kDeclarationContainer as KClass).nestedClasses.single { it.simpleName == "Inner" } val ctor = inner.constructors.first() val ctorPararms = ctor.parameters diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt index 2b590e4..c745092 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt @@ -19,7 +19,7 @@ fun KParameter.check(name: String?, kind: KParameter.Kind) { } fun box(): String { - (A::class.java).kotlinClass.getMemberByName("memExt").let { + (A::class.java).kDeclarationContainer.getMemberByName("memExt").let { assertEquals(3, it.parameters.size) it.parameters[0].check(null, KParameter.Kind.INSTANCE) it.parameters[1].check(null, KParameter.Kind.EXTENSION_RECEIVER) @@ -27,12 +27,12 @@ fun box(): String { } Class.forName("tests.parameters.instanceExtensionReceiverAndValueParameters.InstanceExtensionReceiverAndValueParametersKt") - .kotlinClass.getMemberByName("topLevel").let { + .kDeclarationContainer.getMemberByName("topLevel").let { assertEquals(0, it.parameters.size) } Class.forName("tests.parameters.instanceExtensionReceiverAndValueParameters.InstanceExtensionReceiverAndValueParametersKt") - .kotlinClass.getMemberByName("ext").let { + .kDeclarationContainer.getMemberByName("ext").let { assertEquals(2, it.parameters.size) it.parameters[0].check(null, KParameter.Kind.EXTENSION_RECEIVER) it.parameters[1].check("o", KParameter.Kind.VALUE) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt index 5f0d6d0..4fa75cc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt @@ -14,11 +14,11 @@ open class A { class B : A() fun box(): String { - val bProperty = (B::class.java).kotlinClass.getMemberByName("property") + val bProperty = (B::class.java).kDeclarationContainer.getMemberByName("property") assertEquals(KParameter.Kind.INSTANCE, bProperty.parameters[0].kind) assertEquals(B::class.java, bProperty.parameters[0].type.javaType) - val bFunction = (B::class.java).kotlinClass.getMemberByName("function") + val bFunction = (B::class.java).kDeclarationContainer.getMemberByName("function") assertEquals(KParameter.Kind.INSTANCE, bFunction.parameters[0].kind) assertEquals(B::class.java, bFunction.parameters[0].type.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt index 5a5a1ba..98d4776 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt @@ -12,10 +12,10 @@ class A { fun Any?.ext() {} fun box(): String { - val ps = (A::class.java).kotlinClass.getMemberByName("foo").parameters.map { it.type.isMarkedNullable } + val ps = (A::class.java).kDeclarationContainer.getMemberByName("foo").parameters.map { it.type.isMarkedNullable } assertEquals(listOf(false, false, true, false, false, true), ps) - val ext = Class.forName("tests.parameters.isMarkedNullable.IsMarkedNullableKt").kotlinClass.getMemberByName("ext") + val ext = Class.forName("tests.parameters.isMarkedNullable.IsMarkedNullableKt").kDeclarationContainer.getMemberByName("ext") assertTrue(ext.parameters.single().type.isMarkedNullable) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt index 7952f07..12b7a52 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt @@ -20,9 +20,9 @@ class C : A() fun Int.extFun() {} fun box(): String { - assertEquals(listOf(false, false, true), (A::class.java).kotlinClass.getMemberByName("foo").parameters.map { it.isOptional }) + assertEquals(listOf(false, false, true), (A::class.java).kDeclarationContainer.getMemberByName("foo").parameters.map { it.isOptional }) - assertFalse(Class.forName("tests.parameters.isOptional.IsOptionalKt").kotlinClass.getMemberByName("extFun").parameters.single().isOptional) + assertFalse(Class.forName("tests.parameters.isOptional.IsOptionalKt").kDeclarationContainer.getMemberByName("extFun").parameters.single().isOptional) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt index 3664fb9..209ec52 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt @@ -12,8 +12,8 @@ class A { } fun box(): String { - val foo = A::class.java.kotlinClass.getMemberByName("foo") - val inner = (A::class.java.kotlinClass as KClass).nestedClasses.single { it.simpleName == "Inner" } + val foo = A::class.java.kDeclarationContainer.getMemberByName("foo") + val inner = (A::class.java.kotlin).nestedClasses.single { it.simpleName == "Inner" } assertEquals(listOf(KParameter.Kind.INSTANCE, KParameter.Kind.EXTENSION_RECEIVER, KParameter.Kind.VALUE), foo.parameters.map { it.kind }) assertEquals(listOf(KParameter.Kind.INSTANCE, KParameter.Kind.VALUE), inner.constructors.first().parameters.map { it.kind }) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt index 5284f3a..c594d98 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt @@ -9,7 +9,7 @@ object Host { } fun box(): String { - val fooParams = (Host::class.java).kotlinClass.getMemberByName("foo").parameters + val fooParams = (Host::class.java).kDeclarationContainer.getMemberByName("foo").parameters assertEquals(3, fooParams.size) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt index b73adbd..e841770 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt @@ -20,7 +20,7 @@ fun checkPropertySetterParam(property: KMutableProperty0<*>, name: String?) { } fun box(): String { - val clazz = Class.forName("tests.parameters.propertySetter.PropertySetterKt").kotlinClass + val clazz = Class.forName("tests.parameters.propertySetter.PropertySetterKt").kDeclarationContainer checkPropertySetterParam(clazz.getMemberByName("default") as KMutableProperty0, null) checkPropertySetterParam(clazz.getMemberByName("defaultAnnotated") as KMutableProperty0, null) checkPropertySetterParam(clazz.getMemberByName("custom") as KMutableProperty0, "myName") diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt index 5b12573..0b07e8f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt @@ -18,9 +18,9 @@ fun KParameter.check(name: String?, kind: KParameter.Kind) { } fun box(): String { - val cFoo = (C::class.java).kotlinClass.getMemberByName("foo") - val cBar = (C::class.java).kotlinClass.getMemberByName("bar") as KMutableProperty1 - val cExtFun = Class.forName("tests.parameters.references.ReferencesKt").kotlinClass.getMemberByName("extFun") + val cFoo = (C::class.java).kDeclarationContainer.getMemberByName("foo") + val cBar = (C::class.java).kDeclarationContainer.getMemberByName("bar") as KMutableProperty1 + val cExtFun = Class.forName("tests.parameters.references.ReferencesKt").kDeclarationContainer.getMemberByName("extFun") assertEquals(1, cFoo.parameters.size) assertEquals(1, cBar.getter.parameters.size) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index 03c5182..03b7e16 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -12,7 +12,7 @@ var String.prop: String set(value) { state = this + value } fun box(): String { - val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").kotlinClass + val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").kDeclarationContainer val prop = clazz.getMemberByName("prop") as KMutableProperty1 assertEquals("3", prop.getter.invoke("abc")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt index 2c26c20..0e7f871 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt @@ -8,7 +8,7 @@ import kotlin.test.assertEquals class C(var state: String) fun box(): String { - val prop = (C::class.java.kotlinClass as KClass).getMemberByName("state") as KMutableProperty1 + val prop = (C::class.java.kotlin).getMemberByName("state") as KMutableProperty1 val c = C("1") assertEquals("1", prop.getter.invoke(c)) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index 16e4e04..170d2cb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -8,7 +8,7 @@ import kotlin.test.assertEquals var state: String = "" fun box(): String { - val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").kotlinClass + val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").kDeclarationContainer val state = clazz.getMemberByName("state") as KMutableProperty0 assertEquals("", state.getter.invoke()) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt index c02996f..ab32509 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt @@ -7,5 +7,5 @@ import kotlinx.reflect.lite.tests.* class A(val foo: String) fun box(): String { - return ((A::class.java).kotlinClass.getMemberByName("foo") as KProperty1).invoke(A("OK")) as String + return ((A::class.java).kotlin.getMemberByName("foo") as KProperty1).invoke(A("OK")) as String } diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt index 9f3cd49..21fa45c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt @@ -8,7 +8,7 @@ import kotlin.test.* class K(private val value: String) fun box(): String { - val p = (K::class.java).kotlinClass.getMemberByName("value") as KProperty1 + val p = (K::class.java).kDeclarationContainer.getMemberByName("value") as KProperty1 try { return p.get(K("Fail: private property should not be accessible by default")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt index f4a8887..9915e28 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt @@ -8,7 +8,7 @@ import kotlin.test.* class Result { private val value = "OK" - fun ref() = (Result::class.java).kotlinClass.getMemberByName("value") as KProperty1 + fun ref() = (Result::class.java).kDeclarationContainer.getMemberByName("value") as KProperty1 } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt index 3f2ef5a..145e56b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt @@ -8,7 +8,7 @@ import kotlin.test.* class A { private var value = 0 - fun ref() = (A::class.java).kotlinClass.getMemberByName("value") as KMutableProperty1 + fun ref() = (A::class.java).kDeclarationContainer.getMemberByName("value") as KMutableProperty1 } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt index 251d659..d126cd1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt @@ -9,7 +9,7 @@ object Obj { } fun box(): String { - val p = (Obj::class.java).kotlinClass.members.single { it.name == "result" } as KMutableProperty1 + val p = (Obj::class.java).kDeclarationContainer.members.single { it.name == "result" } as KMutableProperty1 p.isAccessible = true try { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt index 244af7b..eb47682 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt @@ -9,7 +9,7 @@ class A(private var foo: String) fun box(): String { val a = A("") - val foo = (A::class.java).kotlinClass.getMemberByName("foo") as KMutableProperty1 + val foo = (A::class.java).kDeclarationContainer.getMemberByName("foo") as KMutableProperty1 assertTrue(!foo.isAccessible) assertTrue(!foo.getter.isAccessible) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt index 13cf28e..184cc3b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt @@ -10,7 +10,7 @@ class K { set(value) {} fun run(): String { - val p = (K::class.java).kotlinClass.getMemberByName("t") as KMutableProperty1, String> + val p = (K::class.java).kDeclarationContainer.getMemberByName("t") as KMutableProperty1, String> p.isAccessible = true p.set(this as K, "") return p.get(this) as String diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt index 93c7a84..b581e6b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt @@ -8,7 +8,7 @@ import kotlin.test.* class A(param: String) { protected var v: String = param - fun ref() = (A::class.java).kotlinClass.getMemberByName("v") as KMutableProperty1 + fun ref() = (A::class.java).kDeclarationContainer.getMemberByName("v") as KMutableProperty1 } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt index f3ff05f..8138f0e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt @@ -9,7 +9,7 @@ class Result { } fun box(): String { - val p = (Result::class.java).kotlinClass.getMemberByName("value") as KProperty1 + val p = (Result::class.java).kDeclarationContainer.getMemberByName("value") as KProperty1 p.isAccessible = false // should have no effect on the accessibility of a public reflection object return p.get(Result()) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt index 506d105..7fa0f49 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt @@ -13,11 +13,11 @@ class A { fun box(): String { val a = A() - val aq = (A::class.java).kotlinClass.members.single { it.name == "q" } as KMutableProperty1>> + val aq = (A::class.java).kDeclarationContainer.members.single { it.name == "q" } as KMutableProperty1>> aq.set(a, arrayOf(arrayOf(A.B("array")))) if (a.q!![0][0].result != "array") return "Fail array" - val ap = (A::class.java).kotlinClass.members.single { it.name == "p" } as KMutableProperty1 + val ap = (A::class.java).kDeclarationContainer.members.single { it.name == "p" } as KMutableProperty1 ap.set(a, A.B("OK")) return a.p!!.result } diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt index c9779ae..736ffdf 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt @@ -14,7 +14,7 @@ class A(param: String) { } fun box(): String { - val props = (A::class.java).kotlinClass.members.filterIsInstance>() + val props = (A::class.java).kDeclarationContainer.members.filterIsInstance>() val names = props.map { it.name }.sorted() assert(names == listOf("anyVar", "extensionToList", "int", "string")) { "Fail names: $props" } diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 74c0ebb..2d17077 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -6,7 +6,7 @@ import kotlinx.reflect.lite.impl.* @Deprecated( message = "Better use the Class.kotlinClass: KDeclarationContainer extension", replaceWith = ReplaceWith("(this.kotlinClass as KClass)", imports = arrayOf("kotlinx.reflect.lite.*, kotlinx.reflect.lite.impl.*"))) -internal fun Class.toLiteKClass() = kotlinClass as KClass +internal fun Class.toLiteKClass() = kotlin internal fun KDeclarationContainer.getMemberByName(name: String) = members.single { it.name == name } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt index 4f058a6..e07c5a4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt @@ -10,7 +10,7 @@ object Host { } fun box(): String { - val concat = (Host::class.java).kotlinClass.getMemberByName("concat") as KFunction + val concat = (Host::class.java).kDeclarationContainer.getMemberByName("concat") as KFunction val concatParams = concat.parameters return concat.callBy(mapOf( concatParams[0] to Host, diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt index 997ffda..a8a465e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt @@ -16,7 +16,7 @@ fun box(): String { // suspend { // x = f() // }.startCoroutine(EmptyContinuation) - val clazz = Class.forName("tests.lambdaClasses.reflectOnLambdaInSuspend.ReflectOnLambdaInSuspendKt").kotlinClass + val clazz = Class.forName("tests.lambdaClasses.reflectOnLambdaInSuspend.ReflectOnLambdaInSuspendKt").kDeclarationContainer val f = clazz.getMemberByName("f") as KFunction<(String) -> Unit> suspend { f.callSuspend() diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt index b4bf7e3..aaae3b3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt @@ -19,17 +19,17 @@ interface MyCloneable : Cloneable fun KClass<*>.functions() = members.filterIsInstance>().map { it.javaMethod!!.name }.sorted() fun box(): String { - assertEquals(listOf("equals", "hashCode", "toString"), (A::class.java.kotlinClass as KClass<*>).functions()) - assertEquals(listOf("equals", "hashCode", "toString"), (I::class.java.kotlinClass as KClass<*>).functions()) - assertEquals(listOf("equals", "hashCode", "toString"), (C::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (A::class.java.kotlin).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (I::class.java.kotlin).functions()) + assertEquals(listOf("equals", "hashCode", "toString"), (C::class.java.kotlin).functions()) // Now we can get only declared functions: equals(), hashCode(), toString() assertEquals( listOf("equals", "equals", "hashCode", "hashCode", "toString", "toString"), - (MyCustomMembers::class.java.kotlinClass as KClass<*>).functions() + (MyCustomMembers::class.java.kotlin).functions() ) - assertEquals(listOf("clone", "equals", "hashCode", "toString"), (MyCloneable::class.java.kotlinClass as KClass<*>).functions()) + assertEquals(listOf("clone", "equals", "hashCode", "toString"), (MyCloneable::class.java.kotlin).functions()) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt index 6912d6b..f4d03b5 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt @@ -2,14 +2,13 @@ package tests.properties.getPropertiesMutableVsReadonly import kotlinx.reflect.lite.impl.* import kotlin.reflect.* -import kotlin.reflect.full.* class A(val readonly: String) { var mutable: String = "before" } fun box(): String { - val props = (A::class.java).kotlinClass.members + val props = (A::class.java).kDeclarationContainer.members val readonly = props.single { it.name == "readonly" } as KProperty1 assert(readonly !is KMutableProperty1) { "Fail 1: $readonly" } val mutable = props.single { it.name == "mutable" } as KMutableProperty1 From eacc252e22e233e8bb31b44a74a816b42d5a0171 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Wed, 10 Aug 2022 18:04:06 +0200 Subject: [PATCH 54/74] Use `Class.kotlin` and `Class.kotlinPackage` API in tests --- .../lite/testData/call/equalsHashCodeToString.kt | 12 ++++++------ .../reflect/lite/testData/call/exceptionHappened.kt | 2 +- .../kotlinx/reflect/lite/testData/call/jvmStatic.kt | 4 ++-- .../reflect/lite/testData/call/localClassMember.kt | 4 ++-- ...ropertyGetterAndGetFunctionDifferentReturnType.kt | 2 +- .../reflect/lite/testData/call/protectedMembers.kt | 2 +- .../lite/testData/call/simpleTopLevelFunctions.kt | 2 +- .../lite/testData/callBy/boundExtensionFunctionWA.kt | 2 +- .../callBy/boundExtensionPropertyAcessorWA.kt | 2 +- .../lite/testData/callBy/boundJvmStaticInObjectWA.kt | 2 +- .../reflect/lite/testData/callBy/companionObject.kt | 2 +- .../callBy/defaultAndNonDefaultIntertwined.kt | 2 +- .../callBy/defaultInSuperClassFakeOverride.kt | 2 +- .../lite/testData/callBy/extensionFunction.kt | 2 +- .../lite/testData/callBy/jvmStaticInObject.kt | 2 +- .../callBy/manyArgumentsNoneDefaultFunction.kt | 2 +- .../testData/callBy/manyArgumentsOnlyOneDefault.kt | 2 +- .../reflect/lite/testData/callBy/nullValue.kt | 2 +- ...inaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt | 2 +- .../lite/testData/callBy/primitiveDefaultValues.kt | 2 +- .../lite/testData/callBy/simpleMemberFunciton.kt | 2 +- .../lite/testData/callBy/simpleTopLevelFunction.kt | 2 +- .../reflect/lite/testData/classes/nestedClasses.kt | 2 +- .../reflect/lite/testData/classes/qualifiedName.kt | 12 ++++++------ .../reflect/lite/testData/mapping/constructor.kt | 2 +- .../parameters/instanceParameterOfFakeOverride.kt | 4 ++-- .../lite/testData/parameters/isMarkedNullable.kt | 4 ++-- .../reflect/lite/testData/parameters/isOptional.kt | 4 ++-- .../reflect/lite/testData/parameters/kinds.kt | 2 +- .../testData/parameters/objectMemberReferences.kt | 2 +- .../lite/testData/parameters/propertySetter.kt | 2 +- .../reflect/lite/testData/parameters/references.kt | 6 +++--- .../accessors/extensionPropertyAccessors.kt | 2 +- .../accessors/topLevelPropertyAccessors.kt | 2 +- .../callPrivatePropertyFromGetProperties.kt | 2 +- .../properties/isAccessible/privateClassVal.kt | 2 +- .../isAccessible/privateToThisAccessors.kt | 2 +- .../properties/isAccessible/protectedClassVar.kt | 2 +- .../isAccessible/publicClassValAccessible.kt | 2 +- .../properties/propertyOfNestedClassAndArrayType.kt | 4 ++-- .../lite/testData/properties/simpleGetProperties.kt | 2 +- .../unusedTestData/callBy/boundJvmStaticInObject.kt | 2 +- .../properties/getPropertiesMutableVsReadonly.kt | 2 +- 43 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt index e9769b3..0ffb2e5 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -28,19 +28,19 @@ fun box(): String { assert(dHashCode.call(D("foo")) == D::hashCode.call(D("foo"))) assert(dToString.call(D("foo")) == "D(s=foo)") - val intEquals = ((Int::class.java).kDeclarationContainer as KClass).getMemberByName("equals") as KFunction - val intHashCode = ((Int::class.java).kDeclarationContainer as KClass).getMemberByName("hashCode") as KFunction - val intToString = ((Int::class.java).kDeclarationContainer as KClass).getMemberByName("toString") as KFunction + val intEquals = (Int::class.java).kotlin.getMemberByName("equals") as KFunction + val intHashCode = (Int::class.java).kotlin.getMemberByName("hashCode") as KFunction + val intToString = (Int::class.java).kotlin.getMemberByName("toString") as KFunction assert(intEquals.call(-1, -1)) assert(intHashCode.call(0) != Int::hashCode.call(1)) assert(intToString.call(42) == "42") val stringEquals = - ((String::class.java).kDeclarationContainer as KClass).getMemberByName("equals") as KFunction + (String::class.java).kotlin.getMemberByName("equals") as KFunction val stringHashcode = - ((String::class.java).kDeclarationContainer as KClass).getMemberByName("hashCode") as KFunction + (String::class.java).kotlin.getMemberByName("hashCode") as KFunction val stringToString = - ((String::class.java).kDeclarationContainer as KClass).getMemberByName("toString") as KFunction + (String::class.java).kotlin.getMemberByName("toString") as KFunction assert(stringEquals.call("beer", "beer")) stringHashcode.call("beer") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt index 87624cf..2657a16 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -9,7 +9,7 @@ fun fail(message: String) { } fun box(): String { - val clazz = Class.forName("tests.call.exceptionHappened.ExceptionHappenedKt").kDeclarationContainer + val clazz = Class.forName("tests.call.exceptionHappened.ExceptionHappenedKt").kotlinPackage val fail = clazz.getMemberByName("fail") try { fail.call("OK") diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt index 06533c1..79e7d42 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt @@ -17,9 +17,9 @@ class C { } fun box(): String { - val foo = ((Obj::class.java).kDeclarationContainer as KClass).getMemberByName("foo") + val foo = (Obj::class.java).kotlin.getMemberByName("foo") foo.call(Obj) - val bar = (C.Companion::class.java.kDeclarationContainer as KClass).getMemberByName("bar") + val bar = C.Companion::class.java.kotlin.getMemberByName("bar") bar.call(C.Companion) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt index 22552b9..2715991 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt @@ -9,7 +9,7 @@ fun box(): String { fun result(s: String) = s } - val localCons = ((Local::class.java).kDeclarationContainer as KClass).getPrimaryConstructor() - val result = ((Local::class.java).kDeclarationContainer as KClass).getMemberByName("result") as KFunction + val localCons = (Local::class.java).kotlin.getPrimaryConstructor() + val result = (Local::class.java).kotlin.getMemberByName("result") as KFunction return result.call(localCons.call(), "OK") } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt index 63ee606..8bb8442 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt @@ -9,7 +9,7 @@ data class Foo(val id: String) { } fun box(): String { - val id = (Foo::class.java.kDeclarationContainer as KClass).getMemberByName("id") as KProperty1 + val id = Foo::class.java.kotlin.getMemberByName("id") as KProperty1 // TODO: `id.call(Foo("abs"))` fails with the error: "object is not an instance of declaring class", expected the same as `id.invoke(Foo("abc))` // id.call(Foo("abc")) id.invoke(Foo("dfdc")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index bbc6075..55ed634 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -17,7 +17,7 @@ abstract class Base { class Derived : Base() fun member(name: String): KCallable<*> = - ((Derived::class.java).kDeclarationContainer as KClass).members.single { it.name == name } + (Derived::class.java).kotlin.members.single { it.name == name } .apply { isAccessible = true } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt index 7064b03..476313d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt @@ -12,7 +12,7 @@ fun bar(result: String) { } fun box(): String { - val clazz = Class.forName("tests.call.simpleTopLevelFunctions.SimpleTopLevelFunctionsKt").kDeclarationContainer + val clazz = Class.forName("tests.call.simpleTopLevelFunctions.SimpleTopLevelFunctionsKt").kotlinPackage val foo = clazz.getMemberByName("foo") val f = foo.call("abc") if (f != 3) return "Fail: $f" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt index 4cf931d..451f1e2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt @@ -13,7 +13,7 @@ import kotlinx.reflect.lite.tests.* fun String.extFun(k: String, s: String = "") = this + k + s fun box(): String { - val sExtFun = Class.forName("tests.callBy.boundExtensionFunctionWA.BoundExtensionFunctionWAKt").kDeclarationContainer. + val sExtFun = Class.forName("tests.callBy.boundExtensionFunctionWA.BoundExtensionFunctionWAKt").kotlinPackage. getMemberByName("extFun") as KFunction return sExtFun.callBy(mapOf( sExtFun.parameters[0] to "O", diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt index bba8a2e..1fae61d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt @@ -16,7 +16,7 @@ val String.plusK: String get() = this + "K" fun box(): String { - val plusK = Class.forName("tests.callBy.boundExtensionPropertyAcessorWA.BoundExtensionPropertyAcessorWAKt").kDeclarationContainer. + val plusK = Class.forName("tests.callBy.boundExtensionPropertyAcessorWA.BoundExtensionPropertyAcessorWAKt").kotlinPackage. getMemberByName("plusK") as KProperty1 return plusK.getter.callBy(mapOf( plusK.parameters[0] to "O" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt index a209370..b95344d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt @@ -12,7 +12,7 @@ object Host { } fun box(): String { - val concat = (Host::class.java).kDeclarationContainer.getMemberByName("concat") as KFunction + val concat = (Host::class.java).kotlin.getMemberByName("concat") as KFunction val concatParams = concat.parameters return concat.callBy(mapOf( concatParams[0] to Host, diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt index 55ffcd0..033c831 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt @@ -10,7 +10,7 @@ class C { } fun box(): String { - val f = (C.Companion::class.java).kDeclarationContainer.members.single { it.name == "foo" } + val f = (C.Companion::class.java).kotlin.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt index 0e1ab04..9c1aa8e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt @@ -9,7 +9,7 @@ fun foo(a: String, b: String = "b", c: String, d: String = "d", e: String) = a + b + c + d + e fun box(): String { - val foo = Class.forName("tests.callBy.defaultAndNonDefaultIntertwined.DefaultAndNonDefaultIntertwinedKt").kDeclarationContainer + val foo = Class.forName("tests.callBy.defaultAndNonDefaultIntertwined.DefaultAndNonDefaultIntertwinedKt").kotlinPackage .getMemberByName("foo") as KFunction val p = foo.parameters assertEquals("abcde", foo.callBy(mapOf( diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt index 469cfb2..5e96ae2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt @@ -13,7 +13,7 @@ open class A { class B : A() fun box(): String { - val f = (B::class.java).kDeclarationContainer.getMemberByName("foo") + val f = (B::class.java).kotlin.getMemberByName("foo") assertEquals("ba", f.callBy(mapOf( f.parameters.first() to B(), diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt index 0c003cb..4842ef7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt @@ -7,7 +7,7 @@ import kotlin.test.assertEquals fun String.sum(other: String = "b") = this + other fun box(): String { - val f = Class.forName("tests.callBy.extensionFunction.ExtensionFunctionKt").kDeclarationContainer.getMemberByName("sum") + val f = Class.forName("tests.callBy.extensionFunction.ExtensionFunctionKt").kotlinPackage.getMemberByName("sum") assertEquals("ab", f.callBy(mapOf(f.parameters.first() to "a"))) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt index badf395..3c12b98 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt @@ -9,7 +9,7 @@ object Obj { } fun box(): String { - val f = (Obj::class.java).kDeclarationContainer.members.single { it.name == "foo" } + val f = (Obj::class.java).kotlin.members.single { it.name == "foo" } // Any object method currently requires the object instance passed try { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt index 1050044..f98773e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt @@ -88,7 +88,7 @@ class A { } fun box(): String { - val f = (A::class.java).kDeclarationContainer.members.single { it.name == "foo" } + val f = (A::class.java).kotlin.members.single { it.name == "foo" } val parameters = f.parameters f.callBy(mapOf( diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt index d24e96b..098cfd7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt @@ -88,7 +88,7 @@ class A { } fun box(): String { - val f = (A::class.java).kDeclarationContainer.members.single { it.name == "foo" } + val f = (A::class.java).kotlin.members.single { it.name == "foo" } val parameters = f.parameters f.callBy(mapOf( diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt index 461a861..869274b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt @@ -9,7 +9,7 @@ fun foo(x: String? = "Fail") { } fun box(): String { - val foo = Class.forName("tests.callBy.nullValue.NullValueKt").kDeclarationContainer.getMemberByName("foo") + val foo = Class.forName("tests.callBy.nullValue.NullValueKt").kotlinPackage.getMemberByName("foo") foo.callBy(mapOf(foo.parameters.single() to null)) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt index 57d7bcf..26dbf52 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt @@ -17,7 +17,7 @@ fun foo(result: String = "foo") { } fun box(): String { - val clazz = Class.forName("tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.OrdinaryMethodIsInvokedWhenNoDefaultValuesAreUsedKt").kDeclarationContainer + val clazz = Class.forName("tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.OrdinaryMethodIsInvokedWhenNoDefaultValuesAreUsedKt").kotlinPackage val foo = clazz.getMemberByName("foo") foo.callBy(mapOf(foo.parameters.single() to "box")) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt index 7063dba..0059348 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt @@ -25,7 +25,7 @@ fun primitives( } fun box(): String { - val clazz = Class.forName("tests.callBy.primitiveDefaultValues.PrimitiveDefaultValuesKt").kDeclarationContainer + val clazz = Class.forName("tests.callBy.primitiveDefaultValues.PrimitiveDefaultValuesKt").kotlinPackage val primitives = clazz.getMemberByName("primitives") primitives.callBy(mapOf()) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt index 655872d..f6d3686 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt @@ -12,6 +12,6 @@ class A { } fun box(): String { - val foo = (A::class.java).kDeclarationContainer.getMemberByName("foo") as KFunction + val foo = (A::class.java).kotlin.getMemberByName("foo") as KFunction return foo.callBy(mapOf(foo.parameters[0] to A(), foo.parameters[1] to 42)) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt index d215837..fcf2d7e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt @@ -7,7 +7,7 @@ import kotlinx.reflect.lite.tests.* fun foo(result: String = "OK") = result fun box(): String { - val clazz = Class.forName("tests.callBy.simpleTopLevelFunction.SimpleTopLevelFunctionKt").kDeclarationContainer + val clazz = Class.forName("tests.callBy.simpleTopLevelFunction.SimpleTopLevelFunctionKt").kotlinPackage val foo = clazz.getMemberByName("foo") as KFunction return foo.callBy(mapOf()) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt index 78833e7..c093ad6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt @@ -15,7 +15,7 @@ fun nestedNames(c: KClass<*>) = c.nestedClasses.map { it.simpleName ?: throw Ass fun box(): String { // Kotlin class without nested classes - assertEquals(emptyList(), nestedNames((A.Inner::class.java.kDeclarationContainer as KClass))) + assertEquals(emptyList(), nestedNames(A.Inner::class.java.kotlin)) // Kotlin class with nested classes assertEquals(listOf("Companion", "Inner", "Nested", "PrivateNested"), nestedNames((A::class.java.kotlin))) diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt index f11a4b8..715d1ba 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -12,28 +12,28 @@ class Klass { } fun box(): String { - assertEquals("tests.classes.qualifiedName.Klass", (Klass::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("tests.classes.qualifiedName.Klass", Klass::class.java.kotlin.qualifiedName) assertEquals( "tests.classes.qualifiedName.Klass.Nested", - (Klass.Nested::class.java.kDeclarationContainer as KClass).qualifiedName + Klass.Nested::class.java.kotlin.qualifiedName ) assertEquals( "tests.classes.qualifiedName.Klass.Nested\$With\$Dollars", - (Klass.`Nested$With$Dollars`::class.java.kDeclarationContainer as KClass).qualifiedName + Klass.`Nested$With$Dollars`::class.java.kotlin.qualifiedName ) assertEquals( "tests.classes.qualifiedName.Klass.Companion", - (Klass.Companion::class.java.kDeclarationContainer as KClass).qualifiedName + Klass.Companion::class.java.kotlin.qualifiedName ) // TODO ClassDescriptors for java classes are not supported //assertEquals("java.util.Date", java.util.Date::class.java.toLiteKClass().qualifiedName) //assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().qualifiedName) class Local - assertEquals(null, (Local::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals(null, Local::class.java.kotlin.qualifiedName) val o = object {} - assertEquals(null, (o.javaClass.kDeclarationContainer as KClass).qualifiedName) + assertEquals(null, o.javaClass.kotlin.qualifiedName) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt index 1edc463..3875183 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt @@ -27,7 +27,7 @@ fun box(): String { check((K::class.java.kotlin).constructors.first()) check(((K::class.java.kotlin).nestedClasses.first() as KClass).constructors.first()) check(((K::class.java.kotlin).nestedClasses.first() as KClass).constructors.first()) - check((Secondary::class.java.kDeclarationContainer as KClass).constructors.first()) + check((Secondary::class.java.kotlin).constructors.first()) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt index 4fa75cc..f5b2a50 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt @@ -14,11 +14,11 @@ open class A { class B : A() fun box(): String { - val bProperty = (B::class.java).kDeclarationContainer.getMemberByName("property") + val bProperty = (B::class.java).kotlin.getMemberByName("property") assertEquals(KParameter.Kind.INSTANCE, bProperty.parameters[0].kind) assertEquals(B::class.java, bProperty.parameters[0].type.javaType) - val bFunction = (B::class.java).kDeclarationContainer.getMemberByName("function") + val bFunction = (B::class.java).kotlin.getMemberByName("function") assertEquals(KParameter.Kind.INSTANCE, bFunction.parameters[0].kind) assertEquals(B::class.java, bFunction.parameters[0].type.javaType) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt index 98d4776..090411f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt @@ -12,10 +12,10 @@ class A { fun Any?.ext() {} fun box(): String { - val ps = (A::class.java).kDeclarationContainer.getMemberByName("foo").parameters.map { it.type.isMarkedNullable } + val ps = (A::class.java).kotlin.getMemberByName("foo").parameters.map { it.type.isMarkedNullable } assertEquals(listOf(false, false, true, false, false, true), ps) - val ext = Class.forName("tests.parameters.isMarkedNullable.IsMarkedNullableKt").kDeclarationContainer.getMemberByName("ext") + val ext = Class.forName("tests.parameters.isMarkedNullable.IsMarkedNullableKt").kotlinPackage.getMemberByName("ext") assertTrue(ext.parameters.single().type.isMarkedNullable) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt index 12b7a52..4c31d35 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt @@ -20,9 +20,9 @@ class C : A() fun Int.extFun() {} fun box(): String { - assertEquals(listOf(false, false, true), (A::class.java).kDeclarationContainer.getMemberByName("foo").parameters.map { it.isOptional }) + assertEquals(listOf(false, false, true), (A::class.java).kotlin.getMemberByName("foo").parameters.map { it.isOptional }) - assertFalse(Class.forName("tests.parameters.isOptional.IsOptionalKt").kDeclarationContainer.getMemberByName("extFun").parameters.single().isOptional) + assertFalse(Class.forName("tests.parameters.isOptional.IsOptionalKt").kotlinPackage.getMemberByName("extFun").parameters.single().isOptional) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt index 209ec52..e750136 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt @@ -12,7 +12,7 @@ class A { } fun box(): String { - val foo = A::class.java.kDeclarationContainer.getMemberByName("foo") + val foo = A::class.java.kotlin.getMemberByName("foo") val inner = (A::class.java.kotlin).nestedClasses.single { it.simpleName == "Inner" } assertEquals(listOf(KParameter.Kind.INSTANCE, KParameter.Kind.EXTENSION_RECEIVER, KParameter.Kind.VALUE), foo.parameters.map { it.kind }) assertEquals(listOf(KParameter.Kind.INSTANCE, KParameter.Kind.VALUE), inner.constructors.first().parameters.map { it.kind }) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt index c594d98..b05f185 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt @@ -9,7 +9,7 @@ object Host { } fun box(): String { - val fooParams = (Host::class.java).kDeclarationContainer.getMemberByName("foo").parameters + val fooParams = (Host::class.java).kotlin.getMemberByName("foo").parameters assertEquals(3, fooParams.size) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt index e841770..755b24c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt @@ -20,7 +20,7 @@ fun checkPropertySetterParam(property: KMutableProperty0<*>, name: String?) { } fun box(): String { - val clazz = Class.forName("tests.parameters.propertySetter.PropertySetterKt").kDeclarationContainer + val clazz = Class.forName("tests.parameters.propertySetter.PropertySetterKt").kotlinPackage checkPropertySetterParam(clazz.getMemberByName("default") as KMutableProperty0, null) checkPropertySetterParam(clazz.getMemberByName("defaultAnnotated") as KMutableProperty0, null) checkPropertySetterParam(clazz.getMemberByName("custom") as KMutableProperty0, "myName") diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt index 0b07e8f..76ef425 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt @@ -18,9 +18,9 @@ fun KParameter.check(name: String?, kind: KParameter.Kind) { } fun box(): String { - val cFoo = (C::class.java).kDeclarationContainer.getMemberByName("foo") - val cBar = (C::class.java).kDeclarationContainer.getMemberByName("bar") as KMutableProperty1 - val cExtFun = Class.forName("tests.parameters.references.ReferencesKt").kDeclarationContainer.getMemberByName("extFun") + val cFoo = (C::class.java).kotlin.getMemberByName("foo") + val cBar = (C::class.java).kotlin.getMemberByName("bar") as KMutableProperty1 + val cExtFun = Class.forName("tests.parameters.references.ReferencesKt").kotlinPackage.getMemberByName("extFun") assertEquals(1, cFoo.parameters.size) assertEquals(1, cBar.getter.parameters.size) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index 03b7e16..0c6deeb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -12,7 +12,7 @@ var String.prop: String set(value) { state = this + value } fun box(): String { - val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").kDeclarationContainer + val clazz = Class.forName("tests.properties.accessors.extensionPropertyAccessors.ExtensionPropertyAccessorsKt").kotlinPackage val prop = clazz.getMemberByName("prop") as KMutableProperty1 assertEquals("3", prop.getter.invoke("abc")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index 170d2cb..beb8ef0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -8,7 +8,7 @@ import kotlin.test.assertEquals var state: String = "" fun box(): String { - val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").kDeclarationContainer + val clazz = Class.forName("tests.properties.accessors.topLevelPropertyAccessors.TopLevelPropertyAccessorsKt").kotlinPackage val state = clazz.getMemberByName("state") as KMutableProperty0 assertEquals("", state.getter.invoke()) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt index 21fa45c..672e6e0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt @@ -8,7 +8,7 @@ import kotlin.test.* class K(private val value: String) fun box(): String { - val p = (K::class.java).kDeclarationContainer.getMemberByName("value") as KProperty1 + val p = (K::class.java).kotlin.getMemberByName("value") as KProperty1 try { return p.get(K("Fail: private property should not be accessible by default")) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt index 9915e28..92d8539 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt @@ -8,7 +8,7 @@ import kotlin.test.* class Result { private val value = "OK" - fun ref() = (Result::class.java).kDeclarationContainer.getMemberByName("value") as KProperty1 + fun ref() = (Result::class.java).kotlin.getMemberByName("value") as KProperty1 } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt index 184cc3b..5f403af 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt @@ -10,7 +10,7 @@ class K { set(value) {} fun run(): String { - val p = (K::class.java).kDeclarationContainer.getMemberByName("t") as KMutableProperty1, String> + val p = (K::class.java).kotlin.getMemberByName("t") as KMutableProperty1, String> p.isAccessible = true p.set(this as K, "") return p.get(this) as String diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt index b581e6b..75fa55a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt @@ -8,7 +8,7 @@ import kotlin.test.* class A(param: String) { protected var v: String = param - fun ref() = (A::class.java).kDeclarationContainer.getMemberByName("v") as KMutableProperty1 + fun ref() = (A::class.java).kotlin.getMemberByName("v") as KMutableProperty1 } fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt index 8138f0e..904b330 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt @@ -9,7 +9,7 @@ class Result { } fun box(): String { - val p = (Result::class.java).kDeclarationContainer.getMemberByName("value") as KProperty1 + val p = (Result::class.java).kotlin.getMemberByName("value") as KProperty1 p.isAccessible = false // should have no effect on the accessibility of a public reflection object return p.get(Result()) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt index 7fa0f49..334d172 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt @@ -13,11 +13,11 @@ class A { fun box(): String { val a = A() - val aq = (A::class.java).kDeclarationContainer.members.single { it.name == "q" } as KMutableProperty1>> + val aq = (A::class.java).kotlin.members.single { it.name == "q" } as KMutableProperty1>> aq.set(a, arrayOf(arrayOf(A.B("array")))) if (a.q!![0][0].result != "array") return "Fail array" - val ap = (A::class.java).kDeclarationContainer.members.single { it.name == "p" } as KMutableProperty1 + val ap = (A::class.java).kotlin.members.single { it.name == "p" } as KMutableProperty1 ap.set(a, A.B("OK")) return a.p!!.result } diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt index 736ffdf..c9278a7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt @@ -14,7 +14,7 @@ class A(param: String) { } fun box(): String { - val props = (A::class.java).kDeclarationContainer.members.filterIsInstance>() + val props = (A::class.java).kotlin.members.filterIsInstance>() val names = props.map { it.name }.sorted() assert(names == listOf("anyVar", "extensionToList", "int", "string")) { "Fail names: $props" } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt index e07c5a4..f00d81b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt @@ -10,7 +10,7 @@ object Host { } fun box(): String { - val concat = (Host::class.java).kDeclarationContainer.getMemberByName("concat") as KFunction + val concat = (Host::class.java).kotlin.getMemberByName("concat") as KFunction val concatParams = concat.parameters return concat.callBy(mapOf( concatParams[0] to Host, diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt index f4d03b5..786a243 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt @@ -8,7 +8,7 @@ class A(val readonly: String) { } fun box(): String { - val props = (A::class.java).kDeclarationContainer.members + val props = (A::class.java).kotlin.members val readonly = props.single { it.name == "readonly" } as KProperty1 assert(readonly !is KMutableProperty1) { "Fail 1: $readonly" } val mutable = props.single { it.name == "mutable" } as KMutableProperty1 From da0fd7a94ccd3482c5567a7645a4be8540a9d509 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Thu, 11 Aug 2022 17:36:08 +0200 Subject: [PATCH 55/74] Added tests for KCallable<*>.callSuspend --- .../lite/testData/callSuspend/bigArity.kt | 32 ++++++++ .../lite/testData/callSuspend/callSuspend.kt | 71 ++++++++++++++++++ .../callSuspend/primitiveSuspendFunctions.kt | 74 +++++++++++++++++++ .../reflect/lite/tests/CallSuspendTest.kt | 14 ++++ 4 files changed, 191 insertions(+) create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt create mode 100644 src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt create mode 100644 src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt new file mode 100644 index 0000000..4428ff0 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt @@ -0,0 +1,32 @@ +package tests.callSuspend.bigArity + +import helpers.* +import kotlinx.reflect.lite.impl.* +import kotlin.coroutines.* + + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(EmptyContinuation) +} + +class A { + suspend fun foo( + p00: Long = 0, p01: A = A(), p02: A = A(), p03: A = A(), p04: A = A(), p05: A = A(), p06: A = A(), p07: A = A(), p08: A = A(), p09: A = A(), + p10: A = A(), p11: A = A(), p12: A = A(), p13: A = A(), p14: A = A(), p15: A = A(), p16: A = A(), p17: A = A(), p18: A = A(), p19: A = A(), + p20: A = A(), p21: A = A(), p22: A = A(), p23: A = A(), p24: A = A(), p25: A = A(), p26: A = A(), p27: A = A(), p28: A = A(), p29: String + ): String { + return p29 + p00 + } +} + +fun box(): String { + val a = A() + var res = "FAIL 1" + builder { + res = (A::class.java).kotlin.members.single { it.name == "foo" }.callSuspend(a, 1L, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, "OK") as String + } + if (res != "OK1") return res + return "OK" +} + + diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt new file mode 100644 index 0000000..e84fce2 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt @@ -0,0 +1,71 @@ +package tests.callSuspend.callSuspend + +// WITH_COROUTINES +// WITH_REFLECT +// TARGET_BACKEND: JVM + +import helpers.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.tests.* +import kotlin.coroutines.* +import kotlin.coroutines.intrinsics.* + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(EmptyContinuation) +} + +class A { + suspend fun noArgs() = "OK" + + suspend fun twoArgs(a: String, b: String) = "$a$b" +} + +suspend fun twoArgs(a: String, b: String) = "$a$b" + +fun ordinary() = "OK" + +var log = "" + +var proceed = {} + +suspend fun suspendHere() = suspendCoroutineUninterceptedOrReturn { cont -> + proceed = { + cont.resumeWith(Result.success(Unit)) + } + COROUTINE_SUSPENDED +} + +suspend fun suspending() { + log += "before;" + suspendHere() + log += "after;" +} + +fun box(): String { + var res: String? = "" + builder { + res = (A::class.java).kotlin.members.find { it.name == "noArgs" }?.callSuspend(A()) as String? + } + if (res != "OK") return res ?: "FAIL 1" + builder { + res = (A::class.java).kotlin.members.find { it.name == "twoArgs" }?.callSuspend(A(), "O", "K") as String? + } + if (res != "OK") return res ?: "FAIL 2" + builder { + res = Class.forName("tests.callSuspend.callSuspend.CallSuspendKt").kotlinPackage.getMemberByName("twoArgs").callSuspend("O", "K") as String? + } + if (res != "OK") return res ?: "FAIL 3" + builder { + res = Class.forName("tests.callSuspend.callSuspend.CallSuspendKt").kotlinPackage.getMemberByName("ordinary").callSuspend() as String? + } + builder { + Class.forName("tests.callSuspend.callSuspend.CallSuspendKt").kotlinPackage.getMemberByName("suspending").callSuspend() + } + log += "suspended;" + proceed() + if (log != "before;suspended;after;") return log + return res ?: "FAIL 4" +} + + diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt new file mode 100644 index 0000000..5b55597 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt @@ -0,0 +1,74 @@ +package tests.callSuspend.primitiveSuspendFunctions + +import kotlin.coroutines.startCoroutine +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import helpers.* +import kotlinx.reflect.lite.impl.* + +inline class Z(val value: Int) + +class C { + private var value: Z = Z(0) + + suspend fun nonNullConsume(z: Z) { value = z } + suspend fun nonNullProduce(): Z = value + suspend fun nullableConsume(z: Z?) { value = z!! } + suspend fun nullableProduce(): Z? = value + suspend fun nonNull_nonNullConsumeAndProduce(z: Z): Z = z + suspend fun nonNull_nullableConsumeAndProduce(z: Z): Z? = z + suspend fun nullable_nonNullConsumeAndProduce(z: Z?): Z = z!! + suspend fun nullable_nullableConsumeAndProduce(z: Z?): Z? = z +} + +private fun run0(f: suspend () -> Int): Int { + var result = -1 + f.startCoroutine(handleResultContinuation { result = it }) + return result +} + +fun box(): String { + val c = C() + + assertFailsWith("Remove assertFailsWith and try again, as this problem may have been fixed.") { + run0 { + val nonNullConsume = (C::class.java).kotlin.members.single { it.name == "nonNullConsume" } + val nonNullProduce = (C::class.java).kotlin.members.single { it.name == "nonNullProduce" } + nonNullConsume.callSuspend(c, Z(1)) + (nonNullProduce.callSuspend(c) as Z).value + }.let { assertEquals(1, it) } + } + + run0 { + val nullableConsume = (C::class.java).kotlin.members.single { it.name == "nullableConsume" } + nullableConsume.callSuspend(c, Z(2)) + val nullableProduce = (C::class.java).kotlin.members.single { it.name == "nullableProduce" } + (nullableProduce.callSuspend(c)!! as Z).value + }.let { assertEquals(2, it) } + + assertFailsWith("Remove assertFailsWith and try again, as this problem may have been fixed.") { + run0 { + val nonNull_nonNullConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nonNull_nonNullConsumeAndProduce" } + (nonNull_nonNullConsumeAndProduce.callSuspend(c, Z(3)) as Z).value + }.let { assertEquals(3, it) } + } + + run0 { + val nonNull_nullableConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nonNull_nullableConsumeAndProduce" } + (nonNull_nullableConsumeAndProduce.callSuspend(c, Z(4))!! as Z).value + }.let { assertEquals(4, it) } + + assertFailsWith("Remove assertFailsWith and try again, as this problem may have been fixed.") { + run0 { + val nullable_nonNullConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nullable_nonNullConsumeAndProduce" } + (nullable_nonNullConsumeAndProduce.callSuspend(c, Z(5)) as Z).value + }.let { assertEquals(5, it) } + } + + run0 { + val nullable_nullableConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nullable_nullableConsumeAndProduce" } + (nullable_nullableConsumeAndProduce.callSuspend(c, Z(6))!! as Z).value + }.let { assertEquals(6, it) } + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt b/src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt new file mode 100644 index 0000000..ab0c7da --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt @@ -0,0 +1,14 @@ +package kotlinx.reflect.lite.tests + +import org.junit.* + +class CallSuspendTest { + @Test + fun testCallSuspend() = test("callSuspend.callSuspend") { tests.callSuspend.callSuspend.box() } + + @Test + fun testCallSuspendBigArity() = test("callSuspend.bigArity") { tests.callSuspend.bigArity.box() } + + @Test + fun testPrimitiveSuspendFunctions() = test("callSuspend.primitiveSuspendFunctions") { tests.callSuspend.primitiveSuspendFunctions.box() } +} From 46025153f34248f19f673082e07f81635a753b68 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Fri, 12 Aug 2022 14:00:01 +0200 Subject: [PATCH 56/74] Fix `toKotlinType()` for the case of star type projection --- .../java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt | 7 +++++++ .../kotlinx/reflect/lite/descriptors/impl/KotlinType.kt | 6 ++++-- src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt | 4 ++-- src/main/java/kotlinx/reflect/lite/impl/KClasses.kt | 1 + 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt index 6b237e4..3160d70 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt @@ -1,6 +1,8 @@ // Partially copied from: https://github.com/JetBrains/kotlin/blob/b573532d8cbf9bf5347adb40d0774c21c2d35dc0/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt package kotlinx.reflect.lite.builtins +import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.name.* internal object StandardNames { @@ -44,3 +46,8 @@ internal object StandardNames { val any = ClassId(BUILT_INS_PACKAGE_FQ_NAME, "Any") } } + +internal object KotlinBuiltInsImpl { + val anyType: KotlinType = KotlinType((Any::class.java.kDeclarationContainer as KClassImpl<*>).descriptor, emptyList(), false) + val anyNType: KotlinType = KotlinType((Any::class.java.kDeclarationContainer as KClassImpl<*>).descriptor, emptyList(), true) +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 5717d62..e29c6ec 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -2,6 +2,8 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.reflect.lite.KVariance +import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.builtins.KotlinBuiltInsImpl import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.Annotated import kotlinx.reflect.lite.descriptors.ClassDescriptor @@ -18,7 +20,6 @@ internal class KotlinType( ) : Annotated internal fun KotlinType.isNullableType(): Boolean = - // TODO: check if this is correct isMarkedNullable || (descriptor is TypeParameterDescriptor && descriptor.upperBounds.any { it.isNullableType() }) internal class TypeParameterTable( @@ -50,7 +51,8 @@ internal fun KmType.toKotlinType(module: ModuleDescriptor, typeParameterTable: T classifier, generateSequence(this, KmType::outerType).flatMap(KmType::arguments).map { (variance, type) -> TypeProjection( - type?.toKotlinType(module, typeParameterTable) ?: TODO("Any type"), + // if the projected type is null, then this is a star projection, use anyType + type?.toKotlinType(module, typeParameterTable) ?: KotlinBuiltInsImpl.anyType, variance == null, variance?.toVariance() ?: KVariance.OUT ) diff --git a/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt index b9cce01..59bb60f 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt @@ -8,14 +8,14 @@ import kotlinx.reflect.lite.* * Returns a [KClass] instance corresponding to the given Java [Class] instance. */ val Class.kotlin: KClass - @JvmName("getKotlinClass") + @JvmName("getLiteKClass") get() = ReflectionLiteImpl.createKotlinClass(this) /** * Returns a [KPackage] instance corresponding to the given Java [Class] instance. */ val Class.kotlinPackage: KPackage - @JvmName("getKotlinClass") + @JvmName("getLiteKPackage") get() = ReflectionLiteImpl.createKotlinPackage(this) diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt b/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt index 947f85b..c58832c 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt @@ -13,3 +13,4 @@ import kotlinx.reflect.lite.descriptors.* @SinceKotlin("1.1") val KClass.primaryConstructor: KFunction? get() = constructors.firstOrNull { ((it as KFunctionImpl).descriptor as ConstructorDescriptor).isPrimary } + From 88d3b03872a86a8d13bbd83da1b09eb1a80444ac Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 22 Aug 2022 02:34:45 +0200 Subject: [PATCH 57/74] Add descriptors for Java classes --- .../descriptors/impl/ClassDescriptorImpl.kt | 277 +++++++++++++----- .../lite/descriptors/impl/KotlinType.kt | 2 +- .../descriptors/impl/ModuleDescriptorImpl.kt | 9 +- .../reflect/lite/impl/ReflectionLiteImpl.kt | 48 +-- .../reflect/lite/misc/RuntimeTypeMapper.kt | 18 +- 5 files changed, 252 insertions(+), 102 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index 23db52a..624627e 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -4,86 +4,23 @@ import kotlinx.metadata.* import kotlinx.metadata.internal.common.* import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.builtins.* +import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.ClassDescriptor -import kotlinx.reflect.lite.descriptors.ConstructorDescriptor -import kotlinx.reflect.lite.descriptors.FunctionDescriptor -import kotlinx.reflect.lite.descriptors.MemberScope -import kotlinx.reflect.lite.descriptors.PropertyDescriptor -import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* +import java.lang.reflect.* -internal class ClassDescriptorImpl internal constructor( - override val jClass: Class -) : ClassDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { +internal interface AbstractClassDescriptor : ClassDescriptor { - override val module = ModuleDescriptorImpl(jClass.safeClassLoader) - - override val kmClass: KmClass - get() { - val className = jClass.name - val builtinClassId = when (className) { - "[Ljava.lang.Object;" -> ClassId(FqName("kotlin"), "Array") - "[Z" -> ClassId(FqName("kotlin"), "BooleanArray") - "[B" -> ClassId(FqName("kotlin"), "ByteArray") - "[C" -> ClassId(FqName("kotlin"), "CharArray") - "[D" -> ClassId(FqName("kotlin"), "DoubleArray") - "[F" -> ClassId(FqName("kotlin"), "FloatArray") - "[I" -> ClassId(FqName("kotlin"), "IntArray") - "[J" -> ClassId(FqName("kotlin"), "LongArray") - "[S" -> ClassId(FqName("kotlin"), "ShortArray") - "java.lang.Void" -> ClassId(FqName("kotlin"), "Nothing") // TODO: ??? - else -> when { - jClass.isPrimitive -> { - when (jClass) { - Boolean::class.java -> ClassId(FqName("kotlin"), "Boolean") - Byte::class.java -> ClassId(FqName("kotlin"), "Byte") - Char::class.java -> ClassId(FqName("kotlin"), "Char") - Double::class.java -> ClassId(FqName("kotlin"), "Double") - Float::class.java -> ClassId(FqName("kotlin"), "Float") - Int::class.java -> ClassId(FqName("kotlin"), "Int") - Long::class.java -> ClassId(FqName("kotlin"), "Long") - Short::class.java -> ClassId(FqName("kotlin"), "Short") - else -> error(jClass) - } - } - else -> JavaToKotlinClassMap.mapJavaToKotlin(jClass.classId.asSingleFqName()) - } - } - if (builtinClassId != null) { - val packageName = builtinClassId.packageFqName - // kotlin.collections -> kotlin/collections/collections.kotlin_builtins - val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" - val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() - ?: error("No builtins metadata file found: $resourcePath") - val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() - ?: error("Incompatible metadata version: $resourcePath") - return packageFragment.classes.find { it.name == builtinClassId.asClassName() } - ?: error("Built-in class not found: $builtinClassId in $resourcePath") - } else { - val header = jClass.getAnnotation(Metadata::class.java)?.let { - KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) - } ?: error("@Metadata annotation was not found for ${jClass.name} ") - return when (val metadata = KotlinClassMetadata.read(header)) { - is KotlinClassMetadata.Class -> metadata.toKmClass() - else -> error("Can not create ClassDescriptor for metadata of type $metadata") - } - } - } - - override val classId: ClassId = RuntimeTypeMapper.mapJvmClassToKotlinClassId(jClass) - - override val name: Name - get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') + override val classId: ClassId + get() = RuntimeTypeMapper.mapJvmClassToKotlinClassId(jClass) override val simpleName: String? get() { if (jClass.isAnonymousClass) return null - val classId = jClass.classId + val classId = classId return when { classId.isLocal -> calculateLocalClassName(jClass) else -> classId.shortClassName @@ -94,7 +31,7 @@ internal class ClassDescriptorImpl internal constructor( get() { if (jClass.isAnonymousClass) return null - val classId = jClass.classId + val classId = classId return when { classId.isLocal -> null else -> classId.asSingleFqName().asString() @@ -111,15 +48,48 @@ internal class ClassDescriptorImpl internal constructor( } return name.substringAfter('$') } +} + +internal class ClassDescriptorImpl internal constructor( + override val jClass: Class +) : AbstractClassDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { + + private val kmClass: KmClass + get() { + val builtinClassId = RuntimeTypeMapper.getKotlinBuiltInClassId(jClass) + if (builtinClassId != null) { + val packageName = builtinClassId.packageFqName + // kotlin.collections -> kotlin/collections/collections.kotlin_builtins + val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" + val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() + ?: error("No builtins metadata file found: $resourcePath") + val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() + ?: error("Incompatible metadata version: $resourcePath") + packageFragment.classes.find { it.name == builtinClassId.asClassName() }?.let { return it } + } + val header = jClass.getAnnotation(Metadata::class.java)?.let { + KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) + } ?: error("@Metadata annotation was not found for ${jClass.name} ") + return when (val metadata = KotlinClassMetadata.read(header)) { + is KotlinClassMetadata.Class -> metadata.toKmClass() + else -> error("Can not create ClassDescriptor for metadata of type $metadata") + } + } + + override val module + get() = ModuleDescriptorImpl(jClass.safeClassLoader) + + override val name: Name + get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') override val constructors: List get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this, this) } override val nestedClasses: List> - get() = kmClass.nestedClasses.map { module.findClass(classId.createNestedClassId(it).asClassName()) } + get() = kmClass.nestedClasses.mapNotNull { module.findClass(classId.createNestedClassId(it).asClassName()) } override val sealedSubclasses: List> - get() = kmClass.sealedSubclasses.map { module.findClass(it) } + get() = kmClass.sealedSubclasses.mapNotNull { module.findClass(it) } override val properties: List get() = kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) } @@ -152,6 +122,9 @@ internal class ClassDescriptorImpl internal constructor( override val containingClass: ClassDescriptor<*>? get() = classId.getOuterClassId()?.let { module.findClass(it.asClassName()) } + override val thisAsReceiverParameter: ReceiverParameterDescriptor = + ReceiverParameterDescriptorImpl(defaultType) + override val typeParameters: List get() = typeParameterTable.typeParameters @@ -181,3 +154,163 @@ internal class ClassDescriptorImpl internal constructor( override val isValue: Boolean get() = Flag.Class.IS_VALUE(kmClass.flags) } + +internal class JavaClassDescriptor internal constructor( + override val jClass: Class +): AbstractClassDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { + + override val module: ModuleDescriptor + get() = ModuleDescriptorImpl(jClass.safeClassLoader) + + override val name: Name + get() = jClass.simpleName + + override val constructors: List + get() = TODO("kdcmd") + override val nestedClasses: List> + get() = TODO("Not yet implemented") + override val sealedSubclasses: List> + get() = TODO("Not yet implemented") + override val properties: List + get() = TODO("Not yet implemented") + override val functions: List + get() = TODO("Not yet implemented") + + + override val memberScope: MemberScope + get() = MemberScope( + emptyList(), // TODO: Java fields + jClass.declaredMethods.map { JavaFunctionDescriptor(it, module, this) }.let { realFunctions -> + realFunctions // todo: add fake overrides + } + ) + + override val containingClass: ClassDescriptor<*>? + get() = TODO("Not yet implemented") + + override val thisAsReceiverParameter: ReceiverParameterDescriptor = + ReceiverParameterDescriptorImpl(defaultType) + + override val typeParameterTable: TypeParameterTable + get() = TODO("Not yet implemented") + override val typeParameters: List + get() = TODO("Not yet implemented") + override val supertypes: List + get() = TODO("Not yet implemented") + override val visibility: KVisibility? + get() = TODO("Not yet implemented") + override val isInterface: Boolean + get() = TODO("Not yet implemented") + override val isObject: Boolean + get() = TODO("Not yet implemented") + override val isCompanion: Boolean + get() = TODO("Not yet implemented") + override val isFinal: Boolean + get() = TODO("Not yet implemented") + override val isOpen: Boolean + get() = TODO("Not yet implemented") + override val isAbstract: Boolean + get() = TODO("Not yet implemented") + override val isSealed: Boolean + get() = TODO("Not yet implemented") + override val isData: Boolean + get() = TODO("Not yet implemented") + override val isInner: Boolean + get() = TODO("Not yet implemented") + override val isFun: Boolean + get() = TODO("Not yet implemented") + override val isValue: Boolean + get() = TODO("Not yet implemented") + override val staticScope: MemberScope + get() = TODO("Not yet implemented") +} + +internal class JavaFunctionDescriptor( + val method: Method, + override val module: ModuleDescriptor, + override val containingClass: JavaClassDescriptor<*> +): FunctionDescriptor { + override val name: Name + get() = TODO("Not yet implemented") + override val container: ClassBasedDeclarationContainerDescriptor + get() = TODO("Not yet implemented") + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = TODO("Not yet implemented") + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = TODO("Not yet implemented") + override val valueParameters: List + get() = TODO("Not yet implemented") + override val typeParameters: List + get() = TODO("Not yet implemented") + override val returnType: KotlinType + get() = method.genericReturnType.javaToKotlinType(module) + override val visibility: KVisibility? + get() = TODO("Not yet implemented") + override val isFinal: Boolean + get() = TODO("Not yet implemented") + override val isOpen: Boolean + get() = TODO("Not yet implemented") + override val isAbstract: Boolean + get() = TODO("Not yet implemented") + override val isReal: Boolean + get() = TODO("Not yet implemented") + override val caller: Caller<*> + get() = TODO("Not yet implemented") + override val defaultCaller: Caller<*>? + get() = TODO("Not yet implemented") + override val isInline: Boolean + get() = TODO("Not yet implemented") + override val isExternal: Boolean + get() = TODO("Not yet implemented") + override val isOperator: Boolean + get() = TODO("Not yet implemented") + override val isInfix: Boolean + get() = TODO("Not yet implemented") + override val isSuspend: Boolean + get() = TODO("Not yet implemented") + override val isAnnotationConstructor: Boolean + get() = TODO("Not yet implemented") + override val signature: JvmMethodSignature? + get() = TODO("Not yet implemented") + override val member: Member? + get() = TODO("Not yet implemented") + override val defaultMember: Member? + get() = TODO("Not yet implemented") +} + +internal class JavaTypeParameterDescriptor( + private val typeVariable: TypeVariable<*>, + private val module: ModuleDescriptor, + override val containingDeclaration: DeclarationDescriptor, +) : TypeParameterDescriptor { + override val name: Name + get() = typeVariable.name + + override val upperBounds: List + get() = typeVariable.bounds.map { it.javaToKotlinType(module) } + + override val variance: KVariance + get() = KVariance.INVARIANT + override val isReified: Boolean + get() = false + +// override fun equals(other: Any?): Boolean = +// other is TypeParameterDescriptor && name == other.name && containingDeclaration == other.containingDeclaration +// +// override fun hashCode(): Int = +// name.hashCode() * 31 + containingDeclaration.hashCode() +} + +private fun Type.javaToKotlinType(module: ModuleDescriptor): KotlinType { + return when (this) { + is Class<*> -> KotlinType( + module.findClass(className) ?: TODO(className), + emptyList(), + false + ) + else -> TODO("Unsupported Java type: $this (${this::class.java})") + } +} + +private val Class<*>.className: ClassName + get() = name.replace('.', '/').replace('$', '.') diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index e29c6ec..2f397f2 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -42,7 +42,7 @@ internal class TypeProjection( internal fun KmType.toKotlinType(module: ModuleDescriptor, typeParameterTable: TypeParameterTable): KotlinType { val classifier = classifier.let { classifier -> when (classifier) { - is KmClassifier.Class -> module.findClass(classifier.name) + is KmClassifier.Class -> module.findClass(classifier.name) ?: error ("Could not find class $classifier") is KmClassifier.TypeParameter -> typeParameterTable.get(classifier.id) is KmClassifier.TypeAlias -> TODO("Support KmClassifier.TypeAlias") } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index 177ba56..eddf232 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -6,13 +6,14 @@ import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.builtins.* import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor +import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : ModuleDescriptor { - override fun findClass (name: ClassName): ClassDescriptor { + override fun findClass (name: ClassName): ClassDescriptor? { val fqName = (JavaToKotlinClassMap.mapKotlinToJava(FqName(name.replace('/', '.'))) ?: ClassId(name)).asJavaLookupFqName() - val jClass = when (fqName) { + val jClass = when (fqName) { // todo why arrays are hardcoded "kotlin.BooleanArray" -> BooleanArray::class.java "kotlin.ByteArray" -> ByteArray::class.java "kotlin.CharArray" -> CharArray::class.java @@ -22,8 +23,8 @@ internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : Mod "kotlin.LongArray" -> LongArray::class.java "kotlin.ShortArray" -> ShortArray::class.java "kotlin.Array" -> Array::class.java - else -> classLoader.tryLoadClass(fqName) ?: error("Failed to load the class: $fqName") + else -> classLoader.tryLoadClass(fqName) } - return ClassDescriptorImpl(jClass as Class) + return (jClass?.kotlin as KClassImpl?)?.descriptor } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index b3aff72..6a9ddff 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -18,37 +18,51 @@ package kotlinx.reflect.lite.impl import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.descriptors.PackageDescriptor import kotlinx.reflect.lite.descriptors.impl.* -import kotlinx.reflect.lite.impl.ReflectionLiteImpl.getMetadataAnnotation +import kotlinx.reflect.lite.misc.* internal object ReflectionLiteImpl { fun loadClassMetadata(jClass: Class): KDeclarationContainer { - return when (jClass.getMetadataAnnotation()?.kind) { - // if metadata == null, jClass may be builtin -> try to create KClass - null, 1 -> KClassImpl(ClassDescriptorImpl(jClass)) + return when (val kind = jClass.getMetadataAnnotation()?.kind) { + null, 1 -> KClassImpl(createClassDescriptor(jClass, kind)) 2 -> KPackageImpl(PackageDescriptorImpl(jClass)) else -> throw KotlinReflectionInternalError("Can not load class metadata for $jClass") } } fun createKotlinClass(jClass: Class): KClass { - val metadata = jClass.getMetadataAnnotation() - if (metadata == null || metadata.kind == KotlinClassHeader.CLASS_KIND) { - return KClassImpl(ClassDescriptorImpl(jClass)) - } else { - throw KotlinReflectionInternalError("Could not create an instance of KClass from $jClass, the class file kind equals ${metadata.kind}") - } + val kind = jClass.getMetadataAnnotation()?.kind + return KClassImpl(createClassDescriptor(jClass, kind)) } fun createKotlinPackage(jClass: Class): KPackage { - val metadata = jClass.getMetadataAnnotation() - // we can extract KmPackage only from these kinds of kotlin class files: FILE_FACADE_KIND, MULTI_FILE_CLASS_PART_KIND - if (metadata.kind == KotlinClassHeader.FILE_FACADE_KIND || metadata.kind == KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND) { - return KPackageImpl(PackageDescriptorImpl(jClass)) - } else { - throw KotlinReflectionInternalError("Could not create an instance of KPackage from $jClass, the class file kind equals ${metadata.kind}") - } + val kind = jClass.getMetadataAnnotation()?.kind + return KPackageImpl(createPackageDescriptor(jClass, kind)) } + private fun createClassDescriptor(jClass: Class, kind: Int?): ClassDescriptor = + when (kind) { + null -> { + if (RuntimeTypeMapper.getKotlinBuiltInClassId(jClass) != null) { + ClassDescriptorImpl(jClass) + } else { + JavaClassDescriptor(jClass) + } + } + KotlinClassHeader.CLASS_KIND -> { + ClassDescriptorImpl(jClass) + } + else -> throw KotlinReflectionInternalError("Could not create an instance of KClass from $this, the class file kind equals $kind") + } + + private fun createPackageDescriptor(jClass: Class, kind: Int?): PackageDescriptor = + when (kind) { + // we can extract KmPackage only from these kinds of kotlin class files: FILE_FACADE_KIND, MULTI_FILE_CLASS_PART_KIND + KotlinClassHeader.FILE_FACADE_KIND, KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND -> PackageDescriptorImpl(jClass) + else -> throw KotlinReflectionInternalError("Could not create an instance of KPackage from $jClass, the class file kind equals $kind") + } + private fun Class.getMetadataAnnotation() = getAnnotation(Metadata::class.java) } diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index 1bd8d94..5f99743 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -41,28 +41,30 @@ internal sealed class JvmPropertySignature { internal object RuntimeTypeMapper { private val JAVA_LANG_VOID = ClassId.topLevel(FqName("java.lang.Void")) - fun mapJvmClassToKotlinClassId(klass: Class<*>): ClassId { - if (klass.isArray) { - klass.componentType.primitiveType?.let { + fun getKotlinBuiltInClassId(jClass: Class<*>): ClassId? { + if (jClass.isArray) { + jClass.componentType.primitiveType?.let { return ClassId(FqName("kotlin"), it.arrayTypeName) } return ClassId.topLevel(StandardNames.FQ_NAMES.array) } - if (klass == Void.TYPE) return JAVA_LANG_VOID + if (jClass == Void.TYPE) return JAVA_LANG_VOID - klass.primitiveType?.let { + jClass.primitiveType?.let { return ClassId(StandardNames.BUILT_INS_PACKAGE_FQ_NAME, it.typeName) } - val classId = klass.classId + val classId = jClass.classId if (!classId.isLocal) { JavaToKotlinClassMap.mapJavaToKotlin(classId.asSingleFqName())?.let { return it } } - - return classId + return null } + fun mapJvmClassToKotlinClassId(jClass: Class<*>): ClassId = + getKotlinBuiltInClassId(jClass)?.let { return it } ?: jClass.classId + private val Class<*>.primitiveType: PrimitiveType? get() = if (isPrimitive) JvmPrimitiveType.get(simpleName).primitiveType else null } From be83ff17c28e88566c441d1c1b4e51cb4c790ab0 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 22 Aug 2022 02:35:27 +0200 Subject: [PATCH 58/74] Add `thisAsReceiverParameter` property to ClassDescriptor --- .../java/kotlinx/reflect/lite/descriptors/descriptors.kt | 6 +++--- .../lite/descriptors/impl/ConstructorDescriptorImpl.kt | 2 +- .../lite/descriptors/impl/FunctionDescriptorImpl.kt | 4 ++-- .../lite/descriptors/impl/PropertyDescriptorImpl.kt | 6 ++---- .../descriptors/impl/ReceiverParameterDescriptorImpl.kt | 7 +++++-- src/main/java/kotlinx/reflect/lite/impl/util.kt | 6 ++---- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 9d31461..ce236bb 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -12,7 +12,7 @@ import kotlinx.reflect.lite.name.* import java.lang.reflect.* internal interface ModuleDescriptor { - fun findClass(name: ClassName): ClassDescriptor<*> + fun findClass(name: ClassName): ClassDescriptor<*>? } internal interface Annotated { @@ -50,7 +50,6 @@ internal interface ClassBasedDeclarationContainerDescriptor { } internal interface ClassDescriptor : ClassBasedDeclarationContainerDescriptor, ClassifierDescriptor { - val kmClass: KmClass val classId: ClassId val simpleName: String? @@ -64,6 +63,7 @@ internal interface ClassDescriptor : ClassBasedDeclarationContainerDescri val memberScope: MemberScope val containingClass: ClassDescriptor<*>? + val thisAsReceiverParameter: ReceiverParameterDescriptor val typeParameterTable: TypeParameterTable val typeParameters: List @@ -136,7 +136,7 @@ internal interface FunctionDescriptor : CallableDescriptor { } internal interface ParameterDescriptor : DeclarationDescriptor { - val containingDeclaration: CallableDescriptor + val containingDeclaration: CallableDescriptor? val type: KotlinType } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index 734cb8a..0830e2a 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -37,7 +37,7 @@ internal class ConstructorDescriptorImpl( get() = emptyList() override val dispatchReceiverParameter: ReceiverParameterDescriptor? - get() = if (containingClass.isInner) ReceiverParameterDescriptorImpl(containingClass.containingClass!!.defaultType, this) else null + get() = if (containingClass.isInner) containingClass.containingClass!!.thisAsReceiverParameter else null override val extensionReceiverParameter: ReceiverParameterDescriptor? get() = null diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index cda4a01..402669f 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -111,11 +111,11 @@ internal class FunctionDescriptorImpl( get() = typeParameterTable.typeParameters override val dispatchReceiverParameter: ReceiverParameterDescriptor? - get() = containingClass?.let { ReceiverParameterDescriptorImpl(it.defaultType, this) } + get() = containingClass?.thisAsReceiverParameter override val extensionReceiverParameter: ReceiverParameterDescriptor? get() = kmFunction.receiverParameterType?.let { - ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) + ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable)) } override val returnType: KotlinType diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 3e72927..7646121 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -46,13 +46,11 @@ internal class PropertyDescriptorImpl( get() = JvmFlag.Property.IS_MOVED_FROM_INTERFACE_COMPANION(kmProperty.jvmFlags) override val dispatchReceiverParameter: ReceiverParameterDescriptor? - get() = containingClass?.let { - ReceiverParameterDescriptorImpl(it.defaultType, this) - } + get() = containingClass?.thisAsReceiverParameter override val extensionReceiverParameter: ReceiverParameterDescriptor? get() = kmProperty.receiverParameterType?.let { - ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable), this) + ReceiverParameterDescriptorImpl(it.toKotlinType(module, typeParameterTable)) } override val signature: JvmFieldSignature? diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt index 4e870b6..4fadf42 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt @@ -3,9 +3,12 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.reflect.lite.descriptors.* internal class ReceiverParameterDescriptorImpl( - override val type: KotlinType, - override val containingDeclaration: CallableDescriptor + override val type: KotlinType ) : ReceiverParameterDescriptor { override val name: String get() = "" + + // TODO: receiver parameter descriptor does not need this information + override val containingDeclaration: CallableDescriptor? + get() = null } diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 3b5fe64..b9afb6a 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -37,9 +37,7 @@ internal fun createKCallable(descriptor: CallableDescriptor): KCallableImpl<*> { } internal val CallableDescriptor.instanceReceiverParameter: ReceiverParameterDescriptor? - get() = - if (dispatchReceiverParameter != null) containingClass?.let { ReceiverParameterDescriptorImpl(it.defaultType, this) } - else null + get() = if (dispatchReceiverParameter != null) containingClass?.thisAsReceiverParameter else null internal fun overrides(derived: D, base: D): Boolean { require(derived.name == base.name) { "Names should be equal: $derived, $base" } @@ -137,7 +135,7 @@ internal abstract class FakeOverrideCallableMemberDescriptor( get() = containingClass override val dispatchReceiverParameter: ReceiverParameterDescriptor? - get() = ReceiverParameterDescriptorImpl(containingClass.defaultType, this) + get() = containingClass.thisAsReceiverParameter override val isFinal: Boolean get() = overridden.any(CallableDescriptor::isFinal) From 3e42d57513111dc2682c4ad970a6cef304f5f9b3 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 22 Aug 2022 02:38:00 +0200 Subject: [PATCH 59/74] Some fixes in tests --- .../callBy/nonDefaultParameterOmitted.kt | 2 +- .../callSuspend/primitiveSuspendFunctions.kt | 36 ++++++-------- .../classes/qualifiedNameOfStandardClasses.kt | 48 +++++++++---------- .../kotlinx/reflect/lite/tests/KClassTest.kt | 5 -- .../constructors/enumEntry.kt | 4 +- 5 files changed, 42 insertions(+), 53 deletions(-) rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/constructors/enumEntry.kt (77%) diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt index b0e1926..34d6feb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt @@ -7,7 +7,7 @@ import kotlin.test.* fun foo(x: Int, y: Int = 2) = x + y fun box(): String { - val foo = Class.forName("tests.callBy.nonDefaultParameterOmitted.NonDefaultParameterOmittedKt").kotlinClass.getMemberByName("foo") + val foo = Class.forName("tests.callBy.nonDefaultParameterOmitted.NonDefaultParameterOmittedKt").kotlinPackage.getMemberByName("foo") try { foo.callBy(mapOf()) return "Fail: IllegalArgumentException must have been thrown" diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt index 5b55597..9718691 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt @@ -6,7 +6,7 @@ import kotlin.test.assertFailsWith import helpers.* import kotlinx.reflect.lite.impl.* -inline class Z(val value: Int) +class Z(val value: Int) class C { private var value: Z = Z(0) @@ -30,14 +30,12 @@ private fun run0(f: suspend () -> Int): Int { fun box(): String { val c = C() - assertFailsWith("Remove assertFailsWith and try again, as this problem may have been fixed.") { - run0 { - val nonNullConsume = (C::class.java).kotlin.members.single { it.name == "nonNullConsume" } - val nonNullProduce = (C::class.java).kotlin.members.single { it.name == "nonNullProduce" } - nonNullConsume.callSuspend(c, Z(1)) - (nonNullProduce.callSuspend(c) as Z).value - }.let { assertEquals(1, it) } - } + run0 { + val nonNullConsume = (C::class.java).kotlin.members.single { it.name == "nonNullConsume" } + val nonNullProduce = (C::class.java).kotlin.members.single { it.name == "nonNullProduce" } + nonNullConsume.callSuspend(c, Z(1)) + (nonNullProduce.callSuspend(c) as Z).value + }.let { assertEquals(1, it) } run0 { val nullableConsume = (C::class.java).kotlin.members.single { it.name == "nullableConsume" } @@ -46,24 +44,20 @@ fun box(): String { (nullableProduce.callSuspend(c)!! as Z).value }.let { assertEquals(2, it) } - assertFailsWith("Remove assertFailsWith and try again, as this problem may have been fixed.") { - run0 { - val nonNull_nonNullConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nonNull_nonNullConsumeAndProduce" } - (nonNull_nonNullConsumeAndProduce.callSuspend(c, Z(3)) as Z).value - }.let { assertEquals(3, it) } - } + run0 { + val nonNull_nonNullConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nonNull_nonNullConsumeAndProduce" } + (nonNull_nonNullConsumeAndProduce.callSuspend(c, Z(3)) as Z).value + }.let { assertEquals(3, it) } run0 { val nonNull_nullableConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nonNull_nullableConsumeAndProduce" } (nonNull_nullableConsumeAndProduce.callSuspend(c, Z(4))!! as Z).value }.let { assertEquals(4, it) } - assertFailsWith("Remove assertFailsWith and try again, as this problem may have been fixed.") { - run0 { - val nullable_nonNullConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nullable_nonNullConsumeAndProduce" } - (nullable_nonNullConsumeAndProduce.callSuspend(c, Z(5)) as Z).value - }.let { assertEquals(5, it) } - } + run0 { + val nullable_nonNullConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nullable_nonNullConsumeAndProduce" } + (nullable_nonNullConsumeAndProduce.callSuspend(c, Z(5)) as Z).value + }.let { assertEquals(5, it) } run0 { val nullable_nullableConsumeAndProduce = (C::class.java).kotlin.members.single { it.name == "nullable_nullableConsumeAndProduce" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt index 8a803fe..4471866 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt @@ -6,60 +6,60 @@ import kotlinx.reflect.lite.* import kotlin.test.assertEquals fun box(): String { - assertEquals("kotlin.Any", (Any::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.String", (String::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.CharSequence", (CharSequence::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.Number", (Number::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.Int", (Int::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.Long", (Long::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.Any", Any::class.java.kotlin.qualifiedName) + assertEquals("kotlin.String", String::class.java.kotlin.qualifiedName) + assertEquals("kotlin.CharSequence", CharSequence::class.java.kotlin.qualifiedName) + assertEquals("kotlin.Number", Number::class.java.kotlin.qualifiedName) + assertEquals("kotlin.Int", Int::class.java.kotlin.qualifiedName) + assertEquals("kotlin.Long", Long::class.java.kotlin.qualifiedName) - assertEquals("kotlin.Array", (Array::class.java.kDeclarationContainer as KClass>).qualifiedName) - assertEquals("kotlin.Array", (Array::class.java.kDeclarationContainer as KClass>).qualifiedName) + assertEquals("kotlin.Array", Array::class.java.kotlin.qualifiedName) + assertEquals("kotlin.Array", Array::class.java.kotlin.qualifiedName) assertEquals( "kotlin.Array", - (Array>::class.java.kDeclarationContainer as KClass>>).qualifiedName + Array>::class.java.kotlin.qualifiedName ) - assertEquals("kotlin.IntArray", (IntArray::class.java.kDeclarationContainer as KClass).qualifiedName) - assertEquals("kotlin.DoubleArray", (DoubleArray::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.IntArray", IntArray::class.java.kotlin.qualifiedName) + assertEquals("kotlin.DoubleArray", DoubleArray::class.java.kotlin.qualifiedName) - assertEquals("kotlin.Int.Companion", (Int.Companion::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.Int.Companion", Int.Companion::class.java.kotlin.qualifiedName) assertEquals( "kotlin.Double.Companion", - (Double.Companion::class.java.kDeclarationContainer as KClass).qualifiedName + Double.Companion::class.java.kotlin.qualifiedName ) assertEquals( "kotlin.Char.Companion", - (Char.Companion::class.java.kDeclarationContainer as KClass).qualifiedName + Char.Companion::class.java.kotlin.qualifiedName ) - assertEquals("kotlin.ranges.IntRange", (IntRange::class.java.kDeclarationContainer as KClass).qualifiedName) + assertEquals("kotlin.ranges.IntRange", IntRange::class.java.kotlin.qualifiedName) - assertEquals("kotlin.collections.List", (List::class.java.kDeclarationContainer as KClass>).qualifiedName) + assertEquals("kotlin.collections.List", List::class.java.kotlin.qualifiedName) assertEquals( "kotlin.collections.Map.Entry", - (Map.Entry::class.java.kDeclarationContainer as KClass>).qualifiedName + Map.Entry::class.java.kotlin.qualifiedName ) - // TODO: KT-11754 +//// // TODO: KT-11754 assertEquals( "kotlin.collections.List", - (MutableList::class.java.kDeclarationContainer as KClass>).qualifiedName + MutableList::class.java.kotlin.qualifiedName ) assertEquals( "kotlin.collections.Map.Entry", - (MutableMap.MutableEntry::class.java.kDeclarationContainer as KClass>).qualifiedName + MutableMap.MutableEntry::class.java.kotlin.qualifiedName ) - assertEquals("kotlin.Function0", (Function0::class.java.kDeclarationContainer as KClass>).qualifiedName) - assertEquals("kotlin.Function1", (Function1::class.java.kDeclarationContainer as KClass>).qualifiedName) + assertEquals("kotlin.Function0", Function0::class.java.kotlin.qualifiedName) + assertEquals("kotlin.Function1", Function1::class.java.kotlin.qualifiedName) assertEquals( "kotlin.Function5", - (Function5::class.java.kDeclarationContainer as KClass>).qualifiedName + Function5::class.java.kotlin.qualifiedName ) assertEquals( "kotlin.jvm.functions.FunctionN", - (Function42::class.java.kDeclarationContainer as KClass>).qualifiedName + Function42::class.java.kotlin.qualifiedName ) return "OK" diff --git a/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt index 5f9bc2c..b86824b 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt @@ -13,7 +13,6 @@ class KClassTest { @Test fun testQualifiedName() = test("classes.qualifiedName") { tests.classes.qualifiedName.box() } - @Ignore @Test fun testQualifiedNameOfStandardClasses() = test("classes.qualifiedNameOfStandardClasses") { tests.classes.qualifiedNameOfStandardClasses.box() } @@ -32,10 +31,6 @@ class KClassTest { @Test fun testConstructorName() = test("constructors.constructorName") { tests.constructors.constructorName.box() } - @Ignore - @Test - fun testEnumEntry() = test("constructors.enumEntry") { tests.constructors.enumEntry.box() } - @Test fun testSimpleGetConstructors() = test("constructors.simpleGetConstructors") { tests.constructors.simpleGetConstructors.box() } diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt similarity index 77% rename from src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt index b133bc6..b87cda2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/enumEntry.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt @@ -1,4 +1,4 @@ -package tests.constructors.enumEntry +package kotlinx.reflect.lite.unusedTestData.constructors import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* @@ -19,7 +19,7 @@ enum class TestEnum(val id: String? = null) { } fun box(): String { - assertEquals(listOf("fun (kotlin.String?): tests.constructors.enumEntry.TestEnum"), TestEnum.ENUM1::class.java.toLiteKClass().constructors.map { it.toString() }) + assertEquals(listOf("fun (kotlin.String?): tests.constructors.enumEntry.TestEnum"), TestEnum.ENUM1::class.java.kotlin.constructors.map { it.toString() }) assertEquals(listOf(), (TestEnum.ENUM2::class.java.kotlin).constructors.map { it.toString() }) return "OK" From 48f54b1bcf637f6bd2a94238040f481eb3ab57c9 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 22 Aug 2022 02:50:34 +0200 Subject: [PATCH 60/74] Implementation of Java class descriptor should be completed --- .../reflect/lite/descriptors/impl/ClassDescriptorImpl.kt | 2 +- .../kotlinx/reflect/lite/testData/classes/qualifiedName.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index 624627e..db6d70e 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -194,7 +194,7 @@ internal class JavaClassDescriptor internal constructor( override val typeParameterTable: TypeParameterTable get() = TODO("Not yet implemented") override val typeParameters: List - get() = TODO("Not yet implemented") + get() = jClass.typeParameters.map { JavaTypeParameterDescriptor(it, module, this) } override val supertypes: List get() = TODO("Not yet implemented") override val visibility: KVisibility? diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt index 715d1ba..ad8129c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -25,9 +25,9 @@ fun box(): String { "tests.classes.qualifiedName.Klass.Companion", Klass.Companion::class.java.kotlin.qualifiedName ) - // TODO ClassDescriptors for java classes are not supported - //assertEquals("java.util.Date", java.util.Date::class.java.toLiteKClass().qualifiedName) - //assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().qualifiedName) + + assertEquals("java.util.Date", java.util.Date::class.java.kotlin.qualifiedName) + assertEquals("kotlin.jvm.internal.Ref.ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.kotlin.qualifiedName) class Local assertEquals(null, Local::class.java.kotlin.qualifiedName) From d355b95d3d21cf5644d71d7134aa6c1d18fd0637 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 22 Aug 2022 12:05:01 +0200 Subject: [PATCH 61/74] Lazy initialization of ClassDescriptor properties --- .../descriptors/impl/ClassDescriptorImpl.kt | 108 ++++++++++-------- 1 file changed, 60 insertions(+), 48 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index db6d70e..6af26ca 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -54,53 +54,59 @@ internal class ClassDescriptorImpl internal constructor( override val jClass: Class ) : AbstractClassDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { - private val kmClass: KmClass - get() { - val builtinClassId = RuntimeTypeMapper.getKotlinBuiltInClassId(jClass) - if (builtinClassId != null) { - val packageName = builtinClassId.packageFqName - // kotlin.collections -> kotlin/collections/collections.kotlin_builtins - val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" - val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() - ?: error("No builtins metadata file found: $resourcePath") - val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() - ?: error("Incompatible metadata version: $resourcePath") - packageFragment.classes.find { it.name == builtinClassId.asClassName() }?.let { return it } - } - val header = jClass.getAnnotation(Metadata::class.java)?.let { - KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) - } ?: error("@Metadata annotation was not found for ${jClass.name} ") - return when (val metadata = KotlinClassMetadata.read(header)) { - is KotlinClassMetadata.Class -> metadata.toKmClass() - else -> error("Can not create ClassDescriptor for metadata of type $metadata") - } + private val kmClass: KmClass by lazy { + val builtinClassId = RuntimeTypeMapper.getKotlinBuiltInClassId(jClass) + if (builtinClassId != null) { + val packageName = builtinClassId.packageFqName + // kotlin.collections -> kotlin/collections/collections.kotlin_builtins + val resourcePath = packageName.asString().replace('.', '/') + '/' + packageName.shortName() + ".kotlin_builtins" + val bytes = Unit::class.java.classLoader.getResourceAsStream(resourcePath)?.readBytes() + ?: error("No builtins metadata file found: $resourcePath") + val packageFragment = KotlinCommonMetadata.read(bytes)?.toKmModuleFragment() + ?: error("Incompatible metadata version: $resourcePath") + packageFragment.classes.find { it.name == builtinClassId.asClassName() }?.let { return@lazy it } } + val header = jClass.getAnnotation(Metadata::class.java)?.let { + KotlinClassHeader(it.kind, it.metadataVersion, it.data1, it.data2, it.extraString, it.packageName, it.extraInt) + } ?: error("@Metadata annotation was not found for ${jClass.name} ") + return@lazy when (val metadata = KotlinClassMetadata.read(header)) { + is KotlinClassMetadata.Class -> metadata.toKmClass() + else -> error("Can not create ClassDescriptor for metadata of type $metadata") + } + } - override val module - get() = ModuleDescriptorImpl(jClass.safeClassLoader) + override val module by lazy { + ModuleDescriptorImpl(jClass.safeClassLoader) + } - override val name: Name - get() = kmClass.name.substringAfterLast('.').substringAfterLast('/') + override val name: Name by lazy { + kmClass.name.substringAfterLast('.').substringAfterLast('/') + } - override val constructors: List - get() = kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this, this) } + override val constructors: List by lazy { + kmClass.constructors.map { ConstructorDescriptorImpl(it, module, this, this) } + } - override val nestedClasses: List> - get() = kmClass.nestedClasses.mapNotNull { module.findClass(classId.createNestedClassId(it).asClassName()) } + override val nestedClasses: List> by lazy { + kmClass.nestedClasses.mapNotNull { module.findClass(classId.createNestedClassId(it).asClassName()) } + } - override val sealedSubclasses: List> - get() = kmClass.sealedSubclasses.mapNotNull { module.findClass(it) } + override val sealedSubclasses: List> by lazy { + kmClass.sealedSubclasses.mapNotNull { module.findClass(it) } + } - override val properties: List - get() = kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) } + override val properties: List by lazy { + kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) } + } - override val functions: List - get() = kmClass.functions.map { + override val functions: List by lazy { + kmClass.functions.map { FunctionDescriptorImpl(it, module, this, this) } + } - override val memberScope: MemberScope - get() = MemberScope( + override val memberScope: MemberScope by lazy { + MemberScope( kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) }.let { realProperties -> realProperties + addPropertyFakeOverrides(this, realProperties) }, @@ -108,28 +114,34 @@ internal class ClassDescriptorImpl internal constructor( realFunctions + addFunctionFakeOverrides(this, realFunctions) } ) + } // TODO: static scope - override val staticScope: MemberScope - get() = MemberScope(emptyList(), emptyList()) + override val staticScope: MemberScope by lazy { + MemberScope(emptyList(), emptyList()) + } override val visibility: KVisibility? get() = kmClass.flags.toVisibility() - override val typeParameterTable: TypeParameterTable = + override val typeParameterTable: TypeParameterTable by lazy { kmClass.typeParameters.toTypeParameters(this, module, containingClass?.typeParameterTable) - - override val containingClass: ClassDescriptor<*>? - get() = classId.getOuterClassId()?.let { module.findClass(it.asClassName()) } - - override val thisAsReceiverParameter: ReceiverParameterDescriptor = - ReceiverParameterDescriptorImpl(defaultType) + } override val typeParameters: List get() = typeParameterTable.typeParameters - override val supertypes: List - get() = kmClass.supertypes.map { it.toKotlinType(module, typeParameterTable) } + override val supertypes: List by lazy { + kmClass.supertypes.map { it.toKotlinType(module, typeParameterTable) } + } + + override val containingClass: ClassDescriptor<*>? by lazy { + classId.getOuterClassId()?.let { module.findClass(it.asClassName()) } + } + + override val thisAsReceiverParameter: ReceiverParameterDescriptor by lazy { + ReceiverParameterDescriptorImpl(defaultType) + } override val isInterface: Boolean get() = Flag.Class.IS_INTERFACE(kmClass.flags) @@ -281,7 +293,7 @@ internal class JavaFunctionDescriptor( internal class JavaTypeParameterDescriptor( private val typeVariable: TypeVariable<*>, private val module: ModuleDescriptor, - override val containingDeclaration: DeclarationDescriptor, + override val containingDeclaration: DeclarationDescriptor ) : TypeParameterDescriptor { override val name: Name get() = typeVariable.name From 63a3760bcec45e2df0948702fbdd20311c74800b Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 23 Aug 2022 02:03:57 +0200 Subject: [PATCH 62/74] Implementation of Java descriptors --- .../reflect/lite/descriptors/descriptors.kt | 3 +- ...BasedDeclarationContainerDescriptorImpl.kt | 54 +++++++----- .../impl/ConstructorDescriptorImpl.kt | 88 ++++++++++++++++++- .../impl/FunctionDescriptorImpl.kt | 64 ++++++++++++++ .../descriptors/impl/PackageDescriptorImpl.kt | 2 - .../impl/TypeParameterDescriptorImpl.kt | 26 +++++- .../impl/ValueParameterDescriptorImpl.kt | 14 +++ .../kotlinx/reflect/lite/descriptors/util.kt | 16 ++++ 8 files changed, 241 insertions(+), 26 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index ce236bb..0b5fcba 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -58,8 +58,7 @@ internal interface ClassDescriptor : ClassBasedDeclarationContainerDescri val constructors: List val nestedClasses: List> val sealedSubclasses: List> - val properties: List - val functions: List + val memberScope: MemberScope val containingClass: ClassDescriptor<*>? diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt index 64ba64b..8df8ca7 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt @@ -11,32 +11,48 @@ import java.lang.reflect.* internal abstract class ClassBasedDeclarationContainerDescriptorImpl( override val jClass: Class<*> ) : ClassBasedDeclarationContainerDescriptor { - protected open val methodOwner: Class<*> - get() = jClass.wrapperByPrimitive ?: jClass + + protected open val methodOwner: Class<*> by lazy { + jClass.wrapperByPrimitive ?: jClass + } + + override val module by lazy { + ModuleDescriptorImpl(jClass.safeClassLoader) + } abstract val memberScope: MemberScope abstract val staticScope: MemberScope - private val declaredNonStaticMembers: Collection> - get() = getMembers(memberScope, MemberBelonginess.DECLARED) + private val declaredNonStaticMembers: Collection> by lazy { + getMembers(memberScope, MemberBelonginess.DECLARED) + } + + private val declaredStaticMembers: Collection> by lazy { + getMembers(staticScope, MemberBelonginess.DECLARED) + } + + private val inheritedNonStaticMembers: Collection> by lazy { + getMembers(memberScope, MemberBelonginess.INHERITED) + } - private val declaredStaticMembers: Collection> - get() = getMembers(staticScope, MemberBelonginess.DECLARED) + private val inheritedStaticMembers: Collection> by lazy { + getMembers(staticScope, MemberBelonginess.INHERITED) + } - private val inheritedNonStaticMembers: Collection> - get() = getMembers(memberScope, MemberBelonginess.INHERITED) + private val allNonStaticMembers: Collection> by lazy { + declaredNonStaticMembers + inheritedNonStaticMembers - private val inheritedStaticMembers: Collection> - get() = getMembers(staticScope, MemberBelonginess.INHERITED) + } + private val allStaticMembers: Collection> by lazy { + declaredStaticMembers + inheritedStaticMembers - private val allNonStaticMembers: Collection> - by lazy { declaredNonStaticMembers + inheritedNonStaticMembers } - private val allStaticMembers: Collection> - by lazy { declaredStaticMembers + inheritedStaticMembers } - override val declaredMembers: Collection> - by lazy { declaredNonStaticMembers + declaredStaticMembers } - override val allMembers: Collection> - by lazy { allNonStaticMembers + allStaticMembers } + } + override val declaredMembers: Collection> by lazy { + declaredNonStaticMembers + declaredStaticMembers + } + override val allMembers: Collection> by lazy { + allNonStaticMembers + allStaticMembers + } private fun getMembers(scope: MemberScope, belonginess: MemberBelonginess): Collection> = (scope.functions + scope.properties).mapNotNull { descriptor -> @@ -144,8 +160,6 @@ internal abstract class ClassBasedDeclarationContainerDescriptorImpl( addParametersAndMasks(parameterTypes, desc, true) }) - - private fun addParametersAndMasks(result: MutableList>, desc: String, isConstructor: Boolean) { val valueParameters = loadParameterTypes(desc) result.addAll(valueParameters) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index 0830e2a..90f2388 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -2,6 +2,9 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.calls.* +import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* @@ -10,7 +13,7 @@ import java.lang.reflect.* internal class ConstructorDescriptorImpl( private val kmCons: KmConstructor, override val module: ModuleDescriptor, - override val containingClass: ClassDescriptor<*>, + override val containingClass: ClassDescriptor<*>, // todo they are always the same, remove containing class field override val container: ClassBasedDeclarationContainerDescriptor ) : AbstractFunctionDescriptor(), ConstructorDescriptor { override val flags: Flags @@ -65,3 +68,86 @@ internal class ConstructorDescriptorImpl( override fun hashCode(): Int = (container.hashCode() * 31 + name.hashCode()) * 31 + signature.hashCode() } + +internal class JavaConstructorDescriptorImpl( + val cons: Constructor<*>, + override val module: ModuleDescriptor, + override val containingClass: ClassDescriptor<*>, + override val container: ClassBasedDeclarationContainerDescriptor +): ConstructorDescriptor { + override val name: Name + get() = "" + + override val dispatchReceiverParameter: ReceiverParameterDescriptor? by lazy { + if (containingClass.isInner) containingClass.containingClass!!.thisAsReceiverParameter else null + } + + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = null + + override val valueParameters: List by lazy { + cons.genericParameterTypes.withIndex().map { (index, type) -> + JavaValueParameterDescriptorImpl(this, index, type.javaToKotlinType(module)) + } + } + + override val typeParameters: List by lazy { + cons.typeParameters.map { + JavaTypeParameterDescriptorImpl(it, module, this) + } + } + + override val returnType: KotlinType + get() = containingClass.kotlinType + + override val visibility: KVisibility? + get() = TODO("Not yet implemented") + + override val isFinal: Boolean + get() = Modifier.isFinal(cons.modifiers) + + override val isOpen: Boolean + get() = !isFinal && !isAbstract + + override val isAbstract: Boolean + get() = Modifier.isAbstract(cons.modifiers) + + override val isReal: Boolean + get() = true + + override val isInline: Boolean + get() = false + + override val isExternal: Boolean + get() = false + + override val isOperator: Boolean + get() = false + + override val isInfix: Boolean + get() = false + + override val isSuspend: Boolean + get() = false + + override val isAnnotationConstructor: Boolean + get() = containingClass.jClass.isAnnotation + + override val caller: Caller<*> + get() = TODO("Not yet implemented") + + override val defaultCaller: Caller<*>? + get() = TODO("Not yet implemented") + + override val signature: JvmMethodSignature? + get() = TODO("Not yet implemented") + + override val member: Member? + get() = TODO("Not yet implemented") + + override val defaultMember: Member? + get() = TODO("Not yet implemented") + + override val isPrimary: Boolean + get() = TODO("Not yet implemented") +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 402669f..7ce31b9 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -2,6 +2,7 @@ package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* import kotlinx.metadata.jvm.* +import kotlinx.reflect.lite.* import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.impl.KotlinReflectionInternalError @@ -141,3 +142,66 @@ internal class FunctionDescriptorImpl( override fun hashCode(): Int = (container.hashCode() * 31 + name.hashCode()) * 31 + signature.hashCode() } + +internal class JavaFunctionDescriptorImpl( + val method: Method, + override val module: ModuleDescriptor, + override val containingClass: JavaClassDescriptor<*> +): FunctionDescriptor { + override val name: Name + get() = TODO("Not yet implemented") + + override val container: ClassBasedDeclarationContainerDescriptor + get() = TODO("Not yet implemented") + + override val dispatchReceiverParameter: ReceiverParameterDescriptor? + get() = containingClass.thisAsReceiverParameter + + override val extensionReceiverParameter: ReceiverParameterDescriptor? + get() = null + + override val valueParameters: List + get() = method.genericParameterTypes.withIndex().map { (index, type) -> + JavaValueParameterDescriptorImpl(this, index, type.javaToKotlinType(module)) + } + + override val typeParameters: List + get() = method.typeParameters.map { + JavaTypeParameterDescriptorImpl(it, module, this) + } + override val returnType: KotlinType + get() = method.genericReturnType.javaToKotlinType(module) + + override val visibility: KVisibility? + get() = TODO("Not yet implemented") + override val isFinal: Boolean + get() = TODO("Not yet implemented") + override val isOpen: Boolean + get() = TODO("Not yet implemented") + override val isAbstract: Boolean + get() = TODO("Not yet implemented") + override val isReal: Boolean + get() = TODO("Not yet implemented") + override val caller: Caller<*> + get() = TODO("Not yet implemented") + override val defaultCaller: Caller<*>? + get() = TODO("Not yet implemented") + override val isInline: Boolean + get() = TODO("Not yet implemented") + override val isExternal: Boolean + get() = TODO("Not yet implemented") + override val isOperator: Boolean + get() = TODO("Not yet implemented") + override val isInfix: Boolean + get() = TODO("Not yet implemented") + override val isSuspend: Boolean + get() = TODO("Not yet implemented") + override val isAnnotationConstructor: Boolean + get() = TODO("Not yet implemented") + override val signature: JvmMethodSignature? + get() = TODO("Not yet implemented") + override val member: Member? + get() = TODO("Not yet implemented") + override val defaultMember: Member? + get() = TODO("Not yet implemented") +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt index 595febc..baefed2 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt @@ -10,8 +10,6 @@ internal class PackageDescriptorImpl( override val jClass: Class ) : PackageDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { - override val module = ModuleDescriptorImpl(jClass.safeClassLoader) - override val kmPackage: KmPackage get() { val header = jClass.getAnnotation(Metadata::class.java)?.let { diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt index 79ae82d..5b76b22 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt @@ -7,6 +7,7 @@ import kotlinx.reflect.lite.descriptors.DeclarationDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.descriptors.TypeParameterDescriptor import kotlinx.reflect.lite.name.* +import java.lang.reflect.* internal class TypeParameterDescriptorImpl( private val kmTypeParam: KmTypeParameter, @@ -27,4 +28,27 @@ internal class TypeParameterDescriptorImpl( override val variance: KVariance get() = kmTypeParam.variance.toVariance() -} \ No newline at end of file +} + +internal class JavaTypeParameterDescriptorImpl( + private val typeVariable: TypeVariable<*>, + private val module: ModuleDescriptor, + override val containingDeclaration: DeclarationDescriptor +) : TypeParameterDescriptor { + override val name: Name + get() = typeVariable.name + + override val upperBounds: List + get() = typeVariable.bounds.map { it.javaToKotlinType(module) } + + override val variance: KVariance + get() = KVariance.INVARIANT + override val isReified: Boolean + get() = false + + override fun equals(other: Any?): Boolean = + other is TypeParameterDescriptor && name == other.name && containingDeclaration == other.containingDeclaration + + override fun hashCode(): Int = + name.hashCode() * 31 + containingDeclaration.hashCode() +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt index 54d84bb..86f34b7 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt @@ -22,6 +22,20 @@ internal class ValueParameterDescriptorImpl( get() = kmValueParam.varargElementType?.toKotlinType(containingDeclaration.module, containingDeclaration.typeParameterTable) } +internal class JavaValueParameterDescriptorImpl( + override val containingDeclaration: CallableDescriptor, + private val index: Int, + override val type: KotlinType, +) : ValueParameterDescriptor { + override val name: Name + get() = "p$index" + + override val declaresDefaultValue: Boolean + get() = false + override val varargElementType: KotlinType? + get() = null +} + internal class PropertySetterParameterDescriptor( private val kmSetterParam: KmValueParameter?, private val setter: PropertySetterDescriptorImpl, diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt index fdba5a9..871947c 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt @@ -5,6 +5,7 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.descriptors.impl.ClassDescriptorImpl import kotlinx.reflect.lite.impl.* +import java.lang.reflect.* internal fun Flags.toVisibility(): KVisibility? = when { @@ -23,3 +24,18 @@ internal fun KmVariance.toVariance(): KVariance = KmVariance.IN -> KVariance.IN KmVariance.OUT -> KVariance.OUT } + +internal fun Type.javaToKotlinType(module: ModuleDescriptor): KotlinType { + return when (this) { + is Class<*> -> KotlinType( + module.findClass(className) ?: TODO(className), + emptyList(), + false + ) + else -> TODO("Unsupported Java type: $this (${this::class.java})") + } +} + +internal val Class<*>.className: ClassName + get() = name.replace('.', '/').replace('$', '.') + From 0ac47489e890989f5236529f244d2e286c2b26e8 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Mon, 29 Aug 2022 17:33:40 +0200 Subject: [PATCH 63/74] Update KClass tests --- .../reflect/lite/KDeclarationContainer.kt | 7 +- .../descriptors/impl/ClassDescriptorImpl.kt | 212 ++++++------------ .../kotlinx/reflect/lite/impl/KClassImpl.kt | 33 +-- .../lite/testData/call/protectedMembers.kt | 5 - .../lite/testData/classes/classMembers.kt | 9 +- .../lite/testData/classes/classSimpleName.kt | 7 +- .../testData/classes/localClassSimpleName.kt | 12 +- .../lite/testData/classes/nestedClasses.kt | 48 ++-- .../lite/testData/classes/sealedSubclasses.kt | 6 +- .../unusedTestData/classes/companionObject.kt | 48 ++++ .../unusedTestData/classes/createInstance.kt | 73 ++++++ .../classes/javaVoid.kt | 0 .../lite/unusedTestData/classes/jvmName.kt | 26 +++ .../classes/jvmNameOfStandardClasses.kt | 24 ++ .../classes/primitiveKClassEquality.kt | 0 .../classes/starProjectedType.kt | 23 ++ 16 files changed, 320 insertions(+), 213 deletions(-) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classes/javaVoid.kt (100%) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt rename src/test/java/kotlinx/reflect/lite/{testData => unusedTestData}/classes/primitiveKClassEquality.kt (100%) create mode 100644 src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt diff --git a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt index a5c2096..36d5fdf 100644 --- a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt +++ b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt @@ -6,9 +6,8 @@ package kotlinx.reflect.lite */ interface KDeclarationContainer { /** - * All functions and properties accessible in this container. - * TODO: inherited, static and extension members are not supported yet - * NOTE: kotlinx-metadata-jvm can not provide inherited and static members - it's a low level api + * Declared functions and properties accessible in this container, including fake overrides. + * NOTE: does not return inherited and static members for now. */ public val members: Collection> -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index 6af26ca..f0748d6 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -4,7 +4,6 @@ import kotlinx.metadata.* import kotlinx.metadata.internal.common.* import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.calls.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.misc.* @@ -50,7 +49,7 @@ internal interface AbstractClassDescriptor : ClassDescriptor { } } -internal class ClassDescriptorImpl internal constructor( +internal class ClassDescriptorImpl( override val jClass: Class ) : AbstractClassDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { @@ -75,10 +74,6 @@ internal class ClassDescriptorImpl internal constructor( } } - override val module by lazy { - ModuleDescriptorImpl(jClass.safeClassLoader) - } - override val name: Name by lazy { kmClass.name.substringAfterLast('.').substringAfterLast('/') } @@ -95,16 +90,6 @@ internal class ClassDescriptorImpl internal constructor( kmClass.sealedSubclasses.mapNotNull { module.findClass(it) } } - override val properties: List by lazy { - kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) } - } - - override val functions: List by lazy { - kmClass.functions.map { - FunctionDescriptorImpl(it, module, this, this) - } - } - override val memberScope: MemberScope by lazy { MemberScope( kmClass.properties.map { PropertyDescriptorImpl(it, module, this, this) }.let { realProperties -> @@ -121,15 +106,17 @@ internal class ClassDescriptorImpl internal constructor( MemberScope(emptyList(), emptyList()) } - override val visibility: KVisibility? - get() = kmClass.flags.toVisibility() + override val visibility: KVisibility? by lazy { + kmClass.flags.toVisibility() + } override val typeParameterTable: TypeParameterTable by lazy { kmClass.typeParameters.toTypeParameters(this, module, containingClass?.typeParameterTable) } - override val typeParameters: List - get() = typeParameterTable.typeParameters + override val typeParameters: List by lazy { + typeParameterTable.typeParameters + } override val supertypes: List by lazy { kmClass.supertypes.map { it.toKotlinType(module, typeParameterTable) } @@ -167,162 +154,91 @@ internal class ClassDescriptorImpl internal constructor( get() = Flag.Class.IS_VALUE(kmClass.flags) } -internal class JavaClassDescriptor internal constructor( +internal class JavaClassDescriptor( override val jClass: Class ): AbstractClassDescriptor, ClassBasedDeclarationContainerDescriptorImpl(jClass) { - override val module: ModuleDescriptor - get() = ModuleDescriptorImpl(jClass.safeClassLoader) + override val name: Name by lazy { + jClass.simpleName + } - override val name: Name - get() = jClass.simpleName + override val constructors: List by lazy { + jClass.constructors.map { JavaConstructorDescriptorImpl(it, module, this, this) } + } - override val constructors: List - get() = TODO("kdcmd") - override val nestedClasses: List> - get() = TODO("Not yet implemented") - override val sealedSubclasses: List> - get() = TODO("Not yet implemented") - override val properties: List - get() = TODO("Not yet implemented") - override val functions: List - get() = TODO("Not yet implemented") + override val nestedClasses: List> by lazy { + jClass.declaredClasses.mapNotNull { module.findClass(classId.createNestedClassId(it.simpleName).asClassName()) } + } + override val sealedSubclasses: List> + get() = emptyList() - override val memberScope: MemberScope - get() = MemberScope( + override val memberScope: MemberScope by lazy { + MemberScope( emptyList(), // TODO: Java fields - jClass.declaredMethods.map { JavaFunctionDescriptor(it, module, this) }.let { realFunctions -> + jClass.declaredMethods.map { JavaFunctionDescriptorImpl(it, module, this) }.let { realFunctions -> realFunctions // todo: add fake overrides } ) + } - override val containingClass: ClassDescriptor<*>? + override val staticScope: MemberScope get() = TODO("Not yet implemented") - override val thisAsReceiverParameter: ReceiverParameterDescriptor = + override val containingClass: ClassDescriptor<*>? by lazy { + classId.getOuterClassId()?.let { module.findClass(it.asClassName()) as JavaClassDescriptor? } + } + + override val thisAsReceiverParameter: ReceiverParameterDescriptor by lazy { ReceiverParameterDescriptorImpl(defaultType) + } + + override val typeParameterTable: TypeParameterTable by lazy { + emptyList().toTypeParameters(this, module, containingClass?.typeParameterTable) + } + + override val typeParameters: List by lazy { + jClass.typeParameters.map { JavaTypeParameterDescriptorImpl(it, module, this) } + } + + override val supertypes: List by lazy { + (listOfNotNull(jClass.genericSuperclass) + jClass.genericInterfaces).map { it.javaToKotlinType(module) } + } - override val typeParameterTable: TypeParameterTable - get() = TODO("Not yet implemented") - override val typeParameters: List - get() = jClass.typeParameters.map { JavaTypeParameterDescriptor(it, module, this) } - override val supertypes: List - get() = TODO("Not yet implemented") override val visibility: KVisibility? get() = TODO("Not yet implemented") + override val isInterface: Boolean - get() = TODO("Not yet implemented") + get() = jClass.isInterface && !jClass.isAnnotation + override val isObject: Boolean - get() = TODO("Not yet implemented") + get() = false + override val isCompanion: Boolean - get() = TODO("Not yet implemented") - override val isFinal: Boolean - get() = TODO("Not yet implemented") - override val isOpen: Boolean - get() = TODO("Not yet implemented") - override val isAbstract: Boolean - get() = TODO("Not yet implemented") - override val isSealed: Boolean - get() = TODO("Not yet implemented") - override val isData: Boolean - get() = TODO("Not yet implemented") - override val isInner: Boolean - get() = TODO("Not yet implemented") - override val isFun: Boolean - get() = TODO("Not yet implemented") - override val isValue: Boolean - get() = TODO("Not yet implemented") - override val staticScope: MemberScope - get() = TODO("Not yet implemented") -} + get() = false -internal class JavaFunctionDescriptor( - val method: Method, - override val module: ModuleDescriptor, - override val containingClass: JavaClassDescriptor<*> -): FunctionDescriptor { - override val name: Name - get() = TODO("Not yet implemented") - override val container: ClassBasedDeclarationContainerDescriptor - get() = TODO("Not yet implemented") - override val dispatchReceiverParameter: ReceiverParameterDescriptor? - get() = TODO("Not yet implemented") - override val extensionReceiverParameter: ReceiverParameterDescriptor? - get() = TODO("Not yet implemented") - override val valueParameters: List - get() = TODO("Not yet implemented") - override val typeParameters: List - get() = TODO("Not yet implemented") - override val returnType: KotlinType - get() = method.genericReturnType.javaToKotlinType(module) - override val visibility: KVisibility? - get() = TODO("Not yet implemented") override val isFinal: Boolean - get() = TODO("Not yet implemented") - override val isOpen: Boolean - get() = TODO("Not yet implemented") - override val isAbstract: Boolean - get() = TODO("Not yet implemented") - override val isReal: Boolean - get() = TODO("Not yet implemented") - override val caller: Caller<*> - get() = TODO("Not yet implemented") - override val defaultCaller: Caller<*>? - get() = TODO("Not yet implemented") - override val isInline: Boolean - get() = TODO("Not yet implemented") - override val isExternal: Boolean - get() = TODO("Not yet implemented") - override val isOperator: Boolean - get() = TODO("Not yet implemented") - override val isInfix: Boolean - get() = TODO("Not yet implemented") - override val isSuspend: Boolean - get() = TODO("Not yet implemented") - override val isAnnotationConstructor: Boolean - get() = TODO("Not yet implemented") - override val signature: JvmMethodSignature? - get() = TODO("Not yet implemented") - override val member: Member? - get() = TODO("Not yet implemented") - override val defaultMember: Member? - get() = TODO("Not yet implemented") -} + get() = Modifier.isFinal(jClass.modifiers) -internal class JavaTypeParameterDescriptor( - private val typeVariable: TypeVariable<*>, - private val module: ModuleDescriptor, - override val containingDeclaration: DeclarationDescriptor -) : TypeParameterDescriptor { - override val name: Name - get() = typeVariable.name + override val isOpen: Boolean + get() = !isFinal && !isAbstract - override val upperBounds: List - get() = typeVariable.bounds.map { it.javaToKotlinType(module) } + override val isAbstract: Boolean + get() = Modifier.isAbstract(jClass.modifiers) - override val variance: KVariance - get() = KVariance.INVARIANT - override val isReified: Boolean + override val isSealed: Boolean get() = false -// override fun equals(other: Any?): Boolean = -// other is TypeParameterDescriptor && name == other.name && containingDeclaration == other.containingDeclaration -// -// override fun hashCode(): Int = -// name.hashCode() * 31 + containingDeclaration.hashCode() -} + override val isData: Boolean + get() = false -private fun Type.javaToKotlinType(module: ModuleDescriptor): KotlinType { - return when (this) { - is Class<*> -> KotlinType( - module.findClass(className) ?: TODO(className), - emptyList(), - false - ) - else -> TODO("Unsupported Java type: $this (${this::class.java})") + override val isInner: Boolean by lazy { + jClass.declaringClass != null && !Modifier.isStatic(jClass.modifiers) } -} -private val Class<*>.className: ClassName - get() = name.replace('.', '/').replace('$', '.') + override val isFun: Boolean + get() = false + + override val isValue: Boolean + get() = false +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index 8b1e9e6..8de7094 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -13,28 +13,31 @@ internal class KClassImpl( override val qualifiedName: String? get() = descriptor.qualifiedName - override val constructors: Collection> - get() = - if (descriptor.isInterface || descriptor.isObject || descriptor.isCompanion) { - emptyList() - } else { - descriptor.constructors.map { - @Suppress("UNCHECKED_CAST") - KFunctionImpl(it) as KFunction - } + override val constructors: Collection> by lazy { + if (descriptor.isInterface || descriptor.isObject || descriptor.isCompanion) { + emptyList() + } else { + descriptor.constructors.map { + @Suppress("UNCHECKED_CAST") + KFunctionImpl(it) as KFunction } + } + } - override val nestedClasses: Collection> - get() = descriptor.nestedClasses.map(::KClassImpl) + override val nestedClasses: Collection> by lazy { + descriptor.nestedClasses.map(::KClassImpl) + } - override val sealedSubclasses: List> - get() = descriptor.sealedSubclasses.map(::KClassImpl) + override val sealedSubclasses: List> by lazy { + descriptor.sealedSubclasses.map(::KClassImpl) + } override val visibility: KVisibility? get() = descriptor.visibility - override val typeParameters: List - get() = descriptor.typeParameters.map { KTypeParameterImpl(it) } + override val typeParameters: List by lazy { + descriptor.typeParameters.map { KTypeParameterImpl(it) } + } // Logic from: https://github.com/JetBrains/kotlin/blob/bfa3f89aeb727518703f0a167153cb048724a6d1/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt#L124 override val supertypes: List by lazy { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index 55ed634..5dd8e36 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -23,17 +23,12 @@ fun member(name: String): KCallable<*> = fun box(): String { val a = Derived() - // TODO: protectedVal.call(a) throws an exception "object is not an instance of declaring class", the same bu as in `propertyGetterAndGetFunctionDifferentReturnType` test - // protectedVal.invoke() -- ok - //assertEquals("1", (member("protectedVal") as KProperty1).call(a)) assertEquals("1", (member("protectedVal") as KProperty1).invoke(a)) val publicVarProtectedSet = member("publicVarProtectedSet") as KMutableProperty1 publicVarProtectedSet.setter.call(a, "2") assertEquals("2", publicVarProtectedSet.getter.call(a)) assertEquals("2", publicVarProtectedSet.invoke(a)) - // TODO: the same issue as above, publicVarProtectedSet.call(a) throws - // assertEquals("2", publicVarProtectedSet.call(a)) assertEquals("3", member("protectedFun").call(a)) diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt index a3f99c4..fb3a26a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt @@ -2,6 +2,7 @@ package tests.classes.classMembers import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlin.test.* open class Base { @@ -20,12 +21,12 @@ class Derived : Base() { } } -fun Derived.extFun() {} + +fun members(c: KClass<*>) = c.members.map { it.name }.sorted() fun box(): String { - (Derived::class.java.kDeclarationContainer as KClass).members.forEach { - println(it.name) - } + assertEquals(listOf("a", "b", "bar", "equals", "foo", "hashCode", "toString"), members((Derived::class.java).kotlin)) + assertEquals(listOf("equals", "hashCode", "staticFun", "toString"), members((Derived.Companion::class.java).kotlin)) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt index b35ffc7..e06a953 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt @@ -7,9 +7,8 @@ import kotlin.test.assertEquals class Klass fun box(): String { - assertEquals("Klass", (Klass::class.java.kDeclarationContainer as KClass).simpleName) - // TODO ClassDescriptors for java classes are not supported - // assertEquals("Date", java.util.Date::class.java.toLiteKClass().simpleName) - //assertEquals("ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.java.toLiteKClass().simpleName) + assertEquals("Klass", (Klass::class.java).kotlin.simpleName) + assertEquals("Date", (java.util.Date::class.java).kotlin.simpleName) + assertEquals("ObjectRef", (kotlin.jvm.internal.Ref.ObjectRef::class.java).kotlin.simpleName) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt index 36cb661..a1d05d2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt @@ -11,27 +11,27 @@ fun check(klass: KClass<*>, expectedName: String) { fun localInMethod() { fun localInMethod(unused: Any?) { class Local - check((Local::class.java.kDeclarationContainer as KClass), "Local") + check(Local::class.java.kotlin, "Local") class `Local$With$Dollars` - check((`Local$With$Dollars`::class.java.kDeclarationContainer as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") + check(`Local$With$Dollars`::class.java.kotlin, "Local\$With\$Dollars") } localInMethod(null) class Local - check((Local::class.java.kDeclarationContainer as KClass), "Local") + check(Local::class.java.kotlin, "Local") class `Local$With$Dollars` - check((`Local$With$Dollars`::class.java.kDeclarationContainer as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") + check(`Local$With$Dollars`::class.java.kotlin, "Local\$With\$Dollars") } class LocalInConstructor { init { class Local - check((Local::class.java.kDeclarationContainer as KClass), "Local") + check(Local::class.java.kotlin, "Local") class `Local$With$Dollars` - check((`Local$With$Dollars`::class.java.kDeclarationContainer as KClass<`Local$With$Dollars`>), "Local\$With\$Dollars") + check(`Local$With$Dollars`::class.java.kotlin, "Local\$With\$Dollars") } } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt index c093ad6..b80555b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt @@ -21,40 +21,40 @@ fun box(): String { nestedNames((A::class.java.kotlin))) // Java class without nested classes - //assertEquals(emptyList(), nestedNames(Error::class.java.toLiteKClass())) + assertEquals(emptyList(), nestedNames(Error::class.java.kotlin)) // Java interface with nested classes - //assertEquals(listOf("Entry"), nestedNames(java.util.Map::class.java.toLiteKClass())) + assertEquals(listOf("Entry"), nestedNames(java.util.Map::class.java.kotlin)) // Java class with nested classes - //assertEquals(listOf("SimpleEntry", "SimpleImmutableEntry"), nestedNames(java.util.AbstractMap::class.java.toLiteKClass())) + assertEquals(listOf("SimpleEntry", "SimpleImmutableEntry"), nestedNames(java.util.AbstractMap::class.java.kotlin)) // Built-ins -// assertEquals(emptyList(), nestedNames(Array::class.java.toLiteKClass())) -// assertEquals(emptyList(), nestedNames(CharSequence::class.java.toLiteKClass())) -// assertEquals(listOf("Companion"), nestedNames(String::class.java.toLiteKClass())) -// -// assertEquals(emptyList(), nestedNames(Collection::class.java.toLiteKClass())) -// assertEquals(emptyList(), nestedNames(MutableCollection::class.java.toLiteKClass())) -// assertEquals(emptyList(), nestedNames(List::class.java.toLiteKClass())) -// assertEquals(emptyList(), nestedNames(MutableList::class.java.toLiteKClass())) -// assertEquals(listOf("Entry"), nestedNames(Map::class.java.toLiteKClass())) -// assertEquals(emptyList(), nestedNames(Map.Entry::class.java.toLiteKClass())) -// assertEquals(emptyList(), nestedNames(MutableMap.MutableEntry::class.java.toLiteKClass())) + assertEquals(emptyList(), nestedNames(Array::class.java.kotlin)) + assertEquals(emptyList(), nestedNames(CharSequence::class.java.kotlin)) + assertEquals(listOf("Companion"), nestedNames(String::class.java.kotlin)) + + assertEquals(emptyList(), nestedNames(Collection::class.java.kotlin)) + assertEquals(emptyList(), nestedNames(MutableCollection::class.java.kotlin)) + assertEquals(emptyList(), nestedNames(List::class.java.kotlin)) + assertEquals(emptyList(), nestedNames(MutableList::class.java.kotlin)) + assertEquals(listOf("Entry"), nestedNames(Map::class.java.kotlin)) + assertEquals(emptyList(), nestedNames(Map.Entry::class.java.kotlin)) + assertEquals(emptyList(), nestedNames(MutableMap.MutableEntry::class.java.kotlin)) // TODO: should be MutableEntry. Currently we do not distinguish between Map and MutableMap. - //assertEquals(listOf("Entry"), nestedNames(MutableMap::class.java.toLiteKClass())) + assertEquals(listOf("Entry"), nestedNames(MutableMap::class.java.kotlin)) // Primitives -// for (primitive in listOf(Byte::class, Double::class, Float::class, Int::class, Long::class, Short::class, Char::class, Boolean::class)) { -// assertEquals(listOf("Companion"), nestedNames(primitive.java.toLiteKClass())) -// } + for (primitive in listOf(Byte::class, Double::class, Float::class, Int::class, Long::class, Short::class, Char::class, Boolean::class)) { + assertEquals(listOf("Companion"), nestedNames(primitive.java.kotlin)) + } // Primitive arrays -// for (primitiveArray in listOf( -// ByteArray::class, DoubleArray::class, FloatArray::class, IntArray::class, -// LongArray::class, ShortArray::class, CharArray::class, BooleanArray::class -// )) { -// assertEquals(emptyList(), nestedNames(primitiveArray.java.toLiteKClass())) -// } + for (primitiveArray in listOf( + ByteArray::class, DoubleArray::class, FloatArray::class, IntArray::class, + LongArray::class, ShortArray::class, CharArray::class, BooleanArray::class + )) { + assertEquals(emptyList(), nestedNames(primitiveArray.java.kotlin)) + } return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt index 493e923..c2b597e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt @@ -35,9 +35,9 @@ fun box(): String { assertEquals(emptyList(), sealedSubclassNames((SealedClassWithNoSubclasses::class.java.kDeclarationContainer as KClass))) -// assertEquals(emptyList(), sealedSubclassNames(String::class.java.toLiteKClass())) -// assertEquals(emptyList(), sealedSubclassNames(Thread::class.java.toLiteKClass())) -// assertEquals(emptyList(), sealedSubclassNames(FloatArray::class.java.toLiteKClass())) + assertEquals(emptyList(), sealedSubclassNames(String::class.java.kotlin)) + assertEquals(emptyList(), sealedSubclassNames(Thread::class.java.kotlin)) + assertEquals(emptyList(), sealedSubclassNames(FloatArray::class.java.kotlin)) return "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt new file mode 100644 index 0000000..b426d32 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt @@ -0,0 +1,48 @@ +package tests.classes.companionObject + +import kotlin.reflect.full.* +import kotlin.test.* + +class A { + companion object C +} + +enum class E { + ENTRY; + companion object {} +} + +fun box(): String { + val obj = A::class.companionObject + assertNotNull(obj) + assertEquals("C", obj!!.simpleName) + + assertEquals(A.C, A::class.companionObjectInstance) + assertEquals(A.C, obj.objectInstance) + + assertNull(A.C::class.companionObject) + assertNull(A.C::class.companionObjectInstance) + + assertEquals(E.Companion, E::class.companionObjectInstance) + + assertEquals(String, String::class.companionObjectInstance) + assertEquals(String, String.Companion::class.objectInstance) + assertEquals(Enum, Enum::class.companionObjectInstance) + assertEquals(Enum, Enum.Companion::class.objectInstance) + assertEquals(Double, Double::class.companionObjectInstance) + assertEquals(Double, Double.Companion::class.objectInstance) + assertEquals(Float, Float::class.companionObjectInstance) + assertEquals(Float, Float.Companion::class.objectInstance) + assertEquals(Int, Int::class.companionObjectInstance) + assertEquals(Int, Int.Companion::class.objectInstance) + assertEquals(Long, Long::class.companionObjectInstance) + assertEquals(Long, Long.Companion::class.objectInstance) + assertEquals(Short, Short::class.companionObjectInstance) + assertEquals(Short, Short.Companion::class.objectInstance) + assertEquals(Byte, Byte::class.companionObjectInstance) + assertEquals(Byte, Byte.Companion::class.objectInstance) + assertEquals(Char, Char::class.companionObjectInstance) + assertEquals(Char, Char.Companion::class.objectInstance) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt new file mode 100644 index 0000000..b67233a --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt @@ -0,0 +1,73 @@ +package tests.classes.createInstance + +import kotlin.reflect.full.createInstance +import kotlin.test.assertTrue +import kotlin.test.fail + +// Good classes + +class Simple +class PrimaryWithDefaults(val d1: String = "d1", val d2: Int = 2) +class Secondary(val s: String) { + constructor() : this("s") +} +class SecondaryWithDefaults(val s: String) { + constructor(x: Int = 0) : this(x.toString()) +} +class SecondaryWithDefaultsNoPrimary { + constructor(x: Int) {} + constructor(s: String = "") {} +} + +// Bad classes + +class NoNoArgConstructor(val s: String) { + constructor(x: Int) : this(x.toString()) +} +class NoArgAndDefault() { + constructor(x: Int = 0) : this() +} +class DefaultPrimaryAndDefaultSecondary(val s: String = "") { + constructor(x: Int = 0) : this(x.toString()) +} +class SeveralDefaultSecondaries { + constructor(x: Int = 0) {} + constructor(s: String = "") {} + constructor(d: Double = 3.14) {} +} +class PrivateConstructor private constructor() +object Object + +// ----------- + +inline fun test() { + val instance = T::class.createInstance() + assertTrue(instance is T) +} + +inline fun testFail() { + try { + T::class.createInstance() + fail("createInstance should have failed on ${T::class}") + } catch (e: Exception) { + // OK + } +} + +fun box(): String { + test() + test() + test() + test() + test() + test() + + testFail() + testFail() + testFail() + testFail() + testFail() + testFail() + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/javaVoid.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/javaVoid.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classes/javaVoid.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classes/javaVoid.kt diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt new file mode 100644 index 0000000..8c1feb9 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt @@ -0,0 +1,26 @@ +package tests.classes.jvmName + +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.reflect.jvm.jvmName + +class Klass { + class Nested + companion object +} + +fun box(): String { + assertEquals("tests.classes.jvmName.Klass", Klass::class.jvmName) + assertEquals("tests.classes.jvmName.Klass\$Nested", Klass.Nested::class.jvmName) + assertEquals("tests.classes.jvmName.Klass\$Companion", Klass.Companion::class.jvmName) + + class Local + val l = Local::class.jvmName + assertTrue(l != null && l.startsWith("tests.classes.jvmName.JvmNameKt\$") && "\$box\$" in l && l.endsWith("\$Local")) + + val obj = object {} + val o = obj.javaClass.kotlin.jvmName + assertTrue(o != null && o.startsWith("tests.classes.jvmName.JvmNameKt\$") && "\$box\$" in o && o.endsWith("\$1")) + + return "OK" +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt new file mode 100644 index 0000000..555d674 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt @@ -0,0 +1,24 @@ +package tests.classes.jvmNameOfStandardClasses + +import kotlin.test.assertEquals +import kotlin.reflect.jvm.jvmName + +fun box(): String { + assertEquals("java.lang.Object", Any::class.jvmName) + assertEquals("int", Int::class.jvmName) + assertEquals("[I", IntArray::class.jvmName) + assertEquals("java.util.List", List::class.jvmName) + assertEquals("java.util.List", MutableList::class.jvmName) + assertEquals("java.lang.String", String::class.jvmName) + assertEquals("java.lang.String", java.lang.String::class.jvmName) + + assertEquals("[Ljava.lang.Object;", Array::class.jvmName) + assertEquals("[Ljava.lang.Integer;", Array::class.jvmName) + assertEquals("[[Ljava.lang.String;", Array>::class.jvmName) + + assertEquals("java.util.Date", java.util.Date::class.jvmName) + assertEquals("kotlin.jvm.internal.Ref\$ObjectRef", kotlin.jvm.internal.Ref.ObjectRef::class.jvmName) + assertEquals("java.lang.Void", java.lang.Void::class.jvmName) + + return "OK" +} \ No newline at end of file diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/primitiveKClassEquality.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/primitiveKClassEquality.kt similarity index 100% rename from src/test/java/kotlinx/reflect/lite/testData/classes/primitiveKClassEquality.kt rename to src/test/java/kotlinx/reflect/lite/unusedTestData/classes/primitiveKClassEquality.kt diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt new file mode 100644 index 0000000..7435d40 --- /dev/null +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt @@ -0,0 +1,23 @@ +package tests.classes.starProjectedType + +import kotlin.reflect.KTypeProjection +import kotlin.reflect.full.createType +import kotlin.reflect.full.starProjectedType +import kotlin.test.assertEquals + +class Foo + +fun box(): String { + val foo = Foo::class.starProjectedType + assertEquals(Foo::class, foo.classifier) + assertEquals(listOf(KTypeProjection.STAR, KTypeProjection.STAR), foo.arguments) + assertEquals(foo, Foo::class.createType(listOf(KTypeProjection.STAR, KTypeProjection.STAR))) + + assertEquals(String::class, String::class.starProjectedType.classifier) + assertEquals(listOf(), String::class.starProjectedType.arguments) + + val tp = Foo::class.typeParameters.first() + assertEquals(tp.createType(), tp.starProjectedType) + + return "OK" +} \ No newline at end of file From 6cfff5eb7e0ae295b35387041acc5a1692ca860d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 11:32:25 +0200 Subject: [PATCH 64/74] Make private whatever can be private --- src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt | 3 +-- .../lite/descriptors/impl/ConstructorDescriptorImpl.kt | 2 +- .../reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt | 3 ++- src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt | 2 +- src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt | 2 +- src/main/java/kotlinx/reflect/lite/impl/util.kt | 2 +- src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt index 8bccab7..20a9ebe 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt @@ -6,7 +6,6 @@ internal object JvmAbi { const val INSTANCE_FIELD = "INSTANCE" const val DEFAULT_PARAMS_IMPL_SUFFIX = "\$default" - const val DEFAULT_IMPLS_CLASS_NAME = "DefaultImpls" - const val DEFAULT_IMPLS_SUFFIX = "$$DEFAULT_IMPLS_CLASS_NAME" + const val DEFAULT_IMPLS_SUFFIX = "\$DefaultImpls" const val IMPL_SUFFIX_FOR_INLINE_CLASS_MEMBERS = "-impl" } diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index 90f2388..b745144 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -70,7 +70,7 @@ internal class ConstructorDescriptorImpl( } internal class JavaConstructorDescriptorImpl( - val cons: Constructor<*>, + private val cons: Constructor<*>, override val module: ModuleDescriptor, override val containingClass: ClassDescriptor<*>, override val container: ClassBasedDeclarationContainerDescriptor diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index eddf232..c10fa4f 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -10,7 +10,7 @@ import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* -internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : ModuleDescriptor { +internal class ModuleDescriptorImpl(private val classLoader: ClassLoader) : ModuleDescriptor { override fun findClass (name: ClassName): ClassDescriptor? { val fqName = (JavaToKotlinClassMap.mapKotlinToJava(FqName(name.replace('/', '.'))) ?: ClassId(name)).asJavaLookupFqName() val jClass = when (fqName) { // todo why arrays are hardcoded @@ -25,6 +25,7 @@ internal class ModuleDescriptorImpl(internal val classLoader: ClassLoader) : Mod "kotlin.Array" -> Array::class.java else -> classLoader.tryLoadClass(fqName) } + @Suppress("UNCHECKED_CAST") return (jClass?.kotlin as KClassImpl?)?.descriptor } } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt index 92cc6f7..fdb6f82 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -7,7 +7,7 @@ internal class KParameterImpl( val descriptor: ParameterDescriptor, override val index: Int, override val kind: KParameter.Kind, - val containingCallable: CallableDescriptor + private val containingCallable: CallableDescriptor ): KParameter { override val name: String? get() = (descriptor as? ValueParameterDescriptor)?.let { diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 32843e2..a9d3e04 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -7,7 +7,7 @@ import java.lang.reflect.* internal class KTypeImpl( val type: KotlinType, - val computeJavaType: (() -> Type)? = null + private val computeJavaType: (() -> Type)? = null ): KType { override val classifier: KClassifier? get() = diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index b9afb6a..4e9ebaf 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -160,7 +160,7 @@ internal class FakeOverrideFunctionDescriptor( module, containingClass, extensionReceiverParameter, valueParameters, typeParameters, returnType, overridden ), FunctionDescriptor { @Suppress("UNCHECKED_CAST") - val overriddenFunctions: List + private val overriddenFunctions: List get() = super.overridden as List override val signature: JvmMethodSignature? diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index 5f99743..2e457fc 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -9,7 +9,7 @@ import kotlinx.reflect.lite.name.* internal sealed class JvmFunctionSignature { abstract fun asString(): String - class KotlinFunction(val signature: JvmMethodSignature) : JvmFunctionSignature() { + class KotlinFunction(private val signature: JvmMethodSignature) : JvmFunctionSignature() { private val _signature = signature.asString() val methodName: String get() = signature.name @@ -18,7 +18,7 @@ internal sealed class JvmFunctionSignature { override fun asString(): String = _signature } - class KotlinConstructor(val signature: JvmMethodSignature) : JvmFunctionSignature() { + class KotlinConstructor(private val signature: JvmMethodSignature) : JvmFunctionSignature() { private val _signature = signature.asString() val constructorDesc: String get() = signature.desc From 551c3d9463bb384e080715c0b65531a0639b37ff Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 11:53:58 +0200 Subject: [PATCH 65/74] Better exception message instead of plain TODO --- src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt | 7 +++++-- src/main/java/kotlinx/reflect/lite/KClass.kt | 5 +++-- src/main/java/kotlinx/reflect/lite/KProperty.kt | 8 +++++--- .../java/kotlinx/reflect/lite/descriptors/descriptors.kt | 8 +++++--- src/main/java/kotlinx/reflect/lite/misc/util.kt | 2 ++ src/main/java/kotlinx/reflect/lite/name/names.kt | 2 +- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt index f4b9c51..0b7cf31 100644 --- a/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt +++ b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt @@ -1,5 +1,8 @@ package kotlinx.reflect.lite +import kotlinx.reflect.lite.misc.* +import kotlinx.reflect.lite.misc.notImplemented + /** * Represents an annotated element and allows to obtain its annotations. * See the [Kotlin language documentation](https://kotlinlang.org/docs/reference/annotations.html) @@ -10,5 +13,5 @@ public interface KAnnotatedElement { * Annotations which are present on this element. */ private val annotations: List - get() = TODO() -} \ No newline at end of file + get() = notImplemented() +} diff --git a/src/main/java/kotlinx/reflect/lite/KClass.kt b/src/main/java/kotlinx/reflect/lite/KClass.kt index d0d599e..ec49f3a 100644 --- a/src/main/java/kotlinx/reflect/lite/KClass.kt +++ b/src/main/java/kotlinx/reflect/lite/KClass.kt @@ -2,6 +2,7 @@ package kotlinx.reflect.lite import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.misc.* /** * Represents a class and provides introspection capabilities. @@ -35,13 +36,13 @@ public interface KClass : KDeclarationContainer, KAnnotatedElement, KClas * The instance of the object declaration, or `null` if this class is not an object declaration. */ private val objectInstance: T? - get() = TODO() + get() = notImplemented() /** * Returns `true` if [value] is an instance of this class on a given platform. */ @SinceKotlin("1.1") - private fun isInstance(value: Any?): Boolean = TODO() + private fun isInstance(value: Any?): Boolean = notImplemented() /** * The list of type parameters of this class. This list does *not* include type parameters of outer classes. diff --git a/src/main/java/kotlinx/reflect/lite/KProperty.kt b/src/main/java/kotlinx/reflect/lite/KProperty.kt index a8e08a6..3111425 100644 --- a/src/main/java/kotlinx/reflect/lite/KProperty.kt +++ b/src/main/java/kotlinx/reflect/lite/KProperty.kt @@ -1,5 +1,7 @@ package kotlinx.reflect.lite +import kotlinx.reflect.lite.misc.* + /** * Represents a property, such as a named `val` or `var` declaration. * @@ -74,7 +76,7 @@ public interface KProperty0 : KProperty, () -> V { * for more information. */ @SinceKotlin("1.1") - private fun getDelegate(): Any? = TODO() + private fun getDelegate(): Any? = notImplemented() override val getter: Getter @@ -139,7 +141,7 @@ public interface KProperty1 : KProperty, (T) -> V { * @see [kotlin.reflect.full.getExtensionDelegate] // [KProperty1.getExtensionDelegate] */ @SinceKotlin("1.1") - private fun getDelegate(receiver: T): Any? = TODO() + private fun getDelegate(receiver: T): Any? = notImplemented() override val getter: Getter @@ -210,7 +212,7 @@ public interface KProperty2 : KProperty, (D, E) -> V { * @see [kotlin.reflect.full.getExtensionDelegate] // [KProperty2.getExtensionDelegate] */ @SinceKotlin("1.1") - private fun getDelegate(receiver1: D, receiver2: E): Any? = TODO() + private fun getDelegate(receiver1: D, receiver2: E): Any? = notImplemented() override val getter: Getter diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 0b5fcba..6e7fe5d 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -7,7 +7,9 @@ import kotlinx.reflect.lite.calls.Caller import kotlinx.reflect.lite.descriptors.impl.KotlinType import kotlinx.reflect.lite.descriptors.impl.TypeParameterTable import kotlinx.reflect.lite.impl.KCallableImpl +import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.misc.JvmPropertySignature +import kotlinx.reflect.lite.misc.notImplemented import kotlinx.reflect.lite.name.* import java.lang.reflect.* @@ -17,7 +19,7 @@ internal interface ModuleDescriptor { internal interface Annotated { private val annotations: Annotations - get() = TODO() + get() = notImplemented() } interface Annotations { @@ -109,7 +111,7 @@ internal interface CallableDescriptor : DeclarationDescriptor { val visibility: KVisibility? private val isBound: Boolean - get() = TODO() + get() = notImplemented() val isFinal: Boolean val isOpen: Boolean @@ -151,7 +153,7 @@ internal interface PropertyDescriptor : CallableDescriptor { val isLateInit: Boolean val isConst: Boolean private val isDelegated: Boolean - get() = TODO() + get() = notImplemented() val isMovedFromInterfaceCompanion: Boolean diff --git a/src/main/java/kotlinx/reflect/lite/misc/util.kt b/src/main/java/kotlinx/reflect/lite/misc/util.kt index 6e278f6..82f23bb 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/util.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/util.kt @@ -37,3 +37,5 @@ internal fun ClassLoader.tryLoadClass(fqName: String) = } catch (e: ClassNotFoundException) { null } + +internal fun notImplemented(): Nothing = TODO("This functionality is not yet supported in kotlinx.reflect.lite") diff --git a/src/main/java/kotlinx/reflect/lite/name/names.kt b/src/main/java/kotlinx/reflect/lite/name/names.kt index 5f31a13..9b7af33 100644 --- a/src/main/java/kotlinx/reflect/lite/name/names.kt +++ b/src/main/java/kotlinx/reflect/lite/name/names.kt @@ -3,7 +3,7 @@ package kotlinx.reflect.lite.name import kotlinx.metadata.ClassName import kotlinx.metadata.isLocal -typealias Name = String +internal typealias Name = String internal data class FqName(val fqName: String) { val isRoot: Boolean get() = fqName.isEmpty() From 6d8b4e5c339988ec73f6b660feba275c792c86f8 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 12:23:11 +0200 Subject: [PATCH 66/74] Codestyle changes --- .../kotlinx/reflect/lite/KTypeProjection.kt | 5 +- .../lite/builtins/JavaToKotlinClassMap.kt | 38 +++++------ .../kotlinx/reflect/lite/builtins/JvmAbi.kt | 2 - .../reflect/lite/builtins/KotlinBuiltIns.kt | 64 +++++++++---------- .../reflect/lite/builtins/PrimitiveType.kt | 9 ++- .../java/kotlinx/reflect/lite/calls/Caller.kt | 5 -- .../kotlinx/reflect/lite/calls/CallerImpl.kt | 24 ++++--- .../reflect/lite/impl/JvmClassMapping.kt | 1 + .../lite/misc/CompanionObjectMapping.kt | 13 ++-- .../reflect/lite/misc/RuntimeTypeMapper.kt | 2 +- 10 files changed, 76 insertions(+), 87 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt index 7b10cfa..c08ca41 100644 --- a/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt +++ b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt @@ -38,9 +38,8 @@ public data class KTypeProjection constructor( } public companion object { - // provided for compiler access + // TODO: was provided for compiler access in kotlin.reflect @JvmField - @PublishedApi internal val star: KTypeProjection = KTypeProjection(null, null) /** @@ -76,4 +75,4 @@ public data class KTypeProjection constructor( public fun covariant(type: KType): KTypeProjection = KTypeProjection(KVariance.OUT, type) } -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt index cd1fdba..1febf46 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt @@ -1,7 +1,7 @@ // Partially copied from: https://github.com/JetBrains/kotlin/blob/9d09b9605fe5a32a40a84718aebeab6ca6234ab8/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt package kotlinx.reflect.lite.builtins -import kotlinx.reflect.lite.builtins.StandardNames.FQ_NAMES +import kotlinx.reflect.lite.builtins.StandardNames.FqNames import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* @@ -35,28 +35,28 @@ internal object JavaToKotlinClassMap { } private val mutabilityMappings = listOf( - mutabilityMapping>(ClassId.topLevel(FQ_NAMES.iterable), FQ_NAMES.mutableIterable), - mutabilityMapping>(ClassId.topLevel(FQ_NAMES.iterator), FQ_NAMES.mutableIterator), - mutabilityMapping>(ClassId.topLevel(FQ_NAMES.collection), FQ_NAMES.mutableCollection), - mutabilityMapping>(ClassId.topLevel(FQ_NAMES.list), FQ_NAMES.mutableList), - mutabilityMapping>(ClassId.topLevel(FQ_NAMES.set), FQ_NAMES.mutableSet), - mutabilityMapping>(ClassId.topLevel(FQ_NAMES.listIterator), FQ_NAMES.mutableListIterator), - mutabilityMapping>(ClassId.topLevel(FQ_NAMES.map), FQ_NAMES.mutableMap), + mutabilityMapping>(ClassId.topLevel(FqNames.iterable), FqNames.mutableIterable), + mutabilityMapping>(ClassId.topLevel(FqNames.iterator), FqNames.mutableIterator), + mutabilityMapping>(ClassId.topLevel(FqNames.collection), FqNames.mutableCollection), + mutabilityMapping>(ClassId.topLevel(FqNames.list), FqNames.mutableList), + mutabilityMapping>(ClassId.topLevel(FqNames.set), FqNames.mutableSet), + mutabilityMapping>(ClassId.topLevel(FqNames.listIterator), FqNames.mutableListIterator), + mutabilityMapping>(ClassId.topLevel(FqNames.map), FqNames.mutableMap), mutabilityMapping>( - ClassId.topLevel(FQ_NAMES.map).createNestedClassId(FQ_NAMES.mapEntry.shortName()), FQ_NAMES.mutableMapEntry + ClassId.topLevel(FqNames.map).createNestedClassId(FqNames.mapEntry.shortName()), FqNames.mutableMapEntry ) ) init { - addTopLevel(Any::class.java, FQ_NAMES.any) - addTopLevel(String::class.java, FQ_NAMES.string) - addTopLevel(CharSequence::class.java, FQ_NAMES.charSequence) - addTopLevel(Throwable::class.java, FQ_NAMES.throwable) - addTopLevel(Cloneable::class.java, FQ_NAMES.cloneable) - addTopLevel(Number::class.java, FQ_NAMES.number) - addTopLevel(Comparable::class.java, FQ_NAMES.comparable) - addTopLevel(Enum::class.java, FQ_NAMES._enum) - addTopLevel(Annotation::class.java, FQ_NAMES.annotation) + addTopLevel(Any::class.java, FqNames.any) + addTopLevel(String::class.java, FqNames.string) + addTopLevel(CharSequence::class.java, FqNames.charSequence) + addTopLevel(Throwable::class.java, FqNames.throwable) + addTopLevel(Cloneable::class.java, FqNames.cloneable) + addTopLevel(Number::class.java, FqNames.number) + addTopLevel(Comparable::class.java, FqNames.comparable) + addTopLevel(Enum::class.java, FqNames._enum) + addTopLevel(Annotation::class.java, FqNames.annotation) for ((javaClassId, readOnlyClassId, mutableClassId) in mutabilityMappings) { add(javaClassId, readOnlyClassId) @@ -85,7 +85,7 @@ internal object JavaToKotlinClassMap { addKotlinToJava(FqName("kotlin.reflect.KSuspendFunction$i"), K_FUNCTION_CLASS_ID) } - addKotlinToJava(FQ_NAMES.nothing, Void::class.java.classId) + addKotlinToJava(FqNames.nothing, Void::class.java.classId) } /** diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt index 20a9ebe..04c0155 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt @@ -2,8 +2,6 @@ package kotlinx.reflect.lite.builtins internal object JvmAbi { - fun getterName(name: String): String = "get" + name.capitalize() - const val INSTANCE_FIELD = "INSTANCE" const val DEFAULT_PARAMS_IMPL_SUFFIX = "\$default" const val DEFAULT_IMPLS_SUFFIX = "\$DefaultImpls" diff --git a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt index 3160d70..cee4c1b 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt @@ -8,42 +8,36 @@ import kotlinx.reflect.lite.name.* internal object StandardNames { val BUILT_INS_PACKAGE_FQ_NAME = FqName("kotlin") - val FQ_NAMES = FqNames() - class FqNames { - val array = FqName("kotlin.Array") - val any = FqName("kotlin.Any") - val string = FqName("kotlin.String") - val charSequence = FqName("kotlin.CharSequence") - val throwable = FqName("kotlin.Throwable") - val cloneable = FqName("kotlin.Cloneable") - val number = FqName("kotlin.Number") - val comparable = FqName("kotlin.Comparable") - val _enum = FqName("kotlin.Enum") - val annotation = FqName("kotlin.Annotation") - val nothing = FqName("kotlin.Nothing") - val _boolean = FqName("kotlin.Boolean") + object FqNames { + @JvmField val array = FqName("kotlin.Array") + @JvmField val any = FqName("kotlin.Any") + @JvmField val string = FqName("kotlin.String") + @JvmField val charSequence = FqName("kotlin.CharSequence") + @JvmField val throwable = FqName("kotlin.Throwable") + @JvmField val cloneable = FqName("kotlin.Cloneable") + @JvmField val number = FqName("kotlin.Number") + @JvmField val comparable = FqName("kotlin.Comparable") + @JvmField val _enum = FqName("kotlin.Enum") + @JvmField val annotation = FqName("kotlin.Annotation") + @JvmField val nothing = FqName("kotlin.Nothing") + @JvmField val _boolean = FqName("kotlin.Boolean") - val iterable = FqName("kotlin.collections.Iterable") - val iterator = FqName("kotlin.collections.Iterator") - val collection = FqName("kotlin.collections.Collection") - val list = FqName("kotlin.collections.List") - val set = FqName("kotlin.collections.Set") - val listIterator = FqName("kotlin.collections.ListIterator") - val map = FqName("kotlin.collections.Map") - val mapEntry = FqName("kotlin.collections.Map.Entry") - val mutableIterable = FqName("kotlin.collections.MutableIterable") - val mutableIterator = FqName("kotlin.collections.MutableIterator") - val mutableCollection = FqName("kotlin.collections.MutableCollection") - val mutableList = FqName("kotlin.collections.MutableList") - val mutableSet = FqName("kotlin.collections.MutableSet") - val mutableListIterator = FqName("kotlin.collections.MutableListIterator") - val mutableMap = FqName("kotlin.collections.MutableMap") - val mutableMapEntry = FqName("kotlin.collections.MutableMap.Entry") - } - - val CLASS_IDS = ClassIds() - class ClassIds { - val any = ClassId(BUILT_INS_PACKAGE_FQ_NAME, "Any") + @JvmField val iterable = FqName("kotlin.collections.Iterable") + @JvmField val iterator = FqName("kotlin.collections.Iterator") + @JvmField val collection = FqName("kotlin.collections.Collection") + @JvmField val list = FqName("kotlin.collections.List") + @JvmField val set = FqName("kotlin.collections.Set") + @JvmField val listIterator = FqName("kotlin.collections.ListIterator") + @JvmField val map = FqName("kotlin.collections.Map") + @JvmField val mapEntry = FqName("kotlin.collections.Map.Entry") + @JvmField val mutableIterable = FqName("kotlin.collections.MutableIterable") + @JvmField val mutableIterator = FqName("kotlin.collections.MutableIterator") + @JvmField val mutableCollection = FqName("kotlin.collections.MutableCollection") + @JvmField val mutableList = FqName("kotlin.collections.MutableList") + @JvmField val mutableSet = FqName("kotlin.collections.MutableSet") + @JvmField val mutableListIterator = FqName("kotlin.collections.MutableListIterator") + @JvmField val mutableMap = FqName("kotlin.collections.MutableMap") + @JvmField val mutableMapEntry = FqName("kotlin.collections.MutableMap.Entry") } } diff --git a/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt index a859e89..47dce9f 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt @@ -3,7 +3,14 @@ package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.name.* internal enum class PrimitiveType(val typeName: Name) { - BOOLEAN("Boolean"), CHAR("Char"), BYTE("Byte"), SHORT("Short"), INT("Int"), FLOAT("Float"), LONG("Long"), DOUBLE("Double"); + BOOLEAN("Boolean"), + CHAR("Char"), + BYTE("Byte"), + SHORT("Short"), + INT("Int"), + FLOAT("Float"), + LONG("Long"), + DOUBLE("Double"); val arrayTypeName: Name = typeName + "Array" diff --git a/src/main/java/kotlinx/reflect/lite/calls/Caller.kt b/src/main/java/kotlinx/reflect/lite/calls/Caller.kt index ab6d915..28f1259 100644 --- a/src/main/java/kotlinx/reflect/lite/calls/Caller.kt +++ b/src/main/java/kotlinx/reflect/lite/calls/Caller.kt @@ -22,8 +22,3 @@ internal interface Caller { internal val Caller<*>.arity: Int get() = parameterTypes.size - -/** - * A marker interface that signifies that this caller has a "bound receiver" object which should be used as the dispatch receiver instance. - */ -interface BoundCaller \ No newline at end of file diff --git a/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt index 7c37cda..aa50e09 100644 --- a/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt @@ -140,17 +140,15 @@ internal sealed class CallerImpl( } } - companion object { - @Suppress("UNCHECKED_CAST") - inline fun Array.dropFirst(): Array = - if (size <= 1) emptyArray() else copyOfRange(1, size) as Array - - @Suppress("UNCHECKED_CAST") - inline fun Array.dropLast(): Array = - if (size <= 1) emptyArray() else copyOfRange(0, size - 1) as Array - - @Suppress("UNCHECKED_CAST") - inline fun Array.dropFirstAndLast(): Array = - if (size <= 2) emptyArray() else copyOfRange(1, size - 1) as Array - } + @Suppress("UNCHECKED_CAST") + inline fun Array.dropFirst(): Array = + if (size <= 1) emptyArray() else copyOfRange(1, size) as Array + + @Suppress("UNCHECKED_CAST") + inline fun Array.dropLast(): Array = + if (size <= 1) emptyArray() else copyOfRange(0, size - 1) as Array + + @Suppress("UNCHECKED_CAST") + inline fun Array.dropFirstAndLast(): Array = + if (size <= 2) emptyArray() else copyOfRange(1, size - 1) as Array } diff --git a/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt index 59bb60f..eb54cf0 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt @@ -22,6 +22,7 @@ val Class.kotlinPackage: KPackage /** * Returns a Java [Class] instance corresponding to the given [KClass] instance. */ +@Suppress("UNCHECKED_CAST") public val KClass.java: Class @JvmName("getJavaClass") get() = (this as KClassImpl).descriptor.jClass as Class diff --git a/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt index 4d608c5..92cc189 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt @@ -1,18 +1,15 @@ package kotlinx.reflect.lite.misc import kotlinx.reflect.lite.builtins.* -import kotlinx.reflect.lite.builtins.StandardNames.FQ_NAMES -import kotlinx.reflect.lite.descriptors.ClassDescriptor +import kotlinx.reflect.lite.builtins.StandardNames.FqNames import kotlinx.reflect.lite.name.* -import java.util.* internal object CompanionObjectMapping { private val classIds: Set = (PrimitiveType.NUMBER_TYPES.map(PrimitiveType::typeFqName) + - FQ_NAMES.string + - FQ_NAMES._boolean + - FQ_NAMES._enum).mapTo(linkedSetOf(), (ClassId)::topLevel) + FqNames.string + + FqNames._boolean + + FqNames._enum).mapTo(linkedSetOf(), (ClassId)::topLevel) - fun allClassesWithIntrinsicCompanions(): Set = - Collections.unmodifiableSet(classIds) + fun allClassesWithIntrinsicCompanions(): Set = classIds } diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index 2e457fc..dbaba4c 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -46,7 +46,7 @@ internal object RuntimeTypeMapper { jClass.componentType.primitiveType?.let { return ClassId(FqName("kotlin"), it.arrayTypeName) } - return ClassId.topLevel(StandardNames.FQ_NAMES.array) + return ClassId.topLevel(StandardNames.FqNames.array) } if (jClass == Void.TYPE) return JAVA_LANG_VOID From 9b34b13544241bc7140d420af070c3b1282eb4b6 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 12:54:13 +0200 Subject: [PATCH 67/74] Revise public modifiers in root package --- src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt | 2 +- src/main/java/kotlinx/reflect/lite/KPackage.kt | 3 ++- src/main/java/kotlinx/reflect/lite/KTypeProjection.kt | 2 +- src/main/java/kotlinx/reflect/lite/KVariance.kt | 4 ++-- src/main/java/kotlinx/reflect/lite/KVisibility.kt | 4 ++-- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt index 36d5fdf..bcca5a2 100644 --- a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt +++ b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt @@ -4,7 +4,7 @@ package kotlinx.reflect.lite * Represents an entity which may contain declarations of any other entities, * such as a class or a package. */ -interface KDeclarationContainer { +public interface KDeclarationContainer { /** * Declared functions and properties accessible in this container, including fake overrides. * NOTE: does not return inherited and static members for now. diff --git a/src/main/java/kotlinx/reflect/lite/KPackage.kt b/src/main/java/kotlinx/reflect/lite/KPackage.kt index c46bf65..d19aa93 100644 --- a/src/main/java/kotlinx/reflect/lite/KPackage.kt +++ b/src/main/java/kotlinx/reflect/lite/KPackage.kt @@ -1,3 +1,4 @@ package kotlinx.reflect.lite -interface KPackage : KDeclarationContainer +// TODO document it +public interface KPackage : KDeclarationContainer diff --git a/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt index c08ca41..6c39fc5 100644 --- a/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt +++ b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt @@ -10,7 +10,7 @@ package kotlinx.reflect.lite * for more information. */ @SinceKotlin("1.1") -public data class KTypeProjection constructor( +public data class KTypeProjection( /** * The use-site variance specified in the projection, or `null` if this is a star projection. */ diff --git a/src/main/java/kotlinx/reflect/lite/KVariance.kt b/src/main/java/kotlinx/reflect/lite/KVariance.kt index f1bd882..70c143b 100644 --- a/src/main/java/kotlinx/reflect/lite/KVariance.kt +++ b/src/main/java/kotlinx/reflect/lite/KVariance.kt @@ -11,7 +11,7 @@ package kotlinx.reflect.lite * @see [KTypeProjection] */ @SinceKotlin("1.1") -enum class KVariance { +public enum class KVariance { /** * The affected type parameter or type is *invariant*, which means it has no variance applied to it. */ @@ -26,4 +26,4 @@ enum class KVariance { * The affected type parameter or type is *covariant*. Denoted by the `out` modifier in the source code. */ OUT, -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/KVisibility.kt b/src/main/java/kotlinx/reflect/lite/KVisibility.kt index fd46bca..a22ede8 100644 --- a/src/main/java/kotlinx/reflect/lite/KVisibility.kt +++ b/src/main/java/kotlinx/reflect/lite/KVisibility.kt @@ -11,7 +11,7 @@ package kotlinx.reflect.lite * for more information. */ @SinceKotlin("1.1") -enum class KVisibility { +public enum class KVisibility { /** * Visibility of declarations marked with the `public` modifier, or with no modifier at all. */ @@ -31,4 +31,4 @@ enum class KVisibility { * Visibility of declarations marked with the `private` modifier. */ PRIVATE, -} \ No newline at end of file +} From 13bff2384b9fd2845b7dbd9fd3e386327df9db37 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 13:55:26 +0200 Subject: [PATCH 68/74] Move JvmClassMapping to its own public package kotlinx.reflect.lite.jvm --- .../lite/descriptors/impl/ModuleDescriptorImpl.kt | 1 + .../kotlinx/reflect/lite/impl/ReflectJvmMapping.kt | 1 + .../reflect/lite/{impl => jvm}/JvmClassMapping.kt | 12 ++++++------ .../lite/testData/call/accessPrivateProperties.kt | 1 + .../kotlinx/reflect/lite/testData/call/bigArity.kt | 1 + .../lite/testData/call/cannotCallEnumConstructor.kt | 2 ++ .../lite/testData/call/equalsHashCodeToString.kt | 1 + .../reflect/lite/testData/call/exceptionHappened.kt | 2 +- .../reflect/lite/testData/call/fakeOverride.kt | 1 + .../lite/testData/call/fakeOverrideSubstituted.kt | 1 + .../lite/testData/call/incorrectNumberOfArguments.kt | 1 + .../lite/testData/call/innerClassConstructor.kt | 1 + .../kotlinx/reflect/lite/testData/call/jvmStatic.kt | 1 + .../reflect/lite/testData/call/localClassMember.kt | 1 + .../lite/testData/call/memberOfGenericClass.kt | 1 + ...ropertyGetterAndGetFunctionDifferentReturnType.kt | 1 + .../reflect/lite/testData/call/protectedMembers.kt | 2 ++ .../kotlinx/reflect/lite/testData/call/returnUnit.kt | 1 + .../reflect/lite/testData/call/simpleConstructor.kt | 1 + .../lite/testData/call/simpleMemberFunction.kt | 1 + .../lite/testData/call/simpleTopLevelFunctions.kt | 2 +- .../lite/testData/callBy/boundExtensionFunctionWA.kt | 2 +- .../callBy/boundExtensionPropertyAcessorWA.kt | 2 +- .../lite/testData/callBy/boundJvmStaticInObjectWA.kt | 1 + .../reflect/lite/testData/callBy/companionObject.kt | 1 + .../callBy/defaultAndNonDefaultIntertwined.kt | 2 +- .../callBy/defaultInSuperClassFakeOverride.kt | 1 + .../lite/testData/callBy/extensionFunction.kt | 2 +- .../lite/testData/callBy/jvmStaticInObject.kt | 1 + .../callBy/manyArgumentsNoneDefaultConstructor.kt | 1 + .../callBy/manyArgumentsNoneDefaultFunction.kt | 1 + .../testData/callBy/manyArgumentsOnlyOneDefault.kt | 1 + .../testData/callBy/nonDefaultParameterOmitted.kt | 2 +- .../reflect/lite/testData/callBy/nullValue.kt | 2 +- ...inaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt | 2 +- .../lite/testData/callBy/primitiveDefaultValues.kt | 2 +- .../lite/testData/callBy/simpleConstructor.kt | 1 + .../lite/testData/callBy/simpleMemberFunciton.kt | 1 + .../lite/testData/callBy/simpleTopLevelFunction.kt | 2 +- .../reflect/lite/testData/callSuspend/bigArity.kt | 1 + .../reflect/lite/testData/callSuspend/callSuspend.kt | 2 ++ .../callSuspend/primitiveSuspendFunctions.kt | 3 ++- .../reflect/lite/testData/classes/classMembers.kt | 3 ++- .../reflect/lite/testData/classes/classSimpleName.kt | 1 + .../lite/testData/classes/localClassSimpleName.kt | 2 +- .../reflect/lite/testData/classes/nestedClasses.kt | 2 ++ .../reflect/lite/testData/classes/qualifiedName.kt | 1 + .../classes/qualifiedNameOfStandardClasses.kt | 2 ++ .../lite/testData/classes/sealedSubclasses.kt | 2 ++ .../lite/testData/constructors/constructorName.kt | 1 + .../lite/testData/constructors/primaryConstructor.kt | 2 ++ .../testData/constructors/simpleGetConstructors.kt | 1 + .../reflect/lite/testData/mapping/constructor.kt | 2 ++ .../mapping/methodsFromObjectWithoutCustomMembers.kt | 2 ++ .../lite/testData/mapping/types/constructors.kt | 2 ++ .../testData/mapping/types/parameterizedTypes.kt | 2 ++ .../parameters/functionParameterNameAndIndex.kt | 1 + .../parameters/instanceParameterOfFakeOverride.kt | 1 + .../lite/testData/parameters/isMarkedNullable.kt | 1 + .../reflect/lite/testData/parameters/isOptional.kt | 1 + .../reflect/lite/testData/parameters/kinds.kt | 1 + .../testData/parameters/objectMemberReferences.kt | 1 + .../lite/testData/parameters/propertySetter.kt | 2 +- .../reflect/lite/testData/parameters/references.kt | 1 + .../accessors/extensionPropertyAccessors.kt | 2 +- .../properties/accessors/memberPropertyAccessors.kt | 1 + .../accessors/topLevelPropertyAccessors.kt | 2 +- .../lite/testData/properties/invokeKProperty.kt | 2 ++ .../callPrivatePropertyFromGetProperties.kt | 1 + .../properties/isAccessible/privateClassVal.kt | 1 + .../isAccessible/privateToThisAccessors.kt | 2 ++ .../properties/isAccessible/protectedClassVar.kt | 2 ++ .../isAccessible/publicClassValAccessible.kt | 2 ++ .../properties/propertyOfNestedClassAndArrayType.kt | 3 ++- .../lite/testData/properties/simpleGetProperties.kt | 1 + src/test/java/kotlinx/reflect/lite/tests/testUtil.kt | 1 + .../unusedTestData/callBy/boundJvmStaticInObject.kt | 2 ++ .../lite/unusedTestData/constructors/enumEntry.kt | 1 + .../lite/unusedTestData/mapping/methodsFromObject.kt | 2 ++ .../properties/getPropertiesMutableVsReadonly.kt | 1 + 80 files changed, 105 insertions(+), 24 deletions(-) rename src/main/java/kotlinx/reflect/lite/{impl => jvm}/JvmClassMapping.kt (70%) diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index c10fa4f..4d9ea38 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -7,6 +7,7 @@ import kotlinx.reflect.lite.builtins.* import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.descriptors.ModuleDescriptor import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.misc.* import kotlinx.reflect.lite.name.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt index c371de1..b8cb6d9 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt @@ -6,6 +6,7 @@ package kotlinx.reflect.lite.impl import kotlinx.metadata.jvm.KotlinClassHeader import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.jvm.* import java.lang.reflect.* // Kotlin reflection -> Java reflection diff --git a/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt similarity index 70% rename from src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt rename to src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt index eb54cf0..4856a05 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/JvmClassMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt @@ -1,24 +1,24 @@ -@file:JvmName("JvmClassMappingKt") - -package kotlinx.reflect.lite.impl +package kotlinx.reflect.lite.jvm import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.impl.KClassImpl +import kotlinx.reflect.lite.impl.ReflectionLiteImpl /** * Returns a [KClass] instance corresponding to the given Java [Class] instance. */ -val Class.kotlin: KClass +public val Class.kotlin: KClass @JvmName("getLiteKClass") get() = ReflectionLiteImpl.createKotlinClass(this) /** * Returns a [KPackage] instance corresponding to the given Java [Class] instance. */ -val Class.kotlinPackage: KPackage +public val Class.kotlinPackage: KPackage @JvmName("getLiteKPackage") get() = ReflectionLiteImpl.createKotlinPackage(this) - /** * Returns a Java [Class] instance corresponding to the given [KClass] instance. */ diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt index d626e4c..9589d15 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt @@ -2,6 +2,7 @@ package tests.call.accessPrivateProperties import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.reflect.jvm.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt index ed6f639..0d85365 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -2,6 +2,7 @@ package tests.call.bigArity import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* class A { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt index 5366fd0..0c05d57 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -2,6 +2,8 @@ package tests.call.cannotCallEnumConstructor import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + enum class E diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt index 0ffb2e5..b692fdc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -2,6 +2,7 @@ package tests.call.equalsHashCodeToString import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* class A diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt index 2657a16..cec781b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -1,6 +1,6 @@ package tests.call.exceptionHappened -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.InvocationTargetException diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt index 3993e68..3cf0246 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt @@ -2,6 +2,7 @@ package tests.call.fakeOverride import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* open class A { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt index 071daf4..732036b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt @@ -3,6 +3,7 @@ package tests.call.fakeOverrideSubstituted import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* open class A(val t: T) { fun foo() = t diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index 057b4a6..b8cbbd1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -2,6 +2,7 @@ package tests.call.incorrectNumberOfArguments import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt index 78c4a17..779dcfd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt @@ -2,6 +2,7 @@ package tests.call.innerClassConstructor import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* class A { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt index 79e7d42..4db8f83 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt @@ -3,6 +3,7 @@ package tests.call.jvmStatic import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* object Obj { @JvmStatic diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt index 2715991..3f5f9e1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt @@ -2,6 +2,7 @@ package tests.call.localClassMember import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt index 38dba3e..7a9aeb7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt @@ -3,6 +3,7 @@ package tests.call.memberOfGenericClass import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* var result = "Fail" diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt index 8bb8442..ff1ee8f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt @@ -2,6 +2,7 @@ package tests.call.propertyGetterAndGetFunctionDifferentReturnType import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* data class Foo(val id: String) { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index 5dd8e36..8085728 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -2,6 +2,8 @@ package tests.call.protectedMembers import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + import kotlin.test.* abstract class Base { diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt index 78a08a3..efc8716 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt @@ -2,6 +2,7 @@ package tests.call.returnUnit import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt index fe78de7..c907097 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt @@ -2,6 +2,7 @@ package tests.call.simpleConstructor import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* class A(val result: String) diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt index db129a9..950d182 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt @@ -3,6 +3,7 @@ package tests.call.simpleMemberFunction import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* class A { fun foo(x: Int, y: Int) = x + y diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt index 476313d..7bde666 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt @@ -1,6 +1,6 @@ package tests.call.simpleTopLevelFunctions -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* fun String.foo(): Int = length diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt index 451f1e2..b0095fe 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt @@ -1,7 +1,7 @@ package tests.callBy.boundExtensionFunctionWA import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* // WA for the use-case from this test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt index 1fae61d..1e95dc9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt @@ -1,7 +1,7 @@ package tests.callBy.boundExtensionPropertyAcessorWA import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* // WA for the use-case from this test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt index b95344d..37b7879 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt @@ -2,6 +2,7 @@ package tests.callBy.boundJvmStaticInObjectWA import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* // WA for the use-case from this test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt index 033c831..86aa3b0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt @@ -1,6 +1,7 @@ package tests.callBy.companionObject import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals class C { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt index 9c1aa8e..7db0f02 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt @@ -1,7 +1,7 @@ package tests.callBy.defaultAndNonDefaultIntertwined import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt index 5e96ae2..e023195 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt @@ -1,6 +1,7 @@ package tests.callBy.defaultInSuperClassFakeOverride import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt index 4842ef7..0316ed5 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt @@ -1,6 +1,6 @@ package tests.callBy.extensionFunction -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt index 3c12b98..5beca88 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt @@ -1,6 +1,7 @@ package tests.callBy.jvmStaticInObject import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals object Obj { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt index 3c96a58..1b52cf4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt @@ -2,6 +2,7 @@ package tests.callBy.manyArgumentsNoneDefaultConstructor import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals // Generate: diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt index f98773e..3df240c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt @@ -1,6 +1,7 @@ package tests.callBy.manyArgumentsNoneDefaultFunction import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals // Generate: diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt index 098cfd7..5dde179 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt @@ -1,6 +1,7 @@ package tests.callBy.manyArgumentsOnlyOneDefault import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals // Generate: diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt index 34d6feb..a76647c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt @@ -1,6 +1,6 @@ package tests.callBy.nonDefaultParameterOmitted -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt index 869274b..054e36e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt @@ -1,6 +1,6 @@ package tests.callBy.nullValue -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertNull diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt index 26dbf52..ca82fc6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt @@ -1,6 +1,6 @@ package tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt index 0059348..7a05eec 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt @@ -1,6 +1,6 @@ package tests.callBy.primitiveDefaultValues -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt index 7dea476..649c6ae 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt @@ -1,6 +1,7 @@ package tests.callBy.simpleConstructor import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.impl.* class A(val result: String = "OK") diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt index f6d3686..1e99b02 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt @@ -2,6 +2,7 @@ package tests.callBy.simpleMemberFunciton import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* class A { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt index fcf2d7e..bb4a1ec 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt @@ -1,7 +1,7 @@ package tests.callBy.simpleTopLevelFunction import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* fun foo(result: String = "OK") = result diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt index 4428ff0..33c4fc0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt @@ -2,6 +2,7 @@ package tests.callSuspend.bigArity import helpers.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.coroutines.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt index e84fce2..9718260 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt @@ -7,10 +7,12 @@ package tests.callSuspend.callSuspend import helpers.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.coroutines.* import kotlin.coroutines.intrinsics.* + fun builder(c: suspend () -> Unit) { c.startCoroutine(EmptyContinuation) } diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt index 9718691..9b3cba1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt @@ -2,9 +2,10 @@ package tests.callSuspend.primitiveSuspendFunctions import kotlin.coroutines.startCoroutine import kotlin.test.assertEquals -import kotlin.test.assertFailsWith import helpers.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + class Z(val value: Int) diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt index fb3a26a..0b569e0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt @@ -1,7 +1,8 @@ package tests.classes.classMembers -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.* + import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt index e06a953..92398cc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt @@ -2,6 +2,7 @@ package tests.classes.classSimpleName import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals class Klass diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt index a1d05d2..b0e1289 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt @@ -1,7 +1,7 @@ package tests.classes.localClassSimpleName import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals fun check(klass: KClass<*>, expectedName: String) { diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt index b80555b..5e025e4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt @@ -3,6 +3,8 @@ package tests.classes.nestedClasses import kotlin.test.assertEquals import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + class A { companion object {} diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt index ad8129c..6187578 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -2,6 +2,7 @@ package tests.classes.qualifiedName import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt index 4471866..fff99c7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt @@ -3,6 +3,8 @@ package tests.classes.qualifiedNameOfStandardClasses import kotlinx.reflect.lite.tests.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* + import kotlin.test.assertEquals fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt index c2b597e..e7c8fc9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt @@ -2,6 +2,8 @@ package tests.classes.sealedSubclasses import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + import kotlin.test.assertEquals // -- diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt index 3ea238a..69abc83 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt @@ -1,6 +1,7 @@ package tests.constructors.constructorName import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt index 5872b72..9b1c6a6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt @@ -3,6 +3,8 @@ package tests.constructors.primaryConstructor import kotlin.test.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + class OnlyPrimary diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt index 8dd89b4..c9dbcbb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt @@ -1,6 +1,7 @@ package tests.constructors.simpleGetConstructors import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.* import java.util.Collections import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt index 3875183..84c0476 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt @@ -2,6 +2,8 @@ package tests.mapping.constructor import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + class K { class Nested diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt index ddca7a1..ba0a050 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt @@ -4,6 +4,8 @@ package tests.mapping.methodsFromObjectWithoutCustomMembers import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + import kotlin.test.assertEquals annotation class A diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt index afa6523..6970918 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt @@ -2,6 +2,8 @@ package tests.mapping.types.constructors import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + import kotlin.test.assertEquals class A(d: Double, s: String, parent: A?) { diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt index 176f5ea..ee80bf4 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt @@ -4,6 +4,8 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.ParameterizedType +import kotlinx.reflect.lite.jvm.* + class A(private var foo: List) diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt index a0aed8e..fef87c6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt @@ -4,6 +4,7 @@ import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals +import kotlinx.reflect.lite.jvm.* fun foo(bar: String): Int = bar.length diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt index f5b2a50..21ddf9d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt @@ -2,6 +2,7 @@ package tests.parameters.instanceParameterOfFakeOverride import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt index 090411f..26789ac 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt @@ -1,6 +1,7 @@ package tests.parameters.isMarkedNullable import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals import kotlin.test.assertTrue diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt index 4c31d35..e6174bd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt @@ -1,6 +1,7 @@ package tests.parameters.isOptional import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt index e750136..47e4e1f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt @@ -2,6 +2,7 @@ package tests.parameters.kinds import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt index b05f185..316e3e2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt @@ -1,6 +1,7 @@ package tests.parameters.objectMemberReferences import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt index 755b24c..ec7a25c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt @@ -1,7 +1,7 @@ package tests.parameters.propertySetter import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt index 76ef425..8978fe9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt @@ -2,6 +2,7 @@ package tests.parameters.references import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index 0c6deeb..20672d2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -1,7 +1,7 @@ package tests.properties.accessors.extensionPropertyAccessors import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt index 0e7f871..fa639ab 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt @@ -2,6 +2,7 @@ package tests.properties.accessors.memberPropertyAccessors import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index beb8ef0..9de5ede 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -1,7 +1,7 @@ package tests.properties.accessors.topLevelPropertyAccessors import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt index ab32509..857888f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt @@ -2,8 +2,10 @@ package tests.properties.invokeKProperty import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* + class A(val foo: String) fun box(): String { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt index 672e6e0..dcb6fd9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt @@ -2,6 +2,7 @@ package tests.properties.callPrivatePropertyFromGetProperties import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt index 92d8539..b8fb353 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt @@ -2,6 +2,7 @@ package tests.properties.privateClassVal import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt index 5f403af..89f8c71 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt @@ -2,8 +2,10 @@ package tests.properties.privateToThisAccessors import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* + class K { private var t: T get() = "OK" as T diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt index 75fa55a..9158a1a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt @@ -2,7 +2,9 @@ package tests.properties.protectedClassVar import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* + import kotlin.test.* class A(param: String) { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt index 904b330..97112c3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt @@ -2,8 +2,10 @@ package tests.properties.publicClassValAccessible import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* + class Result { public val value: String = "OK" } diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt index 334d172..d1959bc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt @@ -1,7 +1,8 @@ package tests.properties.propertyOfNestedClassAndArrayType -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* + class A { class B(val result: String) diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt index c9278a7..9ced06d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt @@ -2,6 +2,7 @@ package tests.properties.simpleGetProperties import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* class A(param: String) { val int: Int get() = 42 diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 2d17077..5e6a6fb 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -2,6 +2,7 @@ package kotlinx.reflect.lite.tests import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* @Deprecated( message = "Better use the Class.kotlinClass: KDeclarationContainer extension", diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt index f00d81b..81a2ee6 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt @@ -2,8 +2,10 @@ package tests.callBy.boundJvmStaticInObject import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* + object Host { @JvmStatic fun concat(s1: String, s2: String, s3: String = "K", s4: String = "x") = s1 + s2 + s3 + s4 diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt index b87cda2..eab49f2 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt @@ -1,6 +1,7 @@ package kotlinx.reflect.lite.unusedTestData.constructors import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt index aaae3b3..c6bc3f7 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt @@ -2,6 +2,8 @@ package tests.mapping.methodsFromObject import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* + import kotlin.test.assertEquals annotation class A diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt index 786a243..72e13ce 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt @@ -1,5 +1,6 @@ package tests.properties.getPropertiesMutableVsReadonly +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.impl.* import kotlin.reflect.* From 843debe1f073147715c147578d973e59dc91916d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 14:10:53 +0200 Subject: [PATCH 69/74] Move ReflectJvmMapping to its own public package kotlinx.reflect.lite.jvm --- .../reflect/lite/builtins/KotlinBuiltIns.kt | 1 + .../kotlinx/reflect/lite/impl/KCallableImpl.kt | 1 + .../kotlinx/reflect/lite/impl/KCallablesJvm.kt | 1 + .../kotlinx/reflect/lite/jvm/JvmClassMapping.kt | 2 ++ .../lite/{impl => jvm}/ReflectJvmMapping.kt | 15 +++++++++------ .../call/jvmStaticInObjectIncorrectReceiver.kt | 2 +- .../reflect/lite/testData/call/returnUnit.kt | 2 -- .../testData/callBy/jvmStaticInCompanionObject.kt | 2 +- .../lite/testData/callBy/manyMaskArguments.kt | 2 +- .../lite/testData/classes/sealedSubclasses.kt | 1 - .../constructors/classesWithoutConstructors.kt | 2 +- .../constructors/simpleGetConstructors.kt | 1 - .../reflect/lite/testData/mapping/constructor.kt | 1 - .../lite/testData/mapping/extensionProperty.kt | 2 +- .../reflect/lite/testData/mapping/functions.kt | 2 +- .../lite/testData/mapping/inlineReifiedFun.kt | 2 +- .../interfaceCompanionPropertyWithJvmField.kt | 2 +- .../lite/testData/mapping/lateinitProperty.kt | 2 +- .../lite/testData/mapping/memberProperty.kt | 2 +- .../methodsFromObjectWithoutCustomMembers.kt | 1 - .../testData/mapping/methodsFromSuperInterface.kt | 2 +- .../lite/testData/mapping/privateProperty.kt | 2 +- .../mapping/propertyAccessorsWithJvmName.kt | 2 +- .../lite/testData/mapping/syntheticFields.kt | 2 +- .../lite/testData/mapping/topLevelProperty.kt | 2 +- .../reflect/lite/testData/mapping/types/array.kt | 1 + .../lite/testData/mapping/types/constructors.kt | 2 -- .../mapping/types/genericArrayElementType.kt | 2 +- .../testData/mapping/types/memberFunctions.kt | 2 +- .../mapping/types/parameterizedTypeArgument.kt | 2 +- .../testData/mapping/types/parameterizedTypes.kt | 1 - .../testData/mapping/types/propertyAccessors.kt | 2 +- .../lite/testData/mapping/types/supertypes.kt | 1 + .../testData/mapping/types/topLevelFunctions.kt | 2 +- .../lite/testData/mapping/types/typeParameters.kt | 2 +- .../reflect/lite/testData/mapping/types/unit.kt | 2 +- .../reflect/lite/testData/parameters/bigArity.kt | 2 +- .../parameters/functionParameterNameAndIndex.kt | 1 - .../testData/parameters/innerClassConstructor.kt | 2 +- ...instanceExtensionReceiverAndValueParameters.kt | 2 +- .../parameters/instanceParameterOfFakeOverride.kt | 1 - .../testData/parameters/objectMemberReferences.kt | 1 - .../properties/isAccessible/privateClassVar.kt | 1 + .../isAccessible/privateJvmStaticVarInObject.kt | 1 + .../privatePropertyCallIsAccessibleOnAccessors.kt | 1 + .../lambdaClasses/reflectOnLambdaInSuspend.kt | 1 + .../unusedTestData/mapping/methodsFromObject.kt | 1 - 47 files changed, 45 insertions(+), 44 deletions(-) rename src/main/java/kotlinx/reflect/lite/{impl => jvm}/ReflectJvmMapping.kt (96%) diff --git a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt index cee4c1b..07da086 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt @@ -3,6 +3,7 @@ package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.name.* internal object StandardNames { diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index e815d4f..f8eb11f 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -3,6 +3,7 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.* import kotlinx.reflect.lite.descriptors.impl.* +import kotlinx.reflect.lite.jvm.* import java.lang.reflect.* import java.util.ArrayList import kotlin.coroutines.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt index 4da687c..f40dee2 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt @@ -3,6 +3,7 @@ package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import java.lang.reflect.AccessibleObject /** diff --git a/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt index 4856a05..5f416b3 100644 --- a/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt @@ -1,3 +1,5 @@ +@file:JvmName("JvmClassMappingKt") + package kotlinx.reflect.lite.jvm import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt similarity index 96% rename from src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt rename to src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt index b8cb6d9..e804f1e 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt @@ -1,12 +1,12 @@ @file:JvmName("ReflectJvmMapping") // Some logic copied from: https://github.com/JetBrains/kotlin/blob/26cdb2f928982dad7f0c9ab8e3bd509665d9d537/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt -package kotlinx.reflect.lite.impl +package kotlinx.reflect.lite.jvm -import kotlinx.metadata.jvm.KotlinClassHeader +import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.descriptors.impl.* -import kotlinx.reflect.lite.jvm.* +import kotlinx.reflect.lite.impl.* import java.lang.reflect.* // Kotlin reflection -> Java reflection @@ -51,6 +51,9 @@ val KFunction.javaConstructor: Constructor? return it.descriptor.caller.member as? Constructor } +// Java reflection -> Kotlin reflection + + /** * Returns a [KClass] instance representing the companion object of a given class, * or `null` if the class doesn't have a companion object. @@ -72,8 +75,6 @@ val KDeclarationContainer.companionObject: KClass<*>? val KType.javaType: Type get() = (this as KTypeImpl).javaType ?: this.computeJavaType() -// Java reflection -> Kotlin reflection - /** * Returns a [KDeclarationContainer] instance representing a Kotlin class or package. */ @@ -82,7 +83,9 @@ internal val Class.kDeclarationContainer: KDeclarationContainer private fun Member.getKPackage(): KDeclarationContainer? = when (declaringClass.getAnnotation(Metadata::class.java)?.kind) { - KotlinClassHeader.FILE_FACADE_KIND, KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND -> KPackageImpl(PackageDescriptorImpl(declaringClass)) + KotlinClassHeader.FILE_FACADE_KIND, KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND -> KPackageImpl( + PackageDescriptorImpl(declaringClass) + ) else -> null } diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt index 5d1a340..a1d7faa 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt @@ -1,7 +1,7 @@ package tests.call.jvmStaticInObjectIncorrectReceiver import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* object Obj { @JvmStatic diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt index efc8716..f32ecd2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt @@ -1,7 +1,5 @@ package tests.call.returnUnit -import kotlinx.reflect.lite.impl.* -import kotlinx.reflect.lite.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt index 71bb2bd..4255491 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt @@ -2,7 +2,7 @@ package tests.callBy.jvmStaticInCompanionObject // KT-12915 IAE on callBy of JvmStatic function with default arguments -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals class C { diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt index 59b93e8..a50f9d3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt @@ -1,6 +1,6 @@ package tests.callBy.manyMaskArguments -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals // Generate: diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt index e7c8fc9..1ac1431 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt @@ -1,7 +1,6 @@ package tests.classes.sealedSubclasses import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt index 6fc6d69..9573286 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt @@ -1,8 +1,8 @@ package tests.constructors.classesWithoutConstructors import kotlinx.reflect.lite.tests.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertTrue interface Interface diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt index c9dbcbb..23301f3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt @@ -1,6 +1,5 @@ package tests.constructors.simpleGetConstructors -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.* import java.util.Collections diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt index 84c0476..e95abe3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt @@ -1,7 +1,6 @@ package tests.mapping.constructor import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt index 889b7a8..72bdf20 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt @@ -1,7 +1,7 @@ package tests.mapping.extensionProperty import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt index a62daf1..245b844 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt @@ -1,7 +1,7 @@ package tests.mapping.functions import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* class K { diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt index 8eb2dd9..113ad00 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt @@ -1,7 +1,7 @@ package tests.mapping.inlineReifiedFun import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt index f7f844e..4987859 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt @@ -1,7 +1,7 @@ package tests.mapping.interfaceCompanionPropertyWithJvmField import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt index c795a29..31f287d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt @@ -1,7 +1,7 @@ package tests.mapping.lateinitProperty -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt index 0289b7c..ef29335 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt @@ -1,7 +1,7 @@ package tests.mapping.memberProperty import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt index ba0a050..9b67e48 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt @@ -3,7 +3,6 @@ package tests.mapping.methodsFromObjectWithoutCustomMembers import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt index 7f7fce6..f612f1e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt @@ -1,7 +1,7 @@ package tests.mapping.methodsFromSuperInterface import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt index fb5286d..e6a3af9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt @@ -1,7 +1,7 @@ package tests.mapping.privateProperty import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt index 4a4d0d5..19f2e11 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt @@ -1,7 +1,7 @@ package tests.mapping.propertyAccessorsWithJvmName import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* var state: String = "value" diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt index f8e83a3..2508a59 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt @@ -1,6 +1,6 @@ package tests.mapping.syntheticFields -import kotlinx.reflect.lite.impl.kotlinProperty +import kotlinx.reflect.lite.jvm.kotlinProperty enum class A { // There's a synthetic field "$VALUES" here diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt index c86700f..3a3f95d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt @@ -1,7 +1,7 @@ package tests.mapping.topLevelProperty import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt index e3b87aa..e2924fd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt @@ -2,6 +2,7 @@ package tests.mapping.types.array import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.GenericArrayType import java.lang.reflect.TypeVariable diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt index 6970918..580dd2d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt @@ -1,7 +1,5 @@ package tests.mapping.types.constructors -import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt index 593012f..3a003aa 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt @@ -1,7 +1,7 @@ package tests.mapping.types.genericArrayElementType import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt index 977baed..17a367d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt @@ -1,6 +1,6 @@ package tests.mapping.types.memberFunctions -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt index 2eb1cde..50f6847 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt @@ -1,7 +1,7 @@ package tests.mapping.types.parameterizedTypeArgument import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt index ee80bf4..4c2c554 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt @@ -1,7 +1,6 @@ package tests.mapping.types.parameterizedTypes import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.ParameterizedType import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt index 845fdca..8093128 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt @@ -1,7 +1,7 @@ package tests.mapping.types.propertyAccessors import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals class A(private var foo: String) diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt index ef1a9ad..bf9d0eb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt @@ -2,6 +2,7 @@ package tests.mapping.types.supertypes import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import java.lang.reflect.ParameterizedType import java.lang.reflect.TypeVariable import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt index 91f5b63..97bbd3a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt @@ -1,7 +1,7 @@ package tests.mapping.types.topLevelFunctions import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt index 4d138dc..2a42cc8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt @@ -1,7 +1,7 @@ package tests.mapping.types.typeParameters import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import java.lang.reflect.TypeVariable import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt index 8e2813a..696e717 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt @@ -1,7 +1,7 @@ package tests.mapping.types.unit import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt index 653096f..2300d14 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt @@ -1,6 +1,6 @@ package tests.parameters.bigArity -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt index fef87c6..297f718 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt @@ -1,7 +1,6 @@ package tests.parameters.functionParameterNameAndIndex import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt index 742613e..73ce22a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt @@ -4,7 +4,7 @@ package tests.parameters.innerClassConstructor // Bound receivers not supported for now import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals class Outer(val s1: String) { diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt index c745092..78b926d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt @@ -1,7 +1,7 @@ package tests.parameters.instanceExtensionReceiverAndValueParameters import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt index 21ddf9d..ab95174 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt @@ -1,7 +1,6 @@ package tests.parameters.instanceParameterOfFakeOverride import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt index 316e3e2..164bf00 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt @@ -1,6 +1,5 @@ package tests.parameters.objectMemberReferences -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt index 145e56b..aef3fbc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt @@ -2,6 +2,7 @@ package tests.properties.privateClassVar import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt index d126cd1..8920249 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt @@ -2,6 +2,7 @@ package tests.properties.privateJvmStaticVarInObject import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* object Obj { @JvmStatic diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt index eb47682..9f0a384 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt @@ -2,6 +2,7 @@ package tests.properties.privatePropertyCallIsAccessibleOnAccessors import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt index a8a465e..6fcc732 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt @@ -6,6 +6,7 @@ package tests.lambdaClasses.reflectOnLambdaInSuspend import helpers.* import kotlinx.reflect.lite.* import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.coroutines.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt index c6bc3f7..20abfb3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt @@ -1,7 +1,6 @@ package tests.mapping.methodsFromObject import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.jvm.* import kotlin.test.assertEquals From c127e58edc1abce11e13a12f9e19deeeb74aca4d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 14:47:57 +0200 Subject: [PATCH 70/74] Cleanup build infra --- build.gradle.kts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e7be224..94a6ae2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,18 +5,17 @@ plugins { } repositories { - mavenLocal() mavenCentral() gradlePluginPortal() + mavenLocal() } dependencies { implementation("com.google.protobuf:protobuf-java:2.6.1") implementation("org.jetbrains.kotlin:kotlin-stdlib") - testImplementation("org.jetbrains.kotlin:kotlin-stdlib") testImplementation("org.jetbrains.kotlin:kotlin-test") implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.4.2") - testImplementation("junit:junit:4.12") + testImplementation("junit:junit:4.13") } java { From 598dae3d3ec04f813e36bacadc9bf45dc9e8f280 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 30 Aug 2022 15:55:09 +0200 Subject: [PATCH 71/74] Move corresponding declarations to full package, add -no-reflect --- build.gradle.kts | 6 ++++++ .../kotlinx/reflect/lite/{impl => full}/KCallables.kt | 4 ++-- .../reflect/lite/{impl => full}/KCallablesJvm.kt | 10 ++++++---- .../kotlinx/reflect/lite/{impl => full}/KClasses.kt | 8 ++++---- src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt | 2 +- .../lite/testData/call/accessPrivateProperties.kt | 2 +- .../lite/testData/call/cannotCallEnumConstructor.kt | 3 +-- .../lite/testData/call/incorrectNumberOfArguments.kt | 2 +- .../reflect/lite/testData/call/protectedMembers.kt | 2 +- .../reflect/lite/testData/callSuspend/bigArity.kt | 2 +- .../reflect/lite/testData/callSuspend/callSuspend.kt | 3 +-- .../testData/callSuspend/primitiveSuspendFunctions.kt | 2 +- .../lite/testData/constructors/primaryConstructor.kt | 2 +- .../callPrivatePropertyFromGetProperties.kt | 2 +- .../properties/isAccessible/privateClassVal.kt | 2 +- .../properties/isAccessible/privateClassVar.kt | 2 +- .../isAccessible/privateJvmStaticVarInObject.kt | 2 +- .../privatePropertyCallIsAccessibleOnAccessors.kt | 2 +- .../properties/isAccessible/privateToThisAccessors.kt | 2 +- .../properties/isAccessible/protectedClassVar.kt | 2 +- .../isAccessible/publicClassValAccessible.kt | 2 +- .../lambdaClasses/reflectOnLambdaInSuspend.kt | 2 +- 22 files changed, 36 insertions(+), 30 deletions(-) rename src/main/java/kotlinx/reflect/lite/{impl => full}/KCallables.kt (90%) rename src/main/java/kotlinx/reflect/lite/{impl => full}/KCallablesJvm.kt (90%) rename src/main/java/kotlinx/reflect/lite/{impl => full}/KClasses.kt (67%) diff --git a/build.gradle.kts b/build.gradle.kts index 94a6ae2..5de094a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,6 +23,12 @@ java { targetCompatibility = JavaVersion.VERSION_1_8 } +tasks.compileKotlin { + kotlinOptions { + freeCompilerArgs += listOf("-no-reflect") + } +} + publishing { publications.create("maven") { from(components["java"]) diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt b/src/main/java/kotlinx/reflect/lite/full/KCallables.kt similarity index 90% rename from src/main/java/kotlinx/reflect/lite/impl/KCallables.kt rename to src/main/java/kotlinx/reflect/lite/full/KCallables.kt index 4d968d7..4b210b2 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallables.kt +++ b/src/main/java/kotlinx/reflect/lite/full/KCallables.kt @@ -1,6 +1,6 @@ @file:JvmName("KCallables") -package kotlinx.reflect.lite.impl +package kotlinx.reflect.lite.full import kotlinx.reflect.lite.* import kotlin.coroutines.intrinsics.* @@ -10,7 +10,7 @@ import kotlin.coroutines.intrinsics.* * Otherwise, calls the suspend function with current continuation. */ @SinceKotlin("1.3") -suspend fun KCallable.callSuspend(vararg args: Any?): R { +public suspend fun KCallable.callSuspend(vararg args: Any?): R { if (!this.isSuspend) return call(*args) if (this !is KFunction<*>) throw IllegalArgumentException("Cannot callSuspend on a property $this: suspend properties are not supported yet") val result = suspendCoroutineUninterceptedOrReturn { call(*args, it) } diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt b/src/main/java/kotlinx/reflect/lite/full/KCallablesJvm.kt similarity index 90% rename from src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt rename to src/main/java/kotlinx/reflect/lite/full/KCallablesJvm.kt index f40dee2..ccf07a1 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallablesJvm.kt +++ b/src/main/java/kotlinx/reflect/lite/full/KCallablesJvm.kt @@ -1,10 +1,12 @@ -// Copied from: https://github.com/JetBrains/kotlin/blob/a7c80f2df1fb3efdb139914a36d37692574f0034/core/reflection.jvm/src/kotlin/reflect/jvm/KCallablesJvm.kt @file:JvmName("KCallablesJvm") -package kotlinx.reflect.lite.impl + +package kotlinx.reflect.lite.full import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.impl.KCallableImpl import kotlinx.reflect.lite.jvm.* -import java.lang.reflect.AccessibleObject +import java.lang.reflect.* /** * Provides a way to suppress JVM access checks for a callable. @@ -17,7 +19,7 @@ import java.lang.reflect.AccessibleObject * * @see [java.lang.reflect.AccessibleObject] */ -var KCallable<*>.isAccessible: Boolean +public var KCallable<*>.isAccessible: Boolean get() { return when (this) { is KMutableProperty -> diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt b/src/main/java/kotlinx/reflect/lite/full/KClasses.kt similarity index 67% rename from src/main/java/kotlinx/reflect/lite/impl/KClasses.kt rename to src/main/java/kotlinx/reflect/lite/full/KClasses.kt index c58832c..3fa7fe8 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClasses.kt +++ b/src/main/java/kotlinx/reflect/lite/full/KClasses.kt @@ -1,9 +1,10 @@ @file:JvmName("KClasses") -package kotlinx.reflect.lite.impl +package kotlinx.reflect.lite.full import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.descriptors.* +import kotlinx.reflect.lite.descriptors.ConstructorDescriptor +import kotlinx.reflect.lite.impl.KFunctionImpl /** * Returns the primary constructor of this class, or `null` if this class has no primary constructor. @@ -11,6 +12,5 @@ import kotlinx.reflect.lite.descriptors.* * for more information. */ @SinceKotlin("1.1") -val KClass.primaryConstructor: KFunction? +public val KClass.primaryConstructor: KFunction? get() = constructors.firstOrNull { ((it as KFunctionImpl).descriptor as ConstructorDescriptor).isPrimary } - diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index a9d3e04..1d925d3 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -98,7 +98,7 @@ fun KType.computeJavaType(): Type { * The returned list starts with the arguments to the innermost class, then continues with those of its outer class, and so on. * For example, for the type `Outer.Inner` the result would be `[C, D, A, B]`. */ -val Type.parameterizedTypeArguments: List +internal val Type.parameterizedTypeArguments: List get() { if (this !is ParameterizedType) return emptyList() if (ownerType == null) return actualTypeArguments.toList() diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt index 9589d15..6a780b6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt @@ -1,7 +1,7 @@ package tests.call.accessPrivateProperties import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.reflect.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt index 0c05d57..2bc7e1f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -1,7 +1,6 @@ package tests.call.cannotCallEnumConstructor -import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index b8cbbd1..c27096e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -1,7 +1,7 @@ package tests.call.incorrectNumberOfArguments import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index 8085728..9a56e9c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -1,7 +1,7 @@ package tests.call.protectedMembers import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt index 33c4fc0..c0072bc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt @@ -1,7 +1,7 @@ package tests.callSuspend.bigArity import helpers.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlin.coroutines.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt index 9718260..4d702bd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt @@ -5,8 +5,7 @@ package tests.callSuspend.callSuspend // TARGET_BACKEND: JVM import helpers.* -import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.coroutines.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt index 9b3cba1..272b4e8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt @@ -3,7 +3,7 @@ package tests.callSuspend.primitiveSuspendFunctions import kotlin.coroutines.startCoroutine import kotlin.test.assertEquals import helpers.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt index 9b1c6a6..5acd7fe 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt @@ -2,7 +2,7 @@ package tests.constructors.primaryConstructor import kotlin.test.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt index dcb6fd9..4b62355 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt @@ -1,7 +1,7 @@ package tests.properties.callPrivatePropertyFromGetProperties import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt index b8fb353..2a2ce9f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt @@ -1,7 +1,7 @@ package tests.properties.privateClassVal import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt index aef3fbc..51ef63a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt @@ -1,7 +1,7 @@ package tests.properties.privateClassVar import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt index 8920249..f9d2b52 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt @@ -1,7 +1,7 @@ package tests.properties.privateJvmStaticVarInObject import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* object Obj { diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt index 9f0a384..65eef3f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt @@ -1,7 +1,7 @@ package tests.properties.privatePropertyCallIsAccessibleOnAccessors import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt index 89f8c71..5be531e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt @@ -1,7 +1,7 @@ package tests.properties.privateToThisAccessors -import kotlinx.reflect.lite.impl.* import kotlinx.reflect.lite.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt index 9158a1a..13a064b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt @@ -1,7 +1,7 @@ package tests.properties.protectedClassVar import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt index 97112c3..3ae636f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt @@ -1,7 +1,7 @@ package tests.properties.publicClassValAccessible import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt index 6fcc732..0b68ca1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt @@ -5,7 +5,7 @@ package tests.lambdaClasses.reflectOnLambdaInSuspend import helpers.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.impl.* +import kotlinx.reflect.lite.full.* import kotlinx.reflect.lite.jvm.* import kotlinx.reflect.lite.tests.* import kotlin.coroutines.* From 27b7642e4ce6587c72c18e6947b80b9dfff63eac Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 30 Aug 2022 17:27:59 +0200 Subject: [PATCH 72/74] Documentation for KPackage --- src/main/java/kotlinx/reflect/lite/KPackage.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/kotlinx/reflect/lite/KPackage.kt b/src/main/java/kotlinx/reflect/lite/KPackage.kt index d19aa93..7a47f5b 100644 --- a/src/main/java/kotlinx/reflect/lite/KPackage.kt +++ b/src/main/java/kotlinx/reflect/lite/KPackage.kt @@ -1,4 +1,8 @@ package kotlinx.reflect.lite -// TODO document it +/** + * Represents a Kotlin class file that is a compiled Kotlin file facade or multi-file class part. + * + * @param T the type of the class. + */ public interface KPackage : KDeclarationContainer From 989f2a4c1420028a8ac4c1d236c90e86e5ca8095 Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 30 Aug 2022 18:09:47 +0200 Subject: [PATCH 73/74] ReflectJvmMapping: fixed KPackage creation + public modifiers --- src/main/java/kotlinx/reflect/lite/KClass.kt | 2 - .../reflect/lite/impl/ReflectionLiteImpl.kt | 8 +-- .../reflect/lite/jvm/ReflectJvmMapping.kt | 65 +++++++------------ 3 files changed, 28 insertions(+), 47 deletions(-) diff --git a/src/main/java/kotlinx/reflect/lite/KClass.kt b/src/main/java/kotlinx/reflect/lite/KClass.kt index ec49f3a..0f3b554 100644 --- a/src/main/java/kotlinx/reflect/lite/KClass.kt +++ b/src/main/java/kotlinx/reflect/lite/KClass.kt @@ -1,7 +1,5 @@ package kotlinx.reflect.lite -import kotlinx.reflect.lite.descriptors.* -import kotlinx.reflect.lite.descriptors.ClassDescriptor import kotlinx.reflect.lite.misc.* /** diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 6a9ddff..7622ff8 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -24,10 +24,10 @@ import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.misc.* internal object ReflectionLiteImpl { - fun loadClassMetadata(jClass: Class): KDeclarationContainer { - return when (val kind = jClass.getMetadataAnnotation()?.kind) { - null, 1 -> KClassImpl(createClassDescriptor(jClass, kind)) - 2 -> KPackageImpl(PackageDescriptorImpl(jClass)) + fun createKotlinDeclarationContainer(jClass: Class): KDeclarationContainer { + return when (jClass.getMetadataAnnotation()?.kind) { + null, KotlinClassHeader.CLASS_KIND -> createKotlinClass(jClass) + KotlinClassHeader.FILE_FACADE_KIND, KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND -> createKotlinPackage(jClass) else -> throw KotlinReflectionInternalError("Can not load class metadata for $jClass") } } diff --git a/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt index e804f1e..42e78f7 100644 --- a/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt @@ -3,9 +3,7 @@ // Some logic copied from: https://github.com/JetBrains/kotlin/blob/26cdb2f928982dad7f0c9ab8e3bd509665d9d537/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt package kotlinx.reflect.lite.jvm -import kotlinx.metadata.jvm.* import kotlinx.reflect.lite.* -import kotlinx.reflect.lite.descriptors.impl.* import kotlinx.reflect.lite.impl.* import java.lang.reflect.* @@ -15,28 +13,28 @@ import java.lang.reflect.* * Returns a Java [Field] instance corresponding to the backing field of the given property, * or `null` if the property has no backing field. */ -val KProperty<*>.javaField: Field? +public val KProperty<*>.javaField: Field? get() = (this as? KPropertyImpl)?.descriptor?.javaField /** * Returns a Java [Method] instance corresponding to the getter of the given property, * or `null` if the property has no getter, for example in case of a simple private `val` in a class. */ -val KProperty<*>.javaGetter: Method? +public val KProperty<*>.javaGetter: Method? get() = getter.javaMethod /** * Returns a Java [Method] instance corresponding to the setter of the given mutable property, * or `null` if the property has no setter, for example in case of a simple private `var` in a class. */ -val KMutableProperty<*>.javaSetter: Method? +public val KMutableProperty<*>.javaSetter: Method? get() = setter.javaMethod /** * Returns a Java [Method] instance corresponding to the given Kotlin function, * or `null` if this function is a constructor or cannot be represented by a Java [Method]. */ -val KFunction<*>.javaMethod: Method? +public val KFunction<*>.javaMethod: Method? get() = (this as? KCallableImpl<*>)?.let { return it.descriptor.caller.member as? Method } @@ -46,20 +44,19 @@ val KFunction<*>.javaMethod: Method? * or `null` if this function is not a constructor or cannot be represented by a Java [Constructor]. */ @Suppress("UNCHECKED_CAST") -val KFunction.javaConstructor: Constructor? +public val KFunction.javaConstructor: Constructor? get() = (this as? KCallableImpl<*>)?.let { return it.descriptor.caller.member as? Constructor } // Java reflection -> Kotlin reflection - /** * Returns a [KClass] instance representing the companion object of a given class, * or `null` if the class doesn't have a companion object. */ @SinceKotlin("1.1") -val KDeclarationContainer.companionObject: KClass<*>? +public val KDeclarationContainer.companionObject: KClass<*>? get() { if (this !is KClass<*>) return null return nestedClasses.firstOrNull { @@ -72,50 +69,24 @@ val KDeclarationContainer.companionObject: KClass<*>? * Note that one Kotlin type may correspond to different JVM types depending on where it appears. For example, [Unit] corresponds to * the JVM class [Unit] when it's the type of a parameter, or to `void` when it's the return type of a function. */ -val KType.javaType: Type +public val KType.javaType: Type get() = (this as KTypeImpl).javaType ?: this.computeJavaType() -/** - * Returns a [KDeclarationContainer] instance representing a Kotlin class or package. - */ -internal val Class.kDeclarationContainer: KDeclarationContainer - get() = ReflectionLiteImpl.loadClassMetadata(this) - -private fun Member.getKPackage(): KDeclarationContainer? = - when (declaringClass.getAnnotation(Metadata::class.java)?.kind) { - KotlinClassHeader.FILE_FACADE_KIND, KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND -> KPackageImpl( - PackageDescriptorImpl(declaringClass) - ) - else -> null - } - /** * Returns a [KProperty] instance corresponding to the given Java [Field] instance, * or `null` if this field cannot be represented by a Kotlin property * (for example, if it is a synthetic field). */ -val Field.kotlinProperty: KProperty<*>? - get() { - if (isSynthetic) return null - val kotlinPackage = getKPackage() - if (kotlinPackage != null) { - return kotlinPackage.members.filterIsInstance>().firstOrNull { it.name == this.name } - } - return declaringClass.kDeclarationContainer.members.filterIsInstance>().firstOrNull { it.name == this.name } - } +public val Field.kotlinProperty: KProperty<*>? + get() = if (isSynthetic) null else declaringClass.kDeclarationContainer.getPropertyByName(this.name) /** * Returns a [KFunction] instance corresponding to the given Java [Method] instance, * or `null` if this method cannot be represented by a Kotlin function. */ -val Method.kotlinFunction: KFunction<*>? +public val Method.kotlinFunction: KFunction<*>? get() { if (Modifier.isStatic(modifiers)) { - val kotlinPackage = getKPackage() - if (kotlinPackage != null) { - return kotlinPackage.members.filterIsInstance>().firstOrNull { it.name == this.name } - } - // For static bridge method generated for a @JvmStatic function in the companion object, also try to find the latter val companion = declaringClass.kDeclarationContainer.companionObject if (companion != null) { @@ -124,7 +95,7 @@ val Method.kotlinFunction: KFunction<*>? }?.let { return it } } } - return declaringClass.kDeclarationContainer.members.filterIsInstance>().firstOrNull { it.name == this.name } + return declaringClass.kDeclarationContainer.getFunctionByName(this.name) } /** @@ -132,7 +103,19 @@ val Method.kotlinFunction: KFunction<*>? * or `null` if this constructor cannot be represented by a Kotlin function * (for example, if it is a synthetic constructor). */ -val Constructor.kotlinFunction: KFunction? +public val Constructor.kotlinFunction: KFunction? get() { return (declaringClass.kotlin).constructors.firstOrNull { it.javaConstructor == this } } + +/** + * Returns a [KDeclarationContainer] instance representing a Kotlin class or package. + */ +internal val Class.kDeclarationContainer: KDeclarationContainer + get() = ReflectionLiteImpl.createKotlinDeclarationContainer(this) + +private fun KDeclarationContainer.getPropertyByName(name: String) = + members.filterIsInstance>().firstOrNull { it.name == name } + +private fun KDeclarationContainer.getFunctionByName(name: String) = + members.filterIsInstance>().firstOrNull { it.name == name } From 6670c25cf2106ede5f4751451e173f3a9bae49cf Mon Sep 17 00:00:00 2001 From: mvicsokolova Date: Tue, 30 Aug 2022 19:12:20 +0200 Subject: [PATCH 74/74] Update Copyright notes --- build.gradle.kts | 4 ++++ gradle.properties | 4 ++++ gradle/wrapper/gradle-wrapper.properties | 4 ++++ gradlew | 14 +------------- settings.gradle.kts | 6 +++++- .../java/kotlinx/reflect/lite/KAnnotatedElement.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/KCallable.kt | 3 +-- src/main/java/kotlinx/reflect/lite/KClass.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/KClassifier.kt | 6 +++++- .../kotlinx/reflect/lite/KDeclarationContainer.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/KFunction.kt | 3 +-- src/main/java/kotlinx/reflect/lite/KPackage.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/KParameter.kt | 14 +------------- src/main/java/kotlinx/reflect/lite/KProperty.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/KType.kt | 3 +-- .../java/kotlinx/reflect/lite/KTypeParameter.kt | 6 +++++- .../java/kotlinx/reflect/lite/KTypeProjection.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/KVariance.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/KVisibility.kt | 4 ++++ .../reflect/lite/builtins/JavaToKotlinClassMap.kt | 4 ++++ .../java/kotlinx/reflect/lite/builtins/JvmAbi.kt | 4 ++++ .../reflect/lite/builtins/JvmPrimitiveType.kt | 4 ++++ .../reflect/lite/builtins/KotlinBuiltIns.kt | 4 ++++ .../kotlinx/reflect/lite/builtins/PrimitiveType.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/calls/Caller.kt | 4 ++++ .../java/kotlinx/reflect/lite/calls/CallerImpl.kt | 4 ++++ .../reflect/lite/descriptors/descriptors.kt | 4 ++++ .../descriptors/impl/AbstractCallableDescriptor.kt | 4 ++++ ...ClassBasedDeclarationContainerDescriptorImpl.kt | 4 ++++ .../lite/descriptors/impl/ClassDescriptorImpl.kt | 4 ++++ .../descriptors/impl/ConstructorDescriptorImpl.kt | 4 ++++ .../descriptors/impl/FunctionDescriptorImpl.kt | 4 ++++ .../reflect/lite/descriptors/impl/KotlinType.kt | 4 ++++ .../lite/descriptors/impl/ModuleDescriptorImpl.kt | 4 ++++ .../lite/descriptors/impl/PackageDescriptorImpl.kt | 4 ++++ .../descriptors/impl/PropertyDescriptorImpl.kt | 4 ++++ .../impl/ReceiverParameterDescriptorImpl.kt | 4 ++++ .../impl/TypeParameterDescriptorImpl.kt | 4 ++++ .../impl/ValueParameterDescriptorImpl.kt | 4 ++++ .../java/kotlinx/reflect/lite/descriptors/util.kt | 4 ++++ .../java/kotlinx/reflect/lite/full/KCallables.kt | 4 ++++ .../kotlinx/reflect/lite/full/KCallablesJvm.kt | 4 ++++ .../java/kotlinx/reflect/lite/full/KClasses.kt | 4 ++++ .../kotlinx/reflect/lite/impl/KCallableImpl.kt | 4 ++++ .../java/kotlinx/reflect/lite/impl/KClassImpl.kt | 4 ++++ .../reflect/lite/impl/KDeclarationContainerImpl.kt | 4 ++++ .../kotlinx/reflect/lite/impl/KFunctionImpl.kt | 4 ++++ .../java/kotlinx/reflect/lite/impl/KPackageImpl.kt | 4 ++++ .../kotlinx/reflect/lite/impl/KParameterImpl.kt | 4 ++++ .../kotlinx/reflect/lite/impl/KPropertyImpl.kt | 4 ++++ .../java/kotlinx/reflect/lite/impl/KTypeImpl.kt | 4 ++++ .../reflect/lite/impl/KTypeParameterImpl.kt | 6 +++++- .../lite/impl/KotlinReflectionInternalError.kt | 4 ++++ .../reflect/lite/impl/ReflectionLiteImpl.kt | 14 +------------- src/main/java/kotlinx/reflect/lite/impl/util.kt | 4 ++++ .../kotlinx/reflect/lite/jvm/JvmClassMapping.kt | 4 ++++ .../kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt | 4 ++++ .../reflect/lite/misc/CompanionObjectMapping.kt | 4 ++++ .../kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/misc/util.kt | 4 ++++ src/main/java/kotlinx/reflect/lite/name/names.kt | 4 ++++ src/test/java/kotlinx/reflect/lite/helpers.kt | 4 ++++ .../lite/testData/call/accessPrivateProperties.kt | 4 ++++ .../kotlinx/reflect/lite/testData/call/bigArity.kt | 4 ++++ .../testData/call/cannotCallEnumConstructor.kt | 4 ++++ .../lite/testData/call/equalsHashCodeToString.kt | 4 ++++ .../lite/testData/call/exceptionHappened.kt | 4 ++++ .../reflect/lite/testData/call/fakeOverride.kt | 4 ++++ .../lite/testData/call/fakeOverrideSubstituted.kt | 4 ++++ .../testData/call/incorrectNumberOfArguments.kt | 4 ++++ .../lite/testData/call/innerClassConstructor.kt | 4 ++++ .../reflect/lite/testData/call/jvmStatic.kt | 4 ++++ .../call/jvmStaticInObjectIncorrectReceiver.kt | 4 ++++ .../reflect/lite/testData/call/localClassMember.kt | 4 ++++ .../lite/testData/call/memberOfGenericClass.kt | 4 ++++ ...pertyGetterAndGetFunctionDifferentReturnType.kt | 4 ++++ .../reflect/lite/testData/call/protectedMembers.kt | 4 ++++ .../reflect/lite/testData/call/returnUnit.kt | 4 ++++ .../lite/testData/call/simpleConstructor.kt | 4 ++++ .../lite/testData/call/simpleMemberFunction.kt | 4 ++++ .../lite/testData/call/simpleTopLevelFunctions.kt | 4 ++++ .../testData/callBy/boundExtensionFunctionWA.kt | 4 ++++ .../callBy/boundExtensionPropertyAcessorWA.kt | 4 ++++ .../testData/callBy/boundJvmStaticInObjectWA.kt | 4 ++++ .../lite/testData/callBy/companionObject.kt | 4 ++++ .../callBy/defaultAndNonDefaultIntertwined.kt | 4 ++++ .../callBy/defaultInSuperClassFakeOverride.kt | 4 ++++ .../lite/testData/callBy/extensionFunction.kt | 4 ++++ .../testData/callBy/jvmStaticInCompanionObject.kt | 4 ++++ .../lite/testData/callBy/jvmStaticInObject.kt | 4 ++++ .../callBy/manyArgumentsNoneDefaultConstructor.kt | 4 ++++ .../callBy/manyArgumentsNoneDefaultFunction.kt | 4 ++++ .../testData/callBy/manyArgumentsOnlyOneDefault.kt | 4 ++++ .../lite/testData/callBy/manyMaskArguments.kt | 4 ++++ .../testData/callBy/nonDefaultParameterOmitted.kt | 4 ++++ .../reflect/lite/testData/callBy/nullValue.kt | 4 ++++ ...aryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt | 4 ++++ .../lite/testData/callBy/primitiveDefaultValues.kt | 4 ++++ .../lite/testData/callBy/simpleConstructor.kt | 4 ++++ .../lite/testData/callBy/simpleMemberFunciton.kt | 4 ++++ .../lite/testData/callBy/simpleTopLevelFunction.kt | 4 ++++ .../reflect/lite/testData/callSuspend/bigArity.kt | 4 ++++ .../lite/testData/callSuspend/callSuspend.kt | 4 ++++ .../callSuspend/primitiveSuspendFunctions.kt | 4 ++++ .../reflect/lite/testData/classes/classMembers.kt | 4 ++++ .../lite/testData/classes/classSimpleName.kt | 4 ++++ .../lite/testData/classes/localClassSimpleName.kt | 4 ++++ .../reflect/lite/testData/classes/nestedClasses.kt | 4 ++++ .../reflect/lite/testData/classes/qualifiedName.kt | 4 ++++ .../classes/qualifiedNameOfStandardClasses.kt | 4 ++++ .../lite/testData/classes/sealedSubclasses.kt | 4 ++++ .../constructors/classesWithoutConstructors.kt | 4 ++++ .../lite/testData/constructors/constructorName.kt | 4 ++++ .../testData/constructors/primaryConstructor.kt | 4 ++++ .../testData/constructors/simpleGetConstructors.kt | 4 ++++ .../reflect/lite/testData/mapping/constructor.kt | 4 ++++ .../lite/testData/mapping/extensionProperty.kt | 4 ++++ .../reflect/lite/testData/mapping/functions.kt | 4 ++++ .../lite/testData/mapping/inlineReifiedFun.kt | 4 ++++ .../interfaceCompanionPropertyWithJvmField.kt | 4 ++++ .../lite/testData/mapping/lateinitProperty.kt | 4 ++++ .../lite/testData/mapping/memberProperty.kt | 4 ++++ .../methodsFromObjectWithoutCustomMembers.kt | 4 ++++ .../testData/mapping/methodsFromSuperInterface.kt | 4 ++++ .../lite/testData/mapping/privateProperty.kt | 4 ++++ .../mapping/propertyAccessorsWithJvmName.kt | 4 ++++ .../lite/testData/mapping/syntheticFields.kt | 4 ++++ .../lite/testData/mapping/topLevelProperty.kt | 4 ++++ .../reflect/lite/testData/mapping/types/array.kt | 4 ++++ .../lite/testData/mapping/types/constructors.kt | 4 ++++ .../mapping/types/genericArrayElementType.kt | 4 ++++ .../lite/testData/mapping/types/memberFunctions.kt | 4 ++++ .../mapping/types/parameterizedTypeArgument.kt | 4 ++++ .../testData/mapping/types/parameterizedTypes.kt | 4 ++++ .../testData/mapping/types/propertyAccessors.kt | 4 ++++ .../lite/testData/mapping/types/supertypes.kt | 4 ++++ .../testData/mapping/types/topLevelFunctions.kt | 4 ++++ .../lite/testData/mapping/types/typeParameters.kt | 4 ++++ .../reflect/lite/testData/mapping/types/unit.kt | 4 ++++ .../reflect/lite/testData/parameters/bigArity.kt | 4 ++++ .../parameters/functionParameterNameAndIndex.kt | 4 ++++ .../testData/parameters/innerClassConstructor.kt | 4 ++++ .../instanceExtensionReceiverAndValueParameters.kt | 4 ++++ .../parameters/instanceParameterOfFakeOverride.kt | 4 ++++ .../lite/testData/parameters/isMarkedNullable.kt | 4 ++++ .../reflect/lite/testData/parameters/isOptional.kt | 4 ++++ .../reflect/lite/testData/parameters/kinds.kt | 4 ++++ .../testData/parameters/objectMemberReferences.kt | 4 ++++ .../lite/testData/parameters/propertySetter.kt | 4 ++++ .../reflect/lite/testData/parameters/references.kt | 4 ++++ .../accessors/extensionPropertyAccessors.kt | 4 ++++ .../accessors/memberPropertyAccessors.kt | 4 ++++ .../accessors/topLevelPropertyAccessors.kt | 4 ++++ .../lite/testData/properties/invokeKProperty.kt | 4 ++++ .../callPrivatePropertyFromGetProperties.kt | 4 ++++ .../properties/isAccessible/privateClassVal.kt | 4 ++++ .../properties/isAccessible/privateClassVar.kt | 4 ++++ .../isAccessible/privateJvmStaticVarInObject.kt | 4 ++++ .../privatePropertyCallIsAccessibleOnAccessors.kt | 4 ++++ .../isAccessible/privateToThisAccessors.kt | 4 ++++ .../properties/isAccessible/protectedClassVar.kt | 4 ++++ .../isAccessible/publicClassValAccessible.kt | 4 ++++ .../propertyOfNestedClassAndArrayType.kt | 4 ++++ .../testData/properties/simpleGetProperties.kt | 4 ++++ .../kotlinx/reflect/lite/tests/CallSuspendTest.kt | 4 ++++ .../kotlinx/reflect/lite/tests/KCallableTest.kt | 4 ++++ .../java/kotlinx/reflect/lite/tests/KClassTest.kt | 4 ++++ .../kotlinx/reflect/lite/tests/KParameterTest.kt | 4 ++++ .../kotlinx/reflect/lite/tests/KPropertyTest.kt | 4 ++++ .../java/kotlinx/reflect/lite/tests/MappingTest.kt | 4 ++++ .../java/kotlinx/reflect/lite/tests/testUtil.kt | 4 ++++ .../annotations/annotationRetentionAnnotation.kt | 6 +++++- .../annotations/genericExtensionProperty.kt | 6 +++++- .../annotations/localClassLiteral.kt | 6 +++++- .../annotations/onTypes/arrayKClass.kt | 6 +++++- .../onTypes/classLiteralWithExpectedType.kt | 6 +++++- .../annotations/onTypes/differentArgumentTypes.kt | 6 +++++- .../annotations/onTypes/differentPositions.kt | 6 +++++- .../annotations/privateAnnotation.kt | 6 +++++- .../annotations/propertyAccessors.kt | 6 +++++- .../annotations/propertyWithoutBackingField.kt | 6 +++++- .../lite/unusedTestData/annotations/retentions.kt | 6 +++++- .../lite/unusedTestData/annotations/setparam.kt | 6 +++++- .../annotations/simpleClassAnnotation.kt | 6 +++++- .../annotations/simpleConstructorAnnotation.kt | 6 +++++- .../annotations/simpleFunAnnotation.kt | 6 +++++- .../annotations/simpleParamAnnotation.kt | 6 +++++- .../annotations/simpleValAnnotation.kt | 6 +++++- .../lite/unusedTestData/builtins/collections.kt | 6 +++++- .../unusedTestData/builtins/enumNameOrdinal.kt | 6 +++++- .../lite/unusedTestData/builtins/stringLength.kt | 6 +++++- .../call/bound/companionObjectPropertyAccessors.kt | 6 +++++- .../unusedTestData/call/bound/extensionFunction.kt | 6 +++++- .../call/bound/extensionPropertyAccessors.kt | 6 +++++- .../call/bound/innerClassConstructor.kt | 6 +++++- .../jvmStaticCompanionObjectPropertyAccessors.kt | 6 +++++- .../call/bound/jvmStaticObjectFunction.kt | 6 +++++- .../call/bound/jvmStaticObjectPropertyAccessors.kt | 6 +++++- .../unusedTestData/call/bound/memberFunction.kt | 4 ++++ .../call/bound/memberPropertyAccessors.kt | 6 +++++- .../unusedTestData/call/bound/objectFunction.kt | 6 +++++- .../call/bound/objectPropertyAccessors.kt | 6 +++++- .../constructorWithInlineClassParameters.kt | 4 ++++ .../call/inlineClasses/fieldAccessors.kt | 6 +++++- .../functionsWithInlineClassParameters.kt | 6 +++++- .../call/inlineClasses/inlineClassConstructor.kt | 6 +++++- .../internalPrimaryValOfInlineClass.kt | 6 +++++- .../call/inlineClasses/jvmStaticFieldInObject.kt | 6 +++++- .../call/inlineClasses/jvmStaticFunction.kt | 6 +++++- .../inlineClasses/nonOverridingFunOfInlineClass.kt | 6 +++++- .../inlineClasses/nonOverridingVarOfInlineClass.kt | 6 +++++- .../inlineClasses/overridingFunOfInlineClass.kt | 6 +++++- .../inlineClasses/overridingVarOfInlineClass.kt | 6 +++++- .../call/inlineClasses/primaryValOfInlineClass.kt | 6 +++++- .../call/inlineClasses/properties.kt | 6 +++++- .../callBy/boundExtensionFunction.kt | 6 +++++- .../callBy/boundExtensionPropertyAcessor.kt | 6 +++++- .../callBy/boundJvmStaticInObject.kt | 4 ++++ .../unusedTestData/callBy/defaultInSuperClass.kt | 6 +++++- .../callBy/defaultInSuperInterface.kt | 6 +++++- .../lite/unusedTestData/callBy/emptyVarArg.kt | 6 +++++- .../callBy/inlineClassDefaultArguments.kt | 6 +++++- .../callBy/inlineClassFunctionsAndConstructors.kt | 6 +++++- .../unusedTestData/callBy/inlineClassMembers.kt | 6 +++++- .../classLiterals/annotationClassLiteral.kt | 6 +++++- .../lite/unusedTestData/classLiterals/arrays.kt | 6 +++++- .../lite/unusedTestData/classLiterals/bareArray.kt | 6 +++++- .../classLiterals/builtinClassLiterals.kt | 6 +++++- .../unusedTestData/classLiterals/genericArrays.kt | 6 +++++- .../unusedTestData/classLiterals/genericClass.kt | 6 +++++- .../unusedTestData/classLiterals/lambdaClass.kt | 4 ++++ .../classLiterals/reifiedTypeClassLiteral.kt | 6 +++++- .../lite/unusedTestData/classes/companionObject.kt | 6 +++++- .../lite/unusedTestData/classes/createInstance.kt | 6 +++++- .../lite/unusedTestData/classes/javaVoid.kt | 6 +++++- .../reflect/lite/unusedTestData/classes/jvmName.kt | 4 ++++ .../classes/jvmNameOfStandardClasses.kt | 6 +++++- .../lite/unusedTestData/classes/objectInstance.kt | 6 +++++- .../classes/primitiveKClassEquality.kt | 6 +++++- .../unusedTestData/classes/starProjectedType.kt | 6 +++++- .../lite/unusedTestData/constructors/enumEntry.kt | 4 ++++ .../createAnnotation/annotationType.kt | 6 +++++- .../createAnnotation/arrayOfKClasses.kt | 6 +++++- .../createJdkAnnotationInstance.kt | 6 +++++- .../createAnnotation/enumKClassAnnotation.kt | 6 +++++- .../createAnnotation/equalsHashCodeToString.kt | 6 +++++- .../createAnnotation/floatingPointParameters.kt | 6 +++++- .../createAnnotation/parameterNamedEquals.kt | 6 +++++- .../createAnnotation/primitivesAndArrays.kt | 6 +++++- .../unusedTestData/functions/enumValuesValueOf.kt | 6 +++++- .../unusedTestData/functions/functionFromStdlib.kt | 6 +++++- .../functions/genericOverriddenFunction.kt | 6 +++++- .../functions/isAccessibleOnAllMembers.kt | 6 +++++- .../lite/unusedTestData/functions/platformName.kt | 6 +++++- .../lite/unusedTestData/functions/simpleNames.kt | 6 +++++- .../isInstance/isInstanceCastAndSafeCast.kt | 6 +++++- .../unusedTestData/kClassInAnnotation/array.kt | 6 +++++- .../unusedTestData/kClassInAnnotation/basic.kt | 6 +++++- .../unusedTestData/kClassInAnnotation/checkcast.kt | 6 +++++- .../kClassInAnnotation/forceWrapping.kt | 6 +++++- .../unusedTestData/kClassInAnnotation/vararg.kt | 6 +++++- .../wrappingForCallableReferences.kt | 6 +++++- .../lambdaClasses/parameterNamesAndNullability.kt | 6 +++++- .../reflectOnDefaultWithInlineClassArgument.kt | 6 +++++- .../reflectOnLambdaInArrayConstructor.kt | 6 +++++- .../lambdaClasses/reflectOnLambdaInConstructor.kt | 6 +++++- .../lambdaClasses/reflectOnLambdaInField.kt | 4 ++++ .../lambdaClasses/reflectOnLambdaInStaticField.kt | 6 +++++- .../lambdaClasses/reflectOnLambdaInSuspend.kt | 4 ++++ .../reflectOnLambdaInSuspendLambda.kt | 6 +++++- .../lambdaClasses/reflectOnSuspendLambdaInField.kt | 6 +++++- .../constructorWithInlineClassParameters.kt | 6 +++++- .../mapping/inlineClassPrimaryVal.kt | 6 +++++- .../mapping/inlineClasses/inlineClassPrimaryVal.kt | 6 +++++- .../suspendFunctionWithInlineClassInSignature.kt | 6 +++++- .../mapping/jvmStatic/companionObjectFunction.kt | 6 +++++- .../mapping/jvmStatic/objectFunction.kt | 6 +++++- .../mapping/mappedClassIsEqualToClassLiteral.kt | 6 +++++- .../unusedTestData/mapping/methodsFromObject.kt | 4 ++++ .../lite/unusedTestData/mapping/openSuspendFun.kt | 6 +++++- .../types/annotationConstructorParameters.kt | 6 +++++- .../mapping/types/inlineClassInSignature.kt | 6 +++++- .../mapping/types/inlineClassPrimaryVal.kt | 6 +++++- .../mapping/types/innerGenericTypeArgument.kt | 6 +++++- .../mapping/types/overrideAnyWithPrimitive.kt | 6 +++++- .../unusedTestData/mapping/types/suspendFun.kt | 6 +++++- ...CallableReferencesNotEqualToCallablesFromAPI.kt | 6 +++++- .../methodsFromAny/builtinFunctionsToString.kt | 6 +++++- .../callableReferencesEqualToCallablesFromAPI.kt | 6 +++++- .../unusedTestData/methodsFromAny/classToString.kt | 6 +++++- .../extensionPropertyReceiverToString.kt | 6 +++++- .../methodsFromAny/fakeOverrideEqualsHashCode.kt | 6 +++++- .../methodsFromAny/fakeOverrideToString.kt | 6 +++++- .../methodsFromAny/fakeOverrideToString2.kt | 6 +++++- .../methodsFromAny/functionEqualsHashCode.kt | 6 +++++- .../functionFromStdlibMultiFileFacade.kt | 6 +++++- .../functionFromStdlibSingleFileFacade.kt | 6 +++++- .../methodsFromAny/functionToString.kt | 6 +++++- .../methodsFromAny/parametersEqualsHashCode.kt | 6 +++++- .../parametersEqualsWithClearCaches.kt | 6 +++++- .../methodsFromAny/parametersToString.kt | 6 +++++- .../methodsFromAny/propertyEqualsHashCode.kt | 6 +++++- .../methodsFromAny/propertyToString.kt | 6 +++++- .../methodsFromAny/typeEqualsHashCode.kt | 6 +++++- .../methodsFromAny/typeParametersEqualsHashCode.kt | 6 +++++- .../methodsFromAny/typeParametersToString.kt | 6 +++++- .../unusedTestData/methodsFromAny/typeToString.kt | 6 +++++- .../methodsFromAny/typeToStringInnerGeneric.kt | 6 +++++- .../unusedTestData/modifiers/callableModality.kt | 6 +++++- .../unusedTestData/modifiers/callableVisibility.kt | 6 +++++- .../lite/unusedTestData/modifiers/classModality.kt | 6 +++++- .../unusedTestData/modifiers/classVisibility.kt | 6 +++++- .../lite/unusedTestData/modifiers/functions.kt | 6 +++++- .../lite/unusedTestData/modifiers/properties.kt | 6 +++++- .../unusedTestData/modifiers/typeParameters.kt | 6 +++++- .../parameters/boundInnerClassConstructor.kt | 4 ++++ .../parameters/boundObjectMemberReferences.kt | 6 +++++- .../unusedTestData/parameters/boundReferences.kt | 6 +++++- ...instanceExtensionReceiverAndValueParameters1.kt | 4 ++++ .../parameters/instanceParameterOfFakeOverride1.kt | 4 ++++ .../parameters/isOptionalOverridesParameters.kt | 4 ++++ .../unusedTestData/properties/allVsDeclared.kt | 6 +++++- .../properties/fakeOverridesInSubclass.kt | 6 +++++- .../genericClassLiteralPropertyReceiverIsStar.kt | 6 +++++- .../properties/genericOverriddenProperty.kt | 6 +++++- .../unusedTestData/properties/genericProperty.kt | 6 +++++- .../getDelegate/booleanPropertyNameStartsWithIs.kt | 6 +++++- .../getDelegate/boundExtensionProperty.kt | 6 +++++- .../properties/getDelegate/extensionProperty.kt | 6 +++++- .../properties/getDelegate/fakeOverride.kt | 6 +++++- .../getDelegate/kPropertyForDelegatedProperty.kt | 6 +++++- .../getDelegate/memberExtensionProperty.kt | 6 +++++- .../properties/getDelegate/memberProperty.kt | 6 +++++- .../method/delegateMethodIsNonOverridable.kt | 6 +++++- .../getDelegate/nameClashClassAndCompanion.kt | 6 +++++- .../properties/getDelegate/notDelegatedProperty.kt | 6 +++++- .../getDelegate/overrideDelegatedByDelegated.kt | 6 +++++- .../properties/getDelegate/topLevelProperty.kt | 6 +++++- .../getExtensionPropertiesMutableVsReadonly.kt | 6 +++++- .../properties/getPropertiesMutableVsReadonly.kt | 4 ++++ .../jvmField/annotationCompanionWithAnnotation.kt | 6 +++++- .../properties/jvmField/interfaceCompanion.kt | 6 +++++- .../jvmField/interfaceCompanionWithAnnotation.kt | 6 +++++- .../properties/localDelegated/defaultImpls.kt | 6 +++++- .../properties/localDelegated/inLambda.kt | 6 +++++- .../properties/localDelegated/inlineFun.kt | 6 +++++- .../properties/localDelegated/localAndNonLocal.kt | 6 +++++- .../localDelegated/localDelegatedProperty.kt | 6 +++++- .../localDelegated/variableOfGenericType.kt | 6 +++++- .../memberAndMemberExtensionWithSameName.kt | 6 +++++- .../privateFakeOverrideFromSuperclass.kt | 6 +++++- .../properties/simpleGetProperties1.kt | 4 ++++ .../typeParameters/declarationSiteVariance.kt | 6 +++++- .../typeParameters/innerGenericParameter.kt | 6 +++++- .../typeParameters/typeParametersAndNames.kt | 6 +++++- .../unusedTestData/typeParameters/upperBounds.kt | 6 +++++- .../lite/unusedTestData/types/classifierIsClass.kt | 6 +++++- .../types/classifierIsTypeParameter.kt | 6 +++++- .../types/classifiersOfBuiltInTypes.kt | 6 +++++- ...equalsForClassAndTypeParameterWithSameFqName.kt | 6 +++++- .../unusedTestData/types/innerGenericArguments.kt | 6 +++++- .../lite/unusedTestData/types/jvmErasureOfClass.kt | 6 +++++- .../types/jvmErasureOfTypeParameter.kt | 6 +++++- .../lite/unusedTestData/types/typeArguments.kt | 6 +++++- .../lite/unusedTestData/types/useSiteVariance.kt | 6 +++++- 365 files changed, 1625 insertions(+), 228 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5de094a..9fc45e5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + plugins { kotlin("jvm") version "1.7.10" `java-gradle-plugin` diff --git a/gradle.properties b/gradle.properties index fdc200e..e84a6d2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,7 @@ +# +# Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. +# + version=0.1.0-SNAPSHOT group=org.jetbrains.kotlinx diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ffed3a2..41252e6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,3 +1,7 @@ +# +# Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. +# + distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip diff --git a/gradlew b/gradlew index 1b6c787..1bc870a 100755 --- a/gradlew +++ b/gradlew @@ -1,19 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. -# -# 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 -# -# https://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. +# Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. # ############################################################################## diff --git a/settings.gradle.kts b/settings.gradle.kts index d6584d8..7fdf029 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + rootProject.name = "kotlinx.reflect.lite" pluginManagement { @@ -9,4 +13,4 @@ pluginManagement { } } } -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt index 0b7cf31..ca2a7c2 100644 --- a/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt +++ b/src/main/java/kotlinx/reflect/lite/KAnnotatedElement.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite import kotlinx.reflect.lite.misc.* diff --git a/src/main/java/kotlinx/reflect/lite/KCallable.kt b/src/main/java/kotlinx/reflect/lite/KCallable.kt index cf29650..52b8e5c 100644 --- a/src/main/java/kotlinx/reflect/lite/KCallable.kt +++ b/src/main/java/kotlinx/reflect/lite/KCallable.kt @@ -1,6 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.reflect.lite diff --git a/src/main/java/kotlinx/reflect/lite/KClass.kt b/src/main/java/kotlinx/reflect/lite/KClass.kt index 0f3b554..d48e0ec 100644 --- a/src/main/java/kotlinx/reflect/lite/KClass.kt +++ b/src/main/java/kotlinx/reflect/lite/KClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite import kotlinx.reflect.lite.misc.* diff --git a/src/main/java/kotlinx/reflect/lite/KClassifier.kt b/src/main/java/kotlinx/reflect/lite/KClassifier.kt index 9fbde99..2d66312 100644 --- a/src/main/java/kotlinx/reflect/lite/KClassifier.kt +++ b/src/main/java/kotlinx/reflect/lite/KClassifier.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite /** @@ -7,4 +11,4 @@ package kotlinx.reflect.lite * @see [KTypeParameter] */ @SinceKotlin("1.1") -public interface KClassifier \ No newline at end of file +public interface KClassifier diff --git a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt index bcca5a2..2710842 100644 --- a/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt +++ b/src/main/java/kotlinx/reflect/lite/KDeclarationContainer.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite /** diff --git a/src/main/java/kotlinx/reflect/lite/KFunction.kt b/src/main/java/kotlinx/reflect/lite/KFunction.kt index 7861fee..d60be08 100644 --- a/src/main/java/kotlinx/reflect/lite/KFunction.kt +++ b/src/main/java/kotlinx/reflect/lite/KFunction.kt @@ -1,6 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.reflect.lite diff --git a/src/main/java/kotlinx/reflect/lite/KPackage.kt b/src/main/java/kotlinx/reflect/lite/KPackage.kt index 7a47f5b..674313a 100644 --- a/src/main/java/kotlinx/reflect/lite/KPackage.kt +++ b/src/main/java/kotlinx/reflect/lite/KPackage.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite /** diff --git a/src/main/java/kotlinx/reflect/lite/KParameter.kt b/src/main/java/kotlinx/reflect/lite/KParameter.kt index e21ae5a..2b95ac1 100644 --- a/src/main/java/kotlinx/reflect/lite/KParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KParameter.kt @@ -1,17 +1,5 @@ /* - * Copyright 2010-2015 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. + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.reflect.lite diff --git a/src/main/java/kotlinx/reflect/lite/KProperty.kt b/src/main/java/kotlinx/reflect/lite/KProperty.kt index 3111425..bc4154a 100644 --- a/src/main/java/kotlinx/reflect/lite/KProperty.kt +++ b/src/main/java/kotlinx/reflect/lite/KProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite import kotlinx.reflect.lite.misc.* diff --git a/src/main/java/kotlinx/reflect/lite/KType.kt b/src/main/java/kotlinx/reflect/lite/KType.kt index d3e2dcf..22392b9 100644 --- a/src/main/java/kotlinx/reflect/lite/KType.kt +++ b/src/main/java/kotlinx/reflect/lite/KType.kt @@ -1,6 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.reflect.lite diff --git a/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt index ef14938..23d8864 100644 --- a/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt +++ b/src/main/java/kotlinx/reflect/lite/KTypeParameter.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite /** @@ -32,4 +36,4 @@ public interface KTypeParameter : KClassifier { * for more information. */ public val isReified: Boolean -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt index 6c39fc5..6fe1a3b 100644 --- a/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt +++ b/src/main/java/kotlinx/reflect/lite/KTypeProjection.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite /** diff --git a/src/main/java/kotlinx/reflect/lite/KVariance.kt b/src/main/java/kotlinx/reflect/lite/KVariance.kt index 70c143b..8a3af6e 100644 --- a/src/main/java/kotlinx/reflect/lite/KVariance.kt +++ b/src/main/java/kotlinx/reflect/lite/KVariance.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite /** diff --git a/src/main/java/kotlinx/reflect/lite/KVisibility.kt b/src/main/java/kotlinx/reflect/lite/KVisibility.kt index a22ede8..dd43556 100644 --- a/src/main/java/kotlinx/reflect/lite/KVisibility.kt +++ b/src/main/java/kotlinx/reflect/lite/KVisibility.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite /** diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt index 1febf46..5094daa 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JavaToKotlinClassMap.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Partially copied from: https://github.com/JetBrains/kotlin/blob/9d09b9605fe5a32a40a84718aebeab6ca6234ab8/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap.kt package kotlinx.reflect.lite.builtins diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt index 04c0155..dc59a5a 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmAbi.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Partially copied: https://github.com/JetBrains/kotlin/blob/69a13a32691ea3b952f763aa958e276128474718/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.kt package kotlinx.reflect.lite.builtins diff --git a/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt b/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt index 5609f22..bf5486c 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/JvmPrimitiveType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.name.* diff --git a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt index 07da086..6bf7f0a 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/KotlinBuiltIns.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Partially copied from: https://github.com/JetBrains/kotlin/blob/b573532d8cbf9bf5347adb40d0774c21c2d35dc0/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt package kotlinx.reflect.lite.builtins diff --git a/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt index 47dce9f..93d66eb 100644 --- a/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt +++ b/src/main/java/kotlinx/reflect/lite/builtins/PrimitiveType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.builtins import kotlinx.reflect.lite.name.* diff --git a/src/main/java/kotlinx/reflect/lite/calls/Caller.kt b/src/main/java/kotlinx/reflect/lite/calls/Caller.kt index 28f1259..cef29bc 100644 --- a/src/main/java/kotlinx/reflect/lite/calls/Caller.kt +++ b/src/main/java/kotlinx/reflect/lite/calls/Caller.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/Caller.kt package kotlinx.reflect.lite.calls diff --git a/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt index aa50e09..8726cac 100644 --- a/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/calls/CallerImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/CallerImpl.kt package kotlinx.reflect.lite.calls diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt index 6e7fe5d..225e666 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/descriptors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt index e17701e..5f4ca78 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/AbstractCallableDescriptor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt index 8df8ca7..a5c70bc 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassBasedDeclarationContainerDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt package kotlinx.reflect.lite.descriptors.impl diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt index f0748d6..351715e 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ClassDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt index b745144..425e68b 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ConstructorDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt index 7ce31b9..406dee1 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/FunctionDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt index 2f397f2..f8c6845 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/KotlinType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt index 4d9ea38..c8f7c5b 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ModuleDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt index baefed2..b66cc44 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PackageDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt index 7646121..3b33f2f 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/PropertyDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt index 4fadf42..8300e42 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ReceiverParameterDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.reflect.lite.descriptors.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt index 5b76b22..d27790f 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/TypeParameterDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors.impl import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt index 86f34b7..465ff97 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/impl/ValueParameterDescriptorImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt index 871947c..215819c 100644 --- a/src/main/java/kotlinx/reflect/lite/descriptors/util.kt +++ b/src/main/java/kotlinx/reflect/lite/descriptors/util.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.descriptors import kotlinx.metadata.* diff --git a/src/main/java/kotlinx/reflect/lite/full/KCallables.kt b/src/main/java/kotlinx/reflect/lite/full/KCallables.kt index 4b210b2..9481b0f 100644 --- a/src/main/java/kotlinx/reflect/lite/full/KCallables.kt +++ b/src/main/java/kotlinx/reflect/lite/full/KCallables.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + @file:JvmName("KCallables") package kotlinx.reflect.lite.full diff --git a/src/main/java/kotlinx/reflect/lite/full/KCallablesJvm.kt b/src/main/java/kotlinx/reflect/lite/full/KCallablesJvm.kt index ccf07a1..8383791 100644 --- a/src/main/java/kotlinx/reflect/lite/full/KCallablesJvm.kt +++ b/src/main/java/kotlinx/reflect/lite/full/KCallablesJvm.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + @file:JvmName("KCallablesJvm") package kotlinx.reflect.lite.full diff --git a/src/main/java/kotlinx/reflect/lite/full/KClasses.kt b/src/main/java/kotlinx/reflect/lite/full/KClasses.kt index 3fa7fe8..dc93e27 100644 --- a/src/main/java/kotlinx/reflect/lite/full/KClasses.kt +++ b/src/main/java/kotlinx/reflect/lite/full/KClasses.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + @file:JvmName("KClasses") package kotlinx.reflect.lite.full diff --git a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt index f8eb11f..6b43385 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KCallableImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt index 8de7094..a7da6ad 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KClassImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt index 904d112..05080a9 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KDeclarationContainerImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt index 4c0fc93..dc0c9ba 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KFunctionImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt index 9385664..47dfa79 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KPackageImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt index fdb6f82..8e2cfc6 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KParameterImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt index 1fe5482..cf8cfd8 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KPropertyImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt index 1d925d3..d2f2404 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* diff --git a/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt index cd6bdda..25746c5 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KTypeParameterImpl.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.reflect.lite.* @@ -17,4 +21,4 @@ internal class KTypeParameterImpl( override val variance: KVariance get() = descriptor.variance -} \ No newline at end of file +} diff --git a/src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt b/src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt index 859f2e0..513e468 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/KotlinReflectionInternalError.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Copy of: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KotlinReflectionInternalError.kt package kotlinx.reflect.lite.impl diff --git a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt index 7622ff8..9b73cc6 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/ReflectionLiteImpl.kt @@ -1,17 +1,5 @@ /* - * Copyright 2010-2022 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. + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.reflect.lite.impl diff --git a/src/main/java/kotlinx/reflect/lite/impl/util.kt b/src/main/java/kotlinx/reflect/lite/impl/util.kt index 4e9ebaf..8aeb1ba 100644 --- a/src/main/java/kotlinx/reflect/lite/impl/util.kt +++ b/src/main/java/kotlinx/reflect/lite/impl/util.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.impl import kotlinx.metadata.jvm.* diff --git a/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt b/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt index 5f416b3..0fa5b22 100644 --- a/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/jvm/JvmClassMapping.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + @file:JvmName("JvmClassMappingKt") package kotlinx.reflect.lite.jvm diff --git a/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt b/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt index 42e78f7..4245606 100644 --- a/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/jvm/ReflectJvmMapping.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + @file:JvmName("ReflectJvmMapping") // Some logic copied from: https://github.com/JetBrains/kotlin/blob/26cdb2f928982dad7f0c9ab8e3bd509665d9d537/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt diff --git a/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt index 92cc189..c5d2c27 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/CompanionObjectMapping.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.misc import kotlinx.reflect.lite.builtins.* diff --git a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt index dbaba4c..ecc2b07 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/RuntimeTypeMapper.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt package kotlinx.reflect.lite.misc diff --git a/src/main/java/kotlinx/reflect/lite/misc/util.kt b/src/main/java/kotlinx/reflect/lite/misc/util.kt index 82f23bb..54026ec 100644 --- a/src/main/java/kotlinx/reflect/lite/misc/util.kt +++ b/src/main/java/kotlinx/reflect/lite/misc/util.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Most logic copied from: https://github.com/JetBrains/kotlin/blob/master/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/structure/reflectClassUtil.kt package kotlinx.reflect.lite.misc diff --git a/src/main/java/kotlinx/reflect/lite/name/names.kt b/src/main/java/kotlinx/reflect/lite/name/names.kt index 9b7af33..454f963 100644 --- a/src/main/java/kotlinx/reflect/lite/name/names.kt +++ b/src/main/java/kotlinx/reflect/lite/name/names.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.name import kotlinx.metadata.ClassName diff --git a/src/test/java/kotlinx/reflect/lite/helpers.kt b/src/test/java/kotlinx/reflect/lite/helpers.kt index bdcbb1b..9dc4afd 100644 --- a/src/test/java/kotlinx/reflect/lite/helpers.kt +++ b/src/test/java/kotlinx/reflect/lite/helpers.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package helpers import kotlin.coroutines.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt index 6a780b6..69fdf5c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/accessPrivateProperties.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.accessPrivateProperties import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt index 0d85365..fd1179e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/bigArity.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bigArity import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt index 2bc7e1f..f64890b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/cannotCallEnumConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.cannotCallEnumConstructor import kotlinx.reflect.lite.full.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt index b692fdc..b1a5c5e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/equalsHashCodeToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.equalsHashCodeToString import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt index cec781b..0e976ff 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/exceptionHappened.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.exceptionHappened import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt index 3cf0246..dd92edc 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverride.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.fakeOverride import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt index 732036b..414386c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/fakeOverrideSubstituted.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.fakeOverrideSubstituted import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt index c27096e..758fec1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/incorrectNumberOfArguments.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.incorrectNumberOfArguments import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt index 779dcfd..42cf7fb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/innerClassConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.innerClassConstructor import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt index 4db8f83..eec23b9 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStatic.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.jvmStatic import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt index a1d7faa..6c1c053 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/jvmStaticInObjectIncorrectReceiver.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.jvmStaticInObjectIncorrectReceiver import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt index 3f5f9e1..71ef030 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/localClassMember.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.localClassMember import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt index 7a9aeb7..c09d27c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/memberOfGenericClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.memberOfGenericClass import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt index ff1ee8f..9c3236c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/propertyGetterAndGetFunctionDifferentReturnType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.propertyGetterAndGetFunctionDifferentReturnType import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt index 9a56e9c..37c5a12 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/protectedMembers.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.protectedMembers import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt index f32ecd2..e70ec20 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/returnUnit.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.returnUnit import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt index c907097..1504e27 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.simpleConstructor import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt index 950d182..494dd22 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleMemberFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.simpleMemberFunction import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt index 7bde666..d7fc714 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/call/simpleTopLevelFunctions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.simpleTopLevelFunctions import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt index b0095fe..b20c4ed 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionFunctionWA.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.boundExtensionFunctionWA import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt index 1e95dc9..9ada3db 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundExtensionPropertyAcessorWA.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.boundExtensionPropertyAcessorWA import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt index 37b7879..83b152d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/boundJvmStaticInObjectWA.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.boundJvmStaticInObjectWA import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt index 86aa3b0..705e468 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/companionObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.companionObject import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt index 7db0f02..312804e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultAndNonDefaultIntertwined.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.defaultAndNonDefaultIntertwined import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt index e023195..e1b7a5e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/defaultInSuperClassFakeOverride.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.defaultInSuperClassFakeOverride import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt index 0316ed5..e2154e7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/extensionFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.extensionFunction import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt index 4255491..1053328 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInCompanionObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.jvmStaticInCompanionObject // KT-12915 IAE on callBy of JvmStatic function with default arguments diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt index 5beca88..ea1b99e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/jvmStaticInObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.jvmStaticInObject import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt index 1b52cf4..a241b1a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.manyArgumentsNoneDefaultConstructor import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt index 3df240c..74f928c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsNoneDefaultFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.manyArgumentsNoneDefaultFunction import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt index 5dde179..bbe9550 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyArgumentsOnlyOneDefault.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.manyArgumentsOnlyOneDefault import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt index a50f9d3..bb40d29 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/manyMaskArguments.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.manyMaskArguments import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt index a76647c..aff248b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nonDefaultParameterOmitted.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.nonDefaultParameterOmitted import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt index 054e36e..d6ead74 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/nullValue.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.nullValue import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt index ca82fc6..ec9dc45 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.ordinaryMethodIsInvokedWhenNoDefaultValuesAreUsed import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt index 7a05eec..c403902 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/primitiveDefaultValues.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.primitiveDefaultValues import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt index 649c6ae..5738476 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.simpleConstructor import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt index 1e99b02..0683847 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleMemberFunciton.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.simpleMemberFunciton import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt index bb4a1ec..92d23cd 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callBy/simpleTopLevelFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.simpleTopLevelFunction import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt index c0072bc..9dbe853 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/bigArity.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callSuspend.bigArity import helpers.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt index 4d702bd..24c79e7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/callSuspend.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callSuspend.callSuspend // WITH_COROUTINES diff --git a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt index 272b4e8..dd1e313 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/callSuspend/primitiveSuspendFunctions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callSuspend.primitiveSuspendFunctions import kotlin.coroutines.startCoroutine diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt index 0b569e0..3e59f2f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classMembers.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.classMembers import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt index 92398cc..9daf3ff 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/classSimpleName.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.classSimpleName import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt index b0e1289..c069c3d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/localClassSimpleName.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.localClassSimpleName import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt index 5e025e4..54540a0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/nestedClasses.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.nestedClasses import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt index 6187578..ee200f2 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedName.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.qualifiedName diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt index fff99c7..e89fc7a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/qualifiedNameOfStandardClasses.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.qualifiedNameOfStandardClasses import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt index 1ac1431..b6a87ed 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/classes/sealedSubclasses.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.sealedSubclasses import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt index 9573286..6bf8f4f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/classesWithoutConstructors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.constructors.classesWithoutConstructors import kotlinx.reflect.lite.tests.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt index 69abc83..2b507a3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/constructorName.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.constructors.constructorName import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt index 5acd7fe..e68718b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/primaryConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.constructors.primaryConstructor import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt index 23301f3..cc21ef1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/constructors/simpleGetConstructors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.constructors.simpleGetConstructors import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt index e95abe3..b0b21c0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/constructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.constructor import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt index 72bdf20..edb659a 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/extensionProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.extensionProperty import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt index 245b844..2f46133 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/functions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.functions import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt index 113ad00..f313102 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/inlineReifiedFun.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.inlineReifiedFun import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt index 4987859..f1b3121 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/interfaceCompanionPropertyWithJvmField.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.interfaceCompanionPropertyWithJvmField import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt index 31f287d..55aa306 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/lateinitProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.lateinitProperty import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt index ef29335..6ee5603 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/memberProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.memberProperty import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt index 9b67e48..390687e 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromObjectWithoutCustomMembers.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // Part of the test: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt package tests.mapping.methodsFromObjectWithoutCustomMembers diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt index f612f1e..15f9c9b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/methodsFromSuperInterface.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.methodsFromSuperInterface import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt index e6a3af9..416fb98 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/privateProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.privateProperty import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt index 19f2e11..e152a6b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/propertyAccessorsWithJvmName.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.propertyAccessorsWithJvmName import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt index 2508a59..cd401f1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/syntheticFields.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.syntheticFields import kotlinx.reflect.lite.jvm.kotlinProperty diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt index 3a3f95d..d0a9bfe 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/topLevelProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.topLevelProperty import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt index e2924fd..671d136 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/array.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.array import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt index 580dd2d..05b336c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/constructors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.constructors import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt index 3a003aa..037f1d5 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/genericArrayElementType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.genericArrayElementType import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt index 17a367d..151aa7d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/memberFunctions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.memberFunctions import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt index 50f6847..5d6733d 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypeArgument.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.parameterizedTypeArgument import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt index 4c2c554..42d5120 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/parameterizedTypes.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.parameterizedTypes import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt index 8093128..a417fae 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/propertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.propertyAccessors import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt index bf9d0eb..990405c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/supertypes.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.supertypes import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt index 97bbd3a..5039568 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/topLevelFunctions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.topLevelFunctions import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt index 2a42cc8..0f6dad1 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/typeParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.typeParameters import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt index 696e717..f226975 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/mapping/types/unit.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.unit import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt index 2300d14..f8c4f22 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/bigArity.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.bigArity import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt index 297f718..c45c402 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/functionParameterNameAndIndex.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.functionParameterNameAndIndex import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt index 73ce22a..08f5ddf 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/innerClassConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.innerClassConstructor // Logic from this test, but inner class constructor has no bound receiver: https://github.com/Kotlin/kotlinx.reflect.lite/blob/mvicsokolova/dev/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt index 78b926d..ee456a7 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceExtensionReceiverAndValueParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.instanceExtensionReceiverAndValueParameters import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt index ab95174..8b1aeb5 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/instanceParameterOfFakeOverride.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.instanceParameterOfFakeOverride import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt index 26789ac..8405b0f 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isMarkedNullable.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.isMarkedNullable import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt index e6174bd..d8a68ff 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/isOptional.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.isOptional import kotlinx.reflect.lite.impl.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt index 47e4e1f..63f313b 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/kinds.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.kinds import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt index 164bf00..e34ec11 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/objectMemberReferences.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.objectMemberReferences import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt index ec7a25c..b418c35 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/propertySetter.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.propertySetter import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt index 8978fe9..b6aeee3 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/parameters/references.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.references import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt index 20672d2..76a8764 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/extensionPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.accessors.extensionPropertyAccessors import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt index fa639ab..fc5ccc8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/memberPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.accessors.memberPropertyAccessors import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt index 9de5ede..8fc9e5c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/accessors/topLevelPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.accessors.topLevelPropertyAccessors import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt index 857888f..f7c4aea 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/invokeKProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.invokeKProperty import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt index 4b62355..4f015a0 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/callPrivatePropertyFromGetProperties.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.callPrivatePropertyFromGetProperties import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt index 2a2ce9f..0e05ea6 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVal.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.privateClassVal import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt index 51ef63a..1736f76 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateClassVar.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.privateClassVar import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt index f9d2b52..082719c 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateJvmStaticVarInObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.privateJvmStaticVarInObject import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt index 65eef3f..3fb9a72 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privatePropertyCallIsAccessibleOnAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.privatePropertyCallIsAccessibleOnAccessors import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt index 5be531e..d683edb 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/privateToThisAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.privateToThisAccessors import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt index 13a064b..fbb6721 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/protectedClassVar.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.protectedClassVar import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt index 3ae636f..8a9b2a8 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/isAccessible/publicClassValAccessible.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.publicClassValAccessible import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt index d1959bc..28b1862 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/propertyOfNestedClassAndArrayType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.propertyOfNestedClassAndArrayType import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt index 9ced06d..f74a5bf 100644 --- a/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt +++ b/src/test/java/kotlinx/reflect/lite/testData/properties/simpleGetProperties.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.simpleGetProperties import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt b/src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt index ab0c7da..76a6dcf 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/CallSuspendTest.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.tests import org.junit.* diff --git a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt index 99e9ffc..40dad19 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KCallableTest.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.tests import org.junit.* diff --git a/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt index b86824b..cc047ac 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KClassTest.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.tests import org.junit.* diff --git a/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt index d6c952d..b7bdd58 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KParameterTest.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.tests import org.junit.* diff --git a/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt index dd0f100..36bdbac 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/KPropertyTest.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.tests import org.junit.* diff --git a/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt index 7a59166..c53a719 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/MappingTest.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.tests import org.junit.* diff --git a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt index 5e6a6fb..40717e3 100644 --- a/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt +++ b/src/test/java/kotlinx/reflect/lite/tests/testUtil.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.tests import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/annotationRetentionAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/annotationRetentionAnnotation.kt index bf0c70e..49067b1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/annotationRetentionAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/annotationRetentionAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.annotationRetentionAnnotation import kotlin.test.assertEquals @@ -13,4 +17,4 @@ fun box(): String { assertEquals(AnnotationRetention.RUNTIME, ann.value) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/genericExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/genericExtensionProperty.kt index eec707c..58b9a43 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/genericExtensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/genericExtensionProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.genericExtensionProperty @Retention(AnnotationRetention.RUNTIME) @@ -12,4 +16,4 @@ public val A.p: String fun box(): String { val o = object : A {} return (o::p.annotations.single() as Simple).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/localClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/localClassLiteral.kt index a43b8b4..23fce70 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/localClassLiteral.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/localClassLiteral.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.localClassLiteral @@ -22,4 +26,4 @@ fun box(): String { if (actual != expected1 && actual != expected2) return "Fail: $actual" return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/arrayKClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/arrayKClass.kt index a00e95e..848b1f4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/arrayKClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/arrayKClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.onTypes.arrayKClass import kotlin.reflect.KClass @@ -10,4 +14,4 @@ val s: @MyAnn(Array::class) String = "" fun box(): String { val ann = ::s.returnType.annotations[0] as MyAnn return if (ann.cls == Array::class) "OK" else "Fail: ${ann.cls}" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/classLiteralWithExpectedType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/classLiteralWithExpectedType.kt index 53ed479..6800e21 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/classLiteralWithExpectedType.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/classLiteralWithExpectedType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.onTypes.classLiteralWithExpectedType @@ -21,4 +25,4 @@ fun box(): String { ) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentArgumentTypes.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentArgumentTypes.kt index 3403a89..ee1b1e8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentArgumentTypes.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentArgumentTypes.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.onTypes.differentArgumentTypes import kotlin.reflect.KClass @@ -93,4 +97,4 @@ fun box(): String { assertTrue(aa is Array<*> && aa.isArrayOf()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentPositions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentPositions.kt index 2602d67..e74a59c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentPositions.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/onTypes/differentPositions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.onTypes.differentPositions import kotlin.reflect.KCallable @@ -44,4 +48,4 @@ fun box(): String { check("type argument", ::typeArgument.returnType.arguments.single().type!!) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/privateAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/privateAnnotation.kt index 7e62b55..8b06f69 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/privateAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/privateAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.privateAnnotation annotation private class Ann(val name: String) @@ -10,4 +14,4 @@ class A { fun box(): String { val ann = A::class.members.single { it.name == "foo" }.annotations.single() as Ann return ann.name -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyAccessors.kt index 1885efc..2e2411e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.propertyAccessors annotation class Get @@ -14,4 +18,4 @@ fun box(): String { assert(::foo.setter.parameters.single().annotations.single() is SetParam) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyWithoutBackingField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyWithoutBackingField.kt index 815da33..2b7a061 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyWithoutBackingField.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/propertyWithoutBackingField.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.propertyWithoutBackingField annotation class Ann(val value: String) @@ -8,4 +12,4 @@ val property: String fun box(): String { return (::property.annotations.single() as Ann).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/retentions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/retentions.kt index 694cf7d..d979010 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/retentions.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/retentions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.retentions import kotlin.test.assertEquals @@ -17,4 +21,4 @@ annotation class RuntimeAnno fun box(): String { assertEquals(listOf(RuntimeAnno::class.java), ::box.annotations.map { it.annotationClass.java }) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/setparam.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/setparam.kt index b776f31..c070d92 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/setparam.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/setparam.kt @@ -1,4 +1,8 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // different annotation order package tests.annotations.setparam @@ -20,4 +24,4 @@ fun box(): String { assertEquals("[]", setterParameters.first().annotations.toString()) assertEquals("[@tests.annotations.setparam.Ann2(), @tests.annotations.setparam.Ann1()]", setterParameters.last().annotations.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleClassAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleClassAnnotation.kt index 7c95967..2da9852 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleClassAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleClassAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.simpleClassAnnotation @Retention(AnnotationRetention.RUNTIME) @@ -8,4 +12,4 @@ class A fun box(): String { return (A::class.annotations.single() as Simple).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleConstructorAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleConstructorAnnotation.kt index c332460..1933ff8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleConstructorAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleConstructorAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.simpleConstructorAnnotation annotation class Primary @@ -12,4 +16,4 @@ fun box(): String { val ans = C::class.constructors.map { it.annotations.single().annotationClass.java.simpleName }.sorted() if (ans != listOf("Primary", "Secondary")) return "Fail: $ans" return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleFunAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleFunAnnotation.kt index 96bf9aa..6a3571e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleFunAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleFunAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.simpleFunAnnotation @Retention(AnnotationRetention.RUNTIME) @@ -6,4 +10,4 @@ annotation class Simple(val value: String) @Simple("OK") fun box(): String { return (::box.annotations.single() as Simple).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleParamAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleParamAnnotation.kt index 570ed62..8ef355a 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleParamAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleParamAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.simpleParamAnnotation @Retention(AnnotationRetention.RUNTIME) @@ -7,4 +11,4 @@ fun test(@Simple("OK") x: Int) {} fun box(): String { return (::test.parameters.single().annotations.single() as Simple).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleValAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleValAnnotation.kt index eea4528..d71c40b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleValAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/annotations/simpleValAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.annotations.simpleValAnnotation @Retention(AnnotationRetention.RUNTIME) @@ -8,4 +12,4 @@ val foo: Int = 0 fun box(): String { return (::foo.annotations.single() as Simple).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/collections.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/collections.kt index 3a09791..643086c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/collections.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/collections.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.builtins.collections // See KT-11258, KT-16616 @@ -23,4 +27,4 @@ fun box(): String { assertEquals(1, Collection::size.getter(listOf(1))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/enumNameOrdinal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/enumNameOrdinal.kt index 17ea740..2fc7c25 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/enumNameOrdinal.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/enumNameOrdinal.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.builtins.enumNameOrdinal import kotlin.test.assertEquals @@ -10,4 +14,4 @@ fun box(): String { assertEquals("Y", E::name.call(E.Y)) assertEquals(2, E::ordinal.call(E.Z)) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/stringLength.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/stringLength.kt index b54e3d4..9d733ef 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/stringLength.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/builtins/stringLength.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.builtins.stringLength import kotlin.test.assertEquals @@ -6,4 +10,4 @@ fun box(): String { String::class.members assertEquals(2, String::length.call("OK")) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/companionObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/companionObjectPropertyAccessors.kt index 62989b8..5bffac1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/companionObjectPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/companionObjectPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.companionObjectPropertyAccessors import kotlin.reflect.* @@ -47,4 +51,4 @@ fun box(): String { assertEquals(200, c_y.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionFunction.kt index 225802e..50a7bc4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.extensionFunction import kotlin.reflect.* @@ -6,4 +10,4 @@ fun String.foo(x: String) = this + x fun String?.bar(x: String) = x fun box() = - (""::foo).call("O") + (null::bar).call("K") \ No newline at end of file + (""::foo).call("O") + (null::bar).call("K") diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionPropertyAccessors.kt index ac7c145..f3aa3ac 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/extensionPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.extensionPropertyAccessors import kotlin.reflect.* @@ -39,4 +43,4 @@ fun box(): String { assertEquals(200, c_y.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/innerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/innerClassConstructor.kt index 47e278c..aadeb5f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/innerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/innerClassConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.innerClassConstructor class Outer(val x: String) { @@ -10,4 +14,4 @@ fun box(): String { val innerCtor = Outer("O")::Inner val inner = innerCtor.call("K") return inner.foo() -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt index 90ade2d..f28e947 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticCompanionObjectPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.jvmStaticCompanionObjectPropertyAccessors import kotlin.reflect.* @@ -47,4 +51,4 @@ fun box(): String { assertEquals(200, c_y.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectFunction.kt index 5dfe19f..f2b49cd 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.jvmStaticObjectFunction import kotlin.reflect.* @@ -13,4 +17,4 @@ class CompanionOwner { } fun box(): String = - (Host::foo).call("O") + (CompanionOwner.Companion::bar).call("K") \ No newline at end of file + (Host::foo).call("O") + (CompanionOwner.Companion::bar).call("K") diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectPropertyAccessors.kt index e5657b2..4f4dd4f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/jvmStaticObjectPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.jvmStaticObjectPropertyAccessors import kotlin.reflect.* @@ -45,4 +49,4 @@ fun box(): String { assertEquals(200, c_y.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberFunction.kt index 300e4c7..e4d8139 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.memberFunction import kotlin.reflect.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberPropertyAccessors.kt index d379846..f465193 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/memberPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.memberPropertyAccessors import kotlin.reflect.* @@ -44,4 +48,4 @@ fun box(): String { assertEquals(200, c_y.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectFunction.kt index 582455f..3dbd4fb 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.objectFunction import kotlin.reflect.* @@ -13,4 +17,4 @@ class CompanionOwner { } fun box(): String = - (Host::foo).call("O") + (CompanionOwner.Companion::bar).call("K") \ No newline at end of file + (Host::foo).call("O") + (CompanionOwner.Companion::bar).call("K") diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectPropertyAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectPropertyAccessors.kt index da60c05..f3fa798 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectPropertyAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/bound/objectPropertyAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.bound.objectPropertyAccessors import kotlin.reflect.* @@ -45,4 +49,4 @@ fun box(): String { assertEquals(200, c_y.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt index d75946e..672b0a2 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/constructorWithInlineClassParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.constructorWithInlineClassParameters import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/fieldAccessors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/fieldAccessors.kt index 70b744a..3a1acdf 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/fieldAccessors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/fieldAccessors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.fieldAccessors import kotlin.reflect.KCallable @@ -33,4 +37,4 @@ fun box(): String { assertEquals(S("ef"), topLevel.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/functionsWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/functionsWithInlineClassParameters.kt index 216c2d3..2683c09 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/functionsWithInlineClassParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/functionsWithInlineClassParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.functionsWithInlineClassParameters import kotlin.test.assertEquals @@ -27,4 +31,4 @@ fun box(): String { assertEquals("_", S("_")::extension2.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/inlineClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/inlineClassConstructor.kt index 677c52f..02a1edd 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/inlineClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/inlineClassConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.inlineClassConstructor import kotlin.reflect.KCallable @@ -43,4 +47,4 @@ fun box(): String { assertEquals(Z2(Z(42)), ::Z2.call(Z(42))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/internalPrimaryValOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/internalPrimaryValOfInlineClass.kt index 0854d31..122b4f7 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/internalPrimaryValOfInlineClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/internalPrimaryValOfInlineClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.internalPrimaryValOfInlineClass import kotlin.test.assertEquals @@ -35,4 +39,4 @@ fun box(): String { assertEquals(A(null), A2(A(null))::x.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFieldInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFieldInObject.kt index 18c4a98..5b96d57 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFieldInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFieldInObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.jvmStaticFieldInObject // JVM_TARGET: 1.8 @@ -30,4 +34,4 @@ fun box(): String { assertEquals(S("cd"), boundRef.getter.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFunction.kt index d64c902..bf9fe17 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/jvmStaticFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.jvmStaticFunction // JVM_TARGET: 1.8 @@ -32,4 +36,4 @@ fun box(): String { assertEquals(S("gh"), unboundBar.call(I, "g", S("h"))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingFunOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingFunOfInlineClass.kt index 30e856e..a5bacf8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingFunOfInlineClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingFunOfInlineClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.nonOverridingFunOfInlineClass import kotlin.test.assertEquals @@ -32,4 +36,4 @@ fun box(): String { assertEquals("42-+", A("42")::test.call("-", S("+"))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingVarOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingVarOfInlineClass.kt index 52a59b4..b9efed3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingVarOfInlineClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/nonOverridingVarOfInlineClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.nonOverridingVarOfInlineClass import kotlin.test.assertEquals @@ -78,4 +82,4 @@ fun box(): String { assertEquals(S("A+42"), global) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingFunOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingFunOfInlineClass.kt index 954ec46..0bbb405 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingFunOfInlineClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingFunOfInlineClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.overridingFunOfInlineClass import kotlin.test.assertEquals @@ -36,4 +40,4 @@ fun box(): String { assertEquals("42-+", A("42")::test.call("-", S("+"))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingVarOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingVarOfInlineClass.kt index 6540f43..0ce5fb2 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingVarOfInlineClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/overridingVarOfInlineClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.overridingVarOfInlineClass import kotlin.test.assertEquals @@ -82,4 +86,4 @@ fun box(): String { assertEquals(S("A+42"), global) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/primaryValOfInlineClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/primaryValOfInlineClass.kt index a696cc5..3553434 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/primaryValOfInlineClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/primaryValOfInlineClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.primaryValOfInlineClass import kotlin.test.assertEquals @@ -35,4 +39,4 @@ fun box(): String { assertEquals(A(null), A2(A(null))::x.call()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/properties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/properties.kt index 370497e..9998d6c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/properties.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/call/inlineClasses/properties.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.call.inlineClasses.properties import kotlin.reflect.KMutableProperty2 @@ -47,4 +51,4 @@ fun box(): String { assertEquals(S("ij"), S::ext.getter.call(S("i"))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt index 7904472..55e8835 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.boundExtensionFunction import kotlin.test.assertEquals @@ -7,4 +11,4 @@ fun String.extFun(k: String, s: String = "") = this + k + s fun box(): String { val sExtFun = "O"::extFun return sExtFun.callBy(mapOf(sExtFun.parameters[0] to "K")) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt index 1a46929..b2e8d40 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundExtensionPropertyAcessor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.boundExtensionPropertyAcessor import kotlin.test.assertEquals @@ -6,4 +10,4 @@ val String.plusK: String get() = this + "K" fun box(): String = - ("O"::plusK).getter.callBy(mapOf()) \ No newline at end of file + ("O"::plusK).getter.callBy(mapOf()) diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt index 81a2ee6..06d2f0a 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/boundJvmStaticInObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.boundJvmStaticInObject import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperClass.kt index f3ac6e3..7158b55 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.defaultInSuperClass open class A { @@ -17,4 +21,4 @@ fun box(): String { ))) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperInterface.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperInterface.kt index 7cc2aaa..6f3fed1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperInterface.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/defaultInSuperInterface.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.defaultInSuperInterface interface A1 { @@ -25,4 +29,4 @@ class Z : D, E fun box(): String { val f = Z::test return f.callBy(mapOf(f.parameters.first() to Z())) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/emptyVarArg.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/emptyVarArg.kt index e8914f8..515e537 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/emptyVarArg.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/emptyVarArg.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.emptyVarArg import kotlin.test.assertEquals @@ -12,4 +16,4 @@ fun box(): String { assertEquals("", j.callBy(emptyMap())) assertEquals(0, s.callBy(emptyMap())) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassDefaultArguments.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassDefaultArguments.kt index a7f71ac..3005ad9 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassDefaultArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassDefaultArguments.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.inlineClassDefaultArguments inline class A(val x: Int) @@ -6,4 +10,4 @@ fun test(x: A = A(0)) = "OK" fun box(): String { return (::test).callBy(mapOf()) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassFunctionsAndConstructors.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassFunctionsAndConstructors.kt index 3eb2018..7206b13 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassFunctionsAndConstructors.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassFunctionsAndConstructors.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.inlineClassFunctionsAndConstructors import kotlin.test.assertEquals @@ -41,4 +45,4 @@ fun box(): String { assertEquals(S("gh"), boundExtension.callBy(boundExtension.parameters.associate { it to S(it.name!!) })) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassMembers.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassMembers.kt index ad91ea4..31037e1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/callBy/inlineClassMembers.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.callBy.inlineClassMembers import kotlin.test.assertEquals @@ -72,4 +76,4 @@ fun box(): String { assertEquals(Z(442), global) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/annotationClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/annotationClassLiteral.kt index fce32d4..0f87079 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/annotationClassLiteral.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/annotationClassLiteral.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.annotationClassLiteral import kotlin.test.assertEquals @@ -6,4 +10,4 @@ fun box(): String { assertEquals("Deprecated", Deprecated::class.simpleName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/arrays.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/arrays.kt index f314141..e09a939 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/arrays.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/arrays.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.arrays import kotlin.test.* @@ -11,4 +15,4 @@ fun box(): String { assertNotEquals>(any.java, string.java) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/bareArray.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/bareArray.kt index 612a1b2..a4a8274 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/bareArray.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/bareArray.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.bareArray import kotlin.test.* @@ -10,4 +14,4 @@ fun box(): String { assertEquals>(any, bare) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/builtinClassLiterals.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/builtinClassLiterals.kt index f421db2..f687cb2 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/builtinClassLiterals.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/builtinClassLiterals.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.builtinClassLiterals import kotlin.test.assertEquals @@ -36,4 +40,4 @@ fun box(): String { assertEquals("FunctionN", Function42::class.simpleName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericArrays.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericArrays.kt index a6b0831..fd1752f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericArrays.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericArrays.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.genericArrays import kotlin.test.* @@ -27,4 +31,4 @@ fun box(): String { assertEquals("[Ljava.lang.Object;", arrayClass>().jvmName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericClass.kt index 7f90584..b059f90 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/genericClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.genericClass import kotlin.test.assertEquals @@ -8,4 +12,4 @@ fun box(): String { val g = Generic::class assertEquals("Generic", g.simpleName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/lambdaClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/lambdaClass.kt index 2dc5f60..ad51897 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/lambdaClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/lambdaClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.lambdaClass // KT-33992 diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/reifiedTypeClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/reifiedTypeClassLiteral.kt index 0e181ec..3fdb58f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/reifiedTypeClassLiteral.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classLiterals/reifiedTypeClassLiteral.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classLiterals.reifiedTypeClassLiteral import kotlin.test.* @@ -27,4 +31,4 @@ fun box(): String { assertEquals(Error::class.java, myJavaClass()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt index b426d32..2c6d14b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/companionObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.companionObject import kotlin.reflect.full.* @@ -45,4 +49,4 @@ fun box(): String { assertEquals(Char, Char.Companion::class.objectInstance) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt index b67233a..7dc2759 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/createInstance.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.createInstance import kotlin.reflect.full.createInstance @@ -70,4 +74,4 @@ fun box(): String { testFail() return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/javaVoid.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/javaVoid.kt index 07106ea..887bf93 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/javaVoid.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/javaVoid.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.javaVoid import kotlin.test.assertEquals @@ -15,4 +19,4 @@ fun box(): String { assertEquals("java.lang.Void", Void::class.qualifiedName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt index 8c1feb9..30622f3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmName.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.jvmName import kotlin.test.assertEquals diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt index 555d674..5c3c861 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/jvmNameOfStandardClasses.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.jvmNameOfStandardClasses import kotlin.test.assertEquals @@ -21,4 +25,4 @@ fun box(): String { assertEquals("java.lang.Void", java.lang.Void::class.jvmName) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/objectInstance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/objectInstance.kt index 2ac527e..51fc555 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/objectInstance.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/objectInstance.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.objectInstance import kotlin.test.assertEquals @@ -30,4 +34,4 @@ fun box(): String { assertEquals(Unit, Unit::class.objectInstance) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/primitiveKClassEquality.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/primitiveKClassEquality.kt index 7f6ff91..31118f1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/primitiveKClassEquality.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/primitiveKClassEquality.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.primitiveKClassEquality import kotlin.test.assertEquals @@ -12,4 +16,4 @@ fun box(): String { assertFalse(x === y) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt index 7435d40..3b69fc1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/classes/starProjectedType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.classes.starProjectedType import kotlin.reflect.KTypeProjection @@ -20,4 +24,4 @@ fun box(): String { assertEquals(tp.createType(), tp.starProjectedType) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt index eab49f2..57e7862 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/constructors/enumEntry.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.reflect.lite.unusedTestData.constructors import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/annotationType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/annotationType.kt index e100a65..efbde0a 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/annotationType.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/annotationType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.annotationType import kotlin.test.assertEquals @@ -8,4 +12,4 @@ fun box(): String { val foo = Foo::class.constructors.single().call() assertEquals(Foo::class, foo.annotationClass) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/arrayOfKClasses.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/arrayOfKClasses.kt index bab75ec..582eaba 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/arrayOfKClasses.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/arrayOfKClasses.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.arrayOfKClasses @@ -11,4 +15,4 @@ fun box(): String { assertEquals(listOf(String::class, Int::class), anno.klasses.toList()) assertEquals("@tests.createAnnotation.arrayOfKClasses.Anno(klasses=[class java.lang.String, int])", anno.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/createJdkAnnotationInstance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/createJdkAnnotationInstance.kt index b075f4c..472fd5f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/createJdkAnnotationInstance.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/createJdkAnnotationInstance.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.createJdkAnnotationInstance import java.lang.annotation.Retention @@ -12,4 +16,4 @@ fun box(): String { assertEquals(RetentionPolicy.RUNTIME, r.value as RetentionPolicy) assertEquals(Retention::class.java.classLoader, r.javaClass.classLoader) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/enumKClassAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/enumKClassAnnotation.kt index cd6be70..8d6d74e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/enumKClassAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/enumKClassAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.enumKClassAnnotation @@ -45,4 +49,4 @@ fun box(): String { "levels=[WARNING], klasses=[class java.lang.Number], foos=[@tests.createAnnotation.enumKClassAnnotation.Foo(value=OK)])", a1.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/equalsHashCodeToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/equalsHashCodeToString.kt index eac2234..828503f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/equalsHashCodeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/equalsHashCodeToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.equalsHashCodeToString @@ -43,4 +47,4 @@ fun box(): String { if (b2.hashCode() != b3.hashCode()) return "Fail: hash codes of equal instances should be equal" return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/floatingPointParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/floatingPointParameters.kt index 3634161..16d6aa4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/floatingPointParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/floatingPointParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.floatingPointParameters import kotlin.test.assertEquals @@ -64,4 +68,4 @@ fun box(): String { checkNot(dpz, fpz) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/parameterNamedEquals.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/parameterNamedEquals.kt index 2dfab0d..6de0100 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/parameterNamedEquals.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/parameterNamedEquals.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.parameterNamedEquals import kotlin.test.assertEquals @@ -12,4 +16,4 @@ fun box(): String { assertEquals(false, f.equals) assertNotEquals(t, f) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/primitivesAndArrays.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/primitivesAndArrays.kt index 7ceae67..2ec2501 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/primitivesAndArrays.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/createAnnotation/primitivesAndArrays.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.createAnnotation.primitivesAndArrays @@ -81,4 +85,4 @@ fun box(): String { "str=lol, stra=[rofl])", a1.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/enumValuesValueOf.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/enumValuesValueOf.kt index f0f0bdf..a305ecb 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/enumValuesValueOf.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/enumValuesValueOf.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.functions.enumValuesValueOf @@ -12,4 +16,4 @@ fun box(): String { assertEquals(E.Y, E::valueOf.call("Y")) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/functionFromStdlib.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/functionFromStdlib.kt index edcdfe1..ff430de 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/functionFromStdlib.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/functionFromStdlib.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.functions.functionFromStdlib import kotlin.reflect.KFunction1 @@ -7,4 +11,4 @@ fun doStuff(fn: KFunction1) = fn.call("oK") fun box(): String { return doStuff(String::capitalize.apply { isAccessible = true }) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/genericOverriddenFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/genericOverriddenFunction.kt index c55e519..c1c1f70 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/genericOverriddenFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/genericOverriddenFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.functions.genericOverriddenFunction @@ -15,4 +19,4 @@ fun box(): String { assertEquals("T?", H::foo.returnType.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/isAccessibleOnAllMembers.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/isAccessibleOnAllMembers.kt index e119a9d..382c939 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/isAccessibleOnAllMembers.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/isAccessibleOnAllMembers.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.functions.isAccessibleOnAllMembers import kotlin.reflect.jvm.isAccessible @@ -15,4 +19,4 @@ class Observer : AutoCloseable { } private fun result() = "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/platformName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/platformName.kt index 25a8b9c..f8540fe 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/platformName.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/platformName.kt @@ -1,6 +1,10 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.functions.platformName @JvmName("Fail") fun OK() {} -fun box() = ::OK.name \ No newline at end of file +fun box() = ::OK.name diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/simpleNames.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/simpleNames.kt index eeb332f..9690c8e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/simpleNames.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/functions/simpleNames.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.functions.simpleNames import kotlin.test.assertEquals @@ -15,4 +19,4 @@ fun box(): String { assertEquals("bar", A::bar.name) assertEquals("baz", Int::baz.name) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/isInstance/isInstanceCastAndSafeCast.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/isInstance/isInstanceCastAndSafeCast.kt index c9f85e3..00ee394 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/isInstance/isInstanceCastAndSafeCast.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/isInstance/isInstanceCastAndSafeCast.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.isInstance.isInstanceCastAndSafeCast import kotlin.reflect.KClass @@ -55,4 +59,4 @@ fun box(): String { testInstance(::testInstance, Function2::class) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/array.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/array.kt index ca6e034..79bb09c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/array.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/array.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.kClassInAnnotation.array import kotlin.reflect.KClass @@ -15,4 +19,4 @@ fun box(): String { val argName1 = args[0].simpleName ?: "fail 1" val argName2 = args[1].simpleName ?: "fail 2" return argName1 + argName2 -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/basic.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/basic.kt index 779f05a..7e753c1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/basic.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/basic.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.kClassInAnnotation.basic import kotlin.reflect.KClass @@ -12,4 +16,4 @@ class OK fun box(): String { val argName = MyClass::class.java.getAnnotation(Ann::class.java).arg.simpleName ?: "fail 1" return argName -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/checkcast.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/checkcast.kt index bf9fc19..ba9a8ea 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/checkcast.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/checkcast.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.kClassInAnnotation.checkcast import kotlin.reflect.KClass @@ -9,4 +13,4 @@ fun box(): String { return "OK" } return "fail" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/forceWrapping.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/forceWrapping.kt index 006f01c..79db9f0 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/forceWrapping.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/forceWrapping.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.kClassInAnnotation.forceWrapping import kotlin.reflect.KClass @@ -18,4 +22,4 @@ fun box(): String { assertEquals(Int::class, k.kClasses[0]) assertEquals(Double::class, k.kClassesVararg[0]) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/vararg.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/vararg.kt index 1f47206..a13d9f4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/vararg.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/vararg.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.kClassInAnnotation.vararg import kotlin.reflect.KClass @@ -15,4 +19,4 @@ fun box(): String { val argName1 = args[0].simpleName ?: "fail 1" val argName2 = args[1].simpleName ?: "fail 2" return argName1 + argName2 -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/wrappingForCallableReferences.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/wrappingForCallableReferences.kt index 28c303f..017c0c7 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/wrappingForCallableReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/kClassInAnnotation/wrappingForCallableReferences.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.kClassInAnnotation.wrappingForCallableReferences import kotlin.reflect.KClass @@ -38,4 +42,4 @@ fun box(): String { checkBoundReferenceArray(Int::class, k::kClasses) checkBoundReferenceArray(Double::class, k::kClassesVararg) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/parameterNamesAndNullability.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/parameterNamesAndNullability.kt index 6e0f1c2..92a1373 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/parameterNamesAndNullability.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/parameterNamesAndNullability.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.parameterNamesAndNullability import kotlin.reflect.KParameter @@ -42,4 +46,4 @@ fun box(): String { extensionFunExpr() return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt index 300b9a0..347a133 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnDefaultWithInlineClassArgument.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnDefaultWithInlineClassArgument import kotlin.reflect.jvm.reflect @@ -6,4 +10,4 @@ inline class C(val x: Int) fun C.f(x: (String) -> Unit = { OK: String -> }) = x.reflect()?.parameters?.singleOrNull()?.name -fun box(): String = C(0).f() ?: "null" \ No newline at end of file +fun box(): String = C(0).f() ?: "null" diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt index 3559e35..56d8924 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInArrayConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnLambdaInArrayConstructor import kotlin.reflect.jvm.* @@ -8,4 +12,4 @@ fun box(): String { assertNotNull(Array(1) { {} }.single().reflect()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInConstructor.kt index 85dbf5b..fd427be 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnLambdaInConstructor import kotlin.reflect.jvm.reflect @@ -12,4 +16,4 @@ class C { fun box(): String = (C(0).o.reflect()?.parameters?.singleOrNull()?.name ?: "null") + - (C("").k.reflect()?.parameters?.singleOrNull()?.name ?: "null") \ No newline at end of file + (C("").k.reflect()?.parameters?.singleOrNull()?.name ?: "null") diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt index 8e1381b..88c7e5f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInField.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnLambdaInField import kotlin.reflect.jvm.reflect diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInStaticField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInStaticField.kt index 025a28d..2e2eddb 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInStaticField.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInStaticField.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnLambdaInStaticField import kotlin.reflect.jvm.reflect @@ -6,4 +10,4 @@ val x = { OK: String -> } fun box(): String { return x.reflect()?.parameters?.singleOrNull()?.name ?: "null" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt index 0b68ca1..c99c54f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspend.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnLambdaInSuspend // WITH_COROUTINES diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt index 1462828..dd302c8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnLambdaInSuspendLambda.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnLambdaInSuspendLambda // WITH_COROUTINES @@ -13,4 +17,4 @@ fun box(): String { x = { OK: String -> } }.startCoroutine(EmptyContinuation) return x.reflect()?.parameters?.singleOrNull()?.name ?: "null" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnSuspendLambdaInField.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnSuspendLambdaInField.kt index 14cfd84..15817e1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnSuspendLambdaInField.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/lambdaClasses/reflectOnSuspendLambdaInField.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.lambdaClasses.reflectOnSuspendLambdaInField import kotlin.reflect.jvm.reflect @@ -8,4 +12,4 @@ class C { fun box(): String { return C().x.reflect()?.parameters?.singleOrNull()?.name ?: "null" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt index 14483ec..59f70b8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/constructorWithInlineClassParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.constructorWithInlineClassParameters import kotlin.reflect.full.primaryConstructor @@ -18,4 +22,4 @@ fun box(): String { assertEquals("[x]", kctor2.parameters.map { it.name }.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt index 670ee93..098f6ef 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClassPrimaryVal.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.inlineClassPrimaryVal import kotlin.reflect.jvm.* @@ -35,4 +39,4 @@ fun box(): String { assertEquals(null, Z3.privateXBoundRef.javaGetter) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/inlineClassPrimaryVal.kt index 7db61d3..9a4ddf8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/inlineClassPrimaryVal.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/inlineClassPrimaryVal.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.inlineClasses.inlineClassPrimaryVal import kotlin.reflect.jvm.* @@ -35,4 +39,4 @@ fun box(): String { assertEquals(null, Z3.privateXBoundRef.javaGetter) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt index 17dbbc2..5bf49c9 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/inlineClasses/suspendFunctionWithInlineClassInSignature.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.inlineClasses.suspendFunctionWithInlineClassInSignature @@ -42,4 +46,4 @@ fun box(): String { } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/companionObjectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/companionObjectFunction.kt index e26f638..46d1011 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/companionObjectFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/companionObjectFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.jvmStatic.companionObjectFunction import kotlin.reflect.KFunction @@ -32,4 +36,4 @@ fun box(): String { assertEquals(j, j2) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/objectFunction.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/objectFunction.kt index 02f5202..9f04016 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/objectFunction.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/jvmStatic/objectFunction.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.jvmStatic.objectFunction import kotlin.reflect.KFunction @@ -19,4 +23,4 @@ fun box(): String { assertEquals(3, k.call(O, "def")) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/mappedClassIsEqualToClassLiteral.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/mappedClassIsEqualToClassLiteral.kt index fd85f59..8304080 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/mappedClassIsEqualToClassLiteral.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/mappedClassIsEqualToClassLiteral.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.mappedClassIsEqualToClassLiteral class A @@ -11,4 +15,4 @@ fun box(): String { if (a1.toString() != a2.toString()) return "Fail toString" return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt index 20abfb3..76892fa 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/methodsFromObject.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.methodsFromObject import kotlinx.reflect.lite.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt index 9282786..8a5a8b2 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/openSuspendFun.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.openSuspendFun import kotlin.reflect.full.declaredMemberFunctions @@ -18,4 +22,4 @@ fun box(): String { val aaa = Aaa::class.declaredMemberFunctions.first { it.name == "aaa" }.javaMethod assertEquals("aaa", aaa!!.name) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/annotationConstructorParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/annotationConstructorParameters.kt index 8acc220..7e84926 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/annotationConstructorParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/annotationConstructorParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.annotationConstructorParameters import java.lang.reflect.GenericArrayType @@ -44,4 +48,4 @@ fun box(): String { assertEquals(Class::class.java, (e as ParameterizedType).rawType) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassInSignature.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassInSignature.kt index ad70ce5..205d522 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassInSignature.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassInSignature.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.inlineClassInSignature import kotlin.reflect.jvm.* @@ -23,4 +27,4 @@ fun box(): String { */ return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassPrimaryVal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassPrimaryVal.kt index 27ba083..5e729d5 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassPrimaryVal.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/inlineClassPrimaryVal.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.inlineClassPrimaryVal import kotlin.reflect.KCallable @@ -56,4 +60,4 @@ fun box(): String { assertEquals("int", ZZ::x.getJavaTypeOfResult()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/innerGenericTypeArgument.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/innerGenericTypeArgument.kt index ec668f9..c4f0e9d 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/innerGenericTypeArgument.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/innerGenericTypeArgument.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.innerGenericTypeArgument // "IOOBE: Invalid index 4, size is 4" for java.lang.reflect.ParameterizedType on Android @@ -28,4 +32,4 @@ fun box(): String { ) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/overrideAnyWithPrimitive.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/overrideAnyWithPrimitive.kt index 0482b53..7fa2e68 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/overrideAnyWithPrimitive.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/overrideAnyWithPrimitive.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.overrideAnyWithPrimitive import kotlin.reflect.jvm.* @@ -22,4 +26,4 @@ fun box(): String { assertEquals(java.lang.Long.TYPE, A::bar.parameters.last().type.javaType) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/suspendFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/suspendFun.kt index 1ef0347..963f1c6 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/suspendFun.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/mapping/types/suspendFun.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.mapping.types.suspendFun import kotlin.reflect.jvm.javaType @@ -12,4 +16,4 @@ fun box(): String { assertEquals("java.util.List", type.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt index 2d4355f..f7dbc51 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/adaptedCallableReferencesNotEqualToCallablesFromAPI.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.adaptedCallableReferencesNotEqualToCallablesFromAPI import kotlin.reflect.* @@ -26,4 +30,4 @@ fun box(): String { checkNotEqual(allOfTheAbove(A::foo), foo) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/builtinFunctionsToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/builtinFunctionsToString.kt index 17267be..99399b6 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/builtinFunctionsToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/builtinFunctionsToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.builtinFunctionsToString import kotlin.test.assertEquals @@ -20,4 +24,4 @@ fun box(): String { assertToString("fun kotlin.collections.Collection.isEmpty(): kotlin.Boolean", Collection<*>::isEmpty) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt index 677fee0..ef675b5 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/callableReferencesEqualToCallablesFromAPI.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.callableReferencesEqualToCallablesFromAPI import kotlin.reflect.* @@ -19,4 +23,4 @@ fun box(): String { checkEqual(A::bar, A::class.members.single { it.name == "bar" }) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/classToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/classToString.kt index ce06e2a..f36054f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/classToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/classToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.classToString @@ -28,4 +32,4 @@ fun box(): String { assertEquals("class java.lang.Runnable", "${Runnable::class}") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/extensionPropertyReceiverToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/extensionPropertyReceiverToString.kt index 8f717ea..8bfeda4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/extensionPropertyReceiverToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/extensionPropertyReceiverToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.extensionPropertyReceiverToString import kotlin.reflect.KProperty1 @@ -85,4 +89,4 @@ fun box(): String { check("kotlin.collections.List>>", List>>::l) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideEqualsHashCode.kt index b2b0fd6..d405532 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideEqualsHashCode.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideEqualsHashCode.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.fakeOverrideEqualsHashCode import kotlin.test.assertNotEquals @@ -21,4 +25,4 @@ fun box(): String { assertNotEquals(bfoo.hashCode(), cfoo.hashCode()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString.kt index 59cd5be..4fe2772 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.fakeOverrideToString import kotlin.test.assertEquals @@ -23,4 +27,4 @@ fun box(): String { assertEquals("fun tests.methodsFromAny.fakeOverrideToString.C.foo(kotlin.String): kotlin.Unit", cfoo.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString2.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString2.kt index e1fa588..5c57cc1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString2.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/fakeOverrideToString2.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.fakeOverrideToString2 import kotlin.test.assertEquals @@ -29,4 +33,4 @@ fun box(): String { assertEquals("val tests.methodsFromAny.fakeOverrideToString2.I.x: kotlin.Int", x.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionEqualsHashCode.kt index 68fde69..ec08e6c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionEqualsHashCode.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionEqualsHashCode.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.functionEqualsHashCode import kotlin.test.* @@ -30,4 +34,4 @@ fun box(): String { assertFalse(A::mem == B::mem) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibMultiFileFacade.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibMultiFileFacade.kt index a6865af..57111b4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibMultiFileFacade.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibMultiFileFacade.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.functionFromStdlibMultiFileFacade // KT-12630 KotlinReflectionInternalError on referencing some functions from stdlib @@ -13,4 +17,4 @@ fun box(): String { assertEquals("fun lazyOf(T): kotlin.Lazy", lazyOf.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibSingleFileFacade.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibSingleFileFacade.kt index f4b7ad4..9939b78 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibSingleFileFacade.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionFromStdlibSingleFileFacade.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.functionFromStdlibSingleFileFacade // KT-12630 KotlinReflectionInternalError on referencing some functions from stdlib @@ -10,4 +14,4 @@ fun box(): String { assertEquals("fun kotlin.Any?.hashCode(): kotlin.Int", hashCode.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionToString.kt index f10e9dd..835c51b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/functionToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.functionToString @@ -23,4 +27,4 @@ fun box(): String { assertToString("fun kotlin.ranges.IntRange?.ext2(): kotlin.Array", IntRange::ext2) assertToString("fun tests.methodsFromAny.functionToString.A.mem(): kotlin.String", A::mem) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsHashCode.kt index dac4e93..1eaa3bd 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsHashCode.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsHashCode.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.parametersEqualsHashCode import kotlin.test.* @@ -25,4 +29,4 @@ fun box(): String { assertEquals(A::bar.parameters[0].hashCode(), A::bar.parameters[0].hashCode()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsWithClearCaches.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsWithClearCaches.kt index bf15ff0..f635a38 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsWithClearCaches.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersEqualsWithClearCaches.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.parametersEqualsWithClearCaches // FILE: box.kt @@ -43,4 +47,4 @@ fun box(): String { // check("property setter parameter") { (C::class.members.single { it.name == "x" } as KMutableProperty<*>).setter.parameters[2] } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersToString.kt index 1ecad24..a335455 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/parametersToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.parametersToString import kotlin.test.* @@ -27,4 +31,4 @@ fun box(): String { ) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyEqualsHashCode.kt index 8912f97..2b0f7a5 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyEqualsHashCode.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyEqualsHashCode.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.propertyEqualsHashCode import kotlin.test.* @@ -28,4 +32,4 @@ fun box(): String { assertFalse(A::mem == B::mem) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyToString.kt index 28f43f9..bb8f9ce 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/propertyToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.propertyToString @@ -31,4 +35,4 @@ fun box(): String { assertToString("getter of var tests.methodsFromAny.propertyToString.B.mem: kotlin.String", B::mem.getter) assertToString("setter of var tests.methodsFromAny.propertyToString.B.mem: kotlin.String", B::mem.setter) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeEqualsHashCode.kt index d2b5810..5afad0a 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeEqualsHashCode.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeEqualsHashCode.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.typeEqualsHashCode import kotlin.reflect.KType @@ -27,4 +31,4 @@ fun box(): String { check(typeParam.parameters.last().type, typeParam.returnType) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersEqualsHashCode.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersEqualsHashCode.kt index ca5a491..e4c059e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersEqualsHashCode.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersEqualsHashCode.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.typeParametersEqualsHashCode import kotlin.test.assertEquals @@ -36,4 +40,4 @@ fun box(): String { } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersToString.kt index a3b822d..00fd4e9 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeParametersToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.typeParametersToString import kotlin.test.assertEquals @@ -12,4 +16,4 @@ fun box(): String { assertEquals("[T]", SeveralBounds::class.typeParameters.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToString.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToString.kt index 401de40..c7b2b90 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToString.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToString.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.typeToString @@ -36,4 +40,4 @@ fun box(): String { ) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToStringInnerGeneric.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToStringInnerGeneric.kt index d0c58a5..fae1009 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToStringInnerGeneric.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/methodsFromAny/typeToStringInnerGeneric.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.methodsFromAny.typeToStringInnerGeneric @@ -15,4 +19,4 @@ fun foo(): A.B.C = null!! fun box(): String { assertEquals("tests.methodsFromAny.typeToStringInnerGeneric.A.B.C", ::foo.returnType.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableModality.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableModality.kt index 4ee5da7..0694c1f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableModality.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableModality.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.modifiers.callableModality import kotlin.test.assertTrue @@ -48,4 +52,4 @@ fun box(): String { assertTrue(AbstractClass::abstractVar.setter.isAbstract) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableVisibility.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableVisibility.kt index 6f75b26..c07c244 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableVisibility.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/callableVisibility.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.modifiers.callableVisibility import kotlin.reflect.KFunction @@ -52,4 +56,4 @@ fun box(): String { assertEquals(KVisibility.PRIVATE, f.getPublicVarPrivateSetter().setter.visibility) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classModality.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classModality.kt index 116881f..544a0a2 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classModality.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classModality.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.modifiers.classModality import kotlin.test.assertTrue @@ -53,4 +57,4 @@ fun box(): String { assertFalse(Object::class.isAbstract) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classVisibility.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classVisibility.kt index f7f58e0..fa2fcaf 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classVisibility.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/classVisibility.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.modifiers.classVisibility import kotlin.reflect.KClass @@ -26,4 +30,4 @@ fun box(): String { assertEquals(null, anonymous::class.visibility) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/functions.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/functions.kt index 8e999fd..816ae8e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/functions.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/functions.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.modifiers.functions import kotlin.test.assertTrue @@ -56,4 +60,4 @@ fun box(): String { assertFalse(::inlineProperty.isSuspend) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/properties.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/properties.kt index 8b3c63d..7df4eaa 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/properties.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/properties.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.modifiers.properties import kotlin.test.assertTrue @@ -19,4 +23,4 @@ fun box(): String { assertFalse(A::nonLateinit.isLateinit) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/typeParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/typeParameters.kt index 2d5a03d..6ac9132 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/typeParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/modifiers/typeParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.modifiers.typeParameters import kotlin.test.assertTrue @@ -12,4 +16,4 @@ fun box(): String { assertFalse(A::class.members.single { it.name == "nonReified" }.typeParameters.single().isReified) assertTrue(A::class.members.single { it.name == "reified" }.typeParameters.single().isReified) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt index 8b40213..a483b7e 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundInnerClassConstructor.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.boundInnerClassConstructor // Simi diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt index 83e65e5..27af61d 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundObjectMemberReferences.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.boundObjectMemberReferences import kotlin.reflect.* @@ -20,4 +24,4 @@ fun box(): String { assertEquals(String::class.java, fooParams[1].type.javaType) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt index 103db76..5d8cd54 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/boundReferences.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.boundReferences import kotlin.reflect.* @@ -28,4 +32,4 @@ fun box(): String { cExtFun.parameters[0].check("i") return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt index 139e0c4..47e2061 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceExtensionReceiverAndValueParameters1.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.instanceExtensionReceiverAndValueParameters1 import kotlin.reflect.full.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt index 2c780d4..2ce79c8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/instanceParameterOfFakeOverride1.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.instanceParameterOfFakeOverride1 import kotlin.reflect.full.instanceParameter diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt index b149499..519631a 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/parameters/isOptionalOverridesParameters.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.parameters.isOptionalOverridesParameters import kotlin.test.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt index b63bfe1..888a054 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/allVsDeclared.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.allVsDeclared import kotlin.reflect.full.* @@ -22,4 +26,4 @@ fun box(): String { assertEquals(listOf("d"), sub.declaredMemberExtensionProperties.map { it.name }) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt index b68b06c..f53d3a4 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/fakeOverridesInSubclass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.fakeOverridesInSubclass import kotlin.reflect.full.* @@ -14,4 +18,4 @@ fun box(): String { val allProps = Sub::class.memberProperties assertEquals(listOf("r"), allProps.map { it.name }) return allProps.single().get(Sub("OK")) as String -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt index d943015..81814d8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericClassLiteralPropertyReceiverIsStar.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.genericClassLiteralPropertyReceiverIsStar import kotlin.reflect.* @@ -10,4 +14,4 @@ class A { fun box(): String { val k: KProperty1, *> = A::class.memberProperties.single() return k.get(A()) as String -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericOverriddenProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericOverriddenProperty.kt index a597302..644e883 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericOverriddenProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericOverriddenProperty.kt @@ -1,4 +1,8 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // KT-13700 Exception obtaining descriptor for property reference package tests.properties.genericOverriddenProperty @@ -16,4 +20,4 @@ fun box(): String { assertEquals("T?", H::parent.returnType.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericProperty.kt index e6919ae..46cd6a1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/genericProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.genericProperty @@ -9,4 +13,4 @@ fun box(): String { val p = Box::element assertEquals("val tests.properties.genericProperty.Box.element: T", p.toString()) return p.call(Box("OK")) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt index 59f3660..fcfe071 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/booleanPropertyNameStartsWithIs.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.booleanPropertyNameStartsWithIs import kotlin.reflect.KProperty @@ -17,4 +21,4 @@ fun box(): String { assertEquals(Delegate, Foo::isOK.apply { isAccessible = true }.getDelegate(foo)) assertEquals(Delegate, foo::isOK.apply { isAccessible = true }.getDelegate()) return if (foo.isOK) "OK" else "Fail" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/boundExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/boundExtensionProperty.kt index c1c7e6e..1fe3a19 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/boundExtensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/boundExtensionProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.boundExtensionProperty import kotlin.reflect.KProperty @@ -22,4 +26,4 @@ fun box(): String { assertEquals(d, (foo::result).apply { isAccessible = true }.getDelegate()) assertEquals(d, (Foo()::result).apply { isAccessible = true }.getDelegate()) return d.getValue(foo, Foo::result) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/extensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/extensionProperty.kt index 7d5bad0..d425cfc 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/extensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/extensionProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.extensionProperty import kotlin.reflect.KProperty @@ -21,4 +25,4 @@ fun box(): String { foo.result = "OK" assertEquals(d, Foo::result.apply { isAccessible = true }.getDelegate(foo)) return d.getValue(foo, Foo::result) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/fakeOverride.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/fakeOverride.kt index 33ee21e..cce97cd 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/fakeOverride.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/fakeOverride.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.fakeOverride import kotlin.reflect.KProperty @@ -21,4 +25,4 @@ fun box(): String { (Derived::x).apply { isAccessible = true }.getDelegate(d) ) return d.x -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/kPropertyForDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/kPropertyForDelegatedProperty.kt index 0cf48c9..1b62af9 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/kPropertyForDelegatedProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/kPropertyForDelegatedProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.kPropertyForDelegatedProperty import kotlin.reflect.KProperty @@ -28,4 +32,4 @@ fun box(): String { result = "OK" assertEquals(d, prop.apply { isAccessible = true }.getDelegate()) return result -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberExtensionProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberExtensionProperty.kt index 1d38932..bc0555a 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberExtensionProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberExtensionProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.memberExtensionProperty import kotlin.reflect.* @@ -25,4 +29,4 @@ fun box(): String { with(foo) { bar.result = "OK" } assertEquals(d, prop.apply { isAccessible = true }.getDelegate(foo, bar)) return d.getValue(foo, prop) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberProperty.kt index cff750d..e75277c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/memberProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.memberProperty import kotlin.reflect.KProperty @@ -21,4 +25,4 @@ fun box(): String { foo.result = "OK" assertEquals(d, (Foo::result).apply { isAccessible = true }.getDelegate(foo)) return d.getValue(foo, Foo::result) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt index 91570b4..9da6bc8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/method/delegateMethodIsNonOverridable.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.method.delegateMethodIsNonOverridable import kotlin.reflect.* @@ -30,4 +34,4 @@ fun box(): String { if (result != "a a b b") return "Fail: $result" return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/nameClashClassAndCompanion.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/nameClashClassAndCompanion.kt index d17ab10..49c0c83 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/nameClashClassAndCompanion.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/nameClashClassAndCompanion.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.nameClashClassAndCompanion import kotlin.reflect.KProperty @@ -22,4 +26,4 @@ fun box(): String { assertEquals("class", ((Foo::x).apply { isAccessible = true }.getDelegate(foo) as Delegate).value) assertEquals("companion", ((Foo.Companion::x).apply { isAccessible = true }.getDelegate() as Delegate).value) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/notDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/notDelegatedProperty.kt index 4eafeb5..0c9d968 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/notDelegatedProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/notDelegatedProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.notDelegatedProperty import kotlin.reflect.KProperty2 @@ -25,4 +29,4 @@ fun box(): String { assertNull(me.apply { isAccessible = true }.getDelegate(Foo(), "")) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/overrideDelegatedByDelegated.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/overrideDelegatedByDelegated.kt index f12c90a..ba85d42 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/overrideDelegatedByDelegated.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/overrideDelegatedByDelegated.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.overrideDelegatedByDelegated import kotlin.reflect.KProperty @@ -33,4 +37,4 @@ fun box(): String { check("Base", (Base::x).apply { isAccessible = true }.getDelegate(derived)) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/topLevelProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/topLevelProperty.kt index 150de8d..4dab142 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/topLevelProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getDelegate/topLevelProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getDelegate.topLevelProperty import kotlin.reflect.KProperty @@ -19,4 +23,4 @@ fun box(): String { result = "OK" assertEquals(d, (::result).apply { isAccessible = true }.getDelegate()) return d.getValue(null, p) -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt index f568b73..ee83ad1 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getExtensionPropertiesMutableVsReadonly.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getExtensionPropertiesMutableVsReadonly import kotlin.reflect.* @@ -26,4 +30,4 @@ fun box(): String { assert(mutable.get(a, "") == "before") { "Fail 3: ${mutable.get(a, "")}" } mutable.set(a, "", "OK") return mutable.get(a, "") -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt index 72e13ce..5b9c520 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/getPropertiesMutableVsReadonly.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.getPropertiesMutableVsReadonly import kotlinx.reflect.lite.jvm.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt index a139feb..f430c64 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/annotationCompanionWithAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.jvmField.annotationCompanionWithAnnotation import kotlin.reflect.full.declaredMemberProperties @@ -16,4 +20,4 @@ annotation class Foo { fun box(): String { val field = Foo.Companion::class.declaredMemberProperties.single() return (field.annotations.single() as Ann).value + (field.get(Foo.Companion) as Bar).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt index 905bd13..d64e22c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanion.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.jvmField.interfaceCompanion import kotlin.reflect.KProperty1 @@ -18,4 +22,4 @@ interface Foo { fun box(): String { val field = Foo::class.companionObject!!.memberProperties.single() as KProperty1 return field.get(Foo.Companion).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt index ca0ec4f..7eb11e3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/jvmField/interfaceCompanionWithAnnotation.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.jvmField.interfaceCompanionWithAnnotation import kotlin.reflect.full.declaredMemberProperties @@ -16,4 +20,4 @@ interface Foo { fun box(): String { val field = Foo.Companion::class.declaredMemberProperties.single() return (field.annotations.single() as Ann).value + (field.get(Foo.Companion) as Bar).value -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/defaultImpls.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/defaultImpls.kt index 030aa5c..87fbba3 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/defaultImpls.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/defaultImpls.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.localDelegated.defaultImpls import kotlin.reflect.KProperty @@ -19,4 +23,4 @@ interface Foo { object O : Foo -fun box(): String = O.bar() \ No newline at end of file +fun box(): String = O.bar() diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inLambda.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inLambda.kt index 54387e9..59b998b 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inLambda.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inLambda.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.localDelegated.inLambda import kotlin.reflect.* @@ -10,4 +14,4 @@ inline operator fun String.getValue(t:Any?, p: KProperty<*>): String = fun box() = eval { val x by "OK" x -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inlineFun.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inlineFun.kt index d979091..907eddd 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inlineFun.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/inlineFun.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.localDelegated.inlineFun import kotlin.reflect.* @@ -22,4 +26,4 @@ fun box(): String { Foo().foo() assertEquals("val x: kotlin.Unit", Delegate.property.toString()) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localAndNonLocal.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localAndNonLocal.kt index 5852b41..19062b9 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localAndNonLocal.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localAndNonLocal.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.localDelegated.localAndNonLocal import kotlin.reflect.KProperty @@ -30,4 +34,4 @@ fun box(): String { if (y != "y:kotlin.String") return "Fail y: $y" return C().test() -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localDelegatedProperty.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localDelegatedProperty.kt index ac68cbb..8afd34c 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localDelegatedProperty.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/localDelegatedProperty.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.localDelegated.localDelegatedProperty import kotlin.reflect.* @@ -71,4 +75,4 @@ fun box(): String { check("localVar", Delegate.property as KProperty0<*>)?.let { error -> return error } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/variableOfGenericType.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/variableOfGenericType.kt index 496fb79..2344880 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/variableOfGenericType.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/localDelegated/variableOfGenericType.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.localDelegated.variableOfGenericType import kotlin.reflect.* @@ -27,4 +31,4 @@ class A { fun box(): String { A().B().foo() return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt index 6d0bbaf..2c077d0 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/memberAndMemberExtensionWithSameName.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.memberAndMemberExtensionWithSameName import kotlin.reflect.* @@ -23,4 +27,4 @@ fun box(): String { } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt index 95adf0c..1086c6d 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/privateFakeOverrideFromSuperclass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.privateFakeOverrideFromSuperclass import kotlin.reflect.full.* @@ -7,4 +11,4 @@ class B : A(42) fun box() = if (B::class.memberProperties.isEmpty()) "OK" - else "Fail: invisible fake overrides should not appear in KClass.memberProperties" \ No newline at end of file + else "Fail: invisible fake overrides should not appear in KClass.memberProperties" diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties1.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties1.kt index 2ddf3f0..0cea004 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties1.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/properties/simpleGetProperties1.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.properties.simpleGetProperties1 import kotlin.reflect.full.* diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/declarationSiteVariance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/declarationSiteVariance.kt index a2478d7..dd32674 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/declarationSiteVariance.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/declarationSiteVariance.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.typeParameters.declarationSiteVariance import kotlin.reflect.KVariance @@ -20,4 +24,4 @@ fun box(): String { assertEquals(KVariance.INVARIANT, Triple::class.members.single { it.name == "foo" }.typeParameters.single().variance) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/innerGenericParameter.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/innerGenericParameter.kt index 5effe2d..a799a27 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/innerGenericParameter.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/innerGenericParameter.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.typeParameters.innerGenericParameter import kotlin.reflect.KVariance @@ -24,4 +28,4 @@ fun box(): String { assertEquals(u, fn.parameters[1].type.classifier) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/typeParametersAndNames.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/typeParametersAndNames.kt index ce8fd45..e7b80a8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/typeParametersAndNames.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/typeParametersAndNames.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.typeParameters.typeParametersAndNames import kotlin.reflect.KClass @@ -33,4 +37,4 @@ fun box(): String { assertEquals(listOf(), get(String::class)) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/upperBounds.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/upperBounds.kt index b83d086..c4db69f 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/upperBounds.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/typeParameters/upperBounds.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.typeParameters.upperBounds import kotlin.reflect.KTypeProjection @@ -56,4 +60,4 @@ fun box(): String { } return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsClass.kt index d063d82..a5e3e66 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.classifierIsClass import kotlin.test.assertEquals @@ -22,4 +26,4 @@ fun box(): String { assertEquals(Array::class, ::array.returnType.classifier) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsTypeParameter.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsTypeParameter.kt index 8901912..7342e28 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsTypeParameter.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifierIsTypeParameter.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.classifierIsTypeParameter import kotlin.reflect.KTypeParameter @@ -20,4 +24,4 @@ fun box(): String { assertEquals(Array::class, u.classifier) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifiersOfBuiltInTypes.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifiersOfBuiltInTypes.kt index 66dd5b0..07b36ab 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifiersOfBuiltInTypes.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/classifiersOfBuiltInTypes.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.classifiersOfBuiltInTypes import kotlin.reflect.KClass @@ -109,4 +113,4 @@ fun box(): String { ) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/equalsForClassAndTypeParameterWithSameFqName.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/equalsForClassAndTypeParameterWithSameFqName.kt index ca2acf6..49999f2 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/equalsForClassAndTypeParameterWithSameFqName.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/equalsForClassAndTypeParameterWithSameFqName.kt @@ -1,4 +1,8 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + // FIR incorrectly resolves typeParameterType's return type to the nested class `A.T`. package tests.types.equalsForClassAndTypeParameterWithSameFqName @@ -21,4 +25,4 @@ fun box(): String { return "Fail 2: class' type constructor shouldn't be equal to the type parameter with the same FQ name" return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/innerGenericArguments.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/innerGenericArguments.kt index 5dffbef..4c5db91 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/innerGenericArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/innerGenericArguments.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.innerGenericArguments import kotlin.test.* @@ -29,4 +33,4 @@ fun box(): String { assertTrue(types[1].isMarkedNullable) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfClass.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfClass.kt index a462a46..0b2ed27 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfClass.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfClass.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.jvmErasureOfClass import kotlin.reflect.jvm.jvmErasure @@ -17,4 +21,4 @@ fun box(): String { assertEquals(MutableCollection::class, ::mutableCollection.returnType.jvmErasure) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfTypeParameter.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfTypeParameter.kt index a7e40b2..14abca8 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfTypeParameter.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/jvmErasureOfTypeParameter.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.jvmErasureOfTypeParameter import kotlin.reflect.jvm.jvmErasure @@ -42,4 +46,4 @@ fun box(): String { assertEquals(Array>::class, get("arrayOfArrayOfCloneable")) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/typeArguments.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/typeArguments.kt index 246360a..4ed6a34 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/typeArguments.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/typeArguments.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.typeArguments import kotlin.reflect.KTypeProjection @@ -39,4 +43,4 @@ fun box(): String { assertEquals(KVariance.INVARIANT, ::list.returnType.arguments.single().variance) return "OK" -} \ No newline at end of file +} diff --git a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/useSiteVariance.kt b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/useSiteVariance.kt index 3e6f538..bd87152 100644 --- a/src/test/java/kotlinx/reflect/lite/unusedTestData/types/useSiteVariance.kt +++ b/src/test/java/kotlinx/reflect/lite/unusedTestData/types/useSiteVariance.kt @@ -1,3 +1,7 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package tests.types.useSiteVariance import kotlin.reflect.KVariance @@ -23,4 +27,4 @@ fun box(): String { assertEquals(KVariance.INVARIANT, ::listOfStrings.returnType.arguments.first().variance) return "OK" -} \ No newline at end of file +}