diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java index 5819e4ba3c5..c5979138626 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.codegen; -import com.google.common.collect.Sets; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.util.io.FileUtil; @@ -24,6 +23,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.util.ArrayUtil; import com.intellij.util.PathUtil; +import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.AnnotationVisitor; @@ -59,12 +59,9 @@ public class PackageCodegen extends GenerationStateAware { @NotNull private final ClassBuilderOnDemand v; - @NotNull - private final FqName name; - @NotNull private final Collection files; - private final Set packageFragments; + private final PackageFragmentDescriptor packageFragment; public PackageCodegen( @NotNull ClassBuilderOnDemand v, @@ -73,16 +70,10 @@ public class PackageCodegen extends GenerationStateAware { @NotNull Collection packageFiles ) { super(state); - checkAllFilesHaveSamePackage(packageFiles); this.v = v; - name = fqName; this.files = packageFiles; - - packageFragments = Sets.newHashSet(); - for (JetFile file : packageFiles) { - packageFragments.add(getPackageFragment(file)); - } + this.packageFragment = getOnlyPackageFragment(); final PsiFile sourceFile = packageFiles.size() == 1 ? packageFiles.iterator().next().getContainingFile() : null; @@ -137,7 +128,7 @@ public class PackageCodegen extends GenerationStateAware { } assert v.isActivated() == shouldGeneratePackageClass : - "Different algorithms for generating package class and for heuristics for: " + name.asString(); + "Different algorithms for generating package class and for heuristics for: " + packageFragment; } private void writeKotlinPackageAnnotationIfNeeded(@NotNull JvmSerializationBindings bindings) { @@ -151,7 +142,7 @@ public class PackageCodegen extends GenerationStateAware { } DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(bindings)); - ProtoBuf.Package packageProto = serializer.packageProto(packageFragments).build(); + ProtoBuf.Package packageProto = serializer.packageProto(Collections.singleton(packageFragment)).build(); if (packageProto.getMemberCount() == 0) return; @@ -171,8 +162,8 @@ public class PackageCodegen extends GenerationStateAware { @Nullable private ClassBuilder generate(@NotNull JetFile file) { boolean generateSrcClass = false; - Type packagePartType = getPackagePartType(getPackageClassFqName(name), file.getVirtualFile()); - PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(getPackageFragment(file), packagePartType); + Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile()); + PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType); for (JetDeclaration declaration : file.getDeclarations()) { if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { @@ -196,7 +187,7 @@ public class PackageCodegen extends GenerationStateAware { new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate(); - FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, getPackageFragment(file)); + FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, packageFragment); //TODO: FIX: Default method generated at facade without delegation MemberCodegen memberCodegen = new MemberCodegen(state, null, packageFacade, null) { @NotNull @@ -215,16 +206,26 @@ public class PackageCodegen extends GenerationStateAware { } @NotNull - private PackageFragmentDescriptor getPackageFragment(@NotNull JetFile file) { - PackageFragmentDescriptor packageFragment = bindingContext.get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file); - assert packageFragment != null : "package fragment is null for " + file; - return packageFragment; + private PackageFragmentDescriptor getOnlyPackageFragment() { + SmartList fragments = new SmartList(); + for (JetFile file : files) { + PackageFragmentDescriptor fragment = bindingContext.get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file); + assert fragment != null : "package fragment is null for " + file; + + if (!fragments.contains(fragment)) { + fragments.add(fragment); + } + } + if (fragments.size() != 1) { + throw new IllegalStateException("More than one package fragment, files: " + files + " | fragments: " + fragments); + } + return fragments.get(0); } public void generateClassOrObject(@NotNull JetClassOrObject classOrObject) { JetFile file = (JetFile) classOrObject.getContainingFile(); - Type packagePartType = getPackagePartType(getPackageClassFqName(name), file.getVirtualFile()); - CodegenContext context = CodegenContext.STATIC.intoPackagePart(getPackageFragment(file), packagePartType); + Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile()); + CodegenContext context = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType); MemberCodegen.genClassOrObject(context, classOrObject, state, null); } @@ -233,8 +234,6 @@ public class PackageCodegen extends GenerationStateAware { * @return */ public static boolean shouldGeneratePackageClass(@NotNull Collection packageFiles) { - checkAllFilesHaveSamePackage(packageFiles); - for (JetFile file : packageFiles) { for (JetDeclaration declaration : file.getDeclarations()) { if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { @@ -246,21 +245,6 @@ public class PackageCodegen extends GenerationStateAware { return false; } - private static void checkAllFilesHaveSamePackage(Collection packageFiles) { - FqName commonFqName = null; - for (JetFile file : packageFiles) { - FqName fqName = file.getPackageFqName(); - if (commonFqName != null) { - if (!commonFqName.equals(fqName)) { - throw new IllegalArgumentException("All files should have same package name"); - } - } - else { - commonFqName = file.getPackageFqName(); - } - } - } - public void done() { v.done(); }