From af3efea74d5ae35935912e1ca5b22b3ee7e0eef4 Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 20 Oct 2017 13:37:02 +0100 Subject: [PATCH 01/22] Renaming java files --- .../AbstractGeneric.class | Bin 0 -> 401 bytes .../AbstractGeneric.java | 4 +++ .../AbstractGenericClass.class | Bin 421 -> 0 bytes .../AbstractGenericClass.java | 4 --- .../java_bytecode_parse_generics/Bar.class | Bin 221 -> 0 bytes .../java_bytecode_parse_generics/Bar.java | 4 --- .../BasicInterface.java | 4 --- .../BasicInterfaceCopy.class | Bin 138 -> 0 bytes .../BasicInterfaceCopy.java | 4 --- .../DerivedGeneric.class | Bin 309 -> 318 bytes .../DerivedGeneric.java | 2 +- .../java_bytecode_parse_generics/Foo.class | Bin 356 -> 0 bytes .../Generic.class | Bin 0 -> 662 bytes .../java_bytecode_parse_generics/Generic.java | 11 +++++++ .../GenericFunctions.class | Bin 1791 -> 1772 bytes .../GenericFunctions.java | 10 +++--- .../Interface.class | Bin 0 -> 120 bytes .../Interface.java | 4 +++ ...icInterface.class => Interface_Copy.class} | Bin 130 -> 130 bytes .../Interface_Copy.java | 4 +++ .../Interface_Implementation.class | Bin 0 -> 414 bytes ...Foo.java => Interface_Implementation.java} | 2 +- .../Interface_Implementation_Derived.class | Bin 0 -> 329 bytes .../Interface_Implementation_Derived.java | 4 +++ .../Outer$Inner.class | Bin 618 -> 598 bytes .../java_bytecode_parse_generics/Outer.java | 4 +-- .../RecursiveGeneric.class | Bin 346 -> 436 bytes .../RecursiveGeneric.java | 4 +-- .../RecursiveGeneric_Derived.class | Bin 0 -> 366 bytes .../RecursiveGeneric_Derived.java | 4 +++ .../SimpleGeneric.class | Bin 698 -> 0 bytes .../SimpleGeneric.java | 11 ------- .../SimpleRecursiveGeneric.class | Bin 466 -> 0 bytes .../SimpleRecursiveGeneric.java | 4 --- .../WildcardGenericFunctions.class | Bin 2131 -> 2273 bytes .../WildcardGenericFunctions.java | 29 ++++++++++-------- .../generics05$igeneric05.class | Bin 856 -> 0 bytes .../parse_generic_functions.cpp | 10 +++--- .../parse_generic_wildcard_function.cpp | 9 +++--- .../parse_signature_descriptor_mismatch.cpp | 2 +- 40 files changed, 69 insertions(+), 65 deletions(-) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/AbstractGeneric.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/AbstractGeneric.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/AbstractGenericClass.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/AbstractGenericClass.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Bar.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Bar.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BasicInterface.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BasicInterfaceCopy.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BasicInterfaceCopy.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Foo.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Generic.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Generic.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Interface.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Interface.java rename unit/java_bytecode/java_bytecode_parse_generics/{BasicInterface.class => Interface_Copy.class} (50%) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Interface_Copy.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation.class rename unit/java_bytecode/java_bytecode_parse_generics/{Foo.java => Interface_Implementation.java} (53%) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation_Derived.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation_Derived.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric_Derived.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric_Derived.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/SimpleGeneric.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/SimpleGeneric.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/SimpleRecursiveGeneric.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/SimpleRecursiveGeneric.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics05$igeneric05.class diff --git a/unit/java_bytecode/java_bytecode_parse_generics/AbstractGeneric.class b/unit/java_bytecode/java_bytecode_parse_generics/AbstractGeneric.class new file mode 100644 index 0000000000000000000000000000000000000000..df3a55764e07d5855e9e146aad9a9b6a66b2f783 GIT binary patch literal 401 zcmZWly-ve07(6$BGz9uX)t#*{(1nRak*Z2%iC}2d-7!{i6&&O`NIVu35(5vwLm|FI zFf`cG*>}G4_t{_HAD;lOF$v*d6kr_SjKNQoRyJjDW)~Xwka zq>Qsl@N&bAYWT0{+DEl#7-frMZw(jrR%&UKh#97b{@3Tf%(QDx@;pu{(O;{r=C(Fe zZIE@rprmEk*ns82rfK&Q|F9f*sb86qeq|9 w3`Ub;gg&uF%K`859qf$+2LYi^a$`LrjM}}2K0;#02TDY&hm#ghF=*G}59|I~y8r+H literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/AbstractGeneric.java b/unit/java_bytecode/java_bytecode_parse_generics/AbstractGeneric.java new file mode 100644 index 00000000000..4196629ce73 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/AbstractGeneric.java @@ -0,0 +1,4 @@ +public abstract class AbstractGeneric +{ + +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/AbstractGenericClass.class b/unit/java_bytecode/java_bytecode_parse_generics/AbstractGenericClass.class deleted file mode 100644 index cbfa2cb7b184b90686c08afef32c7fde510da40c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmZvYPfNov7{;Hh|6HwZ&LM~=Z_|Ujc(SE126`!aSlK>{s-FnN!AP}$t&PrBE`T7rd@RbFdS7d-)BXbta-T4P%P+ z7jji{-6-liiPD>7&0qPn;N@!ikgY|o!}vd9@E291a&arodr!NbbY(6IV8dY;cNH)U z|Ms%a(W4JDgVCfcsY`Cwdce8-0DC83!6S7Eo6 -{ - -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Bar.class b/unit/java_bytecode/java_bytecode_parse_generics/Bar.class deleted file mode 100644 index 3b52a177ccaea0ff06e2439b8d485a80ce068fdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmXYr&kn&r5XQghU#e6*fg=uF+=v5-Q{zH<-_|Bps++9VdpSuQJb;H1(=y4*SWvCc%E2%~EM zhfaA?SArX_g;@}Sy{=3qx2pcoVm3XCn+V~+<^AkAZ?(n{7N1ZD@#8L6kJXH8P29-? ZbZ23~=j=6*H?j_Y185^)N9Z(D;TK_ZBozPv diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Bar.java b/unit/java_bytecode/java_bytecode_parse_generics/Bar.java deleted file mode 100644 index 273a20744dc..00000000000 --- a/unit/java_bytecode/java_bytecode_parse_generics/Bar.java +++ /dev/null @@ -1,4 +0,0 @@ -class Bar extends Foo -{ - -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/BasicInterface.java b/unit/java_bytecode/java_bytecode_parse_generics/BasicInterface.java deleted file mode 100644 index 47f91d66f86..00000000000 --- a/unit/java_bytecode/java_bytecode_parse_generics/BasicInterface.java +++ /dev/null @@ -1,4 +0,0 @@ -interface BasicInterface -{ - int getX(); -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/BasicInterfaceCopy.class b/unit/java_bytecode/java_bytecode_parse_generics/BasicInterfaceCopy.class deleted file mode 100644 index c61caf0740a0fecd636a23e0b54ee6529d7fbefb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmX^0Z`VEs1_l!bPId-%b_Nbc2A1^Hk_biyW(`eGMh33n{L-T2RJY8WR7M7Ir^MpS zWY4^k)S|S+4QD(A@k7r&m57*6aAs~nPO5uqUTRThvW<^he*VO{cI> +class DerivedGeneric extends Generic { } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Foo.class b/unit/java_bytecode/java_bytecode_parse_generics/Foo.class deleted file mode 100644 index e64c1c07f6af0f6b43b48c686fa54ed4d3961607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmZvXPfNo<5XIl7Nw$r#t@ZEGqk1qGZ;A(nLLuluDPA}0TDQam(yjQRyaZU1P^bR`OUo9+0U={4**BlNf2VahYmI*HYK(swgto!H4%tUY-Qc4Kxc1%DiEI6 zw?<%)+sa%l9}3f4tD+Jt9sdJGq$a} z%YnnWdQ>U8=%t7uIY%fkY;jhqYL;CVbEBO=|4c2co>a~>cS;-V^7asXhvLPM{8vD6 y73+jq<~u-i@CNbX+bfJQF{qR=^?8I<^gSD3Nb=YGir|^e0Kew=U-O!u8hrzDV>F@w diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Generic.class b/unit/java_bytecode/java_bytecode_parse_generics/Generic.class new file mode 100644 index 0000000000000000000000000000000000000000..38e44b1b33d9659b0064d08acd800900925c01df GIT binary patch literal 662 zcmZuu%T5A85Uc@~<*__O#V6{KMA{d_;s^Lq z#u{D*F`M*GS65Z{On-g9e*!qdegXz|Ozb8Q!cLr_U}8@|1Ohp`BZsoum0r7g)$FKN za3T3q;QPx2$Ds*Hf2+UQ_vwY<7v{?0!pjuchzm zdU_J#74@3!cdU*tVM%(&?psm8u_GLt=ducktQLUDQC(o90OF_hf_=P*3= z)Nlk!HRpI)Q7_VbE}L~K{?A>O3nUu-f!|W+uD-K1o$gS-q=f{M0_GI65QQm_{rku` z;1&#Shg;AT#u&2@^md>bjy63McuZuMJ>&ucl> RCb!w3a&p?l7V9Bw{{ZUmeM|rV literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Generic.java b/unit/java_bytecode/java_bytecode_parse_generics/Generic.java new file mode 100644 index 00000000000..a4905a01ae9 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/Generic.java @@ -0,0 +1,11 @@ +class Generic +{ + public T t; + + public static Generic makeGeneric(T value) + { + Generic newST = new Generic(); + newST.t = value; + return newST; + } +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class index e82142ef77ca5188f0e03e2535118ecf4c740609..964cf0b91984c508a3f086ca96669362af32bfc5 100644 GIT binary patch delta 288 zcmey*`-XSI1yLRiANSO})S}E}Yt1l52F40T22P)eAC;N-d?w2-#5Vr6!kH+iCbrPGd9`Rs_mg`FQ4)q!y(mCZ~eMcQP6(>VtH_h2uSQ3vyC( zQ}ap^OEUBGz^eW*n(JEQRfS{#SVtI>wTcm%eMoBJo%0JS!3vKs<(YHBE$3mdVX$Rn akbn!IxrUK}4{TNNYo`5|dMrluTnZ z6jA^gaNWT-gvNj7Pf XFfs_C%1sVnHeu(5gwEzx=5%HN_;X~u diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java index 5a5eb5221f7..be30b40cb7a 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java @@ -1,26 +1,26 @@ public class GenericFunctions { - public static void processSimpleGeneric(SimpleGeneric x) { + public static void processSimpleGeneric(Generic x) { assert(x.t==null); } // Test a wildcard generic bound by an interface - public static void processUpperBoundInterfaceGeneric(SimpleGeneric x) { + public static void processUpperBoundInterfaceGeneric(Generic x) { assert(x.t.getX() == 4); } // Test a wild card generic bound by a class - public static void processUpperBoundClassGeneric(SimpleGeneric x) { + public static void processUpperBoundClassGeneric(Generic x) { assert(x.t.getX() == 4); } // Test a wild card generic bound by a class and an interface - public static void processDoubleUpperBoundClassGeneric(SimpleGeneric x) { + public static void processDoubleUpperBoundClassGeneric(Generic x) { assert(x.t.getX() == 4); } // Test a wild card generic bound by two interfaces - public static void processDoubleUpperBoundInterfaceGeneric(SimpleGeneric x) { + public static void processDoubleUpperBoundInterfaceGeneric(Generic x) { assert(x.t.getX() == 4); } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Interface.class b/unit/java_bytecode/java_bytecode_parse_generics/Interface.class new file mode 100644 index 0000000000000000000000000000000000000000..c1668c7c684cdc79a582fb0af5bb230548e6ca33 GIT binary patch literal 120 zcmX^0Z`VEs1_l!bPId-%b_Nbc2A1^Hk_biyW(`eGMh33n{L-T2RJY8WR7M6q&%Bb< zqO`>1RK2XkvP4D(PPhOgg8)cKKPNFSUEe<`D>b=mz7wS$jHElDmpRH5CCl85AXm0 delta 46 pcmZo-Y+{_CtKyVcoSE#ISCU$kmYAHXmz7wS$jHElDmpRH5CCWx55NEb diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Interface_Copy.java b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Copy.java new file mode 100644 index 00000000000..c09c1310d1c --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Copy.java @@ -0,0 +1,4 @@ +interface Interface_Copy +{ + int getX(); +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation.class b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation.class new file mode 100644 index 0000000000000000000000000000000000000000..6ac7e2b13eb8cccb5664192ee85b3980e4bc376b GIT binary patch literal 414 zcmZ`#O-sW-5Pg&8!^CK7{VIasQ9YQ8w~7}*2n0PS#hYy6TDK${iCghUc_|2j2Y-M+ zN}MdB2=?%XnK$pfW%lFq?H#}&1`%AWhUj1|zYRW6%Lk(bQ$v$_!FNHnUQze(5JsRzPVmTDuLTT#gCw7M^4CAASo)q2Q@ zV`;8zJiiuQ)YGPrr>c$Ip65E4h({4)0bvXu0bwvtN$9oOq!fCboaYl+7()1?#tvWY zg5WXuRs{Sb4uhk4j<`$g2JrS@K{LBv9Gk?u5aGrVT;MeT` JYhJOc{ui_uOt1g| literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Foo.java b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation.java similarity index 53% rename from unit/java_bytecode/java_bytecode_parse_generics/Foo.java rename to unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation.java index c81911835c6..2601520dcd4 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/Foo.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation.java @@ -1,4 +1,4 @@ -class Foo implements BasicInterface +class Interface_Implementation implements Interface { public int x; diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation_Derived.class b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation_Derived.class new file mode 100644 index 0000000000000000000000000000000000000000..fcb2d78f8f218cd68470302391595c1f7218df9b GIT binary patch literal 329 zcmah^v1$TQ5S-QXPS1-5D@zdswJ=S(h)qI3IMOJ#@;q03a`#SNp8i*=Kng#=kCN;e z+u*|P%nq{yd%paf06gO{L>UhO8UdOFf2@sm6GFK^SP;C|e9eSrtPOu0vK8C8TBV}2 z;yh95LRnqxH_>xj{YmJ?Q{&ifRKm+?wof@@3BT(it#|KW zv{OeF!9#`6xo0M{|FfWjlDu0KNlTufFYHOMP%6W3(3g-B0-63*Bvge*e+JYL%0{SP GUC}Q93{YGE literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation_Derived.java b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation_Derived.java new file mode 100644 index 00000000000..66c54762b39 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/Interface_Implementation_Derived.java @@ -0,0 +1,4 @@ +class Interface_Implementation_Derived extends Interface_Implementation +{ + +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Outer$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/Outer$Inner.class index bab6c799f45418d3dca7282efc6e07c1e7d33ce1..0e8a92206dec18952baf1985cdd098dff305cb19 100644 GIT binary patch delta 112 zcmaFGa*btzs-d8dV^VQRQDSn5dum>4QD(9=BLin}W_n&?Noi3kBZC;a{KNzmNofrq Z|I(7wB5MrEMU#ajHPA&j`!LEe0sxL8CjkHe delta 132 zcmcb{@``1Gs4QD(ApPGWJfH6sIOaAta5Vo7OHDkFn5Rz(xT eROA#ieEdsGQj4sytC&1lTuuY4)Mg7tIYs~;jV{yx diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Outer.java b/unit/java_bytecode/java_bytecode_parse_generics/Outer.java index 0360a6adf15..dcd7ac5bf1f 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/Outer.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/Outer.java @@ -2,9 +2,9 @@ public class Outer { private class Inner { - private final AbstractGenericClass u; + private final AbstractGeneric u; - Inner (AbstractGenericClass t) + Inner (AbstractGeneric t) { this.u = t; } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric.class b/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric.class index d637a7292a4e56ccfb0d490ac6e5ad3ebbe4315f..7cc35dde4232055d8ffff9bf7e9149ff6f0661ec 100644 GIT binary patch literal 436 zcmZ`#!AiqG5Ph4ZiH*_LXzSIZ3fhY&4FM7K5)^FceG`|uC2nN9Dfn5Q1P^|IA0^J# zdT7MU%)Iwz-^|YE*ZT*6GYmtx*bT53V8Fl(L!8}18KcXDskI96+-8{sECQPy5!Y_YiaR{^vt82GYr?Ym*-!7 z|IZEy4NYn6Ns^!cBc|DmFZih9YC5_rW}-CIACBurm*QI5T?Xx+o!S=>Hqd40w?(4b zhB$yj_X6lt@X(>?6LJtx1?xjOr0SBgWje=iV6RlT*rez$Nrs5(=%)c&WCLukF+D=g L%DRu8C5pcR@RDFl delta 203 zcmdnOe2Yo+)W2Q(7#J8#7=*YOm>Kxl83foF1SdMUO_WyD(eVk+%q_@C4N6TeEh^3| zOLb4pOD)Pww(&t1v9_D|OoN$)fpxMVqiB&Bc5Ms_3`{^fK!6d5fvSNt8<3?Bq(LIA pTH6^IHv$<<4D3LX4J^pWzyW0QKol@=GH`+Axxpk4123570|3vXCYS&K diff --git a/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric.java b/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric.java index d3582c8bd46..f95454d3522 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric.java @@ -1,4 +1,4 @@ -class RecursiveGeneric extends SimpleRecursiveGeneric +class RecursiveGeneric> { - + public T t; } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric_Derived.class b/unit/java_bytecode/java_bytecode_parse_generics/RecursiveGeneric_Derived.class new file mode 100644 index 0000000000000000000000000000000000000000..ac48e62ea346ff0fbb8f3deb5267c6a542aabcae GIT binary patch literal 366 zcmX^0Z`VEs1_l!bAua}H27Y!10d@vKMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H1Xch>%Zya$-(cVo@fD4;5r7$;d2bWRUU+N=+^;D$XoRbx+MpEy_%e zcL9=RsVUZs44lE4>3NAIrA0tP^e`0KV2HrA+5t6l1?QI*C8xS&f}9|W%ND(?#Ii&l z1{MZZMg|F7iWnIL(4`m@7?^-z0RoIb4Ac*#*?=s4APo{>)!NR$xDm);Vqgc7Y+yk~ Z1`Z&b2cm$1lYt8?&kZJd7 +{ + +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SimpleGeneric.class b/unit/java_bytecode/java_bytecode_parse_generics/SimpleGeneric.class deleted file mode 100644 index 6ade3945c8dcc42a39eb17ae583b8b026e8b582b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmZuuT}uK%6g{J^U#)3o_Wc39s6oE;R3b!BFH#RKL674$*wnhlwif-XdI+JQAJC7A z&S(~!F>vSJbI-Z=&fJgB*LMJW*v!JhY6@#v#ITy7Sx;d@K!gIt*0sEsbx-=;`dQ~% zx#598rmefa3y-nk64 ziNC=_c%|t1>T zPGE70X`URVra^fu!2)p*PZ24wscH3_ W%lzbu%#B~ONafgD!ZPzQtb75|or~-M diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SimpleGeneric.java b/unit/java_bytecode/java_bytecode_parse_generics/SimpleGeneric.java deleted file mode 100644 index 6db3d7bacbe..00000000000 --- a/unit/java_bytecode/java_bytecode_parse_generics/SimpleGeneric.java +++ /dev/null @@ -1,11 +0,0 @@ -class SimpleGeneric -{ - public T t; - - public static SimpleGeneric makeGeneric(T value) - { - SimpleGeneric newST = new SimpleGeneric(); - newST.t = value; - return newST; - } -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SimpleRecursiveGeneric.class b/unit/java_bytecode/java_bytecode_parse_generics/SimpleRecursiveGeneric.class deleted file mode 100644 index 3ca52a2b92bb9bad327aa21a9a261425248ee460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmaJ-!AiqG5Ph4ZiH*_LszngNqk6ChJ=G8pK`%kUgx)uCsaw)b*=`DcmZyRTKfsR? zC$%0b)yvL%Z)V=i&d2B5JAg}cec0Ibu;*c)ff8YHFJE4S@`4vMm zkwe8zr3HhXrlh!`RMJF5PfiC6&Q1A5xmGNdxUa^U&?(OfQaW*&^J2iYtoc%O%(I*_ zbXRjPlb`(2ADe_UI-=nhVcP$> -{ - public T t; -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.class b/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.class index bf78c910d1974ca2d3852501272b2636dd7fe16e..ef45a36d928a3e75c9691ad0ee45e1f878f2329b 100644 GIT binary patch delta 653 zcmcaC@KA6A2csyDhL3w{UTRThvbAOyBLiavBLk<;WKBk8CLW*3A&i>L{2D%!+Zc`2 z#bN4fw0%7DN>Yo`5|dM{?W`FYq~JyXr6zx4H1JcyrZ(O)w;(4qH#M&$u_QA;53E%a zSu5OBG?kOXn3U?(;3};V)}tu|`+zO6xHvOC59lo1>KGXiF4V=X4CFayh`m<80J6cW z6sIwhZ!x(=slr19r#f(e=n_^J?*fdiveXo?dRd>zQOvDroba&YVTfReWMq(l3!sG& zBLh1$zIhmw7?gP!R2ZUo7_=Fb85tCC>4Dj}S&rotBP%z990Skfx2)x?f($YYLX$Ju z5?Cb}SQ(@ypJUr&sKLO&pvl0?pv54_paYcGWl(3(1DbEZV9a31V8>v@;0a{;GMF)h PGMF4QD(BWW*8#_V+A7vKU93OETb}q5RBu*sL3e` z(=s`a(b!fARlkk4k5giCX0m5qNorAAVsfgroi!taDohL17MQBZCm0P3#4${8%g+aE zlfu*nl$z|uq?9C%CS~md(gbomTVio>W_lhY11ngFkpbO&U9dRFS@LLx*ubPfDkdv3 zyIF~$xecxrL&7Ps2<&EMSWq2gZnft_4GSKI2!=>T24pu!Nv z!=TNe3{(U(aPu0LQ;e)!3~~(IldIXvS@{`c7z8GNXG>reV_;~8V+H`}l8!V0 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java b/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java index 29ad10e2e25..578a8b2f8c6 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java @@ -1,54 +1,57 @@ public class WildcardGenericFunctions { // Test a wild card generic type - public static void processSimpleGeneric(SimpleGeneric x) { + public static void processSimpleGeneric(Generic x) { assert(x.t.equals(null)); } // Test a wildcard generic bound by an interface - public static void processUpperBoundInterfaceGeneric(SimpleGeneric x) { + public static void processUpperBoundInterfaceGeneric(Generic x) { assert(x.t.getX() == 4); } // Test a wild card generic bound by a class - public static void processUpperBoundClassGeneric(SimpleGeneric x) { + public static void processUpperBoundClassGeneric(Generic x) { assert(x.t.getX() == 4); } - // It isn't legal to have an wild card with two upper bounds + // It isn't legal to have a wild card with two upper bounds // Per language spec on intersection types - public static void processLowerBoundGeneric(SimpleGeneric x, Foo assign) { + public static void processLowerBoundGeneric(Generic x, Interface_Implementation assign) { x.t = assign; } // It is not legal Java to specify both an upper and lower bound - // public static void processBoundSuperClassGeneric(SimpleGeneric x, Foo assign) { + // public static void processBoundSuperClassGeneric(Generic x, Interface_Implementation assign) { // x.t = assign; // } // Test a wild card generic bound by a class - // public static void processBoundClassGenericDoubleBound(SimpleGeneric x) { + // public static void processBoundClassGenericDoubleBound(Generic x) { // assert(x.t.getX() == 4); // } public static void test() { - SimpleGeneric myGenericValue = new SimpleGeneric(); + Generic myGenericValue = new Generic(); myGenericValue.t = null; processSimpleGeneric(myGenericValue); - myGenericValue.t = new Foo(); + myGenericValue.t = new Interface_Implementation(); myGenericValue.t.x = 4; processUpperBoundInterfaceGeneric(myGenericValue); - SimpleGeneric anotherGenericValue = new SimpleGeneric(); - anotherGenericValue.t = new Bar(); + Generic anotherGenericValue = new Generic(); + anotherGenericValue.t = new Interface_Implementation_Derived(); anotherGenericValue.t.x = 4; processUpperBoundClassGeneric(anotherGenericValue); - SimpleGeneric baseGenericValue = new SimpleGeneric(); - processLowerBoundGeneric(baseGenericValue, new Foo()); + Generic baseGenericValue = new Generic(); + processLowerBoundGeneric(baseGenericValue, new Interface_Implementation()); } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/generics05$igeneric05.class b/unit/java_bytecode/java_bytecode_parse_generics/generics05$igeneric05.class deleted file mode 100644 index 179141a38e28b24502ec84b87aeb9cb023cdafb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmZuwO>fgc6r9axV_YXBv_OH<(g1D{O%C)zqg*P1kRm{;<@+Wq=~l);&WFU$LZU+A zzz^U@A?7&=2_y&G`}WPwyxI5s>-UeJ0AAp@gghQPDBwU=hb271Q4#eb9xLR+sg4w? z-77uS%}B?C=DXgN>5tD8N*8tz>+vKp3fUm!PGNj$NA;G%PIq8pli2>KxmdJL1<?LG5!1N7bf1+ly~40 zD}mn*U#`PC>sz#UF`OiQ^UBISl$Td}B5iST1Fnm0JaJLPRuNBK_}Eg|UjSE{u;N>x z@_$#^NMA~;Z8%AD0fzyH9FhVjC&Pzw;2@-tQ>jQH=~}TGkC`%~_e2WTX*|1zYJ5lL zE2Atbd>4oTkvI9?ouN?04kO}IHui>VH^n*3-Dbq`!Cj(-{o|b76ZUN58^5pEO5R^34|}N(QJPgDIZ=|@_E^cn<2|y?+}_6nW;58wEq(=&=YLa!`U5k_ BtSJBh diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp index 66e89cddb12..d01e79b7eaf 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp @@ -31,7 +31,7 @@ SCENARIO( THEN("There should be a symbol for processSimpleGeneric") { const std::string func_name=".processSimpleGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -40,7 +40,7 @@ SCENARIO( THEN("There should be a symbol for processUpperBoundInterfaceGeneric") { const std::string func_name=".processUpperBoundInterfaceGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -49,7 +49,7 @@ SCENARIO( THEN("There should be a symbol for processUpperBoundClassGeneric") { const std::string func_name=".processUpperBoundClassGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -58,7 +58,7 @@ SCENARIO( THEN("There should be a symbol for processDoubleUpperBoundClassGeneric") { const std::string func_name=".processDoubleUpperBoundClassGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -67,7 +67,7 @@ SCENARIO( THEN("There should be a symbol for processDoubleUpperBoundInterfaceGeneric") { const std::string func_name=".processDoubleUpperBoundInterfaceGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp index b596572252c..b1e925665d5 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp @@ -32,7 +32,7 @@ SCENARIO( THEN("There should be a symbol for processSimpleGeneric") { const std::string func_name=".processSimpleGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -41,7 +41,7 @@ SCENARIO( THEN("There should be a symbol for processUpperBoundInterfaceGeneric") { const std::string func_name=".processUpperBoundInterfaceGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -50,7 +50,7 @@ SCENARIO( THEN("There should be a symbol for processUpperBoundClassGeneric") { const std::string func_name=".processUpperBoundClassGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;)V"; + const std::string func_descriptor = ":(LGeneric;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -59,7 +59,8 @@ SCENARIO( THEN("There should be a symbol for processLowerBoundGeneric") { const std::string func_name=".processLowerBoundGeneric"; - const std::string func_descriptor=":(LSimpleGeneric;LFoo;)V"; + const std::string func_descriptor = + ":(LGeneric;LInterface_Implementation;)V"; const std::string process_func_name=class_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp index 40288e62cc4..c1dbe040d0c 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp @@ -43,7 +43,7 @@ SCENARIO( " descriptor") { const std::string func_name="."; - const std::string func_descriptor=":(LOuter;LAbstractGenericClass;)V"; + const std::string func_descriptor = ":(LOuter;LAbstractGeneric;)V"; const std::string process_func_name= inner_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); From 707ebf6d2dfd2234581034128ee78130251a4029 Mon Sep 17 00:00:00 2001 From: svorenova Date: Mon, 23 Oct 2017 10:00:22 +0100 Subject: [PATCH 02/22] Cleaning existing unit tests --- .../GenericArray.class | Bin 492 -> 438 bytes .../GenericArray.java | 2 - .../GenericFunctions.class | Bin 1772 -> 1187 bytes .../GenericFunctions.java | 25 ++++--- .../Outer$Inner.class | Bin 598 -> 0 bytes .../Outer$InnerEnum.class | Bin 848 -> 0 bytes .../java_bytecode_parse_generics/Outer.class | Bin 458 -> 0 bytes .../SignatureDescriptorMismatch$Inner.class | Bin 0 -> 752 bytes ...ignatureDescriptorMismatch$InnerEnum.class | Bin 0 -> 1024 bytes .../SignatureDescriptorMismatch.class | Bin 0 -> 590 bytes ....java => SignatureDescriptorMismatch.java} | 2 +- .../WildcardGenericFunctions.class | Bin 2273 -> 1188 bytes .../WildcardGenericFunctions.java | 63 ++++++++---------- .../parse_derived_generic_class.cpp | 14 ++-- .../parse_generic_array_class.cpp | 28 ++++---- .../parse_signature_descriptor_mismatch.cpp | 22 +++--- 16 files changed, 73 insertions(+), 83 deletions(-) delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Outer$Inner.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Outer$InnerEnum.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/Outer.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$Inner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$InnerEnum.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch.class rename unit/java_bytecode/java_bytecode_parse_generics/{Outer.java => SignatureDescriptorMismatch.java} (79%) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericArray.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericArray.class index 1b69af949acd90d0dfd5bf256db990b6e643f4d1..e46b7d90e4081f3cdba0c89dc0a2a052c03798bb 100644 GIT binary patch delta 157 zcmaFEyp37()W2Q(7#J8#7{s|4m>ERa8ARC`#3qXBPt3Z&%)!7p*_Khegpq-ffrWt; zNU{NyGBL0NSquz7Ss={?WH|z9kO-^Rb_T|cKn61dH;`ll3oDG486?>mq$Y~$t1x*cGBSun`(!1SCF { public T [] t; - public Integer [] Ia; - public int [] ia; } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class index 964cf0b91984c508a3f086ca96669362af32bfc5..ef35fd9b89f36c418b60fb9190b5dbcda27ecab2 100644 GIT binary patch literal 1187 zcmb7?OHaZ;5XWbE3L+?q;scd<06j=zJW=EzMq@(s0CFWuS#eF-HhmcVSe{Hg_yPP- z##tz}AWCS`?#}GY??0WL&#(6n062yHI0PXVh21FZ5r|Z{;C7Wjuz1)a5US~2Mj%z^ zg55a%4l|pyqoF5V*Hx;usL7@6Iz#pYx8&Is6U^l5r6W|E>%vk9tQn@RGRtc4zM(NU zfIy-+3Ra{Zc_t9^JOtLqWnPStRB{wlX*QKA@?#C&6V!H0EUr*#mg|r7iIy}fdZpXW zBU5dq>PZcAq+Z^w>dr8jd9FL6do65c-c$9b#5~f?BJVg6i z_Mp#%O=Wwg5)WMBh3;U3f9f0OD*tkQl2bJbe`t7xdi9@7^uR}M*L34$Dn8!O9aCkO zTnCsjTXz{!L#ej{j=a3#2gkKTa1;wAu5Hwf@x z0r!bv0K_1URty%=6Bs0)p)HdKi9ugt#Ft2536dC;!gq+0o@KOF@C`s3k*l+ji8+vK kh|J7JrsqJeBXVOlGCKz{i^$E{$lW=RTX-GYgRbs;1Cxd6{Qv*} literal 1772 zcmbuAO;giQ6o%hh+J=Tupg;woU;*Vrq>A`OYXw0ZW~wfzjIv=udVxSmI%(?2Ut#0Y zwI2h6&L}Gv{wT+D(=;t@VWErm-khAi&pGG5cl!I!w;urJuqY#p=@1m$3SkBb3AbhV zF)iUv8-kdXa92jFSm)Xxi}jw2`*0panS&_^T$(Wj&Uso+%Ji9@^y{i|+yXV~CmaeUo49#IA z8F~tqsqtcQO+P5)xtqYCOjMGSg2&!7guDnt^gQOUP(g(&NvUi$nI`@AHCxs8U#JDQ zme88MW2kn?qGHEW+4;<#`c6&cRbwadYHN>cb~5du%Nl|ocdL9|C~)hkSu%2~hRv;Q zRjZa9C$;&E7jLQ)YtUKB)5yKH6QUwdVsll@FZI^jWk#Hpf-Xc9bf8nh zBL(xIL++~{;$p?X&n(Nd$TeP(3Q~AXxn7`dybR&$D^V;%XMF_{(h8nnfnHUSW#2GJ z-WZrI++LqSh5C26{l>XOt8{y+3C?Met#iDnTRi7ALFTnfbam*~Z6HpUI!u?Gb@qw& zX(xe+Y0!5!Jtb&mv<9Y5z&_E&haUP4IzbvI?Uix@qPRj&A@rf2vc!)!X%#d+dF;?-8f(A$RI$kWbNe`QZDUv#T0u zq@j5cscAm$Ha|gsIg_4I=NzX2T@mFN?MIOOAK`EL0$-zPg?$3>DGS2dQ;vmh{soA- BXb1oR diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java index be30b40cb7a..323f14d4f0d 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java @@ -1,26 +1,31 @@ public class GenericFunctions { - public static void processSimpleGeneric(Generic x) { - assert(x.t==null); + public static void processSimpleGeneric(Generic x) + { + } // Test a wildcard generic bound by an interface - public static void processUpperBoundInterfaceGeneric(Generic x) { - assert(x.t.getX() == 4); + public static void processUpperBoundInterfaceGeneric(Generic x) + { + } // Test a wild card generic bound by a class - public static void processUpperBoundClassGeneric(Generic x) { - assert(x.t.getX() == 4); + public static void processUpperBoundClassGeneric(Generic x) + { + } // Test a wild card generic bound by a class and an interface - public static void processDoubleUpperBoundClassGeneric(Generic x) { - assert(x.t.getX() == 4); + public static void processDoubleUpperBoundClassGeneric(Generic x) + { + } // Test a wild card generic bound by two interfaces - public static void processDoubleUpperBoundInterfaceGeneric(Generic x) { - assert(x.t.getX() == 4); + public static void processDoubleUpperBoundInterfaceGeneric(Generic x) + { + } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Outer$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/Outer$Inner.class deleted file mode 100644 index 0e8a92206dec18952baf1985cdd098dff305cb19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmZ8eO;5r=5Pe&UrKLbYMG-$xIUpMF;0;1zNHiuy4iN53-C#*ArnDyhEDyxQgFnC@ zWt?rnC~3Ac``*l(H`%Z6k52$sIMtz|Y#@n!nH^|2(okVwAw#}*J)Q?Xw}V^Z3E#0> z4En&CcsvMw!BAZ1+rwe2Lq!|Gqcg8wGHAVi7zkfNZO3zh4nw)N#MYZzXCnr+J9{AI zT+i{uefTsM{*aGdLJGZ^&D|0A9eH1Zs+_}+yz|H&gBiuH%ja`Ja3&s9jZm_{0%`f5 z%DQFpxH3;@HFnGz}*V>4=Vv zFj%sz>2hzS`luSltsL(qk>2VYkqyiXH(M`83sZBYfV5+AiD&{(Z3u>7Lb95_=yRwwnH#JeNDMRHL1KnnY^UY0Z)H{7E3=flMOJkkfD_$HeB{ zrl8uok&4oNhLt%A$E^VaPd`Oe`_ddWyC02|OtXa8t)>Q7yFr{2ZWiRUSKV6#`{a$& zpJYi8zKwLhj`8lL?$kw9U&4Zm7ibE!$e#aRQS{JW<3*ju*=4 z4bQ?LCDpRwV%RG-Z7#7>fM5GO%icM7MK49rqhYnWE|XRqHe4)%N}=5b&H8h`f_+En z0@i2RQ42IyOl*&t>56^z%7VHg=kK~z*+nYaKKvT@}Qq9K}?Ok}}?eZdAxhGOQ&#K&@F;=%{; zp^SH`CZKJ4+w=AGw!I&pZ|?xkapb{9)5X4v0~d#c%B|Kixz_oD;G6Xz7HKL|7cGKg z2%+3lT4jBL-R_JDrNQ!E5^AB+@-AOYWD2l6ma+$x65Mc@XEF&0 z&2`uFtv-Q)fIwcSX{lL5qD0;vC8VoXuvsr1-&q^;d3lA qF07jzeY1A3g&M2+8rf!LqruU_4tCAF$EU%}LWzfS*@DaS2COfuw_wBo diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$Inner.class new file mode 100644 index 0000000000000000000000000000000000000000..b7dcb3d5421e08a75ad7be19ebded76754a05778 GIT binary patch literal 752 zcmaJ<%TB^T6g^WOrC0$`@qrH%7l=kQaR)Im8jT6+Lc)GpCpe@QGc6{5mJ4Iz!VmDH zjCYCiyw&M6PbeuJKFDC_kYT+&Nk12XtK?HSP}eeeBz=m^!}jz>tbJ#e|#KUh8_`%MZ-sCJtC%O7B|1rL5Lx2~+(Nf( literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$InnerEnum.class b/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$InnerEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..82139a88405eb5794627a0b7afac560286afb093 GIT binary patch literal 1024 zcma)4U2D@&7=BKZHBFXjt#fKOwQA>*4xGZgkd!f*69#p=sP@LI(-^yq^hENp-{l9W z2+FSgQQ~{fLYp!fP2haJ&-*;@*Pp*Xe*@UYrU@PQEVOXnz@mYN77VoIvTooJgV7$m z=)K+VGnfZL1j)Y0#|*YQ??pUKgOtH}*XxHP!LvLGUIwY3gdejwc^#%>p83b^iKE9* zJ>^j@eL9Xizn8ujzYiF$_CgUH=Hp?Iyy3%$UJONd^nt;1dMEspZ$(^;w)$BTijn8e z9af_k`#c)(B$T`bxi0vaG#VF)DUWU_!fc0O<$SD~y}Yocy>e%2STZ>XF>`$RXIGFq$3wnX?kt`+!gRMe~0&^te{a0XrC zD>L{8z1Zg{T*tDqQ$+|R6`w+*A22$bYu{1*tjuM(sk?!jxJCBc3L_I(MY9N`r38SQ f_6zz~Fv&9;wpRG9;g0gZ3yXG(P&%b;?l%7cyZ80w literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch.class b/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch.class new file mode 100644 index 0000000000000000000000000000000000000000..84c586fddfa7c988763892a91ae15df6ee4b85ce GIT binary patch literal 590 zcmah`T}uK{5IwW&wrN|Mm6Z}?6j%@W(o>2QRuEV{xcGkEE_!9%mHi0%Sv>_k^aJ`) z(d<%^33e~{%$&oVxdZd@`SuRr43!*oluT@!*fFt7$liLM46eO+Ot8|t?TRpzp@}lV zNEO0TQ+X*;JrSsce~X!Ds6xVCr>h2@ zh~hwA$$>ftoM2H<3CtrY}$6C#qR91Iic3H&pRXWB6#o89I9gyh{I!7UzjdfW;|(T< z`0_Z6E6gra4j3n|pcfW&Sd2?7C#9>5R+<}FL!Mb-Mp +public class SignatureDescriptorMismatch { private class Inner { diff --git a/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.class b/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.class index ef45a36d928a3e75c9691ad0ee45e1f878f2329b..51f199d2bda1b559c28d996db97c1335393ea1b7 100644 GIT binary patch literal 1188 zcmaiy%We}f6o!8%X+lEijW#WTP(mxz7C|=b61pH#t4bqS1j-UQ6Vtkyct&&K@>r~p zSnvQm6ylu8)YG&H8OfG?{QLXQIpaTnfBgpV3VSsa(XQZW1-k;}o;Er@5-9E;oC%cr z{zwU|INGSU$#|&3_j2e_WZm&y>7B_?^F9lf;tL%KG@Xyy8@VzZohYM1?H(t_jkRy0 zuE0hR`mTzifgT5*$^-)SeJ5LY*;jlMsM?4?W7_U}aAjG)67>#`h+ZA&b0gy<?O&>A3bqn41WE9!@p3TC3I^`aW zm5C*{Cv`cP>2h1irrVjRAgX3M>)6UftlF<-__>RaF5 zf0gqooK$V#C!wp3H9xi1yw~*dQht$jl(0mtm?sigWm(6Q=DhQ6c&XeNZ4~Iu^S1IYZoimE(+Yk zGKp4bOi&zIrQI5h0@ew6e=%}-A#%eaHwoETjNDv^+_K1RLOwt-L|M2ng*$3kG_agTMp-fq%Uxx@XW)Js zpW-tED+2u&ty)cbzEg2)3r@}2EX$IB*bqq0IIiQ*3dBdp)&vssm68n2r(CivuXJ0w(sS&^x@!llX@QefuVTwuZN=HC zmZcU5n4?AApH^J)y+A6o2n-y>J+C&AW>YkipQZQi72mSIS+=S=qST7BTYSt^`-a3vZKIGhk!ycoSjyzY~=6glyaSGaXnvV&cpp)ewEwD zODZQj()BHsu7EQ3N=mCzK?gOoSou!xC*p-}rlV~f_o93x86|V3su*tfxK1Dnf4sd+ zC22n7&b(IH-irz<;mevYaAN1V-q4y=uCt{5mRs?+rFYcYyJ^*$1=PYzVY=IcRJh~+ zuY0_}BmGR4g6iZV{Zs3iHCeXYt;u_vPo?b#^PMwxSzoC1N~P}Ea?w%OC)e(VOei-d z&S2QY5V9s7VAaGL9`#25Hdpf`%Qkr7^N7O}5*+|Ilw<+pXK%(vszXzTPC z-=)Ns^dAMU(h}Y9>xsMsH;ZpXN!A=smcr!lE%58~$){`s=lKW@@}(8MgDSD?84xPZ z{LOJR$yTuK$iIa6iJchE@;4b61xDC68v>l8Gw{7-{-{!mZMJH0_GiR)F_8Ziaj}QQ zF1ilTvHlXtKb6Ns;4w`tF$^Mk$ZM8`xJ3J9ehrSYyvflhzc|DY#@LA=PcX}+!P^=< z5`fPr@Lw=~LnrI}LwkA`BQX!rM_TC0awVdl)%0=Fc?dN9iKgcQ`cQ+O+C%zv>-=xa7mOFm{^l+wEON)gA zWT@z)q7W!DRP-12aZ)RmuV^3pI2CPR3f%;bqLTr2v)mchVHo2)3ll8-Rfc~JvrNMh zd&`)@D#QI6?**GZ$6!0L&XGDx*SX?-_5?L1K432vY&%j-hpL%S^&wTABs4FEN|yS| i^bPFc^e&9Vk4VISL9F$XsH56}n0Z58rH?p>;l_V99`o7& diff --git a/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java b/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java index 578a8b2f8c6..6d68ab25e17 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/WildcardGenericFunctions.java @@ -1,57 +1,48 @@ public class WildcardGenericFunctions { // Test a wild card generic type - public static void processSimpleGeneric(Generic x) { - assert(x.t.equals(null)); + public static void processSimpleGeneric(Generic x) + { + } // Test a wildcard generic bound by an interface - public static void processUpperBoundInterfaceGeneric(Generic x) { - assert(x.t.getX() == 4); + public static void processUpperBoundInterfaceGeneric( + Generic x) + { + } // Test a wild card generic bound by a class - public static void processUpperBoundClassGeneric(Generic x) { - assert(x.t.getX() == 4); + public static void processUpperBoundClassGeneric( + Generic x) + { + } // It isn't legal to have a wild card with two upper bounds // Per language spec on intersection types - public static void processLowerBoundGeneric(Generic x, Interface_Implementation assign) { - x.t = assign; + public static void processLowerBoundGeneric( + Generic x, + Interface_Implementation assign) + { + } // It is not legal Java to specify both an upper and lower bound - // public static void processBoundSuperClassGeneric(Generic x, Interface_Implementation assign) { - // x.t = assign; + // public static void processBoundSuperClassGeneric( + // Generic x, + // Interface_Implementation assign) + // { + // // } - // Test a wild card generic bound by a class - // public static void processBoundClassGenericDoubleBound(Generic x) { - // assert(x.t.getX() == 4); + // It is not legal Java to specify two upper bounds + // Test a wild card generic bound by a class and an interface + // public static void processBoundClassGenericDoubleBound( + // Generic x) + // { + // // } - - public static void test() - { - Generic myGenericValue = new Generic(); - myGenericValue.t = null; - processSimpleGeneric(myGenericValue); - - myGenericValue.t = new Interface_Implementation(); - myGenericValue.t.x = 4; - processUpperBoundInterfaceGeneric(myGenericValue); - - Generic anotherGenericValue = new Generic(); - anotherGenericValue.t = new Interface_Implementation_Derived(); - anotherGenericValue.t.x = 4; - processUpperBoundClassGeneric(anotherGenericValue); - - - Generic baseGenericValue = new Generic(); - processLowerBoundGeneric(baseGenericValue, new Interface_Implementation()); - } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp index c0826e63cd0..0884ef9cb88 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp @@ -23,18 +23,16 @@ SCENARIO( "java_bytecode_parse_derived_generic_class", "[core][java_bytecode][java_bytecode_parse_generics]") { - const symbol_tablet &new_symbol_table= - load_java_class( - "DerivedGeneric", - "./java_bytecode/java_bytecode_parse_generics"); + const symbol_tablet &new_symbol_table = load_java_class( + "DerivedGeneric", "./java_bytecode/java_bytecode_parse_generics"); - THEN("There should be a symbol for the DerivedGenreic class") + THEN("There should be a symbol for the DerivedGeneric class") { - std::string class_prefix="java::DerivedGeneric"; + std::string class_prefix = "java::DerivedGeneric"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); - const symbolt &derived_symbol=new_symbol_table.lookup_ref(class_prefix); - const class_typet &derived_class_type= + const symbolt &derived_symbol = new_symbol_table.lookup_ref(class_prefix); + const class_typet &derived_class_type = require_symbol::require_complete_class(derived_symbol); // TODO(tkiley): Currently we do not support extracting information diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp index 6060c33c906..70fe6085448 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp @@ -23,42 +23,38 @@ SCENARIO( "java_bytecode_parse_generic_array_class", "[core][java_bytecode][java_bytecode_parse_generics]") { - const symbol_tablet &new_symbol_table= - load_java_class("GenericArray", "" - "./java_bytecode/java_bytecode_parse_generics"); + const symbol_tablet &new_symbol_table = load_java_class( + "GenericArray", "./java_bytecode/java_bytecode_parse_generics"); - std::string class_prefix="java::GenericArray"; + std::string class_prefix = "java::GenericArray"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); - const struct_typet &type=to_struct_type( - new_symbol_table.lookup_ref(class_prefix).type); + const struct_typet &type = + to_struct_type(new_symbol_table.lookup_ref(class_prefix).type); THEN("There should be a component with name t") { REQUIRE(type.has_component("t")); } - const pointer_typet &t_component=to_pointer_type( - type.get_component("t") - .type()); - const symbol_typet &subtype=to_symbol_type(t_component.subtype()); - + const pointer_typet &t_component = + to_pointer_type(type.get_component("t").type()); + const symbol_typet &subtype = to_symbol_type(t_component.subtype()); THEN("The t component is a valid java array") { - const struct_typet &subtype_type=to_struct_type( + const struct_typet &subtype_type = to_struct_type( new_symbol_table.lookup_ref(subtype.get_identifier()).type); REQUIRE(is_valid_java_array(subtype_type)); } THEN("The elements of the t component have the parametric type T") { - const typet &element=static_cast(subtype.find( - ID_C_element_type)); + const typet &element = + static_cast(subtype.find(ID_C_element_type)); REQUIRE(is_java_generic_parameter(element)); - REQUIRE( - to_java_generic_parameter(element).type_variable().get_identifier()== + to_java_generic_parameter(element).type_variable().get_identifier() == "java::GenericArray::T"); } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp index c1dbe040d0c..60560ec1446 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp @@ -21,12 +21,11 @@ SCENARIO( "java_bytecode_parse_signature_descriptor_mismatch", "[core][java_bytecode][java_bytecode_parse_generics]") { - const symbol_tablet &new_symbol_table= - load_java_class( - "Outer", - "./java_bytecode/java_bytecode_parse_generics"); + const symbol_tablet &new_symbol_table = load_java_class( + "SignatureDescriptorMismatch", + "./java_bytecode/java_bytecode_parse_generics"); - const std::string class_prefix="java::Outer"; + const std::string class_prefix = "java::SignatureDescriptorMismatch"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); const std::string inner_prefix=class_prefix+"$Inner"; @@ -39,11 +38,13 @@ SCENARIO( require_symbol::require_complete_class(inner_symbol); } - THEN("There is a symbol for the constructor of the inner class with correct" - " descriptor") + THEN( + "There is a symbol for the constructor of the class Inner with " + "the correct number of parameters") { const std::string func_name="."; - const std::string func_descriptor = ":(LOuter;LAbstractGeneric;)V"; + const std::string func_descriptor = + ":(LSignatureDescriptorMismatch;LAbstractGeneric;)V"; const std::string process_func_name= inner_prefix+func_name+func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); @@ -64,8 +65,9 @@ SCENARIO( require_symbol::require_complete_class(inner_enum_symbol); } - THEN("There is a symbol for the constructor of the inner enum with correct" - " number of parameters") + THEN( + "There is a symbol for the constructor of the inner enum with the " + "correct number of parameters") { const std::string func_name="."; const std::string func_descriptor=":(Ljava/lang/String;I)V"; From d3ff11c2061d424e795f13d7bab633492dcdc7bd Mon Sep 17 00:00:00 2001 From: svorenova Date: Thu, 2 Nov 2017 10:28:57 +0000 Subject: [PATCH 03/22] Adding a utility for checking java generic class --- unit/testing-utils/require_type.cpp | 12 ++++++++++++ unit/testing-utils/require_type.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/unit/testing-utils/require_type.cpp b/unit/testing-utils/require_type.cpp index 9d8233a52d8..de896e90e63 100644 --- a/unit/testing-utils/require_type.cpp +++ b/unit/testing-utils/require_type.cpp @@ -201,3 +201,15 @@ const typet &require_type::require_java_non_generic_type( REQUIRE(type.subtype()==expect_subtype.value()); return type; } + +/// Verify that a class is a valid java generic class +/// \param class_type: the class +/// \return: A reference to the java generic class type. +java_generics_class_typet & +require_type::require_java_generic_class(const class_typet &class_type) +{ + java_class_typet java_class_type = to_java_class_type(class_type); + + REQUIRE(is_java_generics_class_type(java_class_type)); + return to_java_generics_class_type(java_class_type); +} diff --git a/unit/testing-utils/require_type.h b/unit/testing-utils/require_type.h index 215f5335cf0..25466433513 100644 --- a/unit/testing-utils/require_type.h +++ b/unit/testing-utils/require_type.h @@ -62,6 +62,9 @@ java_generic_parametert require_java_generic_parameter( const typet &require_java_non_generic_type( const typet &type, const optionalt &expect_subtype); + +java_generics_class_typet & +require_java_generic_class(const class_typet &class_type); } #endif // CPROVER_TESTING_UTILS_REQUIRE_TYPE_H From c5b06e6cfc665e023cc871ed90e8e5ab5d3967ce Mon Sep 17 00:00:00 2001 From: svorenova Date: Mon, 23 Oct 2017 12:39:05 +0100 Subject: [PATCH 04/22] Breaking the old parse_generic_class into two unit tests A unit test for inner classes and a unit test for a basic generic class --- .../GenericInnerClasses$BoundedInner.class | Bin 0 -> 676 bytes ...nericInnerClasses$DoubleBoundedInner.class | Bin 0 -> 706 bytes .../GenericInnerClasses$Inner.class | Bin 0 -> 642 bytes .../GenericInnerClasses$TwoElementInner.class | Bin 0 -> 728 bytes .../GenericInnerClasses.class | Bin 0 -> 684 bytes .../GenericInnerClasses.java | 25 ++ .../generics$bound_element.class | Bin 892 -> 0 bytes .../generics$double_bound_element.class | Bin 705 -> 0 bytes .../generics$dummyInterface.class | Bin 195 -> 0 bytes .../generics$element.class | Bin 573 -> 0 bytes .../generics$two_elements.class | Bin 639 -> 0 bytes .../generics.class | Bin 1202 -> 0 bytes .../generics.java | 59 ---- .../parse_generic_class.cpp | 307 ++---------------- .../parse_generic_inner_classes.cpp | 231 +++++++++++++ 15 files changed, 279 insertions(+), 343 deletions(-) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$BoundedInner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$DoubleBoundedInner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$Inner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$TwoElementInner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses.java delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics$bound_element.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics$double_bound_element.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics$dummyInterface.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics$element.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics$two_elements.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/generics.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_classes.cpp diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$BoundedInner.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$BoundedInner.class new file mode 100644 index 0000000000000000000000000000000000000000..3b2d92f4c890ccfebfcf3e2040955ca2cc83ae7f GIT binary patch literal 676 zcmah{O;5r=5PeGvg;J%0Abu0W0Wc8{o|JHqL}OCX1ms@I21`n7+G66*@?cCn_yhb= z#@T`qV-pX%GjI0Iyq($o_G@g>HruZiPfvd)~~q_=PRHE5}UiNX%VB2C9ZE z_7vF78=B%o=#cFNEeJ z>gDN|?kuY9h#F0rM~e#8nr3}@c6FoU2Eu>fmT0sV!gu|VumVa;cD>NI#I-H&U5J?F zx!i|_1d?n;Wz>p(HevPx6BzM?XN6HpN*)1B0UO~-baki3Rb}opIU3WF8N7k zbW+eru9J38NQq5WPT#;P?})vUrC@{pG8;(K2jpic=*W^q_-QqUEz)Hz>CurRsmvMk R*d{B60y5JmwT(S&0zXGlu4VuL literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$Inner.class new file mode 100644 index 0000000000000000000000000000000000000000..1162357e0daed77e1d2c3851677ede6a739a5a77 GIT binary patch literal 642 zcmZ`$O;5r=5PeGvl~SdGAc!9vI3OnC!IKg$1dU0fCJ^omZg5E{rY$D^EDy%SgFnC@ zWt=UTsMN#meC(Tfvu{2=-`)Y7qMC+=vI!kK26heXG3de-Q-+)~;g7uOa&O$c8BW9~ zJZDJvTs ztN)j^=%a0_t+%>otD>}5Qw(NrHup#3LaI-cVuU$X;#x?vWmyanzm6od0eiL+(NP)qKqBYxAl;kry8CYc3$-5<_!kUev7qG@F63-NA*q~cg sD?dwjae;!3JVk_$x-o2#uX?GBjRIM1$ymfTMG2IUi(YALRImwr0p9$T2LJ#7 literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$TwoElementInner.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$TwoElementInner.class new file mode 100644 index 0000000000000000000000000000000000000000..459f8c95fb65b484706793d8cff5628c86dff778 GIT binary patch literal 728 zcma)4$xZ@65Pij<$T$e%hC6PFVq6ZMlyEU>3`9*Jb04syqvK$P0pn+RFeV=S06)t3 z8Z}XvgNLrFSN*!ye*buV1F(nXBn-@&h+{5+g#;D_ax2JIZk&#@<2nA-&UyVtHNpcy zvg%&>PS_5Vz^Ik!k&d=(T7%)W+gjZfOjJ&kuL8Gm>QfzhPOGI_nox9oH!KNq>yeBN zTM$2NUNUyN;`-{WeOFgO&8d6zWGl^vy%{I9-2pJ7GO)0Q`rxvV5 zkpPwD!EA`U^X0_Q48tT~9o#!H^xvh6& zVHlQ$6!Hly305L_y*&yty<6q_*7fAaBAz49uMy`jF?a?r2tk5Y3`3O3U)aoKbTRY_ zPYNT{X<8TL#;DE0<};-5g4h$0fefXN28?5ra`KCXEGCG^??&T7Xj@&L$-5~c4+OQloK(D(<+Xc`8QH0C<_h66s$>T>JNfNZEIPxwOrOAYWmf|s-o5C9z+yghG zyO!aM4bP7Di(n>rwtYe+>2%i458cqS#JwE}R1;ddjP9gi3nfB1Ax|j&-ulU$2`eC+ zBoJFG<2X%Xtqz1xPa-b=YC + { + E elem; + } + + class BoundedInner + { + NUM elem; + } + + BoundedInner belem; + + class DoubleBoundedInner + { + T elem; + } + + class TwoElementInner + { + K k; + V v; + } +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/generics$bound_element.class b/unit/java_bytecode/java_bytecode_parse_generics/generics$bound_element.class deleted file mode 100644 index ef168d8e34c9af903d9a9ac61f16be5f379ea561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 892 zcmZ`%U2oGs5S)u+yD<(4X$j@Cd<1ZUM0wx|qDZI`5>hBgEq&kxIq4Bxxejt1B>ojh zAS5360sJV$>|IhfDm>WU+nt@Ao%8QMKYsyujBX88+zR00wnTS)-1Tu!p{i4Ttk4=B z#h>EsG|nd5yYu6b&YvpO_L4~!7xP>zxcj?rUNYwuACg(;kwP$>=uGFycqZ9?k|o7J zp&pg#?g8m{ribiq43kV--u-x#GSeDP$8mZP=ZTyb$*Pc(WHg;;hwnt0&I*O_MaD@x zX*`>0mN!pEbXI`W(OzZ!{Bg;=^`D-;S!=*n^i)|IKk6>FR}+Pc(OHbFs<_o! zWPoz)^=a6Xv(Uk*)T_~v9v2)Q>`mwSSU*q1n)=e%hjJ$&0-OsG;(iDZzK@7&E)lB+ zC^XAkwA>0#Bx=@{9k|Kcclk?H_>d2*nNzLVlu3*oJ|XI?oM-f!NWliZ2j8K3KT!E< zFb%#vVg%ddyKPapfDN9AH*BYi(1zgiWG_{TVC5;r714`NF_KN!&2Rw%J_} zmvoX5IxGJ&qbs<&pnc1)Sx`hfrQpD1TQp$(lxXinw1;cP5}9HblA0AQwHn3RdDp4b UMmMlUbcM#Q^BWLRMF%b5FS$aZJ^%m! diff --git a/unit/java_bytecode/java_bytecode_parse_generics/generics$double_bound_element.class b/unit/java_bytecode/java_bytecode_parse_generics/generics$double_bound_element.class deleted file mode 100644 index af550821f2ac6e23893bc73f3f464b0781dc0bc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705 zcmaJbd(sP!WBb?Tx-A|_>s$H|L8It z_Jm(!NZdGm$%D`r3|hNQNG!N>MwMd*qtzEu_>MJFXx))c&|pYcr|@2f#LqpOaQw$ut>oUX?Y|)MM3IIJ?J66{BRk&5 sESOlLi1=eQnk)HAOCcs!$ZFpeSFuJ>1nbC=&5@^}h(+@AWDBwQCrLx9mjD0& diff --git a/unit/java_bytecode/java_bytecode_parse_generics/generics$dummyInterface.class b/unit/java_bytecode/java_bytecode_parse_generics/generics$dummyInterface.class deleted file mode 100644 index 20f3e82c81bf8d6853c8693c2e366a323f3bfc78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmZ8bF%E)I6zfCeBZ6`B0uH*!;tfnpm>gVOzn>?8z&GK8iC1&*03OQtG+}XRo2G60 zdOw~3wn!90g(<-=xH}O>t93?*j@Q05yf14eBn4Y;OXD_`zG;P+uo$dm-Z#xXvmLh= zZ6rMVH{#4ndsl1c*b(O6jkMObNDt?VO-Bfau>c@=a!c5kEAT~m82>OpBpgYCpfCx- E4-Ba+!vFvP diff --git a/unit/java_bytecode/java_bytecode_parse_generics/generics$element.class b/unit/java_bytecode/java_bytecode_parse_generics/generics$element.class deleted file mode 100644 index f1c63b72ddea8d7f270b013401c831b6dcb304c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 573 zcmZWmO;5r=5PeH4g;Jze1;6FM0WlE|o|JGQn3yzb0^z>Y4K68*X^V+J%Y!lT;1BRe z8E27dl*8`Mym|BHV?RFM-T|DUnumdH8zy!v>{-}nFhwXP44yyckGvUjHEP}r$0A5B z81g+iQaqVOg2Cu_3CSk+GOnF6*#1Z;5y>FdXiF-Yv>A%^U-)Q1;+^Ro<(7P@#Pw`4 z6j7fKLqa@%8t`zyBdPrbXlii=OLrtx!r)vfs?iB~9199~KjO6og=&}oDm^`|zc00*-Hb{r~^~ diff --git a/unit/java_bytecode/java_bytecode_parse_generics/generics$two_elements.class b/unit/java_bytecode/java_bytecode_parse_generics/generics$two_elements.class deleted file mode 100644 index 4bbc9b11c6218b44d70098360ca722698cacafe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmZuu%T5A85UgR5$GQljfQkwl4v2|(@T7zbiHU)z352UzaDt1=VwMHtXL&Ft9{d15 z%2yXNEb?H#}g_QTMS*5Su?5W7KS1jM~Syw){GX3;jCPVuVMm2K}# zAY8XPj_D0uDWEl~WW-2iO=bb_&Kl&71@u}+I?}b;1I3ms$MVVok^C=x&=l}j`nRkS ztyzw|9QIn$ZI~^aOuW`_n|9N5ErlnfUlkWHyvP2Hv}I2^o`M$+AF9~qU?2%oKQH8F zb?hQJU-Ri#>-6ldRy1V1;{> z*)_F3?t0rN9v6#k}cyS;3=2?eQmfhwg?P(($GfTD&b1%6;i_=VecsEh5Ev|9`><1=Ui z!AN5K?Hl+o8oz0~D@E93=A8M?{hXQo`RChr0P}bqMilpTJP5;wxiCU_7$P^X<53s^ z%!Od!v5qH7vJfKjRL3(N86ArPhV!wyE6cJXZKuv-*0yDBwQSbwvaaK~z(BFu$d~1A zzS^*huBJfr!dY+o(6J=YU2Ie;M_JpEwLP;S1^js>78uTzB>h{3dZNQVBM{oMO19}V zYE(~Op|+UYHxJF(vT2uQmG_dYWtM0gShQ@*Vc@RhM0tWgiY{5}o+ zlV7+y(WKX~jGC@~XqFptlM~Wfm#Y8Vlv-(U1{$YF<@2)ERmk8D-$RryM{u!T((B}W z7~vACgWN}n%#tb{f9e$COH<`0_dpXAxJBM*Dd0Aps&5SAM3nI__@R-mox!(52VLva z@vqQM;6Fn^0s2PD+F4-L!IpJ*05L)&3=(He*mX~|NaY=p8Y v$|4ZIv7%#Ir*j`>2>IBbUeXi`?Peo-$oG- { - E elem; - } - - class bound_element { - NUM elem; - NUM f() { - return elem; - } - void g(NUM e) { - elem=e; - } - } - - class double_bound_element - { - T elem; - } - -// definitely need to do some tests with bounded two elements - // the java_generic_type_from_string does not work for complex types - // Need to to unblock just get it so it throws when failing rather than wrong - class two_elements - { - K k; - V v; - } - - - - public static boolean foo(String s) - { - if(s.length == 0) - return true; - return false; - } - - bound_element belem; - - Integer f(int n) { - - element e=new element<>(); - e.elem=n; - bound_element be=new bound_element<>(); - belem=new bound_element<>(); - be.elem=new Integer(n+1); - if(n>0) - return e.elem; - else - return be.elem; - } -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp index ade836cb549..d2c59edef85 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -18,305 +19,43 @@ #include SCENARIO( - "java_bytecode_parse_generics", + "java_bytecode_parse_generic_class", "[core][java_bytecode][java_bytecode_parse_generics]") { - const symbol_tablet &new_symbol_table= - load_java_class("generics", "./java_bytecode/java_bytecode_parse_generics"); + const symbol_tablet &new_symbol_table = + load_java_class("Generic", "./java_bytecode/java_bytecode_parse_generics"); - GIVEN("Some class files with Generics") - { - WHEN("Parsing a class with type variable") - { - REQUIRE(new_symbol_table.has_symbol("java::generics$element")); - THEN("The symbol type should be generic") - { - const symbolt &class_symbol= - new_symbol_table.lookup_ref("java::generics$element"); - const typet &symbol_type=class_symbol.type; - - REQUIRE(symbol_type.id()==ID_struct); - class_typet class_type=to_class_type(symbol_type); - REQUIRE(class_type.is_class()); - java_class_typet java_class_type=to_java_class_type(class_type); - REQUIRE(is_java_generics_class_type(java_class_type)); - java_generics_class_typet java_generics_class_type= - to_java_generics_class_type(java_class_type); - - const struct_union_typet::componentt &elem= - java_generics_class_type.get_component("elem"); - const typet &elem_type=java_class_type.component_type("elem"); - - REQUIRE(is_java_generic_parameter(elem_type)); - - REQUIRE(java_generics_class_type.generic_types().size()==1); - THEN("Type variable is named 'E'") - { - typet &type_var=java_generics_class_type.generic_types().front(); - REQUIRE(is_java_generic_parameter(type_var)); - java_generic_parametert generic_type_var= - to_java_generic_parameter(type_var); - REQUIRE( - generic_type_var.type_variable().get_identifier()== - "java::generics$element::E"); - typet &sub_type=generic_type_var.subtype(); - REQUIRE(sub_type.id()==ID_symbol); - symbol_typet &bound_type=to_symbol_type(sub_type); - REQUIRE(bound_type.get_identifier()=="java::java.lang.Object"); - } - } - } - } - - GIVEN("Some class files with generic type variable") - { - WHEN("Parsing a class with bounded type variable") - { - REQUIRE(new_symbol_table.has_symbol("java::generics$bound_element")); - THEN("The symbol type should be generic") - { - const symbolt &class_symbol= - new_symbol_table.lookup_ref("java::generics$bound_element"); - const typet &symbol_type=class_symbol.type; - - REQUIRE(symbol_type.id()==ID_struct); - class_typet class_type=to_class_type(symbol_type); - REQUIRE(class_type.is_class()); - java_class_typet java_class_type=to_java_class_type(class_type); - REQUIRE(is_java_generics_class_type(java_class_type)); - java_generics_class_typet java_generics_class_type= - to_java_generics_class_type(java_class_type); - REQUIRE(java_generics_class_type.generic_types().size()==1); - typet &type_var=java_generics_class_type.generic_types().front(); - REQUIRE(is_java_generic_parameter(type_var)); - java_generic_parametert generic_type_var= - to_java_generic_parameter(type_var); - - REQUIRE( - generic_type_var.type_variable().get_identifier()== - "java::generics$bound_element::NUM"); - REQUIRE( - java_generics_class_type_var(0, java_generics_class_type)== - "java::generics$bound_element::NUM"); - THEN("Bound must be Number") - { - typet &sub_type=generic_type_var.subtype(); - REQUIRE(sub_type.id()==ID_symbol); - symbol_typet &bound_type=to_symbol_type(sub_type); - REQUIRE(bound_type.get_identifier()=="java::java.lang.Number"); - REQUIRE( - to_symbol_type( - java_generics_class_type_bound(0, java_generics_class_type)) - .get_identifier()=="java::java.lang.Number"); - } - - const struct_union_typet::componentt &elem= - java_generics_class_type.get_component("elem"); - const typet &elem_type=java_class_type.component_type("elem"); - - REQUIRE(is_java_generic_parameter(elem_type)); - } - } - } - - GIVEN("Some class files with generic type variable") - { - WHEN("Parsing a class with bounded type variable") - { - REQUIRE(new_symbol_table.has_symbol("java::generics")); - - THEN("The generic fields should be annotated with concrete types") - { - const symbolt &class_symbol= - new_symbol_table.lookup_ref("java::generics"); - const typet &symbol_type=class_symbol.type; - - REQUIRE(symbol_type.id()==ID_struct); - class_typet class_type=to_class_type(symbol_type); - REQUIRE(class_type.is_class()); - java_class_typet java_class_type=to_java_class_type(class_type); - REQUIRE(!is_java_generics_class_type(java_class_type)); - - const struct_union_typet::componentt &belem= - java_class_type.get_component("belem"); - const typet &belem_type=java_class_type.component_type("belem"); - - REQUIRE(belem_type!=nil_typet()); - REQUIRE(is_java_generic_type(belem_type)); - THEN("Field has instantiated type variable") - { - const java_generic_typet &container= - to_java_generic_type(belem_type); - - const std::vector &generic_types= - container.generic_type_variables(); - REQUIRE(generic_types.size()==1); - - const typet& inst_type=java_generic_get_inst_type(0, container); + std::string class_prefix = "java::Generic"; + REQUIRE(new_symbol_table.has_symbol(class_prefix)); - REQUIRE(inst_type.id()==ID_pointer); - const typet &inst_type_symbol=inst_type.subtype(); - REQUIRE(inst_type_symbol.id()==ID_symbol); - REQUIRE( - to_symbol_type(inst_type_symbol).get_identifier()== - "java::java.lang.Integer"); - } - } - } - } - - GIVEN("Some class files with Generics") + WHEN("Parsing the class") { - WHEN("Methods with generic signatures") + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + THEN("The class symbol is generic") { - REQUIRE( - new_symbol_table - .has_symbol("java::generics$bound_element.f:()Ljava/lang/Number;")); - -// TODO: methods should have generic return type (the tests needs to be -// extended) - THEN("The method should have generic return type") - { - const symbolt &method_symbol= - new_symbol_table - .lookup_ref("java::generics$bound_element.f:()Ljava/lang/Number;"); - const typet &symbol_type=method_symbol.type; - - REQUIRE(symbol_type.id()==ID_code); - - const code_typet &code=to_code_type(symbol_type); - } - - REQUIRE( - new_symbol_table - .has_symbol("java::generics$bound_element.g:(Ljava/lang/Number;)V")); - THEN("The method should have a generic parameter.") - { - const symbolt &method_symbol= - new_symbol_table - .lookup_ref("java::generics$bound_element.g:(Ljava/lang/Number;)V"); - const typet &symbol_type=method_symbol.type; + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + class_typet class_type = + require_symbol::require_complete_class(class_symbol); + java_class_typet java_class_type = to_java_class_type(class_type); - REQUIRE(symbol_type.id()==ID_code); - - const code_typet &code=to_code_type(symbol_type); + REQUIRE(is_java_generics_class_type(java_class_type)); + java_generics_class_typet java_generics_class_type = + to_java_generics_class_type(java_class_type); - bool found=false; - for(const auto &p : code.parameters()) - { - if(p.get_identifier()== - "java::generics$bound_element.g:(Ljava/lang/Number;)V::e") - { - found=true; - const typet &t=p.type(); - REQUIRE(is_java_generic_parameter(p.type())); - const java_generic_parametert &gen_type= - to_java_generic_parameter(p.type()); - const symbol_typet &type_var=gen_type.type_variable(); - REQUIRE(type_var.get_identifier()== - "java::generics$bound_element::NUM"); - break; - } - } - REQUIRE(found); - } - } - } - GIVEN("A class with multiple bounds") - { - THEN("The bounds should be encoded") - { - REQUIRE( - new_symbol_table.has_symbol("java::generics$double_bound_element")); - THEN("The symbol should have a generic parameter") + THEN("The type variable is T") { - const symbolt &class_symbol= - new_symbol_table.lookup_ref("java::generics$double_bound_element"); - const typet &symbol_type=class_symbol.type; - - REQUIRE(symbol_type.id()==ID_struct); - class_typet class_type=to_class_type(symbol_type); - REQUIRE(class_type.is_class()); - java_class_typet java_class_type=to_java_class_type(class_type); - REQUIRE_FALSE(is_java_generics_class_type(java_class_type)); - - // TODO (tkiley): Extend this unit test when bounds are correctly - // parsed. -#if 0 - java_generics_class_typet java_generics_class_type= - to_java_generics_class_type(java_class_type); REQUIRE(java_generics_class_type.generic_types().size()==1); typet &type_var=java_generics_class_type.generic_types().front(); REQUIRE(is_java_generic_parameter(type_var)); java_generic_parametert generic_type_var= to_java_generic_parameter(type_var); - - REQUIRE( - generic_type_var.type_variable().get_identifier()== - "java::generics$double_bound_element::T"); - REQUIRE( - java_generics_class_type_var(0, java_generics_class_type)== - "java::generics$double_bound_element::T"); - THEN("Bound must be Number and dummyInterface") - { - - } -#endif - } - } - } - GIVEN("A class with multiple generic parameters") - { - THEN("Both generic parameters should be encoded") - { - const symbolt &class_symbol= - new_symbol_table.lookup_ref("java::generics$two_elements"); - const typet &symbol_type=class_symbol.type; - - REQUIRE(symbol_type.id()==ID_struct); - class_typet class_type=to_class_type(symbol_type); - REQUIRE(class_type.is_class()); - java_class_typet java_class_type=to_java_class_type(class_type); - REQUIRE(is_java_generics_class_type(java_class_type)); - - java_generics_class_typet java_generics_class_type= - to_java_generics_class_type(java_class_type); - REQUIRE(java_generics_class_type.generic_types().size()==2); - - auto generic_param_iterator= - java_generics_class_type.generic_types().cbegin(); - - // The first parameter should be called K - { - const typet &first_param=*generic_param_iterator; - REQUIRE(is_java_generic_parameter(first_param)); - java_generic_parametert generic_type_var= - to_java_generic_parameter(first_param); - - REQUIRE( - generic_type_var.type_variable().get_identifier()== - "java::generics$two_elements::K"); - REQUIRE( - java_generics_class_type_var(0, java_generics_class_type)== - "java::generics$two_elements::K"); - } - - ++generic_param_iterator; - - - // The second parameter should be called V - { - const typet &second_param=*generic_param_iterator; - REQUIRE(is_java_generic_parameter(second_param)); - java_generic_parametert generic_type_var= - to_java_generic_parameter(second_param); - - REQUIRE( - generic_type_var.type_variable().get_identifier()== - "java::generics$two_elements::V"); REQUIRE( - java_generics_class_type_var(1, java_generics_class_type)== - "java::generics$two_elements::V"); + generic_type_var.type_variable().get_identifier() == + class_prefix + "::T"); + typet &sub_type = generic_type_var.subtype(); + REQUIRE(sub_type.id() == ID_symbol); + symbol_typet &bound_type = to_symbol_type(sub_type); + REQUIRE(bound_type.get_identifier() == "java::java.lang.Object"); } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_classes.cpp new file mode 100644 index 00000000000..275a94df4d0 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_classes.cpp @@ -0,0 +1,231 @@ +/*******************************************************************\ + + Module: Unit tests for parsing generic classes + + Author: DiffBlue Limited. All rights reserved. + +\*******************************************************************/ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +SCENARIO( + "java_bytecode_parse_generic_inner_classes", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "GenericInnerClasses", "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::GenericInnerClasses"; + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + + WHEN("Parsing an inner class with type variable") + { + std::string inner_name = class_prefix + "$Inner"; + REQUIRE(new_symbol_table.has_symbol(inner_name)); + THEN("The symbol type should be generic") + { + const symbolt &class_symbol = new_symbol_table.lookup_ref(inner_name); + class_typet class_type = + require_symbol::require_complete_class(class_symbol); + java_generics_class_typet java_generics_class_type = + require_type::require_java_generic_class(class_type); + + const typet &elem_type = + to_java_class_type(class_type).component_type("elem"); + REQUIRE(is_java_generic_parameter(elem_type)); + + REQUIRE(java_generics_class_type.generic_types().size() == 1); + THEN("Type variable is named 'E'") + { + typet &type_var = java_generics_class_type.generic_types().front(); + REQUIRE(is_java_generic_parameter(type_var)); + java_generic_parametert generic_type_var = + to_java_generic_parameter(type_var); + REQUIRE( + generic_type_var.type_variable().get_identifier() == + inner_name + "::E"); + typet &sub_type = generic_type_var.subtype(); + REQUIRE(sub_type.id() == ID_symbol); + symbol_typet &bound_type = to_symbol_type(sub_type); + REQUIRE(bound_type.get_identifier() == "java::java.lang.Object"); + } + } + } + + WHEN("Parsing an inner class with bounded type variable") + { + std::string boundedinner_name = class_prefix + "$BoundedInner"; + REQUIRE(new_symbol_table.has_symbol(boundedinner_name)); + THEN("The symbol type should be generic") + { + const symbolt &class_symbol = + new_symbol_table.lookup_ref(boundedinner_name); + class_typet class_type = + require_symbol::require_complete_class(class_symbol); + java_generics_class_typet java_generics_class_type = + require_type::require_java_generic_class(class_type); + + REQUIRE(java_generics_class_type.generic_types().size() == 1); + typet &type_var = java_generics_class_type.generic_types().front(); + REQUIRE(is_java_generic_parameter(type_var)); + java_generic_parametert generic_type_var = + to_java_generic_parameter(type_var); + + REQUIRE( + generic_type_var.type_variable().get_identifier() == + boundedinner_name + "::NUM"); + REQUIRE( + java_generics_class_type_var(0, java_generics_class_type) == + boundedinner_name + "::NUM"); + THEN("Bound must be Number") + { + typet &sub_type = generic_type_var.subtype(); + REQUIRE(sub_type.id() == ID_symbol); + symbol_typet &bound_type = to_symbol_type(sub_type); + REQUIRE(bound_type.get_identifier() == "java::java.lang.Number"); + REQUIRE( + to_symbol_type( + java_generics_class_type_bound(0, java_generics_class_type)) + .get_identifier() == "java::java.lang.Number"); + } + + const typet &elem_type = + to_java_class_type(class_type).component_type("elem"); + REQUIRE(is_java_generic_parameter(elem_type)); + } + } + + THEN("The generic fields should be annotated with concrete types") + { + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + class_typet class_type = + require_symbol::require_complete_class(class_symbol); + + java_class_typet java_class_type = to_java_class_type(class_type); + REQUIRE(!is_java_generics_class_type(java_class_type)); + + const typet &belem_type = java_class_type.component_type("belem"); + + REQUIRE(belem_type != nil_typet()); + REQUIRE(is_java_generic_type(belem_type)); + THEN("Field has instantiated type variable") + { + const java_generic_typet &container = to_java_generic_type(belem_type); + + const std::vector &generic_types = + container.generic_type_variables(); + REQUIRE(generic_types.size() == 1); + + const typet &inst_type = java_generic_get_inst_type(0, container); + + REQUIRE(inst_type.id() == ID_pointer); + const typet &inst_type_symbol = inst_type.subtype(); + REQUIRE(inst_type_symbol.id() == ID_symbol); + REQUIRE( + to_symbol_type(inst_type_symbol).get_identifier() == + "java::java.lang.Integer"); + } + } + + WHEN("Parsing an inner class with double bounded type variable") + { + std::string doubleboundedinner_name = class_prefix + "$DoubleBoundedInner"; + REQUIRE(new_symbol_table.has_symbol(doubleboundedinner_name)); + THEN("The bounds should be encoded") + { + const symbolt &class_symbol = + new_symbol_table.lookup_ref(doubleboundedinner_name); + class_typet class_type = + require_symbol::require_complete_class(class_symbol); + + java_class_typet java_class_type = to_java_class_type(class_type); + REQUIRE_FALSE(is_java_generics_class_type(java_class_type)); + +// TODO (tkiley): Extend this unit test when bounds are correctly +// parsed. +#if 0 + java_generics_class_typet java_generics_class_type= + to_java_generics_class_type(java_class_type); + REQUIRE(java_generics_class_type.generic_types().size()==1); + typet &type_var=java_generics_class_type.generic_types().front(); + REQUIRE(is_java_generic_parameter(type_var)); + java_generic_parametert generic_type_var= + to_java_generic_parameter(type_var); + + REQUIRE( + generic_type_var.type_variable().get_identifier()== + doubleboundedinner_name+"::T"); + REQUIRE( + java_generics_class_type_var(0, java_generics_class_type)== + doubleboundedinner_name+"::T"); + THEN("Bound must be Number and Interface") + { + + } +#endif + } + } + + GIVEN("An inner class with multiple generic parameters") + { + std::string twoelementinner_name = class_prefix + "$TwoElementInner"; + REQUIRE(new_symbol_table.has_symbol(twoelementinner_name)); + THEN("Both generic parameters should be encoded") + { + const symbolt &class_symbol = + new_symbol_table.lookup_ref(twoelementinner_name); + class_typet class_type = + require_symbol::require_complete_class(class_symbol); + java_generics_class_typet java_generics_class_type = + require_type::require_java_generic_class(class_type); + + REQUIRE(java_generics_class_type.generic_types().size() == 2); + + auto generic_param_iterator = + java_generics_class_type.generic_types().cbegin(); + + // The first parameter should be called K + { + const typet &first_param = *generic_param_iterator; + REQUIRE(is_java_generic_parameter(first_param)); + java_generic_parametert generic_type_var = + to_java_generic_parameter(first_param); + + REQUIRE( + generic_type_var.type_variable().get_identifier() == + twoelementinner_name + "::K"); + REQUIRE( + java_generics_class_type_var(0, java_generics_class_type) == + twoelementinner_name + "::K"); + } + + ++generic_param_iterator; + + // The second parameter should be called V + { + const typet &second_param = *generic_param_iterator; + REQUIRE(is_java_generic_parameter(second_param)); + java_generic_parametert generic_type_var = + to_java_generic_parameter(second_param); + + REQUIRE( + generic_type_var.type_variable().get_identifier() == + twoelementinner_name + "::V"); + REQUIRE( + java_generics_class_type_var(1, java_generics_class_type) == + twoelementinner_name + "::V"); + } + } + } +} From 2e2e34b4af6840a96547ce945d9d7f1bc0478c64 Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 27 Oct 2017 11:49:28 +0100 Subject: [PATCH 05/22] Renaming unit test for generic inner classes to bounded generic inner classes --- ...ndedGenericInnerClasses$BoundedInner.class | Bin 0 -> 725 bytes ...nericInnerClasses$DoubleBoundedInner.class | Bin 0 -> 755 bytes .../BoundedGenericInnerClasses$Inner.class | Bin 0 -> 691 bytes ...dGenericInnerClasses$TwoElementInner.class | Bin 0 -> 777 bytes .../BoundedGenericInnerClasses.class | Bin 0 -> 747 bytes ...s.java => BoundedGenericInnerClasses.java} | 2 +- .../GenericInnerClasses$BoundedInner.class | Bin 676 -> 0 bytes ...nericInnerClasses$DoubleBoundedInner.class | Bin 706 -> 0 bytes .../GenericInnerClasses$Inner.class | Bin 642 -> 0 bytes .../GenericInnerClasses$TwoElementInner.class | Bin 728 -> 0 bytes .../GenericInnerClasses.class | Bin 684 -> 0 bytes ...> parse_bounded_generic_inner_classes.cpp} | 22 ++++++++---------- 12 files changed, 11 insertions(+), 13 deletions(-) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$BoundedInner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$DoubleBoundedInner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$Inner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$TwoElementInner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.class rename unit/java_bytecode/java_bytecode_parse_generics/{GenericInnerClasses.java => BoundedGenericInnerClasses.java} (87%) delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$BoundedInner.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$DoubleBoundedInner.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$Inner.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$TwoElementInner.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses.class rename unit/java_bytecode/java_bytecode_parse_generics/{parse_generic_inner_classes.cpp => parse_bounded_generic_inner_classes.cpp} (93%) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$BoundedInner.class b/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$BoundedInner.class new file mode 100644 index 0000000000000000000000000000000000000000..99180b2bfd4dfde6132bb783f5a39419c5fa104b GIT binary patch literal 725 zcma)4!A`CGjI0oyxH0L{CfWYaEg2!VeDy8kWrCUaloK(n~xY$&7t{ZR&3K5R9gP1 z$K7*=cv}n{)AL=<5b3n;ZzvY^9>kW`>w?=g?wvnc{fkw*XW2t z(~-cTiX6kya{9vi7>wVKohmbgi?Z#R|+D?1`2t#&j0`b literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$DoubleBoundedInner.class b/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$DoubleBoundedInner.class new file mode 100644 index 0000000000000000000000000000000000000000..9e145a08faa05922afdb392be7c53d9163663232 GIT binary patch literal 755 zcmb7C%TB^T6g>k-rJz()R77FH0x^mURzO&Y(U3H10%1Rt5lc#I`Y`dcTo@AH|`8pW& zgj-{XwatOe{lFCr;ZBDlQUBib3TF&i{oD!czUW^GTezmtvT18t-1CGdadp!+{RTs> zxD0sIB>_#RPxX_!X^RPShxaUsq;$vNR+qb`^ryjy6hOHPC!pX|!mSE^3EYEZpOy;GgG%b#^or0kd10*6U!De%^a1G!3K}-aBmB4;!xq`HmW*iF Xrae4mOk;<<5O$FoXGuNwu>pJmD73-e literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses$Inner.class new file mode 100644 index 0000000000000000000000000000000000000000..71d3e8ef04b93d1738ec2456b35a049905d4ba6a GIT binary patch literal 691 zcmah{O;5r=5PeGvl~Sdmq9O`0BqAo_!IKgW5;P`_nn1XhvcZzlntqu0vpg6R5B>mu zlySCTq7v}1J2P+JyqTTdkI%Pv0H-LYAz@pEjDmuqf?WogJABNLGe+j4S$9l#SikL$ zxD}o=q&xP|HN(i~3{tmENGiOygUSg*(YWv;cfbc%+~vM)UAtsjju`|z5WI%%+F_HS zR9!?o>`?oI6Q>oV*wC{~H7 z)LZ_y?$g7!_QAi|4H`m|B&v<}+3diYvk-&Y@gm>im$tZ4Y5vfT#r!p-p=!urPeF;H zJfA+f4TJvo+32OJVyuPvxhT^wkm*AtXeE&XgAzwex-J?ZpV7)dBfCuA9We!0tsT99 z)n1W!rbxmH?IK(FS=#dx7IdspMEqEdVV!)TB@i7OWTk1vJT@sxU<Sxd*cZ6bVr@++7(dH}F>&Ds_)*4l zQ4>WWadBtnOi$0uow=`X&o2OWuo{Pf1rt#$#;_biN+8#QWU*nl?VM|Sm$~z5L)F4P zLA>N#dUn_fl)xyTG9zsrRTvG1S57mtEm$n>`z^1o>c`4cfm1v2=nh=F*;Gx<%R8PE z76hrae#G^PAbQ}}S!t~3cB$QC`@o zEU>;Cqu-p)UC@*EbYRG?lyf4cj7wv|6}h2J!RS@K&!O&vLU z4yoRg-qP!{FbvDW2+}dE2(rED-4_=my7$jTuj#GK_f|ogZz;-WW$+AO5P}$^2!?3m z->{iT=+>AOo)L`Fk1@I+H$rb_Hy$C`Cqy2I3?yi^8Ze1*+UXA#l9(bQzoW)wF}6B9 Zliy~DjL!~cF-H`^JQXybx4{x7fOqn4!E68k literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.class b/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.class new file mode 100644 index 0000000000000000000000000000000000000000..e02689d3f634409428fa7e92cfc5c7a93bc02a49 GIT binary patch literal 747 zcma)4%TB^j5IqCb3RXdUBMKN2g+$r7gRl@EA!&30Vc)_HmXzD15B)AzCNBH{Kgu|5 znusAZrsJTHIvx@~(9ODL~2K)d$4a(~P literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses.java b/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.java similarity index 87% rename from unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses.java rename to unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.java index e8d4d5e7cd7..c6f53609c4d 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/BoundedGenericInnerClasses.java @@ -1,4 +1,4 @@ -public class GenericInnerClasses +public class BoundedGenericInnerClasses { class Inner { diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$BoundedInner.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$BoundedInner.class deleted file mode 100644 index 3b2d92f4c890ccfebfcf3e2040955ca2cc83ae7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmah{O;5r=5PeGvg;J%0Abu0W0Wc8{o|JHqL}OCX1ms@I21`n7+G66*@?cCn_yhb= z#@T`qV-pX%GjI0Iyq($o_G@g>HruZiPfvd)~~q_=PRHE5}UiNX%VB2C9ZE z_7vF78=B%o=#cFNEeJ z>gDN|?kuY9h#F0rM~e#8nr3}@c6FoU2Eu>fmT0sV!gu|VumVa;cD>NI#I-H&U5J?F zx!i|_1d?n;Wz>p(HevPx6BzM?XN6HpN*)1B0UO~-baki3Rb}opIU3WF8N7k zbW+eru9J38NQq5WPT#;P?})vUrC@{pG8;(K2jpic=*W^q_-QqUEz)Hz>CurRsmvMk R*d{B60y5JmwT(S&0zXGlu4VuL diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$Inner.class deleted file mode 100644 index 1162357e0daed77e1d2c3851677ede6a739a5a77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 642 zcmZ`$O;5r=5PeGvl~SdGAc!9vI3OnC!IKg$1dU0fCJ^omZg5E{rY$D^EDy%SgFnC@ zWt=UTsMN#meC(Tfvu{2=-`)Y7qMC+=vI!kK26heXG3de-Q-+)~;g7uOa&O$c8BW9~ zJZDJvTs ztN)j^=%a0_t+%>otD>}5Qw(NrHup#3LaI-cVuU$X;#x?vWmyanzm6od0eiL+(NP)qKqBYxAl;kry8CYc3$-5<_!kUev7qG@F63-NA*q~cg sD?dwjae;!3JVk_$x-o2#uX?GBjRIM1$ymfTMG2IUi(YALRImwr0p9$T2LJ#7 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$TwoElementInner.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericInnerClasses$TwoElementInner.class deleted file mode 100644 index 459f8c95fb65b484706793d8cff5628c86dff778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcma)4$xZ@65Pij<$T$e%hC6PFVq6ZMlyEU>3`9*Jb04syqvK$P0pn+RFeV=S06)t3 z8Z}XvgNLrFSN*!ye*buV1F(nXBn-@&h+{5+g#;D_ax2JIZk&#@<2nA-&UyVtHNpcy zvg%&>PS_5Vz^Ik!k&d=(T7%)W+gjZfOjJ&kuL8Gm>QfzhPOGI_nox9oH!KNq>yeBN zTM$2NUNUyN;`-{WeOFgO&8d6zWGl^vy%{I9-2pJ7GO)0Q`rxvV5 zkpPwD!EA`U^X0_Q48tT~9o#!H^xvh6& zVHlQ$6!Hly305L_y*&yty<6q_*7fAaBAz49uMy`jF?a?r2tk5Y3`3O3U)aoKbTRY_ zPYNT{X<8TL#;DE0<};-5g4h$0fefXN28?5ra`KCXEGCG^??&T7Xj@&L$-5~c4+OQloK(D(<+Xc`8QH0C<_h66s$>T>JNfNZEIPxwOrOAYWmf|s-o5C9z+yghG zyO!aM4bP7Di(n>rwtYe+>2%i458cqS#JwE}R1;ddjP9gi3nfB1Ax|j&-ulU$2`eC+ zBoJFG<2X%Xtqz1xPa-b=YC SCENARIO( - "java_bytecode_parse_generic_inner_classes", + "java_bytecode_parse_bounded_generic_inner_classes", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( - "GenericInnerClasses", "./java_bytecode/java_bytecode_parse_generics"); + "BoundedGenericInnerClasses", + "./java_bytecode/java_bytecode_parse_generics"); - std::string class_prefix = "java::GenericInnerClasses"; + std::string class_prefix = "java::BoundedGenericInnerClasses"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); WHEN("Parsing an inner class with type variable") @@ -106,7 +107,7 @@ SCENARIO( } } - THEN("The generic fields should be annotated with concrete types") + WHEN("There is a generic field with a concrete type") { const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); class_typet class_type = @@ -153,7 +154,7 @@ SCENARIO( REQUIRE_FALSE(is_java_generics_class_type(java_class_type)); // TODO (tkiley): Extend this unit test when bounds are correctly -// parsed. +// parsed - issue TG-1286 #if 0 java_generics_class_typet java_generics_class_type= to_java_generics_class_type(java_class_type); @@ -192,12 +193,10 @@ SCENARIO( REQUIRE(java_generics_class_type.generic_types().size() == 2); - auto generic_param_iterator = - java_generics_class_type.generic_types().cbegin(); - // The first parameter should be called K { - const typet &first_param = *generic_param_iterator; + const typet first_param = + java_generics_class_type.generic_types().at(0); REQUIRE(is_java_generic_parameter(first_param)); java_generic_parametert generic_type_var = to_java_generic_parameter(first_param); @@ -210,11 +209,10 @@ SCENARIO( twoelementinner_name + "::K"); } - ++generic_param_iterator; - // The second parameter should be called V { - const typet &second_param = *generic_param_iterator; + const typet &second_param = + java_generics_class_type.generic_types().at(1); REQUIRE(is_java_generic_parameter(second_param)); java_generic_parametert generic_type_var = to_java_generic_parameter(second_param); From 80be2fde4f719dadab855f38d3f1bad4e2ccdc69 Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 27 Oct 2017 11:33:35 +0100 Subject: [PATCH 06/22] Extending and cleaning test for generic class with generic inner classes --- .../GenericClass$InnerClass.class | Bin 500 -> 0 bytes .../GenericClass.class | Bin 4622 -> 0 bytes .../GenericClass.java | 109 -- ...ricInnerClass$DoublyNestedInnerClass.class | Bin 0 -> 891 bytes ...rClass$DoublyNestedInnerGenericClass.class | Bin 0 -> 1038 bytes ...enericInnerClasses$GenericInnerClass.class | Bin 0 -> 1052 bytes ...ssWithGenericInnerClasses$InnerClass.class | Bin 0 -> 661 bytes ...erClasses$SameGenericParamInnerClass.class | Bin 0 -> 844 bytes ...nericInnerClasses$TwoParamInnerClass.class | Bin 0 -> 857 bytes .../GenericClassWithGenericInnerClasses.class | Bin 0 -> 7785 bytes .../GenericClassWithGenericInnerClasses.java | 147 ++ ...neric_class_with_generic_inner_classes.cpp | 1390 +++++++++++++++++ .../parse_generic_inner_class.cpp | 935 ----------- 13 files changed, 1537 insertions(+), 1044 deletions(-) delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClass$InnerClass.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClass.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClass.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$GenericInnerClass$DoublyNestedInnerClass.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$GenericInnerClass$DoublyNestedInnerGenericClass.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$GenericInnerClass.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$InnerClass.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$SameGenericParamInnerClass.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$TwoParamInnerClass.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_class.cpp diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClass$InnerClass.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericClass$InnerClass.class deleted file mode 100644 index 5a263fcbd4b297bb627f93d05fd4780a0f8670a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 500 zcmY*V!AiqG5PjRk#KzbrRa>hd9(t%1S`Xe@dMPMEP{GjqCN8=qO(aPLKg)v%9{d15 zN}P>K6PDebxAW%B+xhzb_yll{!#XtVTF|j)qGMv8!N?zF);nWpc$Xp;sSIZk&$2OP zCNh@!l)>#+Qzvrnf%Wg+7D5 z27+?kN{`+;Nlw~T&6lTt-J?p;#P`S3VWrZ#OIB$pE~K*NmOnUL@Mmsg1BML~T@wck zoid?hfx%JiQN-hi(M_-rVa}lS)g0_{365#JI!&56j#5?;Z4;Yx*D1P1jTT@HPT#-= x@2I^J(qPeP6kH8k6t{m_u+bz${6dXvP;3`Gi*A=t4XxtbL8IW2FRI=KegHt(ZDIfb diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClass.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericClass.class deleted file mode 100644 index 3b60626bea696f3bef865c8814faf32b424b7d66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4622 zcmbW4Z&wpX6vm$kgjJ*{(xRdwXsUrisPb15qZowRM!+W0*8brvVT-XL@r0!3_^sMk zJ*O}F0s5hO`pj;!JCn_3H@rw@XXf7DbMMT(VfpvJzyATSjKg6J;5!4~8~DM%TY<@f zd1~!gRjXbu?VEM;^ktRLxr%vqCNSbntTO{Y3XHW(y$u6D2@HF4f%vawt8y%GBi}N% zX$j9HEpV|=KB=0GX5A8)((E$DVmh1BjE8LCBY|nnGU1Db;Cao&f%)t*`R!UQou#>h zUJ{s#(~ohU`-?XgH3dIBtEBk_Rb*{NO4kI5!j4` zvyVLlwrb!Pf!jVS^_~T?nqHK|Re$FHS_AZ(zY6QT=rw^?k>K4=LqoS~AyclF8(D#Y z5)}0nnx9`T+P=?X63-Fm*u>*IM{esW}l5}G4TW@bmNa7 z+79EIrF}HA9#5^tyBb^WR#Mwndrk%yFIPV_8v--BnRCKk?WU!z;V{{CE4sA`?Ws0o zs}b;22l(VPif>m5hJAWZXZfqk4t`O$a+s~#^YUz0hoZ17un^7HzJA4%jkckC`eO@f zd5PK9oqLBI)b&a{s{&imklkzD{?S$|fxWY-1EVCUwv0_H>WqH#RC!(QZ(U$Nnn3rg zHN1Ppm+DsI(CLSV0ymShTE(gj!M{-*yS{oBP;l&yyB!YxQ)P#zI*fWB8yyr4cFlZ5 zcRORvnGNx{!`UBTP+beW=DLIxOep4DmBts{}NyG3bkgvWNnw_ zAGG$XpnaSv2^hg$+~ZrLsv>ZulP&N-wMg`O1D(<=TNCdWT;Q5!pzf?_J3iNdnia_O z>!;dd1~I;20|q~rFam*3_!Pq^zc1s8J0Iixsxlwv{8L0ljs|#uB*$58WsWo83(PZgiF?gY zj2|B=X`?2b%@&GgSg`RD>g_pDxi?A+=Uh^>Sj3kt8H+P{dOn#2TV~qX^vOuUhZKz2 zS$I~upkp;kD@Xbfg_ig~QAmbMff>r%49alK&2WV>tKl;1=aLzBW!5OOj>loyJPDMM zwHK7lbysGCGU;%c=jW1{bY(J>d4g0Aypoll*$8f-3b+9tx800L@ XXM^Jfju$x&bNq}e6C7`Gybb&ho&OlJ diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClass.java b/unit/java_bytecode/java_bytecode_parse_generics/GenericClass.java deleted file mode 100644 index 8c13ed4f0db..00000000000 --- a/unit/java_bytecode/java_bytecode_parse_generics/GenericClass.java +++ /dev/null @@ -1,109 +0,0 @@ -public class GenericClass -{ - class InnerClass - { - } - - class GenericInnerClass - { - V field; - - class DoublyNestedInnerClass - { - - } - - class DoublyNestedInnerGenericClass - { - T field; - } - } - - class SameGenericParamInnerClass - { - T field; - } - - InnerClass field; - GenericInnerClass field2; - GenericInnerClass field3; - - GenericInnerClass.DoublyNestedInnerClass field4; - GenericInnerClass.DoublyNestedInnerClass field5; - - GenericInnerClass.DoublyNestedInnerGenericClass field6; - GenericInnerClass.DoublyNestedInnerGenericClass field7; - - void method(InnerClass input) - { - - } - - void method2(InnerClass input, InnerClass input2) - { - - } - - - void method3(GenericInnerClass input) - { - - } - - void method4(GenericInnerClass input) - { - - } - - void method5(GenericInnerClass.DoublyNestedInnerClass input) - { - - } - - void method6(GenericInnerClass.DoublyNestedInnerClass input) - { - - } - - void method7(GenericInnerClass.DoublyNestedInnerGenericClass input) - { - - } - - void method8(GenericInnerClass.DoublyNestedInnerGenericClass input) - { - - } - - InnerClass ret_method1() - { - return null; - } - - GenericInnerClass ret_method2() - { - return null; - } - - GenericInnerClass ret_method3() - { - return null; - } - - GenericInnerClass.DoublyNestedInnerClass ret_method4() - { - return null; - } - GenericInnerClass.DoublyNestedInnerClass ret_method5() - { - return null; - } - GenericInnerClass.DoublyNestedInnerGenericClass ret_method6() - { - return null; - } - GenericInnerClass.DoublyNestedInnerGenericClass ret_method7() - { - return null; - } -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$GenericInnerClass$DoublyNestedInnerClass.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$GenericInnerClass$DoublyNestedInnerClass.class new file mode 100644 index 0000000000000000000000000000000000000000..3065af91fd05391cbb9cb037aba52158088c992d GIT binary patch literal 891 zcmbVKT}#4H7=DghF6YXRYJEqL7iORYMUdi+Q3PT^!@Aw(At!5#Z3h0VE+XinAJC7A z-eZQu5=M-j_j%s)p7;CX^X(nL5q2_=psSFvs$fmQIzu|@J7MWi!6rlDf_pr0>`RYC z%QeH0L7Ngz^rStp8DHNzQ9t&EhozXVPJtSZ=R{40)AB!k>~|UDmfzzHxwhl+&hWwF zfni!MX^L&%Hr=inID$`Q-;=O4-44waFQu^B;6{-KuV)Xcv$z762 z4a2B6tFh)aj4r8X##C?oVPNxfN3@}wU_8}<`DALCLq>y&Eruky#b-LB3k-STzvi0W zeeKE`a63}4&2XF`vv?2&sVwHcm*6#aX}e`wbe7MH>I9-+MV6#S=o%^dNK-j@0js32IrnGOIMt=Z*Ae3mhG@6TW-}Yr)GIl;f^w) ziX$u@wc57xa3=gfG{Sm*7D1@?mr$XrTP}I(cTNv?UwJip325;9lr|%+G|U>SyM{K* z>OqO)7mezEbP7sQ6+y4G+Fo58OV!Kb&-VQD#+z!oQb=MXg;A^!Dm@rQ2cvrr37Nk` ztYMX~+gB_e`J$Skd=J*h@yAN=AB*uCz#s@(h=wv5RW!@QYZPfdGb~*&Q*rh6jVI9h zGh&a7;uzyyS%X|m`-rj4GKNEj HjtSrcRctCj literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$GenericInnerClass.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$GenericInnerClass.class new file mode 100644 index 0000000000000000000000000000000000000000..3a691c046fe258e037103c9f2ce433d486c4175c GIT binary patch literal 1052 zcmbVM+e*Vg5IxgWqqS;VwchVlqJsLM2wDoFC_+)8r9P+asw**-Bo+KDA4KrM5AdVJ z*%-092*HQVTz2Nn?Ah78y}!Hy*uruz3{0nx#EgkK6Z3@Zv2cYa8z(M{1IPA#Li*bf zzKI3G^kJ)AcOFiKABbkS8>NLACKd^KEhIwgx|G6c5_07m``+GgZ1-y8tbQXJ!5*Qv zBClLKXnTTSRBP<%4z8tN*d#2KJ8N9X;96@{_$r|&T^W=JmK7^wrA9~|w3=LTuq<71 z+PojC9Xtx0Y%{}c7$?hAQ84rH-f-7BqYxJ9O` z#Nbx3wyRTH(p`j9rPcNt;z+8aS~2KdS67zCATnuWQ82MY*p88>vp~rFzJ5aGUr+^Y z(mG)XaX8f*)KR1PH7qqTi=8$87)H$T^GfndOYrJL8ifAP8pvc6hpZE?EOIP|SUcxP z6`NXJdjhRKBk{H-li6p7u&+;IG2Y-M+ zN_@LkYHwlL-8U~Y@6GP!>-*yqz$x}CFtBOE#Fm9^3p)(ud@Qp@o8c(95V1&Q*pGOY z-N}4B!%S~Gs1hQ+u14-Cb~MkXeVtGVHN9?N LP4mbusaJs?hXt+p literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$SameGenericParamInnerClass.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses$SameGenericParamInnerClass.class new file mode 100644 index 0000000000000000000000000000000000000000..c46e01daea04760cd03cd26d84547d164356d3d3 GIT binary patch literal 844 zcma)4T}uK%6g}hmk-Ft(Wo2JN2AhHQ&{N402t~1!pxE=Mla8!wtZUHE>LG$2`T_l@ z=+0tDg|QDabI+Okac1uQ_u^0y_+`dnueQL)ISfM_zHb+pFBR z2cqMjF(ezZ=W>7I2?nj%Bqr|n<+ymvaA02wS9r2hbNG0CC;k2uU%5mFq!_D!s&u7q zF_>nkh{F~`v^MHe#f&XoaWfgVh1cY5hnTEA>TsvUJ*n`Nj4DYC`34_~sfIfD_;4nK zL7xFZzUN`26z3o3KSYK$gcM_fqt zQD%tdlvTrZB$3jQ#%=<83|5G^fBuER_&r55IHv09eu&H{(0E2^QX{lth=U;!pasKF zI>~0V($MK#B&$xI$~RRydI2lFBJxZ~!xHT(8pt6N?12{ytPmpqAREIf*(#S}46My@rZ0ks4HBDrp4Nn6ZDqS9ewGK3c<=-KC~>AL zKI&l~X6BwVXYRdo?|plJc?GbJ*(@xK*+^qNgUJl01jMyK-n)`_ay5|Q#p-eSN>$=* zf$XWi2xVN4lz`;$q_JJa!H6CZ@68>Fh42d)lv zTofo261`X~38Z(b=ZxLs=};ZjZ^|n2WjP>|_o@{clw_n0Zjxz}67T%`>WPfx&36I< z&NoohY$i!zzSR-`G59<5!|hl2-6TF;-`_5-v^sWKUe>k90Iqwu)!Gg3AFkLc6R=OK z^{Aruw5d}eL2p(}=N)vyanOb73}ys261@ATJOa7DW5jtWm{!gu@Q7*7W}0JaakZfx z0vTE(TDW3My@)N|;Gg6O47INH;H((6C+y_5Z$YX$r i`i3|5mbTN-*}NMfvYHtTV}vM$QS>+T{1ztA2YdjKT;Ny$ literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.class new file mode 100644 index 0000000000000000000000000000000000000000..fe2480d4734874693c44c832e11aaa18627424ff GIT binary patch literal 7785 zcmcIoTUQ%Z6y7IX(o$4PEh@GOLTftp=0d}SE*^aF!3Q6F z(53%FpIplae}F&A<#%R=$r&cY>}2Rea%Rst`}_9(&Y8WF`S-uS{~@9=df7q^RESeC zPDgQiA*em`vbd_1wES|RpqJ)z+VQcV){3DY$EhT!b4|lU|1dr>^T*Wa? zrl6LJEvRYF&~v+jhSJVri*3U&4}8x0ac{*lDd_5&v0u>4a!D67&T*g3WRj@?4@R>^ zKO$(71JLV>31Mt)iV1Txy9jYr%V>!^fqOvLF# z&~4u;^&|^=!cl-DsR|2af92p_in1y(>%>k9+Km!jb@4r6cndBK-3WG3Axz{8FYCToiAn%r_V`A z6g_K(#q2M9mR`?T&UOS&U8pF2!84gscVkS@LL?sRfl#tW(|N=K^k*H^K_z;Lg;|Ff zK}}RiX+lu6y^tC)c+fI7S!r^lQ#*yV;lHz>FGWF>n|lz^zxE?VSY2dKDCf^AI!}_t zS*>Zx19HOhwl%%9zA1^X*tJx)wCz_FgR9mV*|4CcXk>tNQLmMBbK6Nn&`6?>Q*YIt zfIloeCtLqYZA3Rz$k8CCc{u*Z4oFXVzI8lT-Z0Tk=A%(r%6n2r@n7X(`cn@o)`DK} zAnQ;hsD^ryLIaApCsHUD6&k|^FIkR$YN^8B|HebU6d6_O3k$YKY4oeTXhBw2+7pfc z)S^?&@Mx=*Z9!$8vn}kURc()QXgtqfSrm?9txA1Gn^=s<2UG_*F`Jo5A8IGsU`{LS z4?f&E)U#$X<-dj3Tx-R0DXZT%5SOi{K5~f;5Y!zno2(sG{Esw9az26M-))A1+8)T8E`5LbyE!QREb*fd5vBt{6EH3 zjN0&ho!VXd2JAN#`zGuTddHpbg#E5!--3Ocy4?A0*dHi%5A0sLaayZRKT{Jx|&6lA0 ziqc`(Yz5NDIuNuscU_tXpjip0(dwc}xHJzzvl>pbR~JpcOCul1$F$~%mco5m&tl>a ze5=Lm(BiR+S_t0%M`idn1ya|4*03{0~I%&&p@l%9pgd0GSJ7BIhI zV18c%=5t_f)3>2<{!jy^2Fx7>=8rXCW`Vg&dT5+K)quGN%zXyt&oy8k0MlS#{!#MrH&Y|5CS1ocUcq=3qx_|F4Pz_Dw{YiejPGH5pXh(VZVNO3 literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.java b/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.java new file mode 100644 index 00000000000..91d269a85dd --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.java @@ -0,0 +1,147 @@ +public class GenericClassWithGenericInnerClasses +{ + class InnerClass + { + } + + class GenericInnerClass + { + V field; + + class DoublyNestedInnerClass + { + + } + + class DoublyNestedInnerGenericClass + { + T field; + } + } + + class SameGenericParamInnerClass + { + T field; + } + + class TwoParamInnerClass + { + K k; + L l; + } + + InnerClass field; + + GenericInnerClass field2; + GenericInnerClass field3; + + GenericInnerClass.DoublyNestedInnerClass field4; + GenericInnerClass.DoublyNestedInnerClass field5; + + GenericInnerClass.DoublyNestedInnerGenericClass field6; + GenericInnerClass.DoublyNestedInnerGenericClass field7; + + TwoParamInnerClass field8; + TwoParamInnerClass field9; + TwoParamInnerClass field10; + + void method(InnerClass input) + { + + } + + void method2(InnerClass input, InnerClass input2) + { + + } + + + void method3(GenericInnerClass input) + { + + } + + void method4(GenericInnerClass input) + { + + } + + void method5(GenericInnerClass.DoublyNestedInnerClass input) + { + + } + + void method6(GenericInnerClass.DoublyNestedInnerClass input) + { + + } + + void method7(GenericInnerClass.DoublyNestedInnerGenericClass input) + { + + } + + void method8(GenericInnerClass.DoublyNestedInnerGenericClass input) + { + + } + + void method9(TwoParamInnerClass input) + { + + } + + void method10(TwoParamInnerClass input) + { + + } + + void method11(TwoParamInnerClass input) + { + + } + + InnerClass ret_method1() + { + return null; + } + + GenericInnerClass ret_method2() + { + return null; + } + + GenericInnerClass ret_method3() + { + return null; + } + + GenericInnerClass.DoublyNestedInnerClass ret_method4() + { + return null; + } + GenericInnerClass.DoublyNestedInnerClass ret_method5() + { + return null; + } + GenericInnerClass.DoublyNestedInnerGenericClass ret_method6() + { + return null; + } + GenericInnerClass.DoublyNestedInnerGenericClass ret_method7() + { + return null; + } + TwoParamInnerClass ret_method8() + { + return null; + } + TwoParamInnerClass ret_method9() + { + return null; + } + TwoParamInnerClass ret_method10() + { + return null; + } +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp new file mode 100644 index 00000000000..b7b1b1e54eb --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp @@ -0,0 +1,1390 @@ +/*******************************************************************\ + + Module: Unit tests for parsing generic classes + + Author: DiffBlue Limited. All rights reserved. + +\*******************************************************************/ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +SCENARIO( + "parse_generic_class_with_generic_inner_classes_fields", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "GenericClassWithGenericInnerClasses", + "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::GenericClassWithGenericInnerClasses"; + THEN( + "There should be a symbol for " + "GenericClassWithGenericInnerClasses with correct components") + { + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + + const class_typet &class_type = + require_symbol::require_complete_class(class_symbol); + + THEN( + "The field component should be a pointer to " + "GenericClassWithGenericInnerClasses$InnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field"); + + require_type::require_pointer( + field_component.type(), symbol_typet(class_prefix + "$InnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + + THEN( + "The field2 component should be a pointer to " + "GenericClassWithGenericInnerClasses$GenericInnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field2"); + + require_type::require_pointer( + field_component.type(), + symbol_typet(class_prefix + "$GenericInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + + THEN( + "The field3 component should be a pointer to " + "GenericClassWithGenericInnerClasses$GenericInnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field3"); + + require_type::require_pointer( + field_component.type(), + symbol_typet(class_prefix + "$GenericInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + } + } + + THEN( + "The field4 component should be a pointer to GenericClassWithGeneric" + "InnerClasses$GenericInnerClass$DoublyNestedInnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field4"); + + require_type::require_pointer( + field_component.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + + THEN( + "The field5 component should be a pointer to GenericClassWithGeneric" + "InnerClasses$GenericInnerClass$DoublyNestedInnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field5"); + + require_type::require_pointer( + field_component.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + } + } + + THEN( + "The field6 component should be a pointer to GenericClassWithGeneric" + "InnerClasses$GenericInnerClass$DoublyNestedInnerGenericClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field6"); + + require_type::require_pointer( + field_component.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + + THEN( + "The field7 component should be a pointer to GenericClassWithGeneric" + "InnerClasses$GenericInnerClass$DoublyNestedInnerGenericClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field7"); + + require_type::require_pointer( + field_component.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + } + } + + THEN( + "The field8 component should be a pointer to " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field8"); + + require_type::require_pointer( + field_component.type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + + THEN( + "The field9 component should be a pointer to " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field9"); + + require_type::require_pointer( + field_component.type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + } + } + + THEN( + "The field10 component should be a pointer to " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field10"); + + require_type::require_pointer( + field_component.type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == + symbol_typet(class_prefix + "::T")); + } + } + } + } +} + +SCENARIO( + "parse_generic_class_with_generic_inner_classes_methods", + "[core][java_bytecode][java_bytecode_parse_generics][caskjd]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "GenericClassWithGenericInnerClasses", + "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::GenericClassWithGenericInnerClasses"; + + THEN( + "Method 1 should take a pointer to " + "GenericClassWithGenericInnerClasses$InnerClass") + { + const std::string func_name = ".method"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$InnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$InnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + THEN( + "Method 2 should take two pointers to " + "GenericClassWithGenericInnerClasses$InnerClass") + { + const std::string func_name = ".method2"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$InnerClass;" + "LGenericClassWithGenericInnerClasses$InnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + // Check param input + { + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$InnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + + // Check param input2 + { + const auto param_type2 = + require_type::require_parameter(function_call, "input2"); + require_type::require_pointer( + param_type2.type(), symbol_typet(class_prefix + "$InnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type2.type())); + const auto &generic_variables = + to_java_generic_type(param_type2.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Method 3 should take a pointer to " + "GenericClassWithGenericInnerClasses$GenericInnerClass") + { + const std::string func_name = ".method3"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$GenericInnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$GenericInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Method 4 should take a pointer to " + "GenericClassWithGenericInnerClasses$GenericInnerClass") + { + const std::string func_name = ".method4"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$GenericInnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$GenericInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Method 5 should take a pointer to GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerClass") + { + const std::string func_name = ".method5"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Method 6 should take a pointer to GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerClass") + { + const std::string func_name = ".method6"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Method 7 should take a pointer to GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerGenericClass") + { + const std::string func_name = ".method7"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerGenericClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Method 8 should take a pointer to GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerGenericClass") + { + const std::string func_name = ".method8"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerGenericClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Method 9 should take a pointer to " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const std::string func_name = ".method9"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$TwoParamInnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Method 10 should take a pointer to " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const std::string func_name = ".method10"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$TwoParamInnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Method 11 should take a pointer to " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const std::string func_name = ".method11"; + const std::string func_descriptor = + ":(LGenericClassWithGenericInnerClasses$TwoParamInnerClass;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Ret Method 1 should return a " + "GenericClassWithGenericInnerClasses$InnerClass") + { + const std::string func_name = ".ret_method1"; + const std::string func_descriptor = + ":()" + "LGenericClassWithGenericInnerClasses$InnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet(class_prefix + "$InnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + THEN( + "Ret method 2 should return a " + "GenericClassWithGenericInnerClasses$GenericInnerClass") + { + const std::string func_name = ".ret_method2"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInnerClasses$GenericInnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$GenericInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Ret method 3 should return a " + "GenericClassWithGenericInnerClasses$GenericInnerClass") + { + const std::string func_name = ".ret_method3"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInnerClasses$GenericInnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$GenericInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Ret method 4 should return a GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerClass") + { + const std::string func_name = ".ret_method4"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInner" + "Classes$GenericInnerClass$DoublyNestedInnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Ret method 5 should return a GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerClass") + { + const std::string func_name = ".ret_method5"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInner" + "Classes$GenericInnerClass$DoublyNestedInnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Ret method 6 should return a GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerGenericClass") + { + const std::string func_name = ".ret_method6"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInner" + "Classes$GenericInnerClass$DoublyNestedInnerGenericClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_inst_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Ret method 7 should return a GenericClassWithGenericInnerClasses" + "$GenericInnerClass$DoublyNestedInnerGenericClass") + { + const std::string func_name = ".ret_method7"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInner" + "Classes$GenericInnerClass$DoublyNestedInnerGenericClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Ret method 8 should return a " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const std::string func_name = ".ret_method8"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInner" + "Classes$TwoParamInnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + } + } + THEN( + "Ret method 9 should return a " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const std::string func_name = ".ret_method9"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInnerClasses$TwoParamInnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } + THEN( + "Ret method 10 should return a " + "GenericClassWithGenericInnerClasses$TwoParamInnerClass") + { + const std::string func_name = ".ret_method10"; + const std::string func_descriptor = + ":()LGenericClassWithGenericInnerClasses$TwoParamInnerClass;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 3); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + { + const java_generic_parametert &generic_param = generic_variables[2]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + } + } + } +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_class.cpp deleted file mode 100644 index acb09972a88..00000000000 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_inner_class.cpp +++ /dev/null @@ -1,935 +0,0 @@ -/*******************************************************************\ - - Module: Unit tests for parsing generic classes - - Author: DiffBlue Limited. All rights reserved. - -\*******************************************************************/ - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include - -SCENARIO( - "Parse fields of inner classes on a generic class", - "[core][java_bytecode][java_bytecode_parse_generics]") -{ - const symbol_tablet &new_symbol_table = load_java_class( - "GenericClass", "./java_bytecode/java_bytecode_parse_generics"); - - std::string class_prefix = "java::GenericClass"; - THEN("There should be a symbol for GenericClass with correct components") - { - REQUIRE(new_symbol_table.has_symbol(class_prefix)); - const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); - - const class_typet &class_type = - require_symbol::require_complete_class(class_symbol); - - THEN("The field component should be a pointer to GenericClass$InnerClass") - { - const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field"); - - require_type::require_pointer( - field_component.type(), symbol_typet("java::GenericClass$InnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - - THEN("The field component should be a pointer to GenericClass$InnerClass") - { - const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field2"); - - require_type::require_pointer( - field_component.type(), - symbol_typet("java::GenericClass$GenericInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - - THEN( - "The field component should be a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerClass") - { - const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field4"); - - require_type::require_pointer( - field_component.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$DoublyNestedInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - - THEN( - "The field component should be a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerClass") - { - const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field5"); - - require_type::require_pointer( - field_component.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$DoublyNestedInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - - THEN( - "The field component should be a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerGenericClass") - { - const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field6"); - - require_type::require_pointer( - field_component.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$" - "DoublyNestedInnerGenericClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - - THEN( - "The field component should be a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerGenericClass") - { - const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field7"); - - require_type::require_pointer( - field_component.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$" - "DoublyNestedInnerGenericClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - } -} - -SCENARIO( - "Parse methods of generic classes using inner parameters", - "[core][java_bytecode][java_bytecode_parse_generics][caskjd]") -{ - const symbol_tablet &new_symbol_table = load_java_class( - "GenericClass", "./java_bytecode/java_bytecode_parse_generics"); - - std::string class_prefix = "java::GenericClass"; - - THEN("Method 1 should take a pointer to GenericClass$InnerClass") - { - const std::string func_name = ".method"; - const std::string func_descriptor = ":(LGenericClass$InnerClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericClass$InnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == symbol_typet("java::GenericClass::T")); - } - } - THEN("Method 2 should take two pointers to GenericClass$InnerClass") - { - const std::string func_name = ".method2"; - const std::string func_descriptor = - ":(LGenericClass$InnerClass;LGenericClass$InnerClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - // Check param input - { - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericClass$InnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - - // Check param input2 - { - const auto param_type2 = - require_type::require_parameter(function_call, "input2"); - require_type::require_pointer( - param_type2.type(), symbol_typet("java::GenericClass$InnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type2.type())); - const auto &generic_variables = - to_java_generic_type(param_type2.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - THEN("Method 3 should take a pointer to GenericClass$GenericInnerClass") - { - const std::string func_name = ".method3"; - const std::string func_descriptor = ":(LGenericClass$GenericInnerClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericClass$GenericInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - THEN("Method 4 should take a pointer to GenericClass$GenericInnerClass") - { - const std::string func_name = ".method4"; - const std::string func_descriptor = ":(LGenericClass$GenericInnerClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericClass$GenericInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - THEN( - "Method 5 should take a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerClass") - { - const std::string func_name = ".method5"; - const std::string func_descriptor = - ":(LGenericClass$GenericInnerClass$DoublyNestedInnerClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$DoublyNestedInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - THEN( - "Method 6 should take a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerClass") - { - const std::string func_name = ".method6"; - const std::string func_descriptor = - ":(LGenericClass$GenericInnerClass$DoublyNestedInnerClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$DoublyNestedInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - THEN( - "Method 7 should take a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerGenericClass") - { - const std::string func_name = ".method7"; - const std::string func_descriptor = - ":(LGenericClass$GenericInnerClass$DoublyNestedInnerGenericClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$" - "DoublyNestedInnerGenericClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - THEN( - "Method 8 should take a pointer to " - "GenericClass$GenericInnerClass$DoublyNestedInnerGenericClass") - { - const std::string func_name = ".method8"; - const std::string func_descriptor = - ":(LGenericClass$GenericInnerClass$DoublyNestedInnerGenericClass;)V"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$" - "DoublyNestedInnerGenericClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - THEN("Ret Method 1 should return a GenericClass$InnerClass") - { - const std::string func_name = ".ret_method1"; - const std::string func_descriptor = ":()LGenericClass$InnerClass;"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet("java::GenericClass$InnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == symbol_typet("java::GenericClass::T")); - } - } - THEN("Ret method 2 should return a GenericClass$GenericInnerClass") - { - const std::string func_name = ".ret_method2"; - const std::string func_descriptor = ":()LGenericClass$GenericInnerClass;"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet("java::GenericClass$GenericInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - THEN("Ret method 3 should return a GenericClass$GenericInnerClass") - { - const std::string func_name = ".ret_method3"; - const std::string func_descriptor = ":()LGenericClass$GenericInnerClass;"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet("java::GenericClass$GenericInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - THEN( - "Ret method 4 should return a " - "GenericClass$GenericInnerClass$DoublyNestedInnerClass") - { - const std::string func_name = ".ret_method4"; - const std::string func_descriptor = - ":()LGenericClass$GenericInnerClass$DoublyNestedInnerClass;"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$DoublyNestedInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - THEN( - "Ret method 5 should return a " - "GenericClass$GenericInnerClass$DoublyNestedInnerClass") - { - const std::string func_name = ".ret_method5"; - const std::string func_descriptor = - ":()LGenericClass$GenericInnerClass$DoublyNestedInnerClass;"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$DoublyNestedInnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } - THEN( - "Ret method 6 should return a " - "GenericClass$GenericInnerClass$DoublyNestedInnerGenericClass") - { - const std::string func_name = ".ret_method6"; - const std::string func_descriptor = - ":()LGenericClass$GenericInnerClass$DoublyNestedInnerGenericClass;"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$" - "DoublyNestedInnerGenericClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Foo"))); - } - } - } - THEN( - "Ret method 7 should return a " - "GenericClass$GenericInnerClass$DoublyNestedInnerGenericClass") - { - const std::string func_name = ".ret_method7"; - const std::string func_descriptor = - ":()LGenericClass$GenericInnerClass$DoublyNestedInnerGenericClass;"; - const std::string process_func_name = - class_prefix + func_name + func_descriptor; - - REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const symbolt &function_symbol = - new_symbol_table.lookup_ref(process_func_name); - - const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet( - "java::GenericClass$GenericInnerClass$" - "DoublyNestedInnerGenericClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet("java::GenericClass::T")); - } - } - } -} From 3e6cf3562671f3159c05fd1635a12e5b7ba12388 Mon Sep 17 00:00:00 2001 From: svorenova Date: Tue, 24 Oct 2017 15:24:17 +0100 Subject: [PATCH 07/22] Extending test for signature/descriptor mismatch --- .../SignatureDescriptorMismatch$Inner.class | Bin 752 -> 752 bytes ...ignatureDescriptorMismatch$InnerEnum.class | Bin 1024 -> 1024 bytes .../SignatureDescriptorMismatch.java | 2 ++ .../parse_signature_descriptor_mismatch.cpp | 18 ++++++++++++++++++ 4 files changed, 20 insertions(+) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch$Inner.class index b7dcb3d5421e08a75ad7be19ebded76754a05778..aa3e07c310153720f1a828bf249e19d4cc762f3f 100644 GIT binary patch delta 21 ccmeys`hj&rFB2yx11AF)10MtTp~h+S)ExQNQN`p0m*61?m+S$vl0MtYzImJ delta 31 icmZqRXyDkO#>~h&S)ExQNQN`p0m*61?m+S$vl0Ms{0Bk+ diff --git a/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch.java b/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch.java index 314d2645889..defe9600981 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/SignatureDescriptorMismatch.java @@ -1,5 +1,6 @@ public class SignatureDescriptorMismatch { + // this models ArrayList.Sublist. for which we were getting an error private class Inner { private final AbstractGeneric u; @@ -10,6 +11,7 @@ private class Inner } } + // this models another situation in which the error occurred private enum InnerEnum { diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp index 60560ec1446..1ca93cbe9fa 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp @@ -52,6 +52,15 @@ SCENARIO( const code_typet func_code= to_code_type(new_symbol_table.lookup_ref(process_func_name).type); REQUIRE(func_code.parameters().size()==3); + + // TODO: for now, the parameters are not generic because we fall back to + // descriptor due to mismatch; enable tests when fixed + // code_typet::parametert param_parent= + // require_type::require_parameter(func_code,"arg1a"); + // REQUIRE(is_java_generic_type(param_parent.type())); + // code_typet::parametert param_t= + // require_type::require_parameter(func_code,"t"); + // REQUIRE(is_java_generic_type(param_t.type())); } const std::string inner_enum_prefix=class_prefix+"$InnerEnum"; @@ -78,5 +87,14 @@ SCENARIO( const code_typet func_code= to_code_type(new_symbol_table.lookup_ref(process_func_name).type); REQUIRE(func_code.parameters().size()==3); + + // TODO: for now, the parameters are not generic because we fall back to + // descriptor due to mismatch; enable tests when fixed + // code_typet::parametert param_parent= + // require_type::require_parameter(func_code,"arg1a"); + // REQUIRE(is_java_generic_type(param_parent.type())); + // code_typet::parametert param_t= + // require_type::require_parameter(func_code,"arg2i"); + // REQUIRE(is_java_generic_type(param_t.type())); } } From 89b99ceae587ced6081cade42c8b7ea672ef482c Mon Sep 17 00:00:00 2001 From: svorenova Date: Tue, 24 Oct 2017 17:24:41 +0100 Subject: [PATCH 08/22] Extending test for generic functions --- .../GenericFunctions.class | Bin 1187 -> 4746 bytes .../GenericFunctions.java | 113 +- .../parse_generic_functions.cpp | 1228 ++++++++++++++++- 3 files changed, 1301 insertions(+), 40 deletions(-) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.class index ef35fd9b89f36c418b60fb9190b5dbcda27ecab2..15323c85953d2b8fc780371e602b2983f2bff107 100644 GIT binary patch literal 4746 zcmcJSdr#X|7{=cdE+HwjE9J5lx`wW!+y;ZOwIdC|< zuV+bmo}?Fy26L8ewepPm=H@Gm`U~|VlhKuuWt-31r-!CfHV$hT87TSf* zx5xu#F9d2@k?_npaAhH*wSc=C@}N*}youzFd)(c2t!2SQnb&a@?5xa`NN@{DZZp#I zx9{e!$lVL&Y(HWwm`BOal{txL^?JZ4KbDNX4R{F!6@y@ww5gEuVbx*BMETh=0+;6I zxdi1Of7WS8g)O1cDG@$9QnNSBA@6 zRH1?qivUdt&^cATaUo7qLIPAgWvp&Rqm^}xRs)V|Kv~lv>ZDgaue5aT8K-CnV}4Pq zU5NBL_aT&@V412N()v3cIuUsiqCDW5*`Y!Vaph4L_WN8nfr6R4FzQ_`pY59$!J_y82Q<77a)*avck$yj!<&`%_Tq zymV=5m4G|%(z7D9J4>*$him#b{koUdXI0tZ0I;);hF)tBq)vVL3fbR zCEO2-1-OpjDMgp*3RdyWoA~g}?#4cCJM*PZ~1Am?tJpQi7A5r{2s6QyN3W+sMVjv{JM|_DzNG!#0;U4(+ zHGVf2J_Ua{27eR$d<^~y_@Bk#7r@_&!CwV`Ee5{`{!R@3=isl?7ha03hQK-j89& WlNfgV0>ZEVgB?ZKwgWp8^z=WWOs3la literal 1187 zcmb7?OHaZ;5XWbE3L+?q;scd<06j=zJW=EzMq@(s0CFWuS#eF-HhmcVSe{Hg_yPP- z##tz}AWCS`?#}GY??0WL&#(6n062yHI0PXVh21FZ5r|Z{;C7Wjuz1)a5US~2Mj%z^ zg55a%4l|pyqoF5V*Hx;usL7@6Iz#pYx8&Is6U^l5r6W|E>%vk9tQn@RGRtc4zM(NU zfIy-+3Ra{Zc_t9^JOtLqWnPStRB{wlX*QKA@?#C&6V!H0EUr*#mg|r7iIy}fdZpXW zBU5dq>PZcAq+Z^w>dr8jd9FL6do65c-c$9b#5~f?BJVg6i z_Mp#%O=Wwg5)WMBh3;U3f9f0OD*tkQl2bJbe`t7xdi9@7^uR}M*L34$Dn8!O9aCkO zTnCsjTXz{!L#ej{j=a3#2gkKTa1;wAu5Hwf@x z0r!bv0K_1URty%=6Bs0)p)HdKi9ugt#Ft2536dC;!gq+0o@KOF@C`s3k*l+ji8+vK kh|J7JrsqJeBXVOlGCKz{i^$E{$lW=RTX-GYgRbs;1Cxd6{Qv*} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java index 323f14d4f0d..5140ed8705f 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/GenericFunctions.java @@ -1,31 +1,126 @@ public class GenericFunctions { - public static void processSimpleGeneric(Generic x) + + //Methods with generic inputs + public static void processSimple(Generic x) { } - // Test a wildcard generic bound by an interface - public static void processUpperBoundInterfaceGeneric(Generic x) + public static void processUpperBoundInterface(Generic x) { } - // Test a wild card generic bound by a class - public static void processUpperBoundClassGeneric(Generic x) + public static void processUpperBoundClass(Generic x) { } - // Test a wild card generic bound by a class and an interface - public static void processDoubleUpperBoundClassGeneric(Generic x) + public static void processDoubleUpperBoundClass(Generic x) { } - // Test a wild card generic bound by two interfaces - public static void processDoubleUpperBoundInterfaceGeneric(Generic x) + public static void processDoubleUpperBoundInterface(Generic x) { } + + public static void processMultipleSimple(Generic t, Generic u) + { + + } + + public static void processMultipleUpperBound(Generic t, Generic u) + { + + } + + //Methods with generic output + public static Generic returnSimple() + { + Generic x=new Generic(); + return x; + } + + public static T returnSimpleField() + { + Generic x=new Generic(); + return x.t; + } + + public static Generic returnUpperBoundInterface() + { + Generic x=new Generic(); + return x; + } + + public static Generic returnUpperBoundClass() + { + Generic x=new Generic(); + return x; + } + + public static Generic returnDoubleUpperBoundClass() + { + Generic x=new Generic(); + return x; + } + + public static Generic returnDoubleUpperBoundInterface() + { + Generic x=new Generic(); + return x; + } + + //Methods with generic input and output + public static Generic processReturnSimpleSame(Generic x) + { + return x; + } + + public static Generic processReturnUpperBoundInterfaceSame(Generic x) + { + return x; + } + + public static Generic processReturnUpperBoundClassSame(Generic x) + { + return x; + } + + public static Generic processReturnDoubleUpperBoundClassSame(Generic x) + { + return x; + } + + public static Generic processReturnDoubleUpperBoundInterfaceSame(Generic x) + { + return x; + } + + public static Generic processReturnSimpleDifferent(Generic u) + { + Generic t=new Generic(); + return t; + } + + public static Generic processReturnUpperBoundDifferent(Generic u) + { + Generic t=new Generic(); + return t; + } + + public static Generic processReturnMultipleSimpleDifferent(Generic u, Generic v) + { + Generic t=new Generic(); + return t; + } + + public static Generic processReturnMultipleUpperBoundDifferent(Generic u, Generic v) + { + Generic t=new Generic(); + return t; + } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp index d01e79b7eaf..547bf4f7395 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp @@ -17,59 +17,1225 @@ #include #include +#include SCENARIO( - "java_bytecode_parse_generic_function", + "java_bytecode_parse_generic_functions", "[core][java_bytecode][java_bytecode_parse_generics]") { - const symbol_tablet &new_symbol_table= - load_java_class( - "GenericFunctions", - "./java_bytecode/java_bytecode_parse_generics"); + const symbol_tablet &new_symbol_table = load_java_class( + "GenericFunctions", "./java_bytecode/java_bytecode_parse_generics"); - std::string class_prefix="java::GenericFunctions"; - THEN("There should be a symbol for processSimpleGeneric") + std::string class_prefix = "java::GenericFunctions"; + + WHEN("Parsing processSimple") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processSimple"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + } + } + + WHEN("Parsing processUpperBoundInterface") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processUpperBoundInterface"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 + } + } + } + } + } + + WHEN("Parsing processUpperBoundClass") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processUpperBoundClass"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend tests when fixed - + // issue TG-1286 + } + } + } + } + } + + WHEN("Parsing processDoubleUpperBoundClass") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processDoubleUpperBoundClass"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing processDoubleUpperBoundInterface") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processDoubleUpperBoundInterface"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing processMultipleSimple") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processMultipleSimple"; + const std::string func_descriptor = ":(LGeneric;LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It contains parameter t pointing to Generic") + { + code_typet::parametert param_t = + require_type::require_parameter(func_code, "t"); + require_type::require_pointer( + param_t.type(), symbol_typet("java::Generic")); + + THEN("t is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_t.type())); + + const java_generic_typet generic_t = + to_java_generic_type(param_t.type()); + const java_generic_parametert generic_param_t = + generic_t.generic_type_variables().front(); + REQUIRE( + generic_param_t.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + THEN("It contains parameter u pointing to Generic") + { + code_typet::parametert param_u = + require_type::require_parameter(func_code, "u"); + require_type::require_pointer( + param_u.type(), symbol_typet("java::Generic")); + + THEN("u is generic with type variable U") + { + REQUIRE(is_java_generic_type(param_u.type())); + + const java_generic_typet generic_u = + to_java_generic_type(param_u.type()); + const java_generic_parametert generic_param_u = + generic_u.generic_type_variables().front(); + REQUIRE( + generic_param_u.type_variable().get_identifier() == + class_prefix + "::U"); + } + } + } + } + + WHEN("Parsing processMultipleUpperBound") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processMultipleUpperBound"; + const std::string func_descriptor = ":(LGeneric;LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It contains parameter t pointing to Generic") + { + code_typet::parametert param_t = + require_type::require_parameter(func_code, "t"); + require_type::require_pointer( + param_t.type(), symbol_typet("java::Generic")); + + THEN("t is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_t.type())); + + const java_generic_typet generic_t = + to_java_generic_type(param_t.type()); + const java_generic_parametert generic_param_t = + generic_t.generic_type_variables().front(); + REQUIRE( + generic_param_t.type_variable().get_identifier() == + class_prefix + "::T"); + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend the tests when + // fixed - issue TG-1286 + } + } + } + THEN("It contains parameter u pointing to Generic") + { + code_typet::parametert param_u = + require_type::require_parameter(func_code, "u"); + require_type::require_pointer( + param_u.type(), symbol_typet("java::Generic")); + + THEN("u is generic with type variable U") + { + REQUIRE(is_java_generic_type(param_u.type())); + + const java_generic_typet generic_u = + to_java_generic_type(param_u.type()); + const java_generic_parametert generic_param_u = + generic_u.generic_type_variables().front(); + REQUIRE( + generic_param_u.type_variable().get_identifier() == + class_prefix + "::U"); + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing returnSimple") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".returnSimple"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + } + } + + WHEN("Parsing returnSimpleField") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".returnSimpleField"; + const std::string func_descriptor = ":()Ljava/lang/Object;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + // TODO: should point to something else than Object?? - possibly + // connecte dto bounds - issue TG-1286 + THEN("It has return type pointing to java.lang.Object") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::java.lang.Object")); + + THEN("It is the generic parameter T") + { + REQUIRE(is_java_generic_parameter(return_type)); + + const java_generic_parametert generic_return_param = + to_java_generic_parameter(return_type); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + } + } + + WHEN("Parsing returnUpperBoundInterface") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".returnUpperBoundInterface"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing returnUpperBoundClass") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".returnUpperBoundClass"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing returnDoubleUpperBoundClass") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".returnDoubleUpperBoundClass"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing returnDoubleUpperBoundInterface") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".returnDoubleUpperBoundInterface"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing processReturnSimpleSame") { - const std::string func_name=".processSimpleGeneric"; - const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnSimpleSame"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); - REQUIRE(new_symbol_table.has_symbol(process_func_name)); + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + } } - THEN("There should be a symbol for processUpperBoundInterfaceGeneric") + WHEN("Parsing processReturnUpperBoundInterfaceSame") { - const std::string func_name=".processUpperBoundInterfaceGeneric"; - const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnUpperBoundInterfaceSame"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); - REQUIRE(new_symbol_table.has_symbol(process_func_name)); + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } } - THEN("There should be a symbol for processUpperBoundClassGeneric") + WHEN("Parsing processReturnUpperBoundClassSame") { - const std::string func_name=".processUpperBoundClassGeneric"; - const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnUpperBoundClassSame"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); - REQUIRE(new_symbol_table.has_symbol(process_func_name)); + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } } - THEN("There should be a symbol for processDoubleUpperBoundClassGeneric") + WHEN("Parsing processReturnDoubleUpperBoundClassSame") { - const std::string func_name=".processDoubleUpperBoundClassGeneric"; - const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnDoubleUpperBoundClassSame"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); - REQUIRE(new_symbol_table.has_symbol(process_func_name)); + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend the tests when + // fixed - issue TG-1286 + } + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } } - THEN("There should be a symbol for processDoubleUpperBoundInterfaceGeneric") + WHEN("Parsing processReturnDoubleUpperBoundInterfaceSame") { - const std::string func_name=".processDoubleUpperBoundInterfaceGeneric"; - const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + THEN("There should be a symbol for the function") + { + const std::string func_name = + ".processReturnDoubleUpperBoundInterfaceSame"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + + THEN("It contains parameter x pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with type variable T") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + REQUIRE( + generic_param_x.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; extend the tests when + // fixed - issue TG-1286 + } + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing processReturnSimpleDifferent") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnSimpleDifferent"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It contains parameter u pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_u = + require_type::require_parameter(func_code, "u"); + require_type::require_pointer( + param_u.type(), symbol_typet("java::Generic")); + + THEN("u is generic with type variable U") + { + REQUIRE(is_java_generic_type(param_u.type())); + + const java_generic_typet generic_u = + to_java_generic_type(param_u.type()); + const java_generic_parametert generic_param_u = + generic_u.generic_type_variables().front(); + REQUIRE( + generic_param_u.type_variable().get_identifier() == + class_prefix + "::U"); + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + } + } + + WHEN("Parsing processReturnUpperBoundDifferent") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnUpperBoundDifferent"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It contains parameter u pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + code_typet::parametert param_u = + require_type::require_parameter(func_code, "u"); + require_type::require_pointer( + param_u.type(), symbol_typet("java::Generic")); + + THEN("u is generic with type variable U") + { + REQUIRE(is_java_generic_type(param_u.type())); + + const java_generic_typet generic_u = + to_java_generic_type(param_u.type()); + const java_generic_parametert generic_param_u = + generic_u.generic_type_variables().front(); + REQUIRE( + generic_param_u.type_variable().get_identifier() == + class_prefix + "::U"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } + } + + WHEN("Parsing processReturnMultipleSimpleDifferent") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnMultipleSimpleDifferent"; + const std::string func_descriptor = ":(LGeneric;LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It contains parameter u pointing to Generic") + { + code_typet::parametert param_u = + require_type::require_parameter(func_code, "u"); + require_type::require_pointer( + param_u.type(), symbol_typet("java::Generic")); + + THEN("u is generic with type variable U") + { + REQUIRE(is_java_generic_type(param_u.type())); + + const java_generic_typet generic_u = + to_java_generic_type(param_u.type()); + const java_generic_parametert generic_param_u = + generic_u.generic_type_variables().front(); + REQUIRE( + generic_param_u.type_variable().get_identifier() == + class_prefix + "::U"); + } + } + + THEN("It contains parameter v pointing to Generic") + { + code_typet::parametert param_v = + require_type::require_parameter(func_code, "v"); + require_type::require_pointer( + param_v.type(), symbol_typet("java::Generic")); + + THEN("v is generic with type variable V") + { + REQUIRE(is_java_generic_type(param_v.type())); + + const java_generic_typet generic_v = + to_java_generic_type(param_v.type()); + const java_generic_parametert generic_param_v = + generic_v.generic_type_variables().front(); + REQUIRE( + generic_param_v.type_variable().get_identifier() == + class_prefix + "::V"); + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + } + } + + WHEN("Parsing processReturnMultipleUpperBoundDifferent") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnMultipleUpperBoundDifferent"; + const std::string func_descriptor = ":(LGeneric;LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It contains parameter u pointing to Generic") + { + code_typet::parametert param_u = + require_type::require_parameter(func_code, "u"); + require_type::require_pointer( + param_u.type(), symbol_typet("java::Generic")); + + THEN("u is generic with type variable U") + { + REQUIRE(is_java_generic_type(param_u.type())); + + const java_generic_typet generic_u = + to_java_generic_type(param_u.type()); + const java_generic_parametert generic_param_u = + generic_u.generic_type_variables().front(); + REQUIRE( + generic_param_u.type_variable().get_identifier() == + class_prefix + "::U"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + + THEN("It contains parameter v pointing to Generic") + { + code_typet::parametert param_v = + require_type::require_parameter(func_code, "v"); + require_type::require_pointer( + param_v.type(), symbol_typet("java::Generic")); + + THEN("v is generic with type variable V") + { + REQUIRE(is_java_generic_type(param_v.type())); + + const java_generic_typet generic_v = + to_java_generic_type(param_v.type()); + const java_generic_parametert generic_param_v = + generic_v.generic_type_variables().front(); + REQUIRE( + generic_param_v.type_variable().get_identifier() == + class_prefix + "::V"); + + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + + THEN("It has return type pointing to Generic") + { + const code_typet func_code = to_code_type(func_symbol.type); + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with type variable T") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + REQUIRE( + generic_return_param.type_variable().get_identifier() == + class_prefix + "::T"); - REQUIRE(new_symbol_table.has_symbol(process_func_name)); + THEN("The bounds are set correctly") + { + // TODO: the bounds are not parsed yet; enable the tests when + // fixed - issue TG-1286 + } + } + } + } } } From 9db9947c5fff976821120bb57f024e741c892a1e Mon Sep 17 00:00:00 2001 From: svorenova Date: Wed, 25 Oct 2017 17:18:45 +0100 Subject: [PATCH 09/22] Extending test for generic class --- .../Generic.class | Bin 662 -> 715 bytes .../java_bytecode_parse_generics/Generic.java | 1 + .../GenericTwoParam.class | Bin 0 -> 497 bytes .../GenericTwoParam.java | 5 + .../parse_generic_class.cpp | 144 +++++++++++++++--- 5 files changed, 131 insertions(+), 19 deletions(-) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericTwoParam.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericTwoParam.java diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Generic.class b/unit/java_bytecode/java_bytecode_parse_generics/Generic.class index 38e44b1b33d9659b0064d08acd800900925c01df..5d5cca07ef3558c9dbf45ee3a9f3a339a304bc8d 100644 GIT binary patch delta 334 zcmY*UOKJi^6s&F;$DXKBGyal{qgzGYWTyyOiQpv$X$C`>g@}u6Ji{Qk$|bT2xbOhx z2;N0f?V#f3y?Rxz>s4>9Kg&Oyc6$JCXgRRp*=RVB@Dz)0qZ#|%o(KihbgU!2n9l|R zjSC)5KY~@z{|utAKZ%w))QiC=o{Zz~V=9OI=1X+e5&~)1tQnq>P(%(Mu5*?gz-=;* zMDOf^-D>|r{1Bv2U`?M%fg*7>SwM+4z|$S$a#ARxLR(|Eaiyn?L7qlnh79E#6Br}2 i1g=$?&uBJk=VZq6rm3su@^JEtI$tK}886f&UjG4sl^~@6 delta 298 zcmY*Uy9&ZU5S+UZ&%{Jyd_U7Gc6L^RVB-&@mLN73_To2$fUVzP6;RM#zrkM-=L{%v zusb`mJG=KV4`y(Gov#4K2yB?>D0FQ|bS#FRLO%{h@or{Yi+Qw(w(I32zC8^ah2$uP zdjWwQ6l0zi5_$-rO2#3YG7DyNkV2dY47iNB4=GS2cCrSP;IS(IF+M8`6;x@f?N-cs zLFob+rZAFFx{)?4(iprW&*ySP8`rZ|)X0OpBI9wHUh&hcujW(Be$n7$hMH(mmuSBM D4H_5* diff --git a/unit/java_bytecode/java_bytecode_parse_generics/Generic.java b/unit/java_bytecode/java_bytecode_parse_generics/Generic.java index a4905a01ae9..f852bc8f073 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/Generic.java +++ b/unit/java_bytecode/java_bytecode_parse_generics/Generic.java @@ -1,6 +1,7 @@ class Generic { public T t; + public Generic g; public static Generic makeGeneric(T value) { diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericTwoParam.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericTwoParam.class new file mode 100644 index 0000000000000000000000000000000000000000..77a3ef12346cb7148b10a7643c05caa744f658af GIT binary patch literal 497 zcmZut!A`-_`3DFzk{^iAxU*e6g!1JwAq;K)}&gJZK~CZml%yu}>4EoYn21!t`^j^9A93=C{> dY?dNno3Z_4KpP!q-4(@QR$G3xgI>vYzX5`NY>EH? literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericTwoParam.java b/unit/java_bytecode/java_bytecode_parse_generics/GenericTwoParam.java new file mode 100644 index 00000000000..c1deb233dd0 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/GenericTwoParam.java @@ -0,0 +1,5 @@ +class GenericTwoParam +{ + public T t; + public U u; +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp index d2c59edef85..71382448c82 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -19,43 +20,148 @@ #include SCENARIO( - "java_bytecode_parse_generic_class", + "java_bytecode_parse_generic_class_one_param", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class("Generic", "./java_bytecode/java_bytecode_parse_generics"); std::string class_prefix = "java::Generic"; - REQUIRE(new_symbol_table.has_symbol(class_prefix)); WHEN("Parsing the class") { - REQUIRE(new_symbol_table.has_symbol(class_prefix)); - THEN("The class symbol is generic") + THEN("There is a generic class symbol Generic") { + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); class_typet class_type = require_symbol::require_complete_class(class_symbol); - java_class_typet java_class_type = to_java_class_type(class_type); - - REQUIRE(is_java_generics_class_type(java_class_type)); java_generics_class_typet java_generics_class_type = - to_java_generics_class_type(java_class_type); + require_type::require_java_generic_class(class_type); - THEN("The type variable is T") + THEN("It has type variable T") { - REQUIRE(java_generics_class_type.generic_types().size()==1); - typet &type_var=java_generics_class_type.generic_types().front(); - REQUIRE(is_java_generic_parameter(type_var)); - java_generic_parametert generic_type_var= - to_java_generic_parameter(type_var); + REQUIRE(java_generics_class_type.generic_types().size() == 1); + const auto &generic_types = java_generics_class_type.generic_types(); + REQUIRE( - generic_type_var.type_variable().get_identifier() == + generic_types[0].type_variable().get_identifier() == class_prefix + "::T"); - typet &sub_type = generic_type_var.subtype(); - REQUIRE(sub_type.id() == ID_symbol); - symbol_typet &bound_type = to_symbol_type(sub_type); - REQUIRE(bound_type.get_identifier() == "java::java.lang.Object"); + } + + const struct_typet class_struct = to_struct_type(class_symbol.type); + THEN("It has field t") + { + struct_union_typet::componentt field_t = + require_type::require_component(class_struct, "t"); + + THEN("It is the generic parameter T") + { + REQUIRE(is_java_generic_parameter(field_t.type())); + + const java_generic_parametert field_t_param = + to_java_generic_parameter(field_t.type()); + REQUIRE( + field_t_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + + THEN("It has field g pointing to Generic") + { + struct_union_typet::componentt field_g = + require_type::require_component(class_struct, "g"); + require_type::require_pointer( + field_g.type(), symbol_typet("java::Generic")); + + THEN("It is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(field_g.type())); + + const java_generic_typet generic_field_g = + to_java_generic_type(field_g.type()); + const java_generic_parametert generic_param_field_g = + generic_field_g.generic_type_variables().front(); + require_type::require_pointer( + generic_param_field_g, symbol_typet("java::java.lang.Integer")); + } + } + } + } +} + +SCENARIO( + "java_bytecode_parse_generic_class_two_param", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "GenericTwoParam", "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::GenericTwoParam"; + + WHEN("Parsing the class") + { + THEN("There is a generic class symbol GenericTwoParam") + { + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + class_typet class_type = + require_symbol::require_complete_class(class_symbol); + java_generics_class_typet java_generics_class_type = + require_type::require_java_generic_class(class_type); + + THEN("It has type variables T and U") + { + REQUIRE(java_generics_class_type.generic_types().size() == 2); + const auto &generic_types = java_generics_class_type.generic_types(); + { + const java_generic_parametert &generic_param = generic_types[0]; + REQUIRE( + generic_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + { + const java_generic_parametert &generic_param = generic_types[1]; + REQUIRE( + generic_param.type_variable().get_identifier() == + class_prefix + "::U"); + } + } + + const struct_typet class_struct = to_struct_type(class_symbol.type); + THEN("It has field t") + { + struct_union_typet::componentt field_t = + require_type::require_component(class_struct, "t"); + + THEN("It is the generic parameter T") + { + REQUIRE(is_java_generic_parameter(field_t.type())); + + const java_generic_parametert field_t_param = + to_java_generic_parameter(field_t.type()); + REQUIRE( + field_t_param.type_variable().get_identifier() == + class_prefix + "::T"); + } + } + THEN("It has field u") + { + struct_union_typet::componentt field_u = + require_type::require_component(class_struct, "u"); + + THEN("It is the generic parameter U") + { + REQUIRE(is_java_generic_parameter(field_u.type())); + + const java_generic_parametert field_u_param = + to_java_generic_parameter(field_u.type()); + REQUIRE( + field_u_param.type_variable().get_identifier() == + class_prefix + "::U"); + } } } } From c9a371618d0d6f95e1a4c7fe9eb4d8df325c099c Mon Sep 17 00:00:00 2001 From: svorenova Date: Thu, 26 Oct 2017 16:04:48 +0100 Subject: [PATCH 10/22] Adding unit test for functions with generics --- .../FunctionsWithGenerics$Inner.class | Bin 0 -> 540 bytes .../FunctionsWithGenerics.class | Bin 0 -> 1715 bytes .../FunctionsWithGenerics.java | 36 ++ .../parse_functions_with_generics.cpp | 339 ++++++++++++++++++ 4 files changed, 375 insertions(+) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/FunctionsWithGenerics$Inner.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/FunctionsWithGenerics.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/FunctionsWithGenerics.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp diff --git a/unit/java_bytecode/java_bytecode_parse_generics/FunctionsWithGenerics$Inner.class b/unit/java_bytecode/java_bytecode_parse_generics/FunctionsWithGenerics$Inner.class new file mode 100644 index 0000000000000000000000000000000000000000..e2e3053da11ba24c61fc4e4642edd5977ed0fc2a GIT binary patch literal 540 zcmZ`$O;5r=5Pe%Jl~SdmfPxqg91s)n;0?ls1Vhs30fXnIZeU5>CjBt}Ef2=TgFnC@ zWt^=TFZHl9^IqP*nc4mPdj9}$g?0%A)NPn(SU9rKWMIz>CGT1&5lMeQ^-L}mPtr&* zoc!`bZ_S^0Kj3QFpQ=PGMKl>4d!zq1) zNq=I1_CS%Mm7#6d)orO}bjolj?@%=&r9s*5oxg(h-e9~CGO$Zg-v+r=DAs>eaIsH_ V^qCtY_JELq8mbvf95mI<9hE%n7#E{;#k2%9+TS)$Tc;4mCTeEA?%1qntnbwi% z2o;BmY421}kNNiAQ1(1wOZT1dPG4~%5IYRb*CC|0&G2mMAg)#Djq2-Bz#e*?c;@-_j#rQlg7(T`r zy}hVVpS@PzidJ57MqLK&>w00^7B{6oqz_t=@sM;HN9EUQoO1lF=WqHw!L4J4YE{2q zH+<085Hlh;G?o8WFwl$E9)YVZ^@C<8bnKzi<9k9KwMA{KZME4;D4@uY4G&NWw=l~v zr!8QZ8l8_f-80^!UAv@(1~RdZ41Gb=ZvvzVMfxvM)Sx?~duH>E88xDkRtiJSCX z3ILeI6h(PVV}?+wxD^%~n_nqPB`S-FN<%rJ{2X0DFSSypXr3+ux2fks-18Hy7_?sa z3FG}GQtho#Z}ss5smPHArK}tvvFP{DQKXn?Xk)o0ih^93aslTuaaOQG70SmUt*g%e z`Y0!OA|Fcg>J^^IQIH$)tP#(8%;QjHig+S#2lcDomPqNc&$$*LLvK`rJ3eRR((ql5 zP|9V1x=U^%zeebHgVyfhe(3jE=r^ x; + } + + public static Generic processReturnSame(Generic x) + { + return x; + } + + public static Generic processReturnDifferent(Generic s) + { + Generic x = new Generic(); + return x; + } + + public static Generic processReturnMultipleSame(Generic x, Generic y) + { + return x; + } + + public static Generic processReturnMultipleDifferent(Generic s, Generic b) + { + Generic x = new Generic(); + return x; + } + + public Generic returnInnerField(Inner inner) + { + return inner.x; + } + +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp new file mode 100644 index 00000000000..15326342597 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp @@ -0,0 +1,339 @@ +/*******************************************************************\ + + Module: Unit tests for parsing generic classes + + Author: DiffBlue Limited. All rights reserved. + +\*******************************************************************/ + +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include + +SCENARIO( + "java_bytecode_parse_functions_with_generics", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "FunctionsWithGenerics", "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::FunctionsWithGenerics"; + + WHEN("Parsing processReturnSame") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnSame"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It has parameter x pointing to Generic") + { + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + require_type::require_pointer( + generic_param_x, symbol_typet("java::java.lang.Integer")); + } + } + + THEN("It has return type pointing to Generic") + { + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + require_type::require_pointer( + generic_return_param, symbol_typet("java::java.lang.Integer")); + } + } + } + } + + WHEN("Parsing processReturnDifferent") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnDifferent"; + const std::string func_descriptor = ":(LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It has parameter s pointing to Generic") + { + code_typet::parametert param_s = + require_type::require_parameter(func_code, "s"); + require_type::require_pointer( + param_s.type(), symbol_typet("java::Generic")); + + THEN("s is generic with parameter pointing to java.lang.String") + { + REQUIRE(is_java_generic_type(param_s.type())); + + const java_generic_typet generic_s = + to_java_generic_type(param_s.type()); + const java_generic_parametert generic_param_s = + generic_s.generic_type_variables().front(); + require_type::require_pointer( + generic_param_s, symbol_typet("java::java.lang.String")); + } + } + + THEN("It has return type pointing to Generic") + { + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + require_type::require_pointer( + generic_return_param, symbol_typet("java::java.lang.Integer")); + } + } + } + } + + WHEN("Parsing processReturnMultipleSame") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnMultipleSame"; + const std::string func_descriptor = ":(LGeneric;LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It has parameter x pointing to Generic") + { + code_typet::parametert param_x = + require_type::require_parameter(func_code, "x"); + require_type::require_pointer( + param_x.type(), symbol_typet("java::Generic")); + + THEN("x is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(param_x.type())); + + const java_generic_typet generic_x = + to_java_generic_type(param_x.type()); + const java_generic_parametert generic_param_x = + generic_x.generic_type_variables().front(); + require_type::require_pointer( + generic_param_x, symbol_typet("java::java.lang.Integer")); + } + } + + THEN("It has parameter y pointing to Generic") + { + code_typet::parametert param_y = + require_type::require_parameter(func_code, "y"); + require_type::require_pointer( + param_y.type(), symbol_typet("java::Generic")); + + THEN("y is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(param_y.type())); + + const java_generic_typet generic_y = + to_java_generic_type(param_y.type()); + const java_generic_parametert generic_param_y = + generic_y.generic_type_variables().front(); + require_type::require_pointer( + generic_param_y, symbol_typet("java::java.lang.Integer")); + } + } + + THEN("It has return type pointing to Generic") + { + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + require_type::require_pointer( + generic_return_param, symbol_typet("java::java.lang.Integer")); + } + } + } + } + + WHEN("Parsing processReturnMultipleDifferent") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".processReturnMultipleDifferent"; + const std::string func_descriptor = ":(LGeneric;LGeneric;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It has parameter s pointing to Generic") + { + code_typet::parametert param_s = + require_type::require_parameter(func_code, "s"); + require_type::require_pointer( + param_s.type(), symbol_typet("java::Generic")); + + THEN("s is generic with parameter pointing to java.lang.String") + { + REQUIRE(is_java_generic_type(param_s.type())); + + const java_generic_typet generic_s = + to_java_generic_type(param_s.type()); + const java_generic_parametert generic_param_s = + generic_s.generic_type_variables().front(); + require_type::require_pointer( + generic_param_s, symbol_typet("java::java.lang.String")); + } + } + + THEN("It has parameter b pointing to Generic") + { + code_typet::parametert param_b = + require_type::require_parameter(func_code, "b"); + require_type::require_pointer( + param_b.type(), symbol_typet("java::Generic")); + + THEN("b is generic with parameter pointing to java.lang.Boolean") + { + REQUIRE(is_java_generic_type(param_b.type())); + + const java_generic_typet generic_b = + to_java_generic_type(param_b.type()); + const java_generic_parametert generic_param_b = + generic_b.generic_type_variables().front(); + require_type::require_pointer( + generic_param_b, symbol_typet("java::java.lang.Boolean")); + } + } + + THEN("It has return type pointing to Generic") + { + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + require_type::require_pointer( + generic_return_param, symbol_typet("java::java.lang.Integer")); + } + } + } + } + + WHEN("Parsing returnInnerField") + { + THEN("There should be a symbol for the function") + { + const std::string func_name = ".returnInnerField"; + const std::string func_descriptor = + ":(LFunctionsWithGenerics$Inner;)LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + + const symbolt func_symbol = + new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); + + THEN("It has parameter inner pointing to Inner") + { + code_typet::parametert param_inner = + require_type::require_parameter(func_code, "inner"); + require_type::require_pointer( + param_inner.type(), symbol_typet(class_prefix + "$Inner")); + } + + THEN("It has return type pointing to Generic") + { + const typet return_type = func_code.return_type(); + require_type::require_pointer( + return_type, symbol_typet("java::Generic")); + + THEN("It is generic with parameter pointing to java.lang.Integer") + { + REQUIRE(is_java_generic_type(return_type)); + + const java_generic_typet generic_return_type = + to_java_generic_type(return_type); + const java_generic_parametert generic_return_param = + generic_return_type.generic_type_variables().front(); + require_type::require_pointer( + generic_return_param, symbol_typet("java::java.lang.Integer")); + } + } + } + } +} From de97e23f94f61ada44b52646ab8a6e4901b5397e Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 27 Oct 2017 15:07:07 +0100 Subject: [PATCH 11/22] Adding unit test for nested generics --- .../NestedGenerics.class | Bin 0 -> 6184 bytes .../NestedGenerics.java | 152 ++ .../parse_nested_generics.cpp | 1358 +++++++++++++++++ 3 files changed, 1510 insertions(+) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/NestedGenerics.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/NestedGenerics.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp diff --git a/unit/java_bytecode/java_bytecode_parse_generics/NestedGenerics.class b/unit/java_bytecode/java_bytecode_parse_generics/NestedGenerics.class new file mode 100644 index 0000000000000000000000000000000000000000..8b73e5e887c47022bdd0406f1bac5aaf11aeaec7 GIT binary patch literal 6184 zcmbuCT~icC6oyYPA1fby%h zlbhV+CjTQ|r79Qs0r^p>yuGvC)5CQ4%wSQw%;}l)obI+wdv{T(5e&HOD_{xQxcdcrmtx9Zk> z$M@>BLJ2>NI-AHzMk8TL3tlY0bbfTk_MO`97^m#IjY!fIqk<+$W?L(VwWk?P+c5e` zg!#7^t;F)zUezBt4X0Wx8)sp@qbf7QXz@gJ{j`PPvy2{Cu<_)Cy|~S&U+~1*vAfTX zkELr2k!4X&)#whRb&(>9XDt+8aZn-O?9YjDM$48Gx@_^dxs6-w31y2l)7P?%UB&yd z#l@kr$s*5*u0W|^Yfo7MNAL%+&e+t$0po17T_u2K;W~?6&GSo)+J;Bg8MWW9Z^M21 z%3jS~I;w8DjWuU$A0y|=^@_8FKVZaBU#2IOtz&cN5!SKSRlU2}9UqQnU=WXaXK-;~6UJrm(i2Vfms3$D0fzMNQ)rf@`wpP+X z!X@eMaz)h=a5be5grtgiI*85IqIeumyH@g`>FU^>Em{dj`Ou3or&JU+h4fk<*k=)#m93w{HsfJ8lQIRAiNIZDo1&I zpHkv3#NA5VgSc0TdHxwC?n8W5iTe?sQ{n-{=jkn3ZxHd@N_+wFMJ2w3_#Gv_jQCw8 z9zy({5?{g7jH`g}tGG9Y-weMyuKh*qH7;`WA-+4CgN#1Hb#L$heN3MqA{wR@Zk*b(-J-j_*63dMh1AFgiiy0D;YkS0p2g+Gl0(~!)G(V2PFJ9;CJZLq*g2% z;rx(ATX9gr3xF4s;rBAYFG%=Zz)Q*SxeV}268;(BpC`i?Gr%uP_&vbCNQN(GfDcLd zeZU_i!`CvvuSocpfX~6O0^=IRICs4q`;&hw&b85`2kw+>IalCLU*XAx6oltS!q*@y zrXW;|gfa*ZQxNuyge4G`QxK{~!XpqKryw+pgcT50QxIMm32Pucq4mVw{MktO285?6 y2)`H!8z6j}g7B-6@Er)>ry%@hBs>G*c?!bsM#3ftFH#WxFcKV`q%BZ#RQVsi5^~7^ literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/NestedGenerics.java b/unit/java_bytecode/java_bytecode_parse_generics/NestedGenerics.java new file mode 100644 index 00000000000..a4c1a469911 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/NestedGenerics.java @@ -0,0 +1,152 @@ +public class NestedGenerics +{ + Generic> field; + Generic> field2; + + Generic>> field3; + Generic>> field4; + + Generic> field5; + Generic> field6; + Generic> field7; + + GenericTwoParam, Generic> field8; + GenericTwoParam, Generic> field9; + GenericTwoParam, Generic> field10; + + GenericTwoParam, Interface_Implementation> field11; + GenericTwoParam>, Interface_Implementation> field12; + + GenericTwoParam, Generic> field13; + + void method(Generic> input) + { + + } + + void method2(Generic> input) + { + + } + + void method3(Generic>> input) + { + + } + + void method4(Generic>> input) + { + + } + + void method5(Generic> input) + { + + } + + void method6(Generic> input) + { + + } + + void method7(Generic> input) + { + + } + + void method8(GenericTwoParam, Generic> input) + { + + } + + void method9(GenericTwoParam, Generic> input) + { + + } + + void method10(GenericTwoParam, Generic> input) + { + + } + + void method11(GenericTwoParam, Interface_Implementation> input) + { + + } + void method12(GenericTwoParam>, Interface_Implementation> input) + { + + } + + void method13(GenericTwoParam, Generic> input) + { + + } + + + Generic> ret_method() + { + return null; + } + + Generic> ret_method2() + { + return null; + } + + Generic>> ret_method3() + { + return null; + } + + Generic>> ret_method4() + { + return null; + } + + Generic> ret_method5() + { + return null; + } + + Generic> ret_method6() + { + return null; + } + + Generic> ret_method7() + { + return null; + } + + GenericTwoParam, Generic> ret_method8() + { + return null; + } + + GenericTwoParam, Generic> ret_method9() + { + return null; + } + + GenericTwoParam, Generic> ret_method10() + { + return null; + } + + GenericTwoParam, Interface_Implementation> ret_method11() + { + return null; + } + + GenericTwoParam>, Interface_Implementation> ret_method12() + { + return null; + } + + GenericTwoParam, Generic> ret_method13() + { + return null; + } + +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp new file mode 100644 index 00000000000..58aeb250667 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp @@ -0,0 +1,1358 @@ +/*******************************************************************\ + + Module: Unit tests for parsing generic classes + + Author: DiffBlue Limited. All rights reserved. + +\*******************************************************************/ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +SCENARIO( + "parse_nested_generics_fields", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "NestedGenerics", "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::NestedGenerics"; + THEN("There should be a symbol for NestedGenerics with correct components") + { + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + + const class_typet &class_type = + require_symbol::require_complete_class(class_symbol); + + THEN("The field component should be a pointer to java::Generic") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field2 component should be a pointer to java::Generic") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field2"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field3 component should be a pointer to java::Generic") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field3"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field4 component should be a pointer to java::Generic") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field4"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field5 component should be a pointer to java::Generic") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field5"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::GenericTwoParam"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field6 component should be a pointer to java::Generic") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field6"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::GenericTwoParam"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field7 component should be a pointer to java::Generic") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field7"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::GenericTwoParam"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field8 component should be a pointer to java::GenericTwoParam") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field8"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field9 component should be a pointer to java::GenericTwoParam") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field9"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field10 component should be a pointer to java::GenericTwoParam") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field10"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field11 component should be a pointer to java::GenericTwoParam") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field11"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field12 component should be a pointer to java::GenericTwoParam") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field12"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("The field13 component should be a pointer to java::GenericTwoParam") + { + const struct_typet::componentt &field_component = + require_type::require_component(class_type, "field13"); + + require_type::require_pointer( + field_component.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(field_component.type())); + const auto &generic_variables = + to_java_generic_type(field_component.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::GenericTwoParam"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE(is_java_generic_parameter(generic_param)); + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + } +} + +SCENARIO( + "parse_nested_generics_methods", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "NestedGenerics", "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::NestedGenerics"; + + THEN("Method 1 should take a pointer to java::Generic") + { + const std::string func_name = ".method"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 2 should take a pointer to java::Generic") + { + const std::string func_name = ".method2"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 3 should take a pointer to java::Generic") + { + const std::string func_name = ".method3"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 4 should take a pointer to java::Generic") + { + const std::string func_name = ".method4"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 5 should take a pointer to java::Generic") + { + const std::string func_name = ".method5"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 6 should take a pointer to java::Generic") + { + const std::string func_name = ".method6"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 7 should take a pointer to java::Generic") + { + const std::string func_name = ".method7"; + const std::string func_descriptor = ":(LGeneric;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 8 should take a pointer to java::GenericTwoParam") + { + const std::string func_name = ".method8"; + const std::string func_descriptor = ":(LGenericTwoParam;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 9 should take a pointer to java::GenericTwoParam") + { + const std::string func_name = ".method9"; + const std::string func_descriptor = ":(LGenericTwoParam;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 10 should take a pointer to java::GenericTwoParam") + { + const std::string func_name = ".method10"; + const std::string func_descriptor = ":(LGenericTwoParam;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 11 should take a pointer to java::GenericTwoParam") + { + const std::string func_name = ".method11"; + const std::string func_descriptor = ":(LGenericTwoParam;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 12 should take a pointer to java::GenericTwoParam") + { + const std::string func_name = ".method12"; + const std::string func_descriptor = ":(LGenericTwoParam;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Method 13 should take a pointer to java::GenericTwoParam") + { + const std::string func_name = ".method13"; + const std::string func_descriptor = ":(LGenericTwoParam;)V"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + const auto param_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(param_type.type())); + const auto &generic_variables = + to_java_generic_type(param_type.type()).generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 1 should return a java::Generic") + { + const std::string func_name = ".ret_method"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 2 should return a java::Generic") + { + const std::string func_name = ".ret_method2"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 3 should return a java::Generic") + { + const std::string func_name = ".ret_method3"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 4 should return a java::Generic") + { + const std::string func_name = ".ret_method4"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 5 should return a java::Generic") + { + const std::string func_name = ".ret_method5"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 6 should return a java::Generic") + { + const std::string func_name = ".ret_method6"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 7 should return a java::Generic") + { + const std::string func_name = ".ret_method7"; + const std::string func_descriptor = ":()LGeneric;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 1); + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 8 should return a java::GenericTwoParam") + { + const std::string func_name = ".ret_method8"; + const std::string func_descriptor = ":()LGenericTwoParam;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 9 should return a java::GenericTwoParam") + { + const std::string func_name = ".ret_method9"; + const std::string func_descriptor = ":()LGenericTwoParam;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 10 should return a java::GenericTwoParam") + { + const std::string func_name = ".ret_method10"; + const std::string func_descriptor = ":()LGenericTwoParam;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 11 should return a java::GenericTwoParam") + { + const std::string func_name = ".ret_method11"; + const std::string func_descriptor = ":()LGenericTwoParam;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 12 should return a java::GenericTwoParam") + { + const std::string func_name = ".ret_method12"; + const std::string func_descriptor = ":()LGenericTwoParam;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == java_generic_inst_parametert( + symbol_typet("java::Interface_Implementation"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } + + THEN("Ret Method 13 should return a java::GenericTwoParam") + { + const std::string func_name = ".ret_method13"; + const std::string func_descriptor = ":()LGenericTwoParam;"; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; + + REQUIRE(new_symbol_table.has_symbol(process_func_name)); + const symbolt &function_symbol = + new_symbol_table.lookup_ref(process_func_name); + + const code_typet &function_call = + require_type::require_code(function_symbol.type); + + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") + { + REQUIRE(is_java_generic_type(function_call.return_type())); + const auto &generic_variables = + to_java_generic_type(function_call.return_type()) + .generic_type_variables(); + REQUIRE(generic_variables.size() == 2); + { + const java_generic_parametert &generic_param = generic_variables[0]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); + } + { + const java_generic_parametert &generic_param = generic_variables[1]; + REQUIRE( + generic_param == + java_generic_inst_parametert(symbol_typet("java::Generic"))); + } + // TODO: extend tests when nested generics are parsed correctly + } + } +} From 2883bb14d4dc19a5499308f8de08a38ae8775293 Mon Sep 17 00:00:00 2001 From: svorenova Date: Tue, 31 Oct 2017 14:45:45 +0000 Subject: [PATCH 12/22] Extending test for generic arrays --- .../GenericArray.class | Bin 438 -> 545 bytes .../GenericArray.java | 2 + .../parse_generic_array_class.cpp | 123 ++++++++++++++---- 3 files changed, 103 insertions(+), 22 deletions(-) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericArray.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericArray.class index e46b7d90e4081f3cdba0c89dc0a2a052c03798bb..a54e0e2fd5a7d64b1a9ad5f2d73336bfe6aa6743 100644 GIT binary patch delta 245 zcmdnSypToo)W2Q(7#J8#7-YB@m>DG58Kl@5q$i5%doYz4F*0yP`?#m(r50r-TQf57 z!#Oq~A=Y+45vCGjMh1C=uuoQES)zVUVqUtwXI@EadTNoi-9*RB%)AVIlf@aeZJ8Mu z8CV!tfg~HyP9_F+Aj!eN3FmVG`P@i+9-s^Z15h`R=ARtTDCQ^tERa8ARC`#3qXBPwc { public T [] t; + Generic[] t2; + Generic[] t3; } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp index 70fe6085448..236b4de152f 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp @@ -15,9 +15,8 @@ #include #include - -#include -#include +#include +#include SCENARIO( "java_bytecode_parse_generic_array_class", @@ -27,34 +26,114 @@ SCENARIO( "GenericArray", "./java_bytecode/java_bytecode_parse_generics"); std::string class_prefix = "java::GenericArray"; - REQUIRE(new_symbol_table.has_symbol(class_prefix)); - const struct_typet &type = - to_struct_type(new_symbol_table.lookup_ref(class_prefix).type); + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + const class_typet &class_type = + require_symbol::require_complete_class(class_symbol); - THEN("There should be a component with name t") + THEN("There should be field t") { - REQUIRE(type.has_component("t")); + struct_union_typet::componentt field_t = + require_type::require_component(class_type, "t"); + + THEN("It is an array") + { + pointer_typet field_t_pointer = + require_type::require_pointer( + field_t.type(), + symbol_typet("java::array[reference]")); + + const symbol_typet &field_t_subtype = + to_symbol_type(field_t_pointer.subtype()); + const struct_typet &subtype_type = to_struct_type( + new_symbol_table.lookup_ref(field_t_subtype.get_identifier()).type); + REQUIRE(is_valid_java_array(subtype_type)); + + THEN("The elements have the parametric type T") + { + const typet &element = field_t_subtype.find_type(ID_C_element_type); + REQUIRE(is_java_generic_parameter(element)); + java_generic_parametert element_parameter = + to_java_generic_parameter(element); + REQUIRE(element_parameter.type_variable().get_identifier() == + class_prefix + "::T"); + } + } } - const pointer_typet &t_component = - to_pointer_type(type.get_component("t").type()); - const symbol_typet &subtype = to_symbol_type(t_component.subtype()); - THEN("The t component is a valid java array") + THEN("There should be field t2") { - const struct_typet &subtype_type = to_struct_type( - new_symbol_table.lookup_ref(subtype.get_identifier()).type); - REQUIRE(is_valid_java_array(subtype_type)); + struct_union_typet::componentt field_t2 = + require_type::require_component(class_type, "t2"); + + THEN("It is an array") + { + pointer_typet field_t2_pointer = + require_type::require_pointer( + field_t2.type(), + symbol_typet("java::array[reference]")); + + const symbol_typet &field_t2_subtype = + to_symbol_type(field_t2_pointer.subtype()); + const struct_typet &subtype_struct = to_struct_type( + new_symbol_table.lookup_ref(field_t2_subtype.get_identifier()).type); + REQUIRE(is_valid_java_array(subtype_struct)); + + THEN("The elements have type Generic") + { + const typet &element = field_t2_subtype.find_type(ID_C_element_type); + REQUIRE(is_java_generic_type(element)); + const java_generic_typet generic_element = + to_java_generic_type(element); + require_type::require_pointer( + generic_element, symbol_typet + ("java::Generic")); + + REQUIRE(is_java_generic_parameter( + generic_element.generic_type_variables().front())); + java_generic_parametert parameter = + generic_element.generic_type_variables().front(); + REQUIRE(parameter.type_variable().get_identifier() == + class_prefix + "::T"); + } + } } - THEN("The elements of the t component have the parametric type T") + THEN("There should be field t3") { - const typet &element = - static_cast(subtype.find(ID_C_element_type)); - REQUIRE(is_java_generic_parameter(element)); - REQUIRE( - to_java_generic_parameter(element).type_variable().get_identifier() == - "java::GenericArray::T"); + struct_union_typet::componentt field_t3 = + require_type::require_component(class_type, "t3"); + + THEN("It is an array") + { + pointer_typet field_t3_pointer = + require_type::require_pointer( + field_t3.type(), + symbol_typet("java::array[reference]")); + + const symbol_typet &field_t3_subtype = + to_symbol_type(field_t3_pointer.subtype()); + const struct_typet &subtype_struct = to_struct_type( + new_symbol_table.lookup_ref(field_t3_subtype.get_identifier()).type); + REQUIRE(is_valid_java_array(subtype_struct)); + + THEN("The elements have type Generic") + { + const typet &element = field_t3_subtype.find_type(ID_C_element_type); + REQUIRE(is_java_generic_type(element)); + const java_generic_typet generic_element = + to_java_generic_type(element); + require_type::require_pointer( + generic_element, symbol_typet("java::Generic")); + + REQUIRE(is_java_generic_inst_parameter( + generic_element.generic_type_variables().front())); + java_generic_parametert parameter = + generic_element.generic_type_variables().front(); + require_type::require_pointer( + parameter, symbol_typet("java::java.lang.Integer")); + } + } } } From d9d9ea1ac033a2b66ae738b87d90e8c3daae6074 Mon Sep 17 00:00:00 2001 From: svorenova Date: Tue, 31 Oct 2017 15:49:54 +0000 Subject: [PATCH 13/22] Cleaning includes, unifying scenario names, adding JIRA references --- .../parse_bounded_generic_inner_classes.cpp | 4 +- .../parse_derived_generic_class.cpp | 11 +- .../parse_functions_with_generics.cpp | 10 +- .../parse_generic_array_class.cpp | 12 +- .../parse_generic_class.cpp | 6 +- ...neric_class_with_generic_inner_classes.cpp | 3 - .../parse_generic_functions.cpp | 3 +- .../parse_generic_wildcard_function.cpp | 8 +- .../parse_nested_generics.cpp | 121 ++++++++++++------ .../parse_recursive_generic_class.cpp | 10 +- .../parse_signature_descriptor_mismatch.cpp | 11 +- 11 files changed, 105 insertions(+), 94 deletions(-) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp index 48441425d69..1a5c792faa1 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp @@ -11,16 +11,14 @@ #include #include -#include #include #include #include -#include #include SCENARIO( - "java_bytecode_parse_bounded_generic_inner_classes", + "parse_bounded_generic_inner_classes", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp index 0884ef9cb88..d1ef530fb31 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp @@ -7,20 +7,17 @@ \*******************************************************************/ #include +#include +#include -#include #include #include #include -#include #include -#include -#include -#include SCENARIO( - "java_bytecode_parse_derived_generic_class", + "parse_derived_generic_class", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( @@ -36,6 +33,6 @@ SCENARIO( require_symbol::require_complete_class(derived_symbol); // TODO(tkiley): Currently we do not support extracting information - // about the base classes generic information. + // about the base classes generic information - issue TG-1287 } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp index 15326342597..e956ce06280 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp @@ -7,20 +7,16 @@ \*******************************************************************/ #include +#include +#include #include -#include #include -#include #include -#include -#include -#include - SCENARIO( - "java_bytecode_parse_functions_with_generics", + "parse_functions_with_generics", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp index 236b4de152f..3f925a2ab9e 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp @@ -7,19 +7,17 @@ \*******************************************************************/ #include +#include +#include +#include + #include -#include #include -#include - #include -#include -#include -#include SCENARIO( - "java_bytecode_parse_generic_array_class", + "parse_generic_array_class", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp index 71382448c82..e022ba12ec3 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp @@ -11,16 +11,14 @@ #include #include -#include #include #include #include -#include #include SCENARIO( - "java_bytecode_parse_generic_class_one_param", + "parse_generic_class_one_param", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = @@ -92,7 +90,7 @@ SCENARIO( } SCENARIO( - "java_bytecode_parse_generic_class_two_param", + "parse_generic_class_two_param", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp index b7b1b1e54eb..6c66ff1f5a8 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp @@ -10,11 +10,8 @@ #include #include -#include #include #include -#include -#include #include diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp index 547bf4f7395..04c2dcb2eae 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp @@ -15,12 +15,11 @@ #include -#include #include #include SCENARIO( - "java_bytecode_parse_generic_functions", + "parse_generic_functions", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp index b1e925665d5..b4a43566db3 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp @@ -7,19 +7,15 @@ \*******************************************************************/ #include +#include #include -#include #include -#include #include -#include -#include - SCENARIO( - "java_bytecode_parse_generic_wildcard", + "parse_generic_wildcard", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table= diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp index 58aeb250667..820b5d6f412 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp @@ -7,6 +7,7 @@ \*******************************************************************/ #include +#include #include #include @@ -18,9 +19,6 @@ #include -#include -#include - SCENARIO( "parse_nested_generics_fields", "[core][java_bytecode][java_bytecode_parse_generics]") @@ -58,7 +56,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -83,7 +82,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -108,7 +108,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -133,7 +134,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -158,7 +160,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::GenericTwoParam"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -183,7 +186,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::GenericTwoParam"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -208,7 +212,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::GenericTwoParam"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -240,7 +245,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -272,7 +278,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -304,7 +311,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -336,7 +344,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::Interface_Implementation"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -368,7 +377,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::Interface_Implementation"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } @@ -400,7 +410,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - + // issue TG-1301 } } } @@ -444,7 +455,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -477,7 +489,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -510,7 +523,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -543,7 +557,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -576,7 +591,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -609,7 +625,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -642,7 +659,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -683,7 +701,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -724,7 +743,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -765,7 +785,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -806,7 +827,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::Interface_Implementation"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -847,7 +869,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::Interface_Implementation"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -888,7 +911,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -920,7 +944,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -952,7 +977,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -984,7 +1010,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1016,7 +1043,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1048,7 +1076,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1080,7 +1109,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1112,7 +1142,8 @@ SCENARIO( REQUIRE( generic_param == java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1152,7 +1183,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1192,7 +1224,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1232,7 +1265,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1272,7 +1306,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::Interface_Implementation"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1312,7 +1347,8 @@ SCENARIO( generic_param == java_generic_inst_parametert( symbol_typet("java::Interface_Implementation"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } @@ -1352,7 +1388,8 @@ SCENARIO( generic_param == java_generic_inst_parametert(symbol_typet("java::Generic"))); } - // TODO: extend tests when nested generics are parsed correctly + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp index f20de637e5c..30c87045412 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp @@ -7,20 +7,16 @@ \*******************************************************************/ #include +#include #include -#include #include -#include #include -#include - -#include #include SCENARIO( - "java_bytecode_parse_recursive_generic_class", + "parse_recursive_generic_class", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table= @@ -32,5 +28,5 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(class_prefix)); // TODO: Extend this unit test when recursive generic types are correctly - // parsed. + // parsed - issue TG-1305 } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp index 1ca93cbe9fa..82186f2ddaf 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp @@ -7,18 +7,17 @@ \*******************************************************************/ #include +#include +#include #include #include #include #include -#include -#include -#include SCENARIO( - "java_bytecode_parse_signature_descriptor_mismatch", + "parse_signature_descriptor_mismatch", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( @@ -54,7 +53,7 @@ SCENARIO( REQUIRE(func_code.parameters().size()==3); // TODO: for now, the parameters are not generic because we fall back to - // descriptor due to mismatch; enable tests when fixed + // descriptor due to mismatch; enable tests when fixed - issue TG-1309 // code_typet::parametert param_parent= // require_type::require_parameter(func_code,"arg1a"); // REQUIRE(is_java_generic_type(param_parent.type())); @@ -89,7 +88,7 @@ SCENARIO( REQUIRE(func_code.parameters().size()==3); // TODO: for now, the parameters are not generic because we fall back to - // descriptor due to mismatch; enable tests when fixed + // descriptor due to mismatch; enable tests when fixed - issue TG-1309 // code_typet::parametert param_parent= // require_type::require_parameter(func_code,"arg1a"); // REQUIRE(is_java_generic_type(param_parent.type())); From e908f0c757b97a1251bcf6f992575dd43cc45f70 Mon Sep 17 00:00:00 2001 From: svorenova Date: Thu, 2 Nov 2017 10:34:10 +0000 Subject: [PATCH 14/22] Updating utility functions to check generic/non-generic java classes --- unit/testing-utils/require_type.cpp | 61 ++++++++++++++++++++++++++--- unit/testing-utils/require_type.h | 8 ++-- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/unit/testing-utils/require_type.cpp b/unit/testing-utils/require_type.cpp index de896e90e63..13a97d3e229 100644 --- a/unit/testing-utils/require_type.cpp +++ b/unit/testing-utils/require_type.cpp @@ -202,14 +202,65 @@ const typet &require_type::require_java_non_generic_type( return type; } -/// Verify that a class is a valid java generic class +/// Checks that the given type is a complete class. +/// \param class_type type of the class +/// \return class_type of the class +class_typet require_complete_class(const typet &class_type) +{ + REQUIRE(class_type.id() == ID_struct); + + const class_typet &class_class_type = to_class_type(class_type); + REQUIRE(class_class_type.is_class()); + REQUIRE_FALSE(class_class_type.get_bool(ID_incomplete_class)); + + return class_class_type; +} + +/// Verify that a class is a complete, valid java generic class with the +/// specified list of variables. /// \param class_type: the class +/// \param type_variables: vector of type variables /// \return: A reference to the java generic class type. -java_generics_class_typet & -require_type::require_java_generic_class(const class_typet &class_type) +java_generics_class_typet require_type::require_java_generic_class( + const typet &class_type, + const optionalt> &type_variables) { - java_class_typet java_class_type = to_java_class_type(class_type); + const class_typet &class_class_type = require_complete_class(class_type); + java_class_typet java_class_type = to_java_class_type(class_class_type); REQUIRE(is_java_generics_class_type(java_class_type)); - return to_java_generics_class_type(java_class_type); + java_generics_class_typet java_generic_class_type = + to_java_generics_class_type(java_class_type); + + if(type_variables) + { + const java_generics_class_typet::generic_typest &generic_type_vars = + java_generic_class_type.generic_types(); + REQUIRE(generic_type_vars.size() == type_variables.value().size()); + REQUIRE( + std::equal( + type_variables->begin(), + type_variables->end(), + generic_type_vars.begin(), + []( + const irep_idt &type_var_name, const java_generic_parametert ¶m) { + REQUIRE(!is_java_generic_inst_parameter((param))); + return param.type_variable().get_identifier() == type_var_name; + })); + } + return java_generic_class_type; +} + +/// Verify that a class is a complete, valid nongeneric java class +/// \param class_type: the class +/// \return: A reference to the java generic class type. +java_class_typet +require_type::require_java_non_generic_class(const typet &class_type) +{ + const class_typet &class_class_type = require_complete_class(class_type); + java_class_typet java_class_type = to_java_class_type(class_class_type); + + REQUIRE(!is_java_generics_class_type(java_class_type)); + + return java_class_type; } diff --git a/unit/testing-utils/require_type.h b/unit/testing-utils/require_type.h index 25466433513..59ff0c5bbf6 100644 --- a/unit/testing-utils/require_type.h +++ b/unit/testing-utils/require_type.h @@ -19,7 +19,6 @@ #include #include - // NOLINTNEXTLINE(readability/namespace) namespace require_type { @@ -63,8 +62,11 @@ const typet &require_java_non_generic_type( const typet &type, const optionalt &expect_subtype); -java_generics_class_typet & -require_java_generic_class(const class_typet &class_type); +java_generics_class_typet require_java_generic_class( + const typet &class_type, + const optionalt> &type_variables); + +java_class_typet require_java_non_generic_class(const typet &class_type); } #endif // CPROVER_TESTING_UTILS_REQUIRE_TYPE_H From c1e1ba2afab23ed0a8a6d24aa2873e32bbfc01eb Mon Sep 17 00:00:00 2001 From: svorenova Date: Wed, 1 Nov 2017 11:59:21 +0000 Subject: [PATCH 15/22] Applying new function for accessing elements of arrays --- .../parse_generic_array_class.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp index 3f925a2ab9e..92cf70d54af 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp @@ -50,7 +50,7 @@ SCENARIO( THEN("The elements have the parametric type T") { - const typet &element = field_t_subtype.find_type(ID_C_element_type); + const typet &element = java_array_element_type(field_t_subtype); REQUIRE(is_java_generic_parameter(element)); java_generic_parametert element_parameter = to_java_generic_parameter(element); @@ -80,7 +80,7 @@ SCENARIO( THEN("The elements have type Generic") { - const typet &element = field_t2_subtype.find_type(ID_C_element_type); + const typet &element = java_array_element_type(field_t2_subtype); REQUIRE(is_java_generic_type(element)); const java_generic_typet generic_element = to_java_generic_type(element); @@ -118,7 +118,7 @@ SCENARIO( THEN("The elements have type Generic") { - const typet &element = field_t3_subtype.find_type(ID_C_element_type); + const typet &element = java_array_element_type(field_t3_subtype); REQUIRE(is_java_generic_type(element)); const java_generic_typet generic_element = to_java_generic_type(element); From cce781465f9ade0e871d5de40841552f0dc2dba4 Mon Sep 17 00:00:00 2001 From: svorenova Date: Thu, 2 Nov 2017 13:15:09 +0000 Subject: [PATCH 16/22] Refactoring unit test utility functions to make them easier to use --- unit/testing-utils/require_type.cpp | 161 ++++++++++++++++------------ unit/testing-utils/require_type.h | 21 ++-- 2 files changed, 107 insertions(+), 75 deletions(-) diff --git a/unit/testing-utils/require_type.cpp b/unit/testing-utils/require_type.cpp index 13a97d3e229..78b51b53762 100644 --- a/unit/testing-utils/require_type.cpp +++ b/unit/testing-utils/require_type.cpp @@ -65,12 +65,11 @@ code_typet require_type::require_code(const typet &type) /// \param num_params check the the given code_typet expects this /// number of parameters /// \return The type cast to a code_typet -code_typet require_type::require_code( - const typet &type, - const size_t num_params) +code_typet +require_type::require_code(const typet &type, const size_t num_params) { - code_typet code_type=require_code(type); - REQUIRE(code_type.parameters().size()==num_params); + code_typet code_type = require_code(type); + REQUIRE(code_type.parameters().size() == num_params); return code_type; } @@ -105,82 +104,98 @@ bool require_java_generic_parametert_expectation( { switch(expected.kind) { - case require_type::type_parameter_kindt::Var: - REQUIRE(!is_java_generic_inst_parameter((param))); - REQUIRE(param.type_variable().get_identifier()==expected.description); - return true; - case require_type::type_parameter_kindt::Inst: - REQUIRE(is_java_generic_inst_parameter((param))); - REQUIRE(param.subtype()==symbol_typet(expected.description)); - return true; + case require_type::type_parameter_kindt::Var: + REQUIRE(!is_java_generic_inst_parameter((param))); + REQUIRE(param.type_variable().get_identifier() == expected.description); + return true; + case require_type::type_parameter_kindt::Inst: + REQUIRE(is_java_generic_inst_parameter((param))); + REQUIRE(param.subtype() == symbol_typet(expected.description)); + return true; } // Should be unreachable... REQUIRE(false); return false; } +/// Verify a given type is a java_generic_type +/// \param type The type to check +/// \return The type, cast to a java_generic_typet +java_generic_typet require_type::require_java_generic_type(const typet &type) +{ + REQUIRE(is_java_generic_type(type)); + return to_java_generic_type(type); +} -/// Verify a given type is a java_generic_type, optionally checking +/// Verify a given type is a java_generic_type, checking /// that it's associated type variables match a given set of identifiers. /// Expected usage is something like this: /// /// require_java_generic_type(type, -/// {{Inst,"java::java.lang.Integer"},{Var,"T"}}) +/// {{require_type::type_parameter_kindt::Inst, "java::java.lang.Integer"}, +/// {require_type::type_parameter_kindt::Var, "T"}}) /// /// \param type The type to check -/// \param type_expectations An optional set of type variable kinds +/// \param type_expectations A set of type variable kinds /// and identifiers which should be expected as the type parameters of the /// given generic type. /// \return The given type, cast to a java_generic_typet java_generic_typet require_type::require_java_generic_type( const typet &type, - const optionalt &type_expectations) + const require_type::expected_type_parameterst &type_expectations) { - REQUIRE(is_java_generic_type(type)); - const java_generic_typet &generic_type=to_java_generic_type(type); - if(type_expectations) - { - const java_generic_typet::generic_type_variablest &generic_type_vars= - generic_type.generic_type_variables(); - REQUIRE(generic_type_vars.size()==type_expectations->size()); - REQUIRE( - std::equal( - generic_type_vars.begin(), - generic_type_vars.end(), - type_expectations->begin(), - require_java_generic_parametert_expectation)); - } + const java_generic_typet &generic_type = + require_type::require_java_generic_type(type); + + const java_generic_typet::generic_type_variablest &generic_type_vars = + generic_type.generic_type_variables(); + REQUIRE(generic_type_vars.size() == type_expectations.size()); + REQUIRE( + std::equal( + generic_type_vars.begin(), + generic_type_vars.end(), + type_expectations.begin(), + require_java_generic_parametert_expectation)); return generic_type; } -/// Verify a given type is a java_generic_parameter, optionally checking +/// Verify a given type is a java_generic_parameter +/// \param type The type to check +/// \return The type, cast to a java_generic_parametert +java_generic_parametert +require_type::require_java_generic_parameter(const typet &type) +{ + REQUIRE(is_java_generic_parameter(type)); + return to_java_generic_parameter(type); +} + +/// Verify a given type is a java_generic_parameter, checking /// that it's associated type variables match a given set of expectations. /// Expected usage is something like this: /// -/// require_java_generic_parameter(parameter, {Inst,"java::java.lang.Integer"}) +/// require_java_generic_parameter(parameter, +/// {require_type::type_parameter_kindt::Inst,"java::java.lang.Integer"}) /// /// or /// -/// require_java_generic_parameter(parameter, {Var,"T"}) +/// require_java_generic_parameter(parameter, +/// {require_type::type_parameter_kindt::Var,"T"}) /// /// \param type The type to check -/// \param type_expectation An optional description of the identifiers/kinds +/// \param type_expectation A description of the identifiers/kinds /// which / should be expected as the type parameter of the generic parameter. /// \return The given type, cast to a java_generic_parametert java_generic_parametert require_type::require_java_generic_parameter( const typet &type, - const optionalt &type_expectation) + const require_type::expected_type_parametert &type_expectation) { - REQUIRE(is_java_generic_parameter(type)); - const java_generic_parametert &generic_param=to_java_generic_parameter(type); - if(type_expectation) - { - REQUIRE( - require_java_generic_parametert_expectation( - generic_param, - type_expectation.value())); - } + const java_generic_parametert &generic_param = + require_type::require_java_generic_parameter(type); + + REQUIRE( + require_java_generic_parametert_expectation( + generic_param, type_expectation)); return generic_param; } @@ -198,7 +213,7 @@ const typet &require_type::require_java_non_generic_type( REQUIRE(!is_java_generic_type(type)); REQUIRE(!is_java_generic_inst_parameter(type)); if(expect_subtype) - REQUIRE(type.subtype()==expect_subtype.value()); + REQUIRE(type.subtype() == expect_subtype.value()); return type; } @@ -216,14 +231,11 @@ class_typet require_complete_class(const typet &class_type) return class_class_type; } -/// Verify that a class is a complete, valid java generic class with the -/// specified list of variables. +/// Verify that a class is a complete, valid java generic class. /// \param class_type: the class -/// \param type_variables: vector of type variables /// \return: A reference to the java generic class type. -java_generics_class_typet require_type::require_java_generic_class( - const typet &class_type, - const optionalt> &type_variables) +java_generics_class_typet +require_type::require_java_generic_class(const typet &class_type) { const class_typet &class_class_type = require_complete_class(class_type); java_class_typet java_class_type = to_java_class_type(class_class_type); @@ -232,22 +244,35 @@ java_generics_class_typet require_type::require_java_generic_class( java_generics_class_typet java_generic_class_type = to_java_generics_class_type(java_class_type); - if(type_variables) - { - const java_generics_class_typet::generic_typest &generic_type_vars = - java_generic_class_type.generic_types(); - REQUIRE(generic_type_vars.size() == type_variables.value().size()); - REQUIRE( - std::equal( - type_variables->begin(), - type_variables->end(), - generic_type_vars.begin(), - []( - const irep_idt &type_var_name, const java_generic_parametert ¶m) { - REQUIRE(!is_java_generic_inst_parameter((param))); - return param.type_variable().get_identifier() == type_var_name; - })); - } + return java_generic_class_type; +} + +/// Verify that a class is a complete, valid java generic class with the +/// specified list of variables. +/// \param class_type: the class +/// \param type_variables: vector of type variables +/// \return: A reference to the java generic class type. +java_generics_class_typet require_type::require_java_generic_class( + const typet &class_type, + const std::initializer_list &type_variables) +{ + const java_generics_class_typet java_generic_class_type = + require_type::require_java_generic_class(class_type); + + const java_generics_class_typet::generic_typest &generic_type_vars = + java_generic_class_type.generic_types(); + REQUIRE(generic_type_vars.size() == type_variables.size()); + REQUIRE( + std::equal( + type_variables.begin(), + type_variables.end(), + generic_type_vars.begin(), + [](const irep_idt &type_var_name, const java_generic_parametert ¶m) + { + REQUIRE(!is_java_generic_inst_parameter((param))); + return param.type_variable().get_identifier() == type_var_name; + })); + return java_generic_class_type; } diff --git a/unit/testing-utils/require_type.h b/unit/testing-utils/require_type.h index 59ff0c5bbf6..6d61f7d325b 100644 --- a/unit/testing-utils/require_type.h +++ b/unit/testing-utils/require_type.h @@ -34,13 +34,15 @@ code_typet require_code(const typet &type); code_typet::parametert require_parameter(const code_typet &function_type, const irep_idt ¶m_name); -code_typet require_code( - const typet &type, - const size_t num_params); +code_typet require_code(const typet &type, const size_t num_params); // A mini DSL for describing an expected set of type parameters for a // java_generic_typet -enum class type_parameter_kindt { Inst, Var }; +enum class type_parameter_kindt +{ + Inst, + Var +}; struct expected_type_parametert { type_parameter_kindt kind; @@ -49,22 +51,27 @@ struct expected_type_parametert typedef std::initializer_list expected_type_parameterst; +java_generic_typet require_java_generic_type(const typet &type); + java_generic_typet require_java_generic_type( const typet &type, - const optionalt &type_expectations); + const require_type::expected_type_parameterst &type_expectations); +java_generic_parametert require_java_generic_parameter(const typet &type); java_generic_parametert require_java_generic_parameter( const typet &type, - const optionalt &type_expectation); + const require_type::expected_type_parametert &type_expectation); const typet &require_java_non_generic_type( const typet &type, const optionalt &expect_subtype); +java_generics_class_typet require_java_generic_class(const typet &class_type); + java_generics_class_typet require_java_generic_class( const typet &class_type, - const optionalt> &type_variables); + const std::initializer_list &type_variables); java_class_typet require_java_non_generic_class(const typet &class_type); } From 398c88a1c7a764293ed7f41c099c853e26affd2e Mon Sep 17 00:00:00 2001 From: svorenova Date: Thu, 2 Nov 2017 10:12:05 +0000 Subject: [PATCH 17/22] Applying new utility functions for generics --- .../parse_bounded_generic_inner_classes.cpp | 219 ++-- .../parse_derived_generic_class.cpp | 5 +- .../parse_functions_with_generics.cpp | 162 +-- .../parse_generic_array_class.cpp | 83 +- .../parse_generic_class.cpp | 99 +- ...neric_class_with_generic_inner_classes.cpp | 1129 +++++----------- .../parse_generic_functions.cpp | 591 +++------ .../parse_generic_wildcard_function.cpp | 28 +- .../parse_nested_generics.cpp | 1161 +++++++---------- .../parse_recursive_generic_class.cpp | 14 +- .../parse_signature_descriptor_mismatch.cpp | 46 +- 11 files changed, 1195 insertions(+), 2342 deletions(-) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp index 1a5c792faa1..a4f724d07e1 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp @@ -8,11 +8,8 @@ #include #include -#include #include -#include - #include #include #include @@ -28,6 +25,10 @@ SCENARIO( std::string class_prefix = "java::BoundedGenericInnerClasses"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + const java_class_typet &java_class_type = + require_type::require_java_non_generic_class(class_symbol.type); + WHEN("Parsing an inner class with type variable") { std::string inner_name = class_prefix + "$Inner"; @@ -35,29 +36,18 @@ SCENARIO( THEN("The symbol type should be generic") { const symbolt &class_symbol = new_symbol_table.lookup_ref(inner_name); - class_typet class_type = - require_symbol::require_complete_class(class_symbol); - java_generics_class_typet java_generics_class_type = - require_type::require_java_generic_class(class_type); - - const typet &elem_type = - to_java_class_type(class_type).component_type("elem"); - REQUIRE(is_java_generic_parameter(elem_type)); + const java_generics_class_typet &java_generics_class_type = + require_type::require_java_generic_class( + class_symbol.type, {inner_name + "::E"}); - REQUIRE(java_generics_class_type.generic_types().size() == 1); - THEN("Type variable is named 'E'") + THEN("The fields are of correct types") { - typet &type_var = java_generics_class_type.generic_types().front(); - REQUIRE(is_java_generic_parameter(type_var)); - java_generic_parametert generic_type_var = - to_java_generic_parameter(type_var); - REQUIRE( - generic_type_var.type_variable().get_identifier() == - inner_name + "::E"); - typet &sub_type = generic_type_var.subtype(); - REQUIRE(sub_type.id() == ID_symbol); - symbol_typet &bound_type = to_symbol_type(sub_type); - REQUIRE(bound_type.get_identifier() == "java::java.lang.Object"); + const struct_union_typet::componentt &elem = + require_type::require_component( + to_struct_type(class_symbol.type), "elem"); + require_type::require_java_generic_parameter( + elem.type(), + {require_type::type_parameter_kindt::Var, inner_name + "::E"}); } } } @@ -70,109 +60,63 @@ SCENARIO( { const symbolt &class_symbol = new_symbol_table.lookup_ref(boundedinner_name); - class_typet class_type = - require_symbol::require_complete_class(class_symbol); - java_generics_class_typet java_generics_class_type = - require_type::require_java_generic_class(class_type); - - REQUIRE(java_generics_class_type.generic_types().size() == 1); - typet &type_var = java_generics_class_type.generic_types().front(); - REQUIRE(is_java_generic_parameter(type_var)); - java_generic_parametert generic_type_var = - to_java_generic_parameter(type_var); - - REQUIRE( - generic_type_var.type_variable().get_identifier() == - boundedinner_name + "::NUM"); - REQUIRE( - java_generics_class_type_var(0, java_generics_class_type) == - boundedinner_name + "::NUM"); - THEN("Bound must be Number") + const java_generics_class_typet &java_generics_class_type = + require_type::require_java_generic_class( + class_symbol.type, {boundedinner_name + "::NUM"}); + + //TODO extend when bounds are parsed correctly - TG-1286 + + THEN("The fields are of correct types") { - typet &sub_type = generic_type_var.subtype(); - REQUIRE(sub_type.id() == ID_symbol); - symbol_typet &bound_type = to_symbol_type(sub_type); - REQUIRE(bound_type.get_identifier() == "java::java.lang.Number"); - REQUIRE( - to_symbol_type( - java_generics_class_type_bound(0, java_generics_class_type)) - .get_identifier() == "java::java.lang.Number"); + const struct_union_typet::componentt &elem = + require_type::require_component( + to_struct_type(class_symbol.type), "elem"); + require_type::require_java_generic_parameter( + elem.type(), + {require_type::type_parameter_kindt::Var, + boundedinner_name + "::NUM"}); } - - const typet &elem_type = - to_java_class_type(class_type).component_type("elem"); - REQUIRE(is_java_generic_parameter(elem_type)); } } WHEN("There is a generic field with a concrete type") { - const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); - class_typet class_type = - require_symbol::require_complete_class(class_symbol); - - java_class_typet java_class_type = to_java_class_type(class_type); - REQUIRE(!is_java_generics_class_type(java_class_type)); - - const typet &belem_type = java_class_type.component_type("belem"); - - REQUIRE(belem_type != nil_typet()); - REQUIRE(is_java_generic_type(belem_type)); - THEN("Field has instantiated type variable") - { - const java_generic_typet &container = to_java_generic_type(belem_type); - - const std::vector &generic_types = - container.generic_type_variables(); - REQUIRE(generic_types.size() == 1); - - const typet &inst_type = java_generic_get_inst_type(0, container); - - REQUIRE(inst_type.id() == ID_pointer); - const typet &inst_type_symbol = inst_type.subtype(); - REQUIRE(inst_type_symbol.id() == ID_symbol); - REQUIRE( - to_symbol_type(inst_type_symbol).get_identifier() == - "java::java.lang.Integer"); - } + const struct_union_typet::componentt &belem_type = + require_type::require_component( + to_struct_type(class_symbol.type), "belem"); + require_type::require_pointer( + belem_type.type(), symbol_typet(class_prefix + "$BoundedInner")); + require_type::require_java_generic_type( + belem_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::java.lang.Integer"}}); } WHEN("Parsing an inner class with double bounded type variable") { std::string doubleboundedinner_name = class_prefix + "$DoubleBoundedInner"; REQUIRE(new_symbol_table.has_symbol(doubleboundedinner_name)); - THEN("The bounds should be encoded") + THEN("The symbol type should be generic") { const symbolt &class_symbol = new_symbol_table.lookup_ref(doubleboundedinner_name); - class_typet class_type = - require_symbol::require_complete_class(class_symbol); - - java_class_typet java_class_type = to_java_class_type(class_type); - REQUIRE_FALSE(is_java_generics_class_type(java_class_type)); - -// TODO (tkiley): Extend this unit test when bounds are correctly -// parsed - issue TG-1286 -#if 0 - java_generics_class_typet java_generics_class_type= - to_java_generics_class_type(java_class_type); - REQUIRE(java_generics_class_type.generic_types().size()==1); - typet &type_var=java_generics_class_type.generic_types().front(); - REQUIRE(is_java_generic_parameter(type_var)); - java_generic_parametert generic_type_var= - to_java_generic_parameter(type_var); - - REQUIRE( - generic_type_var.type_variable().get_identifier()== - doubleboundedinner_name+"::T"); - REQUIRE( - java_generics_class_type_var(0, java_generics_class_type)== - doubleboundedinner_name+"::T"); - THEN("Bound must be Number and Interface") - { + const java_generics_class_typet &java_generics_class_type = + require_type::require_java_generic_class( + class_symbol.type, {doubleboundedinner_name + "::T"}); + //TODO extend when bounds are parsed correctly - TG-1286 + + THEN("The fields are of correct types") + { + const struct_union_typet::componentt &elem = + require_type::require_component( + to_struct_type(class_symbol.type), "elem"); + require_type::require_java_generic_parameter( + elem.type(), + {require_type::type_parameter_kindt::Var, + doubleboundedinner_name + "::T"}); + + // TODO extend when bounds are parsed correctly - TG-1286 } -#endif } } @@ -180,47 +124,34 @@ SCENARIO( { std::string twoelementinner_name = class_prefix + "$TwoElementInner"; REQUIRE(new_symbol_table.has_symbol(twoelementinner_name)); - THEN("Both generic parameters should be encoded") + THEN("The symbol type should be generic with two type variables") { const symbolt &class_symbol = new_symbol_table.lookup_ref(twoelementinner_name); - class_typet class_type = - require_symbol::require_complete_class(class_symbol); - java_generics_class_typet java_generics_class_type = - require_type::require_java_generic_class(class_type); - - REQUIRE(java_generics_class_type.generic_types().size() == 2); + const java_generics_class_typet &java_generics_class_type = + require_type::require_java_generic_class( + class_symbol.type, + {twoelementinner_name + "::K", twoelementinner_name + "::V"}); - // The first parameter should be called K - { - const typet first_param = - java_generics_class_type.generic_types().at(0); - REQUIRE(is_java_generic_parameter(first_param)); - java_generic_parametert generic_type_var = - to_java_generic_parameter(first_param); - - REQUIRE( - generic_type_var.type_variable().get_identifier() == - twoelementinner_name + "::K"); - REQUIRE( - java_generics_class_type_var(0, java_generics_class_type) == - twoelementinner_name + "::K"); - } + //TODO extend when bounds are parsed correctly - TG-1286 - // The second parameter should be called V + THEN("The fields are of correct types") { - const typet &second_param = - java_generics_class_type.generic_types().at(1); - REQUIRE(is_java_generic_parameter(second_param)); - java_generic_parametert generic_type_var = - to_java_generic_parameter(second_param); - - REQUIRE( - generic_type_var.type_variable().get_identifier() == - twoelementinner_name + "::V"); - REQUIRE( - java_generics_class_type_var(1, java_generics_class_type) == - twoelementinner_name + "::V"); + const struct_union_typet::componentt &elemk = + require_type::require_component( + to_struct_type(class_symbol.type), "k"); + require_type::require_java_generic_parameter( + elemk.type(), + {require_type::type_parameter_kindt::Var, + twoelementinner_name + "::K"}); + + const struct_union_typet::componentt &elemv = + require_type::require_component( + to_struct_type(class_symbol.type), "v"); + require_type::require_java_generic_parameter( + elemv.type(), + {require_type::type_parameter_kindt::Var, + twoelementinner_name + "::V"}); } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp index d1ef530fb31..106f1e230f1 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp @@ -8,13 +8,11 @@ #include #include -#include - -#include #include #include #include +#include SCENARIO( "parse_derived_generic_class", @@ -29,6 +27,7 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(class_prefix)); const symbolt &derived_symbol = new_symbol_table.lookup_ref(class_prefix); + derived_symbol.show(std::cout); const class_typet &derived_class_type = require_symbol::require_complete_class(derived_symbol); diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp index e956ce06280..f1aef3ff5d8 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_functions_with_generics.cpp @@ -10,11 +10,6 @@ #include #include -#include -#include - -#include - SCENARIO( "parse_functions_with_generics", "[core][java_bytecode][java_bytecode_parse_generics]") @@ -37,25 +32,22 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet &func_code = + require_type::require_code(func_symbol.type); THEN("It has parameter x pointing to Generic") { - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - require_type::require_pointer( - generic_param_x, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } @@ -67,14 +59,10 @@ SCENARIO( THEN("It is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - require_type::require_pointer( - generic_return_param, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + return_type, + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } } @@ -93,25 +81,21 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = require_type::require_code(func_symbol.type); THEN("It has parameter s pointing to Generic") { - code_typet::parametert param_s = + const code_typet::parametert ¶m_s = require_type::require_parameter(func_code, "s"); require_type::require_pointer( param_s.type(), symbol_typet("java::Generic")); THEN("s is generic with parameter pointing to java.lang.String") { - REQUIRE(is_java_generic_type(param_s.type())); - - const java_generic_typet generic_s = - to_java_generic_type(param_s.type()); - const java_generic_parametert generic_param_s = - generic_s.generic_type_variables().front(); - require_type::require_pointer( - generic_param_s, symbol_typet("java::java.lang.String")); + require_type::require_java_generic_type( + param_s.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.String"}}); } } @@ -123,14 +107,10 @@ SCENARIO( THEN("It is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - require_type::require_pointer( - generic_return_param, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + return_type, + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } } @@ -149,45 +129,37 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = require_type::require_code(func_symbol.type); THEN("It has parameter x pointing to Generic") { - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - require_type::require_pointer( - generic_param_x, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } THEN("It has parameter y pointing to Generic") { - code_typet::parametert param_y = + const code_typet::parametert ¶m_y = require_type::require_parameter(func_code, "y"); require_type::require_pointer( param_y.type(), symbol_typet("java::Generic")); THEN("y is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(param_y.type())); - - const java_generic_typet generic_y = - to_java_generic_type(param_y.type()); - const java_generic_parametert generic_param_y = - generic_y.generic_type_variables().front(); - require_type::require_pointer( - generic_param_y, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + param_y.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } @@ -199,14 +171,10 @@ SCENARIO( THEN("It is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - require_type::require_pointer( - generic_return_param, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + return_type, + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } } @@ -225,45 +193,37 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = require_type::require_code(func_symbol.type); THEN("It has parameter s pointing to Generic") { - code_typet::parametert param_s = + const code_typet::parametert ¶m_s = require_type::require_parameter(func_code, "s"); require_type::require_pointer( param_s.type(), symbol_typet("java::Generic")); THEN("s is generic with parameter pointing to java.lang.String") { - REQUIRE(is_java_generic_type(param_s.type())); - - const java_generic_typet generic_s = - to_java_generic_type(param_s.type()); - const java_generic_parametert generic_param_s = - generic_s.generic_type_variables().front(); - require_type::require_pointer( - generic_param_s, symbol_typet("java::java.lang.String")); + require_type::require_java_generic_type( + param_s.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.String"}}); } } THEN("It has parameter b pointing to Generic") { - code_typet::parametert param_b = + const code_typet::parametert ¶m_b = require_type::require_parameter(func_code, "b"); require_type::require_pointer( param_b.type(), symbol_typet("java::Generic")); THEN("b is generic with parameter pointing to java.lang.Boolean") { - REQUIRE(is_java_generic_type(param_b.type())); - - const java_generic_typet generic_b = - to_java_generic_type(param_b.type()); - const java_generic_parametert generic_param_b = - generic_b.generic_type_variables().front(); - require_type::require_pointer( - generic_param_b, symbol_typet("java::java.lang.Boolean")); + require_type::require_java_generic_type( + param_b.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Boolean"}}); } } @@ -275,14 +235,10 @@ SCENARIO( THEN("It is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - require_type::require_pointer( - generic_return_param, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + return_type, + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } } @@ -302,11 +258,11 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = require_type::require_code(func_symbol.type); THEN("It has parameter inner pointing to Inner") { - code_typet::parametert param_inner = + const code_typet::parametert ¶m_inner = require_type::require_parameter(func_code, "inner"); require_type::require_pointer( param_inner.type(), symbol_typet(class_prefix + "$Inner")); @@ -320,14 +276,10 @@ SCENARIO( THEN("It is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - require_type::require_pointer( - generic_return_param, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + return_type, + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp index 92cf70d54af..ac054de5e5e 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_array_class.cpp @@ -9,12 +9,6 @@ #include #include #include -#include - - -#include -#include -#include SCENARIO( "parse_generic_array_class", @@ -27,20 +21,19 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(class_prefix)); const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); - const class_typet &class_type = - require_symbol::require_complete_class(class_symbol); + const java_generics_class_typet &java_generic_class = + require_type::require_java_generic_class( + class_symbol.type, {class_prefix + "::T"}); THEN("There should be field t") { - struct_union_typet::componentt field_t = - require_type::require_component(class_type, "t"); + const struct_union_typet::componentt &field_t = + require_type::require_component(java_generic_class, "t"); THEN("It is an array") { - pointer_typet field_t_pointer = - require_type::require_pointer( - field_t.type(), - symbol_typet("java::array[reference]")); + const pointer_typet &field_t_pointer = require_type::require_pointer( + field_t.type(), symbol_typet("java::array[reference]")); const symbol_typet &field_t_subtype = to_symbol_type(field_t_pointer.subtype()); @@ -51,26 +44,22 @@ SCENARIO( THEN("The elements have the parametric type T") { const typet &element = java_array_element_type(field_t_subtype); - REQUIRE(is_java_generic_parameter(element)); - java_generic_parametert element_parameter = - to_java_generic_parameter(element); - REQUIRE(element_parameter.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_parameter( + element, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}); } } } THEN("There should be field t2") { - struct_union_typet::componentt field_t2 = - require_type::require_component(class_type, "t2"); + const struct_union_typet::componentt &field_t2 = + require_type::require_component(java_generic_class, "t2"); THEN("It is an array") { - pointer_typet field_t2_pointer = - require_type::require_pointer( - field_t2.type(), - symbol_typet("java::array[reference]")); + const pointer_typet &field_t2_pointer = require_type::require_pointer( + field_t2.type(), symbol_typet("java::array[reference]")); const symbol_typet &field_t2_subtype = to_symbol_type(field_t2_pointer.subtype()); @@ -81,34 +70,23 @@ SCENARIO( THEN("The elements have type Generic") { const typet &element = java_array_element_type(field_t2_subtype); - REQUIRE(is_java_generic_type(element)); - const java_generic_typet generic_element = - to_java_generic_type(element); - require_type::require_pointer( - generic_element, symbol_typet - ("java::Generic")); - - REQUIRE(is_java_generic_parameter( - generic_element.generic_type_variables().front())); - java_generic_parametert parameter = - generic_element.generic_type_variables().front(); - REQUIRE(parameter.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_pointer(element, symbol_typet("java::Generic")); + require_type::require_java_generic_type( + element, + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } THEN("There should be field t3") { - struct_union_typet::componentt field_t3 = - require_type::require_component(class_type, "t3"); + const struct_union_typet::componentt &field_t3 = + require_type::require_component(java_generic_class, "t3"); THEN("It is an array") { - pointer_typet field_t3_pointer = - require_type::require_pointer( - field_t3.type(), - symbol_typet("java::array[reference]")); + const pointer_typet &field_t3_pointer = require_type::require_pointer( + field_t3.type(), symbol_typet("java::array[reference]")); const symbol_typet &field_t3_subtype = to_symbol_type(field_t3_pointer.subtype()); @@ -119,18 +97,11 @@ SCENARIO( THEN("The elements have type Generic") { const typet &element = java_array_element_type(field_t3_subtype); - REQUIRE(is_java_generic_type(element)); - const java_generic_typet generic_element = - to_java_generic_type(element); - require_type::require_pointer( - generic_element, symbol_typet("java::Generic")); - - REQUIRE(is_java_generic_inst_parameter( - generic_element.generic_type_variables().front())); - java_generic_parametert parameter = - generic_element.generic_type_variables().front(); - require_type::require_pointer( - parameter, symbol_typet("java::java.lang.Integer")); + require_type::require_pointer(element, symbol_typet("java::Generic")); + require_type::require_java_generic_type( + element, + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp index e022ba12ec3..3487a4e4e3e 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class.cpp @@ -8,15 +8,8 @@ #include #include -#include #include -#include - -#include -#include -#include - SCENARIO( "parse_generic_class_one_param", "[core][java_bytecode][java_bytecode_parse_generics]") @@ -33,56 +26,37 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(class_prefix)); const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); - class_typet class_type = - require_symbol::require_complete_class(class_symbol); - java_generics_class_typet java_generics_class_type = - require_type::require_java_generic_class(class_type); - - THEN("It has type variable T") - { - REQUIRE(java_generics_class_type.generic_types().size() == 1); - const auto &generic_types = java_generics_class_type.generic_types(); - - REQUIRE( - generic_types[0].type_variable().get_identifier() == - class_prefix + "::T"); - } + const java_generics_class_typet &java_generics_class = + require_type::require_java_generic_class( + class_symbol.type, {class_prefix + "::T"}); const struct_typet class_struct = to_struct_type(class_symbol.type); THEN("It has field t") { - struct_union_typet::componentt field_t = + const struct_union_typet::componentt &field_t = require_type::require_component(class_struct, "t"); THEN("It is the generic parameter T") { - REQUIRE(is_java_generic_parameter(field_t.type())); - - const java_generic_parametert field_t_param = - to_java_generic_parameter(field_t.type()); - REQUIRE( - field_t_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_parameter( + field_t.type(), + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}); } } THEN("It has field g pointing to Generic") { - struct_union_typet::componentt field_g = + const struct_union_typet::componentt &field_g = require_type::require_component(class_struct, "g"); require_type::require_pointer( field_g.type(), symbol_typet("java::Generic")); THEN("It is generic with parameter pointing to java.lang.Integer") { - REQUIRE(is_java_generic_type(field_g.type())); - - const java_generic_typet generic_field_g = - to_java_generic_type(field_g.type()); - const java_generic_parametert generic_param_field_g = - generic_field_g.generic_type_variables().front(); - require_type::require_pointer( - generic_param_field_g, symbol_typet("java::java.lang.Integer")); + require_type::require_java_generic_type( + field_g.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}}); } } } @@ -105,60 +79,33 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(class_prefix)); const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); - class_typet class_type = - require_symbol::require_complete_class(class_symbol); - java_generics_class_typet java_generics_class_type = - require_type::require_java_generic_class(class_type); - - THEN("It has type variables T and U") - { - REQUIRE(java_generics_class_type.generic_types().size() == 2); - const auto &generic_types = java_generics_class_type.generic_types(); - { - const java_generic_parametert &generic_param = generic_types[0]; - REQUIRE( - generic_param.type_variable().get_identifier() == - class_prefix + "::T"); - } - { - const java_generic_parametert &generic_param = generic_types[1]; - REQUIRE( - generic_param.type_variable().get_identifier() == - class_prefix + "::U"); - } - } + const java_generics_class_typet &java_generics_class = + require_type::require_java_generic_class( + class_symbol.type, {class_prefix + "::T", class_prefix + "::U"}); const struct_typet class_struct = to_struct_type(class_symbol.type); THEN("It has field t") { - struct_union_typet::componentt field_t = + const struct_union_typet::componentt &field_t = require_type::require_component(class_struct, "t"); THEN("It is the generic parameter T") { - REQUIRE(is_java_generic_parameter(field_t.type())); - - const java_generic_parametert field_t_param = - to_java_generic_parameter(field_t.type()); - REQUIRE( - field_t_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_parameter( + field_t.type(), + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}); } } THEN("It has field u") { - struct_union_typet::componentt field_u = + const struct_union_typet::componentt &field_u = require_type::require_component(class_struct, "u"); THEN("It is the generic parameter U") { - REQUIRE(is_java_generic_parameter(field_u.type())); - - const java_generic_parametert field_u_param = - to_java_generic_parameter(field_u.type()); - REQUIRE( - field_u_param.type_variable().get_identifier() == - class_prefix + "::U"); + require_type::require_java_generic_parameter( + field_u.type(), + {require_type::type_parameter_kindt::Var, class_prefix + "::U"}); } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp index 6c66ff1f5a8..47bbcd2c2e9 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp @@ -7,15 +7,8 @@ \*******************************************************************/ #include -#include -#include - -#include -#include - -#include - #include +#include SCENARIO( "parse_generic_class_with_generic_inner_classes_fields", @@ -32,29 +25,25 @@ SCENARIO( { REQUIRE(new_symbol_table.has_symbol(class_prefix)); const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); - - const class_typet &class_type = - require_symbol::require_complete_class(class_symbol); + const java_generics_class_typet &java_generic_class = + require_type::require_java_generic_class( + class_symbol.type, {class_prefix + "::T"}); THEN( "The field component should be a pointer to " "GenericClassWithGenericInnerClasses$InnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field"); + require_type::require_component(java_generic_class, "field"); require_type::require_pointer( field_component.type(), symbol_typet(class_prefix + "$InnerClass")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } @@ -63,7 +52,7 @@ SCENARIO( "GenericClassWithGenericInnerClasses$GenericInnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field2"); + require_type::require_component(java_generic_class, "field2"); require_type::require_pointer( field_component.type(), @@ -71,24 +60,12 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } @@ -97,7 +74,7 @@ SCENARIO( "GenericClassWithGenericInnerClasses$GenericInnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field3"); + require_type::require_component(java_generic_class, "field3"); require_type::require_pointer( field_component.type(), @@ -105,24 +82,10 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } @@ -131,7 +94,7 @@ SCENARIO( "InnerClasses$GenericInnerClass$DoublyNestedInnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field4"); + require_type::require_component(java_generic_class, "field4"); require_type::require_pointer( field_component.type(), @@ -140,24 +103,12 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } @@ -166,7 +117,7 @@ SCENARIO( "InnerClasses$GenericInnerClass$DoublyNestedInnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field5"); + require_type::require_component(java_generic_class, "field5"); require_type::require_pointer( field_component.type(), @@ -175,24 +126,10 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } @@ -201,7 +138,7 @@ SCENARIO( "InnerClasses$GenericInnerClass$DoublyNestedInnerGenericClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field6"); + require_type::require_component(java_generic_class, "field6"); require_type::require_pointer( field_component.type(), @@ -210,31 +147,14 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } @@ -243,7 +163,7 @@ SCENARIO( "InnerClasses$GenericInnerClass$DoublyNestedInnerGenericClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field7"); + require_type::require_component(java_generic_class, "field7"); require_type::require_pointer( field_component.type(), @@ -252,31 +172,11 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } @@ -285,7 +185,7 @@ SCENARIO( "GenericClassWithGenericInnerClasses$TwoParamInnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field8"); + require_type::require_component(java_generic_class, "field8"); require_type::require_pointer( field_component.type(), @@ -293,31 +193,14 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } @@ -326,7 +209,7 @@ SCENARIO( "GenericClassWithGenericInnerClasses$TwoParamInnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field9"); + require_type::require_component(java_generic_class, "field9"); require_type::require_pointer( field_component.type(), @@ -334,31 +217,14 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Var, + class_prefix + "::T"}}); } } @@ -367,7 +233,7 @@ SCENARIO( "GenericClassWithGenericInnerClasses$TwoParamInnerClass") { const struct_typet::componentt &field_component = - require_type::require_component(class_type, "field10"); + require_type::require_component(java_generic_class, "field10"); require_type::require_pointer( field_component.type(), @@ -375,31 +241,11 @@ SCENARIO( THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == - symbol_typet(class_prefix + "::T")); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } @@ -430,22 +276,17 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet(class_prefix + "$InnerClass")); - - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$InnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -464,44 +305,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 3); - // Check param input + THEN("The inputs are of correct type") { - const auto param_type = + const auto ¶m_type = require_type::require_parameter(function_call, "input"); require_type::require_pointer( param_type.type(), symbol_typet(class_prefix + "$InnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - } - - // Check param input2 - { - const auto param_type2 = + const auto ¶m_type2 = require_type::require_parameter(function_call, "input2"); require_type::require_pointer( param_type2.type(), symbol_typet(class_prefix + "$InnerClass")); - - THEN("The pointer should be generic") - { - REQUIRE(is_java_generic_type(param_type2.type())); - const auto &generic_variables = - to_java_generic_type(param_type2.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + require_type::require_java_generic_type( + param_type2.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -519,32 +341,20 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet(class_prefix + "$GenericInnerClass")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$GenericInnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -562,31 +372,18 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet(class_prefix + "$GenericInnerClass")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$GenericInnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -605,33 +402,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -640,8 +426,8 @@ SCENARIO( { const std::string func_name = ".method6"; const std::string func_descriptor = - ":(LGenericClassWithGenericInnerClasses" - "$GenericInnerClass$DoublyNestedInnerClass;)V"; + ":(LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerClass;)V"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -650,32 +436,20 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); - - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -684,8 +458,8 @@ SCENARIO( { const std::string func_name = ".method7"; const std::string func_descriptor = - ":(LGenericClassWithGenericInnerClasses" - "$GenericInnerClass$DoublyNestedInnerGenericClass;)V"; + ":(LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerGenericClass;)V"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -694,41 +468,24 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet( - class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -737,8 +494,8 @@ SCENARIO( { const std::string func_name = ".method8"; const std::string func_descriptor = - ":(LGenericClassWithGenericInnerClasses" - "$GenericInnerClass$DoublyNestedInnerGenericClass;)V"; + ":(LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerGenericClass;)V"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -747,39 +504,21 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), - symbol_typet( - class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -797,39 +536,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of the correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -847,38 +569,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of the correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Var, + class_prefix + "::T"}}); } } THEN( @@ -896,37 +602,19 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); - - THEN("The pointer should be generic") + THEN("The inputs should be of the correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -935,8 +623,7 @@ SCENARIO( { const std::string func_name = ".ret_method1"; const std::string func_descriptor = - ":()" - "LGenericClassWithGenericInnerClasses$InnerClass;"; + ":()LGenericClassWithGenericInnerClasses$InnerClass;"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -945,21 +632,16 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 1); - require_type::require_pointer( - function_call.return_type(), symbol_typet(class_prefix + "$InnerClass")); - - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$InnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -977,32 +659,19 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet(class_prefix + "$GenericInnerClass")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$GenericInnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -1020,31 +689,17 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 1); - require_type::require_pointer( - function_call.return_type(), - symbol_typet(class_prefix + "$GenericInnerClass")); - - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$GenericInnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -1053,8 +708,8 @@ SCENARIO( { const std::string func_name = ".ret_method4"; const std::string func_descriptor = - ":()LGenericClassWithGenericInner" - "Classes$GenericInnerClass$DoublyNestedInnerClass;"; + ":()LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerClass;"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -1063,32 +718,20 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -1097,8 +740,8 @@ SCENARIO( { const std::string func_name = ".ret_method5"; const std::string func_descriptor = - ":()LGenericClassWithGenericInner" - "Classes$GenericInnerClass$DoublyNestedInnerClass;"; + ":()LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerClass;"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -1107,31 +750,18 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet(class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -1140,8 +770,8 @@ SCENARIO( { const std::string func_name = ".ret_method6"; const std::string func_descriptor = - ":()LGenericClassWithGenericInner" - "Classes$GenericInnerClass$DoublyNestedInnerGenericClass;"; + ":()LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerGenericClass;"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -1150,40 +780,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 1); - require_type::require_pointer( - function_call.return_type(), - symbol_typet( - class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); - - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_inst_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -1192,8 +804,8 @@ SCENARIO( { const std::string func_name = ".ret_method7"; const std::string func_descriptor = - ":()LGenericClassWithGenericInner" - "Classes$GenericInnerClass$DoublyNestedInnerGenericClass;"; + ":()LGenericClassWithGenericInnerClasses$" + "GenericInnerClass$DoublyNestedInnerGenericClass;"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -1202,38 +814,19 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet( - class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet( + class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN( @@ -1242,8 +835,8 @@ SCENARIO( { const std::string func_name = ".ret_method8"; const std::string func_descriptor = - ":()LGenericClassWithGenericInner" - "Classes$TwoParamInnerClass;"; + ":()LGenericClassWithGenericInnerClasses$" + "TwoParamInnerClass;"; const std::string process_func_name = class_prefix + func_name + func_descriptor; @@ -1252,39 +845,21 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 1); - require_type::require_pointer( - function_call.return_type(), - symbol_typet(class_prefix + "$TwoParamInnerClass")); - - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); } } THEN( @@ -1302,38 +877,21 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}, + {require_type::type_parameter_kindt::Var, + class_prefix + "::T"}}); } } THEN( @@ -1351,37 +909,18 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), - symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type should be correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 3); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } - { - const java_generic_parametert &generic_param = generic_variables[2]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param.type_variable() == symbol_typet(class_prefix + "::T")); - } + require_type::require_pointer( + function_call.return_type(), + symbol_typet(class_prefix + "$TwoParamInnerClass")); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp index 04c2dcb2eae..cbe8b51f88b 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp @@ -7,14 +7,6 @@ \*******************************************************************/ #include - -#include -#include -#include -#include - -#include - #include #include @@ -40,25 +32,20 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } @@ -76,25 +63,20 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -118,25 +100,20 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -160,25 +137,20 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -202,25 +174,20 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -244,46 +211,35 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = + require_type::require_code(func_symbol.type, 2); THEN("It contains parameter t pointing to Generic") { - code_typet::parametert param_t = + const code_typet::parametert ¶m_t = require_type::require_parameter(func_code, "t"); require_type::require_pointer( param_t.type(), symbol_typet("java::Generic")); THEN("t is generic with type variable T") { - REQUIRE(is_java_generic_type(param_t.type())); - - const java_generic_typet generic_t = - to_java_generic_type(param_t.type()); - const java_generic_parametert generic_param_t = - generic_t.generic_type_variables().front(); - REQUIRE( - generic_param_t.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_t.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN("It contains parameter u pointing to Generic") { - code_typet::parametert param_u = + const code_typet::parametert ¶m_u = require_type::require_parameter(func_code, "u"); require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); THEN("u is generic with type variable U") { - REQUIRE(is_java_generic_type(param_u.type())); - - const java_generic_typet generic_u = - to_java_generic_type(param_u.type()); - const java_generic_parametert generic_param_u = - generic_u.generic_type_variables().front(); - REQUIRE( - generic_param_u.type_variable().get_identifier() == - class_prefix + "::U"); + require_type::require_java_generic_type( + param_u.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::U"}}); } } } @@ -301,26 +257,22 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = + require_type::require_code(func_symbol.type, 2); THEN("It contains parameter t pointing to Generic") { - code_typet::parametert param_t = + const code_typet::parametert ¶m_t = require_type::require_parameter(func_code, "t"); require_type::require_pointer( param_t.type(), symbol_typet("java::Generic")); THEN("t is generic with type variable T") { - REQUIRE(is_java_generic_type(param_t.type())); - - const java_generic_typet generic_t = - to_java_generic_type(param_t.type()); - const java_generic_parametert generic_param_t = - generic_t.generic_type_variables().front(); - REQUIRE( - generic_param_t.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_t.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); + THEN("The bounds are set correctly") { // TODO: the bounds are not parsed yet; extend the tests when @@ -330,22 +282,17 @@ SCENARIO( } THEN("It contains parameter u pointing to Generic") { - code_typet::parametert param_u = + const code_typet::parametert ¶m_u = require_type::require_parameter(func_code, "u"); require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); THEN("u is generic with type variable U") { - REQUIRE(is_java_generic_type(param_u.type())); - - const java_generic_typet generic_u = - to_java_generic_type(param_u.type()); - const java_generic_parametert generic_param_u = - generic_u.generic_type_variables().front(); - REQUIRE( - generic_param_u.type_variable().get_identifier() == - class_prefix + "::U"); + require_type::require_java_generic_type( + param_u.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::U"}}); + THEN("The bounds are set correctly") { // TODO: the bounds are not parsed yet; extend the tests when @@ -369,24 +316,18 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 0); THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } @@ -405,24 +346,20 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 0); // TODO: should point to something else than Object?? - possibly - // connecte dto bounds - issue TG-1286 + // connected to bounds - issue TG-1286 THEN("It has return type pointing to java.lang.Object") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::java.lang.Object")); + func_code.return_type(), symbol_typet("java::java.lang.Object")); THEN("It is the generic parameter T") { - REQUIRE(is_java_generic_parameter(return_type)); - - const java_generic_parametert generic_return_param = - to_java_generic_parameter(return_type); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_parameter( + func_code.return_type(), + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}); } } } @@ -440,24 +377,17 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = to_code_type(func_symbol.type); THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -481,24 +411,18 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 0); THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -522,24 +446,18 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 0); THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -563,24 +481,18 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 0); THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -605,47 +517,34 @@ SCENARIO( const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } @@ -663,26 +562,21 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -694,22 +588,14 @@ SCENARIO( THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -733,26 +619,21 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -764,22 +645,14 @@ SCENARIO( THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -803,26 +676,21 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -834,22 +702,14 @@ SCENARIO( THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -874,26 +734,21 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter x pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_x = + const code_typet::parametert ¶m_x = require_type::require_parameter(func_code, "x"); require_type::require_pointer( param_x.type(), symbol_typet("java::Generic")); THEN("x is generic with type variable T") { - REQUIRE(is_java_generic_type(param_x.type())); - - const java_generic_typet generic_x = - to_java_generic_type(param_x.type()); - const java_generic_parametert generic_param_x = - generic_x.generic_type_variables().front(); - REQUIRE( - generic_param_x.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + param_x.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -905,22 +760,14 @@ SCENARIO( THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -944,48 +791,34 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter u pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_u = + const code_typet::parametert ¶m_u = require_type::require_parameter(func_code, "u"); require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); THEN("u is generic with type variable U") { - REQUIRE(is_java_generic_type(param_u.type())); - - const java_generic_typet generic_u = - to_java_generic_type(param_u.type()); - const java_generic_parametert generic_param_u = - generic_u.generic_type_variables().front(); - REQUIRE( - generic_param_u.type_variable().get_identifier() == - class_prefix + "::U"); + require_type::require_java_generic_type( + param_u.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::U"}}); } } THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } @@ -1003,27 +836,21 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = + require_type::require_code(func_symbol.type, 1); THEN("It contains parameter u pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - code_typet::parametert param_u = + const code_typet::parametert ¶m_u = require_type::require_parameter(func_code, "u"); require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); THEN("u is generic with type variable U") { - REQUIRE(is_java_generic_type(param_u.type())); - - const java_generic_typet generic_u = - to_java_generic_type(param_u.type()); - const java_generic_parametert generic_param_u = - generic_u.generic_type_variables().front(); - REQUIRE( - generic_param_u.type_variable().get_identifier() == - class_prefix + "::U"); + require_type::require_java_generic_type( + param_u.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::U"}}); THEN("The bounds are set correctly") { @@ -1035,22 +862,14 @@ SCENARIO( THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { @@ -1074,68 +893,49 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = + require_type::require_code(func_symbol.type, 2); THEN("It contains parameter u pointing to Generic") { - code_typet::parametert param_u = + const code_typet::parametert ¶m_u = require_type::require_parameter(func_code, "u"); require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); THEN("u is generic with type variable U") { - REQUIRE(is_java_generic_type(param_u.type())); - - const java_generic_typet generic_u = - to_java_generic_type(param_u.type()); - const java_generic_parametert generic_param_u = - generic_u.generic_type_variables().front(); - REQUIRE( - generic_param_u.type_variable().get_identifier() == - class_prefix + "::U"); + require_type::require_java_generic_type( + param_u.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::U"}}); } } THEN("It contains parameter v pointing to Generic") { - code_typet::parametert param_v = + const code_typet::parametert ¶m_v = require_type::require_parameter(func_code, "v"); require_type::require_pointer( param_v.type(), symbol_typet("java::Generic")); THEN("v is generic with type variable V") { - REQUIRE(is_java_generic_type(param_v.type())); - - const java_generic_typet generic_v = - to_java_generic_type(param_v.type()); - const java_generic_parametert generic_param_v = - generic_v.generic_type_variables().front(); - REQUIRE( - generic_param_v.type_variable().get_identifier() == - class_prefix + "::V"); + require_type::require_java_generic_type( + param_v.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::V"}}); } } THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); } } } @@ -1153,26 +953,21 @@ SCENARIO( REQUIRE(new_symbol_table.has_symbol(process_func_name)); const symbolt func_symbol = new_symbol_table.lookup_ref(process_func_name); - const code_typet func_code = to_code_type(func_symbol.type); + const code_typet func_code = + require_type::require_code(func_symbol.type, 2); THEN("It contains parameter u pointing to Generic") { - code_typet::parametert param_u = + const code_typet::parametert ¶m_u = require_type::require_parameter(func_code, "u"); require_type::require_pointer( param_u.type(), symbol_typet("java::Generic")); THEN("u is generic with type variable U") { - REQUIRE(is_java_generic_type(param_u.type())); - - const java_generic_typet generic_u = - to_java_generic_type(param_u.type()); - const java_generic_parametert generic_param_u = - generic_u.generic_type_variables().front(); - REQUIRE( - generic_param_u.type_variable().get_identifier() == - class_prefix + "::U"); + require_type::require_java_generic_type( + param_u.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::U"}}); THEN("The bounds are set correctly") { @@ -1184,22 +979,16 @@ SCENARIO( THEN("It contains parameter v pointing to Generic") { - code_typet::parametert param_v = + const code_typet::parametert ¶m_v = require_type::require_parameter(func_code, "v"); require_type::require_pointer( param_v.type(), symbol_typet("java::Generic")); THEN("v is generic with type variable V") { - REQUIRE(is_java_generic_type(param_v.type())); - - const java_generic_typet generic_v = - to_java_generic_type(param_v.type()); - const java_generic_parametert generic_param_v = - generic_v.generic_type_variables().front(); - REQUIRE( - generic_param_v.type_variable().get_identifier() == - class_prefix + "::V"); + require_type::require_java_generic_type( + param_v.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::V"}}); THEN("The bounds are set correctly") { @@ -1211,22 +1000,14 @@ SCENARIO( THEN("It has return type pointing to Generic") { - const code_typet func_code = to_code_type(func_symbol.type); - const typet return_type = func_code.return_type(); require_type::require_pointer( - return_type, symbol_typet("java::Generic")); + func_code.return_type(), symbol_typet("java::Generic")); THEN("It is generic with type variable T") { - REQUIRE(is_java_generic_type(return_type)); - - const java_generic_typet generic_return_type = - to_java_generic_type(return_type); - const java_generic_parametert generic_return_param = - generic_return_type.generic_type_variables().front(); - REQUIRE( - generic_return_param.type_variable().get_identifier() == - class_prefix + "::T"); + require_type::require_java_generic_type( + func_code.return_type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); THEN("The bounds are set correctly") { diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp index b4a43566db3..6dba3792baf 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp @@ -18,46 +18,48 @@ SCENARIO( "parse_generic_wildcard", "[core][java_bytecode][java_bytecode_parse_generics]") { - const symbol_tablet &new_symbol_table= - load_java_class( - "WildcardGenericFunctions", - "./java_bytecode/java_bytecode_parse_generics"); + const symbol_tablet &new_symbol_table = load_java_class( + "WildcardGenericFunctions", "./java_bytecode/java_bytecode_parse_generics"); - std::string class_prefix="java::WildcardGenericFunctions"; + std::string class_prefix = "java::WildcardGenericFunctions"; THEN("There should be a symbol for processSimpleGeneric") { - const std::string func_name=".processSimpleGeneric"; + const std::string func_name = ".processSimpleGeneric"; const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); } THEN("There should be a symbol for processUpperBoundInterfaceGeneric") { - const std::string func_name=".processUpperBoundInterfaceGeneric"; + const std::string func_name = ".processUpperBoundInterfaceGeneric"; const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); } THEN("There should be a symbol for processUpperBoundClassGeneric") { - const std::string func_name=".processUpperBoundClassGeneric"; + const std::string func_name = ".processUpperBoundClassGeneric"; const std::string func_descriptor = ":(LGeneric;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); } THEN("There should be a symbol for processLowerBoundGeneric") { - const std::string func_name=".processLowerBoundGeneric"; + const std::string func_name = ".processLowerBoundGeneric"; const std::string func_descriptor = ":(LGeneric;LInterface_Implementation;)V"; - const std::string process_func_name=class_prefix+func_name+func_descriptor; + const std::string process_func_name = + class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp index 820b5d6f412..17441a81dd9 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_nested_generics.cpp @@ -8,17 +8,8 @@ #include #include -#include #include -#include -#include -#include -#include -#include - -#include - SCENARIO( "parse_nested_generics_fields", "[core][java_bytecode][java_bytecode_parse_generics]") @@ -33,29 +24,21 @@ SCENARIO( const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); const class_typet &class_type = - require_symbol::require_complete_class(class_symbol); + require_type::require_java_non_generic_class(class_symbol.type); THEN("The field component should be a pointer to java::Generic") { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field"); - require_type::require_pointer( field_component.type(), symbol_typet("java::Generic")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -65,23 +48,15 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field2"); - require_type::require_pointer( field_component.type(), symbol_typet("java::Generic")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -91,23 +66,15 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field3"); - require_type::require_pointer( field_component.type(), symbol_typet("java::Generic")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -117,23 +84,15 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field4"); - require_type::require_pointer( field_component.type(), symbol_typet("java::Generic")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -143,23 +102,16 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field5"); - require_type::require_pointer( field_component.type(), symbol_typet("java::Generic")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::GenericTwoParam"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -169,23 +121,16 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field6"); - require_type::require_pointer( field_component.type(), symbol_typet("java::Generic")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::GenericTwoParam"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -195,23 +140,15 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field7"); - require_type::require_pointer( field_component.type(), symbol_typet("java::Generic")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::GenericTwoParam"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -221,30 +158,15 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field8"); - require_type::require_pointer( field_component.type(), symbol_typet("java::GenericTwoParam")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -254,30 +176,15 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field9"); - require_type::require_pointer( field_component.type(), symbol_typet("java::GenericTwoParam")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -287,30 +194,16 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field10"); - require_type::require_pointer( field_component.type(), symbol_typet("java::GenericTwoParam")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -320,30 +213,18 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field11"); - require_type::require_pointer( field_component.type(), symbol_typet("java::GenericTwoParam")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, + "java::Generic"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -353,30 +234,18 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field12"); - require_type::require_pointer( field_component.type(), symbol_typet("java::GenericTwoParam")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, + "java::Generic"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -386,30 +255,16 @@ SCENARIO( { const struct_typet::componentt &field_component = require_type::require_component(class_type, "field13"); - require_type::require_pointer( field_component.type(), symbol_typet("java::GenericTwoParam")); THEN("The pointer should be generic") { - REQUIRE(is_java_generic_type(field_component.type())); - const auto &generic_variables = - to_java_generic_type(field_component.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::GenericTwoParam"))); - } - { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE(is_java_generic_parameter(generic_param)); - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_java_generic_type( + field_component.type(), + {{require_type::type_parameter_kindt::Inst, "java::GenericTwoParam"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - // issue TG-1301 } @@ -438,25 +293,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::Generic")); - - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -472,25 +325,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of oorrect type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -506,25 +357,24 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -540,25 +390,24 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::Generic")); - - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -574,25 +423,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs are of correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -608,25 +457,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -642,25 +491,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -676,33 +525,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericTwoParam")); - - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -718,33 +559,24 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericTwoParam")); - - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -760,33 +592,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericTwoParam")); - - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -802,33 +626,27 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericTwoParam")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, + "java::Generic"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -844,33 +662,27 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericTwoParam")); + require_type::require_code(function_symbol.type, 2); - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, + "java::Generic"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -886,33 +698,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 2); - const auto param_type = - require_type::require_parameter(function_call, "input"); - require_type::require_pointer( - param_type.type(), symbol_typet("java::GenericTwoParam")); - - THEN("The pointer should be generic") + THEN("The inputs have correct type") { - REQUIRE(is_java_generic_type(param_type.type())); - const auto &generic_variables = - to_java_generic_type(param_type.type()).generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - } + const auto ¶m_type = + require_type::require_parameter(function_call, "input"); + require_type::require_pointer( + param_type.type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + param_type.type(), + {{require_type::type_parameter_kindt::Inst, "java::GenericTwoParam"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -928,24 +732,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -961,24 +763,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -994,24 +794,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 1); - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::Generic")); - - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -1027,24 +825,22 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 1); - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::Generic")); - - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -1060,24 +856,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -1093,24 +888,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -1126,24 +920,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::Generic")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 1); - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::Generic")); + + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 + } } } @@ -1159,32 +952,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); + require_type::require_code(function_symbol.type, 1); - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::GenericTwoParam")); - - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -1200,32 +984,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::GenericTwoParam")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -1241,32 +1016,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::GenericTwoParam")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -1282,32 +1048,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::GenericTwoParam")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, + "java::Generic"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -1323,32 +1082,25 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::GenericTwoParam")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); - } + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == java_generic_inst_parametert( - symbol_typet("java::Interface_Implementation"))); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, + "java::Generic"}, + {require_type::type_parameter_kindt::Inst, + "java::Interface_Implementation"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } @@ -1364,32 +1116,23 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet &function_call = - require_type::require_code(function_symbol.type); - - require_type::require_pointer( - function_call.return_type(), symbol_typet("java::GenericTwoParam")); + require_type::require_code(function_symbol.type, 1); - THEN("The pointer should be generic") + THEN("The return type is correct") { - REQUIRE(is_java_generic_type(function_call.return_type())); - const auto &generic_variables = - to_java_generic_type(function_call.return_type()) - .generic_type_variables(); - REQUIRE(generic_variables.size() == 2); - { - const java_generic_parametert &generic_param = generic_variables[0]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::GenericTwoParam"))); - } + require_type::require_pointer( + function_call.return_type(), symbol_typet("java::GenericTwoParam")); + + THEN("The pointer should be generic") { - const java_generic_parametert &generic_param = generic_variables[1]; - REQUIRE( - generic_param == - java_generic_inst_parametert(symbol_typet("java::Generic"))); + require_type::require_java_generic_type( + function_call.return_type(), + {{require_type::type_parameter_kindt::Inst, "java::GenericTwoParam"}, + {require_type::type_parameter_kindt::Inst, "java::Generic"}}); + + // TODO: extend tests when nested generics are parsed correctly - issue + // TG-1301 } - // TODO: extend tests when nested generics are parsed correctly - issue - // TG-1301 } } } diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp index 30c87045412..a9e888bb800 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_recursive_generic_class.cpp @@ -9,21 +9,15 @@ #include #include -#include -#include - -#include -#include - SCENARIO( "parse_recursive_generic_class", "[core][java_bytecode][java_bytecode_parse_generics]") { - const symbol_tablet &new_symbol_table= - load_java_class("RecursiveGeneric", "" - "./java_bytecode/java_bytecode_parse_generics"); + const symbol_tablet &new_symbol_table = load_java_class( + "RecursiveGeneric", + "./java_bytecode/java_bytecode_parse_generics"); - std::string class_prefix="java::RecursiveGeneric"; + std::string class_prefix = "java::RecursiveGeneric"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp index 82186f2ddaf..cb6b6289502 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_signature_descriptor_mismatch.cpp @@ -8,13 +8,7 @@ #include #include -#include - -#include - -#include -#include -#include +#include SCENARIO( "parse_signature_descriptor_mismatch", @@ -27,30 +21,30 @@ SCENARIO( const std::string class_prefix = "java::SignatureDescriptorMismatch"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); - const std::string inner_prefix=class_prefix+"$Inner"; + const std::string inner_prefix = class_prefix + "$Inner"; THEN("There is a (complete) symbol for the inner class Inner") { REQUIRE(new_symbol_table.has_symbol(inner_prefix)); - const symbolt &inner_symbol=new_symbol_table.lookup_ref(inner_prefix); - const class_typet &inner_class_type= - require_symbol::require_complete_class(inner_symbol); + const symbolt &inner_symbol = new_symbol_table.lookup_ref(inner_prefix); + const class_typet &inner_class_type = + require_type::require_java_non_generic_class(inner_symbol.type); } THEN( "There is a symbol for the constructor of the class Inner with " "the correct number of parameters") { - const std::string func_name="."; + const std::string func_name = "."; const std::string func_descriptor = ":(LSignatureDescriptorMismatch;LAbstractGeneric;)V"; - const std::string process_func_name= - inner_prefix+func_name+func_descriptor; + const std::string process_func_name = + inner_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const code_typet func_code= + const code_typet func_code = to_code_type(new_symbol_table.lookup_ref(process_func_name).type); - REQUIRE(func_code.parameters().size()==3); + REQUIRE(func_code.parameters().size() == 3); // TODO: for now, the parameters are not generic because we fall back to // descriptor due to mismatch; enable tests when fixed - issue TG-1309 @@ -62,30 +56,30 @@ SCENARIO( // REQUIRE(is_java_generic_type(param_t.type())); } - const std::string inner_enum_prefix=class_prefix+"$InnerEnum"; + const std::string inner_enum_prefix = class_prefix + "$InnerEnum"; THEN("There is a (complete) symbol for the inner enum InnerEnum") { REQUIRE(new_symbol_table.has_symbol(inner_enum_prefix)); - const symbolt &inner_enum_symbol= + const symbolt &inner_enum_symbol = new_symbol_table.lookup_ref(inner_enum_prefix); - const class_typet &inner_enum_class_type= - require_symbol::require_complete_class(inner_enum_symbol); + const class_typet &inner_enum_class_type = + require_type::require_java_non_generic_class(inner_enum_symbol.type); } THEN( "There is a symbol for the constructor of the inner enum with the " "correct number of parameters") { - const std::string func_name="."; - const std::string func_descriptor=":(Ljava/lang/String;I)V"; - const std::string process_func_name= - inner_enum_prefix+func_name+func_descriptor; + const std::string func_name = "."; + const std::string func_descriptor = ":(Ljava/lang/String;I)V"; + const std::string process_func_name = + inner_enum_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); - const code_typet func_code= + const code_typet func_code = to_code_type(new_symbol_table.lookup_ref(process_func_name).type); - REQUIRE(func_code.parameters().size()==3); + REQUIRE(func_code.parameters().size() == 3); // TODO: for now, the parameters are not generic because we fall back to // descriptor due to mismatch; enable tests when fixed - issue TG-1309 From 1fa8e2f52c9b4db149f3e4b44e8f635e5a5cf1af Mon Sep 17 00:00:00 2001 From: svorenova Date: Thu, 2 Nov 2017 10:12:21 +0000 Subject: [PATCH 18/22] Adding unit test for generic fields --- .../GenericFields.class | Bin 0 -> 1120 bytes .../GenericFields.java | 17 ++ .../parse_generic_fields.cpp | 225 ++++++++++++++++++ 3 files changed, 242 insertions(+) create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericFields.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/GenericFields.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp diff --git a/unit/java_bytecode/java_bytecode_parse_generics/GenericFields.class b/unit/java_bytecode/java_bytecode_parse_generics/GenericFields.class new file mode 100644 index 0000000000000000000000000000000000000000..cef61ff3cc65ebb472e798781a2ca89d28d1841b GIT binary patch literal 1120 zcma)*YflqF7=_Q<0+n*F3gQLuPVs_hRn$!rLxPbsYO))?Z_Bg}DOxfhu8Ci!^SpEByl1AfzkZ*c18Cq;6=iHy@SuW+0_h5Btz-AAyWMxa-uB1# zvFZeG1k<+ed2TTDm7wf6tdzP>S#G^kp7M2vh56Ck;(9YuJQJ*?Rm1kZ7pR`{6IDa7 znyC`Q*d(@jE@+GkvPzaWGj1m4F9b^?rSom@$@Se6W=k86YGJ=L_sf3??8J3fQ2*Q2 zDmY;3_^N0FR}1!pXD)Ylo(OjTr-k8Q2fp@tQA8T-2oA;#a@RYy?AXPL!c0?^_H@u> zxXt>ZU}A4@#K*AE(w_P-JZUT6aoc@XYOO)X?H{_n4ml}K1fTV3s80ItYt=tGrR#ED z{r$^m$4Xur{Xg;bTbA?MICb(y?Sfi!Tqda6gQ4G1`#K7n%kwyVNwZkPx?nE1B3R5` zS= { + public T f; + + public Generic f2; + public Generic f3; + + public Generic> f4; + public Generic>> f5; + + public GenericTwoParam f6; + public GenericTwoParam f7; + public GenericTwoParam f8; + public GenericTwoParam f9; + public GenericTwoParam f10; + + public GenericTwoParam, GenericTwoParam> f11; +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp new file mode 100644 index 00000000000..847d91f801a --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp @@ -0,0 +1,225 @@ +/*******************************************************************\ + + Module: Unit tests for parsing generic classes + + Author: DiffBlue Limited. All rights reserved. + +\*******************************************************************/ + +#include +#include +#include +#include + +#include + +#include +#include +#include + +SCENARIO( + "parse_generic_fields", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "GenericFields", "./java_bytecode/java_bytecode_parse_generics"); + + std::string class_prefix = "java::GenericFields"; + + WHEN("Parsing the class with generic fields") + { + THEN("There is a generic class symbol GenericField") + { + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + + const symbolt &class_symbol = new_symbol_table.lookup_ref(class_prefix); + const java_generics_class_typet &java_generics_class_type = + require_type::require_java_generic_class( + class_symbol.type, {class_prefix + "::T", class_prefix + "::S"}); + + const struct_typet class_struct = to_struct_type(class_symbol.type); + + THEN("It has field f of type T") + { + const struct_union_typet::componentt &field = + require_type::require_component(class_struct, "f"); + require_type::require_java_generic_parameter( + field.type(), + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}); + } + + THEN("It has field f2 pointing to Generic") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f2"); + require_type::require_pointer( + field.type(), symbol_typet("java::Generic")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); + } + } + + THEN("It has field f3 pointing to Generic") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f3"); + require_type::require_pointer( + field.type(), symbol_typet("java::Generic")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java" + ".lang.Integer"}}); + } + } + + THEN("It has field f3 pointing to Generic") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f3"); + require_type::require_pointer( + field.type(), symbol_typet("java::Generic")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java" + ".lang.Integer"}}); + } + } + + THEN("It has field f4 pointing to Generic") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f4"); + require_type::require_pointer( + field.type(), symbol_typet("java::Generic")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO extend when nested generics are parsed correctly - TG-1301 + } + } + + THEN("It has field f5 pointing to Generic") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f5"); + require_type::require_pointer( + field.type(), symbol_typet("java::Generic")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}}); + // TODO extend when nested generics are parsed correctly - TG-1301 + } + } + + THEN("It has field f6 pointing to GenericTwoParam") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f6"); + require_type::require_pointer( + field.type(), symbol_typet("java::GenericTwoParam")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); + } + } + + THEN("It has field f7 pointing to GenericTwoParam") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f7"); + require_type::require_pointer( + field.type(), symbol_typet("java::GenericTwoParam")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::S"}}); + } + } + + THEN("It has field f8 pointing to GenericTwoParam") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f8"); + require_type::require_pointer( + field.type(), symbol_typet("java::GenericTwoParam")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}, + {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); + } + } + + THEN("It has field f9 pointing to GenericTwoParam") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f9"); + require_type::require_pointer( + field.type(), symbol_typet("java::GenericTwoParam")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {require_type::type_parameter_kindt::Inst, + "java::java.lang" + ".Integer"}}); + } + } + + THEN("It has field f10 pointing to GenericTwoParam") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f10"); + require_type::require_pointer( + field.type(), symbol_typet("java::GenericTwoParam")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Inst, + "java::java.lang.Integer"}, + {require_type::type_parameter_kindt::Inst, + "java::java.lang.String"}}); + } + } + + THEN("It has field f11 pointing to GenericTwoParam") + { + const struct_typet::componentt &field = + require_type::require_component(class_struct, "f11"); + require_type::require_pointer( + field.type(), symbol_typet("java::GenericTwoParam")); + THEN("The pointer should be generic") + { + require_type::require_java_generic_type( + field.type(), + {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {require_type::type_parameter_kindt::Inst, + "java::GenericTwoParam"}}); + // TODO extend when nested generics are parsed correctly - TG-1301 + } + } + } + } +} From f5ec45aab38f4960377fad4e5a4a2acb30c613c1 Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 3 Nov 2017 14:36:13 +0000 Subject: [PATCH 19/22] Adding JIRA tickets cont. --- .../parse_bounded_generic_inner_classes.cpp | 6 +++--- .../parse_generic_functions.cpp | 2 -- .../parse_generic_wildcard_function.cpp | 9 ++++----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp index a4f724d07e1..c50a16b7e71 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp @@ -64,7 +64,7 @@ SCENARIO( require_type::require_java_generic_class( class_symbol.type, {boundedinner_name + "::NUM"}); - //TODO extend when bounds are parsed correctly - TG-1286 + // TODO extend when bounds are parsed correctly - TG-1286 THEN("The fields are of correct types") { @@ -103,7 +103,7 @@ SCENARIO( require_type::require_java_generic_class( class_symbol.type, {doubleboundedinner_name + "::T"}); - //TODO extend when bounds are parsed correctly - TG-1286 + // TODO extend when bounds are parsed correctly - TG-1286 THEN("The fields are of correct types") { @@ -133,7 +133,7 @@ SCENARIO( class_symbol.type, {twoelementinner_name + "::K", twoelementinner_name + "::V"}); - //TODO extend when bounds are parsed correctly - TG-1286 + // TODO extend when bounds are parsed correctly - TG-1286 THEN("The fields are of correct types") { diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp index cbe8b51f88b..e4818e7639a 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_functions.cpp @@ -348,8 +348,6 @@ SCENARIO( new_symbol_table.lookup_ref(process_func_name); const code_typet func_code = require_type::require_code(func_symbol.type, 0); - // TODO: should point to something else than Object?? - possibly - // connected to bounds - issue TG-1286 THEN("It has return type pointing to java.lang.Object") { require_type::require_pointer( diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp index 6dba3792baf..bf4c0a66578 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_wildcard_function.cpp @@ -9,11 +9,6 @@ #include #include -#include -#include - -#include - SCENARIO( "parse_generic_wildcard", "[core][java_bytecode][java_bytecode_parse_generics]") @@ -31,6 +26,7 @@ SCENARIO( class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); + // TODO extend tests when wildcards are parsed correctly - TG-675 } THEN("There should be a symbol for processUpperBoundInterfaceGeneric") @@ -41,6 +37,7 @@ SCENARIO( class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); + // TODO extend tests when wildcards are parsed correctly - TG-675 } THEN("There should be a symbol for processUpperBoundClassGeneric") @@ -51,6 +48,7 @@ SCENARIO( class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); + // TODO extend tests when wildcards are parsed correctly - TG-675 } THEN("There should be a symbol for processLowerBoundGeneric") @@ -62,5 +60,6 @@ SCENARIO( class_prefix + func_name + func_descriptor; REQUIRE(new_symbol_table.has_symbol(process_func_name)); + // TODO extend tests when wildcards are parsed correctly - TG-675 } } From e3019f22ab6e56f461761dd5047d4569284f8034 Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 3 Nov 2017 12:03:05 +0000 Subject: [PATCH 20/22] Extending test for derived generics --- .../DerivedGeneric.class | Bin 318 -> 0 bytes .../DerivedGeneric.java | 4 -- .../DerivedGenericInst.class | Bin 0 -> 330 bytes .../DerivedGenericInst.java | 4 ++ .../DerivedGenericUninst.class | Bin 0 -> 408 bytes .../DerivedGenericUninst.java | 4 ++ .../parse_derived_generic_class.cpp | 41 +++++++++++++----- 7 files changed, 37 insertions(+), 16 deletions(-) delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/DerivedGeneric.class delete mode 100644 unit/java_bytecode/java_bytecode_parse_generics/DerivedGeneric.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericInst.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericInst.java create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericUninst.class create mode 100644 unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericUninst.java diff --git a/unit/java_bytecode/java_bytecode_parse_generics/DerivedGeneric.class b/unit/java_bytecode/java_bytecode_parse_generics/DerivedGeneric.class deleted file mode 100644 index ff3766d716e4179c02e20d6a3ac732c150fe59f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmY+9O-{ow5QX2gX+qP`KQ6!q3A&&gcCESrfht*Sin>K^I)G8)RL1GOSRt|C02~T2 zNwcY?nfLt7kLBOL?;ij+7{_R15MdZ$Llrd(xXs z$XFGr&eqzQ>fXS>znKrhP~EXJd)_{<6_d^g-IaN@+Lum7FI2YCIW(Y)xUTo=oZz(9{y!FdMHc`7 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/DerivedGeneric.java b/unit/java_bytecode/java_bytecode_parse_generics/DerivedGeneric.java deleted file mode 100644 index 8200e5de72e..00000000000 --- a/unit/java_bytecode/java_bytecode_parse_generics/DerivedGeneric.java +++ /dev/null @@ -1,4 +0,0 @@ -class DerivedGeneric extends Generic -{ - -} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericInst.class b/unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericInst.class new file mode 100644 index 0000000000000000000000000000000000000000..f5a72b7d0a53047cca6ec461c1a51b33562ba53a GIT binary patch literal 330 zcmZWku};G<6uj4_2@QclRf&}a2^e5uYt^L{D3Zle)D^ku1B?;}xlaF!38@1gz(*lo zLbh7+yYt;UKl|r*_YL3`Wjh_;_msd+dFe}$g7${@;u_{*Vp7bgg zWvI$b=S%HOeQw3TznKkTq~`3*me&t#g=DGS_%WfsFt1ko%1Qh}wcbRf*0X!j89%4R zN6rOXue~Ylcq*BAQC2SFdsELm+rReaU2k=Q06lrqzD +{ + +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericUninst.class b/unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericUninst.class new file mode 100644 index 0000000000000000000000000000000000000000..437daa77f9ca9ff80d8734bf6712ab22a4fe0e74 GIT binary patch literal 408 zcmZutu};G<5PfdagoZ$&R7i-0fdLrk!bGA-2n0(6Lqm5bwTi3YAUCPRXE9akzz6VA zh;vAXO0nd7@1F17o&58={swS^p$7|xE(R`+7@SZlSw;-j#pQ&-zAvVNp&v^no~!p% z=!B;^DTBDkcs}7;n!FM1@=Y!nj^hWR>$ipC23JX{#elk{}{m zZ!BkumzAcu=V5Xi&-s#%a;|2hmvk<&GKk`4)W+hCi%MtWQJP&(+Sa)?O?=qsG7Q@a z7~G~Q&d{MhGKbM63!y{oj?gIGs}tL^r`{>tr F@CQXSUEu%# literal 0 HcmV?d00001 diff --git a/unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericUninst.java b/unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericUninst.java new file mode 100644 index 00000000000..88dcb1c9250 --- /dev/null +++ b/unit/java_bytecode/java_bytecode_parse_generics/DerivedGenericUninst.java @@ -0,0 +1,4 @@ +class DerivedGenericUninst extends Generic +{ + +} diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp index 106f1e230f1..2c4b698879d 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_derived_generic_class.cpp @@ -8,30 +8,47 @@ #include #include - -#include -#include -#include -#include +#include SCENARIO( - "parse_derived_generic_class", + "parse_derived_generic_class_inst", "[core][java_bytecode][java_bytecode_parse_generics]") { const symbol_tablet &new_symbol_table = load_java_class( - "DerivedGeneric", "./java_bytecode/java_bytecode_parse_generics"); + "DerivedGenericInst", "./java_bytecode/java_bytecode_parse_generics"); - THEN("There should be a symbol for the DerivedGeneric class") + THEN("There should be a symbol for the DerivedGenericInst class") { - std::string class_prefix = "java::DerivedGeneric"; + std::string class_prefix = "java::DerivedGenericInst"; REQUIRE(new_symbol_table.has_symbol(class_prefix)); const symbolt &derived_symbol = new_symbol_table.lookup_ref(class_prefix); - derived_symbol.show(std::cout); const class_typet &derived_class_type = - require_symbol::require_complete_class(derived_symbol); + require_type::require_java_non_generic_class(derived_symbol.type); + + // TODO: Currently we do not support extracting information + // about the base classes generic information - issue TG-1287 + } +} + +SCENARIO( + "parse_derived_generic_class_uninst", + "[core][java_bytecode][java_bytecode_parse_generics]") +{ + const symbol_tablet &new_symbol_table = load_java_class( + "DerivedGenericUninst", "./java_bytecode/java_bytecode_parse_generics"); + + THEN("There should be a symbol for the DerivedGenericUninst class") + { + std::string class_prefix = "java::DerivedGenericUninst"; + REQUIRE(new_symbol_table.has_symbol(class_prefix)); + + const symbolt &derived_symbol = new_symbol_table.lookup_ref(class_prefix); + const java_generics_class_typet &derived_class_type = + require_type::require_java_generic_class( + derived_symbol.type, {class_prefix + "::T"}); - // TODO(tkiley): Currently we do not support extracting information + // TODO: Currently we do not support extracting information // about the base classes generic information - issue TG-1287 } } From 03438bb7bf125ae93e19c276d3a2a94091d5e448 Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 3 Nov 2017 12:03:32 +0000 Subject: [PATCH 21/22] Disabling part of unit test due to a bug --- .../parse_bounded_generic_inner_classes.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp index c50a16b7e71..8e0111869c9 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_bounded_generic_inner_classes.cpp @@ -10,10 +10,6 @@ #include #include -#include -#include -#include - SCENARIO( "parse_bounded_generic_inner_classes", "[core][java_bytecode][java_bytecode_parse_generics]") @@ -99,9 +95,10 @@ SCENARIO( { const symbolt &class_symbol = new_symbol_table.lookup_ref(doubleboundedinner_name); - const java_generics_class_typet &java_generics_class_type = - require_type::require_java_generic_class( - class_symbol.type, {doubleboundedinner_name + "::T"}); + // TODO the symbol should be generic - TG-1349 + // const java_generics_class_typet &java_generics_class_type = + // require_type::require_java_generic_class( + // class_symbol.type, {doubleboundedinner_name + "::T"}); // TODO extend when bounds are parsed correctly - TG-1286 From 51cbfc93ee67c4615787615f7e6ac1c76144969e Mon Sep 17 00:00:00 2001 From: svorenova Date: Fri, 3 Nov 2017 14:30:21 +0000 Subject: [PATCH 22/22] Deleting a utility function for generics There is a new one in require_type with the same functionality --- .../parse_generic_fields.cpp | 29 +++++++------------ unit/testing-utils/Makefile | 1 - unit/testing-utils/require_symbol.cpp | 29 ------------------- unit/testing-utils/require_symbol.h | 25 ---------------- 4 files changed, 11 insertions(+), 73 deletions(-) delete mode 100644 unit/testing-utils/require_symbol.cpp delete mode 100644 unit/testing-utils/require_symbol.h diff --git a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp index 847d91f801a..d1108be3952 100644 --- a/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp +++ b/unit/java_bytecode/java_bytecode_parse_generics/parse_generic_fields.cpp @@ -8,15 +8,8 @@ #include #include -#include #include -#include - -#include -#include -#include - SCENARIO( "parse_generic_fields", "[core][java_bytecode][java_bytecode_parse_generics]") @@ -73,8 +66,7 @@ SCENARIO( require_type::require_java_generic_type( field.type(), {{require_type::type_parameter_kindt::Inst, - "java::java" - ".lang.Integer"}}); + "java::java.lang.Integer"}}); } } @@ -89,8 +81,7 @@ SCENARIO( require_type::require_java_generic_type( field.type(), {{require_type::type_parameter_kindt::Inst, - "java::java" - ".lang.Integer"}}); + "java::java.lang.Integer"}}); } } @@ -165,8 +156,9 @@ SCENARIO( require_type::require_java_generic_type( field.type(), {{require_type::type_parameter_kindt::Inst, - "java::java.lang.Integer"}, - {require_type::type_parameter_kindt::Var, class_prefix + "::T"}}); + "java::java.lang.Integer"}, + {require_type::type_parameter_kindt::Var, + class_prefix + "::T"}}); } } @@ -180,10 +172,10 @@ SCENARIO( { require_type::require_java_generic_type( field.type(), - {{require_type::type_parameter_kindt::Var, class_prefix + "::T"}, + {{require_type::type_parameter_kindt::Var, + class_prefix + "::T"}, {require_type::type_parameter_kindt::Inst, - "java::java.lang" - ".Integer"}}); + "java::java.lang.Integer"}}); } } @@ -214,9 +206,10 @@ SCENARIO( { require_type::require_java_generic_type( field.type(), - {{require_type::type_parameter_kindt::Inst, "java::Generic"}, + {{require_type::type_parameter_kindt::Inst, + "java::Generic"}, {require_type::type_parameter_kindt::Inst, - "java::GenericTwoParam"}}); + "java::GenericTwoParam"}}); // TODO extend when nested generics are parsed correctly - TG-1301 } } diff --git a/unit/testing-utils/Makefile b/unit/testing-utils/Makefile index f211e7eb832..45ccd69ec7b 100644 --- a/unit/testing-utils/Makefile +++ b/unit/testing-utils/Makefile @@ -3,7 +3,6 @@ SRC = \ load_java_class.cpp \ require_expr.cpp \ require_goto_statements.cpp \ - require_symbol.cpp \ require_type.cpp \ # Empty last line (please keep above list sorted!) diff --git a/unit/testing-utils/require_symbol.cpp b/unit/testing-utils/require_symbol.cpp deleted file mode 100644 index e291017c5cc..00000000000 --- a/unit/testing-utils/require_symbol.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/*******************************************************************\ - - Module: Unit test utilities - - Author: DiffBlue Limited. All rights reserved. - -\*******************************************************************/ - -/// \file -/// Helper functions for requiring properties of symbols - -#include "require_symbol.h" - -#include - -const class_typet &require_symbol::require_complete_class( - const symbolt &class_symbol) -{ - REQUIRE(class_symbol.is_type); - - const typet &class_symbol_type=class_symbol.type; - REQUIRE(class_symbol_type.id()==ID_struct); - - const class_typet &class_class_type=to_class_type(class_symbol_type); - REQUIRE(class_class_type.is_class()); - REQUIRE_FALSE(class_class_type.get_bool(ID_incomplete_class)); - - return class_class_type; -} diff --git a/unit/testing-utils/require_symbol.h b/unit/testing-utils/require_symbol.h deleted file mode 100644 index c8d1e636e65..00000000000 --- a/unit/testing-utils/require_symbol.h +++ /dev/null @@ -1,25 +0,0 @@ -/*******************************************************************\ - - Module: Unit test utilities - - Author: DiffBlue Limited. All rights reserved. - -\*******************************************************************/ - -/// \file -/// Helper functions for requiring properties of symbols - -#include -#include - -#ifndef CPROVER_TESTING_UTILS_REQUIRE_SYMBOL_H -#define CPROVER_TESTING_UTILS_REQUIRE_SYMBOL_H - -// NOLINTNEXTLINE(readability/namespace) -namespace require_symbol -{ - const class_typet &require_complete_class( - const symbolt &class_symbol); -} - -#endif // CPROVER_TESTING_UTILS_REQUIRE_SYMBOL_H