Do not render redundant Nullable annotations when generating declarations

#KT-36321 fixed
This commit is contained in:
Ilya Kirillov
2020-02-04 19:19:22 +03:00
parent 4df8744b34
commit 0fe5694cb7
5 changed files with 39 additions and 1 deletions
@@ -6,20 +6,26 @@
package org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder
import com.intellij.refactoring.psi.SearchUtils
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.isFunctionType
import org.jetbrains.kotlin.cfg.pseudocode.*
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.idea.project.builtIns
import org.jetbrains.kotlin.idea.util.getDataFlowAwareTypes
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.load.java.NULLABILITY_ANNOTATIONS
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsStatement
import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
@@ -77,7 +83,11 @@ private fun KotlinType.renderSingle(typeParameterNameMap: Map<TypeParameterDescr
.mapKeys { it.key.typeConstructor }
val typeToRender = TypeSubstitutor.create(substitution).substitute(this, Variance.INVARIANT)!!
val renderer = if (fq) IdeDescriptorRenderers.SOURCE_CODE else IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_NO_ANNOTATIONS
val renderer =
if (fq) IdeDescriptorRenderers.SOURCE_CODE.withOptions {
excludedTypeAnnotationClasses = NULLABILITY_ANNOTATIONS
}
else IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_NO_ANNOTATIONS
return renderer.renderType(typeToRender)
}
@@ -0,0 +1,11 @@
// "Create function 'bar'" "true"
// ERROR: Unresolved reference: bar
fun foo(foo: Foo) {
val s = foo.eval()
bar(s)
}
fun bar(s: String?) {
<selection>TODO("Not yet implemented")<caret></selection>
}
@@ -0,0 +1,5 @@
public class Foo {
public @org.jetbrains.annotations.Nullable String eval() {
return null;
}
}
@@ -0,0 +1,7 @@
// "Create function 'bar'" "true"
// ERROR: Unresolved reference: bar
fun foo(foo: Foo) {
val s = foo.eval()
<caret>bar(s)
}
@@ -1965,6 +1965,11 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
runTest("idea/testData/quickfix/createFromUsage/createFunction/call/genericFunOnJavaType.before.Main.kt");
}
@TestMetadata("javaNullabilityAnnotation.before.Main.kt")
public void testJavaNullabilityAnnotation() throws Exception {
runTest("idea/testData/quickfix/createFromUsage/createFunction/call/javaNullabilityAnnotation.before.Main.kt");
}
@TestMetadata("staticExtensionFunOnJavaClass.before.Main.kt")
public void testStaticExtensionFunOnJavaClass() throws Exception {
runTest("idea/testData/quickfix/createFromUsage/createFunction/call/staticExtensionFunOnJavaClass.before.Main.kt");