Override/Implement Members: Support all nullability annotations respected by the Kotlin compiler

#KT-12704 Fixed
 #KT-15583 Fixed
This commit is contained in:
Alexey Sedunov
2017-01-10 20:07:03 +03:00
parent d94243ac7b
commit 862966fd33
8 changed files with 57 additions and 6 deletions
+1
View File
@@ -473,6 +473,7 @@ These artifacts include extensions for the types available in the latter JDKs, s
- Pull Up: Fix pull-up from object to superclass
- [`KT-15602`](https://youtrack.jetbrains.com/issue/KT-15602) Extract Interface/Superclass: Disable "Make abstract" for inline/external/lateinit members
- Extract Interface: Disable inline/external/lateinit members
- [`KT-12704`](https://youtrack.jetbrains.com/issue/KT-12704), [`KT-15583`](https://youtrack.jetbrains.com/issue/KT-15583) Override/Implement Members: Support all nullability annotations respected by the Kotlin compiler
#### Intention actions, inspections and quickfixes
@@ -31,10 +31,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.builtIns
import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes
import org.jetbrains.kotlin.types.typeUtil.substitute
import org.jetbrains.kotlin.types.typeUtil.supertypes
import org.jetbrains.kotlin.types.typeUtil.*
import org.jetbrains.kotlin.utils.SmartSet
import org.jetbrains.kotlin.utils.addToStdlib.singletonList
@@ -68,7 +65,7 @@ private fun KotlinType.approximateNonDynamicFlexibleTypes(
approximation = approximation.approximateNonDynamicFlexibleTypes()
approximation = if (isAnnotatedNotNull()) approximation.makeNullableAsSpecified(false) else approximation
approximation = if (nullability() == TypeNullability.NOT_NULL) approximation.makeNullableAsSpecified(false) else approximation
if (approximation.isMarkedNullable && !flexible.lowerBound.isMarkedNullable && TypeUtils.isTypeParameter(approximation) && TypeUtils.hasNullableSuperType(approximation)) {
approximation = approximation.makeNullableAsSpecified(false)
@@ -47,8 +47,10 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.TypeNullability
import org.jetbrains.kotlin.types.typeUtil.builtIns
import org.jetbrains.kotlin.types.typeUtil.isUnit
import org.jetbrains.kotlin.types.typeUtil.nullability
import java.util.*
interface Parameter {
@@ -331,7 +333,7 @@ val ControlFlow.possibleReturnTypes: List<KotlinType>
return when {
!returnType.isNullabilityFlexible() ->
listOf(returnType)
returnType.isAnnotatedNotNull() || returnType.isAnnotatedNullable() ->
returnType.nullability() != TypeNullability.FLEXIBLE ->
listOf(returnType.approximateFlexibleTypes())
else ->
(returnType.unwrap() as FlexibleType).let { listOf(it.upperBound, it.lowerBound) }
@@ -0,0 +1,9 @@
package foo;
import javax.annotation.Nonnull;
public class A {
public @Nonnull String foo(@Nonnull String s) {
return null;
}
}
@@ -0,0 +1,5 @@
import foo.A
class B : A() {
<caret>
}
@@ -0,0 +1,7 @@
import foo.A
class B : A() {
override fun foo(s: String): String {
<selection><caret>return super.foo(s)</selection>
}
}
@@ -0,0 +1,26 @@
package javax.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.annotation.meta.TypeQualifier;
import javax.annotation.meta.TypeQualifierValidator;
import javax.annotation.meta.When;
@Documented
@TypeQualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface Nonnull {
When when() default When.ALWAYS;
static class Checker implements TypeQualifierValidator<Nonnull> {
public When forConstantValue(Nonnull qualifierqualifierArgument,
Object value) {
if (value == null)
return When.NEVER;
return When.ALWAYS;
}
}
}
@@ -256,6 +256,10 @@ class OverrideImplementTest : AbstractOverrideImplementTest() {
doOverrideDirectoryTest("foo")
}
fun testJavaxNonnullJavaType() {
doOverrideDirectoryTest("foo")
}
fun testNullableKotlinType() {
doOverrideDirectoryTest("foo")
}