Index: lib/unresolved.dart |
diff --git a/lib/unresolved.dart b/lib/unresolved.dart |
index f4842e3e239d42ce0f558b7ed6a8cfc421cb4a8c..48764e84a2ee3fa2e490b0622dff104f1f1767e3 100644 |
--- a/lib/unresolved.dart |
+++ b/lib/unresolved.dart |
@@ -54,6 +54,13 @@ abstract class RastaUnresolved { |
// TODO(ahe): Delete this method. |
ir.InvalidExpression handleUnresolved(Node node); |
+ /// Similar to [Kernel.functionToIr] but returns null if [function] is a |
+ /// synthetic function created for error recovery. |
+ ir.Member possiblyErroneousFunctionToIr(FunctionElement function) { |
+ return kernel.isSyntheticError(function) |
+ ? null : kernel.functionToIr(function); |
+ } |
+ |
/// Throws a [NoSuchMethodError] corresponding to a call to |
/// [receiver].[memberName] with the arguments [callArguments]. |
/// |
@@ -78,8 +85,14 @@ abstract class RastaUnresolved { |
ir.Expression named = new ir.MapLiteral(callArguments.named.map((e) { |
return new ir.MapEntry(new ir.SymbolLiteral(e.name), e.value); |
}).toList()); |
+ if (candidateTarget is FunctionElement) { |
+ // Ensure [candidateTarget] has been resolved. |
+ possiblyErroneousFunctionToIr(candidateTarget); |
+ } |
ir.Expression existingArguments; |
- if (candidateTarget is FunctionElement && !candidateTarget.isError) { |
+ if (candidateTarget is FunctionElement && |
+ !kernel.isSyntheticError(candidateTarget) && |
+ candidateTarget.hasFunctionSignature) { |
List<ir.Expression> existingArgumentsList = <ir.Expression>[]; |
candidateTarget.functionSignature.forEachParameter((param) { |
existingArgumentsList.add(new ir.StringLiteral(param.name)); |
@@ -242,7 +255,7 @@ abstract class RastaUnresolved { |
CallStructure callStructure, |
_) { |
// The body of the factory will throw an error. |
- return new ir.StaticInvocation(kernel.functionToIr(constructor), |
+ return new ir.StaticInvocation(possiblyErroneousFunctionToIr(constructor), |
buildArguments(arguments)); |
} |
@@ -322,7 +335,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new ClassStaticAccessor(this, getter.name, |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildPostfixIncrement( |
new ir.Name(operator.selectorName), |
voidContext: isVoidContext); |
@@ -335,7 +348,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new ClassStaticAccessor(this, getter.name, |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildPrefixIncrement( |
new ir.Name(operator.selectorName), |
voidContext: isVoidContext); |
@@ -348,7 +361,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new ClassStaticAccessor(this, getter.name, |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildNullAwareAssignment( |
visitForValue(rhs), voidContext: isVoidContext); |
} |
@@ -383,7 +396,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new SuperIndexAccessor(this, visitForValue(index), |
- kernel.functionToIr(element), null); |
+ possiblyErroneousFunctionToIr(element), null); |
return accessor.buildCompoundAssignment(new ir.Name(operator.selectorName), |
visitForValue(rhs)); |
} |
@@ -548,7 +561,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildCompoundAssignment( |
new ir.Name(operator.selectorName), |
visitForValue(rhs)); |
@@ -563,7 +576,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new SuperIndexAccessor(this, visitForValue(index), |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildCompoundAssignment( |
new ir.Name(operator.selectorName), |
visitForValue(rhs)); |
@@ -577,7 +590,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new SuperIndexAccessor(this, visitForValue(index), |
- kernel.functionToIr(indexFunction), null); |
+ possiblyErroneousFunctionToIr(indexFunction), null); |
return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName)); |
} |
@@ -589,7 +602,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new SuperIndexAccessor(this, visitForValue(index), |
- kernel.functionToIr(indexFunction), null); |
+ possiblyErroneousFunctionToIr(indexFunction), null); |
return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName)); |
} |
@@ -600,7 +613,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildPostfixIncrement(new ir.Name(operator.selectorName)); |
} |
@@ -611,7 +624,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildPrefixIncrement(new ir.Name(operator.selectorName)); |
} |
@@ -622,7 +635,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new SuperPropertyAccessor(this, '${node.selector}', |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildNullAwareAssignment(visitForValue(rhs)); |
} |
@@ -688,7 +701,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new TopLevelStaticAccessor(this, getter.name, |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildCompoundAssignment( |
new ir.Name(operator.selectorName), |
visitForValue(rhs), |
@@ -702,7 +715,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new TopLevelStaticAccessor(this, getter.name, |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildPostfixIncrement( |
new ir.Name(operator.selectorName), |
voidContext: isVoidContext); |
@@ -715,7 +728,7 @@ abstract class RastaUnresolved { |
IncDecOperator operator, |
_) { |
var accessor = new TopLevelStaticAccessor(this, getter.name, |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildPrefixIncrement( |
new ir.Name(operator.selectorName), |
voidContext: isVoidContext); |
@@ -728,7 +741,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new TopLevelStaticAccessor(this, getter.name, |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildNullAwareAssignment( |
visitForValue(rhs), |
voidContext: isVoidContext); |
@@ -742,7 +755,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new SuperIndexAccessor(this, visitForValue(index), |
- null, kernel.functionToIr(setter)); |
+ null, possiblyErroneousFunctionToIr(setter)); |
return accessor.buildNullAwareAssignment(visitForValue(rhs)); |
} |
@@ -754,7 +767,7 @@ abstract class RastaUnresolved { |
Node rhs, |
_) { |
var accessor = new SuperIndexAccessor(this, visitForValue(index), |
- kernel.functionToIr(getter), null); |
+ possiblyErroneousFunctionToIr(getter), null); |
return accessor.buildNullAwareAssignment(visitForValue(rhs)); |
} |