From 9e325b3ebec5f494b7231a2f40f1153ae98e5d66 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 23 May 2014 22:10:34 +0400 Subject: [PATCH] Remove heuristic from PackageCodegen Implement the logic in a more straightforward way, move the heuristic to JavaElementFinder where it was also used --- .../jet/codegen/ClassBuilderOnDemand.java | 6 +--- .../jetbrains/jet/codegen/PackageCodegen.java | 35 +++---------------- .../jet/asJava/JavaElementFinder.java | 33 ++++++++++------- 3 files changed, 26 insertions(+), 48 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java index 87a1f1c3adb..c13407e2901 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java @@ -34,12 +34,8 @@ public class ClassBuilderOnDemand { } public void done() { - if (isActivated()) { + if (classBuilder.isComputed()) { classBuilder.invoke().done(); } } - - public boolean isActivated() { - return classBuilder.isComputed(); - } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java index 4fec035d0d0..635e5b3ef4d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java @@ -186,10 +186,6 @@ public class PackageCodegen { public void generate(@NotNull CompilationErrorHandler errorHandler) { List bindings = new ArrayList(files.size() + 1); - boolean shouldGeneratePackageClass = shouldGeneratePackageClass(files); - if (shouldGeneratePackageClass) { - bindings.add(v.getClassBuilder().getSerializationBindings()); - } Map generateCallableMemberTasks = new HashMap(); @@ -214,21 +210,16 @@ public class PackageCodegen { } } - if (shouldGeneratePackageClass) { - // Shouldn't generate delegations to previously compiled if we compile only "classes" part of a package. - generateDelegationsToPreviouslyCompiled(generateCallableMemberTasks); - } + if (generateCallableMemberTasks.isEmpty()) return; + + generateDelegationsToPreviouslyCompiled(generateCallableMemberTasks); for (CallableMemberDescriptor member : Ordering.from(MemberComparator.INSTANCE).sortedCopy(generateCallableMemberTasks.keySet())) { generateCallableMemberTasks.get(member).run(); } - if (shouldGeneratePackageClass) { - writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings)); - } - - assert v.isActivated() == shouldGeneratePackageClass : - "Different algorithms for generating package class and for heuristics for: " + packageFragment; + bindings.add(v.getClassBuilder().getSerializationBindings()); + writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings)); } private void writeKotlinPackageAnnotationIfNeeded(@NotNull JvmSerializationBindings bindings) { @@ -357,22 +348,6 @@ public class PackageCodegen { MemberCodegen.genClassOrObject(context, classOrObject, state, null); } - /** - * @param packageFiles all files should have same package name - * @return - */ - public static boolean shouldGeneratePackageClass(@NotNull Collection packageFiles) { - for (JetFile file : packageFiles) { - for (JetDeclaration declaration : file.getDeclarations()) { - if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { - return true; - } - } - } - - return false; - } - public void done() { v.done(); } 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 58df4ccf360..8ed972c3442 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 @@ -34,10 +34,7 @@ import com.intellij.util.SmartList; import com.intellij.util.containers.SLRUCache; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.codegen.PackageCodegen; -import org.jetbrains.jet.lang.psi.JetClassOrObject; -import org.jetbrains.jet.lang.psi.JetEnumEntry; -import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -144,20 +141,30 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade private void findPackageClass(FqName qualifiedName, GlobalSearchScope scope, List answer) { Collection filesForPackage = lightClassGenerationSupport.findFilesForPackage(qualifiedName, scope); + if (!shouldGeneratePackageClass(filesForPackage)) return; - if (!filesForPackage.isEmpty() && PackageCodegen.shouldGeneratePackageClass(filesForPackage)) { - KotlinLightClassForPackage lightClass = KotlinLightClassForPackage.create(psiManager, qualifiedName, scope, filesForPackage); - if (lightClass != null) { - answer.add(lightClass); + KotlinLightClassForPackage lightClass = KotlinLightClassForPackage.create(psiManager, qualifiedName, scope, filesForPackage); + if (lightClass == null) return; - if (filesForPackage.size() > 1) { - for (JetFile file : filesForPackage) { - FakeLightClassForFileOfPackage fakeLightClass = new FakeLightClassForFileOfPackage(psiManager, lightClass, file); - answer.add(fakeLightClass); - } + answer.add(lightClass); + + if (filesForPackage.size() > 1) { + for (JetFile file : filesForPackage) { + answer.add(new FakeLightClassForFileOfPackage(psiManager, lightClass, file)); + } + } + } + + private static boolean shouldGeneratePackageClass(@NotNull Collection packageFiles) { + for (JetFile file : packageFiles) { + for (JetDeclaration declaration : file.getDeclarations()) { + if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { + return true; } } } + + return false; } @NotNull