Added AUTOCAST mark when expression is used as for-loop iterable.

This commit is contained in:
Evgeny Gerashchenko
2012-09-11 16:09:14 +04:00
parent 6ea3d8e300
commit 2f89352d80
2 changed files with 23 additions and 3 deletions
@@ -45,6 +45,7 @@ import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import org.jetbrains.jet.util.slicedmap.WritableSlice;
import java.util.ArrayList;
import java.util.Collection;
@@ -265,10 +266,22 @@ public class ExpressionTypingUtils {
@NotNull ExpressionTypingContext context,
@NotNull Name name
) {
JetReferenceExpression fake = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fake");
BindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace);
final JetReferenceExpression fake = JetPsiFactory.createSimpleName(context.expressionTypingServices.getProject(), "fake");
TemporaryBindingTrace fakeTrace = TemporaryBindingTrace.create(context.trace);
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(
@@ -233,3 +233,10 @@ fun foo(var a: Any): Int {
}
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>) {}
}