diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index 6fd45df0c30..61007f7c71b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; +import org.jetbrains.jet.codegen.context.CodegenBinding; import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; @@ -84,7 +85,7 @@ public class NamespaceCodegen { } public void generate(CompilationErrorHandler errorHandler, final Progress progress) { - boolean multiFile = state.getInjector().getCodegenAnnotator().isMultiFileNamespace(name); + boolean multiFile = CodegenBinding.isMultiFileNamespace(state.getBindingContext(), name); for (JetFile file : files) { VirtualFile vFile = file.getVirtualFile(); @@ -107,6 +108,7 @@ public class NamespaceCodegen { if (errorHandler != null) errorHandler.reportException(e, vFile == null ? "no file" : vFile.getUrl()); DiagnosticUtils.throwIfRunningOnServer(e); if (ApplicationManager.getApplication().isInternal()) { + //noinspection CallToPrintStackTrace e.printStackTrace(); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenAnnotator.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenAnnotator.java index 72ba1bcaeb6..241830531b3 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenAnnotator.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenAnnotator.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.codegen.context; -import com.intellij.util.containers.MultiMap; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; @@ -24,7 +23,6 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmClassName; -import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; @@ -40,9 +38,6 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.*; * @author alex.tkachman */ public class CodegenAnnotator { - private final MultiMap namespaceName2MultiNamespaceFiles = MultiMap.create(); - private final MultiMap namespaceName2Files = MultiMap.create(); - private BindingTrace bindingTrace; private BindingContext bindingContext; private List files; @@ -63,11 +58,12 @@ public class CodegenAnnotator { } public void init() { - mapFilesToNamespaces(files); - prepareAnonymousClasses(); + MyJetVisitorVoid visitor = new MyJetVisitorVoid(); + for (JetFile file : CodegenBinding.allFilesInNamespaces(bindingContext, files)) { + file.accept(visitor); + } } - private ClassDescriptor recordClassForFunction(FunctionDescriptor funDescriptor) { ClassDescriptor classDescriptor; int arity = funDescriptor.getValueParameters().size(); @@ -89,52 +85,7 @@ public class CodegenAnnotator { return classDescriptor; } - private void mapFilesToNamespaces(Collection files) { - for (JetFile file : files) { - if (file.isScript()) { - namespaceName2Files.putValue(FqName.ROOT, file); - } - else { - FqName fqName = JetPsiUtil.getFQName(file); - namespaceName2Files.putValue(fqName, file); - } - } - } - - private void prepareAnonymousClasses() { - MyJetVisitorVoid visitor = new MyJetVisitorVoid(); - for (Map.Entry> entry : namespaceName2Files.entrySet()) { - for (JetFile jetFile : entry.getValue()) { - jetFile.accept(visitor); - } - - Collection namespaceFiles = new ArrayList(); - for (JetFile jetFile : entry.getValue()) { - Collection fileFunctions = new ArrayList(); - for (JetDeclaration declaration : jetFile.getDeclarations()) { - if (declaration instanceof JetNamedFunction) { - fileFunctions.add(declaration); - } - } - - if (fileFunctions.size() > 0) { - namespaceFiles.add(jetFile); - } - } - - if (namespaceFiles.size() > 1) { - for (JetFile namespaceFile : namespaceFiles) { - namespaceName2MultiNamespaceFiles.putValue(entry.getKey(), namespaceFile); - } - } - } - } - - public boolean isMultiFileNamespace(FqName fqName) { - return namespaceName2MultiNamespaceFiles.get(fqName).size() > 0; - } - - static T peekFromStack(Stack stack) { + static T peekFromStack(Stack stack) { return stack.empty() ? null : stack.peek(); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenBinding.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenBinding.java index 0f63d95ce62..11e34fa648b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenBinding.java @@ -26,16 +26,17 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.JvmClassName; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.util.slicedmap.*; +import java.util.Collection; import java.util.Collections; +import java.util.HashSet; -import static org.jetbrains.jet.lang.resolve.BindingContext.CLASS; -import static org.jetbrains.jet.lang.resolve.BindingContext.FUNCTION; -import static org.jetbrains.jet.lang.resolve.BindingContext.SCRIPT; +import static org.jetbrains.jet.lang.resolve.BindingContext.*; /** * @author alex.tkachman @@ -177,4 +178,33 @@ public class CodegenBinding { } registerClassNameForScript(bindingTrace, descriptor, className); } + + @NotNull public static Collection allFilesInNamespaces(BindingContext bindingContext, Collection files) { + // todo: we use Set and add given files but ignoring other scripts because something non-clear kept in binding + // for scripts especially in case of REPL + + final HashSet names = new HashSet(); + for (JetFile file : files) { + if (!file.isScript()) { + names.add(JetPsiUtil.getFQName(file)); + } + } + + final HashSet answer = new HashSet(); + answer.addAll(files); + + for (FqName name : names) { + final NamespaceDescriptor namespaceDescriptor = bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, name); + final Collection jetFiles = bindingContext.get(NAMESPACE_TO_FILES, namespaceDescriptor); + if(jetFiles != null) + answer.addAll(jetFiles); + } + return answer; + } + + public static boolean isMultiFileNamespace(BindingContext bindingContext, FqName fqName) { + final NamespaceDescriptor namespaceDescriptor = bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, fqName); + final Collection jetFiles = bindingContext.get(NAMESPACE_TO_FILES, namespaceDescriptor); + return jetFiles != null && jetFiles.size() > 1; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java index be52e686f4b..23569f4d5e3 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java +++ b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java @@ -161,7 +161,7 @@ public class JetPositionManager implements PositionManager { if (result.isNull()) { FqName fqName = JetPsiUtil.getFQName(namespace); - boolean multiFileNamespace = typeMapper.getCodegenAnnotator().isMultiFileNamespace(fqName); + boolean multiFileNamespace = isMultiFileNamespace(typeMapper.bindingContext, fqName); String namespaceInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(fqName).getInternalName(); if (multiFileNamespace) { result.set(NamespaceCodegen.getMultiFileNamespaceInternalName(namespaceInternalName, namespace));