todo test improved analysis of unary expressions
added explicit 'isUnaryExpressionDependentOnExpectedType' check
This commit is contained in:
@@ -400,6 +400,11 @@ public class CandidateResolver {
|
|||||||
return visitInnerExpression(expression.getExpression());
|
return visitInnerExpression(expression.getExpression());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JetExpression visitUnaryExpression(@NotNull JetUnaryExpression expression, Void data) {
|
||||||
|
return ExpressionTypingUtils.isUnaryExpressionDependentOnExpectedType(expression) ? expression : null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JetExpression visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) {
|
public JetExpression visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) {
|
||||||
return visitInnerExpression(JetPsiUtil.getBaseExpressionIfLabeledExpression(expression));
|
return visitInnerExpression(JetPsiUtil.getBaseExpressionIfLabeledExpression(expression));
|
||||||
|
|||||||
+8
-5
@@ -604,7 +604,11 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
return visitUnaryExpression(expression, context, false);
|
return visitUnaryExpression(expression, context, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JetTypeInfo visitUnaryExpression(JetUnaryExpression expression, ExpressionTypingContext context, boolean isStatement) {
|
public JetTypeInfo visitUnaryExpression(JetUnaryExpression expression, ExpressionTypingContext contextWithExpectedType, boolean isStatement) {
|
||||||
|
ExpressionTypingContext context = isUnaryExpressionDependentOnExpectedType(expression)
|
||||||
|
? contextWithExpectedType
|
||||||
|
: contextWithExpectedType.replaceContextDependency(INDEPENDENT).replaceExpectedType(NO_EXPECTED_TYPE);
|
||||||
|
|
||||||
JetExpression baseExpression = expression.getBaseExpression();
|
JetExpression baseExpression = expression.getBaseExpression();
|
||||||
if (baseExpression == null) return JetTypeInfo.create(null, context.dataFlowInfo);
|
if (baseExpression == null) return JetTypeInfo.create(null, context.dataFlowInfo);
|
||||||
|
|
||||||
@@ -622,8 +626,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Type check the base expression
|
// Type check the base expression
|
||||||
JetTypeInfo typeInfo = facade.getTypeInfo(
|
JetTypeInfo typeInfo = facade.getTypeInfo(baseExpression, context);
|
||||||
baseExpression, context.replaceExpectedType(NO_EXPECTED_TYPE).replaceContextDependency(INDEPENDENT));
|
|
||||||
JetType type = typeInfo.getType();
|
JetType type = typeInfo.getType();
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
return typeInfo;
|
return typeInfo;
|
||||||
@@ -642,7 +645,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
JetExpression stubExpression = ExpressionTypingUtils.createFakeExpressionOfType(baseExpression.getProject(), context.trace, "$e", type);
|
JetExpression stubExpression = ExpressionTypingUtils.createFakeExpressionOfType(baseExpression.getProject(), context.trace, "$e", type);
|
||||||
resolveArrayAccessSetMethod((JetArrayAccessExpression) baseExpression,
|
resolveArrayAccessSetMethod((JetArrayAccessExpression) baseExpression,
|
||||||
stubExpression,
|
stubExpression,
|
||||||
context.replaceExpectedType(NO_EXPECTED_TYPE).replaceBindingTrace(
|
context.replaceBindingTrace(
|
||||||
TemporaryBindingTrace.create(context.trace, "trace to resolve array access set method for unary expression", expression)),
|
TemporaryBindingTrace.create(context.trace, "trace to resolve array access set method for unary expression", expression)),
|
||||||
context.trace);
|
context.trace);
|
||||||
}
|
}
|
||||||
@@ -685,7 +688,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
else {
|
else {
|
||||||
result = returnType;
|
result = returnType;
|
||||||
}
|
}
|
||||||
return DataFlowUtils.checkType(result, expression, context, dataFlowInfo);
|
return DataFlowUtils.checkType(result, expression, contextWithExpectedType, dataFlowInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JetTypeInfo visitExclExclExpression(@NotNull JetUnaryExpression expression, @NotNull ExpressionTypingContext context) {
|
private JetTypeInfo visitExclExclExpression(@NotNull JetUnaryExpression expression, @NotNull ExpressionTypingContext context) {
|
||||||
|
|||||||
+5
@@ -493,4 +493,9 @@ public class ExpressionTypingUtils {
|
|||||||
return (operationType == JetTokens.IDENTIFIER || OperatorConventions.BINARY_OPERATION_NAMES.containsKey(operationType)
|
return (operationType == JetTokens.IDENTIFIER || OperatorConventions.BINARY_OPERATION_NAMES.containsKey(operationType)
|
||||||
|| operationType == JetTokens.ELVIS);
|
|| operationType == JetTokens.ELVIS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isUnaryExpressionDependentOnExpectedType(@NotNull JetUnaryExpression expression) {
|
||||||
|
IElementType operationType = expression.getOperationReference().getReferencedNameElementType();
|
||||||
|
return JetTokens.LABELS.contains(operationType) || operationType == JetTokens.EXCLEXCL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user