Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 3e17bbc

Browse files
authored
Use ToStringTransformer from dart frontend_server (#23915)
1 parent eb89938 commit 3e17bbc

File tree

2 files changed

+18
-101
lines changed

2 files changed

+18
-101
lines changed

flutter_frontend_server/lib/server.dart

Lines changed: 4 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import 'package:frontend_server/frontend_server.dart' as frontend
1616
listenAndCompile,
1717
argParser,
1818
usage,
19-
ProgramTransformer;
20-
import 'package:kernel/ast.dart';
19+
ProgramTransformer,
20+
ToStringTransformer;
2121
import 'package:path/path.dart' as path;
2222
import 'package:vm/incremental_compiler.dart';
2323

@@ -150,7 +150,7 @@ Future<int> starter(
150150
]);
151151
compiler ??= _FlutterFrontendCompiler(
152152
output,
153-
transformer: ToStringTransformer(null, deleteToStringPackageUris),
153+
transformer: frontend.ToStringTransformer(null, deleteToStringPackageUris),
154154
);
155155

156156
await compiler.compile(input, options);
@@ -170,7 +170,7 @@ Future<int> starter(
170170
}
171171

172172
compiler ??= _FlutterFrontendCompiler(output,
173-
transformer: ToStringTransformer(transformer, deleteToStringPackageUris),
173+
transformer: frontend.ToStringTransformer(transformer, deleteToStringPackageUris),
174174
useDebuggerModuleNames: options['debugger-module-names'] as bool,
175175
emitDebugMetadata: options['experimental-emit-debug-metadata'] as bool,
176176
unsafePackageSerialization:
@@ -184,86 +184,3 @@ Future<int> starter(
184184
frontend.listenAndCompile(compiler, input ?? stdin, options, completer);
185185
return completer.future;
186186
}
187-
188-
// Transformer/visitor for toString
189-
// If we add any more of these, they really should go into a separate library.
190-
191-
/// A [RecursiveVisitor] that replaces [Object.toString] overrides with
192-
/// `super.toString()`.
193-
class ToStringVisitor extends RecursiveVisitor<void> {
194-
/// The [packageUris] must not be null.
195-
ToStringVisitor(this._packageUris) : assert(_packageUris != null);
196-
197-
/// A set of package URIs to apply this transformer to, e.g. 'dart:ui' and
198-
/// 'package:flutter/foundation.dart'.
199-
final Set<String> _packageUris;
200-
201-
/// Turn 'dart:ui' into 'dart:ui', or
202-
/// 'package:flutter/src/semantics_event.dart' into 'package:flutter'.
203-
String _importUriToPackage(Uri importUri) => '${importUri.scheme}:${importUri.pathSegments.first}';
204-
205-
bool _isInTargetPackage(Procedure node) {
206-
return _packageUris.contains(_importUriToPackage(node.enclosingLibrary.importUri));
207-
}
208-
209-
bool _hasKeepAnnotation(Procedure node) {
210-
for (ConstantExpression expression in node.annotations.whereType<ConstantExpression>()) {
211-
if (expression.constant is! InstanceConstant) {
212-
continue;
213-
}
214-
final InstanceConstant constant = expression.constant as InstanceConstant;
215-
if (constant.classNode.name == '_KeepToString' && constant.classNode.enclosingLibrary.importUri.toString() == 'dart:ui') {
216-
return true;
217-
}
218-
}
219-
return false;
220-
}
221-
222-
@override
223-
void visitProcedure(Procedure node) {
224-
if (
225-
node.name.text == 'toString' &&
226-
node.enclosingClass != null &&
227-
node.enclosingLibrary != null &&
228-
!node.isStatic &&
229-
!node.isAbstract &&
230-
!node.enclosingClass.isEnum &&
231-
_isInTargetPackage(node) &&
232-
!_hasKeepAnnotation(node)
233-
) {
234-
node.function.body.replaceWith(
235-
ReturnStatement(
236-
SuperMethodInvocation(
237-
node.name,
238-
Arguments(<Expression>[]),
239-
),
240-
),
241-
);
242-
}
243-
}
244-
245-
@override
246-
void defaultMember(Member node) {}
247-
}
248-
249-
/// Replaces [Object.toString] overrides with calls to super for the specified
250-
/// [packageUris].
251-
class ToStringTransformer extends frontend.ProgramTransformer {
252-
/// The [packageUris] parameter must not be null, but may be empty.
253-
ToStringTransformer(this._child, this._packageUris) : assert(_packageUris != null);
254-
255-
final frontend.ProgramTransformer _child;
256-
257-
/// A set of package URIs to apply this transformer to, e.g. 'dart:ui' and
258-
/// 'package:flutter/foundation.dart'.
259-
final Set<String> _packageUris;
260-
261-
@override
262-
void transform(Component component) {
263-
assert(_child is! ToStringTransformer);
264-
if (_packageUris.isNotEmpty) {
265-
component.visitChildren(ToStringVisitor(_packageUris));
266-
}
267-
_child?.transform(component);
268-
}
269-
}

flutter_frontend_server/test/to_string_test.dart

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
import 'dart:io';
66

7-
import 'package:flutter_frontend_server/server.dart';
8-
import 'package:frontend_server/frontend_server.dart' as frontend show ProgramTransformer;
7+
import 'package:frontend_server/frontend_server.dart' as frontend
8+
show ProgramTransformer, ToStringTransformer, ToStringVisitor;
99
import 'package:kernel/kernel.dart';
1010
import 'package:mockito/mockito.dart';
1111
import 'package:path/path.dart' as path;
@@ -25,15 +25,15 @@ void main(List<String> args) async {
2525
};
2626

2727
test('No packages', () {
28-
final ToStringTransformer transformer = ToStringTransformer(null, <String>{});
28+
final frontend.ToStringTransformer transformer = frontend.ToStringTransformer(null, <String>{});
2929

3030
final MockComponent component = MockComponent();
3131
transformer.transform(component);
3232
verifyNever(component.visitChildren(any));
3333
});
3434

3535
test('dart:ui package', () {
36-
final ToStringTransformer transformer = ToStringTransformer(null, uiAndFlutter);
36+
final frontend.ToStringTransformer transformer = frontend.ToStringTransformer(null, uiAndFlutter);
3737

3838
final MockComponent component = MockComponent();
3939
transformer.transform(component);
@@ -42,7 +42,7 @@ void main(List<String> args) async {
4242

4343
test('Child transformer', () {
4444
final MockTransformer childTransformer = MockTransformer();
45-
final ToStringTransformer transformer = ToStringTransformer(childTransformer, <String>{});
45+
final frontend.ToStringTransformer transformer = frontend.ToStringTransformer(childTransformer, <String>{});
4646

4747
final MockComponent component = MockComponent();
4848
transformer.transform(component);
@@ -51,7 +51,7 @@ void main(List<String> args) async {
5151
});
5252

5353
test('ToStringVisitor ignores non-toString procedures', () {
54-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
54+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
5555
final MockProcedure procedure = MockProcedure();
5656
when(procedure.name).thenReturn(Name('main'));
5757
when(procedure.annotations).thenReturn(const <Expression>[]);
@@ -65,7 +65,7 @@ void main(List<String> args) async {
6565
//
6666
// void main() {}
6767
// String toString() => 'why?';
68-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
68+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
6969
final MockProcedure procedure = MockProcedure();
7070
final MockFunctionNode function = MockFunctionNode();
7171
final MockStatement statement = MockStatement();
@@ -84,7 +84,7 @@ void main(List<String> args) async {
8484
});
8585

8686
test('ToStringVisitor ignores abstract toString', () {
87-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
87+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
8888
final MockProcedure procedure = MockProcedure();
8989
final MockFunctionNode function = MockFunctionNode();
9090
final MockStatement statement = MockStatement();
@@ -103,7 +103,7 @@ void main(List<String> args) async {
103103
});
104104

105105
test('ToStringVisitor ignores static toString', () {
106-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
106+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
107107
final MockProcedure procedure = MockProcedure();
108108
final MockFunctionNode function = MockFunctionNode();
109109
final MockStatement statement = MockStatement();
@@ -122,7 +122,7 @@ void main(List<String> args) async {
122122
});
123123

124124
test('ToStringVisitor ignores enum toString', () {
125-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
125+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
126126
final MockProcedure procedure = MockProcedure();
127127
final MockFunctionNode function = MockFunctionNode();
128128
final MockStatement statement = MockStatement();
@@ -141,7 +141,7 @@ void main(List<String> args) async {
141141
});
142142

143143
test('ToStringVisitor ignores non-specified libraries', () {
144-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
144+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
145145
final MockProcedure procedure = MockProcedure();
146146
final MockFunctionNode function = MockFunctionNode();
147147
final MockStatement statement = MockStatement();
@@ -160,7 +160,7 @@ void main(List<String> args) async {
160160
});
161161

162162
test('ToStringVisitor ignores @keepToString', () {
163-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
163+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
164164
final MockProcedure procedure = MockProcedure();
165165
final MockFunctionNode function = MockFunctionNode();
166166
final MockStatement statement = MockStatement();
@@ -198,7 +198,7 @@ void main(List<String> args) async {
198198
}
199199

200200
test('ToStringVisitor replaces toString in specified libraries (dart:ui)', () {
201-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
201+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
202202
final MockProcedure procedure = MockProcedure();
203203
final MockFunctionNode function = MockFunctionNode();
204204
final MockStatement statement = MockStatement();
@@ -219,7 +219,7 @@ void main(List<String> args) async {
219219
});
220220

221221
test('ToStringVisitor replaces toString in specified libraries (package:flutter)', () {
222-
final ToStringVisitor visitor = ToStringVisitor(uiAndFlutter);
222+
final frontend.ToStringVisitor visitor = frontend.ToStringVisitor(uiAndFlutter);
223223
final MockProcedure procedure = MockProcedure();
224224
final MockFunctionNode function = MockFunctionNode();
225225
final MockStatement statement = MockStatement();

0 commit comments

Comments
 (0)