KT-2228 Open and final trait members are loaded as abstract from binary Kotlin classes.

Added storing modality for trait members in @JetMethod annotations.

 #KT-2228 Fixed
This commit is contained in:
Evgeny Gerashchenko
2012-06-08 21:12:00 +04:00
parent ef856c5888
commit f83defaa7f
13 changed files with 110 additions and 23 deletions
@@ -1340,19 +1340,10 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
isVar = members.setter != null;
}
Modality modality;
if (isFinal) {
modality = Modality.FINAL;
}
else {
modality = anyMember.getMember().isAbstract() ? Modality.ABSTRACT : Modality.OPEN;
}
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
owner,
resolveAnnotations(anyMember.getMember().psiMember),
modality,
resolveModality(anyMember.getMember(), isFinal),
resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
isVar,
false,
@@ -1658,7 +1649,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
methodTypeParameters,
valueParameterDescriptors.descriptors,
returnType,
Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
resolveModality(method, method.isFinal()),
resolveVisibilityFromPsiModifiers(method.getPsiMethod()),
/*isInline = */ false
);
@@ -1845,6 +1836,20 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
}
}
private static Modality resolveModality(PsiMemberWrapper memberWrapper, boolean isFinal) {
if (memberWrapper instanceof PsiMethodWrapper) {
PsiMethodWrapper method = (PsiMethodWrapper) memberWrapper;
if (method.getJetMethod().flags().get(JvmStdlibNames.JET_METHOD_FLAG_FORCE_OPEN_BIT)) {
return Modality.OPEN;
}
if (method.getJetMethod().flags().get(JvmStdlibNames.JET_METHOD_FLAG_FORCE_FINAL_BIT)) {
return Modality.FINAL;
}
}
return Modality.convertFromFlags(memberWrapper.isAbstract(), !isFinal);
}
private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibilities.PUBLIC :
(modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibilities.PRIVATE :
@@ -49,8 +49,10 @@ public class JvmStdlibNames {
public static final String JET_METHOD_PROPERTY_TYPE_FIELD = "propertyType";
public static final int JET_METHOD_FLAGS_DEFAULT_VALUE = 0;
public static final int JET_METHOD_FLAGS_BITS = 1;
public static final int JET_METHOD_FLAGS_BITS = 3;
public static final int JET_METHOD_FLAG_PROPERTY_BIT = 0;
public static final int JET_METHOD_FLAG_FORCE_OPEN_BIT = 1;
public static final int JET_METHOD_FLAG_FORCE_FINAL_BIT = 2;
public static final JvmClassName JET_CONSTRUCTOR = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetConstructor");