diff --git a/compiler/backend/src/org/jetbrains/jet/compiler/CompileEnvironment.java b/compiler/backend/src/org/jetbrains/jet/compiler/CompileEnvironment.java index 1987193c89a..ae74afa756c 100644 --- a/compiler/backend/src/org/jetbrains/jet/compiler/CompileEnvironment.java +++ b/compiler/backend/src/org/jetbrains/jet/compiler/CompileEnvironment.java @@ -7,6 +7,9 @@ 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.ExtensionFunction10; +import jet.Function1; import jet.modules.IModuleBuilder; import jet.modules.IModuleSetBuilder; import org.jetbrains.annotations.Nullable; @@ -18,6 +21,7 @@ import org.jetbrains.jet.lang.psi.JetPsiUtil; 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; @@ -198,17 +202,19 @@ public class CompileEnvironment { final IModuleSetBuilder moduleSetBuilder = (IModuleSetBuilder) moduleSetBuilderClass.newInstance(); Class namespaceClass = loader.loadClass("namespace"); - final Method[] methods = namespaceClass.getMethods(); + final Field[] fields = namespaceClass.getDeclaredFields(); boolean modulesDefined = false; - for (Method method : methods) { - if (method.getName().equals("defineModules")) { - method.invoke(null, moduleSetBuilder); + for (Field field : fields) { + if (field.getName().equals("modules")) { + field.setAccessible(true); + ExtensionFunction0 defineMudules = (ExtensionFunction0) field.get(null); + defineMudules.invoke(moduleSetBuilder); modulesDefined = true; break; } } if (!modulesDefined) { - throw new CompileEnvironmentException("Module script " + moduleFile + " must define a defineModules() method"); + throw new CompileEnvironmentException("Module script " + moduleFile + " must define a modules() property"); } return moduleSetBuilder; } catch (Exception e) { diff --git a/compiler/testData/compiler/smoke/Smoke.kts b/compiler/testData/compiler/smoke/Smoke.kts index 6cdcff74a64..d9429cd1b65 100644 --- a/compiler/testData/compiler/smoke/Smoke.kts +++ b/compiler/testData/compiler/smoke/Smoke.kts @@ -1,8 +1,6 @@ -import kotlin.modules.ModuleSetBuilder +import kotlin.modules.* -fun ModuleSetBuilder.defineModules() { - module("smoke") { - source files "Smoke.kt" - jar name System.getProperty("java.io.tmpdir") + "/smoke.jar" - } +val modules = module("smoke") { + source files "Smoke.kt" + jar name System.getProperty("java.io.tmpdir") + "/smoke.jar" } diff --git a/stdlib/ktSrc/ModuleBuilder.kt b/stdlib/ktSrc/modules/ModuleBuilder.kt similarity index 87% rename from stdlib/ktSrc/ModuleBuilder.kt rename to stdlib/ktSrc/modules/ModuleBuilder.kt index cf1ffcdd896..59784ab0521 100644 --- a/stdlib/ktSrc/ModuleBuilder.kt +++ b/stdlib/ktSrc/modules/ModuleBuilder.kt @@ -5,8 +5,14 @@ package 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 { - val modules: ArrayList = ArrayList() + private val modules = ArrayList() fun module(name: String, callback: ModuleBuilder.() -> Unit) { val builder = ModuleBuilder(name)