Code cleanup in PackageCodegen.

Converted set to one element (because it's always one element). Checking for all files to be in one package FQ name is redundant.
This commit is contained in:
Evgeny Gerashchenko
2014-02-13 22:14:57 +04:00
parent 5c8253c099
commit 00c2bd60e5
@@ -16,7 +16,6 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import com.google.common.collect.Sets;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.util.io.FileUtil; 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.psi.PsiFile;
import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtil;
import com.intellij.util.PathUtil; import com.intellij.util.PathUtil;
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.asm4.AnnotationVisitor; import org.jetbrains.asm4.AnnotationVisitor;
@@ -59,12 +59,9 @@ public class PackageCodegen extends GenerationStateAware {
@NotNull @NotNull
private final ClassBuilderOnDemand v; private final ClassBuilderOnDemand v;
@NotNull
private final FqName name;
@NotNull @NotNull
private final Collection<JetFile> files; private final Collection<JetFile> files;
private final Set<PackageFragmentDescriptor> packageFragments; private final PackageFragmentDescriptor packageFragment;
public PackageCodegen( public PackageCodegen(
@NotNull ClassBuilderOnDemand v, @NotNull ClassBuilderOnDemand v,
@@ -73,16 +70,10 @@ public class PackageCodegen extends GenerationStateAware {
@NotNull Collection<JetFile> packageFiles @NotNull Collection<JetFile> packageFiles
) { ) {
super(state); super(state);
checkAllFilesHaveSamePackage(packageFiles);
this.v = v; this.v = v;
name = fqName;
this.files = packageFiles; this.files = packageFiles;
this.packageFragment = getOnlyPackageFragment();
packageFragments = Sets.newHashSet();
for (JetFile file : packageFiles) {
packageFragments.add(getPackageFragment(file));
}
final PsiFile sourceFile = packageFiles.size() == 1 ? packageFiles.iterator().next().getContainingFile() : null; final PsiFile sourceFile = packageFiles.size() == 1 ? packageFiles.iterator().next().getContainingFile() : null;
@@ -137,7 +128,7 @@ public class PackageCodegen extends GenerationStateAware {
} }
assert v.isActivated() == shouldGeneratePackageClass : 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) { private void writeKotlinPackageAnnotationIfNeeded(@NotNull JvmSerializationBindings bindings) {
@@ -151,7 +142,7 @@ public class PackageCodegen extends GenerationStateAware {
} }
DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(bindings)); 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; if (packageProto.getMemberCount() == 0) return;
@@ -171,8 +162,8 @@ public class PackageCodegen extends GenerationStateAware {
@Nullable @Nullable
private ClassBuilder generate(@NotNull JetFile file) { private ClassBuilder generate(@NotNull JetFile file) {
boolean generateSrcClass = false; boolean generateSrcClass = false;
Type packagePartType = getPackagePartType(getPackageClassFqName(name), file.getVirtualFile()); Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile());
PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(getPackageFragment(file), packagePartType); PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType);
for (JetDeclaration declaration : file.getDeclarations()) { for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
@@ -196,7 +187,7 @@ public class PackageCodegen extends GenerationStateAware {
new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate(); 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 //TODO: FIX: Default method generated at facade without delegation
MemberCodegen memberCodegen = new MemberCodegen(state, null, packageFacade, null) { MemberCodegen memberCodegen = new MemberCodegen(state, null, packageFacade, null) {
@NotNull @NotNull
@@ -215,16 +206,26 @@ public class PackageCodegen extends GenerationStateAware {
} }
@NotNull @NotNull
private PackageFragmentDescriptor getPackageFragment(@NotNull JetFile file) { private PackageFragmentDescriptor getOnlyPackageFragment() {
PackageFragmentDescriptor packageFragment = bindingContext.get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file); SmartList<PackageFragmentDescriptor> fragments = new SmartList<PackageFragmentDescriptor>();
assert packageFragment != null : "package fragment is null for " + file; for (JetFile file : files) {
return packageFragment; 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) { public void generateClassOrObject(@NotNull JetClassOrObject classOrObject) {
JetFile file = (JetFile) classOrObject.getContainingFile(); JetFile file = (JetFile) classOrObject.getContainingFile();
Type packagePartType = getPackagePartType(getPackageClassFqName(name), file.getVirtualFile()); Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile());
CodegenContext context = CodegenContext.STATIC.intoPackagePart(getPackageFragment(file), packagePartType); CodegenContext context = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType);
MemberCodegen.genClassOrObject(context, classOrObject, state, null); MemberCodegen.genClassOrObject(context, classOrObject, state, null);
} }
@@ -233,8 +234,6 @@ public class PackageCodegen extends GenerationStateAware {
* @return * @return
*/ */
public static boolean shouldGeneratePackageClass(@NotNull Collection<JetFile> packageFiles) { public static boolean shouldGeneratePackageClass(@NotNull Collection<JetFile> packageFiles) {
checkAllFilesHaveSamePackage(packageFiles);
for (JetFile file : packageFiles) { for (JetFile file : packageFiles) {
for (JetDeclaration declaration : file.getDeclarations()) { for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
@@ -246,21 +245,6 @@ public class PackageCodegen extends GenerationStateAware {
return false; return false;
} }
private static void checkAllFilesHaveSamePackage(Collection<JetFile> 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() { public void done() {
v.done(); v.done();
} }