Added AUTOCAST mark when expression is used as for-loop iterable.
This commit is contained in:
+16
-3
@@ -45,6 +45,7 @@ import org.jetbrains.jet.lang.types.*;
|
|||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
|
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
|
||||||
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||||
|
import org.jetbrains.jet.util.slicedmap.WritableSlice;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -265,10 +266,22 @@ public class ExpressionTypingUtils {
|
|||||||
@NotNull ExpressionTypingContext context,
|
@NotNull ExpressionTypingContext context,
|
||||||
@NotNull Name name
|
@NotNull Name name
|
||||||
) {
|
) {
|
||||||
JetReferenceExpression fake = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fake");
|
final JetReferenceExpression fake = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fake");
|
||||||
BindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace);
|
TemporaryBindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace);
|
||||||
Call call = CallMaker.makeCall(fake, receiver, null, fake, Collections.<ValueArgument>emptyList());
|
Call call = CallMaker.makeCall(fake, receiver, null, fake, Collections.<ValueArgument>emptyList());
|
||||||
return Pair.create(call, context.replaceBindingTrace(fakeTrace).resolveCallWithGivenName(call, fake, name));
|
OverloadResolutionResults<FunctionDescriptor> results =
|
||||||
|
context.replaceBindingTrace(fakeTrace).resolveCallWithGivenName(call, fake, name);
|
||||||
|
if (results.isSuccess()) {
|
||||||
|
fakeTrace.commit(new TraceEntryFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(@NotNull WritableSlice<?, ?> slice, Object key) {
|
||||||
|
// excluding all entries related to fake expression
|
||||||
|
// keys in RESOLUTION_RESULTS_FOR_FUNCTION slice have fake expression inside
|
||||||
|
return key != fake && slice != RESOLUTION_RESULTS_FOR_FUNCTION;
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
|
return Pair.create(call, results);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void defineLocalVariablesFromMultiDeclaration(
|
public static void defineLocalVariablesFromMultiDeclaration(
|
||||||
|
|||||||
@@ -233,3 +233,10 @@ fun foo(var a: Any): Int {
|
|||||||
}
|
}
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun inForLoop(x: Any?) {
|
||||||
|
if (x is Array<String>) {
|
||||||
|
for (i in <info descr="Automatically cast to jet.Array<jet.String>">x</info>) {}
|
||||||
|
}
|
||||||
|
for (i in <error descr="[ITERATOR_MISSING] For-loop range must have an iterator() method">x</error>) {}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user