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.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();
}
}
@@ -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<FqName, JetFile> namespaceName2MultiNamespaceFiles = MultiMap.create();
private final MultiMap<FqName, JetFile> namespaceName2Files = MultiMap.create();
private BindingTrace bindingTrace;
private BindingContext bindingContext;
private List<JetFile> 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<JetFile> 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<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) {
static <T> T peekFromStack(Stack<T> stack) {
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.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<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()) {
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));