提交 200fd785 编写于 作者: S Stepan Koltsov

ReadClassDataTest: extension properties

上级 f4bf59ff
......@@ -91,17 +91,24 @@ public class FunctionCodegen {
if(v.generateCode()) {
int start = 0;
if(kind != OwnerKind.TRAIT_IMPL) {
AnnotationVisitor av = mv.visitAnnotation(JvmStdlibNames.JET_METHOD.getDescriptor(), true);
if(functionDescriptor.getReturnType().isNullable()) {
av.visit(JvmStdlibNames.JET_METHOD_NULLABLE_RETURN_TYPE_FIELD, true);
}
if (jvmSignature.getKotlinReturnType() != null) {
av.visit(JvmStdlibNames.JET_METHOD_RETURN_TYPE_FIELD, jvmSignature.getKotlinReturnType());
}
if (jvmSignature.getKotlinTypeParameter() != null) {
av.visit(JvmStdlibNames.JET_METHOD_TYPE_PARAMETERS_FIELD, jvmSignature.getKotlinTypeParameter());
if (functionDescriptor instanceof PropertyAccessorDescriptor) {
AnnotationVisitor av = mv.visitAnnotation(JvmStdlibNames.JET_PROPERTY.getDescriptor(), true);
av.visitEnd();
} else if (functionDescriptor instanceof NamedFunctionDescriptor) {
AnnotationVisitor av = mv.visitAnnotation(JvmStdlibNames.JET_METHOD.getDescriptor(), true);
if(functionDescriptor.getReturnType().isNullable()) {
av.visit(JvmStdlibNames.JET_METHOD_NULLABLE_RETURN_TYPE_FIELD, true);
}
if (jvmSignature.getKotlinReturnType() != null) {
av.visit(JvmStdlibNames.JET_METHOD_RETURN_TYPE_FIELD, jvmSignature.getKotlinReturnType());
}
if (jvmSignature.getKotlinTypeParameter() != null) {
av.visit(JvmStdlibNames.JET_METHOD_TYPE_PARAMETERS_FIELD, jvmSignature.getKotlinTypeParameter());
}
av.visitEnd();
} else {
throw new IllegalStateException();
}
av.visitEnd();
}
if(kind == OwnerKind.TRAIT_IMPL) {
......
......@@ -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);
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;
}
members.setter = method;
}
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);
}
......
package test
val Int.itIs: Int
get() = this
package test
class ExtPropInClass {
val Int.itIs: Int
get() = this
}
package test
var Int.ggg: Int
get() = throw Exception()
set(p) = throw Exception()
package test
class ExtPropInClass {
var Int.itIs: Int
get() = throw Exception()
set(p: Int) = throw Exception()
}
......@@ -282,6 +282,10 @@ public class ReadClassDataTest extends TestCaseWithTmpdir {
} else {
sb.append("val ");
}
if (prop.getReceiverParameter().exists()) {
serialize(prop.getReceiverParameter().getType());
sb.append(".");
}
sb.append(prop.getName());
sb.append(": ");
serialize(prop.getOutType());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册