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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 2925603002: Add type inference for `this` expressions. (Closed)
Patch Set: Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 /// This file declares a "shadow hierarchy" of concrete classes which extend 5 /// This file declares a "shadow hierarchy" of concrete classes which extend
6 /// the kernel class hierarchy, adding methods and fields needed by the 6 /// the kernel class hierarchy, adding methods and fields needed by the
7 /// BodyBuilder. 7 /// BodyBuilder.
8 /// 8 ///
9 /// Instances of these classes may be created using the factory methods in 9 /// Instances of these classes may be created using the factory methods in
10 /// `ast_factory.dart`. 10 /// `ast_factory.dart`.
(...skipping 1502 matching lines...) Expand 10 before | Expand all | Expand 10 after
1513 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1513 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1514 // TODO(scheglov): implement. 1514 // TODO(scheglov): implement.
1515 return typeNeeded ? const DynamicType() : null; 1515 return typeNeeded ? const DynamicType() : null;
1516 } 1516 }
1517 } 1517 }
1518 1518
1519 /// Shadow object for [ThisExpression]. 1519 /// Shadow object for [ThisExpression].
1520 class KernelThisExpression extends ThisExpression implements KernelExpression { 1520 class KernelThisExpression extends ThisExpression implements KernelExpression {
1521 @override 1521 @override
1522 void _collectDependencies(KernelDependencyCollector collector) { 1522 void _collectDependencies(KernelDependencyCollector collector) {
1523 // TODO(paulberry): figure out the right thing to do here. 1523 // Field initializers are not allowed to refer to [this]. But if it
1524 throw 'TODO(paulberry)'; 1524 // happens, we can still proceed; no additional type inference dependencies
1525 // are introduced.
1525 } 1526 }
1526 1527
1527 @override 1528 @override
1528 DartType _inferExpression( 1529 DartType _inferExpression(
1529 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 1530 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
1530 // TODO(scheglov): implement. 1531 return typeNeeded ? (inferrer.thisType ?? const DynamicType()) : null;
1531 return typeNeeded ? const DynamicType() : null;
1532 } 1532 }
1533 } 1533 }
1534 1534
1535 /// Shadow object for [Throw]. 1535 /// Shadow object for [Throw].
1536 class KernelThrow extends Throw implements KernelExpression { 1536 class KernelThrow extends Throw implements KernelExpression {
1537 KernelThrow(Expression expression) : super(expression); 1537 KernelThrow(Expression expression) : super(expression);
1538 1538
1539 @override 1539 @override
1540 void _collectDependencies(KernelDependencyCollector collector) { 1540 void _collectDependencies(KernelDependencyCollector collector) {
1541 // No inference dependencies. 1541 // No inference dependencies.
(...skipping 20 matching lines...) Expand all
1562 1562
1563 @override 1563 @override
1564 FieldNode createFieldNode(KernelField field) { 1564 FieldNode createFieldNode(KernelField field) {
1565 FieldNode fieldNode = new FieldNode(this, field); 1565 FieldNode fieldNode = new FieldNode(this, field);
1566 field._fieldNode = fieldNode; 1566 field._fieldNode = fieldNode;
1567 return fieldNode; 1567 return fieldNode;
1568 } 1568 }
1569 1569
1570 @override 1570 @override
1571 KernelTypeInferrer createLocalTypeInferrer( 1571 KernelTypeInferrer createLocalTypeInferrer(
1572 Uri uri, TypeInferenceListener listener) { 1572 Uri uri, TypeInferenceListener listener, InterfaceType thisType) {
1573 return new KernelTypeInferrer._(this, uri.toString(), listener, false); 1573 return new KernelTypeInferrer._(
1574 this, uri.toString(), listener, false, thisType);
1574 } 1575 }
1575 1576
1576 @override 1577 @override
1577 KernelTypeInferrer createTopLevelTypeInferrer( 1578 KernelTypeInferrer createTopLevelTypeInferrer(KernelField field,
1578 KernelField field, TypeInferenceListener listener) { 1579 TypeInferenceListener listener, InterfaceType thisType) {
1579 return field._typeInferrer = 1580 return field._typeInferrer =
1580 new KernelTypeInferrer._(this, field.fileUri, listener, true); 1581 new KernelTypeInferrer._(this, field.fileUri, listener, true, thisType);
1581 } 1582 }
1582 1583
1583 @override 1584 @override
1584 bool fieldHasInitializer(KernelField field) { 1585 bool fieldHasInitializer(KernelField field) {
1585 return field.initializer != null; 1586 return field.initializer != null;
1586 } 1587 }
1587 1588
1588 @override 1589 @override
1589 DartType getFieldDeclaredType(KernelField field) { 1590 DartType getFieldDeclaredType(KernelField field) {
1590 return field._implicitlyTyped ? null : field.type; 1591 return field._implicitlyTyped ? null : field.type;
(...skipping 20 matching lines...) Expand all
1611 } 1612 }
1612 } 1613 }
1613 1614
1614 /// Concrete implementation of [TypeInferrer] specialized to work with kernel 1615 /// Concrete implementation of [TypeInferrer] specialized to work with kernel
1615 /// objects. 1616 /// objects.
1616 class KernelTypeInferrer extends TypeInferrerImpl { 1617 class KernelTypeInferrer extends TypeInferrerImpl {
1617 @override 1618 @override
1618 final typePromoter = new KernelTypePromoter(); 1619 final typePromoter = new KernelTypePromoter();
1619 1620
1620 KernelTypeInferrer._(KernelTypeInferenceEngine engine, String uri, 1621 KernelTypeInferrer._(KernelTypeInferenceEngine engine, String uri,
1621 TypeInferenceListener listener, bool topLevel) 1622 TypeInferenceListener listener, bool topLevel, InterfaceType thisType)
1622 : super(engine, uri, listener, topLevel); 1623 : super(engine, uri, listener, topLevel, thisType);
1623 1624
1624 @override 1625 @override
1625 Expression getFieldInitializer(KernelField field) { 1626 Expression getFieldInitializer(KernelField field) {
1626 return field.initializer; 1627 return field.initializer;
1627 } 1628 }
1628 1629
1629 @override 1630 @override
1630 DartType inferExpression( 1631 DartType inferExpression(
1631 Expression expression, DartType typeContext, bool typeNeeded) { 1632 Expression expression, DartType typeContext, bool typeNeeded) {
1632 if (expression is KernelExpression) { 1633 if (expression is KernelExpression) {
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1938 } 1939 }
1939 1940
1940 transformChildren(v) { 1941 transformChildren(v) {
1941 return internalError("Internal error: Unsupported operation."); 1942 return internalError("Internal error: Unsupported operation.");
1942 } 1943 }
1943 1944
1944 visitChildren(v) { 1945 visitChildren(v) {
1945 return internalError("Internal error: Unsupported operation."); 1946 return internalError("Internal error: Unsupported operation.");
1946 } 1947 }
1947 } 1948 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698