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

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

Issue 2661123002: Don't resynthesize field types during class members resynthesis. (Closed)
Patch Set: Created 3 years, 10 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/lib/src/summary/summarize_ast.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.dart.element.element; 5 library analyzer.src.dart.element.element;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:math' show min; 8 import 'dart:math' show min;
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 } 1201 }
1202 // Build explicit property accessors and implicit fields. 1202 // Build explicit property accessors and implicit fields.
1203 var explicitAccessors = <PropertyAccessorElement>[]; 1203 var explicitAccessors = <PropertyAccessorElement>[];
1204 var implicitFields = <String, FieldElementImpl>{}; 1204 var implicitFields = <String, FieldElementImpl>{};
1205 for (UnlinkedExecutable e in _unlinkedClass.executables) { 1205 for (UnlinkedExecutable e in _unlinkedClass.executables) {
1206 if (e.kind == UnlinkedExecutableKind.getter || 1206 if (e.kind == UnlinkedExecutableKind.getter ||
1207 e.kind == UnlinkedExecutableKind.setter) { 1207 e.kind == UnlinkedExecutableKind.setter) {
1208 PropertyAccessorElementImpl accessor = 1208 PropertyAccessorElementImpl accessor =
1209 new PropertyAccessorElementImpl.forSerialized(e, this); 1209 new PropertyAccessorElementImpl.forSerialized(e, this);
1210 explicitAccessors.add(accessor); 1210 explicitAccessors.add(accessor);
1211 // Prepare the field type.
1212 DartType fieldType;
1213 if (e.kind == UnlinkedExecutableKind.getter) {
1214 fieldType = accessor.returnType;
1215 } else {
1216 List<ParameterElement> parameters = accessor.parameters;
1217 fieldType = parameters.isNotEmpty
1218 ? parameters[0].type
1219 : DynamicTypeImpl.instance;
1220 }
1221 // Create or update the implicit field. 1211 // Create or update the implicit field.
1222 String fieldName = accessor.displayName; 1212 String fieldName = accessor.displayName;
1223 FieldElementImpl field = implicitFields[fieldName]; 1213 FieldElementImpl field = implicitFields[fieldName];
1224 if (field == null) { 1214 if (field == null) {
1225 field = new FieldElementImpl(fieldName, -1); 1215 field = new FieldElementImpl(fieldName, -1);
1226 implicitFields[fieldName] = field; 1216 implicitFields[fieldName] = field;
1227 field.enclosingElement = this; 1217 field.enclosingElement = this;
1228 field.isSynthetic = true; 1218 field.isSynthetic = true;
1229 field.isFinal = e.kind == UnlinkedExecutableKind.getter; 1219 field.isFinal = e.kind == UnlinkedExecutableKind.getter;
1230 field.type = fieldType;
1231 field.isStatic = e.isStatic; 1220 field.isStatic = e.isStatic;
1232 } else { 1221 } else {
1233 field.isFinal = false; 1222 field.isFinal = false;
1234 } 1223 }
1235 accessor.variable = field; 1224 accessor.variable = field;
1236 if (e.kind == UnlinkedExecutableKind.getter) { 1225 if (e.kind == UnlinkedExecutableKind.getter) {
1237 field.getter = accessor; 1226 field.getter = accessor;
1238 } else { 1227 } else {
1239 field.setter = accessor; 1228 field.setter = accessor;
1240 } 1229 }
(...skipping 5659 matching lines...) Expand 10 before | Expand all | Expand 10 after
6900 DartType get type { 6889 DartType get type {
6901 if (_unlinkedVariable != null && _declaredType == null && _type == null) { 6890 if (_unlinkedVariable != null && _declaredType == null && _type == null) {
6902 _type = enclosingUnit.resynthesizerContext.resolveLinkedType( 6891 _type = enclosingUnit.resynthesizerContext.resolveLinkedType(
6903 _unlinkedVariable.inferredTypeSlot, typeParameterContext); 6892 _unlinkedVariable.inferredTypeSlot, typeParameterContext);
6904 _declaredType = enclosingUnit.resynthesizerContext 6893 _declaredType = enclosingUnit.resynthesizerContext
6905 .resolveTypeRef(_unlinkedVariable.type, typeParameterContext); 6894 .resolveTypeRef(_unlinkedVariable.type, typeParameterContext);
6906 } 6895 }
6907 return super.type; 6896 return super.type;
6908 } 6897 }
6909 6898
6899 @override
6910 void set type(DartType type) { 6900 void set type(DartType type) {
6911 _assertNotResynthesized(_unlinkedVariable); 6901 _assertNotResynthesized(_unlinkedVariable);
6912 _type = type; 6902 _type = type;
6913 } 6903 }
6914 6904
6915 /** 6905 /**
6916 * Subclasses need this getter, see [ConstVariableElement._unlinkedConst]. 6906 * Subclasses need this getter, see [ConstVariableElement._unlinkedConst].
6917 */ 6907 */
6918 UnlinkedExpr get _unlinkedConst => _unlinkedVariable?.initializer?.bodyExpr; 6908 UnlinkedExpr get _unlinkedConst => _unlinkedVariable?.initializer?.bodyExpr;
6919 } 6909 }
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after
7880 _propagatedType = enclosingUnit.resynthesizerContext.resolveLinkedType( 7870 _propagatedType = enclosingUnit.resynthesizerContext.resolveLinkedType(
7881 _unlinkedVariable.propagatedTypeSlot, typeParameterContext); 7871 _unlinkedVariable.propagatedTypeSlot, typeParameterContext);
7882 } 7872 }
7883 return _propagatedType; 7873 return _propagatedType;
7884 } 7874 }
7885 7875
7886 void set propagatedType(DartType propagatedType) { 7876 void set propagatedType(DartType propagatedType) {
7887 _assertNotResynthesized(_unlinkedVariable); 7877 _assertNotResynthesized(_unlinkedVariable);
7888 _propagatedType = propagatedType; 7878 _propagatedType = propagatedType;
7889 } 7879 }
7880
7881 @override
7882 DartType get type {
7883 if (isSynthetic && _type == null) {
7884 if (getter != null) {
7885 _type = getter.returnType;
7886 } else if (setter != null) {
7887 List<ParameterElement> parameters = setter.parameters;
7888 _type = parameters.isNotEmpty
7889 ? parameters[0].type
7890 : DynamicTypeImpl.instance;
7891 } else {
7892 _type = DynamicTypeImpl.instance;
7893 }
7894 }
7895 return super.type;
7896 }
7890 } 7897 }
7891 7898
7892 /** 7899 /**
7893 * The context in which elements are resynthesized. 7900 * The context in which elements are resynthesized.
7894 */ 7901 */
7895 abstract class ResynthesizerContext { 7902 abstract class ResynthesizerContext {
7896 bool get isStrongMode; 7903 bool get isStrongMode;
7897 7904
7898 /** 7905 /**
7899 * Build [ElementAnnotationImpl] for the given [UnlinkedExpr]. 7906 * Build [ElementAnnotationImpl] for the given [UnlinkedExpr].
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
8625 8632
8626 @override 8633 @override
8627 void visitElement(Element element) { 8634 void visitElement(Element element) {
8628 int offset = element.nameOffset; 8635 int offset = element.nameOffset;
8629 if (offset != -1) { 8636 if (offset != -1) {
8630 map[offset] = element; 8637 map[offset] = element;
8631 } 8638 }
8632 super.visitElement(element); 8639 super.visitElement(element);
8633 } 8640 }
8634 } 8641 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/summary/summarize_ast.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698