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

Commit 5437073

Browse files
DanTupCommit Queue
authored andcommitted
[analysis_server] Change Flutter snippets to use Placeholder
Using empty Container() can trigger lints and "const Placeholder()" is preferred. See discussion in Dart-Code/Dart-Code#3975 (comment). Fixes Dart-Code/Dart-Code#4136. Change-Id: I453f34f157f5667427403f2c0b9058f236895d6b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/268320 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
1 parent 87cb9a6 commit 5437073

File tree

7 files changed

+82
-49
lines changed

7 files changed

+82
-49
lines changed

pkg/analysis_server/lib/src/services/snippets/snippet_producer.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ abstract class FlutterSnippetProducer extends DartSnippetProducer {
4848
final flutter = Flutter.instance;
4949

5050
late ClassElement? classWidget;
51-
late ClassElement? classContainer;
51+
late ClassElement? classPlaceholder;
5252

5353
FlutterSnippetProducer(super.request);
5454

@@ -74,7 +74,7 @@ abstract class FlutterSnippetProducer extends DartSnippetProducer {
7474
return false;
7575
}
7676

77-
if ((classContainer = await getClass('Container')) == null) {
77+
if ((classPlaceholder = await getClass('Placeholder')) == null) {
7878
return false;
7979
}
8080

@@ -93,7 +93,7 @@ mixin FlutterWidgetSnippetProducerMixin on FlutterSnippetProducer {
9393
// Checked by isValid() before this will be called.
9494
final classBuildContext = this.classBuildContext!;
9595
final classWidget = this.classWidget!;
96-
final classContainer = this.classContainer!;
96+
final classPlaceholder = this.classPlaceholder!;
9797

9898
// Add the build method.
9999
builder.writeln(' @override');
@@ -111,7 +111,8 @@ mixin FlutterWidgetSnippetProducerMixin on FlutterSnippetProducer {
111111
builder.writeln('{');
112112
builder.write(' return ');
113113
builder.selectAll(() {
114-
builder.writeType(getType(classContainer));
114+
builder.write('const ');
115+
builder.writeType(getType(classPlaceholder));
115116
builder.write('()');
116117
});
117118
builder.writeln(';');

pkg/analysis_server/test/lsp/completion_dart_test.dart

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ class _MyWidgetState extends State<MyWidget> {
486486
@override
487487
Widget build(BuildContext context) {
488488
[[setSt^]]
489-
return Container();
489+
return const Placeholder();
490490
}
491491
}
492492
''';
@@ -1156,7 +1156,7 @@ final a = Stri^
11561156
@override
11571157
Widget build(BuildContext context) {
11581158
[[setSt^]]
1159-
return Container();
1159+
return const Placeholder();
11601160
}
11611161
}
11621162
''';
@@ -1455,7 +1455,7 @@ void f(String a, {String? b}) {
14551455
@override
14561456
Widget build(BuildContext context) {
14571457
[[setSt^]]
1458-
return Container();
1458+
return const Placeholder();
14591459
}
14601460
}
14611461
''';
@@ -3450,8 +3450,8 @@ void f() {
34503450
class FlutterSnippetCompletionTest extends SnippetCompletionTest {
34513451
/// Standard import statements expected for basic Widgets.
34523452
String get expectedImports => '''
3453-
import 'package:flutter/src/widgets/container.dart';
3454-
import 'package:flutter/src/widgets/framework.dart';''';
3453+
import 'package:flutter/src/widgets/framework.dart';
3454+
import 'package:flutter/src/widgets/placeholder.dart';''';
34553455

34563456
/// Nullability suffix expected in this test class.
34573457
///
@@ -3505,7 +3505,7 @@ class \${1:MyWidget} extends StatefulWidget {
35053505
class _\${1:MyWidget}State extends State<\${1:MyWidget}> {
35063506
@override
35073507
Widget build(BuildContext context) {
3508-
return \${0:Container()};
3508+
return \${0:const Placeholder()};
35093509
}
35103510
}
35113511
@@ -3561,7 +3561,7 @@ class _\${1:MyWidget}State extends State<\${1:MyWidget}>
35613561
35623562
@override
35633563
Widget build(BuildContext context) {
3564-
return \${0:Container()};
3564+
return \${0:const Placeholder()};
35653565
}
35663566
}
35673567
@@ -3597,7 +3597,7 @@ class \${1:MyWidget} extends StatelessWidget {
35973597
35983598
@override
35993599
Widget build(BuildContext context) {
3600-
return \${0:Container()};
3600+
return \${0:const Placeholder()};
36013601
}
36023602
}
36033603
@@ -3631,7 +3631,7 @@ class \${1:MyWidget} extends StatelessWidget {
36313631
36323632
@override
36333633
Widget build(BuildContext context) {
3634-
return \${0:Container()};
3634+
return \${0:const Placeholder()};
36353635
}
36363636
}
36373637
@@ -3659,7 +3659,7 @@ class \${1:MyWidget} extends StatelessWidget {
36593659
36603660
@override
36613661
Widget build(BuildContext context) {
3662-
return \${0:Container()};
3662+
return \${0:const Placeholder()};
36633663
}
36643664
}
36653665
''');
@@ -3685,7 +3685,7 @@ class \${1:MyWidget} extends StatelessWidget {
36853685
36863686
@override
36873687
Widget build(BuildContext context) {
3688-
return \${0:Container()};
3688+
return \${0:const Placeholder()};
36893689
}
36903690
}
36913691
''');
@@ -3727,8 +3727,8 @@ class FlutterSnippetCompletionWithoutNullSafetyTest
37273727
@override
37283728
String get expectedImports => '''
37293729
import 'package:flutter/src/foundation/key.dart';
3730-
import 'package:flutter/src/widgets/container.dart';
3731-
import 'package:flutter/src/widgets/framework.dart';''';
3730+
import 'package:flutter/src/widgets/framework.dart';
3731+
import 'package:flutter/src/widgets/placeholder.dart';''';
37323732

37333733
@override
37343734
String get expectedNullableSuffix => '';
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright 2014 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'package:flutter/foundation.dart';
6+
7+
import 'basic.dart';
8+
import 'framework.dart';
9+
10+
class Placeholder extends StatelessWidget {
11+
const Placeholder(
12+
{super.key,
13+
this.color = const Color(0xFF455A64), // Blue Grey 700
14+
this.strokeWidth = 2.0,
15+
this.fallbackWidth = 400.0,
16+
this.fallbackHeight = 400.0,
17+
this.child});
18+
19+
final Color color;
20+
21+
final double strokeWidth;
22+
23+
final double fallbackWidth;
24+
25+
final double fallbackHeight;
26+
27+
final Widget? child;
28+
29+
@override
30+
Widget build(BuildContext context) => child!;
31+
}

pkg/analysis_server/test/mock_packages/flutter/lib/widgets.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ export 'src/widgets/container.dart';
88
export 'src/widgets/framework.dart';
99
export 'src/widgets/gesture_detector.dart';
1010
export 'src/widgets/icon.dart';
11+
export 'src/widgets/placeholder.dart';
1112
export 'src/widgets/ticker_provider.dart';
1213
export 'src/widgets/text.dart';

pkg/analysis_server/test/services/snippets/dart/flutter_stateful_widget_test.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ class FlutterStatefulWidgetTest extends FlutterSnippetProducerTest {
3939
}
4040
expect(code, '''
4141
import 'package:flutter/src/foundation/key.dart';
42-
import 'package:flutter/src/widgets/container.dart';
4342
import 'package:flutter/src/widgets/framework.dart';
43+
import 'package:flutter/src/widgets/placeholder.dart';
4444
4545
class MyWidget extends StatefulWidget {
4646
const MyWidget({Key? key}) : super(key: key);
@@ -52,7 +52,7 @@ class MyWidget extends StatefulWidget {
5252
class _MyWidgetState extends State<MyWidget> {
5353
@override
5454
Widget build(BuildContext context) {
55-
return Container();
55+
return const Placeholder();
5656
}
5757
}''');
5858
}
@@ -75,8 +75,8 @@ class _MyWidgetState extends State<MyWidget> {
7575
code = SourceEdit.applySequence(code, edit.edits);
7676
}
7777
expect(code, '''
78-
import 'package:flutter/src/widgets/container.dart';
7978
import 'package:flutter/src/widgets/framework.dart';
79+
import 'package:flutter/src/widgets/placeholder.dart';
8080
8181
class MyWidget extends StatefulWidget {
8282
const MyWidget({super.key});
@@ -88,21 +88,21 @@ class MyWidget extends StatefulWidget {
8888
class _MyWidgetState extends State<MyWidget> {
8989
@override
9090
Widget build(BuildContext context) {
91-
return Container();
91+
return const Placeholder();
9292
}
9393
}''');
9494
expect(snippet.change.selection!.file, testFile);
95-
expect(snippet.change.selection!.offset, 356);
96-
expect(snippet.change.selectionLength, 11);
95+
expect(snippet.change.selection!.offset, 358);
96+
expect(snippet.change.selectionLength, 19);
9797
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
9898
{
9999
'positions': [
100-
{'file': testFile, 'offset': 113},
101-
{'file': testFile, 'offset': 155},
102-
{'file': testFile, 'offset': 199},
103-
{'file': testFile, 'offset': 227},
104-
{'file': testFile, 'offset': 254},
105-
{'file': testFile, 'offset': 282},
100+
{'file': testFile, 'offset': 115},
101+
{'file': testFile, 'offset': 157},
102+
{'file': testFile, 'offset': 201},
103+
{'file': testFile, 'offset': 229},
104+
{'file': testFile, 'offset': 256},
105+
{'file': testFile, 'offset': 284},
106106
],
107107
'length': 8,
108108
'suggestions': []

pkg/analysis_server/test/services/snippets/dart/flutter_stateful_widget_with_animation_controller_test.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ class FlutterStatefulWidgetWithAnimationControllerTest
4141
expect(code, '''
4242
import 'package:flutter/src/animation/animation_controller.dart';
4343
import 'package:flutter/src/foundation/key.dart';
44-
import 'package:flutter/src/widgets/container.dart';
4544
import 'package:flutter/src/widgets/framework.dart';
45+
import 'package:flutter/src/widgets/placeholder.dart';
4646
import 'package:flutter/src/widgets/ticker_provider.dart';
4747
4848
class MyWidget extends StatefulWidget {
@@ -70,7 +70,7 @@ class _MyWidgetState extends State<MyWidget>
7070
7171
@override
7272
Widget build(BuildContext context) {
73-
return Container();
73+
return const Placeholder();
7474
}
7575
}''');
7676
}
@@ -94,8 +94,8 @@ class _MyWidgetState extends State<MyWidget>
9494
}
9595
expect(code, '''
9696
import 'package:flutter/src/animation/animation_controller.dart';
97-
import 'package:flutter/src/widgets/container.dart';
9897
import 'package:flutter/src/widgets/framework.dart';
98+
import 'package:flutter/src/widgets/placeholder.dart';
9999
import 'package:flutter/src/widgets/ticker_provider.dart';
100100
101101
class MyWidget extends StatefulWidget {
@@ -123,21 +123,21 @@ class _MyWidgetState extends State<MyWidget>
123123
124124
@override
125125
Widget build(BuildContext context) {
126-
return Container();
126+
return const Placeholder();
127127
}
128128
}''');
129129
expect(snippet.change.selection!.file, testFile);
130-
expect(snippet.change.selection!.offset, 759);
131-
expect(snippet.change.selectionLength, 11);
130+
expect(snippet.change.selection!.offset, 761);
131+
expect(snippet.change.selectionLength, 19);
132132
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
133133
{
134134
'positions': [
135-
{'file': testFile, 'offset': 238},
136-
{'file': testFile, 'offset': 280},
137-
{'file': testFile, 'offset': 324},
138-
{'file': testFile, 'offset': 352},
139-
{'file': testFile, 'offset': 379},
140-
{'file': testFile, 'offset': 407},
135+
{'file': testFile, 'offset': 240},
136+
{'file': testFile, 'offset': 282},
137+
{'file': testFile, 'offset': 326},
138+
{'file': testFile, 'offset': 354},
139+
{'file': testFile, 'offset': 381},
140+
{'file': testFile, 'offset': 409},
141141
],
142142
'length': 8,
143143
'suggestions': []

pkg/analysis_server/test/services/snippets/dart/flutter_stateless_widget_test.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ class FlutterStatelessWidgetTest extends FlutterSnippetProducerTest {
3939
}
4040
expect(code, '''
4141
import 'package:flutter/src/foundation/key.dart';
42-
import 'package:flutter/src/widgets/container.dart';
4342
import 'package:flutter/src/widgets/framework.dart';
43+
import 'package:flutter/src/widgets/placeholder.dart';
4444
4545
class MyWidget extends StatelessWidget {
4646
const MyWidget({Key? key}) : super(key: key);
4747
4848
@override
4949
Widget build(BuildContext context) {
50-
return Container();
50+
return const Placeholder();
5151
}
5252
}''');
5353
}
@@ -70,25 +70,25 @@ class MyWidget extends StatelessWidget {
7070
code = SourceEdit.applySequence(code, edit.edits);
7171
}
7272
expect(code, '''
73-
import 'package:flutter/src/widgets/container.dart';
7473
import 'package:flutter/src/widgets/framework.dart';
74+
import 'package:flutter/src/widgets/placeholder.dart';
7575
7676
class MyWidget extends StatelessWidget {
7777
const MyWidget({super.key});
7878
7979
@override
8080
Widget build(BuildContext context) {
81-
return Container();
81+
return const Placeholder();
8282
}
8383
}''');
8484
expect(snippet.change.selection!.file, testFile);
85-
expect(snippet.change.selection!.offset, 242);
86-
expect(snippet.change.selectionLength, 11);
85+
expect(snippet.change.selection!.offset, 244);
86+
expect(snippet.change.selectionLength, 19);
8787
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
8888
{
8989
'positions': [
90-
{'file': testFile, 'offset': 113},
91-
{'file': testFile, 'offset': 156},
90+
{'file': testFile, 'offset': 115},
91+
{'file': testFile, 'offset': 158},
9292
],
9393
'length': 8,
9494
'suggestions': []

0 commit comments

Comments
 (0)