Override/Implement Members: Do not make return type non-nullable if base
return type is explicitly nullable #KT-13383 Fixed #KT-13379 Fixed
This commit is contained in:
@@ -11,6 +11,9 @@
|
||||
- [`KT-12903`](https://youtrack.jetbrains.com/issue/KT-12903) Implement "Inline type alias" refactoring
|
||||
- [`KT-12902`](https://youtrack.jetbrains.com/issue/KT-12902) Implement "Introduce type alias" refactoring
|
||||
|
||||
###### Issues fixed
|
||||
- [`KT-13383`](https://youtrack.jetbrains.com/issue/KT-13383), [`KT-13379`](https://youtrack.jetbrains.com/issue/KT-13379) Override/Implement Members: Do not make return type non-nullable if base return type is explicitly nullable
|
||||
|
||||
## 1.1-M01 (EAP-1)
|
||||
|
||||
### Language features
|
||||
|
||||
+6
-1
@@ -35,6 +35,8 @@ import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.findDocComment.findDocComment
|
||||
import org.jetbrains.kotlin.renderer.*
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.isFlexible
|
||||
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
||||
|
||||
interface OverrideMemberChooserObject : ClassMember {
|
||||
@@ -158,7 +160,10 @@ private fun generateConstructorParameter(project: Project, descriptor: PropertyD
|
||||
private fun generateFunction(project: Project, descriptor: FunctionDescriptor, bodyType: OverrideMemberChooserObject.BodyType): KtNamedFunction {
|
||||
val newDescriptor = object : FunctionDescriptor by descriptor {
|
||||
override fun getModality() = Modality.OPEN
|
||||
override fun getReturnType() = descriptor.returnType?.makeNotNullable()
|
||||
override fun getReturnType(): KotlinType? {
|
||||
val originalType = descriptor.returnType ?: return null
|
||||
return if (originalType.isFlexible()) originalType.makeNotNullable() else originalType
|
||||
}
|
||||
override fun getOverriddenDescriptors() = listOf(descriptor)
|
||||
override fun <R : Any?, D : Any?> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D) = visitor.visitFunctionDescriptor(this, data)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package foo;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class A {
|
||||
public @Nullable String foo(String s) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import foo.A
|
||||
|
||||
class B : A() {
|
||||
<caret>
|
||||
}
|
||||
+7
@@ -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,7 @@
|
||||
interface IBase {
|
||||
fun foo(): Any?
|
||||
}
|
||||
|
||||
class C : IBase {
|
||||
<caret>
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface IBase {
|
||||
fun foo(): Any?
|
||||
}
|
||||
|
||||
class C : IBase {
|
||||
override fun foo(): Any? {
|
||||
<selection><caret>TODO("not implemented") //To change body of created functions use File | Settings | File Templates.</selection>
|
||||
}
|
||||
}
|
||||
@@ -248,6 +248,14 @@ class OverrideImplementTest : AbstractOverrideImplementTest() {
|
||||
doOverrideDirectoryTest("foo")
|
||||
}
|
||||
|
||||
fun testNullableJavaType() {
|
||||
doOverrideDirectoryTest("foo")
|
||||
}
|
||||
|
||||
fun testNullableKotlinType() {
|
||||
doOverrideDirectoryTest("foo")
|
||||
}
|
||||
|
||||
fun testAbstractAndNonAbstractInheritedFromInterface() {
|
||||
doImplementFileTest("getFoo")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user