{"id":16875176,"url":"https://github.com/retronym/scalac-stability","last_synced_at":"2026-04-12T22:37:12.632Z","repository":{"id":66735794,"uuid":"116898768","full_name":"retronym/scalac-stability","owner":"retronym","description":"Test cases for unstable output of Scalac","archived":false,"fork":false,"pushed_at":"2018-01-23T05:00:17.000Z","size":12,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-19T00:19:29.689Z","etag":null,"topics":["classfile","scala","scala-compiler","test-cases"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/retronym.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-10T02:46:10.000Z","updated_at":"2018-02-26T16:43:08.000Z","dependencies_parsed_at":"2023-02-20T20:01:15.156Z","dependency_job_id":null,"html_url":"https://github.com/retronym/scalac-stability","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/retronym/scalac-stability","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/retronym%2Fscalac-stability","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/retronym%2Fscalac-stability/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/retronym%2Fscalac-stability/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/retronym%2Fscalac-stability/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/retronym","download_url":"https://codeload.github.com/retronym/scalac-stability/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/retronym%2Fscalac-stability/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266952437,"owners_count":24011502,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-25T02:00:09.625Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["classfile","scala","scala-compiler","test-cases"],"created_at":"2024-10-13T15:35:20.232Z","updated_at":"2026-04-12T22:37:12.600Z","avatar_url":"https://github.com/retronym.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Unstable compiler output\n\nTest cases to show ways that a given Scala source file can produce inconsistent classfile depending on the order of source files.\n\n## Lambda lift\n\nType completion can change order of typechecking methods in a class, resulting in Symbol.ids. Lambda lift places symbols-to-be-renamed in a [tree set](https://github.com/scala/scala/blob/9acab45aeeadef2f63da69faf81465cc15599789/src/compiler/scala/tools/nsc/transform/LambdaLift.scala#L67-L74), ordered by `Symbol.isLess` (which for term symbols amounts to ordering by `Symbol.id`).\n\n[Test Case](lambdalift)\n```\n+ mkdir -p target1 target2\n+ scalac -d target1 -nowarn -Xprint:all a.scala b.scala\n+ egrep -v '\\.scala'\n+ scalac -d target2 -nowarn -Xprint:all b.scala a.scala\n+ egrep -v '\\.scala'\n+ diff -u /dev/fd/63 /dev/fd/62\n++ show target1 demo.a\n++ show target2 demo.a\n++ javap -cp target1 -private -v demo.a\n++ javap -cp target2 -private -v demo.a\n++ egrep -v 'Classfile|checksum'\n++ egrep -v 'Classfile|checksum'\n--- /dev/fd/63  2018-01-10 13:20:15.000000000 +1000\n+++ /dev/fd/62  2018-01-10 13:20:15.000000000 +1000\n@@ -18,10 +18,10 @@\n   #11 = Utf8               this\n   #12 = Utf8               Ldemo/a;\n   #13 = Utf8               y\n-  #14 = Utf8               local$1\n+  #14 = Utf8               local$2\n   #15 = Utf8               ()Ljava/lang/String;\n   #16 = String             #9             // x\n-  #17 = Utf8               local$2\n+  #17 = Utf8               local$1\n   #18 = String             #13            // y\n   #19 = Utf8               \u003cinit\u003e\n   #20 = NameAndType        #19:#10        // \"\u003cinit\u003e\":()V\n@@ -58,7 +58,7 @@\n       LineNumberTable:\n         line 9: 0\n\n-  private static final java.lang.String local$1();\n+  private static final java.lang.String local$2();\n     descriptor: ()Ljava/lang/String;\n     flags: ACC_PRIVATE, ACC_STATIC, ACC_FINAL\n     Code:\n@@ -68,7 +68,7 @@\n       LineNumberTable:\n         line 5: 0\n\n-  private static final java.lang.String local$2();\n+  private static final java.lang.String local$1();\n     descriptor: ()Ljava/lang/String;\n     flags: ACC_PRIVATE, ACC_STATIC, ACC_FINAL\n     Code:\n@@ -98,7 +98,7 @@\n   0: #6(#7=s#8)\n Error: unknown attribute\n   ScalaInlineInfo: length = 0x1D\n-   01 00 00 05 00 13 00 0A 00 00 0E 00 0F 01 00 11\n+   01 00 00 05 00 13 00 0A 00 00 11 00 0F 01 00 0E\n    00 0F 01 00 09 00 0A 00 00 0D 00 0A 00\n Error: unknown attribute\n   ScalaSig: length = 0x3\n\n```\n\n### Macro Fresh Names\n\nMacro fresh names for a given prefix are [globally numbered](https://github.com/scala/scala/blob/9acab45aeeadef2f63da69faf81465cc15599789/src/reflect/scala/reflect/internal/FreshNames.scala#L13-L15), rather than using a per-compilation unit counter. This is a symptomatic fix for hygiene problems described in https://github.com/scala/bug/issues/6879.\n\n[Test Case](macros)\n\n```\n+ mkdir -p target target1 target2\n+ scalac -d target -nowarn macro.scala\n+ scalac -cp target -d target1 -nowarn a.scala b.scala\n+ scalac -cp target -d target2 -nowarn b.scala a.scala\n+ diff -u /dev/fd/63 /dev/fd/62\n++ show target1 demo.a\n++ show target2 demo.a\n++ javap -cp target1 -v demo.a\n++ javap -cp target2 -v demo.a\n++ egrep -v 'Classfile|checksum'\n++ egrep -v 'Classfile|checksum'\n--- /dev/fd/63  2018-01-10 13:24:37.000000000 +1000\n+++ /dev/fd/62  2018-01-10 13:24:37.000000000 +1000\n@@ -21,7 +21,7 @@\n   #14 = Utf8               Lscala/runtime/BoxedUnit;\n   #15 = NameAndType        #13:#14        // UNIT:Lscala/runtime/BoxedUnit;\n   #16 = Fieldref           #12.#15        // scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;\n-  #17 = Utf8               foo$macro$1\n+  #17 = Utf8               foo$macro$2\n   #18 = Utf8               I\n   #19 = Utf8               this\n   #20 = Utf8               Ldemo/a;\n@@ -50,7 +50,7 @@\n          8: return\n       LocalVariableTable:\n         Start  Length  Slot  Name   Signature\n-            1       7     1 foo$macro$1   I\n+            1       7     1 foo$macro$2   I\n             0       9     0  this   Ldemo/a;\n       LineNumberTable:\n         line 5: 0\n```\n\n### Partial Function fresh names\n\nWhen the typer adapts a `{ case ... =\u003e ; ...}` to `FunctionN` or `PartialFunction`, it creates fresh names for synthetic parameters. Out-of-order typechecking via type completion will change the numbering.\n\nIn general, any fresh name allocated during typer has the same problem, such as:\n  - [during eta expansion](https://github.com/scala/scala/blob/9acab45aeeadef2f63da69faf81465cc15599789/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala#L43-L46)\n  - [names/defaults](https://github.com/scala/scala/blob/d50519255369bc5cee413cd6b4bc39f9c3b60be5/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala#L173) (also [in](https://github.com/scala/scala/blob/d50519255369bc5cee413cd6b4bc39f9c3b60be5/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala#L303))\n  - converting `qual._=` to [an assignment](https://github.com/scala/scala/blob/9f0718f006a323459802804ac5aa3041c6f65e76/src/compiler/scala/tools/nsc/typechecker/Typers.scala#L4765-L4817), which creates a fresh name in [`evalOnceAll`](https://github.com/scala/scala/blob/16379739e9efa2e48eac09d046e591355fa9eb2d/src/compiler/scala/tools/nsc/ast/TreeGen.scala#L225) and `evalOnce`.\n  - [Naming a local val](https://github.com/scala/scala/blob/c9d84a187a7d2f8fa486ec4902c8de28d7658e76/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala#L180) in synthetic equals method\n  - Naming [GADT skolems](https://github.com/scala/scala/blob/5197256b44f34fa50ed468954d0bfb3bc469477d/src/compiler/scala/tools/nsc/typechecker/PatternTypers.scala#L192), which I believe can end up in inferred types of APIs stored in the pickle.\n\n[Test Case](partial-fun) (for the `PartialFunction` case only)\n\n\n```\n⚡ ./test\n+ mkdir -p target1 target2\n+ scalac -d target1 -nowarn -Xprint:all a.scala b.scala\n+ egrep -v '\\.scala'\n+ scalac -d target2 -nowarn -Xprint:all b.scala a.scala\n+ egrep -v '\\.scala'\n+ diff -u /dev/fd/63 /dev/fd/62\n++ show target1\n++ show target2\n++ egrep -v 'Classfile|checksum'\n++ egrep -v 'Classfile|checksum'\n+++ find target1 -name '*anonfun*.class'\n+++ find target2 -name '*anonfun*.class'\n++ javap -cp target2 -private -v 'target2/demo/a$$anonfun$x$1.class' 'target2/demo/a$$anonfun$y$1.class'\n++ javap -cp target1 -private -v 'target1/demo/a$$anonfun$x$1.class' 'target1/demo/a$$anonfun$y$1.class'\n--- /dev/fd/63  2018-01-10 13:50:20.000000000 +1000\n+++ /dev/fd/62  2018-01-10 13:50:20.000000000 +1000\n@@ -23,7 +23,7 @@\n   #16 = Long               0l\n   #18 = Utf8               applyOrElse\n   #19 = Utf8               (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object;\n-  #20 = Utf8               x1\n+  #20 = Utf8               x2\n   #21 = Utf8               default\n   #22 = Utf8\n   #23 = String             #22            //\n@@ -97,7 +97,7 @@\n       LocalVariableTable:\n         Start  Length  Slot  Name   Signature\n             0      33     0  this   Ldemo/a$$anonfun$x$1;\n-            0      33     1    x1   Ljava/lang/Object;\n+            0      33     1    x2   Ljava/lang/Object;\n             0      33     2 default   Lscala/Function1;\n       LineNumberTable:\n         line 5: 0\n@@ -113,7 +113,7 @@\n     Signature: #57                          // \u003cA1:Ljava/lang/Object;B1:Ljava/lang/Object;\u003e(TA1;Lscala/Function1\u003cTA1;TB1;\u003e;)TB1;\n     MethodParameters:\n       Name                           Flags\n-      x1                             final\n+      x2                             final\n       default                        final\n\n   public final boolean isDefinedAt(java.lang.Object);\n@@ -138,7 +138,7 @@\n       LocalVariableTable:\n         Start  Length  Slot  Name   Signature\n             0      25     0  this   Ldemo/a$$anonfun$x$1;\n-            0      25     1    x1   Ljava/lang/Object;\n+            0      25     1    x2   Ljava/lang/Object;\n       LineNumberTable:\n         line 5: 0\n       StackMapTable: number_of_entries = 3\n@@ -152,7 +152,7 @@\n           stack = []\n     MethodParameters:\n       Name                           Flags\n-      x1                             final\n+      x2                             final\n\n   public demo.a$$anonfun$x$1(demo.a);\n     descriptor: (Ldemo/a;)V\n@@ -209,7 +209,7 @@\n   #16 = Long               0l\n   #18 = Utf8               applyOrElse\n   #19 = Utf8               (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object;\n-  #20 = Utf8               x2\n+  #20 = Utf8               x1\n   #21 = Utf8               default\n   #22 = Utf8\n   #23 = String             #22            //\n@@ -283,7 +283,7 @@\n       LocalVariableTable:\n         Start  Length  Slot  Name   Signature\n             0      33     0  this   Ldemo/a$$anonfun$y$1;\n-            0      33     1    x2   Ljava/lang/Object;\n+            0      33     1    x1   Ljava/lang/Object;\n             0      33     2 default   Lscala/Function1;\n       LineNumberTable:\n         line 8: 0\n@@ -299,7 +299,7 @@\n     Signature: #57                          // \u003cA1:Ljava/lang/Object;B1:Ljava/lang/Object;\u003e(TA1;Lscala/Function1\u003cTA1;TB1;\u003e;)TB1;\n     MethodParameters:\n       Name                           Flags\n-      x2                             final\n+      x1                             final\n       default                        final\n\n   public final boolean isDefinedAt(java.lang.Object);\n@@ -324,7 +324,7 @@\n       LocalVariableTable:\n         Start  Length  Slot  Name   Signature\n             0      25     0  this   Ldemo/a$$anonfun$y$1;\n-            0      25     1    x2   Ljava/lang/Object;\n+            0      25     1    x1   Ljava/lang/Object;\n       LineNumberTable:\n         line 8: 0\n       StackMapTable: number_of_entries = 3\n@@ -338,7 +338,7 @@\n           stack = []\n     MethodParameters:\n       Name                           Flags\n-      x2                             final\n+      x1                             final\n\n   public demo.a$$anonfun$y$1(demo.a);\n     descriptor: (Ldemo/a;)V\n```\n\n### Quasiquote / Reify macros\n\nThese macros use `currentFreshNameCreator`, which routes to `unit.fresh` in the compiler universe, and consequently\nshares the issues with typer fresh names being unstable in the face of out-of-order type checking.\n\n[Quasiquote Test case](macros-quasiquote)\n\n```\n⚡ ./test\n+ mkdir -p target1 target2\n+ scalac -d target1 -nowarn a.scala b.scala\n+ scalac -d target2 -nowarn b.scala a.scala\n+ diff -u /dev/fd/63 /dev/fd/62\n++ show target1 demo.a\n++ show target2 demo.a\n++ javap -cp target1 -v demo.a\n++ javap -cp target2 -v demo.a\n++ egrep -v 'Classfile|checksum'\n++ egrep -v 'Classfile|checksum'\n--- /dev/fd/63  2018-01-11 12:56:06.000000000 +1000\n+++ /dev/fd/62  2018-01-11 12:56:06.000000000 +1000\n@@ -16,15 +16,15 @@\n     #9 = Utf8               demo/a$$treecreator1$1\n    #10 = Class              #9            // demo/a$$treecreator1$1\n    #11 = Utf8               $treecreator1$1\n-   #12 = Utf8               demo/a$$treecreator2$1\n-   #13 = Class              #12           // demo/a$$treecreator2$1\n-   #14 = Utf8               $treecreator2$1\n+   #12 = Utf8               demo/a$$treecreator1$2\n+   #13 = Class              #12           // demo/a$$treecreator1$2\n+   #14 = Utf8               $treecreator1$2\n    #15 = Utf8               demo/a$$typecreator2$1\n    #16 = Class              #15           // demo/a$$typecreator2$1\n    #17 = Utf8               $typecreator2$1\n-   #18 = Utf8               demo/a$$typecreator4$1\n-   #19 = Class              #18           // demo/a$$typecreator4$1\n-   #20 = Utf8               $typecreator4$1\n+   #18 = Utf8               demo/a$$typecreator2$2\n+   #19 = Class              #18           // demo/a$$typecreator2$2\n+   #20 = Utf8               $typecreator2$2\n    #21 = Utf8               scala/reflect/api/Exprs$Expr\n    #22 = Class              #21           // scala/reflect/api/Exprs$Expr\n    #23 = Utf8               scala/reflect/api/Exprs\n@@ -70,11 +70,11 @@\n    #63 = Utf8               \u003cinit\u003e\n    #64 = Utf8               (Ldemo/a;)V\n    #65 = NameAndType        #63:#64       // \"\u003cinit\u003e\":(Ldemo/a;)V\n-   #66 = Methodref          #10.#65       // demo/a$$treecreator1$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+   #66 = Methodref          #13.#65       // demo/a$$treecreator1$2.\"\u003cinit\u003e\":(Ldemo/a;)V\n    #67 = Utf8               ()Lscala/reflect/api/TypeTags$TypeTag$;\n    #68 = NameAndType        #38:#67       // TypeTag:()Lscala/reflect/api/TypeTags$TypeTag$;\n    #69 = Methodref          #55.#68       // scala/reflect/macros/Universe.TypeTag:()Lscala/reflect/api/TypeTags$TypeTag$;\n-   #70 = Methodref          #16.#65       // demo/a$$typecreator2$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+   #70 = Methodref          #19.#65       // demo/a$$typecreator2$2.\"\u003cinit\u003e\":(Ldemo/a;)V\n    #71 = Utf8               apply\n    #72 = Utf8               (Lscala/reflect/api/Mirror;Lscala/reflect/api/TypeCreator;)Lscala/reflect/api/TypeTags$TypeTag;\n    #73 = NameAndType        #71:#72       // apply:(Lscala/reflect/api/Mirror;Lscala/reflect/api/TypeCreator;)Lscala/reflect/api/TypeTags$TypeTag;\n@@ -94,8 +94,8 @@\n    #87 = Utf8               Ldemo/a;\n    #88 = Utf8               Lscala/reflect/macros/blackbox/Context;\n    #89 = Utf8               y\n-   #90 = Methodref          #13.#65       // demo/a$$treecreator2$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n-   #91 = Methodref          #19.#65       // demo/a$$typecreator4$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+   #90 = Methodref          #10.#65       // demo/a$$treecreator1$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+   #91 = Methodref          #16.#65       // demo/a$$typecreator2$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n    #92 = Utf8               ()V\n    #93 = NameAndType        #63:#92       // \"\u003cinit\u003e\":()V\n    #94 = Methodref          #4.#93        // java/lang/Object.\"\u003cinit\u003e\":()V\n@@ -124,17 +124,17 @@\n         17: aload_2\n         18: invokevirtual #62                 // Method scala/reflect/macros/Universe.Expr:()Lscala/reflect/api/Exprs$Expr$;\n         21: aload_3\n-        22: new           #10                 // class demo/a$$treecreator1$1\n+        22: new           #13                 // class demo/a$$treecreator1$2\n         25: dup\n         26: aconst_null\n-        27: invokespecial #66                 // Method demo/a$$treecreator1$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+        27: invokespecial #66                 // Method demo/a$$treecreator1$2.\"\u003cinit\u003e\":(Ldemo/a;)V\n         30: aload_2\n         31: invokevirtual #69                 // Method scala/reflect/macros/Universe.TypeTag:()Lscala/reflect/api/TypeTags$TypeTag$;\n         34: aload_3\n-        35: new           #16                 // class demo/a$$typecreator2$1\n+        35: new           #19                 // class demo/a$$typecreator2$2\n         38: dup\n         39: aconst_null\n-        40: invokespecial #70                 // Method demo/a$$typecreator2$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+        40: invokespecial #70                 // Method demo/a$$typecreator2$2.\"\u003cinit\u003e\":(Ldemo/a;)V\n         43: invokevirtual #74                 // Method scala/reflect/api/TypeTags$TypeTag$.apply:(Lscala/reflect/api/Mirror;Lscala/reflect/api/TypeCreator;)Lscala/reflect/api/TypeTags$TypeTag;\n         46: invokevirtual #77                 // Method scala/reflect/api/Exprs$Expr$.apply:(Lscala/reflect/api/Mirror;Lscala/reflect/api/TreeCreator;Lscala/reflect/api/TypeTags$WeakTypeTag;)Lscala/reflect/api/Exprs$Expr;\n         49: invokeinterface #81,  1           // InterfaceMethod scala/reflect/api/Exprs$Expr.tree:()Lscala/reflect/api/Trees$TreeApi;\n@@ -166,17 +166,17 @@\n         17: aload_2\n         18: invokevirtual #62                 // Method scala/reflect/macros/Universe.Expr:()Lscala/reflect/api/Exprs$Expr$;\n         21: aload_3\n-        22: new           #13                 // class demo/a$$treecreator2$1\n+        22: new           #10                 // class demo/a$$treecreator1$1\n         25: dup\n         26: aconst_null\n-        27: invokespecial #90                 // Method demo/a$$treecreator2$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+        27: invokespecial #90                 // Method demo/a$$treecreator1$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n         30: aload_2\n         31: invokevirtual #69                 // Method scala/reflect/macros/Universe.TypeTag:()Lscala/reflect/api/TypeTags$TypeTag$;\n         34: aload_3\n-        35: new           #19                 // class demo/a$$typecreator4$1\n+        35: new           #16                 // class demo/a$$typecreator2$1\n         38: dup\n         39: aconst_null\n-        40: invokespecial #91                 // Method demo/a$$typecreator4$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n+        40: invokespecial #91                 // Method demo/a$$typecreator2$1.\"\u003cinit\u003e\":(Ldemo/a;)V\n         43: invokevirtual #74                 // Method scala/reflect/api/TypeTags$TypeTag$.apply:(Lscala/reflect/api/Mirror;Lscala/reflect/api/TypeCreator;)Lscala/reflect/api/TypeTags$TypeTag;\n         46: invokevirtual #77                 // Method scala/reflect/api/Exprs$Expr$.apply:(Lscala/reflect/api/Mirror;Lscala/reflect/api/TreeCreator;Lscala/reflect/api/TypeTags$WeakTypeTag;)Lscala/reflect/api/Exprs$Expr;\n         49: invokeinterface #81,  1           // InterfaceMethod scala/reflect/api/Exprs$Expr.tree:()Lscala/reflect/api/Trees$TreeApi;\n@@ -211,9 +211,9 @@\n SourceFile: \"a.scala\"\n InnerClasses:\n      public final #11= #10; //$treecreator1$1=class demo/a$$treecreator1$1\n-     public final #14= #13; //$treecreator2$1=class demo/a$$treecreator2$1\n+     public final #14= #13; //$treecreator1$2=class demo/a$$treecreator1$2\n      public final #17= #16; //$typecreator2$1=class demo/a$$typecreator2$1\n-     public final #20= #19; //$typecreator4$1=class demo/a$$typecreator4$1\n+     public final #20= #19; //$typecreator2$2=class demo/a$$typecreator2$2\n      public #25= #22 of #24; //Expr=class scala/reflect/api/Exprs$Expr of class scala/reflect/api/Exprs\n      public #28= #27 of #24; //Expr$=class scala/reflect/api/Exprs$Expr$ of class scala/reflect/api/Exprs\n      public #33= #30 of #32; //TreeApi=class scala/reflect/api/Trees$TreeApi of class scala/reflect/api/Trees\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fretronym%2Fscalac-stability","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fretronym%2Fscalac-stability","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fretronym%2Fscalac-stability/lists"}