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");