blob: 7babe62c453a624a65df11485b1ae1b628bfe82a [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/snippets/snippet.dart';
import 'package:analysis_server/src/services/snippets/snippet_producer.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
/// Produces a [Snippet] that creates a Flutter StatefulWidget and related State
/// class.
class FlutterStatefulWidget extends FlutterSnippetProducer
with FlutterWidgetSnippetProducerMixin {
static const prefix = 'stful';
static const label = 'Flutter Stateful Widget';
late ClassElement? classStatefulWidget;
late ClassElement? classState;
@override
late ClassElement? classBuildContext;
@override
late ClassElement? classKey;
FlutterStatefulWidget(super.request);
@override
Future<Snippet> compute() async {
final builder = ChangeBuilder(session: request.analysisSession);
// Checked by isValid().
final classStatefulWidget = this.classStatefulWidget!;
final classState = this.classState!;
await builder.addDartFileEdit(request.filePath, (builder) {
builder.addReplacement(request.replacementRange, (builder) {
// Write the StatefulWidget class
builder.writeClassDeclaration(
widgetClassName,
nameGroupName: 'name',
superclass: getType(classStatefulWidget),
membersWriter: () {
writeWidgetConstructor(builder);
builder.writeln();
builder.writeln();
writeCreateStateMethod(builder);
},
);
builder.writeln();
builder.writeln();
// Write the State class.
builder.write('class _');
builder.addSimpleLinkedEdit('name', widgetClassName);
builder.write('State extends ');
builder.writeReference(classState);
builder.write('<');
builder.addSimpleLinkedEdit('name', widgetClassName);
builder.writeln('> {');
{
writeBuildMethod(builder);
}
builder.write('}');
});
});
return Snippet(
prefix,
label,
'Insert a Flutter StatefulWidget.',
builder.sourceChange,
);
}
@override
Future<bool> isValid() async {
if (!await super.isValid()) {
return false;
}
if ((classStatefulWidget = await getClass('StatefulWidget')) == null ||
(classState = await getClass('State')) == null ||
(classBuildContext = await getClass('BuildContext')) == null ||
(classKey = await getClass('Key')) == null) {
return false;
}
return true;
}
}