Skip to content

Commit 1a8b172

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Use less VariableFragmentImpl.type
Change-Id: I80e3c41a7acf5bc00d2f36bf3a9ad77c1413f7ea Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439440 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent 7218145 commit 1a8b172

File tree

12 files changed

+149
-192
lines changed

12 files changed

+149
-192
lines changed

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
510510
),
511511
)
512512
..element = formalParameterElement
513-
..setPseudoExpressionStaticType(formalParameterFragment.type),
513+
..setPseudoExpressionStaticType(formalParameterElement.type),
514514
);
515515
}
516516

@@ -10432,7 +10432,7 @@ abstract class VariableElementImpl extends ElementImpl
1043210432
Constant? evaluationResult;
1043310433

1043410434
@override
10435-
ConstantInitializer? get constantInitializer {
10435+
ConstantInitializerImpl? get constantInitializer {
1043610436
if (_constantInitializer case var result?) {
1043710437
return result;
1043810438
}

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,7 +1851,7 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
18511851
}
18521852

18531853
void _verifyExtensionElementImplements(
1854-
ExtensionTypeFragmentImpl declaredElement,
1854+
ExtensionTypeFragmentImpl declaredFragment,
18551855
NamedTypeImpl node,
18561856
TypeImpl type,
18571857
) {
@@ -1866,6 +1866,7 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
18661866
return;
18671867
}
18681868

1869+
var declaredElement = declaredFragment.element;
18691870
var declaredRepresentation = declaredElement.representation.type;
18701871
if (typeSystem.isSubtypeOf(declaredRepresentation, type)) {
18711872
return;
@@ -1887,7 +1888,7 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
18871888
implementedRepresentation,
18881889
type.element.name ?? '',
18891890
declaredRepresentation,
1890-
declaredElement.name ?? '',
1891+
declaredFragment.name ?? '',
18911892
],
18921893
);
18931894
}

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3425,8 +3425,9 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
34253425

