Skip to content

Commit 46ea7ad

Browse files
scheglovCommit Queue
authored and
Commit Queue
committed
Extract TypeAnnotationLocationWriter / Reader into separate library.
I plan using it to implement serialization of MacroExecutionResult(s). Bug: dart-lang/language#3877 Change-Id: I34d95ab6fd2c335ceb2a957c9222947b85e986a1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/369841 Reviewed-by: Phil Quitslund <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 4227074 commit 46ea7ad

File tree

5 files changed

+137
-98
lines changed

5 files changed

+137
-98
lines changed

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -150,18 +150,6 @@ class Tag {
150150
static const int VoidType = 12;
151151
}
152152

153-
enum TypeAnnotationLocationKind {
154-
aliasedType,
155-
element,
156-
extendsClause,
157-
formalParameter,
158-
listIndex,
159-
recordNamedField,
160-
recordPositionalField,
161-
returnType,
162-
variableType,
163-
}
164-
165153
enum TypeParameterVarianceTag {
166154
legacy,
167155
unrelated,

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

Lines changed: 5 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import 'package:analyzer/src/summary2/export.dart';
2828
import 'package:analyzer/src/summary2/informative_data.dart';
2929
import 'package:analyzer/src/summary2/linked_element_factory.dart';
3030
import 'package:analyzer/src/summary2/macro_application_error.dart';
31-
import 'package:analyzer/src/summary2/macro_type_location.dart';
31+
import 'package:analyzer/src/summary2/macro_type_location_storage.dart';
3232
import 'package:analyzer/src/summary2/reference.dart';
3333
import 'package:analyzer/src/task/inference_error.dart';
3434
import 'package:analyzer/src/utilities/extensions/collection.dart';
@@ -2423,49 +2423,6 @@ class ResolutionReader {
24232423
MacroDiagnosticMessage _readMacroDiagnosticMessage() {
24242424
var message = _reader.readStringUtf8();
24252425

2426-
TypeAnnotationLocation readTypeAnnotationLocation() {
2427-
var kind = readEnum(TypeAnnotationLocationKind.values);
2428-
switch (kind) {
2429-
case TypeAnnotationLocationKind.aliasedType:
2430-
var parent = readTypeAnnotationLocation();
2431-
return AliasedTypeLocation(parent);
2432-
case TypeAnnotationLocationKind.element:
2433-
var element = readElement()!;
2434-
return ElementTypeLocation(element);
2435-
case TypeAnnotationLocationKind.extendsClause:
2436-
var parent = readTypeAnnotationLocation();
2437-
return ExtendsClauseTypeLocation(parent);
2438-
case TypeAnnotationLocationKind.formalParameter:
2439-
return FormalParameterTypeLocation(
2440-
readTypeAnnotationLocation(),
2441-
readUInt30(),
2442-
);
2443-
case TypeAnnotationLocationKind.listIndex:
2444-
return ListIndexTypeLocation(
2445-
readTypeAnnotationLocation(),
2446-
readUInt30(),
2447-
);
2448-
case TypeAnnotationLocationKind.recordNamedField:
2449-
return RecordNamedFieldTypeLocation(
2450-
readTypeAnnotationLocation(),
2451-
readUInt30(),
2452-
);
2453-
case TypeAnnotationLocationKind.recordPositionalField:
2454-
return RecordPositionalFieldTypeLocation(
2455-
readTypeAnnotationLocation(),
2456-
readUInt30(),
2457-
);
2458-
case TypeAnnotationLocationKind.returnType:
2459-
var parent = readTypeAnnotationLocation();
2460-
return ReturnTypeLocation(parent);
2461-
case TypeAnnotationLocationKind.variableType:
2462-
var parent = readTypeAnnotationLocation();
2463-
return VariableTypeLocation(parent);
2464-
default:
2465-
throw UnimplementedError('kind: $kind');
2466-
}
2467-
}
2468-
24692426
MacroDiagnosticTarget target;
24702427
var targetKind = readEnum(MacroDiagnosticTargetKind.values);
24712428
switch (targetKind) {
@@ -2485,7 +2442,10 @@ class ResolutionReader {
24852442
annotationIndex: readUInt30(),
24862443
);
24872444
case MacroDiagnosticTargetKind.type:
2488-
var location = readTypeAnnotationLocation();
2445+
var location = TypeAnnotationLocationReader(
2446+
reader: _reader,
2447+
readElement: readElement,
2448+
).read();
24892449
target = TypeAnnotationMacroDiagnosticTarget(location: location);
24902450
}
24912451

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

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import 'package:analyzer/src/summary2/data_writer.dart';
2323
import 'package:analyzer/src/summary2/element_flags.dart';
2424
import 'package:analyzer/src/summary2/export.dart';
2525
import 'package:analyzer/src/summary2/macro_application_error.dart';
26-
import 'package:analyzer/src/summary2/macro_type_location.dart';
26+
import 'package:analyzer/src/summary2/macro_type_location_storage.dart';
2727
import 'package:analyzer/src/summary2/reference.dart';
2828
import 'package:analyzer/src/task/inference_error.dart';
2929

@@ -1024,45 +1024,6 @@ class ResolutionSink extends _SummaryDataWriter {
10241024
void _writeMacroDiagnosticMessage(MacroDiagnosticMessage object) {
10251025
writeStringUtf8(object.message);
10261026

1027-
void writeTypeAnnotationLocation(TypeAnnotationLocation location) {
1028-
switch (location) {
1029-
case AliasedTypeLocation():
1030-
writeEnum(TypeAnnotationLocationKind.aliasedType);
1031-
writeTypeAnnotationLocation(location.parent);
1032-
case ElementTypeLocation():
1033-
writeEnum(TypeAnnotationLocationKind.element);
1034-
writeElement(location.element);
1035-
case ExtendsClauseTypeLocation():
1036-
writeEnum(TypeAnnotationLocationKind.extendsClause);
1037-
writeTypeAnnotationLocation(location.parent);
1038-
case FormalParameterTypeLocation():
1039-
writeEnum(TypeAnnotationLocationKind.formalParameter);
1040-
writeTypeAnnotationLocation(location.parent);
1041-
writeUInt30(location.index);
1042-
case ListIndexTypeLocation():
1043-
writeEnum(TypeAnnotationLocationKind.listIndex);
1044-
writeTypeAnnotationLocation(location.parent);
1045-
writeUInt30(location.index);
1046-
case RecordNamedFieldTypeLocation():
1047-
writeEnum(TypeAnnotationLocationKind.recordNamedField);
1048-
writeTypeAnnotationLocation(location.parent);
1049-
writeUInt30(location.index);
1050-
case RecordPositionalFieldTypeLocation():
1051-
writeEnum(TypeAnnotationLocationKind.recordPositionalField);
1052-
writeTypeAnnotationLocation(location.parent);
1053-
writeUInt30(location.index);
1054-
case ReturnTypeLocation():
1055-
writeEnum(TypeAnnotationLocationKind.returnType);
1056-
writeTypeAnnotationLocation(location.parent);
1057-
case VariableTypeLocation():
1058-
writeEnum(TypeAnnotationLocationKind.variableType);
1059-
writeTypeAnnotationLocation(location.parent);
1060-
default:
1061-
// TODO(scheglov): Handle this case.
1062-
throw UnimplementedError('${location.runtimeType}');
1063-
}
1064-
}
1065-
10661027
var target = object.target;
10671028
switch (target) {
10681029
case ApplicationMacroDiagnosticTarget():
@@ -1077,7 +1038,10 @@ class ResolutionSink extends _SummaryDataWriter {
10771038
writeUInt30(target.annotationIndex);
10781039
case TypeAnnotationMacroDiagnosticTarget():
10791040
writeEnum(MacroDiagnosticTargetKind.type);
1080-
writeTypeAnnotationLocation(target.location);
1041+
TypeAnnotationLocationWriter(
1042+
sink: this,
1043+
writeElement: writeElement,
1044+
).write(target.location);
10811045
}
10821046
}
10831047

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ class BufferedSink {
149149
}
150150
}
151151

152+
/// Writes [items], converts to [List] first.
153+
void writeIterable<T>(Iterable<T> items, void Function(T x) writeItem) {
154+
writeList(items.toList(), writeItem);
155+
}
156+
152157
void writeList<T>(List<T> items, void Function(T x) writeItem) {
153158
writeUInt30(items.length);
154159
for (var i = 0; i < items.length; i++) {
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
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.
4+
5+
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:analyzer/src/summary2/data_reader.dart';
7+
import 'package:analyzer/src/summary2/data_writer.dart';
8+
import 'package:analyzer/src/summary2/macro_type_location.dart';
9+
10+
class TypeAnnotationLocationReader {
11+
final SummaryDataReader reader;
12+
final Element? Function() readElement;
13+
14+
TypeAnnotationLocationReader({
15+
required this.reader,
16+
required this.readElement,
17+
});
18+
19+
TypeAnnotationLocation read() {
20+
var kind = reader.readEnum(_LocationKind.values);
21+
switch (kind) {
22+
case _LocationKind.aliasedType:
23+
var parent = read();
24+
return AliasedTypeLocation(parent);
25+
case _LocationKind.element:
26+
var element = readElement()!;
27+
return ElementTypeLocation(element);
28+
case _LocationKind.extendsClause:
29+
var parent = read();
30+
return ExtendsClauseTypeLocation(parent);
31+
case _LocationKind.formalParameter:
32+
return FormalParameterTypeLocation(
33+
read(),
34+
reader.readUInt30(),
35+
);
36+
case _LocationKind.listIndex:
37+
return ListIndexTypeLocation(
38+
read(),
39+
reader.readUInt30(),
40+
);
41+
case _LocationKind.recordNamedField:
42+
return RecordNamedFieldTypeLocation(
43+
read(),
44+
reader.readUInt30(),
45+
);
46+
case _LocationKind.recordPositionalField:
47+
return RecordPositionalFieldTypeLocation(
48+
read(),
49+
reader.readUInt30(),
50+
);
51+
case _LocationKind.returnType:
52+
var parent = read();
53+
return ReturnTypeLocation(parent);
54+
case _LocationKind.variableType:
55+
var parent = read();
56+
return VariableTypeLocation(parent);
57+
default:
58+
throw UnimplementedError('kind: $kind');
59+
}
60+
}
61+
}
62+
63+
class TypeAnnotationLocationWriter {
64+
final BufferedSink sink;
65+
final void Function(Element element) writeElement;
66+
67+
TypeAnnotationLocationWriter({
68+
required this.sink,
69+
required this.writeElement,
70+
});
71+
72+
void write(TypeAnnotationLocation location) {
73+
switch (location) {
74+
case AliasedTypeLocation():
75+
sink.writeEnum(_LocationKind.aliasedType);
76+
write(location.parent);
77+
case ElementTypeLocation():
78+
sink.writeEnum(_LocationKind.element);
79+
writeElement(location.element);
80+
case ExtendsClauseTypeLocation():
81+
sink.writeEnum(_LocationKind.extendsClause);
82+
write(location.parent);
83+
case FormalParameterTypeLocation():
84+
sink.writeEnum(_LocationKind.formalParameter);
85+
write(location.parent);
86+
sink.writeUInt30(location.index);
87+
case ListIndexTypeLocation():
88+
sink.writeEnum(_LocationKind.listIndex);
89+
write(location.parent);
90+
sink.writeUInt30(location.index);
91+
case RecordNamedFieldTypeLocation():
92+
sink.writeEnum(_LocationKind.recordNamedField);
93+
write(location.parent);
94+
sink.writeUInt30(location.index);
95+
case RecordPositionalFieldTypeLocation():
96+
sink.writeEnum(_LocationKind.recordPositionalField);
97+
write(location.parent);
98+
sink.writeUInt30(location.index);
99+
case ReturnTypeLocation():
100+
sink.writeEnum(_LocationKind.returnType);
101+
write(location.parent);
102+
case VariableTypeLocation():
103+
sink.writeEnum(_LocationKind.variableType);
104+
write(location.parent);
105+
default:
106+
// TODO(scheglov): Handle this case.
107+
throw UnimplementedError('${location.runtimeType}');
108+
}
109+
}
110+
}
111+
112+
enum _LocationKind {
113+
aliasedType,
114+
element,
115+
extendsClause,
116+
formalParameter,
117+
listIndex,
118+
recordNamedField,
119+
recordPositionalField,
120+
returnType,
121+
variableType,
122+
}

0 commit comments

Comments
 (0)