Skip to content

Commit 96ca861

Browse files
fshcheglovCommit Queue
authored andcommitted
Update top level function tests for augmentation.
Change-Id: I6e19ee923812e53844126950dce157c095a46142 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449925 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent d0f4726 commit 96ca861

File tree

8 files changed

+2391
-1375
lines changed

8 files changed

+2391
-1375
lines changed

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

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2440,6 +2440,11 @@ abstract class ExecutableFragmentImpl extends FunctionTypedFragmentImpl
24402440
@Deprecated('Use typeParameters instead')
24412441
@override
24422442
List<TypeParameterFragmentImpl> get typeParameters2 => typeParameters;
2443+
2444+
void addTypeParameter(TypeParameterFragmentImpl fragment) {
2445+
_typeParameters.add(fragment);
2446+
fragment.enclosingFragment = this;
2447+
}
24432448
}
24442449

24452450
@elementClass
@@ -3384,6 +3389,12 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
33843389
/// The element corresponding to this fragment.
33853390
FormalParameterElementImpl? _element;
33863391

3392+
@override
3393+
FormalParameterFragmentImpl? nextFragment;
3394+
3395+
@override
3396+
FormalParameterFragmentImpl? previousFragment;
3397+
33873398
/// Initialize a newly created parameter element to have the given [name] and
33883399
/// [nameOffset].
33893400
FormalParameterFragmentImpl({
@@ -3521,14 +3532,6 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
35213532
@override
35223533
String? get name2 => name;
35233534

3524-
@override
3525-
// TODO(augmentations): Support chaining between the fragments.
3526-
FormalParameterFragmentImpl? get nextFragment => null;
3527-
3528-
@override
3529-
// TODO(augmentations): Support chaining between the fragments.
3530-
FormalParameterFragmentImpl? get previousFragment => null;
3531-
35323535
/// The type parameters defined by this parameter.
35333536
///
35343537
/// A parameter will only define type parameters if it is a function typed
@@ -3546,9 +3549,40 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
35463549
_typeParameters = typeParameters;
35473550
}
35483551

3552+
void addFragment(FormalParameterFragmentImpl fragment) {
3553+
fragment.element = element;
3554+
fragment.previousFragment = this;
3555+
nextFragment = fragment;
3556+
}
3557+
35493558
FormalParameterElementImpl _createElement(
35503559
FormalParameterFragment firstFragment,
35513560
) => FormalParameterElementImpl(firstFragment as FormalParameterFragmentImpl);
3561+
3562+
static void _linkFragments<T extends FragmentImpl>(
3563+
List<T> fragments, {
3564+
required List<FormalParameterFragmentImpl> Function(T) getFragments,
3565+
}) {
3566+
DeferredResolutionReadingMixin.withoutLoadingResolution(() {
3567+
var firstFormalParameters = getFragments(fragments.first);
3568+
for (var i = 0; i < firstFormalParameters.length; i++) {
3569+
// Side effect: set element for the fragment.
3570+
var first = firstFormalParameters[i];
3571+
switch (first) {
3572+
case FieldFormalParameterFragmentImpl():
3573+
FieldFormalParameterElementImpl(first);
3574+
case SuperFormalParameterFragmentImpl():
3575+
SuperFormalParameterElementImpl(first);
3576+
default:
3577+
FormalParameterElementImpl(first);
3578+
}
3579+
fragments.reduce((previous, current) {
3580+
getFragments(previous)[i].addFragment(getFragments(current)[i]);
3581+
return current;
3582+
});
3583+
}
3584+
});
3585+
}
35523586
}
35533587

35543588
@GenerateFragmentImpl(modifiers: _FragmentImplModifiers.values)
@@ -8332,6 +8366,7 @@ class MethodFragmentImpl extends ExecutableFragmentImpl
83328366
nextFragment = fragment;
83338367
}
83348368

8369+
@override
83358370
void addTypeParameter(TypeParameterFragmentImpl typeParameter) {
83368371
_typeParameters.add(typeParameter);
83378372
typeParameter.enclosingFragment = this;
@@ -10116,6 +10151,14 @@ class TopLevelFunctionElementImpl extends ExecutableElementImpl
1011610151
previous.addFragment(current);
1011710152
return current;
1011810153
});
10154+
TypeParameterFragmentImpl._linkFragments(
10155+
fragments,
10156+
getFragments: (f) => f.typeParameters,
10157+
);
10158+
FormalParameterFragmentImpl._linkFragments(
10159+
fragments,
10160+
getFragments: (f) => f.formalParameters,
10161+
);
1011910162
}
1012010163
}
1012110164

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

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,17 @@ class ElementBuilder {
616616
if (lastFragment is TopLevelFunctionFragmentImpl &&
617617
fragment.isAugmentation) {
618618
lastFragment.addFragment(fragment);
619+
620+
_linkTypeParameters(
621+
lastFragments: lastFragment.typeParameters,
622+
fragments: fragment.typeParameters,
623+
add: fragment.addTypeParameter,
624+
);
625+
626+
fragment.formalParameters = _linkFormalParameters(
627+
lastFragments: lastFragment.formalParameters,
628+
fragments: fragment.formalParameters,
629+
);
619630
return;
620631
}
621632

@@ -809,7 +820,82 @@ class ElementBuilder {
809820
}
810821
}
811822

