diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java index 4d95ed0c75f7a959be8dbf39751d3b714dd6b037..482619560a233d73e8515918eef90d2807e89e31 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java @@ -80,6 +80,11 @@ public class BindingTraceContext extends BindingTrace implements BindingContext statements.add(statement); } + @Override + public void removeStatementRecord(@NotNull JetElement statement) { + statements.remove(statement); + } + public void setToplevelScope(JetScope toplevelScope) { this.toplevelScope = toplevelScope; } diff --git a/idea/src/org/jetbrains/jet/lang/types/BindingTrace.java b/idea/src/org/jetbrains/jet/lang/types/BindingTrace.java index 27ca59bd570d3e887ba2684e63747da1e44ab4a7..f11f5665945ec3d23cdfff3d7aa6990f315e3c04 100644 --- a/idea/src/org/jetbrains/jet/lang/types/BindingTrace.java +++ b/idea/src/org/jetbrains/jet/lang/types/BindingTrace.java @@ -42,6 +42,10 @@ public class BindingTrace { } + public void removeStatementRecord(@NotNull JetElement statement) { + + } + public void removeReferenceResolution(@NotNull JetReferenceExpression referenceExpression) { } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 4e69be720ba4ef84f1bf9db0d73441fc2899e1cb..c87768badf107a899cbfb66a50a20c40128e9ef9 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -270,7 +270,7 @@ public class JetTypeInferrer { @NotNull public JetType getFunctionReturnType(@NotNull JetScope outerScope, JetFunction function, FunctionDescriptor functionDescriptor) { - Map typeMap = getReturnedExpressions(outerScope, function, functionDescriptor); + Map typeMap = collectReturnedExpressions(outerScope, function, functionDescriptor); Collection types = typeMap.values(); return types.isEmpty() ? JetStandardClasses.getNothingType() : semanticServices.getTypeChecker().commonSupertype(types); } @@ -281,7 +281,7 @@ public class JetTypeInferrer { } public void checkFunctionReturnType(@NotNull JetScope outerScope, @NotNull JetFunction function, @NotNull FunctionDescriptor functionDescriptor) { - Map typeMap = getReturnedExpressions(outerScope, function, functionDescriptor); + Map typeMap = collectReturnedExpressions(outerScope, function, functionDescriptor); if (typeMap.isEmpty()) { return; // The function returns Nothing } @@ -315,7 +315,7 @@ public class JetTypeInferrer { } } - private Map getReturnedExpressions(JetScope outerScope, JetFunction function, FunctionDescriptor functionDescriptor) { + private Map collectReturnedExpressions(JetScope outerScope, JetFunction function, FunctionDescriptor functionDescriptor) { JetExpression bodyExpression = function.getBodyExpression(); assert bodyExpression != null; JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(outerScope, functionDescriptor, semanticServices); @@ -326,6 +326,7 @@ public class JetTypeInferrer { Map typeMap = new HashMap(); for (JetExpression returnedExpression : returnedExpressions) { JetType cachedType = getCachedType(returnedExpression); + trace.removeStatementRecord(returnedExpression); if (cachedType != null) { typeMap.put(returnedExpression, cachedType); } @@ -882,7 +883,7 @@ public class JetTypeInferrer { JetType iteratorType = iteratorResolutionResult.getFunctionDescriptor().getUnsubstitutedReturnType(); boolean hasNextFunctionSupported = checkHasNextFunctionSupport(reportErrorsOn, iteratorType); boolean hasNextPropertySupported = checkHasNextPropertySupport(reportErrorsOn, iteratorType); - if (hasNextFunctionSupported && hasNextPropertySupported) { + if (hasNextFunctionSupported && hasNextPropertySupported && !ErrorUtils.isErrorType(iteratorType)) { // TODO : overload resolution rules impose priorities here??? semanticServices.getErrorHandler().genericError(reportErrorsOn, "An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext()' property"); } @@ -1596,5 +1597,10 @@ public class JetTypeInferrer { public void recordStatement(@NotNull JetElement statement) { originalTrace.recordStatement(statement); } + + @Override + public void removeStatementRecord(@NotNull JetElement statement) { + originalTrace.removeStatementRecord(statement); + } } } diff --git a/idea/testData/checker/ForRangeConventions.jet b/idea/testData/checker/ForRangeConventions.jet index 86e66214c61d63c4acc0e60bfd09456f8a0ca923..bb457ca1ba3ae3e5f74af248abebafbbf14e89b8 100644 --- a/idea/testData/checker/ForRangeConventions.jet +++ b/idea/testData/checker/ForRangeConventions.jet @@ -1,3 +1,5 @@ +import java.util.*; + class NotRange1 { } @@ -73,4 +75,7 @@ fun test() { for (i in new NotRange7()); for (i in new Range0()); for (i in new Range1()); + + for (i in (new ArrayList() : List)); } + diff --git a/idea/tests/org/jetbrains/jet/JetLightProjectDescriptor.java b/idea/tests/org/jetbrains/jet/JetLightProjectDescriptor.java index 67c0f448e76842d013790a3f9b2f80562fc8ae6a..09ba2a6de522eb83ffb4e43e1fe508eb614617f2 100644 --- a/idea/tests/org/jetbrains/jet/JetLightProjectDescriptor.java +++ b/idea/tests/org/jetbrains/jet/JetLightProjectDescriptor.java @@ -2,7 +2,6 @@ package org.jetbrains.jet; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor; -import org.jetbrains.jet.resolve.JetResolveTest; /** * @author yole @@ -12,6 +11,6 @@ public class JetLightProjectDescriptor extends DefaultLightProjectDescriptor { @Override public Sdk getSdk() { - return JetResolveTest.jdkFromIdeaHome(); + return JetTestCaseBase.jdkFromIdeaHome(); } } diff --git a/idea/tests/org/jetbrains/jet/JetTestCaseBase.java b/idea/tests/org/jetbrains/jet/JetTestCaseBase.java index b20b50961d5b8bcffb45b2e179d8729d3a5cce01..192180c5a8af9ace3f40b2ff1aae996bbaa0beac 100644 --- a/idea/tests/org/jetbrains/jet/JetTestCaseBase.java +++ b/idea/tests/org/jetbrains/jet/JetTestCaseBase.java @@ -2,6 +2,8 @@ package org.jetbrains.jet; import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import junit.framework.Test; import junit.framework.TestSuite; import org.jetbrains.annotations.NotNull; @@ -26,6 +28,10 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { this.name = name; } + public static Sdk jdkFromIdeaHome() { + return new JavaSdkImpl().createJdk("JDK", "idea/testData/mockJDK-1.7/jre", true); + } + @Override protected String getTestDataPath() { return getTestDataPathBase(); @@ -39,6 +45,11 @@ public abstract class JetTestCaseBase extends LightDaemonAnalyzerTestCase { return new File(PathManager.getResourceRoot(JetTestCaseBase.class, "/org/jetbrains/jet/JetTestCaseBase.class")).getParentFile().getParentFile().getParent(); } + @Override + protected Sdk getProjectJDK() { + return jdkFromIdeaHome(); + } + @Override public String getName() { return "test" + name; diff --git a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java index 12624cb81a58953cc42fffbdbfea674f59946e20..1da699289e8009701734870d542bc96b4980f969 100644 --- a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java +++ b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java @@ -3,13 +3,13 @@ package org.jetbrains.jet.resolve; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetTestCaseBase; import org.jetbrains.jet.lang.resolve.OverloadResolutionResult; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.parsing.JetParsingTest; @@ -112,11 +112,7 @@ public class JetResolveTest extends ExtensibleResolveTestCase { @Override protected Sdk getProjectJDK() { - return jdkFromIdeaHome(); - } - - public static Sdk jdkFromIdeaHome() { - return new JavaSdkImpl().createJdk("JDK", "idea/testData/mockJDK-1.7/jre", true); + return JetTestCaseBase.jdkFromIdeaHome(); } private static String getHomeDirectory() {