Serialize packages via descriptors in codegen

Disable KotlinPackage annotation for scripts, otherwise script analyzer tries
to add descriptors to a locked scope
This commit is contained in:
Alexander Udalov
2013-07-15 23:34:10 +04:00
parent d059a15bff
commit 196b829002
2 changed files with 19 additions and 25 deletions
@@ -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);
@@ -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) {