812-
void _linkTypeParameters<T extends FragmentImpl>({
823+
List<FormalParameterFragmentImpl> _linkFormalParameters({
824+
required List<FormalParameterFragmentImpl> lastFragments,
825+
required List<FormalParameterFragmentImpl> fragments,
826+
}) {
827+
int getPositionalSize(List<FormalParameterFragmentImpl> fragments) {
828+
return fragments.takeWhile((f) => f.isPositional).length;
829+
}
830+
831+
FormalParameterFragmentImpl createFragment(
832+
FormalParameterFragmentImpl lastParameter,
833+
) {
834+
switch (lastParameter) {
835+
case FieldFormalParameterFragmentImpl():
836+
return FieldFormalParameterFragmentImpl(
837+
name: lastParameter.name,
838+
nameOffset: null,
839+
parameterKind: lastParameter.parameterKind,
840+
)..isSynthetic = true;
841+
case SuperFormalParameterFragmentImpl():
842+
return SuperFormalParameterFragmentImpl(
843+
name: lastParameter.name,
844+
nameOffset: null,
845+
parameterKind: lastParameter.parameterKind,
846+
)..isSynthetic = true;
847+
default:
848+
return FormalParameterFragmentImpl(
849+
name: lastParameter.name,
850+
nameOffset: null,
851+
parameterKind: lastParameter.parameterKind,
852+
)..isSynthetic = true;
853+
}
854+
}
855+
856+
var positionalSize = getPositionalSize(fragments);
857+
var positional = fragments.sublist(0, positionalSize);
858+
var named = fragments.sublist(positionalSize);
859+
860+
var lastPositionalSize = getPositionalSize(lastFragments);
861+
var lastPositional = lastFragments.sublist(0, lastPositionalSize);
862+
var lastNamed = lastFragments.sublist(lastPositionalSize);
863+
864+
// Trim extra positional parameters.
865+
if (lastPositional.length < positional.length) {
866+
positional.length = lastPositional.length;
867+
}
868+
869+
// Synthesize missing positional parameters.
870+
if (lastPositional.length > positional.length) {
871+
for (var i = positional.length; i < lastPositional.length; i++) {
872+
var lastParameter = lastPositional[i];
873+
positional.add(createFragment(lastParameter));
874+
}
875+
}
876+
877+
for (var i = 0; i < lastPositional.length; i++) {
878+
lastPositional[i].addFragment(positional[i]);
879+
}
880+
881+
var newNamed = <FormalParameterFragmentImpl>[];
882+
var namedMap = <String, FormalParameterFragmentImpl>{};
883+
for (var f in named) {
884+
namedMap[f.name!] = f;
885+
}
886+
887+
for (var lastParameter in lastNamed) {
888+
var formalParameter = namedMap[lastParameter.name];
889+
formalParameter ??= createFragment(lastParameter);
890+
891+
lastParameter.addFragment(formalParameter);
892+
newNamed.add(formalParameter);
893+
}
894+
895+
return [...positional, ...newNamed];
896+
}
897+
898+
void _linkTypeParameters({
813899
required List<TypeParameterFragmentImpl> lastFragments,
814900
required List<TypeParameterFragmentImpl> fragments,
815901
required void Function(TypeParameterFragmentImpl) add,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ class InformativeDataApplier {
412412
List<FormalParameterFragmentImpl> parameters,
413413
List<_InfoFormalParameter> infoList,
414414
) {
415+
parameters = parameters.where((p) => !p.isSynthetic).toList();
415416
forCorrespondingPairs(parameters, infoList, (element, info) {
416417
element.setCodeRange(info.codeOffset, info.codeLength);
417418
element.firstTokenOffset = info.firstTokenOffset;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,9 @@ class TypesBuilder {
382382

383383
void _simpleFormalParameter(SimpleFormalParameterImpl node) {
384384
var fragment = node.declaredFragment!;
385-
fragment.element.type = node.type?.type ?? _dynamicType;
385+
if (fragment.previousFragment == null) {
386+
fragment.element.type = node.type?.type ?? _dynamicType;
387+
}
386388
}
387389

388390
void _superFormalParameter(SuperFormalParameterImpl node) {

pkg/analyzer/test/src/summary/element_text.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,10 +758,12 @@ class _Element2Writer extends _AbstractElementWriter {
758758
// _writeNonSyntheticElement(e);
759759
// _writeFieldFormalParameterField(e);
760760
// _writeSuperConstructorParameter(e);
761+
_writeFragmentReference('previousFragment', f.previousFragment);
762+
_writeFragmentReference('nextFragment', f.nextFragment);
761763
});
762764
}
763765

764-
void _writeFragentBodyModifiers(ExecutableFragment f) {
766+
void _writeFragmentBodyModifiers(ExecutableFragment f) {
765767
if (f.isAsynchronous) {
766768
expect(f.isSynchronous, isFalse);
767769
_sink.write(' async');
@@ -1345,7 +1347,7 @@ class _Element2Writer extends _AbstractElementWriter {
13451347
// _sink.writeIf(f.isExternal, 'external ');
13461348

13471349
_writeFragmentName(f);
1348-
_writeFragentBodyModifiers(f);
1350+
_writeFragmentBodyModifiers(f);
13491351
});
13501352

13511353
_sink.withIndent(() {
@@ -1619,6 +1621,8 @@ class _Element2Writer extends _AbstractElementWriter {
16191621
_writeElementReference('element', f.element);
16201622
_writeDocumentation(f.documentationComment);
16211623
_writeMetadata(f.metadata);
1624+
_writeFragmentReference('previousFragment', f.previousFragment);
1625+
_writeFragmentReference('nextFragment', f.nextFragment);
16221626
// _writeCodeRange(e);
16231627
_writeFragmentList(
16241628
'typeParameters',

0 commit comments

Comments
 (0)