diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index c32215fa850..ecbb549a197 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -55,8 +55,6 @@ import java.util.List; import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; -import static org.jetbrains.jet.lang.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR; -import static org.jetbrains.jet.lang.resolve.BindingContextUtils.getNotNull; public class NamespaceCodegen extends MemberCodegen { @NotNull @@ -142,33 +140,16 @@ public class NamespaceCodegen extends MemberCodegen { } private void writeKotlinPackageAnnotationIfNeeded(@NotNull MemberMap members) { - DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(members)); - ProtoBuf.Package.Builder packageProto = ProtoBuf.Package.newBuilder(); - boolean writeAnnotation = false; - for (JetFile file : files) { - for (JetDeclaration declaration : file.getDeclarations()) { - if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) { - writeAnnotation = true; - DeclarationDescriptor descriptor = getNotNull(state.getBindingContext(), DECLARATION_TO_DESCRIPTOR, declaration); - ProtoBuf.Callable proto = serializer.callableProto((CallableMemberDescriptor) descriptor).build(); - packageProto.addMember(proto); - } - else if (declaration instanceof JetObjectDeclaration) { - writeAnnotation = true; - JetObjectDeclarationName nameAsDeclaration = ((JetObjectDeclaration) declaration).getNameAsDeclaration(); - assert nameAsDeclaration != null : "Should be a named object"; - PropertyDescriptor propertyForObject = getNotNull(state.getBindingContext(), BindingContext.OBJECT_DECLARATION, - nameAsDeclaration); - ProtoBuf.Callable proto = serializer.callableProto(propertyForObject).build(); - packageProto.addMember(proto); - } - } + if (file.isScript()) return; } - if (!writeAnnotation) return; + DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(members)); + ProtoBuf.Package packageProto = serializer.packageProto(descriptor).build(); - PackageData data = new PackageData(createNameResolver(serializer.getNameTable()), packageProto.build()); + if (packageProto.getMemberCount() == 0) return; + + PackageData data = new PackageData(createNameResolver(serializer.getNameTable()), packageProto); AnnotationVisitor av = v.getClassBuilder().newAnnotation(JvmStdlibNames.KOTLIN_PACKAGE.getDescriptor(), true); av.visit(JvmStdlibNames.ABI_VERSION_NAME, JvmAbi.VERSION); diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java index e4216294e92..1f36f81eac3 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java @@ -379,6 +379,19 @@ public class DescriptorSerializer { return builder; } + @NotNull + public ProtoBuf.Package.Builder packageProto(@NotNull NamespaceDescriptor descriptor) { + ProtoBuf.Package.Builder builder = ProtoBuf.Package.newBuilder(); + + for (DeclarationDescriptor declaration : sort(descriptor.getMemberScope().getAllDescriptors())) { + if (declaration instanceof PropertyDescriptor || declaration instanceof FunctionDescriptor) { + builder.addMember(callableProto((CallableMemberDescriptor) declaration)); + } + } + + return builder; + } + @NotNull private static ProtoBuf.Type.Argument.Projection projection(@NotNull Variance projectionKind) { switch (projectionKind) {