Skip to content

Commit

Permalink
Fix incremental compilation for classes with $ in name
Browse files Browse the repository at this point in the history
Fixes #19257
  • Loading branch information
asodja committed Dec 9, 2021
1 parent a03ba21 commit 8de4fc8
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 3 deletions.
Expand Up @@ -29,7 +29,7 @@ abstract class AbstractJavaGroovyIncrementalCompilationSupport extends AbstractI
File source(String... classBodies) {
File out
for (String body : classBodies) {
def className = (body =~ /(?s).*?(?:class|interface|enum) (\w+) .*/)[0][1]
def className = (body =~ /(?s).*?(?:class|interface|enum) ([\w$]+) .*/)[0][1]
assert className: "unable to find class name"
def f = file("src/main/${language.name}/${className}.${language.name}")
f.createFile()
Expand Down
Expand Up @@ -492,4 +492,20 @@ sourceSets {
then:
failureCauseContains('Compilation failed')
}

def "recompiles classes with \$ in class name after rename"() {
def firstSource = source "class Class\$Name {}"
source "class Main { public static void main(String[] args) { new Class\$Name(); } }"
outputs.snapshot { run language.compileTaskName }

when:
firstSource.delete()
source "class Class\$Name1 {}",
"class Main { public static void main(String[] args) { new Class\$Name1(); } }"
run language.compileTaskName

then:
outputs.deletedClasses("Class\$Name")
outputs.recompiledClasses("Class\$Name1", "Main")
}
}
Expand Up @@ -56,9 +56,20 @@ public Set<String> getRelativeSourcePaths(String className) {
return sourcePaths;
}

Set<String> paths = fileExtensions.stream()
.map(fileExtension -> className.replace('.', '/') + fileExtension)
.collect(Collectors.toSet());

// Classes with $ may be inner classes
int innerClassIdx = className.indexOf("$");
String baseName = innerClassIdx > 0 ? className.substring(0, innerClassIdx) : className;
return fileExtensions.stream().map(fileExtension -> baseName.replace('.', '/') + fileExtension).collect(Collectors.toSet());
if (innerClassIdx > 0) {
String baseName = className.substring(0, innerClassIdx);
paths.addAll(fileExtensions.stream()
.map(fileExtension -> baseName.replace('.', '/') + fileExtension)
.collect(Collectors.toSet()));
}

return paths;
}

}

0 comments on commit 8de4fc8

Please sign in to comment.