Don't run analysis in SpecifyTypeExplicitlyIntention.isAvailable()

If type is invalid, show error hint when action is invoked
This commit is contained in:
Dmitry Jemerov
2018-03-29 16:12:44 +02:00
parent 6d9457853e
commit a495c2e5ea
9 changed files with 50 additions and 16 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.idea.intentions
import com.intellij.codeInsight.hint.HintManager
import com.intellij.codeInsight.intention.LowPriorityAction
import com.intellij.codeInsight.template.*
import com.intellij.openapi.application.ApplicationManager
@@ -53,8 +54,6 @@ class SpecifyTypeExplicitlyIntention :
if (element is KtConstructor<*>) return null
if (element.typeReference != null) return null
if (getTypeForDeclaration(element).isError) return null
if (element is KtNamedFunction && element.hasBlockBody()) return null
text = if (element is KtFunction) "Specify return type explicitly" else "Specify type explicitly"
@@ -70,6 +69,13 @@ class SpecifyTypeExplicitlyIntention :
override fun applyTo(element: KtCallableDeclaration, editor: Editor?) {
val type = getTypeForDeclaration(element)
if (type.isError) {
if (editor != null) {
HintManager.getInstance().showErrorHint(editor, "Cannot infer type for this declaration")
}
return
}
addTypeAnnotation(editor, element, type)
}
@@ -1,5 +0,0 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
// ERROR: Unresolved reference: BadType
val <caret>x = BadType()
+2 -1
View File
@@ -1,4 +1,5 @@
// "Specify type explicitly" "false"
// "Specify type explicitly" "true"
// SHOULD_BE_AVAILABLE_AFTER_EXECUTION
// ACTION: Add getter
// ACTION: Convert property to function
// ACTION: Introduce backing property
@@ -0,0 +1,12 @@
// "Specify type explicitly" "true"
// SHOULD_BE_AVAILABLE_AFTER_EXECUTION
// ACTION: Add getter
// ACTION: Convert property to function
// ACTION: Introduce backing property
// ACTION: Move to companion object
// ACTION: Move to constructor
// ERROR: Unresolved reference: foo
class A() {
public val <caret>t = foo()
}
@@ -1,4 +1,5 @@
// "Specify type explicitly" "false"
// "Specify type explicitly" "true"
// SHOULD_BE_AVAILABLE_AFTER_EXECUTION
// ERROR: This property must either have a type annotation, be initialized or be delegated
// ACTION: Convert member to extension
// ACTION: Convert property to function
@@ -0,0 +1,13 @@
// "Specify type explicitly" "true"
// SHOULD_BE_AVAILABLE_AFTER_EXECUTION
// ERROR: This property must either have a type annotation, be initialized or be delegated
// ACTION: Convert member to extension
// ACTION: Convert property to function
// ACTION: Move to companion object
class My {
val <caret>x
get() {
return 3.14
}
}
@@ -1,4 +1,5 @@
// "Specify type explicitly" "false"
// "Specify type explicitly" "true"
// SHOULD_BE_AVAILABLE_AFTER_EXECUTION
// ERROR: Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly
// ACTION: Convert member to extension
// ACTION: Convert property to function
@@ -0,0 +1,11 @@
// "Specify type explicitly" "true"
// SHOULD_BE_AVAILABLE_AFTER_EXECUTION
// ERROR: Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly
// ACTION: Convert member to extension
// ACTION: Convert property to function
// ACTION: Move to companion object
class A {
val a<caret>
get() = a
}
@@ -15740,12 +15740,6 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/specifyTypeExplicitly/unitType.kt");
doTest(fileName);
}
@TestMetadata("unknownType.kt")
public void testUnknownType() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/specifyTypeExplicitly/unknownType.kt");
doTest(fileName);
}
}
@TestMetadata("idea/testData/intentions/specifyTypeExplicitlyInDestructuringAssignment")