From f1f9d5327cb4e7f1674c273f6cc6fd9c4087537c Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 26 Apr 2013 20:35:04 +0400 Subject: [PATCH] Using XML instead of module scripts when running from IDE --- .../jvm/compiler/CompileEnvironmentUtil.java | 64 ++++++++++++++++++- .../KotlinModuleDescriptionGenerator.java | 2 + .../runner/KotlinModuleScriptGenerator.java | 5 ++ .../runner/KotlinModuleXmlGenerator.java | 5 ++ .../jet/jps/build/KotlinBuilder.java | 4 +- .../KotlinBuilderModuleScriptGenerator.java | 16 +++-- 6 files changed, 88 insertions(+), 8 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java index 6009217e0e8..48f3f83464d 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java @@ -19,7 +19,10 @@ package org.jetbrains.jet.cli.jvm.compiler; import com.intellij.openapi.Disposable; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.util.Function; import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; import jet.modules.AllModules; import jet.modules.Module; import org.jetbrains.annotations.NotNull; @@ -27,6 +30,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.cli.common.CLIConfigurationKeys; import org.jetbrains.jet.cli.common.messages.MessageCollector; import org.jetbrains.jet.cli.common.messages.MessageRenderer; +import org.jetbrains.jet.cli.common.modules.ModuleDescription; +import org.jetbrains.jet.cli.common.modules.ModuleXmlParser; import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys; import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.GeneratedClassLoader; @@ -47,9 +52,13 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.jar.*; +import static org.jetbrains.jet.cli.common.messages.CompilerMessageLocation.NO_LOCATION; +import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.ERROR; + public class CompileEnvironmentUtil { public static Disposable createMockDisposable() { return new Disposable() { @@ -79,7 +88,32 @@ public class CompileEnvironmentUtil { } @NotNull - public static List loadModuleDescriptions(KotlinPaths paths, String moduleScriptFile, MessageCollector messageCollector) { + public static List loadModuleDescriptions(KotlinPaths paths, String moduleDefinitionFile, MessageCollector messageCollector) { + File file = new File(moduleDefinitionFile); + if (!file.exists()) { + messageCollector.report(ERROR, "Module definition file does not exist: " + moduleDefinitionFile, NO_LOCATION); + return Collections.emptyList(); + } + String extension = FileUtilRt.getExtension(moduleDefinitionFile); + if ("kts".equalsIgnoreCase(extension)) { + return loadModuleScript(paths, moduleDefinitionFile, messageCollector); + } + if ("xml".equalsIgnoreCase(extension)) { + return ContainerUtil.map( + ModuleXmlParser.parse(moduleDefinitionFile, messageCollector), + new Function() { + @Override + public Module fun(ModuleDescription description) { + return new DescriptionToModuleAdapter(description); + } + }); + } + messageCollector.report(ERROR, "Unknown module definition type: " + moduleDefinitionFile, NO_LOCATION); + return Collections.emptyList(); + } + + @NotNull + private static List loadModuleScript(KotlinPaths paths, String moduleScriptFile, MessageCollector messageCollector) { Disposable disposable = new Disposable() { @Override public void dispose() { @@ -261,4 +295,32 @@ public class CompileEnvironmentUtil { } return moduleScriptText; } + + private static class DescriptionToModuleAdapter implements Module { + private final ModuleDescription description; + + public DescriptionToModuleAdapter(ModuleDescription description) { + this.description = description; + } + + @Override + public String getModuleName() { + return description.getModuleName(); + } + + @Override + public List getSourceFiles() { + return description.getSourceFiles(); + } + + @Override + public List getClasspathRoots() { + return description.getClasspathRoots(); + } + + @Override + public List getAnnotationsRoots() { + return description.getAnnotationsRoots(); + } + } } diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java index 460002a3a10..f50b50a13a6 100644 --- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java +++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java @@ -32,6 +32,8 @@ public interface KotlinModuleDescriptionGenerator { Set directoriesToFilterOut ); + String getFileExtension(); + interface DependencyProvider { void processClassPath(@NotNull DependencyProcessor processor); } diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java index ae4a17a0b9c..0af46da7aa1 100644 --- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java +++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java @@ -85,4 +85,9 @@ public class KotlinModuleScriptGenerator implements KotlinModuleDescriptionGener script.append("}\n"); return script; } + + @Override + public String getFileExtension() { + return "kts"; + } } diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java index d59306ed51f..35515414340 100644 --- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java +++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java @@ -100,6 +100,11 @@ public class KotlinModuleXmlGenerator implements KotlinModuleDescriptionGenerato return xml; } + @Override + public String getFileExtension() { + return "xml"; + } + private static void openTag(Printer p, String tag) { p.println("<" + tag + ">"); p.pushIndent(); diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java index 2fbeb0f7ef9..2f0eb7bb58f 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java @@ -82,7 +82,7 @@ public class KotlinBuilder extends ModuleLevelBuilder { return ExitCode.NOTHING_DONE; } - File scriptFile = KotlinBuilderModuleScriptGenerator.generateModuleScript(context, representativeTarget, sourceFiles); + File moduleFile = KotlinBuilderModuleScriptGenerator.generateModuleDescription(context, representativeTarget, sourceFiles); File outputDir = representativeTarget.getOutputDir(); @@ -99,7 +99,7 @@ public class KotlinBuilder extends ModuleLevelBuilder { KotlinCompilerRunner.runCompiler( messageCollector, environment, - scriptFile, + moduleFile, outputItemCollector, /*runOutOfProcess = */false); diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java index ed89aac90d1..ce53354d6ad 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java @@ -21,7 +21,7 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionGenerator; -import org.jetbrains.jet.compiler.runner.KotlinModuleScriptGenerator; +import org.jetbrains.jet.compiler.runner.KotlinModuleXmlGenerator; import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.ModuleBuildTarget; @@ -33,7 +33,10 @@ import org.jetbrains.jps.model.java.JpsJavaDependenciesEnumerator; import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryRoot; -import org.jetbrains.jps.model.module.*; +import org.jetbrains.jps.model.module.JpsDependencyElement; +import org.jetbrains.jps.model.module.JpsLibraryDependency; +import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.model.module.JpsSdkDependency; import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; @@ -45,10 +48,13 @@ import java.util.List; import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionGenerator.DependencyProvider; public class KotlinBuilderModuleScriptGenerator { - public static File generateModuleScript(CompileContext context, ModuleBuildTarget target, List sourceFiles) + + public static final KotlinModuleDescriptionGenerator GENERATOR = KotlinModuleXmlGenerator.INSTANCE; + + public static File generateModuleDescription(CompileContext context, ModuleBuildTarget target, List sourceFiles) throws IOException { - CharSequence moduleScriptText = KotlinModuleScriptGenerator.INSTANCE.generateModuleScript( + CharSequence moduleScriptText = GENERATOR.generateModuleScript( target.getId(), getKotlinModuleDependencies(context, target), sourceFiles, @@ -57,7 +63,7 @@ public class KotlinBuilderModuleScriptGenerator { Collections.singleton(target.getOutputDir()) ); - File scriptFile = new File(target.getOutputDir(), "script.kts"); + File scriptFile = new File(target.getOutputDir(), "script." + GENERATOR.getFileExtension()); writeScriptToFile(context, moduleScriptText, scriptFile);