Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(629)

Unified Diff: lib/src/checker/checker.dart

Issue 1137543005: Type check binary expressions (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Rebase and remove assert Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/src/checker/checker.dart
diff --git a/lib/src/checker/checker.dart b/lib/src/checker/checker.dart
index f96fa7d1c5c3b535fb132ef7976e565e6e3da08f..b114ba08c4402fcf1fe0d4b47aeec86e72bf7afb 100644
--- a/lib/src/checker/checker.dart
+++ b/lib/src/checker/checker.dart
@@ -705,14 +705,57 @@ class CodeChecker extends RecursiveAstVisitor {
node.visitChildren(this);
}
+ visitBinaryExpression(BinaryExpression node) {
+ var op = node.operator;
+ if (op.isUserDefinableOperator) {
+ if (_rules.isDynamicTarget(node.leftOperand)) {
+ // Dynamic invocation
+ // TODO(vsm): Move this logic to the resolver?
+ if (op.type != TokenType.EQ_EQ && op.type != TokenType.BANG_EQ) {
+ _recordDynamicInvoke(node);
+ }
+ } else {
+ var element = node.staticElement;
+ // Method invocation.
+ if (element is MethodElement) {
+ var type = element.type as FunctionType;
+ assert(type.normalParameterTypes.length == 1);
+ node.rightOperand =
+ checkArgument(node.rightOperand, type.normalParameterTypes[0]);
+ } else {
+ // TODO(vsm): Assert that the analyzer found an error here?
+ }
+ }
+ } else {
+ // Non-method operator.
+ switch (op.type) {
+ case TokenType.AMPERSAND_AMPERSAND:
+ case TokenType.BAR_BAR:
+ var boolType = _rules.provider.boolType;
+ node.leftOperand = checkArgument(node.leftOperand, boolType);
+ node.rightOperand = checkArgument(node.rightOperand, boolType);
+ break;
+ case TokenType.BANG_EQ:
+ break;
+ default:
+ assert(false);
+ }
+ }
+ node.visitChildren(this);
+ }
+
DartType getType(TypeName name) {
return (name == null) ? _rules.provider.dynamicType : name.type;
}
Expression checkAssignment(Expression expr, DartType type) {
- final staticInfo = _rules.checkAssignment(expr, type, _constantContext);
- _recordMessage(staticInfo);
- if (staticInfo is Conversion) expr = staticInfo;
+ if (expr is ParenthesizedExpression) {
+ expr.expression = checkAssignment(expr.expression, type);
+ } else {
+ final staticInfo = _rules.checkAssignment(expr, type, _constantContext);
+ _recordMessage(staticInfo);
+ if (staticInfo is Conversion) expr = staticInfo;
+ }
return expr;
}

Powered by Google App Engine
This is Rietveld 408576698