[analysis_server] Include placeholder Container() in Flutter snippet build methods

Fixes https://github.com/Dart-Code/Dart-Code/issues/3975.

Change-Id: I388f22fefed048dabd200070482a2a2915c5b971
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/245840
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Danny Tuppeny
2022-05-25 14:49:28 +00:00
committed by Commit Bot
parent 0baad453cc
commit cd4d9c6f2f
3 changed files with 72 additions and 30 deletions
@@ -17,6 +17,7 @@ abstract class FlutterSnippetProducer extends DartSnippetProducer {
final flutter = Flutter.instance;
late ClassElement? classWidget;
late ClassElement? classContainer;
FlutterSnippetProducer(super.request);
@@ -27,6 +28,10 @@ abstract class FlutterSnippetProducer extends DartSnippetProducer {
return false;
}
if ((classContainer = await _getClass('Container')) == null) {
return false;
}
return super.isValid();
}
@@ -344,6 +349,7 @@ mixin FlutterWidgetSnippetProducerMixin on FlutterSnippetProducer {
// Checked by isValid() before this will be called.
final classBuildContext = this.classBuildContext!;
final classWidget = this.classWidget!;
final classContainer = this.classContainer!;
// Add the build method.
builder.writeln(' @override');
@@ -359,9 +365,13 @@ mixin FlutterWidgetSnippetProducerMixin on FlutterSnippetProducer {
},
bodyWriter: () {
builder.writeln('{');
builder.write(' ');
builder.write(' return ');
builder.writeType(_getType(classContainer));
builder.writeln('(');
builder.write(' ');
builder.selectHere();
builder.writeln();
builder.writeln(' );');
builder.writeln(' }');
},
);
@@ -2854,6 +2854,7 @@ void f() {
class FlutterSnippetCompletionTest extends SnippetCompletionTest {
/// Standard import statements expected for basic Widgets.
String get expectedImports => '''
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';''';
/// Nullability suffix expected in this test class.
@@ -2908,7 +2909,9 @@ class \${1:MyWidget} extends StatefulWidget {
class _\${1:MyWidget}State extends State<\${1:MyWidget}> {
@override
Widget build(BuildContext context) {
\$0
return Container(
\$0
);
}
}
@@ -2965,7 +2968,9 @@ class _\${1:MyWidget}State extends State<\${1:MyWidget}>
@override
Widget build(BuildContext context) {
\$0
return Container(
\$0
);
}
}
@@ -3001,7 +3006,9 @@ class \${1:MyWidget} extends StatelessWidget {
@override
Widget build(BuildContext context) {
\$0
return Container(
\$0
);
}
}
@@ -3035,7 +3042,9 @@ class \${1:MyWidget} extends StatelessWidget {
@override
Widget build(BuildContext context) {
\$0
return Container(
\$0
);
}
}
@@ -3063,7 +3072,9 @@ class \${1:MyWidget} extends StatelessWidget {
@override
Widget build(BuildContext context) {
\$0
return Container(
\$0
);
}
}
''');
@@ -3089,7 +3100,9 @@ class \${1:MyWidget} extends StatelessWidget {
@override
Widget build(BuildContext context) {
\$0
return Container(
\$0
);
}
}
''');
@@ -3131,6 +3144,7 @@ class FlutterSnippetCompletionWithoutNullSafetyTest
@override
String get expectedImports => '''
import 'package:flutter/src/foundation/key.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';''';
@override
@@ -91,6 +91,7 @@ class FlutterStatefulWidgetSnippetProducerTest
}
expect(code, '''
import 'package:flutter/src/foundation/key.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
class MyWidget extends StatefulWidget {
@@ -103,7 +104,9 @@ class MyWidget extends StatefulWidget {
class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
return Container(
);
}
}''');
}
@@ -126,6 +129,7 @@ class _MyWidgetState extends State<MyWidget> {
code = SourceEdit.applySequence(code, edit.edits);
}
expect(code, '''
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
class MyWidget extends StatefulWidget {
@@ -138,20 +142,22 @@ class MyWidget extends StatefulWidget {
class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
return Container(
);
}
}''');
expect(snippet.change.selection!.file, testFile);
expect(snippet.change.selection!.offset, 296);
expect(snippet.change.selection!.offset, 373);
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
{
'positions': [
{'file': testFile, 'offset': 60},
{'file': testFile, 'offset': 102},
{'file': testFile, 'offset': 146},
{'file': testFile, 'offset': 174},
{'file': testFile, 'offset': 201},
{'file': testFile, 'offset': 229},
{'file': testFile, 'offset': 113},
{'file': testFile, 'offset': 155},
{'file': testFile, 'offset': 199},
{'file': testFile, 'offset': 227},
{'file': testFile, 'offset': 254},
{'file': testFile, 'offset': 282},
],
'length': 8,
'suggestions': []
@@ -189,6 +195,7 @@ class FlutterStatefulWidgetWithAnimationControllerSnippetProducerTest
expect(code, '''
import 'package:flutter/src/animation/animation_controller.dart';
import 'package:flutter/src/foundation/key.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/src/widgets/ticker_provider.dart';
@@ -217,7 +224,9 @@ class _MyWidgetState extends State<MyWidget>
@override
Widget build(BuildContext context) {
return Container(
);
}
}''');
}
@@ -241,6 +250,7 @@ class _MyWidgetState extends State<MyWidget>
}
expect(code, '''
import 'package:flutter/src/animation/animation_controller.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/src/widgets/ticker_provider.dart';
@@ -269,20 +279,22 @@ class _MyWidgetState extends State<MyWidget>
@override
Widget build(BuildContext context) {
return Container(
);
}
}''');
expect(snippet.change.selection!.file, testFile);
expect(snippet.change.selection!.offset, 699);
expect(snippet.change.selection!.offset, 776);
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
{
'positions': [
{'file': testFile, 'offset': 185},
{'file': testFile, 'offset': 227},
{'file': testFile, 'offset': 271},
{'file': testFile, 'offset': 299},
{'file': testFile, 'offset': 326},
{'file': testFile, 'offset': 354},
{'file': testFile, 'offset': 238},
{'file': testFile, 'offset': 280},
{'file': testFile, 'offset': 324},
{'file': testFile, 'offset': 352},
{'file': testFile, 'offset': 379},
{'file': testFile, 'offset': 407},
],
'length': 8,
'suggestions': []
@@ -316,6 +328,7 @@ class FlutterStatelessWidgetSnippetProducerTest
}
expect(code, '''
import 'package:flutter/src/foundation/key.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
class MyWidget extends StatelessWidget {
@@ -323,7 +336,9 @@ class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
);
}
}''');
}
@@ -346,6 +361,7 @@ class MyWidget extends StatelessWidget {
code = SourceEdit.applySequence(code, edit.edits);
}
expect(code, '''
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
class MyWidget extends StatelessWidget {
@@ -353,16 +369,18 @@ class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
);
}
}''');
expect(snippet.change.selection!.file, testFile);
expect(snippet.change.selection!.offset, 182);
expect(snippet.change.selection!.offset, 259);
expect(snippet.change.linkedEditGroups.map((group) => group.toJson()), [
{
'positions': [
{'file': testFile, 'offset': 60},
{'file': testFile, 'offset': 103},
{'file': testFile, 'offset': 113},
{'file': testFile, 'offset': 156},
],
'length': 8,
'suggestions': []