Create Function From Usage: Use Any if error type is inferred

This commit is contained in:
Alexey Sedunov
2014-09-30 13:53:11 +04:00
parent 854962a139
commit e9b16f3e1b
6 changed files with 57 additions and 0 deletions
@@ -10,6 +10,9 @@ import org.jetbrains.jet.plugin.refactoring.JetNameSuggester
import org.jetbrains.jet.plugin.refactoring.EmptyValidator
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.plugin.util.supertypes
import org.jetbrains.jet.lang.types.TypeUtils
import org.jetbrains.jet.lang.types.ErrorUtils
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
/**
* Represents a concrete type or a set of types yet to be inferred from an expression.
@@ -42,6 +45,7 @@ abstract class TypeInfo(val variance: Variance) {
abstract fun getPossibleTypes(builder: CallableBuilder): List<JetType>
protected fun JetType.getPossibleSupertypes(variance: Variance): List<JetType> {
if (ErrorUtils.containsErrorType(this)) return Collections.singletonList(KotlinBuiltIns.getInstance().getAnyType())
val single = Collections.singletonList(this)
return when (variance) {
Variance.IN_VARIANCE -> single + supertypes()
@@ -0,0 +1,11 @@
// "Create function 'foo' from usage" "true"
fun run<T>(f: () -> T) = f()
fun test() {
run { foo() }
}
fun foo(): Any {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
@@ -0,0 +1,13 @@
// "Create function 'foo' from usage" "true"
// ERROR: Unresolved reference: B
class A: B {
fun foo(): Any {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
fun test() {
A().foo()
}
@@ -0,0 +1,7 @@
// "Create function 'foo' from usage" "true"
fun run<T>(f: () -> T) = f()
fun test() {
run { <caret>foo() }
}
@@ -0,0 +1,10 @@
// "Create function 'foo' from usage" "true"
// ERROR: Unresolved reference: B
class A: B {
}
fun test() {
A().<caret>foo()
}
@@ -802,6 +802,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName);
}
@TestMetadata("beforeInLambda.kt")
public void testInLambda() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeInLambda.kt");
doTest(fileName);
}
@TestMetadata("beforeInconsistentTypes.kt")
public void testInconsistentTypes() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeInconsistentTypes.kt");
@@ -868,6 +874,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName);
}
@TestMetadata("beforeUnresolvedSupertype.kt")
public void testUnresolvedSupertype() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeUnresolvedSupertype.kt");
doTest(fileName);
}
}
@TestMetadata("idea/testData/quickfix/createFromUsage/createFunction/component")