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.asm4.Opcodes.*;
|
||||||
import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver;
|
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 {
|
public class NamespaceCodegen extends MemberCodegen {
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -142,33 +140,16 @@ public class NamespaceCodegen extends MemberCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void writeKotlinPackageAnnotationIfNeeded(@NotNull MemberMap members) {
|
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 (JetFile file : files) {
|
||||||
for (JetDeclaration declaration : file.getDeclarations()) {
|
if (file.isScript()) return;
|
||||||
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 (!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);
|
AnnotationVisitor av = v.getClassBuilder().newAnnotation(JvmStdlibNames.KOTLIN_PACKAGE.getDescriptor(), true);
|
||||||
av.visit(JvmStdlibNames.ABI_VERSION_NAME, JvmAbi.VERSION);
|
av.visit(JvmStdlibNames.ABI_VERSION_NAME, JvmAbi.VERSION);
|
||||||
|
|||||||
+13
@@ -379,6 +379,19 @@ public class DescriptorSerializer {
|
|||||||
return builder;
|
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
|
@NotNull
|
||||||
private static ProtoBuf.Type.Argument.Projection projection(@NotNull Variance projectionKind) {
|
private static ProtoBuf.Type.Argument.Projection projection(@NotNull Variance projectionKind) {
|
||||||
switch (projectionKind) {
|
switch (projectionKind) {
|
||||||
|
|||||||
Reference in New Issue
Block a user