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/task/incremental_element_builder.dart

Issue 2158973003: Fixes for updating synthetic element offsets. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 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 | « no previous file | pkg/analyzer/test/src/task/incremental_element_builder_test.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) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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.task.incremental_element_builder; 5 library analyzer.src.task.incremental_element_builder;
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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 123
124 /** 124 /**
125 * Updates [oldUnit] to have the same directives and declarations, in the 125 * Updates [oldUnit] to have the same directives and declarations, in the
126 * same order as in [newUnit]. Existing resolution is kept where possible. 126 * same order as in [newUnit]. Existing resolution is kept where possible.
127 * 127 *
128 * Updates [unitElement] by adding/removing elements as needed. 128 * Updates [unitElement] by adding/removing elements as needed.
129 * 129 *
130 * Fills [unitDelta] with added/remove elements. 130 * Fills [unitDelta] with added/remove elements.
131 */ 131 */
132 void build() { 132 void build() {
133 _materializeLazyElements();
133 new CompilationUnitBuilder() 134 new CompilationUnitBuilder()
134 .buildCompilationUnit(unitSource, newUnit, librarySource); 135 .buildCompilationUnit(unitSource, newUnit, librarySource);
135 _processDirectives(); 136 _processDirectives();
136 _processUnitMembers(); 137 _processUnitMembers();
137 _replaceUnitContents(oldUnit, newUnit); 138 _replaceUnitContents(oldUnit, newUnit);
138 _findConstants(); 139 _findConstants();
139 newUnit.element = unitElement; 140 newUnit.element = unitElement;
140 unitElement.setCodeRange(0, newUnit.endToken.end); 141 unitElement.setCodeRange(0, newUnit.endToken.end);
141 } 142 }
142 143
(...skipping 20 matching lines...) Expand all
163 oldUnit.accept(finder); 164 oldUnit.accept(finder);
164 unitConstants.addAll(finder.constantsToCompute); 165 unitConstants.addAll(finder.constantsToCompute);
165 // Update annotation constants to using the old unit element. 166 // Update annotation constants to using the old unit element.
166 for (ConstantEvaluationTarget constant in unitConstants) { 167 for (ConstantEvaluationTarget constant in unitConstants) {
167 if (constant is ElementAnnotationImpl) { 168 if (constant is ElementAnnotationImpl) {
168 constant.compilationUnit = unitElement; 169 constant.compilationUnit = unitElement;
169 } 170 }
170 } 171 }
171 } 172 }
172 173
174 void _materializeLazyElements() {
175 unitElement.accept(new RecursiveElementVisitor());
176 }
177
173 ClassElementDelta _processClassMembers( 178 ClassElementDelta _processClassMembers(
174 ClassDeclaration oldClass, ClassDeclaration newClass) { 179 ClassDeclaration oldClass, ClassDeclaration newClass) {
175 // If the class hierarchy or type parameters are changed, 180 // If the class hierarchy or type parameters are changed,
176 // then the class changed too much - don't compute the delta. 181 // then the class changed too much - don't compute the delta.
177 if (newClass.abstractKeyword != null && oldClass.abstractKeyword == null || 182 if (newClass.abstractKeyword != null && oldClass.abstractKeyword == null ||
178 newClass.abstractKeyword == null && oldClass.abstractKeyword != null || 183 newClass.abstractKeyword == null && oldClass.abstractKeyword != null ||
179 TokenUtils.getFullCode(newClass.typeParameters) != 184 TokenUtils.getFullCode(newClass.typeParameters) !=
180 TokenUtils.getFullCode(oldClass.typeParameters) || 185 TokenUtils.getFullCode(oldClass.typeParameters) ||
181 TokenUtils.getFullCode(newClass.extendsClause) != 186 TokenUtils.getFullCode(newClass.extendsClause) !=
182 TokenUtils.getFullCode(oldClass.extendsClause) || 187 TokenUtils.getFullCode(oldClass.extendsClause) ||
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 */ 681 */
677 class _UpdateElementOffsetsVisitor extends GeneralizingElementVisitor { 682 class _UpdateElementOffsetsVisitor extends GeneralizingElementVisitor {
678 final Map<int, int> map; 683 final Map<int, int> map;
679 684
680 _UpdateElementOffsetsVisitor(this.map); 685 _UpdateElementOffsetsVisitor(this.map);
681 686
682 void visitElement(Element element) { 687 void visitElement(Element element) {
683 if (element is LibraryElement) { 688 if (element is LibraryElement) {
684 return; 689 return;
685 } 690 }
686 if (element.isSynthetic && !_isVariableInitializer(element)) {
687 return;
688 }
689 if (element is ElementImpl) { 691 if (element is ElementImpl) {
690 // name offset 692 // name offset
691 { 693 {
692 int oldOffset = element.nameOffset; 694 int oldOffset = element.nameOffset;
693 int newOffset = map[oldOffset]; 695 int newOffset = map[oldOffset];
694 assert(newOffset != null); 696 // Some synthetic elements have new offsets, e.g. synthetic accessors
697 // of property inducing elements. But some are purely synthetic, e.g.
698 // synthetic enum fields and their accessors.
699 if (newOffset == null) {
700 assert(element.isSynthetic);
701 return;
702 }
695 element.nameOffset = newOffset; 703 element.nameOffset = newOffset;
696 } 704 }
697 // code range 705 // code range
698 { 706 {
699 int oldOffset = element.codeOffset; 707 int oldOffset = element.codeOffset;
700 if (oldOffset != null) { 708 if (oldOffset != null) {
701 int oldEnd = oldOffset + element.codeLength; 709 int oldEnd = oldOffset + element.codeLength;
702 int newOffset = map[oldOffset]; 710 int newOffset = map[oldOffset];
703 int newEnd = map[oldEnd]; 711 int newEnd = map[oldEnd];
704 assert(newOffset != null); 712 assert(newOffset != null);
(...skipping 21 matching lines...) Expand all
726 element.setVisibleRange(newOffset, newLength); 734 element.setVisibleRange(newOffset, newLength);
727 } else if (element is ParameterElementImpl) { 735 } else if (element is ParameterElementImpl) {
728 element.setVisibleRange(newOffset, newLength); 736 element.setVisibleRange(newOffset, newLength);
729 } 737 }
730 } 738 }
731 } 739 }
732 } 740 }
733 } 741 }
734 super.visitElement(element); 742 super.visitElement(element);
735 } 743 }
736
737 static bool _isVariableInitializer(Element element) {
738 return element is FunctionElement &&
739 element.enclosingElement is VariableElement;
740 }
741 } 744 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/src/task/incremental_element_builder_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698