Skip to content

Commit

Permalink
Adjust the API name entry for nested classes
Browse files Browse the repository at this point in the history
**Problem**
Some build pipelining tests fail on the latest sbt RC.

```
Error:  (sbt-test / scripted) Failed tests:
Error:  	pipelining/Yjava-tasty-fromjavaobject
Error:  	pipelining/Yjava-tasty-paths
```

This is likely caused by inconsistent capturing of APIs
from Java sources in ExtractAPI vs AnalyzingJavaCompiler in Zinc.

**Solution**
This adjusts the API name entry for Java nested classes.
  • Loading branch information
eed3si9n committed May 13, 2024
1 parent 99c4c00 commit accf42d
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
2 changes: 1 addition & 1 deletion compiler/src/dotty/tools/dotc/sbt/ExtractAPI.scala
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ private class ExtractAPICollector(nonLocalClassSymbols: mutable.HashSet[Symbol])

val selfType = apiType(sym.givenSelfType)

val name = sym.fullName.stripModuleClassSuffix.toString
val name = ExtractDependencies.classNameAsString(sym)
// We strip module class suffix. Zinc relies on a class and its companion having the same name

val tparams = sym.typeParams.map(apiTypeParameter).toArray
Expand Down
18 changes: 17 additions & 1 deletion compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,24 @@ object ExtractDependencies {
val name: String = "sbt-deps"
val description: String = "sends information on classes' dependencies to sbt"

/** Construct String name for the given sym.
* See https://github.com/sbt/zinc/blob/v1.9.6/internal/zinc-apiinfo/src/main/scala/sbt/internal/inc/ClassToAPI.scala#L86-L99
*
* For a Java nested class M of a class C returns C's canonical name + "." + M's simple name.
*/
def classNameAsString(sym: Symbol)(using Context): String =
sym.fullName.stripModuleClassSuffix.toString
def isJava(sym: Symbol)(using Context): Boolean =
Option(sym.source) match
case Some(src) => src.toString.endsWith(".java")
case None => false
def classNameAsString0(sym: Symbol)(using Context): String =
sym.fullName.stripModuleClassSuffix.toString
def javaClassNameAsString(sym: Symbol)(using Context): String =
if sym.owner.isClass && !sym.owner.isRoot then
javaClassNameAsString(sym.owner) + "." + sym.name.stripModuleClassSuffix.toString
else classNameAsString0(sym)
if isJava(sym) then javaClassNameAsString(sym)
else classNameAsString0(sym)

/** Report an internal error in incremental compilation. */
def internalError(msg: => String, pos: SrcPos = NoSourcePosition)(using Context): Unit =
Expand Down

0 comments on commit accf42d

Please sign in to comment.