From 998095c55c4c58c564c0cc4dd9b50ffcd78a4112 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 3 Oct 2012 22:58:19 +0400 Subject: [PATCH] KT-1973 Added class kind to JetClass annotations to distinguish object declarations and regular classes. #KT-1973 in progress --- .../backend/src/org/jetbrains/jet/codegen/CodegenUtil.java | 4 ++++ .../org/jetbrains/jet/codegen/ImplementationBodyCodegen.java | 2 +- .../org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java | 4 ++++ .../jet/lang/resolve/java/kt/JetClassAnnotation.java | 4 ++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index d553322b328..b2a98552b02 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -112,6 +112,10 @@ public class CodegenUtil { return 0; } + public static int getFlagsForClassKind(@NotNull ClassDescriptor descriptor) { + return descriptor.getKind() == ClassKind.OBJECT ? JvmStdlibNames.FLAG_CLASS_KIND_OBJECT : JvmStdlibNames.FLAG_CLASS_KIND_DEFAULT; + } + @NotNull public static JvmClassName getInternalClassName(FunctionDescriptor descriptor) { final int paramCount = descriptor.getValueParameters().size(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 47a94a62d46..bf2b8fa5d2c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -250,7 +250,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (signature.getKotlinGenericSignature() != null || descriptor.getVisibility() != Visibilities.PUBLIC) { AnnotationVisitor annotationVisitor = v.newAnnotation(JvmStdlibNames.JET_CLASS.getDescriptor(), true); annotationVisitor.visit(JvmStdlibNames.JET_CLASS_SIGNATURE, signature.getKotlinGenericSignature()); - int flags = getFlagsForVisibility(descriptor.getVisibility()); + int flags = getFlagsForVisibility(descriptor.getVisibility()) | getFlagsForClassKind(descriptor); if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flags) { annotationVisitor.visit(JvmStdlibNames.JET_FLAGS_FIELD, flags); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java index 022c4ab4750..e0980fcccdc 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java @@ -57,6 +57,10 @@ public class JvmStdlibNames { public static final int FLAG_METHOD_KIND_DELEGATION = 2 << 5; public static final int FLAG_METHOD_KIND_SYNTHESIZED = 3 << 5; + public static final int FLAG_CLASS_KIND_MASK = 7 << 5; + public static final int FLAG_CLASS_KIND_DEFAULT = 0 << 5; + public static final int FLAG_CLASS_KIND_OBJECT = 1 << 5; + public static final JvmClassName JET_CONSTRUCTOR = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetConstructor"); /** diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetClassAnnotation.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetClassAnnotation.java index 68a809bc49e..936ba298645 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetClassAnnotation.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetClassAnnotation.java @@ -50,6 +50,10 @@ public class JetClassAnnotation extends PsiAnnotationWithFlags { return signature; } + public int kind() { + return flags() & JvmStdlibNames.FLAG_CLASS_KIND_MASK; + } + @NotNull public static JetClassAnnotation get(PsiClass psiClass) { final PsiAnnotation annotation = JavaDescriptorResolver.findAnnotation(psiClass, JvmStdlibNames.JET_CLASS.getFqName().getFqName());