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:
@@ -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);
|
||||
|
||||
+13
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user