Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zinc reports incorrect class file names #1233

Closed
vasilmkd opened this issue Aug 7, 2023 · 7 comments · Fixed by #1244 or #1259
Closed

Zinc reports incorrect class file names #1233

vasilmkd opened this issue Aug 7, 2023 · 7 comments · Fixed by #1244 or #1259
Assignees

Comments

@vasilmkd
Copy link
Contributor

vasilmkd commented Aug 7, 2023

Steps

git clone git@github.com:vasilmkd/zinc-wrong-class-names.git
cd zinc-wrong-class-names
sbt "clean; show compileOutputs"

Warning: The compilation can take 35+ seconds to complete. Check the note at the end of this post.

The output should look similar to the following, modulo local machine paths. Only the names of the .class files are important.

vasil@Vasil-JetBrains zinc-wrong-class-names % sbt "clean; show compileOutputs"
[info] welcome to sbt 1.9.3 (Eclipse Adoptium Java 17.0.8)
[info] loading global plugins from /Users/vasil/.sbt/1.0/plugins
[info] loading project definition from /Users/vasil/IdeaProjects/zinc-wrong-class-names/project
[info] loading settings for project zinc-wrong-class-names from build.sbt ...
[info] set current project to zinc-wrong-class-names (in build file:/Users/vasil/IdeaProjects/zinc-wrong-class-names/)
[success] Total time: 0 s, completed Aug 7, 2023, 5:47:03 PM
[info] compiling 1 Scala source to /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes ...
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$OuterLevelWithVeryVeryVeryLongClassName17$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$OuterLevelWithVeryVeryVeryLongClassName17$OuterLevelWithVeryVeryVeryLongClassName18$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$OuterLevelWithVeryVeryVeryLongClassName17$OuterLevelWithVeryVeryVeryLongClassName18$OuterLevelWithVeryVeryVeryLongClassName19$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$OuterLevelWithVeryVeryVeryLongClassName17$OuterLevelWithVeryVeryVeryLongClassName18$OuterLevelWithVeryVeryVeryLongClassName19$OuterLevelWithVeryVeryVeryLongClassName20$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$OuterLevelWithVeryVeryVeryLongClassName17$OuterLevelWithVeryVeryVeryLongClassName18$OuterLevelWithVeryVeryVeryLongClassName19$OuterLevelWithVeryVeryVeryLongClassName20$MalformedNameExample$.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$OuterLevelWithVeryVeryVeryLongClassName17$OuterLevelWithVeryVeryVeryLongClassName18$OuterLevelWithVeryVeryVeryLongClassName19$OuterLevelWithVeryVeryVeryLongClassName20$MalformedNameExample.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/classes/OuterLevelWithVeryVeryVeryLongClassName1.class
[info] * /Users/vasil/IdeaProjects/zinc-wrong-class-names/target/scala-2.13/zinc/inc_compile_2.13.zip
[success] Total time: 35 s, completed Aug 7, 2023, 5:47:38 PM

Problem

These names would never be generated by the scalac compiler, because they are too long for the local file systems and can cause exceptions when opened for reading in a JVM process. They exceed 255 characters in length.

cd target/scala-2.13/classes
ls

These are the actual .class files generated by scalac.

OuterLevelWithVeryVeryVeryLongClassName1$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$21cd1be25088dedb16ca1b3c346466fb$$$$eryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$21cd1be25088dedb16ca1b3c346466fb$$$$eryLongClassName7$OuterLevelWithVeryVeryVeryLongClassName8$OuterLevelWithVeryVeryVeryLongClassName9$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$361c0db7030df22c21772c193d391$$$$yLongClassName19$OuterLevelWithVeryVeryVeryLongClassName20$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$361c0db7030df22c21772c193d391$$$$yLongClassName19$OuterLevelWithVeryVeryVeryLongClassName20$MalformedNameExample$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$361c0db7030df22c21772c193d391$$$$yLongClassName19$OuterLevelWithVeryVeryVeryLongClassName20$MalformedNameExample.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$7e70169f8f612a14697f8fd52119750$$$$yLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$7e70169f8f612a14697f8fd52119750$$$$yLongClassName15$OuterLevelWithVeryVeryVeryLongClassName16$OuterLevelWithVeryVeryVeryLongClassName17$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$973a10bc1cd9792c988bf49bee47b56$$$$ryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$973a10bc1cd9792c988bf49bee47b56$$$$ryLongClassName9$OuterLevelWithVeryVeryVeryLongClassName10$OuterLevelWithVeryVeryVeryLongClassName11$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$9a7e92c93110f2442b3ebd9c453788$$$$yLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$9a7e92c93110f2442b3ebd9c453788$$$$yLongClassName11$OuterLevelWithVeryVeryVeryLongClassName12$OuterLevelWithVeryVeryVeryLongClassName13$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$9f428b41847a5866a8323f5944a36d$$$$yLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$9f428b41847a5866a8323f5944a36d$$$$yLongClassName13$OuterLevelWithVeryVeryVeryLongClassName14$OuterLevelWithVeryVeryVeryLongClassName15$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$d292b257125352e68f2f62fd843b554$$$$yLongClassName17$OuterLevelWithVeryVeryVeryLongClassName18$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$d292b257125352e68f2f62fd843b554$$$$yLongClassName17$OuterLevelWithVeryVeryVeryLongClassName18$OuterLevelWithVeryVeryVeryLongClassName19$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$f1136b7659b86ea0804013acf91cbef$$$$eryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVer$$$$f1136b7659b86ea0804013acf91cbef$$$$eryLongClassName5$OuterLevelWithVeryVeryVeryLongClassName6$OuterLevelWithVeryVeryVeryLongClassName7$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$.class
OuterLevelWithVeryVeryVeryLongClassName1$OuterLevelWithVeryVeryVeryLongClassName2$OuterLevelWithVeryVeryVeryLongClassName3$OuterLevelWithVeryVeryVeryLongClassName4$OuterLevelWithVeryVeryVeryLongClassName5$.class
OuterLevelWithVeryVeryVeryLongClassName1.class

