Index: pkg/compiler/lib/src/resolution/members.dart |
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart |
index c69433a8f32aec67bd15c30565e715de819db506..b05dd626b8591e07b7a7a4ed547209e34dfc206a 100644 |
--- a/pkg/compiler/lib/src/resolution/members.dart |
+++ b/pkg/compiler/lib/src/resolution/members.dart |
@@ -501,15 +501,6 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
} |
} |
- ResolutionResult visitAssert(Assert node) { |
- // TODO(sra): We could completely ignore the assert in production mode if we |
- // didn't need it to be resolved for type checking. |
- registry.registerAssert(node.hasMessage); |
- visit(node.condition); |
- visit(node.message); |
- return const NoneResult(); |
- } |
- |
ResolutionResult visitCascade(Cascade node) { |
visit(node.expression); |
return const NoneResult(); |
@@ -1537,6 +1528,34 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
return const NoneResult(); |
} |
+ /// Handle a, possibly invalid, assertion, like `assert(cond)` or `assert()`. |
+ ResolutionResult handleAssert(Send node) { |
+ assert(invariant(node, node.isCall, |
+ message: "Unexpected assert: $node")); |
+ // If this send is of the form "assert(expr);", then |
+ // this is an assertion. |
+ |
+ CallStructure callStructure = |
+ resolveArguments(node.argumentsNode).callStructure; |
+ SendStructure sendStructure = const AssertStructure(); |
+ if (callStructure.argumentCount != 1) { |
+ compiler.reportError( |
+ node.selector, |
+ MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT, |
+ {'argumentCount': callStructure.argumentCount}); |
+ sendStructure = const InvalidAssertStructure(); |
+ } else if (callStructure.namedArgumentCount != 0) { |
+ compiler.reportError( |
+ node.selector, |
+ MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS, |
+ {'argumentCount': callStructure.namedArgumentCount}); |
+ sendStructure = const InvalidAssertStructure(); |
+ } |
+ registry.registerAssert(node); |
+ registry.registerSendStructure(node, sendStructure); |
+ return const AssertResult(); |
+ } |
+ |
/// Handle access of a property of [name] on `this`, like `this.name` and |
/// `this.name()`, or `name` and `name()` in instance context. |
ResolutionResult handleThisPropertyAccess(Send node, Name name) { |
@@ -3014,7 +3033,10 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> { |
return handleExpressionInvoke(node); |
} |
String text = selector.source; |
- if (text == 'this') { |
+ if (text == 'assert') { |
+ // `assert()`. |
+ return handleAssert(node); |
+ } else if (text == 'this') { |
// `this()`. |
return handleThisAccess(node); |
} |