AddThrowsAnnotationIntention: fix compatibility for old annotation

#KT-38391
This commit is contained in:
Dmitry Gridin
2020-04-20 22:20:25 +07:00
committed by Ilya Gorbunov
parent 6bf85beba7
commit 844e567421
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.intentions package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinBundle
@@ -13,7 +14,9 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.project.platform import org.jetbrains.kotlin.idea.project.platform
import org.jetbrains.kotlin.idea.refactoring.fqName.fqName
import org.jetbrains.kotlin.idea.util.addAnnotation import org.jetbrains.kotlin.idea.util.addAnnotation
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.platform.jvm.isJvm
@@ -66,7 +69,11 @@ class AddThrowsAnnotationIntention : SelfTargetingIntention<KtThrowExpression>(
if (annotationEntry == null || annotationEntry.valueArguments.isEmpty()) { if (annotationEntry == null || annotationEntry.valueArguments.isEmpty()) {
annotationEntry?.delete() annotationEntry?.delete()
val whiteSpaceText = if (containingDeclaration is KtPropertyAccessor) " " else "\n" val whiteSpaceText = if (containingDeclaration is KtPropertyAccessor) " " else "\n"
containingDeclaration.addAnnotation(KOTLIN_THROWS_ANNOTATION_FQ_NAME, annotationArgumentText, whiteSpaceText) val annotationFqName = KOTLIN_THROWS_ANNOTATION_FQ_NAME.takeIf {
element.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4
} ?: JVM_THROWS_ANNOTATION_FQ_NAME
containingDeclaration.addAnnotation(annotationFqName, annotationArgumentText, whiteSpaceText)
} else { } else {
val factory = KtPsiFactory(element) val factory = KtPsiFactory(element)
val argument = annotationEntry.valueArguments.firstOrNull() val argument = annotationEntry.valueArguments.firstOrNull()
@@ -110,7 +117,8 @@ private fun KtDeclaration.findThrowsAnnotation(context: BindingContext): KtAnnot
val annotationEntries = this.annotationEntries + (parent as? KtProperty)?.annotationEntries.orEmpty() val annotationEntries = this.annotationEntries + (parent as? KtProperty)?.annotationEntries.orEmpty()
return annotationEntries.find { return annotationEntries.find {
val typeReference = it.typeReference ?: return@find false val typeReference = it.typeReference ?: return@find false
context[BindingContext.TYPE, typeReference]?.constructor?.declarationDescriptor?.fqNameSafe == JVM_THROWS_ANNOTATION_FQ_NAME val fqName = context[BindingContext.TYPE, typeReference]?.fqName ?: return@find false
fqName == KOTLIN_THROWS_ANNOTATION_FQ_NAME || fqName == JVM_THROWS_ANNOTATION_FQ_NAME
} }
} }