KT-2841 Can't infer a type for function literal parameter if the return type is error
#KT-2841 fixed
This commit is contained in:
@@ -378,9 +378,7 @@ public class CallResolver {
|
|||||||
|
|
||||||
|
|
||||||
if (!constraintSystem.isSuccessful()) {
|
if (!constraintSystem.isSuccessful()) {
|
||||||
if (constraintSystemWithoutExpectedTypeConstraint.isSuccessful()) {
|
resolvedCall.setResultingSubstitutor(constraintSystemWithoutExpectedTypeConstraint.getResultingSubstitutor());
|
||||||
resolvedCall.setResultingSubstitutor(constraintSystemWithoutExpectedTypeConstraint.getResultingSubstitutor());
|
|
||||||
}
|
|
||||||
List<JetType> argumentTypes = checkValueArgumentTypes(context, resolvedCall, resolvedCall.getTrace()).argumentTypes;
|
List<JetType> argumentTypes = checkValueArgumentTypes(context, resolvedCall, resolvedCall.getTrace()).argumentTypes;
|
||||||
JetType receiverType = resolvedCall.getReceiverArgument().exists() ? resolvedCall.getReceiverArgument().getType() : null;
|
JetType receiverType = resolvedCall.getReceiverArgument().exists() ? resolvedCall.getReceiverArgument().getType() : null;
|
||||||
context.tracing.typeInferenceFailed(resolvedCall.getTrace(),
|
context.tracing.typeInferenceFailed(resolvedCall.getTrace(),
|
||||||
|
|||||||
+10
-5
@@ -40,6 +40,7 @@ import static org.jetbrains.jet.lang.types.Variance.*;
|
|||||||
public class ConstraintSystemImpl implements ConstraintSystem {
|
public class ConstraintSystemImpl implements ConstraintSystem {
|
||||||
|
|
||||||
public static final JetType DONT_CARE = ErrorUtils.createErrorTypeWithCustomDebugName("DONT_CARE");
|
public static final JetType DONT_CARE = ErrorUtils.createErrorTypeWithCustomDebugName("DONT_CARE");
|
||||||
|
private static final JetType CANT_INFER = ErrorUtils.createErrorType("CANT_INFER");
|
||||||
|
|
||||||
private final Map<TypeParameterDescriptor, TypeConstraintsImpl> typeParameterConstraints = Maps.newLinkedHashMap();
|
private final Map<TypeParameterDescriptor, TypeConstraintsImpl> typeParameterConstraints = Maps.newLinkedHashMap();
|
||||||
private final Set<ConstraintPosition> errorConstraintPositions = Sets.newHashSet();
|
private final Set<ConstraintPosition> errorConstraintPositions = Sets.newHashSet();
|
||||||
@@ -48,7 +49,7 @@ public class ConstraintSystemImpl implements ConstraintSystem {
|
|||||||
private boolean hasErrorInConstrainingTypes;
|
private boolean hasErrorInConstrainingTypes;
|
||||||
|
|
||||||
public ConstraintSystemImpl() {
|
public ConstraintSystemImpl() {
|
||||||
this.resultingSubstitutor = createTypeSubstitutorWithDefaultForUnknownTypeParameter(null);
|
this.resultingSubstitutor = createTypeSubstitutorWithDefaultForUnknownTypeParameter(new TypeProjection(CANT_INFER));
|
||||||
this.currentSubstitutor = createTypeSubstitutorWithDefaultForUnknownTypeParameter(new TypeProjection(DONT_CARE));
|
this.currentSubstitutor = createTypeSubstitutorWithDefaultForUnknownTypeParameter(new TypeProjection(DONT_CARE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,16 +155,20 @@ public class ConstraintSystemImpl implements ConstraintSystem {
|
|||||||
@Nullable JetType constrainingType,
|
@Nullable JetType constrainingType,
|
||||||
@NotNull ConstraintPosition constraintPosition) {
|
@NotNull ConstraintPosition constraintPosition) {
|
||||||
|
|
||||||
if (constrainingType == null || (ErrorUtils.isErrorType(constrainingType) && constrainingType != DONT_CARE)) {
|
if (constrainingType == TypeUtils.NO_EXPECTED_TYPE
|
||||||
|
|| TypeUtils.identityEqualsOrContainsAsArgument(constrainingType, DONT_CARE)
|
||||||
|
|| TypeUtils.identityEqualsOrContainsAsArgument(constrainingType, CANT_INFER)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (constrainingType == null || ErrorUtils.containsErrorType(constrainingType)) {
|
||||||
hasErrorInConstrainingTypes = true;
|
hasErrorInConstrainingTypes = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert subjectType != TypeUtils.NO_EXPECTED_TYPE : "Subject type shouldn't be NO_EXPECTED_TYPE (in position " + constraintPosition + " )";
|
assert subjectType != TypeUtils.NO_EXPECTED_TYPE : "Subject type shouldn't be NO_EXPECTED_TYPE (in position " + constraintPosition + " )";
|
||||||
|
if (ErrorUtils.isErrorType(subjectType)) return;
|
||||||
|
|
||||||
if (constrainingType == DONT_CARE || ErrorUtils.isErrorType(subjectType) || constrainingType == TypeUtils.NO_EXPECTED_TYPE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeclarationDescriptor constrainingTypeDescriptor = constrainingType.getConstructor().getDeclarationDescriptor();
|
DeclarationDescriptor constrainingTypeDescriptor = constrainingType.getConstructor().getDeclarationDescriptor();
|
||||||
DeclarationDescriptor subjectTypeDescriptor = subjectType.getConstructor().getDeclarationDescriptor();
|
DeclarationDescriptor subjectTypeDescriptor = subjectType.getConstructor().getDeclarationDescriptor();
|
||||||
|
|||||||
@@ -472,4 +472,14 @@ public class TypeUtils {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean identityEqualsOrContainsAsArgument(@Nullable JetType type, @NotNull JetType argumentType) {
|
||||||
|
if (type == null) return false;
|
||||||
|
if (type == argumentType) return true;
|
||||||
|
if (type instanceof NamespaceType) return false;
|
||||||
|
for (TypeProjection projection : type.getArguments()) {
|
||||||
|
if (identityEqualsOrContainsAsArgument(projection.getType(), argumentType)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package a
|
||||||
|
|
||||||
|
trait Closeable {}
|
||||||
|
class C : Closeable {}
|
||||||
|
|
||||||
|
public inline fun <T: Closeable, R> T.use1(block: (T)-> R) : R {
|
||||||
|
return block(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
C().<!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>use1<!> {
|
||||||
|
w -> // ERROR here
|
||||||
|
<!UNRESOLVED_REFERENCE!>x<!>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package a
|
||||||
|
|
||||||
|
trait Closeable {
|
||||||
|
fun close() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class C : Closeable
|
||||||
|
|
||||||
|
public inline fun <T: Closeable, R> T.use(block: (t: T)-> R) : R {
|
||||||
|
return block(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
C().<!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>use<!> {
|
||||||
|
it.close()
|
||||||
|
<!UNRESOLVED_REFERENCE!>x<!>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package a
|
||||||
|
|
||||||
|
trait Closeable {
|
||||||
|
fun close() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class C : Closeable
|
||||||
|
|
||||||
|
public inline fun <T: Closeable, R> use(t: T, block: T.(T)-> R) : R {
|
||||||
|
return t.block(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
<!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>use<!>(C()) {
|
||||||
|
this.close()
|
||||||
|
it.close()
|
||||||
|
<!UNRESOLVED_REFERENCE!>xx<!>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package a
|
||||||
|
|
||||||
|
trait Closeable {
|
||||||
|
fun close() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class C : Closeable
|
||||||
|
|
||||||
|
public inline fun <T: Closeable, R> T.use(block: T.()-> R) : R {
|
||||||
|
return this.block()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
C().<!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>use<!> {
|
||||||
|
this.close()
|
||||||
|
<!UNRESOLVED_REFERENCE!>x<!>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,16 +13,18 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.jet.checkers;
|
package org.jetbrains.jet.checkers;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
import junit.framework.Test;
|
import junit.framework.Test;
|
||||||
import junit.framework.TestSuite;
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import org.jetbrains.jet.JetTestUtils;
|
import org.jetbrains.jet.JetTestUtils;
|
||||||
import org.jetbrains.jet.test.InnerTestClasses;
|
import org.jetbrains.jet.test.InnerTestClasses;
|
||||||
import org.jetbrains.jet.test.TestMetadata;
|
import org.jetbrains.jet.test.TestMetadata;
|
||||||
|
|
||||||
import java.io.File;
|
import org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve;
|
||||||
|
|
||||||
/** This class is generated by {@link org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve}. DO NOT MODIFY MANUALLY */
|
/** This class is generated by {@link org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve}. DO NOT MODIFY MANUALLY */
|
||||||
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class})
|
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class})
|
||||||
@@ -1889,6 +1891,26 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
|||||||
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2514.kt");
|
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2514.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt2841.kt")
|
||||||
|
public void testKt2841() throws Exception {
|
||||||
|
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2841.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt2841_it.kt")
|
||||||
|
public void testKt2841_it() throws Exception {
|
||||||
|
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2841_it.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt2841_it_this.kt")
|
||||||
|
public void testKt2841_it_this() throws Exception {
|
||||||
|
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2841_it_this.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt2841_this.kt")
|
||||||
|
public void testKt2841_this() throws Exception {
|
||||||
|
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2841_this.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt2842.kt")
|
@TestMetadata("kt2842.kt")
|
||||||
public void testKt2842() throws Exception {
|
public void testKt2842() throws Exception {
|
||||||
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2842.kt");
|
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt2842.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user