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

Side by Side Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 2335693002: Add support for accessing field formal parameters in the initializer list of constructors (Closed)
Patch Set: Clean up Created 4 years, 3 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
« no previous file with comments | « pkg/analyzer/lib/src/generated/engine.dart ('k') | pkg/analyzer/lib/src/task/options.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.generated.resolver; 5 library analyzer.src.generated.resolver;
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 6330 matching lines...) Expand 10 before | Expand all | Expand 10 after
6341 } 6341 }
6342 ConstructorElementImpl constructor = node.element; 6342 ConstructorElementImpl constructor = node.element;
6343 constructor.constantInitializers = 6343 constructor.constantInitializers =
6344 new ConstantAstCloner().cloneNodeList(node.initializers); 6344 new ConstantAstCloner().cloneNodeList(node.initializers);
6345 return null; 6345 return null;
6346 } 6346 }
6347 6347
6348 @override 6348 @override
6349 void visitConstructorDeclarationInScope(ConstructorDeclaration node) { 6349 void visitConstructorDeclarationInScope(ConstructorDeclaration node) {
6350 super.visitConstructorDeclarationInScope(node); 6350 super.visitConstructorDeclarationInScope(node);
6351 // Because of needing a different scope for the initializer list, the
6352 // overridden implementation of this method cannot cause the visitNode
6353 // method to be invoked. As a result, we have to hard-code using the
6354 // element resolver and type analyzer to visit the constructor declaration.
6355 node.accept(elementResolver);
6356 node.accept(typeAnalyzer);
6351 safelyVisitComment(node.documentationComment); 6357 safelyVisitComment(node.documentationComment);
6352 } 6358 }
6353 6359
6354 @override 6360 @override
6355 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) { 6361 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
6356 // 6362 //
6357 // We visit the expression, but do not visit the field name because it needs 6363 // We visit the expression, but do not visit the field name because it needs
6358 // to be visited in the context of the constructor field initializer node. 6364 // to be visited in the context of the constructor field initializer node.
6359 // 6365 //
6360 FieldElement fieldElement = enclosingClass.getField(node.fieldName.name); 6366 FieldElement fieldElement = enclosingClass.getField(node.fieldName.name);
(...skipping 1376 matching lines...) Expand 10 before | Expand all | Expand 10 after
7737 */ 7743 */
7738 ImplicitLabelScope _implicitLabelScope = ImplicitLabelScope.ROOT; 7744 ImplicitLabelScope _implicitLabelScope = ImplicitLabelScope.ROOT;
7739 7745
7740 /** 7746 /**
7741 * The scope used to resolve labels for `break` and `continue` statements, or 7747 * The scope used to resolve labels for `break` and `continue` statements, or
7742 * `null` if no labels have been defined in the current context. 7748 * `null` if no labels have been defined in the current context.
7743 */ 7749 */
7744 LabelScope labelScope; 7750 LabelScope labelScope;
7745 7751
7746 /** 7752 /**
7753 * A flag indicating whether to enable support for allowing access to field
7754 * formal parameters in a constructor's initializer list.
7755 */
7756 bool enableInitializingFormalAccess = false;
7757
7758 /**
7747 * The class containing the AST nodes being visited, 7759 * The class containing the AST nodes being visited,
7748 * or `null` if we are not in the scope of a class. 7760 * or `null` if we are not in the scope of a class.
7749 */ 7761 */
7750 ClassElement enclosingClass; 7762 ClassElement enclosingClass;
7751 7763
7752 /** 7764 /**
7753 * Initialize a newly created visitor to resolve the nodes in a compilation 7765 * Initialize a newly created visitor to resolve the nodes in a compilation
7754 * unit. 7766 * unit.
7755 * 7767 *
7756 * [definingLibrary] is the element for the library containing the 7768 * [definingLibrary] is the element for the library containing the
(...skipping 10 matching lines...) Expand all
7767 ScopedVisitor(this.definingLibrary, Source source, this.typeProvider, 7779 ScopedVisitor(this.definingLibrary, Source source, this.typeProvider,
7768 AnalysisErrorListener errorListener, 7780 AnalysisErrorListener errorListener,
7769 {Scope nameScope}) 7781 {Scope nameScope})
7770 : source = source, 7782 : source = source,
7771 errorReporter = new ErrorReporter(errorListener, source) { 7783 errorReporter = new ErrorReporter(errorListener, source) {
7772 if (nameScope == null) { 7784 if (nameScope == null) {
7773 this.nameScope = new LibraryScope(definingLibrary); 7785 this.nameScope = new LibraryScope(definingLibrary);
7774 } else { 7786 } else {
7775 this.nameScope = nameScope; 7787 this.nameScope = nameScope;
7776 } 7788 }
7789 enableInitializingFormalAccess =
7790 definingLibrary.context.analysisOptions.enableInitializingFormalAccess;
7777 } 7791 }
7778 7792
7779 /** 7793 /**
7780 * Return the implicit label scope in which the current node is being 7794 * Return the implicit label scope in which the current node is being
7781 * resolved. 7795 * resolved.
7782 */ 7796 */
7783 ImplicitLabelScope get implicitLabelScope => _implicitLabelScope; 7797 ImplicitLabelScope get implicitLabelScope => _implicitLabelScope;
7784 7798
7785 /** 7799 /**
7786 * Replaces the current [Scope] with the enclosing [Scope]. 7800 * Replaces the current [Scope] with the enclosing [Scope].
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
7903 super.visitClassTypeAlias(node); 7917 super.visitClassTypeAlias(node);
7904 } finally { 7918 } finally {
7905 nameScope = outerScope; 7919 nameScope = outerScope;
7906 } 7920 }
7907 return null; 7921 return null;
7908 } 7922 }
7909 7923
7910 @override 7924 @override
7911 Object visitConstructorDeclaration(ConstructorDeclaration node) { 7925 Object visitConstructorDeclaration(ConstructorDeclaration node) {
7912 ConstructorElement constructorElement = node.element; 7926 ConstructorElement constructorElement = node.element;
7927 if (constructorElement == null) {
7928 StringBuffer buffer = new StringBuffer();
7929 buffer.write("Missing element for constructor ");
7930 buffer.write(node.returnType.name);
7931 if (node.name != null) {
7932 buffer.write(".");
7933 buffer.write(node.name.name);
7934 }
7935 buffer.write(" in ");
7936 buffer.write(definingLibrary.source.fullName);
7937 AnalysisEngine.instance.logger.logInformation(buffer.toString(),
7938 new CaughtException(new AnalysisException(), null));
7939 }
7913 Scope outerScope = nameScope; 7940 Scope outerScope = nameScope;
7914 try { 7941 try {
7915 if (constructorElement == null) { 7942 if (constructorElement != null) {
7916 StringBuffer buffer = new StringBuffer();
7917 buffer.write("Missing element for constructor ");
7918 buffer.write(node.returnType.name);
7919 if (node.name != null) {
7920 buffer.write(".");
7921 buffer.write(node.name.name);
7922 }
7923 buffer.write(" in ");
7924 buffer.write(definingLibrary.source.fullName);
7925 AnalysisEngine.instance.logger.logInformation(buffer.toString(),
7926 new CaughtException(new AnalysisException(), null));
7927 } else {
7928 nameScope = new FunctionScope(nameScope, constructorElement); 7943 nameScope = new FunctionScope(nameScope, constructorElement);
7929 } 7944 }
7945 node.documentationComment?.accept(this);
7946 node.metadata.accept(this);
7947 node.returnType?.accept(this);
7948 node.name?.accept(this);
7949 node.parameters?.accept(this);
7950 Scope functionScope = nameScope;
7951 try {
7952 if (constructorElement != null && enableInitializingFormalAccess) {
7953 nameScope =
7954 new ConstructorInitializerScope(nameScope, constructorElement);
7955 }
7956 node.initializers.accept(this);
7957 } finally {
7958 nameScope = functionScope;
7959 }
7960 node.redirectedConstructor?.accept(this);
7930 visitConstructorDeclarationInScope(node); 7961 visitConstructorDeclarationInScope(node);
7931 } finally { 7962 } finally {
7932 nameScope = outerScope; 7963 nameScope = outerScope;
7933 } 7964 }
7934 return null; 7965 return null;
7935 } 7966 }
7936 7967
7937 void visitConstructorDeclarationInScope(ConstructorDeclaration node) { 7968 void visitConstructorDeclarationInScope(ConstructorDeclaration node) {
7938 super.visitConstructorDeclaration(node); 7969 node.body?.accept(this);
7939 } 7970 }
7940 7971
7941 @override 7972 @override
7942 Object visitDeclaredIdentifier(DeclaredIdentifier node) { 7973 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
7943 VariableElement element = node.element; 7974 VariableElement element = node.element;
7944 if (element != null) { 7975 if (element != null) {
7945 nameScope.define(element); 7976 nameScope.define(element);
7946 } 7977 }
7947 super.visitDeclaredIdentifier(node); 7978 super.visitDeclaredIdentifier(node);
7948 return null; 7979 return null;
(...skipping 3209 matching lines...) Expand 10 before | Expand all | Expand 10 after
11158 return null; 11189 return null;
11159 } 11190 }
11160 if (identical(node.staticElement, variable)) { 11191 if (identical(node.staticElement, variable)) {
11161 if (node.inSetterContext()) { 11192 if (node.inSetterContext()) {
11162 result = true; 11193 result = true;
11163 } 11194 }
11164 } 11195 }
11165 return null; 11196 return null;
11166 } 11197 }
11167 } 11198 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/engine.dart ('k') | pkg/analyzer/lib/src/task/options.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698