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

Side by Side Diff: pkg/analyzer/lib/src/task/strong/rules.dart

Issue 1462133005: Downwards inference. This adds support to the resolver for downwards (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Minor fixes Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // TODO(jmesserly): this was ported from package:dev_compiler, and needs to be 5 // TODO(jmesserly): this was ported from package:dev_compiler, and needs to be
6 // refactored to fit into analyzer. 6 // refactored to fit into analyzer.
7 library analyzer.src.task.strong.rules; 7 library analyzer.src.task.strong.rules;
8 8
9 import 'package:analyzer/src/generated/ast.dart'; 9 import 'package:analyzer/src/generated/ast.dart';
10 import 'package:analyzer/src/generated/element.dart'; 10 import 'package:analyzer/src/generated/element.dart';
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 } 414 }
415 415
416 StaticInfo checkAssignment(Expression expr, DartType toT) { 416 StaticInfo checkAssignment(Expression expr, DartType toT) {
417 final fromT = getStaticType(expr); 417 final fromT = getStaticType(expr);
418 final Coercion c = _coerceTo(fromT, toT); 418 final Coercion c = _coerceTo(fromT, toT);
419 if (c is Identity) return null; 419 if (c is Identity) return null;
420 if (c is CoercionError) return new StaticTypeError(this, expr, toT); 420 if (c is CoercionError) return new StaticTypeError(this, expr, toT);
421 var reason = null; 421 var reason = null;
422 422
423 var errors = <String>[]; 423 var errors = <String>[];
424
424 var ok = inferrer.inferExpression(expr, toT, errors); 425 var ok = inferrer.inferExpression(expr, toT, errors);
425 if (ok) return InferredType.create(this, expr, toT); 426 if (ok) return InferredType.create(this, expr, toT);
426 reason = (errors.isNotEmpty) ? errors.first : null; 427 reason = (errors.isNotEmpty) ? errors.first : null;
427 428
428 if (c is Cast) return DownCast.create(this, expr, c, reason: reason); 429 if (c is Cast) return DownCast.create(this, expr, c, reason: reason);
429 assert(false); 430 assert(false);
430 return null; 431 return null;
431 } 432 }
432 433
433 DartType elementType(Element e) { 434 DartType elementType(Element e) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 502
502 /// Downward inference 503 /// Downward inference
503 bool inferExpression(Expression e, DartType t, List<String> errors) { 504 bool inferExpression(Expression e, DartType t, List<String> errors) {
504 // Don't cast top level expressions, only sub-expressions 505 // Don't cast top level expressions, only sub-expressions
505 return _inferExpression(e, t, errors, cast: false); 506 return _inferExpression(e, t, errors, cast: false);
506 } 507 }
507 508
508 /// Downward inference 509 /// Downward inference
509 bool _inferExpression(Expression e, DartType t, List<String> errors, 510 bool _inferExpression(Expression e, DartType t, List<String> errors,
510 {cast: true}) { 511 {cast: true}) {
511 if (e is ConditionalExpression) {
512 return _inferConditionalExpression(e, t, errors);
513 }
514 if (e is ParenthesizedExpression) {
515 return _inferParenthesizedExpression(e, t, errors);
516 }
517 if (rules.isSubTypeOf(rules.getStaticType(e), t)) return true; 512 if (rules.isSubTypeOf(rules.getStaticType(e), t)) return true;
518 if (cast && rules.getStaticType(e).isDynamic) { 513 if (cast && rules.getStaticType(e).isDynamic) {
519 annotateCastFromDynamic(e, t); 514 annotateCastFromDynamic(e, t);
520 return true; 515 return true;
521 } 516 }
522 if (e is FunctionExpression) return _inferFunctionExpression(e, t, errors);
523 if (e is ListLiteral) return _inferListLiteral(e, t, errors);
524 if (e is MapLiteral) return _inferMapLiteral(e, t, errors);
525 if (e is NamedExpression) return _inferNamedExpression(e, t, errors);
526 if (e is InstanceCreationExpression) {
527 return _inferInstanceCreationExpression(e, t, errors);
528 }
529 errors.add("$e cannot be typed as $t"); 517 errors.add("$e cannot be typed as $t");
530 return false; 518 return false;
531 } 519 }
532 520
533 /// If t1 = I<dynamic, ..., dynamic>, then look for a supertype 521 /// If t1 = I<dynamic, ..., dynamic>, then look for a supertype
534 /// of t1 of the form K<S0, ..., Sm> where t2 = K<S0', ..., Sm'> 522 /// of t1 of the form K<S0, ..., Sm> where t2 = K<S0', ..., Sm'>
535 /// If the supertype exists, use the constraints S0 <: S0', ... Sm <: Sm' 523 /// If the supertype exists, use the constraints S0 <: S0', ... Sm <: Sm'
536 /// to derive a concrete instantation for I of the form <T0, ..., Tn>, 524 /// to derive a concrete instantation for I of the form <T0, ..., Tn>,
537 /// such that I<T0, .., Tn> <: t2 525 /// such that I<T0, .., Tn> <: t2
538 List<DartType> _matchTypes(InterfaceType t1, InterfaceType t2) { 526 List<DartType> _matchTypes(InterfaceType t1, InterfaceType t2) {
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 var entries = e.entries; 750 var entries = e.entries;
763 bool inferEntry(MapLiteralEntry entry) { 751 bool inferEntry(MapLiteralEntry entry) {
764 return _inferExpression(entry.key, kType, errors) && 752 return _inferExpression(entry.key, kType, errors) &&
765 _inferExpression(entry.value, vType, errors); 753 _inferExpression(entry.value, vType, errors);
766 } 754 }
767 var b = entries.every(inferEntry); 755 var b = entries.every(inferEntry);
768 if (b) annotateMapLiteral(e, targs); 756 if (b) annotateMapLiteral(e, targs);
769 return b; 757 return b;
770 } 758 }
771 } 759 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698