JPS: revert KotlinBuilder changes for using dirty files, because it's wrong.

Original commit: 923fd74c0a
This commit is contained in:
Zalim Bashorov
2013-11-12 13:33:27 +04:00
parent a85a00f422
commit fcce7f25a7
3 changed files with 25 additions and 87 deletions
@@ -134,7 +134,8 @@ public class KotlinBuilder extends ModuleLevelBuilder {
return ExitCode.NOTHING_DONE; return ExitCode.NOTHING_DONE;
} }
List<File> sourceFiles = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder); List<File> sourceFiles = KotlinSourceFileCollector.getAllKotlinSourceFiles(representativeTarget);
//List<File> sourceFiles = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder);
if (sourceFiles.isEmpty()) { if (sourceFiles.isEmpty()) {
return ExitCode.NOTHING_DONE; return ExitCode.NOTHING_DONE;
@@ -156,7 +157,7 @@ public class KotlinBuilder extends ModuleLevelBuilder {
NO_LOCATION); NO_LOCATION);
} }
File moduleFile = KotlinBuilderModuleScriptGenerator.generateModuleDescription(context, dirtyFilesHolder); File moduleFile = KotlinBuilderModuleScriptGenerator.generateModuleDescription(context, chunk);
if (moduleFile == null) { if (moduleFile == null) {
// No Kotlin sources found // No Kotlin sources found
return ExitCode.NOTHING_DONE; return ExitCode.NOTHING_DONE;
@@ -168,9 +169,15 @@ public class KotlinBuilder extends ModuleLevelBuilder {
moduleFile, outputItemCollector); moduleFile, outputItemCollector);
} }
Map<File, ModuleBuildTarget> sourceToTarget = KotlinSourceFileCollector.getMapDirtySourcesToTarget(dirtyFilesHolder); // If there's only one target, this map is empty: get() always returns null, and the representativeTarget will be used below
Map<File, BuildTarget<?>> sourceToTarget = new HashMap<File, BuildTarget<?>>();
boolean isAllRegistered = false; if (chunk.getTargets().size() > 1) {
for (ModuleBuildTarget target : chunk.getTargets()) {
for (File file : KotlinSourceFileCollector.getAllKotlinSourceFiles(target)) {
sourceToTarget.put(file, target);
}
}
}
for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) { for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) {
BuildTarget<?> target = null; BuildTarget<?> target = null;
@@ -182,18 +189,7 @@ public class KotlinBuilder extends ModuleLevelBuilder {
messageCollector.report(EXCEPTION, "KotlinBuilder: outputItem.sourceFiles is null or empty, outputItem = " + outputItem, NO_LOCATION); messageCollector.report(EXCEPTION, "KotlinBuilder: outputItem.sourceFiles is null or empty, outputItem = " + outputItem, NO_LOCATION);
} }
//TODO FIX: Hack for compile all files if someone changed, because we don't have incremental compilation. outputConsumer.registerOutputFile(target != null ? target : representativeTarget, outputItem.getOutputFile(), paths(sourceFiles));
if (!isAllRegistered) {
isAllRegistered = true;
sourceFiles = sourceToTarget.keySet();
}
if (target == null) {
messageCollector.report(EXCEPTION, "KotlinBuilder: target is null for outputItem = " + outputItem, NO_LOCATION);
}
else {
outputConsumer.registerOutputFile(target, outputItem.getOutputFile(), paths(sourceFiles));
}
} }
return ExitCode.OK; return ExitCode.OK;
@@ -17,14 +17,13 @@
package org.jetbrains.jet.jps.build; package org.jetbrains.jet.jps.build;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder; import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder;
import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilderFactory; import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilderFactory;
import org.jetbrains.jet.compiler.runner.KotlinModuleXmlBuilderFactory; import org.jetbrains.jet.compiler.runner.KotlinModuleXmlBuilderFactory;
import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.ModuleChunk;
import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor; import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor;
import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.CompileContext;
import org.jetbrains.jps.incremental.ModuleBuildTarget; import org.jetbrains.jps.incremental.ModuleBuildTarget;
@@ -47,39 +46,27 @@ import java.util.*;
import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder.DependencyProcessor; import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder.DependencyProcessor;
import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder.DependencyProvider; import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder.DependencyProvider;
import static org.jetbrains.jet.jps.build.JpsUtils.getAllDependencies; import static org.jetbrains.jet.jps.build.JpsUtils.getAllDependencies;
import static org.jetbrains.jet.jps.build.KotlinSourceFileCollector.getMapTargetToDirtySources;
public class KotlinBuilderModuleScriptGenerator { public class KotlinBuilderModuleScriptGenerator {
public static final KotlinModuleDescriptionBuilderFactory FACTORY = KotlinModuleXmlBuilderFactory.INSTANCE; public static final KotlinModuleDescriptionBuilderFactory FACTORY = KotlinModuleXmlBuilderFactory.INSTANCE;
@Nullable @Nullable
public static File generateModuleDescription( public static File generateModuleDescription(CompileContext context, ModuleChunk chunk)
CompileContext context, throws IOException
DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder {
) throws IOException {
KotlinModuleDescriptionBuilder builder = FACTORY.create(); KotlinModuleDescriptionBuilder builder = FACTORY.create();
boolean noSources = true; boolean noSources = true;
Map<ModuleBuildTarget, List<File>> target2sources = getMapTargetToDirtySources(dirtyFilesHolder); Set<File> outputDirs = new HashSet<File>();
for (ModuleBuildTarget target : chunk.getTargets()) {
Set<ModuleBuildTarget> targets = target2sources.keySet(); outputDirs.add(getOutputDir(target));
Set<File> outputDirs = ContainerUtil.map2Set(targets, new Function<ModuleBuildTarget, File>() { }
@Override for (ModuleBuildTarget target : chunk.getTargets()) {
public File fun(ModuleBuildTarget target) {
return getOutputDir(target);
}
});
for (ModuleBuildTarget target : targets) {
File outputDir = getOutputDir(target); File outputDir = getOutputDir(target);
List<File> sourceFiles = target2sources.get(target); List<File> sourceFiles = KotlinSourceFileCollector.getAllKotlinSourceFiles(target);
if (sourceFiles == null) {
sourceFiles = Collections.emptyList();
}
noSources &= sourceFiles.isEmpty(); noSources &= sourceFiles.isEmpty();
builder.addModule( builder.addModule(
@@ -95,8 +82,7 @@ public class KotlinBuilderModuleScriptGenerator {
if (noSources) return null; if (noSources) return null;
ModuleBuildTarget representativeTarget = targets.iterator().next(); File scriptFile = new File(getOutputDir(chunk.representativeTarget()), "script." + FACTORY.getFileExtension());
File scriptFile = new File(getOutputDir(representativeTarget), "script." + FACTORY.getFileExtension());
writeScriptToFile(context, builder.asText(), scriptFile); writeScriptToFile(context, builder.asText(), scriptFile);
@@ -18,7 +18,6 @@ package org.jetbrains.jet.jps.build;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import com.intellij.util.Processor; import com.intellij.util.Processor;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.DirtyFilesHolder;
@@ -30,7 +29,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRoot;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.List;
public class KotlinSourceFileCollector { public class KotlinSourceFileCollector {
// For incremental compilation // For incremental compilation
@@ -51,49 +50,6 @@ public class KotlinSourceFileCollector {
return sourceFiles; return sourceFiles;
} }
public static Map<ModuleBuildTarget, List<File>> getMapTargetToDirtySources(
DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder
) throws IOException {
final Map<ModuleBuildTarget, List<File>> target2sources = new HashMap<ModuleBuildTarget, List<File>>();
dirtyFilesHolder.processDirtyFiles(new FileProcessor<JavaSourceRootDescriptor, ModuleBuildTarget>() {
@Override
public boolean apply(ModuleBuildTarget target, File file, JavaSourceRootDescriptor root) throws IOException {
List<File> sources = target2sources.get(target);
if (sources == null) {
sources = new SmartList<File>();
target2sources.put(target, sources);
}
if (isKotlinSourceFile(file)) {
sources.add(file);
}
return true;
}
});
return target2sources;
}
public static Map<File, ModuleBuildTarget> getMapDirtySourcesToTarget(
DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder
) throws IOException {
final Map<File, ModuleBuildTarget> source2target = new HashMap<File, ModuleBuildTarget>();
dirtyFilesHolder.processDirtyFiles(new FileProcessor<JavaSourceRootDescriptor, ModuleBuildTarget>() {
@Override
public boolean apply(ModuleBuildTarget target, File file, JavaSourceRootDescriptor root) throws IOException {
if (isKotlinSourceFile(file)) {
source2target.put(file, target);
}
return true;
}
});
return source2target;
}
@NotNull @NotNull
public static List<File> getAllKotlinSourceFiles(@NotNull ModuleBuildTarget target) { public static List<File> getAllKotlinSourceFiles(@NotNull ModuleBuildTarget target) {
final List<File> result = ContainerUtil.newArrayList(); final List<File> result = ContainerUtil.newArrayList();