private static CharSequence generateModuleScript( String moduleName, ModuleChunk chunk, List<VirtualFile> files, boolean tests, VirtualFile mainOutput, Set<VirtualFile> directoriesToFilterOut) { 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 (directoriesToFilterOut.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; }