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

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

Issue 1833573006: Distinguish SimpleIdentifier uses and declarations at parse time. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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 3240 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698