Skip to content

Commit a65aa7e

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Issue 46064. Support for metadata in aliased GenericFunctionType type / formal parameters.
Bug: #46064 Change-Id: Ibfd8be2df3bc999706fccbaf69554a4d956cc4e0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/200564 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent b8f4b25 commit a65aa7e

File tree

5 files changed

+155
-10
lines changed

5 files changed

+155
-10
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ import 'package:meta/meta.dart';
8080
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
8181
class AnalysisDriver implements AnalysisDriverGeneric {
8282
/// The version of data format, should be incremented on every format change.
83-
static const int DATA_VERSION = 137;
83+
static const int DATA_VERSION = 138;
8484

8585
/// The length of the list returned by [_computeDeclaredVariablesSignature].
8686
static const int _declaredVariablesSignatureLength = 4;

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,7 +1457,7 @@ class ResolutionReader {
14571457
if (tag == AliasedElementTag.nothing) {
14581458
return null;
14591459
} else if (tag == AliasedElementTag.genericFunctionElement) {
1460-
var typeParameters = _readTypeParameters();
1460+
var typeParameters = _readTypeParameters(unitElement);
14611461
var formalParameters = _readFormalParameters(unitElement);
14621462
var returnType = readRequiredType();
14631463

@@ -1536,7 +1536,7 @@ class ResolutionReader {
15361536
var kindIndex = _reader.readByte();
15371537
var kind = _formalParameterKind(kindIndex);
15381538
var isInitializingFormal = _reader.readBool();
1539-
var typeParameters = _readTypeParameters();
1539+
var typeParameters = _readTypeParameters(unitElement);
15401540
var type = readRequiredType();
15411541
var name = readStringReference();
15421542
if (kind.isRequiredPositional) {
@@ -1577,7 +1577,7 @@ class ResolutionReader {
15771577
/// TODO(scheglov) Optimize for write/read of types without type parameters.
15781578
FunctionType _readFunctionType() {
15791579
// TODO(scheglov) reuse for formal parameters
1580-
var typeParameters = _readTypeParameters();
1580+
var typeParameters = _readTypeParameters(null);
15811581
var returnType = readRequiredType();
15821582
var formalParameters = _readFormalParameters(null);
15831583

@@ -1666,7 +1666,9 @@ class ResolutionReader {
16661666
return types;
16671667
}
16681668

1669-
List<TypeParameterElementImpl> _readTypeParameters() {
1669+
List<TypeParameterElementImpl> _readTypeParameters(
1670+
CompilationUnitElementImpl? unitElement,
1671+
) {
16701672
var typeParameterCount = _reader.readUInt30();
16711673
var typeParameters = List.generate(typeParameterCount, (_) {
16721674
var name = readStringReference();
@@ -1677,6 +1679,9 @@ class ResolutionReader {
16771679

16781680
for (var typeParameter in typeParameters) {
16791681
typeParameter.bound = readType();
1682+
if (unitElement != null) {
1683+
typeParameter.metadata = _readAnnotationList(unitElement: unitElement);
1684+
}
16801685
}
16811686
return typeParameters;
16821687
}

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ class ResolutionSink extends _SummaryDataWriter {
630630
_writeTypeParameters(element.typeParameters, () {
631631
_writeFormalParameters(element.parameters, withAnnotations: true);
632632
writeType(element.returnType);
633-
});
633+
}, withAnnotations: true);
634634
} else {
635635
throw UnimplementedError('${element.runtimeType}');
636636
}
@@ -665,7 +665,7 @@ class ResolutionSink extends _SummaryDataWriter {
665665
parameter.parameters,
666666
withAnnotations: withAnnotations,
667667
);
668-
});
668+
}, withAnnotations: withAnnotations);
669669
if (withAnnotations) {
670670
_writeAnnotationList(parameter.metadata);
671671
}
@@ -680,7 +680,7 @@ class ResolutionSink extends _SummaryDataWriter {
680680
_writeTypeParameters(type.typeFormals, () {
681681
writeType(type.returnType);
682682
_writeFormalParameters(type.parameters, withAnnotations: false);
683-
});
683+
}, withAnnotations: false);
684684
_writeNullabilitySuffix(type.nullabilitySuffix);
685685
}
686686

@@ -736,8 +736,9 @@ class ResolutionSink extends _SummaryDataWriter {
736736

737737
void _writeTypeParameters(
738738
List<TypeParameterElement> typeParameters,
739-
void Function() f,
740-
) {
739+
void Function() f, {
740+
required bool withAnnotations,
741+
}) {
741742
localElements.pushScope();
742743
localElements.declareAll(typeParameters);
743744
try {
@@ -747,6 +748,9 @@ class ResolutionSink extends _SummaryDataWriter {
747748
}
748749
for (var typeParameter in typeParameters) {
749750
writeType(typeParameter.bound);
751+
if (withAnnotations) {
752+
_writeAnnotationList(typeParameter.metadata);
753+
}
750754
}
751755
f();
752756
} finally {

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,21 @@ class _ElementWriter {
10841084
}
10851085

10861086
buffer.writeln(';');
1087+
1088+
if (withFullyResolvedAst) {
1089+
_withIndent(() {
1090+
_writeResolvedMetadata(e.metadata);
1091+
_writeResolvedTypeParameters(e.typeParameters);
1092+
var aliasedElement = e.aliasedElement;
1093+
if (aliasedElement is GenericFunctionTypeElement) {
1094+
_writelnWithIndent('aliasedElement');
1095+
_withIndent(() {
1096+
_writeResolvedTypeParameters(aliasedElement.typeParameters);
1097+
_writeResolvedParameterElements(aliasedElement.parameters);
1098+
});
1099+
}
1100+
});
1101+
}
10871102
}
10881103

10891104
void writeTypeInferenceError(Element e) {
@@ -1319,6 +1334,37 @@ class _ElementWriter {
13191334
);
13201335
}
13211336

1337+
void _writeResolvedParameterElements(
1338+
List<ParameterElement> parameters, {
1339+
String enclosingNames = '',
1340+
}) {
1341+
if (parameters.isNotEmpty) {
1342+
_writelnWithIndent('parameters');
1343+
_withIndent(() {
1344+
var index = 0;
1345+
for (var formalParameter in parameters) {
1346+
var metadata = formalParameter.metadata;
1347+
var name = formalParameter.name;
1348+
if (name.isEmpty) {
1349+
name = '$index';
1350+
}
1351+
_writelnWithIndent(name);
1352+
_withIndent(() {
1353+
_writeResolvedMetadata(metadata);
1354+
var subParameters = formalParameter.parameters;
1355+
_withIndent(() {
1356+
_writeResolvedParameterElements(
1357+
subParameters,
1358+
enclosingNames: enclosingNames + name + '::',
1359+
);
1360+
});
1361+
});
1362+
index++;
1363+
}
1364+
});
1365+
}
1366+
}
1367+
13221368
void _writeResolvedTypeParameters(List<TypeParameterElement> elements) {
13231369
if (elements.isNotEmpty) {
13241370
_writelnWithIndent('typeParameters');

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

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11054,6 +11054,96 @@ const int a;
1105411054
withFullyResolvedAst: true);
1105511055
}
1105611056

11057+
test_metadata_inAliasedElement_formalParameter() async {
11058+
var library = await checkLibrary('''
11059+
const a = 42;
11060+
typedef F = void Function(@a int first)
11061+
''');
11062+
checkElementText(
11063+
library,
11064+
r'''
11065+
typedef F = void Function(int first);
11066+
aliasedElement
11067+
parameters
11068+
first
11069+
metadata
11070+
Annotation
11071+
element: self::@getter::a
11072+
name: SimpleIdentifier
11073+
staticElement: self::@getter::a
11074+
staticType: null
11075+
token: a
11076+
const int a;
11077+
constantInitializer
11078+
IntegerLiteral
11079+
literal: 42
11080+
staticType: int
11081+
''',
11082+
withFullyResolvedAst: true);
11083+
}
11084+
11085+
test_metadata_inAliasedElement_formalParameter2() async {
11086+
var library = await checkLibrary('''
11087+
const a = 42;
11088+
typedef F = void Function(int foo(@a int bar))
11089+
''');
11090+
checkElementText(
11091+
library,
11092+
r'''
11093+
typedef F = void Function(int Function(int) foo);
11094+
aliasedElement
11095+
parameters
11096+
foo
11097+
parameters
11098+
bar
11099+
metadata
11100+
Annotation
11101+
element: self::@getter::a
11102+
name: SimpleIdentifier
11103+
staticElement: self::@getter::a
11104+
staticType: null
11105+
token: a
11106+
const int a;
11107+
constantInitializer
11108+
IntegerLiteral
11109+
literal: 42
11110+
staticType: int
11111+
''',
11112+
withFullyResolvedAst: true);
11113+
}
11114+
11115+
test_metadata_inAliasedElement_typeParameter() async {
11116+
var library = await checkLibrary('''
11117+
const a = 42;
11118+
typedef F = void Function<@a T>(int first)
11119+
''');
11120+
checkElementText(
11121+
library,
11122+
r'''
11123+
typedef F = void Function(int first);
11124+
aliasedElement
11125+
typeParameters
11126+
T
11127+
bound: null
11128+
defaultType: null
11129+
metadata
11130+
Annotation
11131+
element: self::@getter::a
11132+
name: SimpleIdentifier
11133+
staticElement: self::@getter::a
11134+
staticType: null
11135+
token: a
11136+
parameters
11137+
first
11138+
const int a;
11139+
constantInitializer
11140+
IntegerLiteral
11141+
literal: 42
11142+
staticType: int
11143+
''',
11144+
withFullyResolvedAst: true);
11145+
}
11146+
1105711147
test_metadata_invalid_classDeclaration() async {
1105811148
var library = await checkLibrary('f(_) {} @f(42) class C {}');
1105911149
checkElementText(library, r'''

0 commit comments

Comments
 (0)