properr names for scripts

This commit is contained in:
Alex Tkachman
2012-07-29 23:58:45 +03:00
parent f8391619a5
commit 7c2d394412
9 changed files with 69 additions and 12 deletions
-3
View File
@@ -410,9 +410,6 @@
<inspection_tool class="UtilityClassWithPublicConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="UtilityClassWithoutPrivateConstructor" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoreClassesWithOnlyMain" value="false" />
<option name="ignorableAnnotations">
<value />
</option>
</inspection_tool>
<inspection_tool class="VolatileLongOrDoubleField" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="WaitNotInLoop" enabled="true" level="WARNING" enabled_by_default="true" />
@@ -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));
}
}
@@ -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;
}
}
@@ -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);
@@ -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();
+1 -1
View File
@@ -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)
@@ -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)
@@ -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());
@@ -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");