complete resolve for array access expression
This commit is contained in:
@@ -344,7 +344,7 @@ public class CandidateResolver {
|
|||||||
|
|
||||||
JetExpression keyExpression = getDeferredComputationKeyExpression(expression);
|
JetExpression keyExpression = getDeferredComputationKeyExpression(expression);
|
||||||
CallCandidateResolutionContext<FunctionDescriptor> storedContextForArgument =
|
CallCandidateResolutionContext<FunctionDescriptor> storedContextForArgument =
|
||||||
context.resolutionResultsCache.getDeferredComputation(CallKey.create(Call.CallType.DEFAULT, keyExpression));
|
context.resolutionResultsCache.getDeferredComputation(keyExpression);
|
||||||
|
|
||||||
if (storedContextForArgument == null) {
|
if (storedContextForArgument == null) {
|
||||||
PsiElement parent = expression.getParent();
|
PsiElement parent = expression.getParent();
|
||||||
|
|||||||
+13
-2
@@ -16,12 +16,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.resolve.calls.context;
|
package org.jetbrains.jet.lang.resolve.calls.context;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.CallKey;
|
import org.jetbrains.jet.lang.psi.CallKey;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
||||||
import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
|
import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace;
|
||||||
@@ -30,6 +32,8 @@ import org.jetbrains.jet.util.slicedmap.BasicWritableSlice;
|
|||||||
import org.jetbrains.jet.util.slicedmap.Slices;
|
import org.jetbrains.jet.util.slicedmap.Slices;
|
||||||
import org.jetbrains.jet.util.slicedmap.WritableSlice;
|
import org.jetbrains.jet.util.slicedmap.WritableSlice;
|
||||||
|
|
||||||
|
import static org.jetbrains.jet.lang.psi.Call.CallType;
|
||||||
|
|
||||||
public class ResolutionResultsCache {
|
public class ResolutionResultsCache {
|
||||||
|
|
||||||
public static class MemberType<D extends CallableDescriptor> {}
|
public static class MemberType<D extends CallableDescriptor> {}
|
||||||
@@ -81,8 +85,15 @@ public class ResolutionResultsCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public CallCandidateResolutionContext<FunctionDescriptor> getDeferredComputation(@NotNull CallKey callKey) {
|
public CallCandidateResolutionContext<FunctionDescriptor> getDeferredComputation(@NotNull JetExpression expression) {
|
||||||
return trace.get(DEFERRED_COMPUTATION_FOR_CALL, callKey);
|
for (CallType callType : Lists.newArrayList(CallType.DEFAULT, CallType.ARRAY_GET_METHOD, CallType.ARRAY_SET_METHOD)) {
|
||||||
|
CallKey callKey = CallKey.create(callType, expression);
|
||||||
|
CallCandidateResolutionContext<FunctionDescriptor> context = trace.get(DEFERRED_COMPUTATION_FOR_CALL, callKey);
|
||||||
|
if (context != null) {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+3
-3
@@ -1139,7 +1139,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JetTypeInfo visitArrayAccessExpression(JetArrayAccessExpression expression, ExpressionTypingContext context) {
|
public JetTypeInfo visitArrayAccessExpression(JetArrayAccessExpression expression, ExpressionTypingContext context) {
|
||||||
JetTypeInfo typeInfo = resolveArrayAccessGetMethod(expression, context.replaceExpectedType(NO_EXPECTED_TYPE));
|
JetTypeInfo typeInfo = resolveArrayAccessGetMethod(expression, context);
|
||||||
return DataFlowUtils.checkType(typeInfo.getType(), expression, context, typeInfo.getDataFlowInfo());
|
return DataFlowUtils.checkType(typeInfo.getType(), expression, context, typeInfo.getDataFlowInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1289,7 +1289,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
JetExpression arrayExpression = arrayAccessExpression.getArrayExpression();
|
JetExpression arrayExpression = arrayAccessExpression.getArrayExpression();
|
||||||
if (arrayExpression == null) return JetTypeInfo.create(null, oldContext.dataFlowInfo);
|
if (arrayExpression == null) return JetTypeInfo.create(null, oldContext.dataFlowInfo);
|
||||||
|
|
||||||
JetTypeInfo arrayTypeInfo = facade.getTypeInfo(arrayExpression, oldContext);
|
JetTypeInfo arrayTypeInfo = facade.getTypeInfo(arrayExpression, oldContext.replaceExpectedType(NO_EXPECTED_TYPE));
|
||||||
JetType arrayType = arrayTypeInfo.getType();
|
JetType arrayType = arrayTypeInfo.getType();
|
||||||
if (arrayType == null) return arrayTypeInfo;
|
if (arrayType == null) return arrayTypeInfo;
|
||||||
|
|
||||||
@@ -1315,7 +1315,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
dataFlowInfo = facade.getTypeInfo(rightHandSide, context.replaceDataFlowInfo(dataFlowInfo)).getDataFlowInfo();
|
dataFlowInfo = facade.getTypeInfo(rightHandSide, context.replaceDataFlowInfo(dataFlowInfo)).getDataFlowInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!functionResults.isSuccess()) {
|
if (!functionResults.isSingleResult()) {
|
||||||
traceForResolveResult.report(isGet ? NO_GET_METHOD.on(arrayAccessExpression) : NO_SET_METHOD.on(arrayAccessExpression));
|
traceForResolveResult.report(isGet ? NO_GET_METHOD.on(arrayAccessExpression) : NO_SET_METHOD.on(arrayAccessExpression));
|
||||||
return JetTypeInfo.create(null, dataFlowInfo);
|
return JetTypeInfo.create(null, dataFlowInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ fun foo() {
|
|||||||
val x: Int? = null
|
val x: Int? = null
|
||||||
val a = Array<Int>(3, {0})
|
val a = Array<Int>(3, {0})
|
||||||
|
|
||||||
if (x != null) bar(a[x]) else bar(a<!NO_GET_METHOD!>[<!TYPE_MISMATCH!>x<!>]<!>)
|
if (x != null) bar(a[x]) else bar(a[<!TYPE_MISMATCH!>x<!>])
|
||||||
bar(a[if (x == null) 0 else x])
|
bar(a[if (x == null) 0 else x])
|
||||||
bar(a<!NO_GET_METHOD!>[<!TYPE_MISMATCH!>x<!>]<!>)
|
bar(a[<!TYPE_MISMATCH!>x<!>])
|
||||||
|
|
||||||
"123"<!NO_GET_METHOD!>[<!TYPE_MISMATCH!>x<!>]<!>;
|
"123"[<!TYPE_MISMATCH!>x<!>];
|
||||||
if (x != null) "123"[x];
|
if (x != null) "123"[x];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package b
|
||||||
|
|
||||||
|
class A {
|
||||||
|
fun <T> get(i: Int): List<T> = throw Exception("$i")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(l: List<Int>) = l
|
||||||
|
|
||||||
|
fun test(a: A) {
|
||||||
|
bar(a[12])
|
||||||
|
}
|
||||||
@@ -2846,6 +2846,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/diagnostics/tests/inference/nestedCalls"), Pattern.compile("^(.+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/diagnostics/tests/inference/nestedCalls"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("arrayAccess.kt")
|
||||||
|
public void testArrayAccess() throws Exception {
|
||||||
|
doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/arrayAccess.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("checkTypesForQualifiedProperties.kt")
|
@TestMetadata("checkTypesForQualifiedProperties.kt")
|
||||||
public void testCheckTypesForQualifiedProperties() throws Exception {
|
public void testCheckTypesForQualifiedProperties() throws Exception {
|
||||||
doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/checkTypesForQualifiedProperties.kt");
|
doTest("compiler/testData/diagnostics/tests/inference/nestedCalls/checkTypesForQualifiedProperties.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user