CodegenAnnotator has state anymore. Most likely to be completely removed soon

This commit is contained in:
Alex Tkachman
2012-08-28 11:19:52 +03:00
parent fbfc9a9420
commit 5ee0f0871f
4 changed files with 42 additions and 59 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.context.CodegenBinding;
import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
@@ -84,7 +85,7 @@ public class NamespaceCodegen {
} }
public void generate(CompilationErrorHandler errorHandler, final Progress progress) { 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) { for (JetFile file : files) {
VirtualFile vFile = file.getVirtualFile(); VirtualFile vFile = file.getVirtualFile();
@@ -107,6 +108,7 @@ public class NamespaceCodegen {
if (errorHandler != null) errorHandler.reportException(e, vFile == null ? "no file" : vFile.getUrl()); if (errorHandler != null) errorHandler.reportException(e, vFile == null ? "no file" : vFile.getUrl());
DiagnosticUtils.throwIfRunningOnServer(e); DiagnosticUtils.throwIfRunningOnServer(e);
if (ApplicationManager.getApplication().isInternal()) { if (ApplicationManager.getApplication().isInternal()) {
//noinspection CallToPrintStackTrace
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -16,7 +16,6 @@
package org.jetbrains.jet.codegen.context; package org.jetbrains.jet.codegen.context;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.*; 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.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; 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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
@@ -40,9 +38,6 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.*;
* @author alex.tkachman * @author alex.tkachman
*/ */
public class CodegenAnnotator { public class CodegenAnnotator {
private final MultiMap<FqName, JetFile> namespaceName2MultiNamespaceFiles = MultiMap.create();
private final MultiMap<FqName, JetFile> namespaceName2Files = MultiMap.create();
private BindingTrace bindingTrace; private BindingTrace bindingTrace;
private BindingContext bindingContext; private BindingContext bindingContext;
private List<JetFile> files; private List<JetFile> files;
@@ -63,11 +58,12 @@ public class CodegenAnnotator {
} }
public void init() { public void init() {
mapFilesToNamespaces(files); MyJetVisitorVoid visitor = new MyJetVisitorVoid();
prepareAnonymousClasses(); for (JetFile file : CodegenBinding.allFilesInNamespaces(bindingContext, files)) {
file.accept(visitor);
}
} }
private ClassDescriptor recordClassForFunction(FunctionDescriptor funDescriptor) { private ClassDescriptor recordClassForFunction(FunctionDescriptor funDescriptor) {
ClassDescriptor classDescriptor; ClassDescriptor classDescriptor;
int arity = funDescriptor.getValueParameters().size(); int arity = funDescriptor.getValueParameters().size();
@@ -89,52 +85,7 @@ public class CodegenAnnotator {
return classDescriptor; return classDescriptor;
} }
private void mapFilesToNamespaces(Collection<JetFile> files) { static <T> T peekFromStack(Stack<T> stack) {
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<FqName, Collection<JetFile>> entry : namespaceName2Files.entrySet()) {
for (JetFile jetFile : entry.getValue()) {
jetFile.accept(visitor);
}
Collection<JetFile> namespaceFiles = new ArrayList<JetFile>();
for (JetFile jetFile : entry.getValue()) {
Collection<JetDeclaration> fileFunctions = new ArrayList<JetDeclaration>();
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> T peekFromStack(Stack<T> stack) {
return stack.empty() ? null : stack.peek(); return stack.empty() ? null : stack.peek();
} }
@@ -26,16 +26,17 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; 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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.util.slicedmap.*; import org.jetbrains.jet.util.slicedmap.*;
import java.util.Collection;
import java.util.Collections; 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.*;
import static org.jetbrains.jet.lang.resolve.BindingContext.FUNCTION;
import static org.jetbrains.jet.lang.resolve.BindingContext.SCRIPT;
/** /**
* @author alex.tkachman * @author alex.tkachman
@@ -177,4 +178,33 @@ public class CodegenBinding {
} }
registerClassNameForScript(bindingTrace, descriptor, className); registerClassNameForScript(bindingTrace, descriptor, className);
} }
@NotNull public static Collection<JetFile> allFilesInNamespaces(BindingContext bindingContext, Collection<JetFile> 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<FqName> names = new HashSet<FqName>();
for (JetFile file : files) {
if (!file.isScript()) {
names.add(JetPsiUtil.getFQName(file));
}
}
final HashSet<JetFile> answer = new HashSet<JetFile>();
answer.addAll(files);
for (FqName name : names) {
final NamespaceDescriptor namespaceDescriptor = bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, name);
final Collection<JetFile> 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<JetFile> jetFiles = bindingContext.get(NAMESPACE_TO_FILES, namespaceDescriptor);
return jetFiles != null && jetFiles.size() > 1;
}
} }
@@ -161,7 +161,7 @@ public class JetPositionManager implements PositionManager {
if (result.isNull()) { if (result.isNull()) {
FqName fqName = JetPsiUtil.getFQName(namespace); FqName fqName = JetPsiUtil.getFQName(namespace);
boolean multiFileNamespace = typeMapper.getCodegenAnnotator().isMultiFileNamespace(fqName); boolean multiFileNamespace = isMultiFileNamespace(typeMapper.bindingContext, fqName);
String namespaceInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(fqName).getInternalName(); String namespaceInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(fqName).getInternalName();
if (multiFileNamespace) { if (multiFileNamespace) {
result.set(NamespaceCodegen.getMultiFileNamespaceInternalName(namespaceInternalName, namespace)); result.set(NamespaceCodegen.getMultiFileNamespaceInternalName(namespaceInternalName, namespace));