diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java index 54f8eeaf88f..86197dc6b85 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java @@ -43,6 +43,7 @@ import java.util.*; import static org.jetbrains.jet.codegen.JvmCodegenUtil.isInterface; import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.resolve.calls.callUtil.CallUtilPackage.getResolvedCall; +import static org.jetbrains.jet.lang.resolve.source.SourcePackage.toSourceElement; public class CodegenBinding { public static final WritableSlice CLOSURE = Slices.createSimpleSlice(); @@ -136,23 +137,6 @@ public class CodegenBinding { return getAsmType(bindingContext, anonymousClassForFunction(bindingContext, descriptor)); } - // SCRIPT: register asmType for script descriptor, move to ScriptingUtil - public static void registerClassNameForScript( - BindingTrace bindingTrace, - @NotNull ScriptDescriptor scriptDescriptor, - @NotNull Type asmType - ) { - String simpleName = asmType.getInternalName().substring(asmType.getInternalName().lastIndexOf('/') + 1); - ClassDescriptorImpl classDescriptor = - new ClassDescriptorImpl(scriptDescriptor, Name.special(""), Modality.FINAL, - Collections.singleton(KotlinBuiltIns.getInstance().getAnyType()), SourceElement.NO_SOURCE); - classDescriptor.initialize(JetScope.EMPTY, Collections.emptySet(), null); - - recordClosure(bindingTrace, null, classDescriptor, null, asmType); - - bindingTrace.record(CLASS_FOR_SCRIPT, scriptDescriptor, classDescriptor); - } - public static boolean canHaveOuter(@NotNull BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) { if (classDescriptor.getKind() != ClassKind.CLASS) { return false; @@ -168,7 +152,7 @@ public class CodegenBinding { static void recordClosure( @NotNull BindingTrace bindingTrace, - @Nullable JetElement element, + @NotNull JetElement element, @NotNull ClassDescriptor classDescriptor, @Nullable ClassDescriptor enclosing, @NotNull Type asmType @@ -218,16 +202,21 @@ public class CodegenBinding { } // SCRIPT: register asmType for script, move to ScriptingUtil - public static void registerClassNameForScript( - BindingTrace bindingTrace, - @NotNull JetScript jetScript, - @NotNull Type asmType - ) { - ScriptDescriptor descriptor = bindingTrace.getBindingContext().get(SCRIPT, jetScript); + public static void registerClassNameForScript(@NotNull BindingTrace trace, @NotNull JetScript script, @NotNull Type asmType) { + ScriptDescriptor descriptor = trace.getBindingContext().get(SCRIPT, script); if (descriptor == null) { - throw new IllegalStateException("Descriptor is not found for PSI " + jetScript); + throw new IllegalStateException("Script descriptor is not found for PSI: " + JetPsiUtil.getElementTextWithContext(script)); } - registerClassNameForScript(bindingTrace, descriptor, asmType); + + String simpleName = asmType.getInternalName().substring(asmType.getInternalName().lastIndexOf('/') + 1); + ClassDescriptorImpl classDescriptor = + new ClassDescriptorImpl(descriptor, Name.special(""), Modality.FINAL, + Collections.singleton(KotlinBuiltIns.getInstance().getAnyType()), toSourceElement(script)); + classDescriptor.initialize(JetScope.EMPTY, Collections.emptySet(), null); + + recordClosure(trace, script, classDescriptor, null, asmType); + + trace.record(CLASS_FOR_SCRIPT, descriptor, classDescriptor); } @NotNull @@ -294,7 +283,7 @@ public class CodegenBinding { @Nullable private static ResolvedCall findSuperCall( @NotNull BindingContext bindingContext, - @Nullable JetElement classOrObject + @NotNull JetElement classOrObject ) { if (!(classOrObject instanceof JetClassOrObject)) { return null; diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java index 160ff70ac2b..77d01d2936f 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java @@ -23,6 +23,7 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.impl.PsiFileFactoryImpl; @@ -49,8 +50,8 @@ import org.jetbrains.jet.lang.parsing.JetParserDefinition; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetScript; import org.jetbrains.jet.lang.resolve.*; -import org.jetbrains.jet.lang.resolve.java.TopDownAnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.JvmClassName; +import org.jetbrains.jet.lang.resolve.java.TopDownAnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; @@ -77,6 +78,7 @@ import java.util.List; import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses; import static org.jetbrains.jet.codegen.binding.CodegenBinding.registerClassNameForScript; +import static org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils.descriptorToDeclaration; public class ReplInterpreter { private int lineNumber = 0; @@ -366,8 +368,11 @@ public class ReplInterpreter { ScriptDescriptor earlierDescriptor = pair.first; Type earlierClassType = pair.second; - registerClassNameForScript(state.getBindingTrace(), earlierDescriptor, earlierClassType); - earlierScriptDescriptors.add(earlierDescriptor); + PsiElement jetScript = descriptorToDeclaration(earlierDescriptor); + if (jetScript != null) { + registerClassNameForScript(state.getBindingTrace(), (JetScript) jetScript, earlierClassType); + earlierScriptDescriptors.add(earlierDescriptor); + } } state.setEarlierScriptsForReplInterpreter(earlierScriptDescriptors); }