New module script DSL
This commit is contained in:
@@ -7,9 +7,8 @@ import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.Processor;
|
||||
import jet.ExtensionFunction0;
|
||||
import jet.modules.IModuleBuilder;
|
||||
import jet.modules.IModuleSetBuilder;
|
||||
import jet.modules.AllModules;
|
||||
import jet.modules.Module;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.codegen.ClassFileFactory;
|
||||
import org.jetbrains.jet.codegen.GeneratedClassLoader;
|
||||
@@ -19,7 +18,7 @@ import org.jetbrains.jet.lang.resolve.java.JvmAbi;
|
||||
import org.jetbrains.jet.plugin.JetMainDetector;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.List;
|
||||
@@ -174,13 +173,14 @@ public class CompileEnvironment {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
final IModuleSetBuilder moduleSetBuilder = loadModuleScript(moduleFile);
|
||||
if (moduleSetBuilder == null) {
|
||||
return;
|
||||
final List<Module> modules = loadModuleScript(moduleFile);
|
||||
|
||||
if (modules == null) {
|
||||
throw new CompileEnvironmentException("Module script " + moduleFile + " compilation failed");
|
||||
}
|
||||
|
||||
final String directory = new File(moduleFile).getParent();
|
||||
for (IModuleBuilder moduleBuilder : moduleSetBuilder.getModules()) {
|
||||
for (Module moduleBuilder : modules) {
|
||||
ClassFileFactory moduleFactory = compileModule(moduleBuilder, directory);
|
||||
final String path = jarPath != null ? jarPath : new File(directory, moduleBuilder.getModuleName() + ".jar").getPath();
|
||||
try {
|
||||
@@ -191,7 +191,7 @@ public class CompileEnvironment {
|
||||
}
|
||||
}
|
||||
|
||||
public IModuleSetBuilder loadModuleScript(String moduleFile) {
|
||||
public List<Module> loadModuleScript(String moduleFile) {
|
||||
CompileSession scriptCompileSession = new CompileSession(myEnvironment);
|
||||
scriptCompileSession.addSources(moduleFile);
|
||||
scriptCompileSession.addStdLibSources(true);
|
||||
@@ -204,34 +204,25 @@ public class CompileEnvironment {
|
||||
return runDefineModules(moduleFile, factory);
|
||||
}
|
||||
|
||||
private static IModuleSetBuilder runDefineModules(String moduleFile, ClassFileFactory factory) {
|
||||
private static List<Module> runDefineModules(String moduleFile, ClassFileFactory factory) {
|
||||
GeneratedClassLoader loader = new GeneratedClassLoader(factory);
|
||||
try {
|
||||
Class moduleSetBuilderClass = loader.loadClass("kotlin.modules.ModuleSetBuilder");
|
||||
final IModuleSetBuilder moduleSetBuilder = (IModuleSetBuilder) moduleSetBuilderClass.newInstance();
|
||||
|
||||
Class namespaceClass = loader.loadClass(JvmAbi.PACKAGE_CLASS);
|
||||
final Field[] fields = namespaceClass.getDeclaredFields();
|
||||
boolean modulesDefined = false;
|
||||
for (Field field : fields) {
|
||||
if (field.getName().equals("modules")) {
|
||||
field.setAccessible(true);
|
||||
ExtensionFunction0 defineMudules = (ExtensionFunction0) field.get(null);
|
||||
defineMudules.invoke(moduleSetBuilder);
|
||||
modulesDefined = true;
|
||||
break;
|
||||
}
|
||||
final Method method = namespaceClass.getDeclaredMethod("project");
|
||||
if (method == null) {
|
||||
throw new CompileEnvironmentException("Module script " + moduleFile + " must define project() function");
|
||||
}
|
||||
if (!modulesDefined) {
|
||||
throw new CompileEnvironmentException("Module script " + moduleFile + " must define a modules() property");
|
||||
}
|
||||
return moduleSetBuilder;
|
||||
|
||||
method.setAccessible(true);
|
||||
method.invoke(null);
|
||||
|
||||
return AllModules.modules;
|
||||
} catch (Exception e) {
|
||||
throw new CompileEnvironmentException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public ClassFileFactory compileModule(IModuleBuilder moduleBuilder, String directory) {
|
||||
public ClassFileFactory compileModule(Module moduleBuilder, String directory) {
|
||||
CompileSession moduleCompileSession = new CompileSession(myEnvironment);
|
||||
if (!"stdlib".equals(moduleBuilder.getModuleName())) {
|
||||
moduleCompileSession.addStdLibSources(false);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import kotlin.modules.*
|
||||
|
||||
val modules = module("smoke") {
|
||||
source files "Smoke.kt"
|
||||
jar name System.getProperty("java.io.tmpdir") + "/smoke.jar"
|
||||
fun project() {
|
||||
module("smoke") {
|
||||
sources += "Smoke.kt"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.jetbrains.jet.compiler;
|
||||
|
||||
import jet.modules.IModuleBuilder;
|
||||
import jet.modules.IModuleSetBuilder;
|
||||
import jet.modules.Module;
|
||||
import junit.framework.TestCase;
|
||||
import org.jetbrains.jet.cli.KotlinCompiler;
|
||||
import org.jetbrains.jet.codegen.ClassFileFactory;
|
||||
@@ -37,9 +36,9 @@ public class CompileEnvironmentTest extends TestCase {
|
||||
environment.setJavaRuntime(activeRtJar);
|
||||
environment.initializeKotlinRuntime();
|
||||
final String testDataDir = JetParsingTest.getTestDataDir() + "/compiler/smoke/";
|
||||
final IModuleSetBuilder setBuilder = environment.loadModuleScript(testDataDir + "Smoke.kts");
|
||||
assertEquals(1, setBuilder.getModules().size());
|
||||
final IModuleBuilder moduleBuilder = setBuilder.getModules().get(0);
|
||||
final List<Module> modules = environment.loadModuleScript(testDataDir + "Smoke.kts");
|
||||
assertEquals(1, modules.size());
|
||||
final Module moduleBuilder = modules.get(0);
|
||||
final ClassFileFactory factory = environment.compileModule(moduleBuilder, testDataDir);
|
||||
assertNotNull(factory);
|
||||
assertNotNull(factory.asBytes("Smoke/namespace.class"));
|
||||
@@ -51,7 +50,7 @@ public class CompileEnvironmentTest extends TestCase {
|
||||
assertTrue(entries.contains("Smoke/namespace.class"));
|
||||
}
|
||||
|
||||
public void _testSmokeWithCompilerJar() throws IOException {
|
||||
public void testSmokeWithCompilerJar() throws IOException {
|
||||
File tempFile = File.createTempFile("compilerTest", "compilerTest");
|
||||
try {
|
||||
KotlinCompiler.main(Arrays.asList("-module", JetParsingTest.getTestDataDir() + "/compiler/smoke/Smoke.kts", "-jar", tempFile.getAbsolutePath()).toArray(new String[0]));
|
||||
|
||||
@@ -3,57 +3,35 @@ package kotlin.modules
|
||||
import java.util.*
|
||||
import jet.modules.*
|
||||
|
||||
fun moduleSet(description: ModuleSetBuilder.() -> Unit) = description
|
||||
|
||||
fun module(name: String, description: ModuleBuilder.() -> Unit) = moduleSet {
|
||||
module(name, description)
|
||||
}
|
||||
|
||||
class ModuleSetBuilder(): IModuleSetBuilder {
|
||||
private val modules = ArrayList<IModuleBuilder?>()
|
||||
|
||||
fun module(name: String, callback: ModuleBuilder.() -> Unit) {
|
||||
val builder = ModuleBuilder(name)
|
||||
builder.callback()
|
||||
modules.add(builder)
|
||||
}
|
||||
|
||||
override fun getModules(): List<IModuleBuilder?>? = modules
|
||||
fun module(name: String, callback: ModuleBuilder.() -> Unit) {
|
||||
val builder = ModuleBuilder(name)
|
||||
builder.callback()
|
||||
AllModules.modules?.add(builder)
|
||||
}
|
||||
|
||||
class SourcesBuilder(val parent: ModuleBuilder) {
|
||||
fun files(pattern: String) {
|
||||
fun plusAssign(pattern: String) {
|
||||
parent.addSourceFiles(pattern)
|
||||
}
|
||||
}
|
||||
|
||||
class ClasspathBuilder(val parent: ModuleBuilder) {
|
||||
fun entry(name: String) {
|
||||
fun plusAssign(name: String) {
|
||||
parent.addClasspathEntry(name)
|
||||
}
|
||||
}
|
||||
|
||||
class JarBuilder(val parent: ModuleBuilder) {
|
||||
fun name(jarName: String) {
|
||||
parent.setJarName(jarName)
|
||||
}
|
||||
}
|
||||
|
||||
open class ModuleBuilder(val name: String): IModuleBuilder {
|
||||
open class ModuleBuilder(val name: String): Module {
|
||||
// http://youtrack.jetbrains.net/issue/KT-904
|
||||
private val sourceFiles0: ArrayList<String?> = ArrayList<String?>()
|
||||
private val classpathRoots0: ArrayList<String?> = ArrayList<String?>()
|
||||
var _jarName: String? = null
|
||||
|
||||
val source: SourcesBuilder
|
||||
val sources: SourcesBuilder
|
||||
get() = SourcesBuilder(this)
|
||||
|
||||
val classpath: ClasspathBuilder
|
||||
get() = ClasspathBuilder(this)
|
||||
|
||||
val jar: JarBuilder
|
||||
get() = JarBuilder(this)
|
||||
|
||||
fun addSourceFiles(pattern: String) {
|
||||
sourceFiles0.add(pattern)
|
||||
}
|
||||
@@ -62,19 +40,8 @@ open class ModuleBuilder(val name: String): IModuleBuilder {
|
||||
classpathRoots0.add(name)
|
||||
}
|
||||
|
||||
fun setJarName(name: String) {
|
||||
_jarName = name
|
||||
}
|
||||
|
||||
override fun getSourceFiles(): List<String?>? = sourceFiles0
|
||||
override fun getClasspathRoots(): List<String?>? = classpathRoots0
|
||||
override fun getModuleName(): String? = name
|
||||
override fun getJarName(): String? = _jarName
|
||||
|
||||
}
|
||||
|
||||
class ModuleBuilder2(name: String): ModuleBuilder(name) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* @author max
|
||||
*/
|
||||
package jet.modules;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class AllModules {
|
||||
public static final ArrayList<Module> modules = new ArrayList<Module>();
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package jet.modules;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public interface IModuleSetBuilder {
|
||||
List<IModuleBuilder> getModules();
|
||||
}
|
||||
@@ -5,9 +5,8 @@ import java.util.List;
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public interface IModuleBuilder {
|
||||
public interface Module {
|
||||
String getModuleName();
|
||||
List<String> getSourceFiles();
|
||||
List<String> getClasspathRoots();
|
||||
String getJarName();
|
||||
}
|
||||
Reference in New Issue
Block a user