diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml index 6c2f8ad45ac..23bae163cd7 100644 --- a/.idea/inspectionProfiles/idea_default.xml +++ b/.idea/inspectionProfiles/idea_default.xml @@ -410,9 +410,6 @@ diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java index f534bca38c4..40c6fd5c329 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java @@ -143,7 +143,8 @@ public class GenerationState { public void compileCorrectFiles(@NotNull CompilationErrorHandler errorHandler) { for (JetFile file : this.files) { if (file.isScript()) { - injector.getClosureAnnotator().registerClassNameForScript(file.getScript(), ScriptCodegen.SCRIPT_DEFAULT_CLASS_NAME); + String name = ScriptCodegen.classNameForScript(file); + injector.getClosureAnnotator().registerClassNameForScript(file.getScript(), JvmClassName.byInternalName(name)); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java index ee07ca69c6f..c77570f51c5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java @@ -23,9 +23,9 @@ import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; -import org.jetbrains.jet.lang.psi.JetDeclaration; -import org.jetbrains.jet.lang.psi.JetScript; -import org.jetbrains.jet.lang.psi.JetTypeParameterListOwner; +import org.jetbrains.jet.lang.parsing.JetParserDefinition; +import org.jetbrains.jet.lang.parsing.JetScriptDefinition; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.JdkNames; import org.jetbrains.jet.lang.resolve.java.JvmClassName; @@ -35,6 +35,7 @@ import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; import javax.inject.Inject; +import java.io.File; import java.util.List; /** @@ -249,4 +250,20 @@ public class ScriptCodegen { public String getScriptFieldName(@NotNull ScriptDescriptor scriptDescriptor) { return "script$" + getScriptIndex(scriptDescriptor); } + + public static String classNameForScript(JetFile file) { + JetScriptDefinition scriptDefinition = JetParserDefinition.getInstance().findScriptDefinition(file); + + String name = file.getName(); + name = name.substring(0, name.length()-scriptDefinition.getExtension().length()); + int index = name.lastIndexOf(File.separatorChar); + if(index != -1) + name = name.substring(index+1); + name = Character.toUpperCase(name.charAt(0)) + name.substring(1); + JetNamespaceHeader header = file.getNamespaceHeader(); + if(header != null && header.getName().length() > 0) { + name = header.getName().replace('.','/') + "/" + name; + } + return name; + } } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index 41ea111b055..691db01af27 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -261,7 +261,8 @@ public class KotlinToJVMBytecodeCompiler { CompilerPathUtil.getRuntimePath().toURI().toURL() }, parentLoader == null ? AllModules.class.getClassLoader() : parentLoader)); - return classLoader.loadClass(ScriptCodegen.SCRIPT_DEFAULT_CLASS_NAME.getFqName().getFqName()); + JetFile scriptFile = configuration.getEnvironment().getSourceFiles().get(0); + return classLoader.loadClass(ScriptCodegen.classNameForScript(scriptFile)); } catch (Exception e) { throw new RuntimeException("Failed to evaluate script: " + e, e); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java index c43ad1ede94..a121449cdca 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java @@ -106,8 +106,23 @@ public class JetParsing extends AbstractJetParsing { void parseScript() { PsiBuilder.Marker fileMarker = mark(); - PsiBuilder.Marker scriptMarker = mark(); + PsiBuilder.Marker namespaceHeader = mark(); + parseModifierList(MODIFIER_LIST, true); + + if (at(PACKAGE_KEYWORD)) { + advance(); // PACKAGE_KEYWORD + + parseNamespaceName(); + + consumeIf(SEMICOLON); + namespaceHeader.done(NAMESPACE_HEADER); + } + else { + namespaceHeader.rollbackTo(); + } + + PsiBuilder.Marker scriptMarker = mark(); parseImportDirectives(); PsiBuilder.Marker blockMarker = mark(); diff --git a/compiler/testData/codegen/script/fib.lang.kt b/compiler/testData/codegen/script/fib.lang.kt index 87b9ac5c54a..fe7143e7cb2 100644 --- a/compiler/testData/codegen/script/fib.lang.kt +++ b/compiler/testData/codegen/script/fib.lang.kt @@ -1,4 +1,4 @@ -// this script expected parameter num : Int +// this script expects parameter num : Int fun fib(n: Int): Int { val v = if(n < 2) 1 else fib(n-1) + fib(n-2) diff --git a/compiler/testData/codegen/script/fibWithpackage.lang.kt b/compiler/testData/codegen/script/fibWithpackage.lang.kt new file mode 100644 index 00000000000..876bbdade33 --- /dev/null +++ b/compiler/testData/codegen/script/fibWithpackage.lang.kt @@ -0,0 +1,10 @@ +package test + +// this script expected parameter num : Int + +fun fib(n: Int): Int { + val v = if(n < 2) 1 else fib(n-1) + fib(n-2) + return v +} + +val result = fib(num) diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index 17cc5cbce3b..87d6e4fc171 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -188,7 +188,8 @@ public abstract class CodegenTestCase extends UsefulTestCase { try { if (myFiles.isScript()) { - Class scriptClass = loader.loadClass(ScriptCodegen.SCRIPT_DEFAULT_CLASS_NAME.getFqName().getFqName()); + String scriptClassName = ScriptCodegen.classNameForScript(myFiles.getPsiFile()); + Class scriptClass = loader.loadClass(scriptClassName); Constructor constructor = getConstructor(scriptClass, state.getScriptConstructorMethod()); scriptInstance = constructor.newInstance(myFiles.getScriptParameterValues().toArray()); diff --git a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java index 98c63b649b3..e9615b7f6d8 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java @@ -96,7 +96,22 @@ public class ScriptGenTest extends CodegenTestCase { public void testLanguage() { JetParserDefinition.getInstance().addScriptDefinition(new JetScriptDefinition(".lang.kt", new AnalyzerScriptParameter("num","jet.Int"))); loadFile("script/fib.lang.kt"); - final Class aClass = loadClass("Script", generateClassesInFile()); + final Class aClass = loadClass("Fib", generateClassesInFile()); + try { + Constructor constructor = aClass.getConstructor(int.class); + Field result = aClass.getField("result"); + Object script = constructor.newInstance(5); + assertEquals(8,result.get(script)); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void testLanguageWithPackage() { + JetParserDefinition.getInstance().addScriptDefinition(new JetScriptDefinition(".lang.kt", new AnalyzerScriptParameter("num","jet.Int"))); + loadFile("script/fibWithPackage.lang.kt"); + final Class aClass = loadClass("test.FibWithPackage", generateClassesInFile()); try { Constructor constructor = aClass.getConstructor(int.class); Field result = aClass.getField("result");