Specify type explicitly intention: now derived from self targeting range intention
(cherry picked from commit b09b5a9)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
5c4b6ba8b0
commit
2b2b937263
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.intentions
|
||||
import com.intellij.codeInsight.intention.LowPriorityAction
|
||||
import com.intellij.codeInsight.template.*
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.PsiDocumentManager
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
@@ -32,7 +33,9 @@ import org.jetbrains.kotlin.idea.util.approximateWithResolvableType
|
||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
||||
import org.jetbrains.kotlin.idea.util.isResolvableInScope
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.types.*
|
||||
@@ -40,23 +43,29 @@ import org.jetbrains.kotlin.utils.SmartSet
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.singletonList
|
||||
import org.jetbrains.kotlin.utils.ifEmpty
|
||||
|
||||
class SpecifyTypeExplicitlyIntention : SelfTargetingIntention<KtCallableDeclaration>(KtCallableDeclaration::class.java, "Specify type explicitly"), LowPriorityAction {
|
||||
override fun isApplicableTo(element: KtCallableDeclaration, caretOffset: Int): Boolean {
|
||||
if (element.containingFile is KtCodeFragment) return false
|
||||
if (element is KtFunctionLiteral) return false // TODO: should JetFunctionLiteral be JetCallableDeclaration at all?
|
||||
if (element is KtConstructor<*>) return false
|
||||
if (element.typeReference != null) return false
|
||||
class SpecifyTypeExplicitlyIntention :
|
||||
SelfTargetingRangeIntention<KtCallableDeclaration>(KtCallableDeclaration::class.java, "Specify type explicitly"),
|
||||
LowPriorityAction {
|
||||
|
||||
if (getTypeForDeclaration(element).isError) return false
|
||||
override fun applicabilityRange(element: KtCallableDeclaration): TextRange? {
|
||||
if (element.containingFile is KtCodeFragment) return null
|
||||
if (element is KtFunctionLiteral) return null // TODO: should KtFunctionLiteral be KtCallableDeclaration at all?
|
||||
if (element is KtConstructor<*>) return null
|
||||
if (element.typeReference != null) return null
|
||||
|
||||
val initializer = (element as? KtWithExpressionInitializer)?.initializer
|
||||
if (initializer != null && initializer.textRange.containsOffset(caretOffset)) return false
|
||||
if (getTypeForDeclaration(element).isError) return null
|
||||
|
||||
if (element is KtNamedFunction && element.hasBlockBody()) return false
|
||||
if (element is KtNamedFunction && element.hasBlockBody()) return null
|
||||
|
||||
text = if (element is KtFunction) "Specify return type explicitly" else "Specify type explicitly"
|
||||
|
||||
return true
|
||||
val initializer = (element as? KtWithExpressionInitializer)?.initializer
|
||||
return if (initializer != null) {
|
||||
TextRange(element.startOffset, initializer.startOffset - 1)
|
||||
}
|
||||
else {
|
||||
TextRange(element.startOffset, element.endOffset)
|
||||
}
|
||||
}
|
||||
|
||||
override fun applyTo(element: KtCallableDeclaration, editor: Editor?) {
|
||||
|
||||
Reference in New Issue
Block a user