Create Function From Usage: Use Any if error type is inferred
This commit is contained in:
+4
@@ -10,6 +10,9 @@ import org.jetbrains.jet.plugin.refactoring.JetNameSuggester
|
|||||||
import org.jetbrains.jet.plugin.refactoring.EmptyValidator
|
import org.jetbrains.jet.plugin.refactoring.EmptyValidator
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext
|
import org.jetbrains.jet.lang.resolve.BindingContext
|
||||||
import org.jetbrains.jet.plugin.util.supertypes
|
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.
|
* 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>
|
abstract fun getPossibleTypes(builder: CallableBuilder): List<JetType>
|
||||||
|
|
||||||
protected fun JetType.getPossibleSupertypes(variance: Variance): 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)
|
val single = Collections.singletonList(this)
|
||||||
return when (variance) {
|
return when (variance) {
|
||||||
Variance.IN_VARIANCE -> single + supertypes()
|
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.
|
||||||
|
}
|
||||||
+13
@@ -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() }
|
||||||
|
}
|
||||||
+10
@@ -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);
|
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")
|
@TestMetadata("beforeInconsistentTypes.kt")
|
||||||
public void testInconsistentTypes() throws Exception {
|
public void testInconsistentTypes() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeInconsistentTypes.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforeInconsistentTypes.kt");
|
||||||
@@ -868,6 +874,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("idea/testData/quickfix/createFromUsage/createFunction/component")
|
||||||
|
|||||||
Reference in New Issue
Block a user