fix another case of property resolution, refactoring
This commit is contained in:
@@ -94,7 +94,7 @@ public class FunctionCodegen {
|
|||||||
int start = 0;
|
int start = 0;
|
||||||
if(kind != OwnerKind.TRAIT_IMPL) {
|
if(kind != OwnerKind.TRAIT_IMPL) {
|
||||||
if (functionDescriptor instanceof PropertyAccessorDescriptor) {
|
if (functionDescriptor instanceof PropertyAccessorDescriptor) {
|
||||||
PropertyCodegen.generateJetPropertyAnnotation(mv, propertyTypeSignature);
|
PropertyCodegen.generateJetPropertyAnnotation(mv, propertyTypeSignature, jvmSignature.getKotlinTypeParameter());
|
||||||
} else if (functionDescriptor instanceof NamedFunctionDescriptor) {
|
} else if (functionDescriptor instanceof NamedFunctionDescriptor) {
|
||||||
if (propertyTypeSignature != null) {
|
if (propertyTypeSignature != null) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
JvmPropertyAccessorSignature originalSignature = typeMapper.mapGetterSignature(original, OwnerKind.IMPLEMENTATION);
|
JvmPropertyAccessorSignature originalSignature = typeMapper.mapGetterSignature(original, OwnerKind.IMPLEMENTATION);
|
||||||
Method originalMethod = originalSignature.getJvmMethodSignature().getAsmMethod();
|
Method originalMethod = originalSignature.getJvmMethodSignature().getAsmMethod();
|
||||||
MethodVisitor mv = v.newMethod(null, Opcodes.ACC_PUBLIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
|
MethodVisitor mv = v.newMethod(null, Opcodes.ACC_PUBLIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
|
||||||
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature());
|
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature(), originalSignature.getJvmMethodSignature().getKotlinTypeParameter());
|
||||||
mv.visitAnnotation(JvmStdlibNames.JET_PROPERTY.getDescriptor(), true).visitEnd();
|
mv.visitAnnotation(JvmStdlibNames.JET_PROPERTY.getDescriptor(), true).visitEnd();
|
||||||
if (v.generateCode()) {
|
if (v.generateCode()) {
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
@@ -267,7 +267,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
JvmPropertyAccessorSignature originalSignature2 = typeMapper.mapSetterSignature(original, OwnerKind.IMPLEMENTATION);
|
JvmPropertyAccessorSignature originalSignature2 = typeMapper.mapSetterSignature(original, OwnerKind.IMPLEMENTATION);
|
||||||
Method originalMethod = originalSignature2.getJvmMethodSignature().getAsmMethod();
|
Method originalMethod = originalSignature2.getJvmMethodSignature().getAsmMethod();
|
||||||
MethodVisitor mv = v.newMethod(null, Opcodes.ACC_PUBLIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
|
MethodVisitor mv = v.newMethod(null, Opcodes.ACC_PUBLIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
|
||||||
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature());
|
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature(), originalSignature2.getJvmMethodSignature().getKotlinTypeParameter());
|
||||||
mv.visitAnnotation(JvmStdlibNames.JET_PROPERTY.getDescriptor(), true).visitEnd();
|
mv.visitAnnotation(JvmStdlibNames.JET_PROPERTY.getDescriptor(), true).visitEnd();
|
||||||
if (v.generateCode()) {
|
if (v.generateCode()) {
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
|
|||||||
@@ -519,9 +519,8 @@ public class JetTypeMapper {
|
|||||||
|
|
||||||
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, false);
|
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, false);
|
||||||
|
|
||||||
signatureWriter.writeFormalTypeParametersStart();
|
writeFormalTypeParameters(f.getTypeParameters(), signatureWriter);
|
||||||
signatureWriter.writeFormalTypeParametersEnd();
|
|
||||||
|
|
||||||
signatureWriter.writeParametersStart();
|
signatureWriter.writeParametersStart();
|
||||||
|
|
||||||
final List<ValueParameterDescriptor> parameters = f.getValueParameters();
|
final List<ValueParameterDescriptor> parameters = f.getValueParameters();
|
||||||
@@ -552,8 +551,7 @@ public class JetTypeMapper {
|
|||||||
// TODO: do not generate generics if not needed
|
// TODO: do not generate generics if not needed
|
||||||
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true);
|
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true);
|
||||||
|
|
||||||
signatureWriter.writeFormalTypeParametersStart();
|
writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter);
|
||||||
signatureWriter.writeFormalTypeParametersEnd();
|
|
||||||
|
|
||||||
signatureWriter.writeParametersStart();
|
signatureWriter.writeParametersStart();
|
||||||
|
|
||||||
@@ -597,8 +595,7 @@ public class JetTypeMapper {
|
|||||||
// TODO: generics signature is not always needed
|
// TODO: generics signature is not always needed
|
||||||
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true);
|
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true);
|
||||||
|
|
||||||
signatureWriter.writeFormalTypeParametersStart();
|
writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter);
|
||||||
signatureWriter.writeFormalTypeParametersEnd();
|
|
||||||
|
|
||||||
JetType outType = descriptor.getOutType();
|
JetType outType = descriptor.getOutType();
|
||||||
|
|
||||||
@@ -644,8 +641,7 @@ public class JetTypeMapper {
|
|||||||
List<ValueParameterDescriptor> parameters = descriptor.getOriginal().getValueParameters();
|
List<ValueParameterDescriptor> parameters = descriptor.getOriginal().getValueParameters();
|
||||||
ClassDescriptor classDescriptor = descriptor.getContainingDeclaration();
|
ClassDescriptor classDescriptor = descriptor.getContainingDeclaration();
|
||||||
|
|
||||||
signatureWriter.writeFormalTypeParametersStart();
|
writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter);
|
||||||
signatureWriter.writeFormalTypeParametersEnd();
|
|
||||||
|
|
||||||
signatureWriter.writeParametersStart();
|
signatureWriter.writeParametersStart();
|
||||||
|
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ public class PropertyCodegen {
|
|||||||
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
|
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
|
||||||
String getterName = getterName(propertyDescriptor.getName());
|
String getterName = getterName(propertyDescriptor.getName());
|
||||||
MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, null, null);
|
MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, null, null);
|
||||||
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature());
|
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), signature.getJvmMethodSignature().getKotlinTypeParameter());
|
||||||
if (v.generateCode() && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
|
if (v.generateCode() && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
@@ -169,11 +169,14 @@ public class PropertyCodegen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType) {
|
public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters) {
|
||||||
AnnotationVisitor annotationVisitor = mv.visitAnnotation(JvmStdlibNames.JET_PROPERTY.getDescriptor(), true);
|
AnnotationVisitor annotationVisitor = mv.visitAnnotation(JvmStdlibNames.JET_PROPERTY.getDescriptor(), true);
|
||||||
if (kotlinType.length() > 0) {
|
if (kotlinType.length() > 0) {
|
||||||
annotationVisitor.visit(JvmStdlibNames.JET_PROPERTY_TYPE_FIELD, kotlinType);
|
annotationVisitor.visit(JvmStdlibNames.JET_PROPERTY_TYPE_FIELD, kotlinType);
|
||||||
}
|
}
|
||||||
|
if (typeParameters.length() > 0) {
|
||||||
|
annotationVisitor.visit(JvmStdlibNames.JET_PROPERTY_TYPE_PARAMETERS_FIELD, typeParameters);
|
||||||
|
}
|
||||||
annotationVisitor.visitEnd();
|
annotationVisitor.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,7 +203,7 @@ public class PropertyCodegen {
|
|||||||
JvmPropertyAccessorSignature signature = state.getTypeMapper().mapSetterSignature(propertyDescriptor, kind);
|
JvmPropertyAccessorSignature signature = state.getTypeMapper().mapSetterSignature(propertyDescriptor, kind);
|
||||||
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
|
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
|
||||||
MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null);
|
MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null);
|
||||||
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature());
|
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), signature.getJvmMethodSignature().getKotlinTypeParameter());
|
||||||
if (v.generateCode() && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
|
if (v.generateCode() && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
|
|||||||
+129
-70
@@ -14,7 +14,6 @@ import com.intellij.psi.PsiElement;
|
|||||||
import com.intellij.psi.PsiEllipsisType;
|
import com.intellij.psi.PsiEllipsisType;
|
||||||
import com.intellij.psi.PsiField;
|
import com.intellij.psi.PsiField;
|
||||||
import com.intellij.psi.PsiJavaFile;
|
import com.intellij.psi.PsiJavaFile;
|
||||||
import com.intellij.psi.PsiMember;
|
|
||||||
import com.intellij.psi.PsiMethod;
|
import com.intellij.psi.PsiMethod;
|
||||||
import com.intellij.psi.PsiModifier;
|
import com.intellij.psi.PsiModifier;
|
||||||
import com.intellij.psi.PsiModifierListOwner;
|
import com.intellij.psi.PsiModifierListOwner;
|
||||||
@@ -34,11 +33,12 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
|||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptorImpl;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.Modality;
|
import org.jetbrains.jet.lang.descriptors.Modality;
|
||||||
import org.jetbrains.jet.lang.descriptors.NamedFunctionDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.NamedFunctionDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptorImpl;
|
||||||
@@ -48,7 +48,6 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
|||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
|
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kt.JetMethodAnnotation;
|
|
||||||
import org.jetbrains.jet.lang.types.JetStandardClasses;
|
import org.jetbrains.jet.lang.types.JetStandardClasses;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.TypeConstructorImpl;
|
import org.jetbrains.jet.lang.types.TypeConstructorImpl;
|
||||||
@@ -160,7 +159,7 @@ public class JavaDescriptorResolver {
|
|||||||
protected final Map<String, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
|
protected final Map<String, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
|
||||||
protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();
|
protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();
|
||||||
|
|
||||||
protected final Map<PsiTypeParameter, TypeParameterDescriptorInitialization> typeParameterDescriptorCache = Maps.newHashMap();
|
private final Map<PsiTypeParameter, TypeParameterDescriptorInitialization> typeParameterDescriptorCache = Maps.newHashMap();
|
||||||
protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap();
|
protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap();
|
||||||
protected final Map<PsiField, VariableDescriptor> fieldDescriptorCache = Maps.newHashMap();
|
protected final Map<PsiField, VariableDescriptor> fieldDescriptorCache = Maps.newHashMap();
|
||||||
protected final JavaPsiFacade javaFacade;
|
protected final JavaPsiFacade javaFacade;
|
||||||
@@ -806,15 +805,15 @@ public class JavaDescriptorResolver {
|
|||||||
private static class PropertyKey {
|
private static class PropertyKey {
|
||||||
@NotNull
|
@NotNull
|
||||||
private final String name;
|
private final String name;
|
||||||
@NotNull
|
//@NotNull
|
||||||
private final PsiType type;
|
//private final PsiType type;
|
||||||
@Nullable
|
//@Nullable
|
||||||
private final PsiType receiverType;
|
//private final PsiType receiverType;
|
||||||
|
|
||||||
private PropertyKey(@NotNull String name, @NotNull PsiType type, @Nullable PsiType receiverType) {
|
private PropertyKey(@NotNull String name /*, @NotNull PsiType type, @Nullable PsiType receiverType */) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.type = type;
|
//this.type = type;
|
||||||
this.receiverType = receiverType;
|
//this.receiverType = receiverType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -825,9 +824,9 @@ public class JavaDescriptorResolver {
|
|||||||
PropertyKey that = (PropertyKey) o;
|
PropertyKey that = (PropertyKey) o;
|
||||||
|
|
||||||
if (!name.equals(that.name)) return false;
|
if (!name.equals(that.name)) return false;
|
||||||
if (receiverType != null ? !receiverType.equals(that.receiverType) : that.receiverType != null)
|
//if (receiverType != null ? !receiverType.equals(that.receiverType) : that.receiverType != null)
|
||||||
return false;
|
// return false;
|
||||||
if (!type.equals(that.type)) return false;
|
//if (!type.equals(that.type)) return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -835,16 +834,19 @@ public class JavaDescriptorResolver {
|
|||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result = name.hashCode();
|
int result = name.hashCode();
|
||||||
result = 31 * result + type.hashCode();
|
//result = 31 * result + type.hashCode();
|
||||||
result = 31 * result + (receiverType != null ? receiverType.hashCode() : 0);
|
//result = 31 * result + (receiverType != null ? receiverType.hashCode() : 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class MembersForProperty {
|
private static class MembersForProperty {
|
||||||
private PsiField field;
|
private PsiFieldWrapper field;
|
||||||
private PsiMethod setter;
|
private PsiMethodWrapper setter;
|
||||||
private PsiMethod getter;
|
private PsiMethodWrapper getter;
|
||||||
|
|
||||||
|
private PsiType type;
|
||||||
|
private PsiType receiverType;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<PropertyKey, MembersForProperty> getMembersForProperties(@NotNull PsiClass clazz, boolean staticMembers, boolean kotlin) {
|
private Map<PropertyKey, MembersForProperty> getMembersForProperties(@NotNull PsiClass clazz, boolean staticMembers, boolean kotlin) {
|
||||||
@@ -860,8 +862,9 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MembersForProperty members = new MembersForProperty();
|
MembersForProperty members = new MembersForProperty();
|
||||||
members.field = field;
|
members.field = new PsiFieldWrapper(field);
|
||||||
membersMap.put(new PropertyKey(field.getName(), field.getType(), null), members);
|
members.type = field.getType();
|
||||||
|
membersMap.put(new PropertyKey(field.getName() /*, field.getType(), null*/), members);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -882,41 +885,49 @@ public class JavaDescriptorResolver {
|
|||||||
|
|
||||||
// TODO: some java properties too
|
// TODO: some java properties too
|
||||||
if (method.getJetProperty().isDefined()) {
|
if (method.getJetProperty().isDefined()) {
|
||||||
PsiType receiverType;
|
|
||||||
if (method.getParameters().size() == 0) {
|
|
||||||
receiverType = null;
|
|
||||||
} else if (method.getParameters().size() == 1) {
|
|
||||||
if (method.getParameter(0).getJetTypeParameter().isDefined()) {
|
|
||||||
receiverType = null;
|
|
||||||
} else {
|
|
||||||
receiverType = method.getParameter(0).getPsiParameter().getType();
|
|
||||||
}
|
|
||||||
} else if (method.getParameters().size() == 2) {
|
|
||||||
if (!method.getParameter(1).getJetTypeParameter().isDefined()) {
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
|
||||||
receiverType = psiMethod.getParameterList().getParameters()[0].getType();
|
|
||||||
} else {
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (psiMethod.getName().equals(JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD)) {
|
if (psiMethod.getName().equals(JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
PsiType receiverType;
|
||||||
|
if (i < method.getParameters().size() && method.getParameter(i).getJetValueParameter().receiver()) {
|
||||||
|
receiverType = method.getParameter(i).getPsiParameter().getType();
|
||||||
|
++i;
|
||||||
|
} else {
|
||||||
|
receiverType = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (i < method.getParameters().size() && method.getParameter(i).getJetTypeParameter().isDefined()) {
|
||||||
|
// TODO: store is reified
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i != method.getParameters().size()) {
|
||||||
|
// TODO: report error properly
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
String propertyName = StringUtil.decapitalize(psiMethod.getName().substring(JvmAbi.GETTER_PREFIX.length()));
|
String propertyName = StringUtil.decapitalize(psiMethod.getName().substring(JvmAbi.GETTER_PREFIX.length()));
|
||||||
PropertyKey key = new PropertyKey(propertyName, psiMethod.getReturnType(), receiverType);
|
PropertyKey key = new PropertyKey(propertyName /*, psiMethod.getReturnType(), receiverType*/);
|
||||||
MembersForProperty members = membersMap.get(key);
|
MembersForProperty members = membersMap.get(key);
|
||||||
if (members == null) {
|
if (members == null) {
|
||||||
members = new MembersForProperty();
|
members = new MembersForProperty();
|
||||||
membersMap.put(key, members);
|
membersMap.put(key, members);
|
||||||
}
|
}
|
||||||
members.getter = psiMethod;
|
members.getter = new PsiMethodWrapper(psiMethod);
|
||||||
|
|
||||||
|
// TODO: check conflicts with setter
|
||||||
|
members.type = psiMethod.getReturnType();
|
||||||
|
members.receiverType = receiverType;
|
||||||
}
|
}
|
||||||
} else if (psiMethod.getName().startsWith(JvmAbi.SETTER_PREFIX)) {
|
} else if (psiMethod.getName().startsWith(JvmAbi.SETTER_PREFIX)) {
|
||||||
|
|
||||||
if (method.getJetProperty().isDefined()) {
|
if (method.getJetProperty().isDefined()) {
|
||||||
if (psiMethod.getParameterList().getParametersCount() == 0) {
|
if (psiMethod.getParameterList().getParametersCount() == 0) {
|
||||||
|
// TODO: report error properly
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -940,13 +951,17 @@ public class JavaDescriptorResolver {
|
|||||||
PsiType propertyType = psiMethod.getParameterList().getParameters()[i].getType();
|
PsiType propertyType = psiMethod.getParameterList().getParameters()[i].getType();
|
||||||
|
|
||||||
String propertyName = StringUtil.decapitalize(psiMethod.getName().substring(JvmAbi.SETTER_PREFIX.length()));
|
String propertyName = StringUtil.decapitalize(psiMethod.getName().substring(JvmAbi.SETTER_PREFIX.length()));
|
||||||
PropertyKey key = new PropertyKey(propertyName, propertyType, receiverType);
|
PropertyKey key = new PropertyKey(propertyName /*, propertyType, receiverType*/);
|
||||||
MembersForProperty members = membersMap.get(key);
|
MembersForProperty members = membersMap.get(key);
|
||||||
if (members == null) {
|
if (members == null) {
|
||||||
members = new MembersForProperty();
|
members = new MembersForProperty();
|
||||||
membersMap.put(key, members);
|
membersMap.put(key, members);
|
||||||
}
|
}
|
||||||
members.setter = psiMethod;
|
members.setter = new PsiMethodWrapper(psiMethod);
|
||||||
|
|
||||||
|
// TODO: check conflicts with getter
|
||||||
|
members.type = propertyType;
|
||||||
|
members.receiverType = receiverType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -986,29 +1001,30 @@ public class JavaDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Set<VariableDescriptor> descriptors = Sets.newHashSet();
|
Set<VariableDescriptor> descriptors = Sets.newHashSet();
|
||||||
for (Map.Entry<PropertyKey, MembersForProperty> entry : getMembersForProperties(psiClass, staticMembers, scopeData.kotlin).entrySet()) {
|
Map<PropertyKey, MembersForProperty> membersForProperties = getMembersForProperties(psiClass, staticMembers, scopeData.kotlin);
|
||||||
|
for (Map.Entry<PropertyKey, MembersForProperty> entry : membersForProperties.entrySet()) {
|
||||||
//VariableDescriptor variableDescriptor = fieldDescriptorCache.get(field);
|
//VariableDescriptor variableDescriptor = fieldDescriptorCache.get(field);
|
||||||
//if (variableDescriptor != null) {
|
//if (variableDescriptor != null) {
|
||||||
// return variableDescriptor;
|
// return variableDescriptor;
|
||||||
//}
|
//}
|
||||||
String propertyName = entry.getKey().name;
|
String propertyName = entry.getKey().name;
|
||||||
PsiType propertyType = entry.getKey().type;
|
PsiType propertyType = entry.getValue().type;
|
||||||
PsiType receiverType = entry.getKey().receiverType;
|
PsiType receiverType = entry.getValue().receiverType;
|
||||||
MembersForProperty members = entry.getValue();
|
MembersForProperty members = entry.getValue();
|
||||||
|
|
||||||
JetType type = semanticServices.getTypeTransformer().transformToType(propertyType);
|
JetType type = semanticServices.getTypeTransformer().transformToType(propertyType);
|
||||||
boolean isFinal;
|
boolean isFinal;
|
||||||
if (members.setter == null && members.getter == null) {
|
if (members.setter == null && members.getter == null) {
|
||||||
isFinal = members.field.hasModifierProperty(PsiModifier.FINAL);
|
isFinal = false;
|
||||||
} else if (members.getter != null) {
|
} else if (members.getter != null) {
|
||||||
isFinal = members.getter.hasModifierProperty(PsiModifier.FINAL);
|
isFinal = members.getter.isFinal();
|
||||||
} else if (members.setter != null) {
|
} else if (members.setter != null) {
|
||||||
isFinal = members.setter.hasModifierProperty(PsiModifier.FINAL);
|
isFinal = members.setter.isFinal();
|
||||||
} else {
|
} else {
|
||||||
isFinal = false;
|
isFinal = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
PsiMember anyMember;
|
PsiMemberWrapper anyMember;
|
||||||
if (members.getter != null) {
|
if (members.getter != null) {
|
||||||
anyMember = members.getter;
|
anyMember = members.getter;
|
||||||
} else if (members.field != null) {
|
} else if (members.field != null) {
|
||||||
@@ -1026,25 +1042,66 @@ public class JavaDescriptorResolver {
|
|||||||
isVar = members.setter != null;
|
isVar = members.setter != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
||||||
|
owner,
|
||||||
|
Collections.<AnnotationDescriptor>emptyList(),
|
||||||
|
isFinal && !staticMembers ? Modality.FINAL : Modality.OPEN, // TODO: abstract
|
||||||
|
resolveVisibilityFromPsiModifiers(anyMember.psiMember),
|
||||||
|
isVar,
|
||||||
|
false,
|
||||||
|
propertyName);
|
||||||
|
|
||||||
|
PropertyGetterDescriptor getterDescriptor = null;
|
||||||
|
PropertySetterDescriptor setterDescriptor = null;
|
||||||
|
if (members.getter != null) {
|
||||||
|
getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false);
|
||||||
|
}
|
||||||
|
if (members.setter != null) {
|
||||||
|
setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
|
||||||
|
|
||||||
|
final List<TypeParameterDescriptor> classTypeParameters;
|
||||||
|
if (anyMember instanceof PsiMethodWrapper && !anyMember.isStatic()) {
|
||||||
|
classTypeParameters = ((ClassDescriptor) owner).getTypeConstructor().getParameters();
|
||||||
|
} else {
|
||||||
|
classTypeParameters = new ArrayList<TypeParameterDescriptor>(0);
|
||||||
|
}
|
||||||
|
TypeParameterListTypeVariableResolver typeVariableResolver = new TypeParameterListTypeVariableResolver(classTypeParameters);
|
||||||
|
|
||||||
|
List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
|
||||||
|
|
||||||
|
if (members.setter != null) {
|
||||||
|
// call ugly code with side effects
|
||||||
|
typeParameters = resolveMethodTypeParameters(members.setter, propertyDescriptor.getSetter(), typeVariableResolver);
|
||||||
|
}
|
||||||
|
if (members.getter != null) {
|
||||||
|
// call ugly code with side effects
|
||||||
|
typeParameters = resolveMethodTypeParameters(members.getter, propertyDescriptor.getGetter(), typeVariableResolver);
|
||||||
|
}
|
||||||
|
|
||||||
JetType receiverJetType;
|
JetType receiverJetType;
|
||||||
if (receiverType == null) {
|
if (receiverType == null) {
|
||||||
receiverJetType = null;
|
receiverJetType = null;
|
||||||
} else {
|
} else {
|
||||||
receiverJetType = semanticServices.getTypeTransformer().transformToType(receiverType);
|
receiverJetType = semanticServices.getTypeTransformer().transformToType(receiverType);
|
||||||
}
|
}
|
||||||
|
|
||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
propertyDescriptor.setType(
|
||||||
owner,
|
type,
|
||||||
Collections.<AnnotationDescriptor>emptyList(),
|
typeParameters,
|
||||||
isFinal && !staticMembers ? Modality.FINAL : Modality.OPEN, // TODO: abstract
|
|
||||||
resolveVisibilityFromPsiModifiers(anyMember),
|
|
||||||
isVar,
|
|
||||||
false,
|
|
||||||
receiverJetType,
|
|
||||||
DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
|
DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
|
||||||
propertyName,
|
receiverJetType
|
||||||
type);
|
);
|
||||||
semanticServices.getTrace().record(BindingContext.VARIABLE, anyMember, propertyDescriptor);
|
if (getterDescriptor != null) {
|
||||||
|
getterDescriptor.initialize(type);
|
||||||
|
}
|
||||||
|
if (setterDescriptor != null) {
|
||||||
|
// TODO: initialize
|
||||||
|
}
|
||||||
|
|
||||||
|
semanticServices.getTrace().record(BindingContext.VARIABLE, anyMember.psiMember, propertyDescriptor);
|
||||||
//fieldDescriptorCache.put(field, propertyDescriptor);
|
//fieldDescriptorCache.put(field, propertyDescriptor);
|
||||||
descriptors.add(propertyDescriptor);
|
descriptors.add(propertyDescriptor);
|
||||||
}
|
}
|
||||||
@@ -1177,7 +1234,7 @@ public class JavaDescriptorResolver {
|
|||||||
// TODO: add outer classes
|
// TODO: add outer classes
|
||||||
TypeParameterListTypeVariableResolver typeVariableResolverForParameters = new TypeParameterListTypeVariableResolver(classTypeParameters);
|
TypeParameterListTypeVariableResolver typeVariableResolverForParameters = new TypeParameterListTypeVariableResolver(classTypeParameters);
|
||||||
|
|
||||||
final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(psiMethod, functionDescriptorImpl, typeVariableResolverForParameters);
|
final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(new PsiMethodWrapper(psiMethod), functionDescriptorImpl, typeVariableResolverForParameters);
|
||||||
|
|
||||||
class MethodTypeVariableResolver implements TypeVariableResolver {
|
class MethodTypeVariableResolver implements TypeVariableResolver {
|
||||||
|
|
||||||
@@ -1217,17 +1274,19 @@ public class JavaDescriptorResolver {
|
|||||||
return substitutedFunctionDescriptor;
|
return substitutedFunctionDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<TypeParameterDescriptor> resolveMethodTypeParameters(PsiMethod method, FunctionDescriptorImpl functionDescriptorImpl, TypeVariableResolver classTypeVariableResolver) {
|
private List<TypeParameterDescriptor> resolveMethodTypeParameters(
|
||||||
JetMethodAnnotation jetMethodAnnotation = JetMethodAnnotation.get(method);
|
@NotNull PsiMethodWrapper method,
|
||||||
if (jetMethodAnnotation.typeParameters().length() > 0) {
|
@NotNull FunctionDescriptor functionDescriptor,
|
||||||
|
@NotNull TypeVariableResolver classTypeVariableResolver) {
|
||||||
|
if (method.getJetMethodOrProperty().typeParameters().length() > 0) {
|
||||||
List<TypeParameterDescriptor> r = resolveMethodTypeParametersFromJetSignature(
|
List<TypeParameterDescriptor> r = resolveMethodTypeParametersFromJetSignature(
|
||||||
jetMethodAnnotation.typeParameters(), method, functionDescriptorImpl, classTypeVariableResolver);
|
method.getJetMethodOrProperty().typeParameters(), method.getPsiMethod(), functionDescriptor, classTypeVariableResolver);
|
||||||
initializeTypeParameters(method);
|
initializeTypeParameters(method.getPsiMethod());
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<TypeParameterDescriptor> typeParameters = makeUninitializedTypeParameters(functionDescriptorImpl, method.getTypeParameters());
|
List<TypeParameterDescriptor> typeParameters = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
|
||||||
initializeTypeParameters(method);
|
initializeTypeParameters(method.getPsiMethod());
|
||||||
return typeParameters;
|
return typeParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ public class JvmStdlibNames {
|
|||||||
public static final JvmClassName JET_PROPERTY = new JvmClassName("jet.runtime.typeinfo.JetProperty");
|
public static final JvmClassName JET_PROPERTY = new JvmClassName("jet.runtime.typeinfo.JetProperty");
|
||||||
|
|
||||||
public static final String JET_PROPERTY_TYPE_FIELD = "type";
|
public static final String JET_PROPERTY_TYPE_FIELD = "type";
|
||||||
|
public static final String JET_PROPERTY_TYPE_PARAMETERS_FIELD = "typeParameters";
|
||||||
|
|
||||||
public static final JvmClassName JET_CONSTRUCTOR = new JvmClassName("jet.runtime.typeinfo.JetConstructor");
|
public static final JvmClassName JET_CONSTRUCTOR = new JvmClassName("jet.runtime.typeinfo.JetConstructor");
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiMember;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Stepan Koltsov
|
||||||
|
*/
|
||||||
|
public class PsiFieldWrapper extends PsiMemberWrapper {
|
||||||
|
public PsiFieldWrapper(@NotNull PsiMember psiMember) {
|
||||||
|
super(psiMember);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiMember;
|
||||||
|
import com.intellij.psi.PsiModifier;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Stepan Koltsov
|
||||||
|
*/
|
||||||
|
public class PsiMemberWrapper {
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
protected final PsiMember psiMember;
|
||||||
|
|
||||||
|
public PsiMemberWrapper(@NotNull PsiMember psiMember) {
|
||||||
|
this.psiMember = psiMember;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isStatic() {
|
||||||
|
return psiMember.hasModifierProperty(PsiModifier.STATIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPrivate() {
|
||||||
|
return psiMember.hasModifierProperty(PsiModifier.PRIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+23
-14
@@ -1,11 +1,13 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.java;
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiMember;
|
||||||
import com.intellij.psi.PsiMethod;
|
import com.intellij.psi.PsiMethod;
|
||||||
import com.intellij.psi.PsiModifier;
|
import com.intellij.psi.PsiModifier;
|
||||||
import com.intellij.psi.PsiParameter;
|
import com.intellij.psi.PsiParameter;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kt.JetConstructorAnnotation;
|
import org.jetbrains.jet.lang.resolve.java.kt.JetConstructorAnnotation;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kt.JetMethodAnnotation;
|
import org.jetbrains.jet.lang.resolve.java.kt.JetMethodAnnotation;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.kt.JetMethodOrPropertyAnnotation;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kt.JetPropertyAnnotation;
|
import org.jetbrains.jet.lang.resolve.java.kt.JetPropertyAnnotation;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -14,19 +16,17 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* @author Stepan Koltsov
|
* @author Stepan Koltsov
|
||||||
*/
|
*/
|
||||||
public class PsiMethodWrapper {
|
public class PsiMethodWrapper extends PsiMemberWrapper {
|
||||||
@NotNull
|
|
||||||
private final PsiMethod psiMethod;
|
|
||||||
|
|
||||||
public PsiMethodWrapper(@NotNull PsiMethod psiMethod) {
|
public PsiMethodWrapper(@NotNull PsiMethod psiMethod) {
|
||||||
this.psiMethod = psiMethod;
|
super(psiMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<PsiParameterWrapper> parameters;
|
private List<PsiParameterWrapper> parameters;
|
||||||
@NotNull
|
@NotNull
|
||||||
public List<PsiParameterWrapper> getParameters() {
|
public List<PsiParameterWrapper> getParameters() {
|
||||||
if (parameters == null) {
|
if (parameters == null) {
|
||||||
PsiParameter[] psiParameters = psiMethod.getParameterList().getParameters();
|
PsiParameter[] psiParameters = getPsiMethod().getParameterList().getParameters();
|
||||||
parameters = new ArrayList<PsiParameterWrapper>(psiParameters.length);
|
parameters = new ArrayList<PsiParameterWrapper>(psiParameters.length);
|
||||||
for (int i = 0; i < psiParameters.length; ++i) {
|
for (int i = 0; i < psiParameters.length; ++i) {
|
||||||
parameters.add(new PsiParameterWrapper(psiParameters[i]));
|
parameters.add(new PsiParameterWrapper(psiParameters[i]));
|
||||||
@@ -40,19 +40,15 @@ public class PsiMethodWrapper {
|
|||||||
return getParameters().get(i);
|
return getParameters().get(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isStatic() {
|
public boolean isFinal() {
|
||||||
return psiMethod.getModifierList().hasExplicitModifier(PsiModifier.STATIC);
|
return psiMember.hasModifierProperty(PsiModifier.FINAL);
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isPrivate() {
|
|
||||||
return psiMethod.hasModifierProperty(PsiModifier.PRIVATE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private JetMethodAnnotation jetMethod;
|
private JetMethodAnnotation jetMethod;
|
||||||
@NotNull
|
@NotNull
|
||||||
public JetMethodAnnotation getJetMethod() {
|
public JetMethodAnnotation getJetMethod() {
|
||||||
if (jetMethod == null) {
|
if (jetMethod == null) {
|
||||||
jetMethod = JetMethodAnnotation.get(psiMethod);
|
jetMethod = JetMethodAnnotation.get(getPsiMethod());
|
||||||
}
|
}
|
||||||
return jetMethod;
|
return jetMethod;
|
||||||
}
|
}
|
||||||
@@ -61,7 +57,7 @@ public class PsiMethodWrapper {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public JetConstructorAnnotation getJetConstructor() {
|
public JetConstructorAnnotation getJetConstructor() {
|
||||||
if (jetConstructor == null) {
|
if (jetConstructor == null) {
|
||||||
jetConstructor = JetConstructorAnnotation.get(psiMethod);
|
jetConstructor = JetConstructorAnnotation.get(getPsiMethod());
|
||||||
}
|
}
|
||||||
return jetConstructor;
|
return jetConstructor;
|
||||||
}
|
}
|
||||||
@@ -70,8 +66,21 @@ public class PsiMethodWrapper {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public JetPropertyAnnotation getJetProperty() {
|
public JetPropertyAnnotation getJetProperty() {
|
||||||
if (jetProperty == null) {
|
if (jetProperty == null) {
|
||||||
jetProperty = JetPropertyAnnotation.get(psiMethod);
|
jetProperty = JetPropertyAnnotation.get(getPsiMethod());
|
||||||
}
|
}
|
||||||
return jetProperty;
|
return jetProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JetMethodOrPropertyAnnotation getJetMethodOrProperty() {
|
||||||
|
if (getJetMethod().isDefined()) {
|
||||||
|
return getJetMethod();
|
||||||
|
} else {
|
||||||
|
return getJetProperty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public PsiMethod getPsiMethod() {
|
||||||
|
return (PsiMethod) psiMember;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-10
@@ -9,21 +9,12 @@ import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
|
|||||||
/**
|
/**
|
||||||
* @author Stepan Koltsov
|
* @author Stepan Koltsov
|
||||||
*/
|
*/
|
||||||
public class JetMethodAnnotation extends PsiAnnotationWrapper {
|
public class JetMethodAnnotation extends JetMethodOrPropertyAnnotation {
|
||||||
|
|
||||||
public JetMethodAnnotation(@Nullable PsiAnnotation psiAnnotation) {
|
public JetMethodAnnotation(@Nullable PsiAnnotation psiAnnotation) {
|
||||||
super(psiAnnotation);
|
super(psiAnnotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String typeParameters;
|
|
||||||
@NotNull
|
|
||||||
public String typeParameters() {
|
|
||||||
if (typeParameters == null) {
|
|
||||||
typeParameters = getStringAttribute(JvmStdlibNames.JET_METHOD_TYPE_PARAMETERS_FIELD, "");
|
|
||||||
}
|
|
||||||
return typeParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String returnType;
|
private String returnType;
|
||||||
@NotNull
|
@NotNull
|
||||||
public String returnType() {
|
public String returnType() {
|
||||||
|
|||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java.kt;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiAnnotation;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Stepan Koltsov
|
||||||
|
*/
|
||||||
|
public abstract class JetMethodOrPropertyAnnotation extends PsiAnnotationWrapper {
|
||||||
|
protected JetMethodOrPropertyAnnotation(@Nullable PsiAnnotation psiAnnotation) {
|
||||||
|
super(psiAnnotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String typeParameters;
|
||||||
|
@NotNull
|
||||||
|
public String typeParameters() {
|
||||||
|
if (typeParameters == null) {
|
||||||
|
typeParameters = getStringAttribute(JvmStdlibNames.JET_METHOD_TYPE_PARAMETERS_FIELD, "");
|
||||||
|
}
|
||||||
|
return typeParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+1
-1
@@ -9,7 +9,7 @@ import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
|
|||||||
/**
|
/**
|
||||||
* @author Stepan Koltsov
|
* @author Stepan Koltsov
|
||||||
*/
|
*/
|
||||||
public class JetPropertyAnnotation extends PsiAnnotationWrapper {
|
public class JetPropertyAnnotation extends JetMethodOrPropertyAnnotation {
|
||||||
protected JetPropertyAnnotation(@Nullable PsiAnnotation psiAnnotation) {
|
protected JetPropertyAnnotation(@Nullable PsiAnnotation psiAnnotation) {
|
||||||
super(psiAnnotation);
|
super(psiAnnotation);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import java.util.Map
|
||||||
|
|
||||||
|
var <P, Q> Map<P, Q>.asas: Int
|
||||||
|
get() = throw Exception()
|
||||||
|
set(i: Int) = throw Exception()
|
||||||
@@ -12,4 +12,6 @@ import java.lang.annotation.Target;
|
|||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface JetProperty {
|
public @interface JetProperty {
|
||||||
String type() default "";
|
String type() default "";
|
||||||
|
|
||||||
|
String typeParameters() default "";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user