Write module name to metadata, fix reflection for file facades
Module name will be used for proper introspection of internal members
This commit is contained in:
@@ -836,9 +836,10 @@ public class AsmUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeKotlinSyntheticClassAnnotation(@NotNull ClassBuilder v) {
|
public static void writeKotlinSyntheticClassAnnotation(@NotNull ClassBuilder v, @NotNull GenerationState state) {
|
||||||
AnnotationVisitor av = v.newAnnotation(Type.getObjectType(KotlinSyntheticClass.CLASS_NAME.getInternalName()).getDescriptor(), true);
|
AnnotationVisitor av = v.newAnnotation(Type.getObjectType(KotlinSyntheticClass.CLASS_NAME.getInternalName()).getDescriptor(), true);
|
||||||
JvmCodegenUtil.writeAbiVersion(av);
|
JvmCodegenUtil.writeAbiVersion(av);
|
||||||
|
JvmCodegenUtil.writeModuleName(av, state);
|
||||||
av.visitEnd();
|
av.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ import java.util.List;
|
|||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.ExpressionCodegen.generateClassLiteralReference;
|
import static org.jetbrains.kotlin.codegen.ExpressionCodegen.generateClassLiteralReference;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConst;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConst;
|
||||||
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeModuleName;
|
||||||
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE;
|
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE;
|
||||||
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.asmTypeForAnonymousClass;
|
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.asmTypeForAnonymousClass;
|
||||||
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage.getBuiltIns;
|
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage.getBuiltIns;
|
||||||
@@ -218,7 +219,7 @@ public class ClosureCodegen extends MemberCodegen<JetElement> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void generateKotlinAnnotation() {
|
protected void generateKotlinAnnotation() {
|
||||||
writeKotlinSyntheticClassAnnotation(v);
|
writeKotlinSyntheticClassAnnotation(v, state);
|
||||||
|
|
||||||
DescriptorSerializer serializer =
|
DescriptorSerializer serializer =
|
||||||
DescriptorSerializer.createTopLevel(new JvmSerializerExtension(v.getSerializationBindings(), typeMapper));
|
DescriptorSerializer.createTopLevel(new JvmSerializerExtension(v.getSerializationBindings(), typeMapper));
|
||||||
@@ -227,6 +228,7 @@ public class ClosureCodegen extends MemberCodegen<JetElement> {
|
|||||||
|
|
||||||
AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CALLABLE), true);
|
AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CALLABLE), true);
|
||||||
writeAnnotationData(av, serializer, functionProto);
|
writeAnnotationData(av, serializer, functionProto);
|
||||||
|
writeModuleName(av, state);
|
||||||
av.visitEnd();
|
av.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -264,6 +264,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
|
|
||||||
AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CLASS), true);
|
AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CLASS), true);
|
||||||
writeAnnotationData(av, serializer, classProto);
|
writeAnnotationData(av, serializer, classProto);
|
||||||
|
writeModuleName(av, state);
|
||||||
av.visitEnd();
|
av.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,7 +280,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, String> KOTLIN_MARKER_INTERFACES = new HashMap<String, String>();
|
private static final Map<String, String> KOTLIN_MARKER_INTERFACES = new HashMap<String, String>();
|
||||||
static {
|
static {
|
||||||
KOTLIN_MARKER_INTERFACES.put("kotlin.Iterator", "kotlin/jvm/internal/markers/KMappedMarker");
|
KOTLIN_MARKER_INTERFACES.put("kotlin.Iterator", "kotlin/jvm/internal/markers/KMappedMarker");
|
||||||
KOTLIN_MARKER_INTERFACES.put("kotlin.Iterable", "kotlin/jvm/internal/markers/KMappedMarker");
|
KOTLIN_MARKER_INTERFACES.put("kotlin.Iterable", "kotlin/jvm/internal/markers/KMappedMarker");
|
||||||
|
|||||||
@@ -148,6 +148,6 @@ public class InterfaceImplBodyCodegen(
|
|||||||
val av = v.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(KOTLIN_INTERFACE_DEFAULT_IMPLS), true)
|
val av = v.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(KOTLIN_INTERFACE_DEFAULT_IMPLS), true)
|
||||||
av.visit(JvmAnnotationNames.VERSION_FIELD_NAME, JvmAbi.VERSION.toArray())
|
av.visit(JvmAnnotationNames.VERSION_FIELD_NAME, JvmAbi.VERSION.toArray())
|
||||||
av.visitEnd()
|
av.visitEnd()
|
||||||
AsmUtil.writeKotlinSyntheticClassAnnotation(v)
|
AsmUtil.writeKotlinSyntheticClassAnnotation(v, state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.codegen.context.CodegenContext;
|
|||||||
import org.jetbrains.kotlin.codegen.context.MethodContext;
|
import org.jetbrains.kotlin.codegen.context.MethodContext;
|
||||||
import org.jetbrains.kotlin.codegen.context.PackageContext;
|
import org.jetbrains.kotlin.codegen.context.PackageContext;
|
||||||
import org.jetbrains.kotlin.codegen.context.RootContext;
|
import org.jetbrains.kotlin.codegen.context.RootContext;
|
||||||
|
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
||||||
import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
|
import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi;
|
import org.jetbrains.kotlin.load.java.JvmAbi;
|
||||||
@@ -228,6 +229,13 @@ public class JvmCodegenUtil {
|
|||||||
av.visit(JvmAnnotationNames.OLD_ABI_VERSION_FIELD_NAME, JvmAbi.VERSION.getMinor());
|
av.visit(JvmAnnotationNames.OLD_ABI_VERSION_FIELD_NAME, JvmAbi.VERSION.getMinor());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void writeModuleName(@NotNull AnnotationVisitor av, @NotNull GenerationState state) {
|
||||||
|
String name = state.getModuleName();
|
||||||
|
if (!name.equals(JvmAbi.DEFAULT_MODULE_NAME)) {
|
||||||
|
av.visit(JvmAnnotationNames.MODULE_NAME_FIELD_NAME, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static String sanitizeAsJavaIdentifier(@NotNull String str) {
|
public static String sanitizeAsJavaIdentifier(@NotNull String str) {
|
||||||
return PackagePartClassUtils.sanitizeAsJavaIdentifier(str);
|
return PackagePartClassUtils.sanitizeAsJavaIdentifier(str);
|
||||||
|
|||||||
@@ -262,6 +262,7 @@ public class MultifileClassCodegen(
|
|||||||
|
|
||||||
val av = classBuilder.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_MULTIFILE_CLASS), true)
|
val av = classBuilder.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_MULTIFILE_CLASS), true)
|
||||||
JvmCodegenUtil.writeAbiVersion(av)
|
JvmCodegenUtil.writeAbiVersion(av)
|
||||||
|
JvmCodegenUtil.writeModuleName(av, state)
|
||||||
|
|
||||||
val partInternalNames = partFqNames.map { JvmClassName.byFqNameWithoutInnerClasses(it).internalName }.sorted()
|
val partInternalNames = partFqNames.map { JvmClassName.byFqNameWithoutInnerClasses(it).internalName }.sorted()
|
||||||
val arv = av.visitArray(JvmAnnotationNames.FILE_PART_CLASS_NAMES_FIELD_NAME)
|
val arv = av.visitArray(JvmAnnotationNames.FILE_PART_CLASS_NAMES_FIELD_NAME)
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses;
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.writeAnnotationData;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.writeAnnotationData;
|
||||||
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeModuleName;
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
|
|
||||||
public class PackagePartCodegen extends MemberCodegen<JetFile> {
|
public class PackagePartCodegen extends MemberCodegen<JetFile> {
|
||||||
@@ -125,6 +126,7 @@ public class PackagePartCodegen extends MemberCodegen<JetFile> {
|
|||||||
|
|
||||||
AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_FILE_FACADE), true);
|
AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_FILE_FACADE), true);
|
||||||
writeAnnotationData(av, serializer, packageProto);
|
writeAnnotationData(av, serializer, packageProto);
|
||||||
|
writeModuleName(av, state);
|
||||||
av.visitEnd();
|
av.visitEnd();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ public class PropertyReferenceCodegen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun generateKotlinAnnotation() {
|
override fun generateKotlinAnnotation() {
|
||||||
writeKotlinSyntheticClassAnnotation(v)
|
writeKotlinSyntheticClassAnnotation(v, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun putInstanceOnStack(): StackValue =
|
public fun putInstanceOnStack(): StackValue =
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ public class SamWrapperCodegen {
|
|||||||
);
|
);
|
||||||
cv.visitSource(file.getName(), null);
|
cv.visitSource(file.getName(), null);
|
||||||
|
|
||||||
writeKotlinSyntheticClassAnnotation(cv);
|
writeKotlinSyntheticClassAnnotation(cv, state);
|
||||||
|
|
||||||
// e.g. ASM type for Function2
|
// e.g. ASM type for Function2
|
||||||
Type functionAsmType = typeMapper.mapType(functionType);
|
Type functionAsmType = typeMapper.mapType(functionType);
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ public class MappingClassesForWhenByEnumCodegen {
|
|||||||
generateFields(cb, mappings);
|
generateFields(cb, mappings);
|
||||||
generateInitialization(cb, mappings);
|
generateInitialization(cb, mappings);
|
||||||
|
|
||||||
writeKotlinSyntheticClassAnnotation(cb);
|
writeKotlinSyntheticClassAnnotation(cb, state);
|
||||||
|
|
||||||
cb.done();
|
cb.done();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public final class JvmAnnotationNames {
|
|||||||
public static final String MULTIFILE_CLASS_NAME_FIELD_NAME = "multifileClassName";
|
public static final String MULTIFILE_CLASS_NAME_FIELD_NAME = "multifileClassName";
|
||||||
public static final String DATA_FIELD_NAME = "data";
|
public static final String DATA_FIELD_NAME = "data";
|
||||||
public static final String STRINGS_FIELD_NAME = "strings";
|
public static final String STRINGS_FIELD_NAME = "strings";
|
||||||
|
public static final String MODULE_NAME_FIELD_NAME = "moduleName";
|
||||||
public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value");
|
public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value");
|
||||||
public static final Name DEPRECATED_ANNOTATION_MESSAGE = Name.identifier("message");
|
public static final Name DEPRECATED_ANNOTATION_MESSAGE = Name.identifier("message");
|
||||||
public static final Name TARGET_ANNOTATION_MEMBER_NAME = Name.identifier("allowedTargets");
|
public static final Name TARGET_ANNOTATION_MEMBER_NAME = Name.identifier("allowedTargets");
|
||||||
|
|||||||
@@ -29,11 +29,9 @@ import kotlin.reflect.KPackage
|
|||||||
|
|
||||||
internal class KPackageImpl(override val jClass: Class<*>, val moduleName: String) : KDeclarationContainerImpl(), KPackage {
|
internal class KPackageImpl(override val jClass: Class<*>, val moduleName: String) : KDeclarationContainerImpl(), KPackage {
|
||||||
val descriptor by ReflectProperties.lazySoft {
|
val descriptor by ReflectProperties.lazySoft {
|
||||||
val moduleData = jClass.getOrCreateModule()
|
val moduleData = moduleData
|
||||||
moduleData.packageFacadeProvider.registerModule(moduleName)
|
moduleData.packageFacadeProvider.registerModule(moduleName)
|
||||||
val fqName = jClass.classId.getPackageFqName()
|
moduleData.module.getPackage(jClass.classId.packageFqName)
|
||||||
|
|
||||||
moduleData.module.getPackage(fqName)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal val scope: JetScope get() = descriptor.memberScope
|
internal val scope: JetScope get() = descriptor.memberScope
|
||||||
|
|||||||
@@ -103,7 +103,13 @@ public val Method.kotlinFunction: KFunction<*>?
|
|||||||
if (isSynthetic) return null
|
if (isSynthetic) return null
|
||||||
|
|
||||||
if (Modifier.isStatic(modifiers)) {
|
if (Modifier.isStatic(modifiers)) {
|
||||||
// TODO: support file facades & multifile classes
|
// TODO: support multifile classes
|
||||||
|
|
||||||
|
val fileFacade = declaringClass.getAnnotation(KotlinFileFacade::class.java)
|
||||||
|
if (fileFacade != null) {
|
||||||
|
val kotlinPackage = Reflection.getOrCreateKotlinPackage(declaringClass, fileFacade.moduleName)
|
||||||
|
return kotlinPackage.functions.firstOrNull { it.javaMethod == this }
|
||||||
|
}
|
||||||
|
|
||||||
// For static bridge method generated for a jvmStatic function in the companion object, also try to find the latter
|
// For static bridge method generated for a jvmStatic function in the companion object, also try to find the latter
|
||||||
val companion = declaringClass.kotlin.companionObject
|
val companion = declaringClass.kotlin.companionObject
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public @interface KotlinCallable {
|
|||||||
|
|
||||||
int[] version() default {};
|
int[] version() default {};
|
||||||
|
|
||||||
|
String moduleName() default "main";
|
||||||
|
|
||||||
String[] data();
|
String[] data();
|
||||||
|
|
||||||
String[] strings();
|
String[] strings();
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public @interface KotlinClass {
|
|||||||
|
|
||||||
int[] version() default {};
|
int[] version() default {};
|
||||||
|
|
||||||
|
String moduleName() default "main";
|
||||||
|
|
||||||
String[] data();
|
String[] data();
|
||||||
|
|
||||||
String[] strings();
|
String[] strings();
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public @interface KotlinFileFacade {
|
|||||||
|
|
||||||
int[] version() default {};
|
int[] version() default {};
|
||||||
|
|
||||||
|
String moduleName() default "main";
|
||||||
|
|
||||||
String[] data();
|
String[] data();
|
||||||
|
|
||||||
String[] strings();
|
String[] strings();
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public @interface KotlinMultifileClass {
|
|||||||
|
|
||||||
int[] version() default {};
|
int[] version() default {};
|
||||||
|
|
||||||
|
String moduleName() default "main";
|
||||||
|
|
||||||
String[] filePartClassNames();
|
String[] filePartClassNames();
|
||||||
|
|
||||||
String[] strings();
|
String[] strings();
|
||||||
|
|||||||
@@ -28,4 +28,6 @@ public @interface KotlinSyntheticClass {
|
|||||||
int abiVersion();
|
int abiVersion();
|
||||||
|
|
||||||
int[] version() default {};
|
int[] version() default {};
|
||||||
|
|
||||||
|
String moduleName() default "main";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user