From 9b0a9b71a21571633bb43dd336d9b1be9919313f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 15 Apr 2011 21:40:07 +0400 Subject: [PATCH] isStatement() fixed for returned expressions --- .../jet/lang/resolve/BindingTraceContext.java | 5 +++++ .../org/jetbrains/jet/lang/types/BindingTrace.java | 4 ++++ .../jetbrains/jet/lang/types/JetTypeInferrer.java | 14 ++++++++++---- idea/testData/checker/ForRangeConventions.jet | 5 +++++ .../jetbrains/jet/JetLightProjectDescriptor.java | 3 +-- idea/tests/org/jetbrains/jet/JetTestCaseBase.java | 11 +++++++++++ .../org/jetbrains/jet/resolve/JetResolveTest.java | 8 ++------ 7 files changed, 38 insertions(+), 12 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java index 4d95ed0c75f..482619560a2 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 27ca59bd570..f11f5665945 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 4e69be720ba..c87768badf1 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 86e66214c61..bb457ca1ba3 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 67c0f448e76..09ba2a6de52 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 b20b50961d5..192180c5a8a 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 12624cb81a5..1da699289e8 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() { -- GitLab