CodegenAnnotator has state anymore. Most likely to be completely removed soon
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user