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

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

Issue 1099953004: In constant evaluation, handle final vars initialized at declaration site. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 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 | Annotate | Revision Log
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 engine.resolver; 5 library engine.resolver;
6 6
7 import "dart:math" as math; 7 import "dart:math" as math;
8 import 'dart:collection'; 8 import 'dart:collection';
9 9
10 import 'package:analyzer/src/generated/utilities_collection.dart'; 10 import 'package:analyzer/src/generated/utilities_collection.dart';
(...skipping 3044 matching lines...) Expand 10 before | Expand all | Expand 10 after
3055 3055
3056 @override 3056 @override
3057 Object visitVariableDeclaration(VariableDeclaration node) { 3057 Object visitVariableDeclaration(VariableDeclaration node) {
3058 bool isConst = node.isConst; 3058 bool isConst = node.isConst;
3059 bool isFinal = node.isFinal; 3059 bool isFinal = node.isFinal;
3060 bool hasInitializer = node.initializer != null; 3060 bool hasInitializer = node.initializer != null;
3061 VariableElementImpl element; 3061 VariableElementImpl element;
3062 if (_inFieldContext) { 3062 if (_inFieldContext) {
3063 SimpleIdentifier fieldName = node.name; 3063 SimpleIdentifier fieldName = node.name;
3064 FieldElementImpl field; 3064 FieldElementImpl field;
3065 if (isConst && hasInitializer) { 3065 if ((isConst || isFinal) && hasInitializer) {
3066 field = new ConstFieldElementImpl.con1(fieldName); 3066 field = new ConstFieldElementImpl.con1(fieldName);
3067 } else { 3067 } else {
3068 field = new FieldElementImpl.forNode(fieldName); 3068 field = new FieldElementImpl.forNode(fieldName);
3069 } 3069 }
3070 element = field; 3070 element = field;
3071 _currentHolder.addField(field); 3071 _currentHolder.addField(field);
3072 fieldName.staticElement = field; 3072 fieldName.staticElement = field;
3073 } else if (_inFunction) { 3073 } else if (_inFunction) {
3074 SimpleIdentifier variableName = node.name; 3074 SimpleIdentifier variableName = node.name;
3075 LocalVariableElementImpl variable; 3075 LocalVariableElementImpl variable;
(...skipping 8222 matching lines...) Expand 10 before | Expand all | Expand 10 after
11298 } 11298 }
11299 return null; 11299 return null;
11300 } 11300 }
11301 11301
11302 @override 11302 @override
11303 Object visitTypeName(TypeName node) => null; 11303 Object visitTypeName(TypeName node) => null;
11304 11304
11305 @override 11305 @override
11306 Object visitVariableDeclaration(VariableDeclaration node) { 11306 Object visitVariableDeclaration(VariableDeclaration node) {
11307 super.visitVariableDeclaration(node); 11307 super.visitVariableDeclaration(node);
11308 if (node.element.isConst && node.initializer != null) { 11308 VariableElement element = node.element;
11309 (node.element as ConstVariableElement).constantInitializer = 11309 // Note: in addition to cloning the initializers for const variables, we
11310 // have to clone the initializers for non-static final fields (because if
11311 // they occur in a class with a const constructor, they will be needed to
11312 // evaluate the const constructor).
Brian Wilkerson 2015/04/22 02:44:00 Do we really need the AST structure? The initializ
Paul Berry 2015/04/24 18:06:33 (Capturing the result of an in-person discussion)
11313 if ((element.isConst ||
11314 (element is FieldElement &&
11315 element.isFinal &&
11316 !element.isStatic)) &&
11317 node.initializer != null) {
11318 (element as ConstVariableElement).constantInitializer =
11310 new ConstantAstCloner().cloneNode(node.initializer); 11319 new ConstantAstCloner().cloneNode(node.initializer);
11311 } 11320 }
11312 return null; 11321 return null;
11313 } 11322 }
11314 11323
11315 @override 11324 @override
11316 Object visitWhileStatement(WhileStatement node) { 11325 Object visitWhileStatement(WhileStatement node) {
11317 // Note: since we don't call the base class, we have to maintain 11326 // Note: since we don't call the base class, we have to maintain
11318 // _implicitLabelScope ourselves. 11327 // _implicitLabelScope ourselves.
11319 ImplicitLabelScope outerImplicitScope = _implicitLabelScope; 11328 ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
(...skipping 4091 matching lines...) Expand 10 before | Expand all | Expand 10 after
15411 nonFields.add(node); 15420 nonFields.add(node);
15412 return null; 15421 return null;
15413 } 15422 }
15414 15423
15415 @override 15424 @override
15416 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); 15425 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
15417 15426
15418 @override 15427 @override
15419 Object visitWithClause(WithClause node) => null; 15428 Object visitWithClause(WithClause node) => null;
15420 } 15429 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/element.dart ('k') | pkg/analyzer/test/generated/all_the_rest_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698