| OLD | NEW |
| 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 3240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3251 | 3251 |
| 3252 @override | 3252 @override |
| 3253 void visitChildren(AstVisitor visitor) { | 3253 void visitChildren(AstVisitor visitor) { |
| 3254 super.visitChildren(visitor); | 3254 super.visitChildren(visitor); |
| 3255 _type?.accept(visitor); | 3255 _type?.accept(visitor); |
| 3256 _identifier?.accept(visitor); | 3256 _identifier?.accept(visitor); |
| 3257 } | 3257 } |
| 3258 } | 3258 } |
| 3259 | 3259 |
| 3260 /** | 3260 /** |
| 3261 * A simple identifier that declares a name. |
| 3262 */ |
| 3263 // TODO(rnystrom): Consider making this distinct from [SimpleIdentifier] and |
| 3264 // get rid of all of the: |
| 3265 // |
| 3266 // if (node.inDeclarationContext()) { ... } |
| 3267 // |
| 3268 // code and instead visit this separately. A declaration is semantically pretty |
| 3269 // different from a use, so using the same node type doesn't seem to buy us |
| 3270 // much. |
| 3271 class DeclaredSimpleIdentifier extends SimpleIdentifierImpl { |
| 3272 DeclaredSimpleIdentifier(Token token) : super(token); |
| 3273 |
| 3274 @override |
| 3275 bool inDeclarationContext() => true; |
| 3276 } |
| 3277 |
| 3278 /** |
| 3261 * A formal parameter with a default value. There are two kinds of parameters | 3279 * A formal parameter with a default value. There are two kinds of parameters |
| 3262 * that are both represented by this class: named formal parameters and | 3280 * that are both represented by this class: named formal parameters and |
| 3263 * positional formal parameters. | 3281 * positional formal parameters. |
| 3264 * | 3282 * |
| 3265 * defaultFormalParameter ::= | 3283 * defaultFormalParameter ::= |
| 3266 * [NormalFormalParameter] ('=' [Expression])? | 3284 * [NormalFormalParameter] ('=' [Expression])? |
| 3267 * | 3285 * |
| 3268 * defaultNamedParameter ::= | 3286 * defaultNamedParameter ::= |
| 3269 * [NormalFormalParameter] (':' [Expression])? | 3287 * [NormalFormalParameter] (':' [Expression])? |
| 3270 */ | 3288 */ |
| (...skipping 5652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8923 String get name => token.lexeme; | 8941 String get name => token.lexeme; |
| 8924 | 8942 |
| 8925 @override | 8943 @override |
| 8926 int get precedence => 16; | 8944 int get precedence => 16; |
| 8927 | 8945 |
| 8928 @override | 8946 @override |
| 8929 Element get propagatedElement => _propagatedElement; | 8947 Element get propagatedElement => _propagatedElement; |
| 8930 | 8948 |
| 8931 @override | 8949 @override |
| 8932 void set propagatedElement(Element element) { | 8950 void set propagatedElement(Element element) { |
| 8933 _propagatedElement = _validateElement(element); | 8951 _propagatedElement = element; |
| 8934 } | 8952 } |
| 8935 | 8953 |
| 8936 @override | 8954 @override |
| 8937 Element get staticElement => _staticElement; | 8955 Element get staticElement => _staticElement; |
| 8938 | 8956 |
| 8939 @override | 8957 @override |
| 8940 void set staticElement(Element element) { | 8958 void set staticElement(Element element) { |
| 8941 _staticElement = _validateElement(element); | 8959 _staticElement = element; |
| 8942 } | 8960 } |
| 8943 | 8961 |
| 8944 @override | 8962 @override |
| 8945 dynamic/*=E*/ accept/*<E>*/(AstVisitor/*<E>*/ visitor) => | 8963 dynamic/*=E*/ accept/*<E>*/(AstVisitor/*<E>*/ visitor) => |
| 8946 visitor.visitSimpleIdentifier(this); | 8964 visitor.visitSimpleIdentifier(this); |
| 8947 | 8965 |
| 8948 @override | 8966 @override |
| 8949 bool inDeclarationContext() { | 8967 bool inDeclarationContext() => false; |
| 8950 // TODO(brianwilkerson) Convert this to a getter. | |
| 8951 AstNode parent = this.parent; | |
| 8952 if (parent is CatchClause) { | |
| 8953 CatchClause clause = parent; | |
| 8954 return identical(this, clause.exceptionParameter) || | |
| 8955 identical(this, clause.stackTraceParameter); | |
| 8956 } else if (parent is ClassDeclaration) { | |
| 8957 return identical(this, parent.name); | |
| 8958 } else if (parent is ClassTypeAlias) { | |
| 8959 return identical(this, parent.name); | |
| 8960 } else if (parent is ConstructorDeclaration) { | |
| 8961 return identical(this, parent.name); | |
| 8962 } else if (parent is DeclaredIdentifier) { | |
| 8963 return identical(this, parent.identifier); | |
| 8964 } else if (parent is EnumDeclaration) { | |
| 8965 return identical(this, parent.name); | |
| 8966 } else if (parent is EnumConstantDeclaration) { | |
| 8967 return identical(this, parent.name); | |
| 8968 } else if (parent is FunctionDeclaration) { | |
| 8969 return identical(this, parent.name); | |
| 8970 } else if (parent is FunctionTypeAlias) { | |
| 8971 return identical(this, parent.name); | |
| 8972 } else if (parent is ImportDirective) { | |
| 8973 return identical(this, parent.prefix); | |
| 8974 } else if (parent is Label) { | |
| 8975 return identical(this, parent.label) && | |
| 8976 (parent.parent is LabeledStatement); | |
| 8977 } else if (parent is MethodDeclaration) { | |
| 8978 return identical(this, parent.name); | |
| 8979 } else if (parent is FunctionTypedFormalParameter || | |
| 8980 parent is SimpleFormalParameter) { | |
| 8981 return identical(this, (parent as NormalFormalParameter).identifier); | |
| 8982 } else if (parent is TypeParameter) { | |
| 8983 return identical(this, parent.name); | |
| 8984 } else if (parent is VariableDeclaration) { | |
| 8985 return identical(this, parent.name); | |
| 8986 } | |
| 8987 return false; | |
| 8988 } | |
| 8989 | 8968 |
| 8990 @override | 8969 @override |
| 8991 bool inGetterContext() { | 8970 bool inGetterContext() { |
| 8992 // TODO(brianwilkerson) Convert this to a getter. | 8971 // TODO(brianwilkerson) Convert this to a getter. |
| 8993 AstNode parent = this.parent; | 8972 AstNode parent = this.parent; |
| 8994 AstNode target = this; | 8973 AstNode target = this; |
| 8995 // skip prefix | 8974 // skip prefix |
| 8996 if (parent is PrefixedIdentifier) { | 8975 if (parent is PrefixedIdentifier) { |
| 8997 PrefixedIdentifier prefixed = parent as PrefixedIdentifier; | 8976 PrefixedIdentifier prefixed = parent as PrefixedIdentifier; |
| 8998 if (identical(prefixed.prefix, this)) { | 8977 if (identical(prefixed.prefix, this)) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9059 } else if (parent is ForEachStatement) { | 9038 } else if (parent is ForEachStatement) { |
| 9060 return identical(parent.identifier, target); | 9039 return identical(parent.identifier, target); |
| 9061 } | 9040 } |
| 9062 return false; | 9041 return false; |
| 9063 } | 9042 } |
| 9064 | 9043 |
| 9065 @override | 9044 @override |
| 9066 void visitChildren(AstVisitor visitor) { | 9045 void visitChildren(AstVisitor visitor) { |
| 9067 // There are no children to visit. | 9046 // There are no children to visit. |
| 9068 } | 9047 } |
| 9069 | |
| 9070 /** | |
| 9071 * Return the given element if it is valid, or report the problem and return | |
| 9072 * `null` if it is not appropriate. | |
| 9073 * | |
| 9074 * The [parent] is the parent of the element, used for reporting when there is | |
| 9075 * a problem. | |
| 9076 * The [isValid] is `true` if the element is appropriate. | |
| 9077 * The [element] is the element to be associated with this identifier. | |
| 9078 */ | |
| 9079 Element _returnOrReportElement( | |
| 9080 AstNode parent, bool isValid, Element element) { | |
| 9081 if (!isValid) { | |
| 9082 AnalysisEngine.instance.logger.logInformation( | |
| 9083 "Internal error: attempting to set the name of a ${parent.runtimeType}
to a ${element.runtimeType}", | |
| 9084 new CaughtException(new AnalysisException(), null)); | |
| 9085 return null; | |
| 9086 } | |
| 9087 return element; | |
| 9088 } | |
| 9089 | |
| 9090 /** | |
| 9091 * Return the given [element] if it is an appropriate element based on the | |
| 9092 * parent of this identifier, or `null` if it is not appropriate. | |
| 9093 */ | |
| 9094 Element _validateElement(Element element) { | |
| 9095 if (element == null) { | |
| 9096 return null; | |
| 9097 } | |
| 9098 AstNode parent = this.parent; | |
| 9099 if (parent is ClassDeclaration && identical(parent.name, this)) { | |
| 9100 return _returnOrReportElement(parent, element is ClassElement, element); | |
| 9101 } else if (parent is ClassTypeAlias && identical(parent.name, this)) { | |
| 9102 return _returnOrReportElement(parent, element is ClassElement, element); | |
| 9103 } else if (parent is DeclaredIdentifier && | |
| 9104 identical(parent.identifier, this)) { | |
| 9105 return _returnOrReportElement( | |
| 9106 parent, element is LocalVariableElement, element); | |
| 9107 } else if (parent is FormalParameter && | |
| 9108 identical(parent.identifier, this)) { | |
| 9109 return _returnOrReportElement( | |
| 9110 parent, element is ParameterElement, element); | |
| 9111 } else if (parent is FunctionDeclaration && identical(parent.name, this)) { | |
| 9112 return _returnOrReportElement( | |
| 9113 parent, element is ExecutableElement, element); | |
| 9114 } else if (parent is FunctionTypeAlias && identical(parent.name, this)) { | |
| 9115 return _returnOrReportElement( | |
| 9116 parent, element is FunctionTypeAliasElement, element); | |
| 9117 } else if (parent is MethodDeclaration && identical(parent.name, this)) { | |
| 9118 return _returnOrReportElement( | |
| 9119 parent, element is ExecutableElement, element); | |
| 9120 } else if (parent is TypeParameter && identical(parent.name, this)) { | |
| 9121 return _returnOrReportElement( | |
| 9122 parent, element is TypeParameterElement, element); | |
| 9123 } else if (parent is VariableDeclaration && identical(parent.name, this)) { | |
| 9124 return _returnOrReportElement( | |
| 9125 parent, element is VariableElement, element); | |
| 9126 } | |
| 9127 return element; | |
| 9128 } | |
| 9129 } | 9048 } |
| 9130 | 9049 |
| 9131 /** | 9050 /** |
| 9132 * A string literal expression that does not contain any interpolations. | 9051 * A string literal expression that does not contain any interpolations. |
| 9133 * | 9052 * |
| 9134 * simpleStringLiteral ::= | 9053 * simpleStringLiteral ::= |
| 9135 * rawStringLiteral | 9054 * rawStringLiteral |
| 9136 * | basicStringLiteral | 9055 * | basicStringLiteral |
| 9137 * | 9056 * |
| 9138 * rawStringLiteral ::= | 9057 * rawStringLiteral ::= |
| (...skipping 1937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11076 | 10995 |
| 11077 @override | 10996 @override |
| 11078 dynamic/*=E*/ accept/*<E>*/(AstVisitor/*<E>*/ visitor) => | 10997 dynamic/*=E*/ accept/*<E>*/(AstVisitor/*<E>*/ visitor) => |
| 11079 visitor.visitYieldStatement(this); | 10998 visitor.visitYieldStatement(this); |
| 11080 | 10999 |
| 11081 @override | 11000 @override |
| 11082 void visitChildren(AstVisitor visitor) { | 11001 void visitChildren(AstVisitor visitor) { |
| 11083 _expression?.accept(visitor); | 11002 _expression?.accept(visitor); |
| 11084 } | 11003 } |
| 11085 } | 11004 } |
| OLD | NEW |