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

Side by Side Diff: pkg/analyzer/lib/src/dart/ast/ast.dart

Issue 1720433002: fixes #25477, downward inference of generic methods (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 library analyzer.src.dart.ast.ast; 5 library analyzer.src.dart.ast.ast;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 5036 matching lines...) Expand 10 before | Expand all | Expand 10 after
5047 5047
5048 /** 5048 /**
5049 * The invocation of a function resulting from evaluating an expression. 5049 * The invocation of a function resulting from evaluating an expression.
5050 * Invocations of methods and other forms of functions are represented by 5050 * Invocations of methods and other forms of functions are represented by
5051 * [MethodInvocation] nodes. Invocations of getters and setters are represented 5051 * [MethodInvocation] nodes. Invocations of getters and setters are represented
5052 * by either [PrefixedIdentifier] or [PropertyAccess] nodes. 5052 * by either [PrefixedIdentifier] or [PropertyAccess] nodes.
5053 * 5053 *
5054 * > functionExpressionInvocation ::= 5054 * > functionExpressionInvocation ::=
5055 * > [Expression] [TypeArgumentList]? [ArgumentList] 5055 * > [Expression] [TypeArgumentList]? [ArgumentList]
5056 */ 5056 */
5057 class FunctionExpressionInvocationImpl extends ExpressionImpl 5057 class FunctionExpressionInvocationImpl extends InvocationExpressionImpl
5058 implements FunctionExpressionInvocation { 5058 implements FunctionExpressionInvocation {
5059 /** 5059 /**
5060 * The expression producing the function being invoked. 5060 * The expression producing the function being invoked.
5061 */ 5061 */
5062 Expression _function; 5062 Expression _function;
5063 5063
5064 /** 5064 /**
5065 * The type arguments to be applied to the method being invoked, or `null` if
5066 * no type arguments were provided.
5067 */
5068 TypeArgumentList _typeArguments;
5069
5070 /**
5071 * The list of arguments to the function.
5072 */
5073 ArgumentList _argumentList;
5074
5075 /**
5076 * The element associated with the function being invoked based on static type 5065 * The element associated with the function being invoked based on static type
5077 * information, or `null` if the AST structure has not been resolved or the 5066 * information, or `null` if the AST structure has not been resolved or the
5078 * function could not be resolved. 5067 * function could not be resolved.
5079 */ 5068 */
5080 ExecutableElement staticElement; 5069 ExecutableElement staticElement;
5081 5070
5082 /** 5071 /**
5083 * The function type of the method invocation, or `null` if the AST
5084 * structure has not been resolved, or if the invoke could not be resolved.
5085 *
5086 * This will usually be a [FunctionType], but it can also be an
5087 * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
5088 * interface type that implements `Function`.
5089 */
5090 DartType staticInvokeType;
5091
5092 /**
5093 * The element associated with the function being invoked based on propagated 5072 * The element associated with the function being invoked based on propagated
5094 * type information, or `null` if the AST structure has not been resolved or 5073 * type information, or `null` if the AST structure has not been resolved or
5095 * the function could not be resolved. 5074 * the function could not be resolved.
5096 */ 5075 */
5097 ExecutableElement propagatedElement; 5076 ExecutableElement propagatedElement;
5098 5077
5099 /** 5078 /**
5100 * Like [staticInvokeType], but reflects propagated type information.
5101 */
5102 DartType propagatedInvokeType;
5103
5104 /**
5105 * Initialize a newly created function expression invocation. 5079 * Initialize a newly created function expression invocation.
5106 */ 5080 */
5107 FunctionExpressionInvocationImpl(Expression function, 5081 FunctionExpressionInvocationImpl(Expression function,
5108 TypeArgumentList typeArguments, ArgumentList argumentList) { 5082 TypeArgumentList typeArguments, ArgumentList argumentList)
5083 : super(typeArguments, argumentList) {
5109 _function = _becomeParentOf(function); 5084 _function = _becomeParentOf(function);
5110 _typeArguments = _becomeParentOf(typeArguments);
5111 _argumentList = _becomeParentOf(argumentList);
5112 } 5085 }
5113 5086
5114 @override 5087 @override
5115 ArgumentList get argumentList => _argumentList;
5116
5117 @override
5118 void set argumentList(ArgumentList argumentList) {
5119 _argumentList = _becomeParentOf(argumentList);
5120 }
5121
5122 @override
5123 Token get beginToken => _function.beginToken; 5088 Token get beginToken => _function.beginToken;
5124 5089
5125 @override 5090 @override
5126 ExecutableElement get bestElement { 5091 ExecutableElement get bestElement {
5127 ExecutableElement element = propagatedElement; 5092 ExecutableElement element = propagatedElement;
5128 if (element == null) { 5093 if (element == null) {
5129 element = staticElement; 5094 element = staticElement;
5130 } 5095 }
5131 return element; 5096 return element;
5132 } 5097 }
(...skipping 10 matching lines...) Expand all
5143 5108
5144 @override 5109 @override
5145 void set function(Expression expression) { 5110 void set function(Expression expression) {
5146 _function = _becomeParentOf(expression); 5111 _function = _becomeParentOf(expression);
5147 } 5112 }
5148 5113
5149 @override 5114 @override
5150 int get precedence => 15; 5115 int get precedence => 15;
5151 5116
5152 @override 5117 @override
5153 TypeArgumentList get typeArguments => _typeArguments;
5154
5155 @override
5156 void set typeArguments(TypeArgumentList typeArguments) {
5157 _typeArguments = _becomeParentOf(typeArguments);
5158 }
5159
5160 @override
5161 accept(AstVisitor visitor) => visitor.visitFunctionExpressionInvocation(this); 5118 accept(AstVisitor visitor) => visitor.visitFunctionExpressionInvocation(this);
5162 5119
5163 @override 5120 @override
5164 void visitChildren(AstVisitor visitor) { 5121 void visitChildren(AstVisitor visitor) {
5165 _safelyVisitChild(_function, visitor); 5122 _safelyVisitChild(_function, visitor);
5166 _safelyVisitChild(_typeArguments, visitor); 5123 _safelyVisitChild(_typeArguments, visitor);
5167 _safelyVisitChild(_argumentList, visitor); 5124 _safelyVisitChild(_argumentList, visitor);
5168 } 5125 }
5169 } 5126 }
5170 5127
(...skipping 989 matching lines...) Expand 10 before | Expand all | Expand 10 after
6160 Token get endToken => contents; 6117 Token get endToken => contents;
6161 6118
6162 @override 6119 @override
6163 accept(AstVisitor visitor) => visitor.visitInterpolationString(this); 6120 accept(AstVisitor visitor) => visitor.visitInterpolationString(this);
6164 6121
6165 @override 6122 @override
6166 void visitChildren(AstVisitor visitor) {} 6123 void visitChildren(AstVisitor visitor) {}
6167 } 6124 }
6168 6125
6169 /** 6126 /**
6127 * Common base class for [FunctionExpressionInvocationImpl] and
6128 * [MethodInvocationImpl].
6129 */
6130 abstract class InvocationExpressionImpl extends ExpressionImpl
6131 implements InvocationExpression {
6132 /**
6133 * The type arguments to be applied to the method being invoked, or `null` if
6134 * no type arguments were provided.
6135 */
6136 TypeArgumentList _typeArguments;
6137
6138 /**
6139 * The list of arguments to the function.
6140 */
6141 ArgumentList _argumentList;
6142
6143 @override
6144 DartType propagatedInvokeType;
6145
6146 @override
6147 DartType staticInvokeType;
6148
6149 /**
6150 * Initialize a newly created invocation.
6151 */
6152 InvocationExpressionImpl(
6153 TypeArgumentList typeArguments, ArgumentList argumentList) {
6154 _typeArguments = _becomeParentOf(typeArguments);
6155 _argumentList = _becomeParentOf(argumentList);
6156 }
6157
6158 @override
6159 ArgumentList get argumentList => _argumentList;
6160
6161 @override
6162 void set argumentList(ArgumentList argumentList) {
6163 _argumentList = _becomeParentOf(argumentList);
6164 }
6165
6166 @override
6167 TypeArgumentList get typeArguments => _typeArguments;
6168
6169 @override
6170 void set typeArguments(TypeArgumentList typeArguments) {
6171 _typeArguments = _becomeParentOf(typeArguments);
6172 }
6173 }
6174
6175 /**
6170 * An is expression. 6176 * An is expression.
6171 * 6177 *
6172 * > isExpression ::= 6178 * > isExpression ::=
6173 * > [Expression] 'is' '!'? [TypeName] 6179 * > [Expression] 'is' '!'? [TypeName]
6174 */ 6180 */
6175 class IsExpressionImpl extends ExpressionImpl implements IsExpression { 6181 class IsExpressionImpl extends ExpressionImpl implements IsExpression {
6176 /** 6182 /**
6177 * The expression used to compute the value whose type is being tested. 6183 * The expression used to compute the value whose type is being tested.
6178 */ 6184 */
6179 Expression _expression; 6185 Expression _expression;
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after
6952 6958
6953 /** 6959 /**
6954 * The invocation of either a function or a method. Invocations of functions 6960 * The invocation of either a function or a method. Invocations of functions
6955 * resulting from evaluating an expression are represented by 6961 * resulting from evaluating an expression are represented by
6956 * [FunctionExpressionInvocation] nodes. Invocations of getters and setters are 6962 * [FunctionExpressionInvocation] nodes. Invocations of getters and setters are
6957 * represented by either [PrefixedIdentifier] or [PropertyAccess] nodes. 6963 * represented by either [PrefixedIdentifier] or [PropertyAccess] nodes.
6958 * 6964 *
6959 * > methodInvocation ::= 6965 * > methodInvocation ::=
6960 * > ([Expression] '.')? [SimpleIdentifier] [TypeArgumentList]? [ArgumentLis t] 6966 * > ([Expression] '.')? [SimpleIdentifier] [TypeArgumentList]? [ArgumentLis t]
6961 */ 6967 */
6962 class MethodInvocationImpl extends ExpressionImpl implements MethodInvocation { 6968 class MethodInvocationImpl extends InvocationExpressionImpl
6969 implements MethodInvocation {
6963 /** 6970 /**
6964 * The expression producing the object on which the method is defined, or 6971 * The expression producing the object on which the method is defined, or
6965 * `null` if there is no target (that is, the target is implicitly `this`). 6972 * `null` if there is no target (that is, the target is implicitly `this`).
6966 */ 6973 */
6967 Expression _target; 6974 Expression _target;
6968 6975
6969 /** 6976 /**
6970 * The operator that separates the target from the method name, or `null` 6977 * The operator that separates the target from the method name, or `null`
6971 * if there is no target. In an ordinary method invocation this will be a 6978 * if there is no target. In an ordinary method invocation this will be a
6972 * period ('.'). In a cascade section this will be the cascade operator 6979 * period ('.'). In a cascade section this will be the cascade operator
6973 * ('..'). 6980 * ('..').
6974 */ 6981 */
6975 Token operator; 6982 Token operator;
6976 6983
6977 /** 6984 /**
6978 * The name of the method being invoked. 6985 * The name of the method being invoked.
6979 */ 6986 */
6980 SimpleIdentifier _methodName; 6987 SimpleIdentifier _methodName;
6981 6988
6982 /** 6989 /**
6983 * The type arguments to be applied to the method being invoked, or `null` if
6984 * no type arguments were provided.
6985 */
6986 TypeArgumentList _typeArguments;
6987
6988 /**
6989 * The list of arguments to the method.
6990 */
6991 ArgumentList _argumentList;
6992
6993 /**
6994 * The function type of the method invocation, or `null` if the AST
6995 * structure has not been resolved, or if the invoke could not be resolved.
6996 *
6997 * This will usually be a [FunctionType], but it can also be an
6998 * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
6999 * interface type that implements `Function`.
7000 */
7001 DartType staticInvokeType;
7002
7003 /**
7004 * Like [staticInvokeType], but reflects propagated type information.
7005 */
7006 DartType propagatedInvokeType;
7007
7008 /**
7009 * Initialize a newly created method invocation. The [target] and [operator] 6990 * Initialize a newly created method invocation. The [target] and [operator]
7010 * can be `null` if there is no target. 6991 * can be `null` if there is no target.
7011 */ 6992 */
7012 MethodInvocationImpl( 6993 MethodInvocationImpl(
7013 Expression target, 6994 Expression target,
7014 this.operator, 6995 this.operator,
7015 SimpleIdentifier methodName, 6996 SimpleIdentifier methodName,
7016 TypeArgumentList typeArguments, 6997 TypeArgumentList typeArguments,
7017 ArgumentList argumentList) { 6998 ArgumentList argumentList)
6999 : super(typeArguments, argumentList) {
7018 _target = _becomeParentOf(target); 7000 _target = _becomeParentOf(target);
7019 _methodName = _becomeParentOf(methodName); 7001 _methodName = _becomeParentOf(methodName);
7020 _typeArguments = _becomeParentOf(typeArguments);
7021 _argumentList = _becomeParentOf(argumentList);
7022 } 7002 }
7023 7003
7024 @override 7004 @override
7025 ArgumentList get argumentList => _argumentList;
7026
7027 @override
7028 void set argumentList(ArgumentList argumentList) {
7029 _argumentList = _becomeParentOf(argumentList);
7030 }
7031
7032 @override
7033 Token get beginToken { 7005 Token get beginToken {
7034 if (_target != null) { 7006 if (_target != null) {
7035 return _target.beginToken; 7007 return _target.beginToken;
7036 } else if (operator != null) { 7008 } else if (operator != null) {
7037 return operator; 7009 return operator;
7038 } 7010 }
7039 return _methodName.beginToken; 7011 return _methodName.beginToken;
7040 } 7012 }
7041 7013
7042 @override 7014 @override
7043 Iterable get childEntities => new ChildEntities() 7015 Iterable get childEntities => new ChildEntities()
7044 ..add(_target) 7016 ..add(_target)
7045 ..add(operator) 7017 ..add(operator)
7046 ..add(_methodName) 7018 ..add(_methodName)
7047 ..add(_argumentList); 7019 ..add(_argumentList);
7048 7020
7049 @override 7021 @override
7050 Token get endToken => _argumentList.endToken; 7022 Token get endToken => _argumentList.endToken;
7051 7023
7052 @override 7024 @override
7025 Expression get function => methodName;
7026
7027 @override
7053 bool get isCascaded => 7028 bool get isCascaded =>
7054 operator != null && operator.type == TokenType.PERIOD_PERIOD; 7029 operator != null && operator.type == TokenType.PERIOD_PERIOD;
7055 7030
7056 @override 7031 @override
7057 SimpleIdentifier get methodName => _methodName; 7032 SimpleIdentifier get methodName => _methodName;
7058 7033
7059 @override 7034 @override
7060 void set methodName(SimpleIdentifier identifier) { 7035 void set methodName(SimpleIdentifier identifier) {
7061 _methodName = _becomeParentOf(identifier); 7036 _methodName = _becomeParentOf(identifier);
7062 } 7037 }
(...skipping 18 matching lines...) Expand all
7081 7056
7082 @override 7057 @override
7083 Expression get target => _target; 7058 Expression get target => _target;
7084 7059
7085 @override 7060 @override
7086 void set target(Expression expression) { 7061 void set target(Expression expression) {
7087 _target = _becomeParentOf(expression); 7062 _target = _becomeParentOf(expression);
7088 } 7063 }
7089 7064
7090 @override 7065 @override
7091 TypeArgumentList get typeArguments => _typeArguments;
7092
7093 @override
7094 void set typeArguments(TypeArgumentList typeArguments) {
7095 _typeArguments = _becomeParentOf(typeArguments);
7096 }
7097
7098 @override
7099 accept(AstVisitor visitor) => visitor.visitMethodInvocation(this); 7066 accept(AstVisitor visitor) => visitor.visitMethodInvocation(this);
7100 7067
7101 @override 7068 @override
7102 void visitChildren(AstVisitor visitor) { 7069 void visitChildren(AstVisitor visitor) {
7103 _safelyVisitChild(_target, visitor); 7070 _safelyVisitChild(_target, visitor);
7104 _safelyVisitChild(_methodName, visitor); 7071 _safelyVisitChild(_methodName, visitor);
7105 _safelyVisitChild(_typeArguments, visitor); 7072 _safelyVisitChild(_typeArguments, visitor);
7106 _safelyVisitChild(_argumentList, visitor); 7073 _safelyVisitChild(_argumentList, visitor);
7107 } 7074 }
7108 } 7075 }
(...skipping 3739 matching lines...) Expand 10 before | Expand all | Expand 10 after
10848 } 10815 }
10849 10816
10850 @override 10817 @override
10851 accept(AstVisitor visitor) => visitor.visitYieldStatement(this); 10818 accept(AstVisitor visitor) => visitor.visitYieldStatement(this);
10852 10819
10853 @override 10820 @override
10854 void visitChildren(AstVisitor visitor) { 10821 void visitChildren(AstVisitor visitor) {
10855 _safelyVisitChild(_expression, visitor); 10822 _safelyVisitChild(_expression, visitor);
10856 } 10823 }
10857 } 10824 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698