Using XML instead of module scripts when running from IDE

This commit is contained in:
Andrey Breslav
2013-04-26 20:35:04 +04:00
parent 42505246b8
commit f1f9d5327c
6 changed files with 88 additions and 8 deletions
@@ -19,7 +19,10 @@ package org.jetbrains.jet.cli.jvm.compiler;
import com.intellij.openapi.Disposable; import com.intellij.openapi.Disposable;
import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil; 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.Processor;
import com.intellij.util.containers.ContainerUtil;
import jet.modules.AllModules; import jet.modules.AllModules;
import jet.modules.Module; import jet.modules.Module;
import org.jetbrains.annotations.NotNull; 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.CLIConfigurationKeys;
import org.jetbrains.jet.cli.common.messages.MessageCollector; import org.jetbrains.jet.cli.common.messages.MessageCollector;
import org.jetbrains.jet.cli.common.messages.MessageRenderer; 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.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GeneratedClassLoader; import org.jetbrains.jet.codegen.GeneratedClassLoader;
@@ -47,9 +52,13 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.jar.*; 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 class CompileEnvironmentUtil {
public static Disposable createMockDisposable() { public static Disposable createMockDisposable() {
return new Disposable() { return new Disposable() {
@@ -79,7 +88,32 @@ public class CompileEnvironmentUtil {
} }
@NotNull @NotNull
public static List<Module> loadModuleDescriptions(KotlinPaths paths, String moduleScriptFile, MessageCollector messageCollector) { public static List<Module> 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<ModuleDescription, Module>() {
@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<Module> loadModuleScript(KotlinPaths paths, String moduleScriptFile, MessageCollector messageCollector) {
Disposable disposable = new Disposable() { Disposable disposable = new Disposable() {
@Override @Override
public void dispose() { public void dispose() {
@@ -261,4 +295,32 @@ public class CompileEnvironmentUtil {
} }
return moduleScriptText; 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<String> getSourceFiles() {
return description.getSourceFiles();
}
@Override
public List<String> getClasspathRoots() {
return description.getClasspathRoots();
}
@Override
public List<String> getAnnotationsRoots() {
return description.getAnnotationsRoots();
}
}
} }
@@ -32,6 +32,8 @@ public interface KotlinModuleDescriptionGenerator {
Set<File> directoriesToFilterOut Set<File> directoriesToFilterOut
); );
String getFileExtension();
interface DependencyProvider { interface DependencyProvider {
void processClassPath(@NotNull DependencyProcessor processor); void processClassPath(@NotNull DependencyProcessor processor);
} }
@@ -85,4 +85,9 @@ public class KotlinModuleScriptGenerator implements KotlinModuleDescriptionGener
script.append("}\n"); script.append("}\n");
return script; return script;
} }
@Override
public String getFileExtension() {
return "kts";
}
} }
@@ -100,6 +100,11 @@ public class KotlinModuleXmlGenerator implements KotlinModuleDescriptionGenerato
return xml; return xml;
} }
@Override
public String getFileExtension() {
return "xml";
}
private static void openTag(Printer p, String tag) { private static void openTag(Printer p, String tag) {
p.println("<" + tag + ">"); p.println("<" + tag + ">");
p.pushIndent(); p.pushIndent();
@@ -82,7 +82,7 @@ public class KotlinBuilder extends ModuleLevelBuilder {
return ExitCode.NOTHING_DONE; return ExitCode.NOTHING_DONE;
} }
File scriptFile = KotlinBuilderModuleScriptGenerator.generateModuleScript(context, representativeTarget, sourceFiles); File moduleFile = KotlinBuilderModuleScriptGenerator.generateModuleDescription(context, representativeTarget, sourceFiles);
File outputDir = representativeTarget.getOutputDir(); File outputDir = representativeTarget.getOutputDir();
@@ -99,7 +99,7 @@ public class KotlinBuilder extends ModuleLevelBuilder {
KotlinCompilerRunner.runCompiler( KotlinCompilerRunner.runCompiler(
messageCollector, messageCollector,
environment, environment,
scriptFile, moduleFile,
outputItemCollector, outputItemCollector,
/*runOutOfProcess = */false); /*runOutOfProcess = */false);
@@ -21,7 +21,7 @@ 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.KotlinModuleDescriptionGenerator; 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.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;
@@ -33,7 +33,10 @@ import org.jetbrains.jps.model.java.JpsJavaDependenciesEnumerator;
import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.java.JpsJavaExtensionService;
import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibrary;
import org.jetbrains.jps.model.library.JpsLibraryRoot; 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 org.jetbrains.jps.util.JpsPathUtil;
import java.io.File; import java.io.File;
@@ -45,10 +48,13 @@ import java.util.List;
import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionGenerator.DependencyProvider; import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionGenerator.DependencyProvider;
public class KotlinBuilderModuleScriptGenerator { public class KotlinBuilderModuleScriptGenerator {
public static File generateModuleScript(CompileContext context, ModuleBuildTarget target, List<File> sourceFiles)
public static final KotlinModuleDescriptionGenerator GENERATOR = KotlinModuleXmlGenerator.INSTANCE;
public static File generateModuleDescription(CompileContext context, ModuleBuildTarget target, List<File> sourceFiles)
throws IOException throws IOException
{ {
CharSequence moduleScriptText = KotlinModuleScriptGenerator.INSTANCE.generateModuleScript( CharSequence moduleScriptText = GENERATOR.generateModuleScript(
target.getId(), target.getId(),
getKotlinModuleDependencies(context, target), getKotlinModuleDependencies(context, target),
sourceFiles, sourceFiles,
@@ -57,7 +63,7 @@ public class KotlinBuilderModuleScriptGenerator {
Collections.singleton(target.getOutputDir()) 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); writeScriptToFile(context, moduleScriptText, scriptFile);