diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 707117d25cd1..3d7b7c89e5c0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -506,7 +506,7 @@ public class IncProjectBuilder { SourceToOutputMappingImpl mapping = null; try { mapping = myProjectDescriptor.dataManager.createSourceToOutputMapForStaleTarget(type, stringId); - clearOutputFiles(context, mapping, type); + clearOutputFiles(context, mapping, type, ids.second); } finally { if (mapping != null) { @@ -526,13 +526,17 @@ public class IncProjectBuilder { public static void clearOutputFiles(CompileContext context, BuildTarget target) throws IOException { final SourceToOutputMapping map = context.getProjectDescriptor().dataManager.getSourceToOutputMap(target); BuildTargetType targetType = target.getTargetType(); - clearOutputFiles(context, map, targetType); + clearOutputFiles(context, map, targetType, context.getProjectDescriptor().dataManager.getTargetsState().getBuildTargetId(target)); registerTargetsWithClearedOutput(context, Collections.singletonList(target)); } - private static void clearOutputFiles(CompileContext context, SourceToOutputMapping mapping, BuildTargetType targetType) throws IOException { + private static void clearOutputFiles(CompileContext context, + SourceToOutputMapping mapping, + BuildTargetType targetType, + int targetId) throws IOException { final THashSet dirsToDelete = targetType instanceof ModuleBasedBuildTargetType ? new THashSet<>(FileUtil.FILE_HASHING_STRATEGY) : null; + OutputToTargetRegistry outputToTargetRegistry = context.getProjectDescriptor().dataManager.getOutputToTargetRegistry(); for (String srcPath : mapping.getSources()) { final Collection outs = mapping.getOutputs(srcPath); if (outs != null && !outs.isEmpty()) { @@ -540,6 +544,7 @@ public class IncProjectBuilder { for (String out : outs) { BuildOperations.deleteRecursively(out, deletedPaths, dirsToDelete); } + outputToTargetRegistry.removeMapping(outs, targetId); if (!deletedPaths.isEmpty()) { context.processMessage(new FileDeletedEvent(deletedPaths)); } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/CleanStaleTargetsTest.kt b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/CleanStaleTargetsTest.kt index 59e3be06a13a..ba93df1af0a5 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/CleanStaleTargetsTest.kt +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/CleanStaleTargetsTest.kt @@ -9,7 +9,8 @@ import org.jetbrains.jps.util.JpsPathUtil class CleanStaleTargetsTest : JpsBuildTestCase() { fun `test delete old output when module is deleted`() { - doTestDeleteOldOutput { + //todo[nik, jeka] currently references to classes from deleted module aren't removed ClassToSubclasses, ClassToClassDependency, SourceFileToClasses mappings + doTestDeleteOldOutput(false) { myProject.removeModule(it) } } @@ -28,7 +29,7 @@ class CleanStaleTargetsTest : JpsBuildTestCase() { } } - private fun doTestDeleteOldOutput(action: (JpsModule) -> Unit) { + private fun doTestDeleteOldOutput(checkMappings: Boolean = true, action: (JpsModule) -> Unit) { JpsJavaExtensionService.getInstance().getOrCreateProjectExtension(myProject).outputUrl = JpsPathUtil.pathToUrl(getAbsolutePath("out")) val aRoot = PathUtil.getParentPath(createFile("a/src/A.java", "class A {}")) val aModule = addModule("a", arrayOf(aRoot), null, null, jdk) @@ -44,10 +45,14 @@ class CleanStaleTargetsTest : JpsBuildTestCase() { //do not clean output when just one other target is built to avoid unexpectedly long builds assertOutput(aOutput.absolutePath, directoryContent { file("A.class") }) - buildAllModules() + val buildResult = buildAllModules() //clean output of stale targets when all targets of this type are built if (aOutput.exists()) { assertOutput(aOutput.absolutePath, directoryContent { }) } + + if (checkMappings) { + checkMappingsAreSameAfterRebuild(buildResult) + } } }