recognize @NotNull

http://youtrack.jetbrains.com/issue/KT-129
This commit is contained in:
Stepan Koltsov
2012-02-20 22:37:06 +04:00
parent 2026be5464
commit a1d88a0877
14 changed files with 89 additions and 10 deletions
@@ -879,8 +879,6 @@ public class JavaDescriptorResolver {
PsiType psiType = parameter.getPsiParameter().getType();
boolean nullable = parameter.getJetValueParameter().nullable();
// TODO: must be very slow, make it lazy?
String name = parameter.getPsiParameter().getName() != null ? parameter.getPsiParameter().getName() : "p" + i;
@@ -909,13 +907,22 @@ public class JavaDescriptorResolver {
if (receiver) {
return JvmMethodParameterMeaning.receiver(outType);
} else {
JetType transformedType;
if (parameter.getJetValueParameter().nullable()) {
transformedType = TypeUtils.makeNullableAsSpecified(outType, parameter.getJetValueParameter().nullable());
} else if (parameter.getPsiParameter().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
transformedType = TypeUtils.makeNullableAsSpecified(outType, false);
} else {
transformedType = outType;
}
return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
containingDeclaration,
i,
Collections.<AnnotationDescriptor>emptyList(), // TODO
name,
false,
nullable ? TypeUtils.makeNullableAsSpecified(outType, nullable) : outType,
transformedType,
hasDefaultValue,
varargElementType
));
@@ -1142,6 +1149,9 @@ public class JavaDescriptorResolver {
propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
} else {
propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
}
}
JetType receiverType;
@@ -1491,6 +1501,8 @@ public class JavaDescriptorResolver {
}
if (method.getJetMethod().returnTypeNullable()) {
return TypeUtils.makeNullableAsSpecified(transformedType, true);
} else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
return TypeUtils.makeNullableAsSpecified(transformedType, false);
} else {
return transformedType;
}
@@ -88,7 +88,7 @@ class JavaDescriptorResolverHelper {
NamedMembers namedMembers = getNamedMembers(field.getName());
TypeSource type = new TypeSource("", field.getType());
TypeSource type = new TypeSource("", field.getType(), field0);
namedMembers.addPropertyAccessor(new PropertyAccessorData(field, type, null));
}
}
@@ -124,7 +124,7 @@ class JavaDescriptorResolverHelper {
TypeSource receiverType;
if (i < method.getParameters().size() && method.getParameter(i).getJetValueParameter().receiver()) {
PsiParameterWrapper receiverParameter = method.getParameter(i);
receiverType = new TypeSource(receiverParameter.getJetValueParameter().type(), receiverParameter.getPsiParameter().getType());
receiverType = new TypeSource(receiverParameter.getJetValueParameter().type(), receiverParameter.getPsiParameter().getType(), receiverParameter.getPsiParameter());
++i;
} else {
receiverType = null;
@@ -144,7 +144,7 @@ class JavaDescriptorResolverHelper {
NamedMembers members = getNamedMembers(propertyName);
// TODO: what if returnType == null?
TypeSource propertyType = new TypeSource(method.getJetMethod().propertyType(), method.getReturnType());
TypeSource propertyType = new TypeSource(method.getJetMethod().propertyType(), method.getReturnType(), method.getPsiMethod());
members.addPropertyAccessor(new PropertyAccessorData(method, true, propertyType, receiverType));
}
@@ -161,7 +161,7 @@ class JavaDescriptorResolverHelper {
TypeSource receiverType = null;
PsiParameterWrapper p1 = method.getParameter(0);
if (p1.getJetValueParameter().receiver()) {
receiverType = new TypeSource(p1.getJetValueParameter().type(), p1.getPsiParameter().getType());
receiverType = new TypeSource(p1.getJetValueParameter().type(), p1.getPsiParameter().getType(), p1.getPsiParameter());
++i;
}
@@ -174,7 +174,7 @@ class JavaDescriptorResolverHelper {
}
PsiParameterWrapper propertyTypeParameter = method.getParameter(i);
TypeSource propertyType = new TypeSource(method.getJetMethod().propertyType(), propertyTypeParameter.getPsiParameter().getType());
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);
@@ -27,4 +27,6 @@ public class JvmAbi {
public static final String PACKAGE_CLASS = "namespace";
public static final String SET_TYPE_INFO_METHOD = "$setTypeInfo";
public static final String TYPE_INFO_FIELD = "$typeInfo";
public static final JvmClassName JETBRAINS_NOT_NULL_ANNOTATION = new JvmClassName("org.jetbrains.annotations.NotNull");
}
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.resolve.java;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.PsiType;
import org.jetbrains.annotations.NotNull;
@@ -28,10 +29,13 @@ class TypeSource {
private final String typeString;
@NotNull
private final PsiType psiType;
@NotNull
private final PsiModifierListOwner psiNotNullOwner;
TypeSource(@NotNull String typeString, @NotNull PsiType psiType) {
TypeSource(@NotNull String typeString, @NotNull PsiType psiType, @NotNull PsiModifierListOwner psiNotNullOwner) {
this.typeString = typeString;
this.psiType = psiType;
this.psiNotNullOwner = psiNotNullOwner;
}
@NotNull
@@ -43,4 +47,9 @@ class TypeSource {
public PsiType getPsiType() {
return psiType;
}
@NotNull
public PsiModifierListOwner getPsiNotNullOwner() {
return psiNotNullOwner;
}
}
@@ -0,0 +1,8 @@
package test;
import org.jetbrains.annotations.NotNull;
class NotNullField {
@NotNull
public String hi;
}
@@ -0,0 +1,5 @@
package test;
open class NotNullField() {
var hi: String = "";
}
@@ -0,0 +1,6 @@
namespace test
open class test.NotNullField : jet.Any {
final /*constructor*/ fun <init>(): test.NotNullField
var hi: jet.String
}
@@ -0,0 +1,8 @@
package test;
import org.jetbrains.annotations.NotNull;
class NotNullMethod {
@NotNull
public String hi() { return ""; }
}
@@ -0,0 +1,5 @@
package test
open class NotNullMethod() {
open fun hi(): String = ""
}
@@ -0,0 +1,6 @@
namespace test
open class test.NotNullMethod : jet.Any {
final /*constructor*/ fun <init>(): test.NotNullMethod
open fun hi(): jet.String
}
@@ -0,0 +1,7 @@
package test;
import org.jetbrains.annotations.NotNull;
class NotNullParameter {
public void hi(@NotNull String param) { }
}
@@ -0,0 +1,5 @@
package test
open class NotNullParameter() {
open fun hi(p0: String): Unit { }
}
@@ -0,0 +1,6 @@
namespace test
open class test.NotNullParameter : jet.Any {
final /*constructor*/ fun <init>(): test.NotNullParameter
open fun hi(/*0*/ p0: jet.String): jet.Tuple0
}
@@ -97,7 +97,7 @@ public class ReadJavaBinaryClassTest extends TestCaseWithTmpdir {
try {
Iterable<? extends JavaFileObject> javaFileObjectsFromFiles = fileManager.getJavaFileObjectsFromFiles(Collections.singleton(javaFile));
List<String> options = Arrays.asList(
"-classpath", "out/production/stdlib",
"-classpath", "out/production/stdlib:ideaSDK/lib/annotations.jar",
"-d", tmpdir.getPath()
);
JavaCompiler.CompilationTask task = javaCompiler.getTask(null, fileManager, null, options, null, javaFileObjectsFromFiles);