These names come from https://github.com/scala/scala/blob/98a42345385cc8adccde36c21f3192d4b4862087/src/reflect/scala/reflect/internal/StdNames.scala#L49-L86.

Expectation

The compileOutputs reported by Zinc should match the actual class files generated by scalac.

In IntelliJ IDEA, this problem manifests as part of our compilation pipeline which uses Zinc.
https://youtrack.jetbrains.com/issue/SCL-21477/File-name-too-long-error-when-building-projects-like-Apache-Spark

This is a pretty serious issue. I would appreciate any help in diagnosing it.

Notes

On a side note, the compilation of the single Scala source file main.scala takes 35+ seconds and cannot be canceled with ctrl+C. This seems excessive, since most of the definitions are empty object definitions.

@vasilmkd
Copy link
Contributor Author

When compiling the same project using Scala 3.3.0, compileOutputs produces the correct class file names that match the class files on the file system.

@vasilmkd
Copy link
Contributor Author

In xsbt.API#registerGeneratedClasses:

  /**
   * Registers only non-local generated classes in the callback by extracting
   * information about its names and using the names to generate class file paths.
   *
   * Mimics the previous logic that was present in `Analyzer`, despite the fact
   * that now we construct the names that the compiler will give to every non-local
   * class independently of genbcode.
   *
   * Why do we do this? The motivation is that we want to run the incremental algorithm
   * independently of the compiler pipeline. This independence enables us to:
   *
   * 1. Offload the incremental compiler logic out of the primary pipeline and
   *    run the incremental phases concurrently.
   * 2. Know before the compilation is completed whether another compilation will or
   *    will not be required. This is important to make incremental compilation work
   *    with pipelining and enables further optimizations; for example, we can start
   *    subsequent incremental compilations before (!) the initial compilation is done.
   *    This can buy us ~30-40% faster incremental compiler iterations.
   *
   * This method only takes care of non-local classes because local classes have no
   * relevance in the correctness of the algorithm and can be registered after genbcode.
   * Local classes are only used to construct the relations of products and to produce
   * the list of generated files + stamps, but names referring to local classes **never**
   * show up in the name hashes of classes' APIs, hence never considered for name hashing.
   *
   * As local class files are owned by other classes that change whenever they change,
   * we could most likely live without adding their class files to the products relation
   * and registering their stamps. However, to be on the safe side, we will continue to
   * register the local products in `Analyzer`.
   *
   * @param allClassSymbols The class symbols found in all the compilation units.
   */
def registerGeneratedClasses(classSymbols: Iterator[Symbol]): Unit = ...

@vasilmkd
Copy link
Contributor Author

In xsbt.ZincCompiler#fullName:

  /**
   * Replicate the behaviour of `fullName` with a few changes to the code to produce
   * correct file-system compatible full names for non-local classes. It mimics the
   * paths of the class files produced by genbcode.
   *
   * Changes compared to the normal version in the compiler:
   *
   * 1. It will use the encoded name instead of the normal n2. It will not skip the name of the package object class (required for the class file path).
   *
   * Note that using `javaBinaryName` is not useful for these symbols because we
   * need the encoded names. Zinc keeps track of encoded names in both the binary
   * names and the Zinc names.
   *
   * @param symbol The symbol for which we extract the full name.
   * @param separator The separator that we will apply between every name.
   * @param suffix The suffix to add at the end (in case it's a module).
   * @param includePackageObjectClassNames Include package object class names or not.
   * @return The full name.
   */
  override def fullName(
      symbol: Symbol,
      separator: Char,
      suffix: CharSequence,
      includePackageObjectClassNames: Boolean
  ): String = ...

@SethTisue
Copy link
Member

(because #1256 reverted #1244, for those who haven't been following along)

@unkarjedy
Copy link
Contributor

Thanks for everyone looking into this.
@SethTisue thanks for testing 1.9.5 on the community build

Does anyone know if there is going to be a second attempt at approaching this issue?
Is it known what should be done to fix it and avoid scala/bug#12868?

@SethTisue
Copy link
Member

Dale and Lukas were working on it today, so they'll probably have something before too much longer.

@dwijnand
Copy link
Member

Yep, working on it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
5 participants