From d51c030803cc70ddd7f724f5562f207f90cefe0a Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 16 Jan 2012 20:59:06 +0400 Subject: [PATCH] New module script DSL --- .../jet/compiler/CompileEnvironment.java | 47 +++++++----------- compiler/testData/compiler/smoke/Smoke.kts | 7 +-- .../jet/compiler/CompileEnvironmentTest.java | 11 ++--- stdlib/ktSrc/modules/ModuleBuilder.kt | 49 +++---------------- stdlib/src/jet/modules/AllModules.java | 10 ++++ stdlib/src/jet/modules/IModuleSetBuilder.java | 10 ---- .../{IModuleBuilder.java => Module.java} | 3 +- 7 files changed, 47 insertions(+), 90 deletions(-) create mode 100644 stdlib/src/jet/modules/AllModules.java delete mode 100644 stdlib/src/jet/modules/IModuleSetBuilder.java rename stdlib/src/jet/modules/{IModuleBuilder.java => Module.java} (74%) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java index 545a248242b..17193241a1f 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java @@ -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 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 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 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); diff --git a/compiler/testData/compiler/smoke/Smoke.kts b/compiler/testData/compiler/smoke/Smoke.kts index d9429cd1b65..179d700646e 100644 --- a/compiler/testData/compiler/smoke/Smoke.kts +++ b/compiler/testData/compiler/smoke/Smoke.kts @@ -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" + } } diff --git a/compiler/tests/org/jetbrains/jet/compiler/CompileEnvironmentTest.java b/compiler/tests/org/jetbrains/jet/compiler/CompileEnvironmentTest.java index 31bba9535be..da1222b561c 100644 --- a/compiler/tests/org/jetbrains/jet/compiler/CompileEnvironmentTest.java +++ b/compiler/tests/org/jetbrains/jet/compiler/CompileEnvironmentTest.java @@ -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 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])); diff --git a/stdlib/ktSrc/modules/ModuleBuilder.kt b/stdlib/ktSrc/modules/ModuleBuilder.kt index 39097b7d818..487ef408f20 100644 --- a/stdlib/ktSrc/modules/ModuleBuilder.kt +++ b/stdlib/ktSrc/modules/ModuleBuilder.kt @@ -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() - - fun module(name: String, callback: ModuleBuilder.() -> Unit) { - val builder = ModuleBuilder(name) - builder.callback() - modules.add(builder) - } - - override fun getModules(): List? = 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 = ArrayList() private val classpathRoots0: ArrayList = ArrayList() - 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? = sourceFiles0 override fun getClasspathRoots(): List? = classpathRoots0 override fun getModuleName(): String? = name - override fun getJarName(): String? = _jarName - -} - -class ModuleBuilder2(name: String): ModuleBuilder(name) { - - } diff --git a/stdlib/src/jet/modules/AllModules.java b/stdlib/src/jet/modules/AllModules.java new file mode 100644 index 00000000000..52a4595b8ca --- /dev/null +++ b/stdlib/src/jet/modules/AllModules.java @@ -0,0 +1,10 @@ +/* + * @author max + */ +package jet.modules; + +import java.util.ArrayList; + +public class AllModules { + public static final ArrayList modules = new ArrayList(); +} diff --git a/stdlib/src/jet/modules/IModuleSetBuilder.java b/stdlib/src/jet/modules/IModuleSetBuilder.java deleted file mode 100644 index 7f5f03dc3d2..00000000000 --- a/stdlib/src/jet/modules/IModuleSetBuilder.java +++ /dev/null @@ -1,10 +0,0 @@ -package jet.modules; - -import java.util.List; - -/** - * @author yole - */ -public interface IModuleSetBuilder { - List getModules(); -} diff --git a/stdlib/src/jet/modules/IModuleBuilder.java b/stdlib/src/jet/modules/Module.java similarity index 74% rename from stdlib/src/jet/modules/IModuleBuilder.java rename to stdlib/src/jet/modules/Module.java index f455eb5fabc..649ffb25174 100644 --- a/stdlib/src/jet/modules/IModuleBuilder.java +++ b/stdlib/src/jet/modules/Module.java @@ -5,9 +5,8 @@ import java.util.List; /** * @author yole */ -public interface IModuleBuilder { +public interface Module { String getModuleName(); List getSourceFiles(); List getClasspathRoots(); - String getJarName(); }