From b120fa05ae2a56b2d5bbabfd7c41e9d21367ff7e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 2 Mar 2012 15:38:53 +0400 Subject: [PATCH] Module script creation factored out. Output directories removed from classpath --- .../jet/plugin/compiler/JetCompiler.java | 87 ++++++++++++------- 1 file changed, 56 insertions(+), 31 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java index 04c0a6bebe7..1d334417ae8 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.plugin.compiler; +import com.google.common.collect.Sets; import com.intellij.compiler.impl.javaCompiler.ModuleChunk; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.configurations.SimpleJavaParameters; @@ -116,39 +117,10 @@ public class JetCompiler implements TranslatingCompiler { return; } - - StringBuilder script = new StringBuilder(); - - script.append("import kotlin.modules.*\n"); - script.append("fun project() {\n"); - script.append("module(\"" + moduleChunk.getNodes().iterator().next().getName() + "\") {\n"); - - for (VirtualFile sourceFile : files) { - script.append("sources += \"" + path(sourceFile) + "\"\n"); - } - ModuleChunk chunk = new ModuleChunk((CompileContextEx) compileContext, moduleChunk, Collections.>emptyMap()); + String moduleName = moduleChunk.getNodes().iterator().next().getName(); - // TODO: have a bootclasspath in script API - for (VirtualFile root : chunk.getCompilationBootClasspathFiles()) { - script.append("classpath += \"" + path(root) + "\"\n"); - } - - for (VirtualFile root : chunk.getCompilationClasspathFiles()) { - script.append("classpath += \"" + path(root) + "\"\n"); - } - - // This is for java files in same roots - for (VirtualFile root : chunk.getSourceRoots()) { - script.append("classpath += \"" + path(root) + "\"\n"); - } - - if (tests && mainOutput != null) { - script.append("classpath += \"" + path(mainOutput) + "\"\n"); - } - - script.append("}\n"); - script.append("}\n"); + CharSequence script = generateModuleScript(moduleName, chunk, files, tests, mainOutput, Sets.newHashSet(compileContext.getAllOutputDirectories())); File scriptFile = new File(path(outputDir), "script.kts"); try { @@ -166,6 +138,59 @@ public class JetCompiler implements TranslatingCompiler { } } + private static CharSequence generateModuleScript(String moduleName, ModuleChunk chunk, List files, boolean tests, VirtualFile mainOutput, Set allOutputDirectories) { + StringBuilder script = new StringBuilder(); + + if (tests) { + script.append("// Module script for tests\n"); + } + else { + script.append("// Module script for production\n"); + } + + script.append("import kotlin.modules.*\n"); + script.append("fun project() {\n"); + script.append(" module(\"" + moduleName + "\") {\n"); + + for (VirtualFile sourceFile : files) { + script.append(" sources += \"" + path(sourceFile) + "\"\n"); + } + + // TODO: have a bootclasspath in script API + script.append(" // Boot classpath\n"); + for (VirtualFile root : chunk.getCompilationBootClasspathFiles()) { + script.append(" classpath += \"" + path(root) + "\"\n"); + } + + script.append(" // Compilation classpath\n"); + for (VirtualFile root : chunk.getCompilationClasspathFiles()) { + String path = path(root); + if (allOutputDirectories.contains(root)) { + // For IDEA's make (incremental compilation) purposes, output directories of the current module and its dependencies + // appear on the class path, so we are at risk of seeing the results of the previous build, i.e. if some class was + // removed in the sources, it may still be there in binaries. Thus, we delete these entries from the classpath. + script.append(" // Output directory, commented out\n"); + script.append(" // "); + } + script.append(" classpath += \"" + path + "\"\n"); + } + + // This is for java files in same roots + script.append(" // Java classpath (for Java sources)\n"); + for (VirtualFile root : chunk.getSourceRoots()) { + script.append(" classpath += \"" + path(root) + "\"\n"); + } + + script.append(" // Main output\n"); + if (tests && mainOutput != null) { + script.append(" classpath += \"" + path(mainOutput) + "\"\n"); + } + + script.append(" }\n"); + script.append("}\n"); + return script; + } + private static List kompilerClasspath(File kotlinHome, CompileContext context) { File libs = new File(kotlinHome, "lib");