read java bean properties as kotlin properties

This commit is contained in:
Stepan Koltsov
2012-02-21 23:15:36 +04:00
parent cc8d263f9e
commit f83c5e0d83
18 changed files with 137 additions and 9 deletions
@@ -1069,9 +1069,13 @@ public class JavaDescriptorResolver {
}
Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
for (GroupingValue members : map.values()) {
Set<VariableDescriptor> r = new HashSet<VariableDescriptor>(1);
// we cannot have more then one property with given name even if java code
// has several fields, getters and setter of different types
if (map.size() == 1) {
GroupingValue members = map.values().iterator().next();
boolean isFinal;
if (members.setter == null && members.getter == null) {
isFinal = false;
@@ -20,6 +20,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiParameter;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -113,6 +114,9 @@ class JavaDescriptorResolverHelper {
// TODO: remove getJavaClass
if (method.getName().startsWith(JvmAbi.GETTER_PREFIX)) {
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.GETTER_PREFIX.length()));
NamedMembers members = getNamedMembers(propertyName);
// TODO: some java properties too
if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
@@ -137,16 +141,22 @@ class JavaDescriptorResolverHelper {
throw new IllegalStateException();
}
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.GETTER_PREFIX.length()));
NamedMembers members = getNamedMembers(propertyName);
// TODO: what if returnType == null?
TypeSource propertyType = new TypeSource(method.getJetMethod().propertyType(), method.getReturnType(), method.getPsiMethod());
members.addPropertyAccessor(new PropertyAccessorData(method, true, propertyType, receiverType));
} else if (!kotlin) {
if (method.getParameters().size() == 0) {
TypeSource propertyType = new TypeSource("", method.getReturnType(), method.getPsiMethod());
members.addPropertyAccessor(new PropertyAccessorData(method, true, propertyType, null));
}
}
} else if (method.getName().startsWith(JvmAbi.SETTER_PREFIX)) {
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.SETTER_PREFIX.length()));
NamedMembers members = getNamedMembers(propertyName);
if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
if (method.getParameters().size() == 0) {
// TODO: report error properly
@@ -173,10 +183,13 @@ class JavaDescriptorResolverHelper {
PsiParameterWrapper propertyTypeParameter = method.getParameter(i);
TypeSource propertyType = new TypeSource(method.getJetMethod().propertyType(), propertyTypeParameter.getPsiParameter().getType(), propertyTypeParameter.getPsiParameter());
String propertyName = StringUtil.decapitalize(method.getName().substring(JvmAbi.SETTER_PREFIX.length()));
NamedMembers members = getNamedMembers(propertyName);
members.addPropertyAccessor(new PropertyAccessorData(method, false, propertyType, receiverType));
} else if (!kotlin) {
if (method.getParameters().size() == 1) {
PsiParameter psiParameter = method.getParameters().get(0).getPsiParameter();
TypeSource propertyType = new TypeSource("", psiParameter.getType(), psiParameter);
members.addPropertyAccessor(new PropertyAccessorData(method, false, propertyType, null));
}
}
}
@@ -24,4 +24,13 @@ abstract class test.ClassDoesNotOverrideMethod : java.util.Date {
open override /*1*/ fun setYear(/*0*/ p0: jet.Int): jet.Tuple0
open override /*1*/ fun toGMTString(): jet.String?
open override /*1*/ fun toLocaleString(): jet.String?
val day: jet.Int
val timezoneOffset: jet.Int
var date: jet.Int
var hours: jet.Int
var minutes: jet.Int
var month: jet.Int
var seconds: jet.Int
var time: jet.Long
var year: jet.Int
}
@@ -0,0 +1,6 @@
package test;
class DifferentGetterAndSetter {
void setSomething(String color) { }
int getSomething() { return 17; }
}
@@ -0,0 +1,6 @@
package test
open class DifferentGetterAndSetter() {
open fun setSomething(p0: String?): Unit { }
open fun getSomething() = 17
}
@@ -0,0 +1,7 @@
namespace test
open class test.DifferentGetterAndSetter : jet.Any {
final /*constructor*/ fun <init>(): test.DifferentGetterAndSetter
open fun getSomething(): jet.Int
open fun setSomething(/*0*/ p0: jet.String?): jet.Tuple0
}
@@ -0,0 +1,5 @@
package test;
class JavaBeanVal {
String getColor() { return ""; }
}
@@ -0,0 +1,6 @@
package test
open class JavaBeanVal() {
open fun getColor(): String? = ""
val color: String? = ""
}
@@ -0,0 +1,7 @@
namespace test
open class test.JavaBeanVal : jet.Any {
final /*constructor*/ fun <init>(): test.JavaBeanVal
open fun getColor(): jet.String?
val color: jet.String?
}
@@ -0,0 +1,6 @@
package test;
class JavaBeanVal {
String getColor() { return ""; }
void setColor(String string) { }
}
@@ -0,0 +1,7 @@
package test
open class JavaBeanVal() {
open fun getColor(): String? = ""
open fun setColor(p0: String?): Unit { }
var color: String? = ""
}
@@ -0,0 +1,8 @@
namespace test
open class test.JavaBeanVal : jet.Any {
final /*constructor*/ fun <init>(): test.JavaBeanVal
open fun getColor(): jet.String?
open fun setColor(/*0*/ p0: jet.String?): jet.Tuple0
var color: jet.String?
}
@@ -0,0 +1,8 @@
package test;
import java.util.ArrayList;
class JavaBeanVarOfGenericType<P> {
ArrayList<P> getCharacters() { return null; }
void setCharacters(ArrayList<P> characters) { }
}
@@ -0,0 +1,9 @@
package test
import java.util.ArrayList
open class JavaBeanVarOfGenericType<erased P> {
open fun getCharacters(): ArrayList<P>? = null
open fun setCharacters(p0: ArrayList<P>?) { }
var characters: ArrayList<P>? = null
}
@@ -0,0 +1,8 @@
namespace test
open class test.JavaBeanVarOfGenericType</*0*/ P : jet.Any?> : jet.Any {
final /*constructor*/ fun </*0*/ P : jet.Any?><init>(): test.JavaBeanVarOfGenericType</*0*/ P : jet.Any?>
open fun getCharacters(): java.util.ArrayList</*0*/ P : jet.Any?>?
open fun setCharacters(/*0*/ p0: java.util.ArrayList<P>?): jet.Tuple0
var characters: java.util.ArrayList</*0*/ P : jet.Any?>?
}
@@ -0,0 +1,6 @@
package test;
class TwoSetters {
void setSize(String size) { }
void setSize(int size) { }
}
@@ -0,0 +1,6 @@
package test
open class TwoSetters() {
open fun setSize(p0: String?) { }
open fun setSize(p0: Int) { }
}
@@ -0,0 +1,7 @@
namespace test
open class test.TwoSetters : jet.Any {
final /*constructor*/ fun <init>(): test.TwoSetters
open fun setSize(/*0*/ p0: jet.Int): jet.Tuple0
open fun setSize(/*0*/ p0: jet.String?): jet.Tuple0
}