Don't create namespace class for file if codegen won't do so

This commit is contained in:
Nikolay Krasko
2012-06-18 16:08:05 +04:00
parent 7c17c84f0b
commit 7b4fda4345
5 changed files with 40 additions and 25 deletions
@@ -28,7 +28,7 @@ public abstract class ClassBuilderOnDemand {
private ClassBuilder classBuilder; private ClassBuilder classBuilder;
private List<ClassBuilderCallback> optionalDeclarations = Lists.newArrayList(); private final List<ClassBuilderCallback> optionalDeclarations = Lists.newArrayList();
interface ClassBuilderCallback { interface ClassBuilderCallback {
void doSomething(@NotNull ClassBuilder classBuilder); void doSomething(@NotNull ClassBuilder classBuilder);
@@ -60,4 +60,8 @@ public abstract class ClassBuilderOnDemand {
classBuilder.done(); classBuilder.done();
} }
} }
public boolean isActivated() {
return classBuilder != null;
}
} }
@@ -131,8 +131,8 @@ public class GenerationState {
return Pair.create(className, getFactory().forAnonymousSubclass(className)); return Pair.create(className, getFactory().forAnonymousSubclass(className));
} }
public NamespaceCodegen forNamespace(FqName fqName, Collection<JetFile> namespace) { public NamespaceCodegen forNamespace(FqName fqName, Collection<JetFile> jetFiles) {
return getFactory().forNamespace(fqName, namespace); return getFactory().forNamespace(fqName, jetFiles);
} }
private void beforeCompile() { private void beforeCompile() {
@@ -181,8 +181,8 @@ public class GenerationState {
progress); progress);
} }
protected void generateNamespace(FqName fqName, Collection<JetFile> namespace, CompilationErrorHandler errorHandler, Progress progress) { protected void generateNamespace(FqName fqName, Collection<JetFile> jetFiles, CompilationErrorHandler errorHandler, Progress progress) {
NamespaceCodegen codegen = forNamespace(fqName, namespace); NamespaceCodegen codegen = forNamespace(fqName, jetFiles);
codegen.generate(errorHandler, progress); codegen.generate(errorHandler, progress);
} }
@@ -27,9 +27,9 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.name.FqName;
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.utils.Progress; import org.jetbrains.jet.utils.Progress;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
@@ -120,6 +120,8 @@ public class NamespaceCodegen {
} }
} }
assert v.isActivated() == shouldGenerateNSClass(files) : "Different algorithms for generating namespace class and for heuristics";
if (hasNonConstantPropertyInitializers()) { if (hasNonConstantPropertyInitializers()) {
generateStaticInitializers(); generateStaticInitializers();
} }
@@ -193,6 +195,18 @@ public class NamespaceCodegen {
} }
} }
public static boolean shouldGenerateNSClass(Collection<JetFile> files) {
for (JetFile file : files) {
for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
return true;
}
}
}
return false;
}
private void generateStaticInitializers() { private void generateStaticInitializers() {
final JetFile namespace = files.iterator().next(); // @todo: hack final JetFile namespace = files.iterator().next(); // @todo: hack
@@ -30,6 +30,7 @@ import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.NamespaceCodegen;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks; import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks;
import org.jetbrains.jet.lang.resolve.java.JetFilesProvider; import org.jetbrains.jet.lang.resolve.java.JetFilesProvider;
@@ -38,10 +39,7 @@ 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.util.QualifiedNamesUtil; import org.jetbrains.jet.util.QualifiedNamesUtil;
import java.util.HashSet; import java.util.*;
import java.util.List;
import java.util.Set;
import java.util.WeakHashMap;
public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacadeKotlinHacks.KotlinFinderMarker { public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacadeKotlinHacks.KotlinFinderMarker {
private final Project project; private final Project project;
@@ -118,7 +116,8 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
for (JetFile file : filesInScope) { for (JetFile file : filesInScope) {
final FqName packageName = JetPsiUtil.getFQName(file); final FqName packageName = JetPsiUtil.getFQName(file);
if (packageName != null && qualifiedName.getFqName().startsWith(packageName.getFqName())) { if (packageName != null && qualifiedName.getFqName().startsWith(packageName.getFqName())) {
if (qualifiedName.equals(QualifiedNamesUtil.combine(packageName, Name.identifier(JvmAbi.PACKAGE_CLASS)))) { if (qualifiedName.equals(QualifiedNamesUtil.combine(packageName, Name.identifier(JvmAbi.PACKAGE_CLASS))) &&
NamespaceCodegen.shouldGenerateNSClass(Arrays.asList(file))) {
answer.add(new JetLightClass(psiManager, file, qualifiedName)); answer.add(new JetLightClass(psiManager, file, qualifiedName));
} }
else { else {
@@ -34,22 +34,19 @@ import com.intellij.psi.impl.java.stubs.PsiJavaFileStub;
import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl; import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl;
import com.intellij.psi.impl.light.AbstractLightClass; import com.intellij.psi.impl.light.AbstractLightClass;
import com.intellij.psi.stubs.PsiClassHolderFileStub; import com.intellij.psi.stubs.PsiClassHolderFileStub;
import com.intellij.psi.stubs.PsiFileStub;
import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.util.*; import com.intellij.psi.util.*;
import com.intellij.util.containers.Stack; import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.codegen.ClassBuilder; import org.jetbrains.jet.codegen.*;
import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.jet.codegen.ClassBuilderMode;
import org.jetbrains.jet.codegen.CompilationErrorHandler;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetFunction; import org.jetbrains.jet.lang.psi.JetFunction;
import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.JetLanguage; import org.jetbrains.jet.plugin.JetLanguage;
import org.jetbrains.jet.util.QualifiedNamesUtil; import org.jetbrains.jet.util.QualifiedNamesUtil;
import org.jetbrains.jet.utils.Progress; import org.jetbrains.jet.utils.Progress;
@@ -104,9 +101,11 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa
return (PsiClass)stub.getPsi(); return (PsiClass)stub.getPsi();
} }
for (StubElement child : stub.getChildrenStubs()) { if (stub instanceof PsiClassStub || stub instanceof PsiFileStub) {
PsiClass answer = findClass(fqn, child); for (StubElement child : stub.getChildrenStubs()) {
if (answer != null) return answer; PsiClass answer = findClass(fqn, child);
if (answer != null) return answer;
}
} }
return null; return null;
@@ -205,7 +204,6 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa
} }
}; };
state.compileCorrectFiles(CompilationErrorHandler.THROW_EXCEPTION); state.compileCorrectFiles(CompilationErrorHandler.THROW_EXCEPTION);
state.getFactory().files(); state.getFactory().files();
@@ -213,13 +211,13 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa
} }
@Override @Override
public ItemPresentation getPresentation() { public boolean isEquivalentTo(PsiElement another) {
return ItemPresentationProviders.getItemPresentation(this); return another instanceof PsiClass && Comparing.equal(((PsiClass)another).getQualifiedName(), getQualifiedName());
} }
@Override @Override
public boolean isEquivalentTo(PsiElement another) { public ItemPresentation getPresentation() {
return another instanceof PsiClass && Comparing.equal(((PsiClass)another).getQualifiedName(), getQualifiedName()); return ItemPresentationProviders.getItemPresentation(this);
} }
@Override @Override