From b2b5af281d618bdd0a1f8b3a278b8fd17abdd719 Mon Sep 17 00:00:00 2001 From: Tom Grigg Date: Mon, 1 Feb 2021 21:55:08 -0800 Subject: [PATCH 1/4] Compactify names when flattening, to limit length of classfile names This is intended to replicate the behavior of Scala 2.13, where classfile names are limited to 240 characters. --- compiler/src/dotty/tools/dotc/core/SymDenotations.scala | 3 ++- tests/{pending => }/run/t8199.scala | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) rename tests/{pending => }/run/t8199.scala (98%) diff --git a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala index 09f826c1b154..4635a13fe91d 100644 --- a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala @@ -480,7 +480,8 @@ object SymDenotations { // duplicate scalac's behavior: don't write a double '$$' for module class members. prefix = prefix.exclude(ModuleClassName) def qualify(n: SimpleName) = - kind(prefix.toTermName, if (filler.isEmpty) n else termName(filler + n)) + val qn = kind(prefix.toTermName, if (filler.isEmpty) n else termName(filler + n)) + if kind == FlatName then qn.compactified else qn val fn = name replace { case name: SimpleName => qualify(name) case name @ AnyQualifiedName(_, _) => qualify(name.mangled.toSimpleName) diff --git a/tests/pending/run/t8199.scala b/tests/run/t8199.scala similarity index 98% rename from tests/pending/run/t8199.scala rename to tests/run/t8199.scala index afd417ffd23f..ffd847ef3787 100644 --- a/tests/pending/run/t8199.scala +++ b/tests/run/t8199.scala @@ -44,7 +44,6 @@ object Test extends App { } def checkCallerImplClassName(): Unit = { val name = Thread.currentThread.getStackTrace.apply(2).getClassName - assert(name.contains("$class")) Test.checkClassName(name) } From c00fbc626ccbd63094857bffb98fba38b925852e Mon Sep 17 00:00:00 2001 From: Tom Grigg Date: Wed, 3 Feb 2021 10:52:12 -0800 Subject: [PATCH 2/4] Add scala2-compat test --- .../scala2-compat/longnames/build.sbt | 9 ++++ .../scala2-compat/longnames/lib/lib.scala | 35 ++++++++++++++++ .../scala2-compat/longnames/main/test.scala | 41 +++++++++++++++++++ .../longnames/project/plugins.sbt | 1 + .../sbt-test/scala2-compat/longnames/test | 1 + 5 files changed, 87 insertions(+) create mode 100644 sbt-dotty/sbt-test/scala2-compat/longnames/build.sbt create mode 100644 sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala create mode 100644 sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala create mode 100644 sbt-dotty/sbt-test/scala2-compat/longnames/project/plugins.sbt create mode 100644 sbt-dotty/sbt-test/scala2-compat/longnames/test diff --git a/sbt-dotty/sbt-test/scala2-compat/longnames/build.sbt b/sbt-dotty/sbt-test/scala2-compat/longnames/build.sbt new file mode 100644 index 000000000000..67bfb8edb65f --- /dev/null +++ b/sbt-dotty/sbt-test/scala2-compat/longnames/build.sbt @@ -0,0 +1,9 @@ +val scala3Version = sys.props("plugin.scalaVersion") +val scala2Version = "2.13.4" + +lazy val lib = (project in file ("lib")) + .settings(scalaVersion := scala2Version) + +lazy val test = (project in file ("main")) + .dependsOn(lib) + .settings(scalaVersion := scala3Version) diff --git a/sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala b/sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala new file mode 100644 index 000000000000..878fe63858a1 --- /dev/null +++ b/sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala @@ -0,0 +1,35 @@ +class reallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongname { + object obj0 + object obj01 + object obj012 + object obj0123 + object obj01234 + object obj012345 + object obj0123456 + object obj01234567 + object obj012345678 + object obj0123456789 + object obj01234567890 + class cls0 + class cls01 + class cls012 + class cls0123 + class cls01234 + class cls012345 + class cls0123456 + class cls01234567 + class cls012345678 + class cls0123456789 + class cls01234567890 + trait trt0 + trait trt01 + trait trt012 + trait trt0123 + trait trt01234 + trait trt012345 + trait trt0123456 + trait trt01234567 + trait trt012345678 + trait trt0123456789 + trait trt01234567890 +} diff --git a/sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala b/sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala new file mode 100644 index 000000000000..71038f0050af --- /dev/null +++ b/sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala @@ -0,0 +1,41 @@ +object Test extends App { + val c = new reallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongname + + import c._ + + val o0 = obj0 + val o1 = obj01 + val o2 = obj012 + val o3 = obj0123 + val o4 = obj01234 + val o5 = obj012345 + val o6 = obj0123456 + val o7 = obj01234567 + val o8 = obj012345678 + val o9 = obj0123456789 + val o10 = obj01234567890 + + val c0 = new cls0 + val c1 = new cls01 + val c2 = new cls012 + val c3 = new cls0123 + val c4 = new cls01234 + val c5 = new cls012345 + val c6 = new cls0123456 + val c7 = new cls01234567 + val c8 = new cls012345678 + val c9 = new cls0123456789 + val c10 = new cls01234567890 + + val t0 = new trt0 {} + val t1 = new trt01 {} + val t2 = new trt012 {} + val t3 = new trt0123 {} + val t4 = new trt01234 {} + val t5 = new trt012345 {} + val t6 = new trt0123456 {} + val t7 = new trt01234567 {} + val t8 = new trt012345678 {} + val t9 = new trt0123456789 {} + val t10 = new trt01234567890 {} +} diff --git a/sbt-dotty/sbt-test/scala2-compat/longnames/project/plugins.sbt b/sbt-dotty/sbt-test/scala2-compat/longnames/project/plugins.sbt new file mode 100644 index 000000000000..c17caab2d98c --- /dev/null +++ b/sbt-dotty/sbt-test/scala2-compat/longnames/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % sys.props("plugin.version")) diff --git a/sbt-dotty/sbt-test/scala2-compat/longnames/test b/sbt-dotty/sbt-test/scala2-compat/longnames/test new file mode 100644 index 000000000000..8aedcd64cf5b --- /dev/null +++ b/sbt-dotty/sbt-test/scala2-compat/longnames/test @@ -0,0 +1 @@ +> test/run From 0d6a57c8efd8ced37d3feff3ee8e837741a04473 Mon Sep 17 00:00:00 2001 From: Tom Grigg Date: Wed, 3 Feb 2021 14:18:19 -0800 Subject: [PATCH 3/4] Don't compactify Java inner class names --- compiler/src/dotty/tools/dotc/core/SymDenotations.scala | 2 +- tests/run/java-longnames/Long_1.java | 6 ++++++ tests/run/java-longnames/Test_2.scala | 9 +++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 tests/run/java-longnames/Long_1.java create mode 100644 tests/run/java-longnames/Test_2.scala diff --git a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala index 4635a13fe91d..2a6df10a76de 100644 --- a/compiler/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/compiler/src/dotty/tools/dotc/core/SymDenotations.scala @@ -481,7 +481,7 @@ object SymDenotations { prefix = prefix.exclude(ModuleClassName) def qualify(n: SimpleName) = val qn = kind(prefix.toTermName, if (filler.isEmpty) n else termName(filler + n)) - if kind == FlatName then qn.compactified else qn + if kind == FlatName && !encl.is(JavaDefined) then qn.compactified else qn val fn = name replace { case name: SimpleName => qualify(name) case name @ AnyQualifiedName(_, _) => qualify(name.mangled.toSimpleName) diff --git a/tests/run/java-longnames/Long_1.java b/tests/run/java-longnames/Long_1.java new file mode 100644 index 000000000000..7c449a489358 --- /dev/null +++ b/tests/run/java-longnames/Long_1.java @@ -0,0 +1,6 @@ +package p; + +public class Long_1 { + public static class ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ_1 { + } +} diff --git a/tests/run/java-longnames/Test_2.scala b/tests/run/java-longnames/Test_2.scala new file mode 100644 index 000000000000..b03954825173 --- /dev/null +++ b/tests/run/java-longnames/Test_2.scala @@ -0,0 +1,9 @@ +import p._ + +object Test extends App { + println( + new Long_1.ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ_1() + .getClass + .getName + ) +} From 2352b0a4ee3c359b4743884d4399773d2f25f10a Mon Sep 17 00:00:00 2001 From: Tom Grigg Date: Wed, 3 Feb 2021 18:11:31 -0800 Subject: [PATCH 4/4] Keep the length of class file names in tests within Docker/aufs limits --- sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala | 2 +- sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala b/sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala index 878fe63858a1..00a14043278b 100644 --- a/sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala +++ b/sbt-dotty/sbt-test/scala2-compat/longnames/lib/lib.scala @@ -1,4 +1,4 @@ -class reallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongname { +class reallongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongname { object obj0 object obj01 object obj012 diff --git a/sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala b/sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala index 71038f0050af..4a5ee58a8125 100644 --- a/sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala +++ b/sbt-dotty/sbt-test/scala2-compat/longnames/main/test.scala @@ -1,5 +1,5 @@ object Test extends App { - val c = new reallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongname + val c = new reallongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongnamereallylongname import c._