Skip to content

Incremental compilation issue when Java/Scala define the same class name, case-insensitive #1553

@kubukoz

Description

@kubukoz

steps

  1. Set up a simple project (complete repro here) with two modules where one depends on the other, e.g.
val runtime = project

val tests = project
  .dependsOn(runtime)

val root = project.in(file(".")).aggregate(runtime, tests)
  1. Create a class/interface with the same name in both Java and Scala, differing by case sensitivity, in the runtime module
Image
  1. Try to refer to the Java one in the other module, from Java:
package com.demo.tests;
import com.demo.Middleware;

public class Demo {
    public static void main(String[] args) {
        Middleware mid = new Middleware() {
        };
    }
}
  1. Hit compile:
[info] compiling 1 Java source to /Users/kubukoz/projects/zinc-hashes-repro/tests/target/scala-2.12/classes ...
[error] /Users/kubukoz/projects/zinc-hashes-repro/tests/src/main/java/com/demo/tests/Demo.java:2:16: cannot find symbol
[error]   symbol:   class Middleware
[error]   location: package com.demo
[error] com.demo.Middleware
[error]                ^
[error] /Users/kubukoz/projects/zinc-hashes-repro/tests/src/main/java/com/demo/tests/Demo.java:6:9: cannot find symbol
[error]   symbol:   class Middleware
[error]   location: class com.demo.tests.Demo
[error] Middleware
[error]         ^
[error] /Users/kubukoz/projects/zinc-hashes-repro/tests/src/main/java/com/demo/tests/Demo.java:6:30: cannot find symbol
[error]   symbol:   class Middleware
[error]   location: class com.demo.tests.Demo
[error] Middleware
[error]           ^
[error] (tests / Compile / compileIncremental) javac returned non-zero exit code

problem

  1. The above error is confusing
  2. After renaming one of the interfaces, the error doesn't go away until you run clean

expectation

  1. A better error in the first place (this is likely a scalac/javac problem, I'm afraid)
  2. clean should not be necessary to proceed after renaming one of the interfaces

notes

  • I'm on macOS, which AFAIK uses a case-insensitive APFS file system by default.
  • Saw similar results in Bloop and across Scala versions, which is why I thought Zinc was involved.
  • I've also seen these, but I haven't managed to reproduce in an isolated scenario and I can't share the project due to NDAs:
[info] compiling 23 Scala sources and 41 Java sources to <redacted>/classes ...
[error] ## Exception when compiling 64 sources to <redacted>/classes
[error] java.lang.RuntimeException: Failed to find name hashes for <redacted>.Middleware
[error] scala.sys.package$.error(package.scala:30)
[error] sbt.internal.inc.AnalysisCallback.nameHashesForCompanions(Incremental.scala:1003)
[error] sbt.internal.inc.AnalysisCallback.analyzeClass(Incremental.scala:1010)
[error] sbt.internal.inc.AnalysisCallback.$anonfun$addProductsAndDeps$4(Incremental.scala:1033)
[error] scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
[error] scala.collection.mutable.HashSet.foreach(HashSet.scala:79)
[error] scala.collection.TraversableLike.map(TraversableLike.scala:286)
[error] scala.collection.TraversableLike.map$(TraversableLike.scala:279)
[error] scala.collection.mutable.AbstractSet.scala$collection$SetLike$$super$map(Set.scala:50)
[error] scala.collection.SetLike.map(SetLike.scala:105)
[error] scala.collection.SetLike.map$(SetLike.scala:105)
[error] scala.collection.mutable.AbstractSet.map(Set.scala:50)
[error] sbt.internal.inc.AnalysisCallback.$anonfun$addProductsAndDeps$1(Incremental.scala:1033)
[error] scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:196)
[error] scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:194)
[error] scala.collection.Iterator.foreach(Iterator.scala:943)
[error] scala.collection.Iterator.foreach$(Iterator.scala:943)
[error] scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
[error] scala.collection.IterableLike.foreach(IterableLike.scala:74)
[error] scala.collection.IterableLike.foreach$(IterableLike.scala:73)
[error] scala.collection.AbstractIterable.foreach(Iterable.scala:56)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions