diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.kt
index 295297bcd42..2ab6943670f 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.kt
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContextUtils.kt
@@ -32,7 +32,10 @@ import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
/**
* For expressions like a(), a[i], a.b.c(), +a, a + b, (a()), a(): Int, @label a()
- * returns a corresponding call
+ * returns a corresponding call.
+ *
+ * Note: special construction like a!!, a ?: b, if (c) a else b are resolved as calls,
+ * so there is a corresponding call for them.
*/
fun JetExpression.getCorrespondingCall(bindingContext: BindingContext): Call? {
val expr = JetPsiUtil.deparenthesize(this)
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java
index 06b1d782b9d..9b836f765d3 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java
@@ -713,7 +713,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
JetSimpleNameExpression operationSign = expression.getOperationReference();
assert operationSign.getReferencedNameElementType() == JetTokens.EXCLEXCL;
- Call call = createCallForSpecialConstruction(expression, Collections.singletonList(baseExpression));
+ Call call = createCallForSpecialConstruction(expression, expression.getOperationReference(), Collections.singletonList(baseExpression));
components.controlStructureTypingUtils.resolveSpecialConstructionAsCall(
call, "ExclExcl", Collections.singletonList("baseExpr"), Collections.singletonList(true), context, null);
JetTypeInfo baseTypeInfo = BindingContextUtils.getRecordedTypeInfo(baseExpression, context.trace.getBindingContext());
@@ -982,7 +982,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
return JetTypeInfo.create(null, context.dataFlowInfo);
}
- Call call = createCallForSpecialConstruction(expression, Lists.newArrayList(left, right));
+ Call call = createCallForSpecialConstruction(expression, expression.getOperationReference(), Lists.newArrayList(left, right));
ResolvedCall resolvedCall = components.controlStructureTypingUtils.resolveSpecialConstructionAsCall(
call, "Elvis", Lists.newArrayList("left", "right"), Lists.newArrayList(true, false), contextWithExpectedType, null);
JetTypeInfo leftTypeInfo = BindingContextUtils.getRecordedTypeInfo(left, context.trace.getBindingContext());
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java
index 7e1cdaaa6ab..9904fa84267 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingUtils.java
@@ -158,6 +158,7 @@ public class ControlStructureTypingUtils {
/*package*/ static Call createCallForSpecialConstruction(
@NotNull final JetExpression expression,
+ @NotNull final JetExpression calleeExpression,
@NotNull List extends JetExpression> arguments
) {
final List valueArguments = Lists.newArrayList();
@@ -186,7 +187,7 @@ public class ControlStructureTypingUtils {
@Nullable
@Override
public JetExpression getCalleeExpression() {
- return expression;
+ return calleeExpression;
}
@Nullable
@@ -345,8 +346,7 @@ public class ControlStructureTypingUtils {
if (status.hasErrorInConstrainingTypes()) {
return;
}
- JetExpression expression = call.getCalleeExpression();
- if (expression == null) return;
+ JetExpression expression = (JetExpression) call.getCallElement();
if (status.hasOnlyErrorsFromPosition(ConstraintPosition.EXPECTED_TYPE_POSITION) || status.hasConflictingConstraints()) {
expression.accept(checkTypeVisitor, new CheckTypeContext(trace, data.expectedType));
return;
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java
index 13a47130d3a..c8b74780ff3 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java
@@ -115,7 +115,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
}
JetBlockExpression thenBlock = JetPsiFactory.wrapInABlock(thenBranch);
JetBlockExpression elseBlock = JetPsiFactory.wrapInABlock(elseBranch);
- Call callForIf = createCallForSpecialConstruction(ifExpression, Lists.newArrayList(thenBlock, elseBlock));
+ Call callForIf = createCallForSpecialConstruction(ifExpression, ifExpression, Lists.newArrayList(thenBlock, elseBlock));
MutableDataFlowInfoForArguments dataFlowInfoForArguments =
createDataFlowInfoForArgumentsForIfCall(callForIf, thenInfo, elseInfo);
ResolvedCall resolvedCall = components.controlStructureTypingUtils.resolveSpecialConstructionAsCall(