reading abstract and final modifiers from binary classes
This commit is contained in:
@@ -68,6 +68,10 @@ public class FunctionCodegen {
|
||||
{
|
||||
flags |= ACC_VARARGS;
|
||||
}
|
||||
|
||||
if (functionDescriptor.getModality() == Modality.FINAL) {
|
||||
flags |= ACC_FINAL;
|
||||
}
|
||||
|
||||
OwnerKind kind = context.getContextKind();
|
||||
|
||||
|
||||
@@ -47,19 +47,33 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
|
||||
boolean isAbstract = false;
|
||||
boolean isInterface = false;
|
||||
boolean isFinal = false;
|
||||
if(myClass instanceof JetClass) {
|
||||
if(((JetClass) myClass).hasModifier(JetTokens.ABSTRACT_KEYWORD))
|
||||
JetClass jetClass = (JetClass) myClass;
|
||||
if (jetClass.hasModifier(JetTokens.ABSTRACT_KEYWORD))
|
||||
isAbstract = true;
|
||||
if(((JetClass) myClass).isTrait()) {
|
||||
if (jetClass.isTrait()) {
|
||||
isAbstract = true;
|
||||
isInterface = true;
|
||||
}
|
||||
if (!jetClass.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
||||
isFinal = true;
|
||||
}
|
||||
}
|
||||
|
||||
int access = 0;
|
||||
access |= Opcodes.ACC_PUBLIC;
|
||||
if (isAbstract) {
|
||||
access |= Opcodes.ACC_ABSTRACT;
|
||||
}
|
||||
if (isInterface) {
|
||||
access |= Opcodes.ACC_INTERFACE; // ACC_SUPER
|
||||
}
|
||||
if (isFinal) {
|
||||
access |= Opcodes.ACC_FINAL;
|
||||
}
|
||||
v.defineClass(myClass, Opcodes.V1_6,
|
||||
Opcodes.ACC_PUBLIC | (isAbstract ? Opcodes.ACC_ABSTRACT : 0) | (isInterface
|
||||
? Opcodes.ACC_INTERFACE
|
||||
: 0/*Opcodes.ACC_SUPER*/),
|
||||
access,
|
||||
signature.getName(),
|
||||
signature.getJavaGenericSignature(),
|
||||
signature.getSuperclassName(),
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
namespace test
|
||||
|
||||
abstract class ModifierAbstract {
|
||||
abstract fun abs(): Int
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
namespace test
|
||||
|
||||
open class ModifierOpen {
|
||||
open fun abs() = 1
|
||||
}
|
||||
@@ -146,6 +146,10 @@ public class ReadClassDataTest extends UsefulTestCase {
|
||||
private String serializeContent(ClassDescriptor klass) {
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
serialize(klass.getModality(), sb);
|
||||
sb.append(" ");
|
||||
|
||||
serialize(klass.getKind(), sb);
|
||||
sb.append(" ");
|
||||
|
||||
@@ -221,6 +225,9 @@ public class ReadClassDataTest extends UsefulTestCase {
|
||||
|
||||
|
||||
private void serialize(FunctionDescriptor fun, StringBuilder sb) {
|
||||
serialize(fun.getModality(), sb);
|
||||
sb.append(" ");
|
||||
|
||||
sb.append("fun ");
|
||||
if (!fun.getTypeParameters().isEmpty()) {
|
||||
sb.append("<");
|
||||
@@ -278,7 +285,11 @@ public class ReadClassDataTest extends UsefulTestCase {
|
||||
sb.append(variance);
|
||||
sb.append(' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void serialize(Modality modality, StringBuilder sb) {
|
||||
sb.append(modality.name().toLowerCase());
|
||||
}
|
||||
|
||||
private void serialize(JetType type, StringBuilder sb) {
|
||||
serialize(type.getConstructor().getDeclarationDescriptor(), sb);
|
||||
|
||||
Reference in New Issue
Block a user