Skip to content

Commit b37d8c2

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Simplify FieldFragmentImpl creation.
Change-Id: Ic69ded5b9edf747b0bfcb5b90d093fbb85113b8d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/435721 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 91a3c73 commit b37d8c2

File tree

2 files changed

+22
-38
lines changed

2 files changed

+22
-38
lines changed

pkg/analyzer/lib/src/summary2/element_builder.dart

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,6 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
868868
var holder = _EnclosingContext(
869869
instanceElementBuilder: null,
870870
fragment: fragment,
871-
constFieldsForFinalInstance: true,
872871
);
873872
_withEnclosing(holder, () {
874873
node.typeParameters?.accept(this);
@@ -1011,7 +1010,6 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
10111010
var holder = _EnclosingContext(
10121011
instanceElementBuilder: null,
10131012
fragment: fragment,
1014-
constFieldsForFinalInstance: true,
10151013
);
10161014

10171015
// Build fields for all enum constants.
@@ -1279,24 +1277,6 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
12791277
name2: _getFragmentName(nameToken),
12801278
nameOffset: nameOffset,
12811279
);
1282-
if (variable.initializer case var initializer?) {
1283-
if (node.fields.isConst) {
1284-
fragment = FieldFragmentImpl(
1285-
name2: _getFragmentName(nameToken),
1286-
nameOffset: nameOffset,
1287-
)..constantInitializer = initializer;
1288-
} else if (_enclosingContext.constFieldsForFinalInstance) {
1289-
if (node.fields.isFinal && !node.isStatic) {
1290-
var constElement = FieldFragmentImpl(
1291-
name2: _getFragmentName(nameToken),
1292-
nameOffset: nameOffset,
1293-
)..constantInitializer = initializer;
1294-
fragment = constElement;
1295-
_libraryBuilder.finalInstanceFields.add(constElement);
1296-
}
1297-
}
1298-
}
1299-
13001280
fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
13011281
fragment.hasInitializer = variable.initializer != null;
13021282
fragment.isAbstract = node.abstractKeyword != null;
@@ -1311,6 +1291,15 @@ class FragmentBuilder extends ThrowingAstVisitor<void> {
13111291
_setCodeRange(fragment, variable);
13121292
_setDocumentation(fragment, node);
13131293

1294+
if (variable.initializer case var initializer?) {
1295+
if (node.fields.isConst) {
1296+
fragment.constantInitializer = initializer;
1297+
} else if (node.fields.isFinal && !node.isStatic) {
1298+
fragment.constantInitializer = initializer;
1299+
_libraryBuilder.finalInstanceFields.add(fragment);
1300+
}
1301+
}
1302+
13141303
if (node.fields.type == null) {
13151304
fragment.hasImplicitType = true;
13161305
}
@@ -2213,10 +2202,6 @@ class _EnclosingContext {
22132202
final List<TypeAliasFragmentImpl> _typeAliases = [];
22142203
final List<TypeParameterFragmentImpl> _typeParameters = [];
22152204

2216-
/// A class can have `const` constructors, and if it has we need values
2217-
/// of final instance fields.
2218-
final bool constFieldsForFinalInstance;
2219-
22202205
/// Not all optional formal parameters can have default values.
22212206
/// For example, formal parameters of methods can, but formal parameters
22222207
/// of function types - not. This flag specifies if we should create
@@ -2226,7 +2211,6 @@ class _EnclosingContext {
22262211
_EnclosingContext({
22272212
required this.instanceElementBuilder,
22282213
required this.fragment,
2229-
this.constFieldsForFinalInstance = false,
22302214
this.hasDefaultFormalParameters = false,
22312215
});
22322216

pkg/analyzer/lib/src/summary2/library_builder.dart

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import 'package:analyzer/src/summary2/types_builder.dart';
2727
import 'package:analyzer/src/util/performance/operation_performance.dart';
2828
import 'package:analyzer/src/utilities/extensions/collection.dart';
2929
import 'package:analyzer/src/utilities/extensions/element.dart';
30-
import 'package:analyzer/src/utilities/extensions/object.dart';
3130

3231
class DefiningLinkingUnit extends LinkingUnit {
3332
DefiningLinkingUnit({required super.node, required super.element});
@@ -300,22 +299,23 @@ class LibraryBuilder {
300299
}
301300

302301
void replaceConstFieldsIfNoConstConstructor() {
303-
var withConstConstructors = Set<ClassFragmentImpl>.identity();
304-
for (var classFragment in element.topLevelElements) {
305-
if (classFragment is! ClassFragmentImpl) continue;
306-
if (classFragment.isMixinApplication) continue;
307-
if (classFragment.isAugmentation) continue;
308-
var hasConst = classFragment.element.constructors.any((e) => e.isConst);
309-
if (hasConst) {
310-
withConstConstructors.add(classFragment);
302+
var hasConstConstructorCache = <InterfaceElement, bool>{};
303+
304+
bool hasConstConstructor(Element element) {
305+
if (element is InterfaceElement) {
306+
var result = hasConstConstructorCache[element];
307+
if (result == null) {
308+
result = element.constructors.any((e) => e.isConst);
309+
hasConstConstructorCache[element] = result;
310+
}
311+
return result;
311312
}
313+
return false;
312314
}
313315

314316
for (var fieldFragment in finalInstanceFields) {
315-
var enclosing = fieldFragment.enclosingElement3;
316-
var element = enclosing.ifTypeOrNull<ClassFragmentImpl>()?.element;
317-
if (element == null) continue;
318-
if (!withConstConstructors.contains(element.firstFragment)) {
317+
var enclosingElement = fieldFragment.enclosingFragment.element;
318+
if (!hasConstConstructor(enclosingElement)) {
319319
fieldFragment.constantInitializer = null;
320320
}
321321
}

0 commit comments

Comments
 (0)