34263426
void _checkForExtensionTypeRepresentationTypeBottom(
34273427
ExtensionTypeDeclarationImpl node,
3428-
ExtensionTypeFragmentImpl element,
3428+
ExtensionTypeFragmentImpl fragment,
34293429
) {
3430+
var element = fragment.element;
34303431
var representationType = element.representation.type;
34313432
if (representationType.isBottom) {
34323433
diagnosticReporter.atNode(
@@ -4733,7 +4734,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
47334734
return;
47344735
}
47354736

4736-
var representationType = fragment.representation.type;
4737+
var element = fragment.element;
4738+
var representationType = element.representation.type;
47374739

47384740
for (var typeParameterNode in typeParameters) {
47394741
var typeParameterElement = typeParameterNode.declaredFragment!.element;
@@ -5836,9 +5838,10 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
58365838
if (!typeParameter.isLegacyCovariant) {
58375839
var fields = node.fields;
58385840
var fieldFragment = fields.variables.first.declaredFragment!;
5841+
var fieldElement = fieldFragment.element;
58395842
var fieldName = fields.variables.first.name;
58405843
Variance fieldVariance = typeParameter.computeVarianceInType(
5841-
fieldFragment.type,
5844+
fieldElement.type,
58425845
);
58435846

58445847
_checkForWrongVariancePosition(
@@ -5894,7 +5897,8 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
58945897
var methodParameters = method.parameters?.parameters;
58955898
if (methodParameters != null) {
58965899
for (var methodParameter in methodParameters) {
5897-
var methodParameterElement = methodParameter.declaredFragment!;
5900+
var methodParameterFragment = methodParameter.declaredFragment!;
5901+
var methodParameterElement = methodParameterFragment.element;
58985902
if (methodParameterElement.isCovariant) {
58995903
continue;
59005904
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,8 @@ class AstBinaryReader {
435435
parameter.declaredFragment = fragment;
436436
}
437437
node.declaredFragment = fragment;
438-
fragment.element.type = nonDefaultElement.type;
439-
fragment.type = nonDefaultElement.type;
438+
fragment.element.type = nonDefaultElement.element.type;
439+
fragment.type = nonDefaultElement.element.type;
440440

441441
return node;
442442
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,8 @@ class AstBinaryWriter extends ThrowingAstVisitor<void> {
898898
void _storeForLoopParts(ForLoopParts node) {}
899899

900900
void _storeFormalParameter(FormalParameterImpl node) {
901-
var element = node.declaredFragment!;
901+
var fragment = node.declaredFragment!;
902+
var element = fragment.element;
902903
_writeActualType(_sink, element.type);
903904
}
904905

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

Lines changed: 59 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:analyzer/dart/element/scope.dart';
65
import 'package:analyzer/src/dart/ast/ast.dart';
76
import 'package:analyzer/src/dart/element/element.dart';
87
import 'package:analyzer/src/dart/element/type_system.dart';
98
import 'package:analyzer/src/summary2/ast_resolver.dart';
109
import 'package:analyzer/src/summary2/library_builder.dart';
1110
import 'package:analyzer/src/summary2/link.dart';
1211
import 'package:analyzer/src/summary2/linking_node_scope.dart';
13-
import 'package:analyzer/src/utilities/extensions/element.dart';
12+
import 'package:analyzer/src/utilities/extensions/object.dart';
1413

1514
class DefaultValueResolver {
1615
final Linker _linker;
@@ -21,26 +20,42 @@ class DefaultValueResolver {
2120
: _typeSystem = _libraryBuilder.element.typeSystem;
2221

2322
void resolve() {
24-
for (var libraryFragment in _libraryBuilder.element.fragments) {
25-
_UnitContext(libraryFragment)
26-
..forEach(libraryFragment.classes, _interface)
27-
..forEach(libraryFragment.enums, _interface)
28-
..forEach(libraryFragment.extensions, _extension)
29-
..forEach(libraryFragment.extensionTypes, _interface)
30-
..forEach(libraryFragment.functions, _executable)
31-
..forEach(libraryFragment.mixins, _interface);
23+
var libraryElement = _libraryBuilder.element;
24+
var instanceElementListList = [
25+
libraryElement.classes,
26+
libraryElement.enums,
27+
libraryElement.extensions,
28+
libraryElement.extensionTypes,
29+
libraryElement.mixins,
30+
];
31+
for (var instanceElementList in instanceElementListList) {
32+
for (var instanceElement in instanceElementList) {
33+
for (var method in instanceElement.methods) {
34+
_executableElement(
35+
method,
36+
enclosingInterfaceElement: instanceElement.ifTypeOrNull(),
37+
);
38+
}
39+
if (instanceElement case InterfaceElementImpl interfaceElement) {
40+
for (var constructor in interfaceElement.constructors) {
41+
_executableElement(
42+
constructor,
43+
enclosingInterfaceElement: interfaceElement,
44+
);
45+
}
46+
}
47+
}
3248
}
33-
}
3449

35-
void _constructor(_ClassContext context, ConstructorFragmentImpl element) {
36-
if (element.isSynthetic) return;
37-
_executable(context, element);
50+
for (var topLevelFunction in libraryElement.topLevelFunctions) {
51+
_executableElement(topLevelFunction, enclosingInterfaceElement: null);
52+
}
3853
}
3954

40-
DefaultFormalParameterImpl? _defaultParameter(
41-
FormalParameterFragmentImpl element,
55+
DefaultFormalParameterImpl? _defaultParameterNode(
56+
FormalParameterFragmentImpl fragment,
4257
) {
43-
var node = _linker.getLinkingNode(element);
58+
var node = _linker.getLinkingNode(fragment);
4459
if (node?.parent case DefaultFormalParameterImpl defaultParent) {
4560
if (defaultParent.defaultValue != null) {
4661
return defaultParent;
@@ -49,110 +64,44 @@ class DefaultValueResolver {
4964
return null;
5065
}
5166

52-
void _executable(_Context context, ExecutableFragmentImpl element) {
53-
_ExecutableContext(
54-
enclosingContext: context,
55-
executableElement: element,
56-
scope: _scopeFromElement(element),
57-
).forEach(element.parameters, _parameter);
58-
}
59-
60-
void _extension(_UnitContext context, ExtensionFragmentImpl element) {
61-
context.forEach(element.methods, _executable);
62-
}
63-
64-
void _interface(_UnitContext context, InterfaceFragmentImpl element) {
65-
_ClassContext(context, element)
66-
..forEach(element.constructors, _constructor)
67-
..forEach(element.methods, _executable);
67+
void _executableElement(
68+
ExecutableElementImpl element, {
69+
required InterfaceElementImpl? enclosingInterfaceElement,
70+
}) {
71+
for (var formalParameter in element.formalParameters) {
72+
_formalParameterElement(
73+
formalParameter as FormalParameterElementImpl,
74+
enclosingInterfaceElement: enclosingInterfaceElement,
75+
enclosingExecutableElement: element,
76+
);
77+
}
6878
}
6979

70-
void _parameter(
71-
_ExecutableContext context,
72-
FormalParameterFragmentImpl parameter,
73-
) {
74-
// If a function typed parameter, process nested parameters.
75-
context.forEach(parameter.parameters, _parameter);
76-
77-
var node = _defaultParameter(parameter);
78-
if (node == null) return;
80+
void _formalParameterElement(
81+
FormalParameterElementImpl formalParameter, {
82+
required InterfaceElementImpl? enclosingInterfaceElement,
83+
required ExecutableElementImpl enclosingExecutableElement,
84+
}) {
85+
var firstFragment = formalParameter.firstFragment;
86+
var firstNode = _defaultParameterNode(firstFragment);
87+
if (firstNode == null) {
88+
return;
89+
}
7990

80-
var contextType = _typeSystem.eliminateTypeVariables(parameter.type);
91+
var contextType = _typeSystem.eliminateTypeVariables(formalParameter.type);
8192

8293
var analysisOptions = _libraryBuilder.kind.file.analysisOptions;
8394
var astResolver = AstResolver(
8495
_linker,
85-
context.libraryFragment,
86-
context.scope,
96+
firstFragment.libraryFragment as LibraryFragmentImpl,
97+
LinkingNodeContext.get(firstNode).scope,
8798
analysisOptions,
88-
enclosingClassElement: context.classElement?.asElement2,
89-
enclosingExecutableElement: context.executableElement.asElement2,
99+
enclosingClassElement: enclosingInterfaceElement,
100+
enclosingExecutableElement: enclosingExecutableElement,
90101
);
91102
astResolver.resolveExpression(
92-
() => node.defaultValue!,
103+
() => firstNode.defaultValue!,
93104
contextType: contextType,
94105
);
95106
}
96-
97-
Scope _scopeFromElement(FragmentImpl element) {
98-
var node = _linker.getLinkingNode(element)!;
99-
return LinkingNodeContext.get(node).scope;
100-
}
101-
}
102-
103-
class _ClassContext extends _Context {
104-
final _UnitContext unitContext;
105-
106-
@override
107-
final InterfaceFragmentImpl classElement;
108-
109-
_ClassContext(this.unitContext, this.classElement);
110-
111-
@override
112-
LibraryFragmentImpl get libraryFragment {
113-
return unitContext.libraryFragment;
114-
}
115-
}
116-
117-
abstract class _Context {
118-
InterfaceFragmentImpl? get classElement => null;
119-
120-
LibraryFragmentImpl get libraryFragment;
121-
}
122-
123-
class _ExecutableContext extends _Context {
124-
final _Context enclosingContext;
125-
final ExecutableFragmentImpl executableElement;
126-
final Scope scope;
127-
128-
_ExecutableContext({
129-
required this.enclosingContext,
130-
required this.executableElement,
131-
required this.scope,
132-
});
133-
134-
@override
135-
InterfaceFragmentImpl? get classElement {
136-
return enclosingContext.classElement;
137-
}
138-
139-
@override
140-
LibraryFragmentImpl get libraryFragment {
141-
return enclosingContext.libraryFragment;
142-
}
143-
}
144-
145-
class _UnitContext extends _Context {
146-
@override
147-
final LibraryFragmentImpl libraryFragment;
148-
149-
_UnitContext(this.libraryFragment);
150-
}
151-
152-
extension _ContextExtension<C extends _Context> on C {
153-
void forEach<T>(List<T> elements, void Function(C context, T element) f) {
154-
for (var element in elements) {
155-
f(this, element);
156-
}
157-
}
158107
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class _ImplementsNode extends graph.Node<_ImplementsNode> {
8686
isEvaluated = true;
8787
element.hasImplementsSelfReference = true;
8888

89-
var representationType = element.firstFragment.representation.type;
89+
var representationType = element.representation.type;
9090
var typeSystem = element.library.typeSystem;
9191

9292
var superInterface =

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

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,10 @@ class InstanceMemberInferrer {
416416

417417
var classElement = constructor.enclosingElement;
418418
if (classElement is ClassFragmentImpl && classElement.isMixinApplication) {
419-
_inferMixinApplicationConstructor(classElement, constructor);
419+
_inferMixinApplicationConstructor(
420+
classElement.element,
421+
constructor.element,
422+
);
420423
}
421424
}
422425

@@ -523,40 +526,38 @@ class InstanceMemberInferrer {
523526
}
524527

525528
void _inferMixinApplicationConstructor(
526-
ClassFragmentImpl classElement,
527-
ConstructorFragmentImpl constructor,
529+
ClassElementImpl classElement,
530+
ConstructorElementImpl constructor,
528531
) {
529532
var superType = classElement.supertype;
530533
if (superType != null) {
531534
var index = classElement.constructors.indexOf(constructor);
532535
var superConstructors =
533-
superType.elementImpl.constructors
534-
.where(
535-
(element) =>
536-
element.asElement2.isAccessibleIn(classElement.library),
537-
)
536+
superType.element.constructors
537+
.where((element) => element.isAccessibleIn(classElement.library))
538538
.toList();
539539
if (index < superConstructors.length) {
540540
var baseConstructor = superConstructors[index];
541541
var substitution = Substitution.fromInterfaceType(superType);
542542
forCorrespondingPairs<
543-
FormalParameterFragmentImpl,
544-
FormalParameterFragmentImpl
545-
>(constructor.parameters, baseConstructor.parameters, (
546-
parameter,
547-
baseParameter,
548-
) {
549-
var type = substitution.substituteType(baseParameter.type);
550-
parameter.element.type = type;
551-
parameter.type = type;
552-
});
543+
FormalParameterElementImpl,
544+
FormalParameterElementImpl
545+
>(
546+
constructor.formalParameters.cast(),
547+
baseConstructor.formalParameters.cast(),
548+
(parameter, baseParameter) {
549+
var type = substitution.substituteType(baseParameter.type);
550+
parameter.type = type;
551+
parameter.firstFragment.type = type;
552+
},
553+
);
553554
// Update arguments of `SuperConstructorInvocation` to have the types
554555
// (which we have just set) of the corresponding formal parameters.
555556
// MixinApp(x, y) : super(x, y);
556557
var initializers = constructor.constantInitializers;
557558
var initializer = initializers.single as SuperConstructorInvocation;
558-
forCorrespondingPairs<FormalParameterFragmentImpl, Expression>(
559-
constructor.parameters,
559+
forCorrespondingPairs<FormalParameterElementImpl, Expression>(
560+
constructor.formalParameters.cast(),
560561
initializer.argumentList.arguments,
561562
(parameter, argument) {
562563
(argument as SimpleIdentifierImpl).setPseudoExpressionStaticType(

0 commit comments

Comments
 (0)