ReadClassDataTest: extension properties
This commit is contained in:
+91
-38
@@ -740,10 +740,7 @@ public class JavaDescriptorResolver {
|
||||
receiver = (Boolean) receiverExpression.getValue();
|
||||
}
|
||||
|
||||
PsiLiteralExpression hasDefaultValueExpression = (PsiLiteralExpression) annotation.findAttributeValue(JvmStdlibNames.JET_VALUE_PARAMETER_HAS_DEFAULT_VALUE_FIELD);
|
||||
if (hasDefaultValueExpression != null) {
|
||||
hasDefaultValue = (Boolean) hasDefaultValueExpression.getValue();
|
||||
}
|
||||
hasDefaultValue = getBooleanAnnotationAttributeValue(annotation, JvmStdlibNames.JET_VALUE_PARAMETER_HAS_DEFAULT_VALUE_FIELD, false);
|
||||
|
||||
|
||||
} else if (annotation.getQualifiedName().equals(JvmStdlibNames.JET_TYPE_PARAMETER.getFqName())) {
|
||||
@@ -773,6 +770,15 @@ public class JavaDescriptorResolver {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean getBooleanAnnotationAttributeValue(PsiAnnotation annotation, String parameterName, boolean defaultValue) {
|
||||
PsiLiteralExpression receiverExpression = (PsiLiteralExpression) annotation.findAttributeValue(parameterName);
|
||||
if (receiverExpression != null) {
|
||||
return (Boolean) receiverExpression.getValue();
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public VariableDescriptor resolveFieldToVariableDescriptor(DeclarationDescriptor containingDeclaration, PsiField field) {
|
||||
VariableDescriptor variableDescriptor = fieldDescriptorCache.get(field);
|
||||
@@ -802,21 +808,25 @@ public class JavaDescriptorResolver {
|
||||
private final String name;
|
||||
@NotNull
|
||||
private final PsiType type;
|
||||
@Nullable
|
||||
private final PsiType receiverType;
|
||||
|
||||
private PropertyKey(String name, PsiType type) {
|
||||
private PropertyKey(@NotNull String name, @NotNull PsiType type, @Nullable PsiType receiverType) {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
this.receiverType = receiverType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
// generated by Idea
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
PropertyKey that = (PropertyKey) o;
|
||||
|
||||
if (!name.equals(that.name)) return false;
|
||||
if (receiverType != null ? !receiverType.equals(that.receiverType) : that.receiverType != null)
|
||||
return false;
|
||||
if (!type.equals(that.type)) return false;
|
||||
|
||||
return true;
|
||||
@@ -826,6 +836,7 @@ public class JavaDescriptorResolver {
|
||||
public int hashCode() {
|
||||
int result = name.hashCode();
|
||||
result = 31 * result + type.hashCode();
|
||||
result = 31 * result + (receiverType != null ? receiverType.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -850,7 +861,7 @@ public class JavaDescriptorResolver {
|
||||
|
||||
MembersForProperty members = new MembersForProperty();
|
||||
members.field = field;
|
||||
membersMap.put(new PropertyKey(field.getName(), field.getType()), members);
|
||||
membersMap.put(new PropertyKey(field.getName(), field.getType(), null), members);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -864,36 +875,77 @@ public class JavaDescriptorResolver {
|
||||
}
|
||||
|
||||
// TODO: "is" prefix
|
||||
// TODO: remove getJavaClass
|
||||
if (method.getName().startsWith(JvmAbi.GETTER_PREFIX)) {
|
||||
// TODO: some java properties too
|
||||
if (method.getModifierList().findAnnotation(JvmStdlibNames.JET_PROPERTY.getFqName()) != null) {
|
||||
PsiType receiverType;
|
||||
if (method.getParameterList().getParametersCount() == 0) {
|
||||
if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD)) {
|
||||
continue;
|
||||
receiverType = null;
|
||||
} else if (method.getParameterList().getParametersCount() == 1) {
|
||||
if (method.getParameterList().getParameters()[0].getModifierList().findAnnotation(JvmStdlibNames.JET_TYPE_PARAMETER.getFqName()) != null) {
|
||||
receiverType = null;
|
||||
} else {
|
||||
receiverType = method.getParameterList().getParameters()[0].getType();
|
||||
}
|
||||
|
||||
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.GETTER_PREFIX.length()));
|
||||
PropertyKey key = new PropertyKey(propertyName, method.getReturnType());
|
||||
MembersForProperty members = membersMap.get(key);
|
||||
if (members == null) {
|
||||
members = new MembersForProperty();
|
||||
membersMap.put(key, members);
|
||||
} else if (method.getParameterList().getParametersCount() == 2) {
|
||||
if (method.getParameterList().getParameters()[1].getModifierList().findAnnotation(JvmStdlibNames.JET_TYPE_PARAMETER.getFqName()) == null) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
members.getter = method;
|
||||
receiverType = method.getParameterList().getParameters()[0].getType();
|
||||
} else {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.GETTER_PREFIX.length()));
|
||||
PropertyKey key = new PropertyKey(propertyName, method.getReturnType(), receiverType);
|
||||
MembersForProperty members = membersMap.get(key);
|
||||
if (members == null) {
|
||||
members = new MembersForProperty();
|
||||
membersMap.put(key, members);
|
||||
}
|
||||
members.getter = method;
|
||||
}
|
||||
} else if (method.getName().startsWith(JvmAbi.SETTER_PREFIX)) {
|
||||
if (method.getModifierList().findAnnotation(JvmStdlibNames.JET_PROPERTY.getFqName()) != null) {
|
||||
if (method.getParameterList().getParametersCount() == 1) {
|
||||
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.SETTER_PREFIX.length()));
|
||||
PropertyKey key = new PropertyKey(propertyName, method.getParameterList().getParameters()[0].getType());
|
||||
MembersForProperty members = membersMap.get(key);
|
||||
if (members == null) {
|
||||
members = new MembersForProperty();
|
||||
membersMap.put(key, members);
|
||||
}
|
||||
members.setter = method;
|
||||
if (method.getParameterList().getParametersCount() == 0) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
|
||||
PsiType receiverType = null;
|
||||
PsiParameter p1 = method.getParameterList().getParameters()[0];
|
||||
PsiAnnotation p1a = p1.getModifierList().findAnnotation(JvmStdlibNames.JET_VALUE_PARAMETER.getFqName());
|
||||
if (p1a != null) {
|
||||
if (getBooleanAnnotationAttributeValue(p1a, JvmStdlibNames.JET_VALUE_PARAMETER_RECEIVER_FIELD, false)) {
|
||||
receiverType = p1.getType();
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
while (i < method.getParameterList().getParametersCount() && method.getParameterList().getParameters()[i].getModifierList().findAnnotation(JvmStdlibNames.JET_TYPE_PARAMETER.getFqName()) != null) {
|
||||
++i;
|
||||
}
|
||||
|
||||
if (i + 1 != method.getParameterList().getParametersCount()) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
PsiType propertyType = method.getParameterList().getParameters()[i].getType();
|
||||
|
||||
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.SETTER_PREFIX.length()));
|
||||
PropertyKey key = new PropertyKey(propertyName, propertyType, receiverType);
|
||||
MembersForProperty members = membersMap.get(key);
|
||||
if (members == null) {
|
||||
members = new MembersForProperty();
|
||||
membersMap.put(key, members);
|
||||
}
|
||||
members.setter = method;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -940,6 +992,7 @@ public class JavaDescriptorResolver {
|
||||
//}
|
||||
String propertyName = entry.getKey().name;
|
||||
PsiType propertyType = entry.getKey().type;
|
||||
PsiType receiverType = entry.getKey().receiverType;
|
||||
MembersForProperty members = entry.getValue();
|
||||
|
||||
JetType type = semanticServices.getTypeTransformer().transformToType(propertyType);
|
||||
@@ -972,6 +1025,13 @@ public class JavaDescriptorResolver {
|
||||
isVar = members.setter != null;
|
||||
}
|
||||
|
||||
JetType receiverJetType;
|
||||
if (receiverType == null) {
|
||||
receiverJetType = null;
|
||||
} else {
|
||||
receiverJetType = semanticServices.getTypeTransformer().transformToType(receiverType);
|
||||
}
|
||||
|
||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
||||
owner,
|
||||
Collections.<AnnotationDescriptor>emptyList(),
|
||||
@@ -979,7 +1039,7 @@ public class JavaDescriptorResolver {
|
||||
resolveVisibilityFromPsiModifiers(anyMember),
|
||||
isVar,
|
||||
false,
|
||||
null,
|
||||
receiverJetType,
|
||||
DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
|
||||
propertyName,
|
||||
type);
|
||||
@@ -1085,18 +1145,11 @@ public class JavaDescriptorResolver {
|
||||
kotlin = classData.kotlin;
|
||||
}
|
||||
|
||||
// TODO: hide getters and setters properly
|
||||
if (kotlin) {
|
||||
if (method.getName().startsWith(JvmAbi.GETTER_PREFIX) && method.getParameterList().getParametersCount() == 0) {
|
||||
if (method.getModifierList().findAnnotation(JvmStdlibNames.JET_PROPERTY.getFqName()) != null)
|
||||
return null;
|
||||
}
|
||||
if (method.getName().startsWith(JvmAbi.SETTER_PREFIX) && method.getParameterList().getParametersCount() == 1) {
|
||||
if (method.getModifierList().findAnnotation(JvmStdlibNames.JET_PROPERTY.getFqName()) != null)
|
||||
return null;
|
||||
}
|
||||
// TODO: ugly
|
||||
if (method.getModifierList().findAnnotation(JvmStdlibNames.JET_PROPERTY.getFqName()) != null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
DeclarationDescriptor classDescriptor;
|
||||
final List<TypeParameterDescriptor> classTypeParameters;
|
||||
if (method.hasModifierProperty(PsiModifier.STATIC)) {
|
||||
|
||||
@@ -86,14 +86,6 @@ public class JavaPackageScope extends JetScopeImpl {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
PsiField field = psiClassForPackage.findFieldByName(name, true);
|
||||
if (field == null) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
if (!field.hasModifierProperty(PsiModifier.STATIC)) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
// TODO: cache
|
||||
return semanticServices.getDescriptorResolver().resolveFieldGroupByName(containingDescriptor, psiClassForPackage, name, true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user