From 9239fa2ece182ea13c68e2f9681b8dc01267ec4d Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Mon, 17 Mar 2014 23:19:22 +0400 Subject: [PATCH] ScriptName now returns FqName, fully qualified with package name. Update usages and convert to internal format as needed. --- .../jetbrains/jet/codegen/KotlinCodegenFacade.java | 5 +++-- .../cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java | 3 ++- .../jet/lang/resolve/ScriptHeaderResolver.java | 3 ++- .../jetbrains/jet/lang/resolve/ScriptNameUtil.java | 10 ++++++---- compiler/testData/script/fib.pkg.ktscript | 11 +++++++++++ compiler/tests/org/jetbrains/jet/ScriptTest.java | 7 +++++++ .../org/jetbrains/jet/codegen/ScriptGenTest.java | 4 +++- 7 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/script/fib.pkg.ktscript diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java b/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java index 8b3a18ccdad..43953f4d96a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java @@ -38,10 +38,11 @@ public class KotlinCodegenFacade { for (JetFile file : state.getFiles()) { if (file.isScript()) { // SCRIPT: register class name for scripting from this file, move outside of this function - String name = ScriptNameUtil.classNameForScript(file); + FqName name = ScriptNameUtil.classNameForScript(file); JetScript script = file.getScript(); assert script != null; - registerClassNameForScript(state.getBindingTrace(), script, Type.getObjectType(name)); + Type type = AsmUtil.asmTypeByFqNameWithoutInnerClasses(name); + registerClassNameForScript(state.getBindingTrace(), script, type); } } 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 2e84d0c0caf..4905fa21640 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 @@ -235,7 +235,8 @@ public class KotlinToJVMBytecodeCompiler { }, AllModules.class.getClassLoader()) ); - return classLoader.loadClass(ScriptNameUtil.classNameForScript(environment.getSourceFiles().get(0))); + FqName nameForScript = ScriptNameUtil.classNameForScript(environment.getSourceFiles().get(0)); + return classLoader.loadClass(nameForScript.asString()); } catch (Exception e) { throw new RuntimeException("Failed to evaluate script: " + e, e); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java index 4c63a3fe0d5..fef172d49fd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java @@ -113,7 +113,8 @@ public class ScriptHeaderResolver { priority = 0; } - Name className = new FqName(ScriptNameUtil.classNameForScript((JetFile) script.getContainingFile()).replace('/', '.')).shortName(); + FqName nameForScript = ScriptNameUtil.classNameForScript((JetFile) script.getContainingFile()); + Name className = nameForScript.shortName(); ScriptDescriptor scriptDescriptor = new ScriptDescriptor(ns, priority, outerScope, className); //WriteThroughScope scriptScope = new WriteThroughScope( diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptNameUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptNameUtil.java index d8b26280fb9..917f467e0ef 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptNameUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptNameUtil.java @@ -20,12 +20,13 @@ import org.jetbrains.jet.lang.parsing.JetScriptDefinition; import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetPackageDirective; +import org.jetbrains.jet.lang.resolve.name.FqName; public class ScriptNameUtil { private ScriptNameUtil() { } - public static String classNameForScript(JetFile file) { + public static FqName classNameForScript(JetFile file) { JetScriptDefinition scriptDefinition = JetScriptDefinitionProvider.getInstance(file.getProject()).findScriptDefinition(file); String name = file.getName(); @@ -40,10 +41,11 @@ public class ScriptNameUtil { name = name.substring(0,index); } name = Character.toUpperCase(name.charAt(0)) + (name.length() == 0 ? "" : name.substring(1)); + name = name.replace('.', '_'); JetPackageDirective directive = file.getPackageDirective(); - if(directive != null && directive.getName().length() > 0) { - name = directive.getName().replace('.','/') + "/" + name; + if(directive != null && directive.getQualifiedName().length() > 0) { + name = directive.getQualifiedName() + "." + name; } - return name; + return new FqName(name); } } diff --git a/compiler/testData/script/fib.pkg.ktscript b/compiler/testData/script/fib.pkg.ktscript new file mode 100644 index 00000000000..f4c18333aee --- /dev/null +++ b/compiler/testData/script/fib.pkg.ktscript @@ -0,0 +1,11 @@ +package kotlin.scripting.fibonacci +// this script expected parameter num : Int + +fun fib(n: Int): Int { + val v = if(n < 2) 1 else fib(n-1) + fib(n-2) + System.out.println("fib($n)=$v") + return v +} + +System.out.println("num: $num") +val result = fib(num) diff --git a/compiler/tests/org/jetbrains/jet/ScriptTest.java b/compiler/tests/org/jetbrains/jet/ScriptTest.java index 44e01e45851..11f4061ea1a 100644 --- a/compiler/tests/org/jetbrains/jet/ScriptTest.java +++ b/compiler/tests/org/jetbrains/jet/ScriptTest.java @@ -49,6 +49,13 @@ public class ScriptTest { aClass.getConstructor(int.class).newInstance(4); } + @Test + public void testScriptWithPackage() throws Exception { + Class aClass = compileScript("fib.pkg.ktscript", numIntParam(), Collections.emptyList()); + Assert.assertNotNull(aClass); + aClass.getConstructor(int.class).newInstance(4); + } + @Test public void testScriptStandardExt() throws Exception { Class aClass = compileScript("fib.kt", numIntParam(), Collections.emptyList()); diff --git a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java index 9848761f04d..ec9ecbe8743 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.parsing.JetScriptDefinition; import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.ScriptNameUtil; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.utils.UtilsPackage; import java.lang.reflect.Constructor; @@ -52,7 +53,8 @@ public class ScriptGenTest extends CodegenTestCase { loadFile(filename); try { - Class scriptClass = generateClass(ScriptNameUtil.classNameForScript(myFiles.getPsiFile())); + FqName fqName = ScriptNameUtil.classNameForScript(myFiles.getPsiFile()); + Class scriptClass = generateClass(fqName.asString()); Constructor constructor = getConstructor(scriptClass); scriptInstance = constructor.newInstance(myFiles.getScriptParameterValues().toArray());