From 8de4fc830ff86510e7602b24e7361abcd8dacc73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C5=BEe=20Sodja?= Date: Thu, 9 Dec 2021 22:50:05 +0100 Subject: [PATCH] Fix incremental compilation for classes with $ in name Fixes #19257 --- ...avaGroovyIncrementalCompilationSupport.groovy | 2 +- ...eIncrementalCompilationIntegrationTest.groovy | 16 ++++++++++++++++ .../FileNameDerivingClassNameConverter.java | 15 +++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractJavaGroovyIncrementalCompilationSupport.groovy b/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractJavaGroovyIncrementalCompilationSupport.groovy index b2a8b60ca4cd..ce258588813d 100644 --- a/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractJavaGroovyIncrementalCompilationSupport.groovy +++ b/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractJavaGroovyIncrementalCompilationSupport.groovy @@ -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() diff --git a/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractSourceIncrementalCompilationIntegrationTest.groovy b/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractSourceIncrementalCompilationIntegrationTest.groovy index fd0923ca5184..4e5b432398d1 100644 --- a/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractSourceIncrementalCompilationIntegrationTest.groovy +++ b/subprojects/language-java/src/integTest/groovy/org/gradle/java/compile/incremental/AbstractSourceIncrementalCompilationIntegrationTest.groovy @@ -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") + } } diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/FileNameDerivingClassNameConverter.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/FileNameDerivingClassNameConverter.java index 250cc77bdc60..b0410c073bc8 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/FileNameDerivingClassNameConverter.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/FileNameDerivingClassNameConverter.java @@ -56,9 +56,20 @@ public Set getRelativeSourcePaths(String className) { return sourcePaths; } + Set 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; } }