Override/Implement: Make return type non-nullable (platform collection case) when overriding Java method

#KT-13455 Fixed
This commit is contained in:
Alexey Sedunov
2016-08-16 15:05:01 +03:00
parent ac6f0b5419
commit 238f99aa3d
7 changed files with 37 additions and 10 deletions
+1
View File
@@ -172,6 +172,7 @@ These artifacts include extensions for the types available in the latter JDKs, s
- [`KT-13207`](https://youtrack.jetbrains.com/issue/KT-13207) Exception on safe delete from intention in 2016.2
- [`KT-12887`](https://youtrack.jetbrains.com/issue/KT-12887) "Extend selection" should select call's invoked expression
- [`KT-6520`](https://youtrack.jetbrains.com/issue/KT-6520) Introduce 'maino' and 'psvmo' templates for generating main in object
- [`KT-13455`](https://youtrack.jetbrains.com/issue/KT-13455) Override/Implement: Make return type non-nullable (platform collection case) when overriding Java method
- Fix exception when choose Gradle configurer after project is synced
- Allow configuring Kotlin in Gradle module without Kotlin sources
- Show all Kotlin annotations when browsing hierarchy of "java.lang.Annotation"
@@ -34,12 +34,18 @@ import org.jetbrains.kotlin.types.typeUtil.*
import org.jetbrains.kotlin.utils.SmartSet
import org.jetbrains.kotlin.utils.addToStdlib.singletonList
fun KotlinType.approximateFlexibleTypes(preferNotNull: Boolean = false): KotlinType {
fun KotlinType.approximateFlexibleTypes(
preferNotNull: Boolean = false,
preferStarForRaw: Boolean = false
): KotlinType {
if (isDynamic()) return this
return approximateNonDynamicFlexibleTypes(preferNotNull)
return approximateNonDynamicFlexibleTypes(preferNotNull, preferStarForRaw)
}
private fun KotlinType.approximateNonDynamicFlexibleTypes(preferNotNull: Boolean = false): SimpleType {
private fun KotlinType.approximateNonDynamicFlexibleTypes(
preferNotNull: Boolean = false,
preferStarForRaw: Boolean = false
): SimpleType {
if (isFlexible()) {
val flexible = asFlexibleType()
val lowerClass = flexible.lowerBound.constructor.declarationDescriptor as? ClassDescriptor?
@@ -51,6 +57,8 @@ private fun KotlinType.approximateNonDynamicFlexibleTypes(preferNotNull: Boolean
var approximation =
if (isCollection)
(if (isAnnotatedReadOnly()) flexible.upperBound else flexible.lowerBound).makeNullableAsSpecified(!preferNotNull)
else
if (this is RawType && preferStarForRaw) flexible.upperBound.makeNullableAsSpecified(!preferNotNull)
else
if (preferNotNull) flexible.lowerBound else flexible.upperBound
@@ -31,13 +31,11 @@ import org.jetbrains.kotlin.idea.core.util.DescriptorMemberChooserObject
import org.jetbrains.kotlin.idea.j2k.IdeaDocCommentConverter
import org.jetbrains.kotlin.idea.kdoc.KDocElementFactory
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.util.approximateFlexibleTypes
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 {
enum class BodyType {
@@ -161,10 +159,7 @@ 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(): KotlinType? {
val originalType = descriptor.returnType ?: return null
return if (originalType.isFlexible()) originalType.makeNotNullable() else originalType
}
override fun getReturnType() = descriptor.returnType?.approximateFlexibleTypes(preferNotNull = true, preferStarForRaw = true)
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,7 @@
package foo;
import java.util.List;
public interface A {
List<String> foo();
}
@@ -0,0 +1,5 @@
import foo.A
class B : A {
<caret>
}
@@ -0,0 +1,7 @@
import foo.A
class B : A {
override fun foo(): MutableList<String> {
<selection><caret>TODO("not implemented") //To change body of created functions use File | Settings | File Templates.</selection>
}
}
@@ -248,6 +248,10 @@ class OverrideImplementTest : AbstractOverrideImplementTest() {
doOverrideDirectoryTest("foo")
}
fun testPlatformCollectionTypes() {
doOverrideDirectoryTest("foo")
}
fun testNullableJavaType() {
doOverrideDirectoryTest("foo")
}