From 7b4fda4345d4e60dc9cd1ac4f4195a6e3e412954 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 18 Jun 2012 16:08:05 +0400 Subject: [PATCH] Don't create namespace class for file if codegen won't do so --- .../jet/codegen/ClassBuilderOnDemand.java | 6 ++++- .../jet/codegen/GenerationState.java | 8 +++--- .../jet/codegen/NamespaceCodegen.java | 16 +++++++++++- .../jet/asJava/JavaElementFinder.java | 9 +++---- .../jetbrains/jet/asJava/JetLightClass.java | 26 +++++++++---------- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java index c0dc194eafb..467800eaa9a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java @@ -28,7 +28,7 @@ public abstract class ClassBuilderOnDemand { private ClassBuilder classBuilder; - private List optionalDeclarations = Lists.newArrayList(); + private final List optionalDeclarations = Lists.newArrayList(); interface ClassBuilderCallback { void doSomething(@NotNull ClassBuilder classBuilder); @@ -60,4 +60,8 @@ public abstract class ClassBuilderOnDemand { classBuilder.done(); } } + + public boolean isActivated() { + return classBuilder != null; + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java index daffce8901c..2d5c4b856ee 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java @@ -131,8 +131,8 @@ public class GenerationState { return Pair.create(className, getFactory().forAnonymousSubclass(className)); } - public NamespaceCodegen forNamespace(FqName fqName, Collection namespace) { - return getFactory().forNamespace(fqName, namespace); + public NamespaceCodegen forNamespace(FqName fqName, Collection jetFiles) { + return getFactory().forNamespace(fqName, jetFiles); } private void beforeCompile() { @@ -181,8 +181,8 @@ public class GenerationState { progress); } - protected void generateNamespace(FqName fqName, Collection namespace, CompilationErrorHandler errorHandler, Progress progress) { - NamespaceCodegen codegen = forNamespace(fqName, namespace); + protected void generateNamespace(FqName fqName, Collection jetFiles, CompilationErrorHandler errorHandler, Progress progress) { + NamespaceCodegen codegen = forNamespace(fqName, jetFiles); codegen.generate(errorHandler, progress); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index f8e26ca741a..6e5ca5ca331 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -27,9 +27,9 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.psi.*; 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.JvmClassName; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.utils.Progress; 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()) { generateStaticInitializers(); } @@ -193,6 +195,18 @@ public class NamespaceCodegen { } } + public static boolean shouldGenerateNSClass(Collection files) { + for (JetFile file : files) { + for (JetDeclaration declaration : file.getDeclarations()) { + if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { + return true; + } + } + } + + return false; + } + private void generateStaticInitializers() { final JetFile namespace = files.iterator().next(); // @todo: hack diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java index de3344c6b23..63d6ba3a0ce 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JavaElementFinder.java @@ -30,6 +30,7 @@ import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.codegen.JetTypeMapper; +import org.jetbrains.jet.codegen.NamespaceCodegen; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks; 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.util.QualifiedNamesUtil; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.WeakHashMap; +import java.util.*; public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacadeKotlinHacks.KotlinFinderMarker { private final Project project; @@ -118,7 +116,8 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade for (JetFile file : filesInScope) { final FqName packageName = JetPsiUtil.getFQName(file); 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)); } else { diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java index 5d157337d09..abff90f239d 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/JetLightClass.java @@ -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.light.AbstractLightClass; import com.intellij.psi.stubs.PsiClassHolderFileStub; +import com.intellij.psi.stubs.PsiFileStub; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.util.*; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; -import org.jetbrains.jet.codegen.ClassBuilder; -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.codegen.*; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFunction; 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.name.FqName; import org.jetbrains.jet.plugin.JetLanguage; import org.jetbrains.jet.util.QualifiedNamesUtil; import org.jetbrains.jet.utils.Progress; @@ -104,9 +101,11 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa return (PsiClass)stub.getPsi(); } - for (StubElement child : stub.getChildrenStubs()) { - PsiClass answer = findClass(fqn, child); - if (answer != null) return answer; + if (stub instanceof PsiClassStub || stub instanceof PsiFileStub) { + for (StubElement child : stub.getChildrenStubs()) { + PsiClass answer = findClass(fqn, child); + if (answer != null) return answer; + } } return null; @@ -205,7 +204,6 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa } }; - state.compileCorrectFiles(CompilationErrorHandler.THROW_EXCEPTION); state.getFactory().files(); @@ -213,13 +211,13 @@ public class JetLightClass extends AbstractLightClass implements JetJavaMirrorMa } @Override - public ItemPresentation getPresentation() { - return ItemPresentationProviders.getItemPresentation(this); + public boolean isEquivalentTo(PsiElement another) { + return another instanceof PsiClass && Comparing.equal(((PsiClass)another).getQualifiedName(), getQualifiedName()); } @Override - public boolean isEquivalentTo(PsiElement another) { - return another instanceof PsiClass && Comparing.equal(((PsiClass)another).getQualifiedName(), getQualifiedName()); + public ItemPresentation getPresentation() { + return ItemPresentationProviders.getItemPresentation(this); } @Override