Skip to content

Commit f77b5c1

Browse files
bwilkersonCommit Queue
authored andcommitted
Migrate snippet support
Change-Id: I4bcfc81ab75dd484753fe8a322c449326098539c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/389820 Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]>
1 parent e9cdaae commit f77b5c1

File tree

10 files changed

+188
-59
lines changed

10 files changed

+188
-59
lines changed

pkg/analysis_server/analyzer_use_new_elements.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,9 @@ lib/src/services/refactoring/legacy/naming_conventions.dart
533533
lib/src/services/refactoring/move_selected_formal_parameters_left.dart
534534
lib/src/services/snippets/dart/class_declaration.dart
535535
lib/src/services/snippets/dart/do_statement.dart
536+
lib/src/services/snippets/dart/flutter_stateful_widget.dart
537+
lib/src/services/snippets/dart/flutter_stateful_widget_with_animation.dart
538+
lib/src/services/snippets/dart/flutter_stateless_widget.dart
536539
lib/src/services/snippets/dart/for_in_statement.dart
537540
lib/src/services/snippets/dart/for_statement.dart
538541
lib/src/services/snippets/dart/function_declaration.dart
@@ -548,6 +551,8 @@ lib/src/services/snippets/dart/while_statement.dart
548551
lib/src/services/snippets/dart_snippet_request.dart
549552
lib/src/services/snippets/snippet.dart
550553
lib/src/services/snippets/snippet_context.dart
554+
lib/src/services/snippets/snippet_manager.dart
555+
lib/src/services/snippets/snippet_producer.dart
551556
lib/src/services/user_prompts/dart_fix_prompt_manager.dart
552557
lib/src/services/user_prompts/survey_manager.dart
553558
lib/src/services/user_prompts/user_prompts.dart
@@ -962,6 +967,7 @@ test/services/snippets/dart/test_definition_test.dart
962967
test/services/snippets/dart/test_group_definition_test.dart
963968
test/services/snippets/dart/try_catch_statement_test.dart
964969
test/services/snippets/dart/while_statement_test.dart
970+
test/services/snippets/snippet_manager_test.dart
965971
test/services/snippets/snippet_request_test.dart
966972
test/services/snippets/test_all.dart
967973
test/services/test_all.dart

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

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

55
import 'package:analysis_server/src/services/snippets/snippet.dart';
66
import 'package:analysis_server/src/services/snippets/snippet_producer.dart';
7-
import 'package:analyzer/dart/element/element.dart';
7+
import 'package:analyzer/dart/element/element2.dart';
88
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
99

1010
/// Produces a [Snippet] that creates a Flutter StatefulWidget and related State
@@ -14,12 +14,12 @@ class FlutterStatefulWidget extends FlutterSnippetProducer
1414
static const prefix = 'stful';
1515
static const label = 'Flutter Stateful Widget';
1616

17-
late ClassElement? classStatefulWidget;
18-
late ClassElement? classState;
17+
late ClassElement2? classStatefulWidget;
18+
late ClassElement2? classState;
1919
@override
20-
late ClassElement? classBuildContext;
20+
late ClassElement2? classBuildContext;
2121
@override
22-
late ClassElement? classKey;
22+
late ClassElement2? classKey;
2323

2424
FlutterStatefulWidget(super.request, {required super.elementImportCache});
2525

@@ -58,7 +58,7 @@ class FlutterStatefulWidget extends FlutterSnippetProducer
5858
builder.write('class _');
5959
builder.addSimpleLinkedEdit('name', widgetClassName);
6060
builder.write('State extends ');
61-
builder.writeReference(classState);
61+
builder.writeReference2(classState);
6262
builder.write('<');
6363
builder.addSimpleLinkedEdit('name', widgetClassName);
6464
builder.writeln('> {');

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

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

55
import 'package:analysis_server/src/services/snippets/snippet.dart';
66
import 'package:analysis_server/src/services/snippets/snippet_producer.dart';
7-
import 'package:analyzer/dart/element/element.dart';
7+
import 'package:analyzer/dart/element/element2.dart';
88
import 'package:analyzer/src/dart/element/type.dart';
99
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
1010

@@ -15,14 +15,14 @@ class FlutterStatefulWidgetWithAnimationController
1515
static const prefix = 'stanim';
1616
static const label = 'Flutter Widget with AnimationController';
1717

18-
late ClassElement? classStatefulWidget;
19-
late ClassElement? classState;
18+
late ClassElement2? classStatefulWidget;
19+
late ClassElement2? classState;
2020
@override
21-
late ClassElement? classBuildContext;
21+
late ClassElement2? classBuildContext;
2222
@override
23-
late ClassElement? classKey;
24-
late ClassElement? classAnimationController;
25-
late MixinElement? classSingleTickerProviderStateMixin;
23+
late ClassElement2? classKey;
24+
late ClassElement2? classAnimationController;
25+
late MixinElement2? classSingleTickerProviderStateMixin;
2626

2727
FlutterStatefulWidgetWithAnimationController(super.request,
2828
{required super.elementImportCache});
@@ -65,15 +65,15 @@ class FlutterStatefulWidgetWithAnimationController
6565
builder.write('class _');
6666
builder.addSimpleLinkedEdit('name', widgetClassName);
6767
builder.write('State extends ');
68-
builder.writeReference(classState);
68+
builder.writeReference2(classState);
6969
builder.write('<');
7070
builder.addSimpleLinkedEdit('name', widgetClassName);
7171
builder.writeln('>');
7272
builder.write(' with ');
73-
builder.writeReference(classSingleTickerProviderStateMixin);
73+
builder.writeReference2(classSingleTickerProviderStateMixin);
7474
builder.writeln(' {');
7575
builder.write(' late ');
76-
builder.writeReference(classAnimationController);
76+
builder.writeReference2(classAnimationController);
7777
builder.writeln(' _controller;');
7878
builder.writeln();
7979
{
@@ -87,7 +87,7 @@ class FlutterStatefulWidgetWithAnimationController
8787
builder.writeln('{');
8888
builder.writeln(' super.initState();');
8989
builder.write(' _controller = ');
90-
builder.writeReference(classAnimationController);
90+
builder.writeReference2(classAnimationController);
9191
builder.writeln('(vsync: this);');
9292
builder.writeln(' }');
9393
},

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

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

55
import 'package:analysis_server/src/services/snippets/snippet.dart';
66
import 'package:analysis_server/src/services/snippets/snippet_producer.dart';
7-
import 'package:analyzer/dart/element/element.dart';
7+
import 'package:analyzer/dart/element/element2.dart';
88
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
99

1010
/// Produces a [Snippet] that creates a Flutter StatelessWidget.
@@ -13,11 +13,13 @@ class FlutterStatelessWidget extends FlutterSnippetProducer
1313
static const prefix = 'stless';
1414
static const label = 'Flutter Stateless Widget';
1515

16-
late ClassElement? classStatelessWidget;
16+
late ClassElement2? classStatelessWidget;
17+
1718
@override
18-
late ClassElement? classBuildContext;
19+
late ClassElement2? classBuildContext;
20+
1921
@override
20-
late ClassElement? classKey;
22+
late ClassElement2? classKey;
2123

2224
FlutterStatelessWidget(super.request, {required super.elementImportCache});
2325

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ import 'package:analysis_server/src/services/snippets/snippet.dart';
2525
import 'package:analysis_server/src/services/snippets/snippet_context.dart';
2626
import 'package:analysis_server/src/services/snippets/snippet_producer.dart';
2727
import 'package:analyzer/dart/analysis/session.dart';
28-
import 'package:analyzer/dart/element/element.dart';
28+
import 'package:analyzer/dart/element/element2.dart';
2929
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
3030

3131
typedef SnippetProducerGenerator = SnippetProducer Function(DartSnippetRequest,
32-
{required Map<Element, LibraryElement?> elementImportCache});
32+
{required Map<Element2, LibraryElement2?> elementImportCache});
3333

3434
/// [DartSnippetManager] determines if a snippet request is Dart specific
3535
/// and forwards those requests to all Snippet Producers that return `true` from
@@ -81,7 +81,7 @@ class DartSnippetManager {
8181
if (generators == null) {
8282
return snippets;
8383
}
84-
var elementImportCache = <Element, LibraryElement?>{};
84+
var elementImportCache = <Element2, LibraryElement2?>{};
8585
for (var generator in generators) {
8686
var producer =
8787
generator(request, elementImportCache: elementImportCache);

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

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:analysis_server/src/utilities/extensions/flutter.dart';
88
import 'package:analysis_server_plugin/edit/correction_utils.dart';
99
import 'package:analyzer/dart/analysis/code_style_options.dart';
1010
import 'package:analyzer/dart/analysis/features.dart';
11-
import 'package:analyzer/dart/element/element.dart';
11+
import 'package:analyzer/dart/element/element2.dart';
1212
import 'package:analyzer/dart/element/nullability_suffix.dart';
1313
import 'package:analyzer/dart/element/type.dart';
1414
import 'package:analyzer/src/dart/analysis/session_helper.dart';
@@ -21,27 +21,27 @@ import 'package:meta/meta.dart';
2121
abstract class DartSnippetProducer extends SnippetProducer {
2222
final AnalysisSessionHelper sessionHelper;
2323
final CorrectionUtils utils;
24-
final LibraryElement libraryElement;
24+
final LibraryElement2 libraryElement;
2525
final bool useSuperParams;
2626

2727
/// Elements that need to be imported for generated code to be valid.
2828
///
2929
/// Calling [addImports] will add any required imports to the supplied
3030
/// builder.
31-
final Set<Element> requiredElementImports = {};
31+
final Set<Element2> requiredElementImports = {};
3232

3333
/// A cache of mappings from Elements to their public Library Elements.
3434
///
3535
/// Callers can share this cache across multiple snippet producers to avoid
3636
/// repeated searches where they may add imports for the same elements.
37-
final Map<Element, LibraryElement?> _elementImportCache;
37+
final Map<Element2, LibraryElement2?> _elementImportCache;
3838

3939
DartSnippetProducer(super.request,
40-
{required Map<Element, LibraryElement?> elementImportCache})
40+
{required Map<Element2, LibraryElement2?> elementImportCache})
4141
: sessionHelper = AnalysisSessionHelper(request.analysisSession),
4242
utils = CorrectionUtils(request.unit),
43-
libraryElement = request.unit.libraryElement,
44-
useSuperParams = request.unit.libraryElement.featureSet
43+
libraryElement = request.unit.libraryElement2,
44+
useSuperParams = request.unit.libraryElement2.featureSet
4545
.isEnabled(Feature.super_parameters),
4646
_elementImportCache = elementImportCache;
4747

@@ -56,34 +56,34 @@ abstract class DartSnippetProducer extends SnippetProducer {
5656
Future<void> addImports(DartFileEditBuilder builder) async {
5757
var dartBuilder = builder as DartFileEditBuilderImpl;
5858
await Future.wait(requiredElementImports.map((element) => dartBuilder
59-
.importElementLibrary(element, resultCache: _elementImportCache)));
59+
.importElementLibrary2(element, resultCache: _elementImportCache)));
6060
}
6161
}
6262

6363
abstract class FlutterSnippetProducer extends DartSnippetProducer {
64-
late ClassElement? classWidget;
65-
late ClassElement? classPlaceholder;
64+
late ClassElement2? classWidget;
65+
late ClassElement2? classPlaceholder;
6666

6767
FlutterSnippetProducer(super.request, {required super.elementImportCache});
6868

69-
Future<ClassElement?> getClass(String name) async {
70-
var class_ = await sessionHelper.getFlutterClass(name);
69+
Future<ClassElement2?> getClass(String name) async {
70+
var class_ = await sessionHelper.getFlutterClass2(name);
7171
if (class_ != null) {
7272
requiredElementImports.add(class_);
7373
}
7474
return class_;
7575
}
7676

77-
Future<MixinElement?> getMixin(String name) async {
78-
var mixin = await sessionHelper.getMixin(widgetsUri, name);
77+
Future<MixinElement2?> getMixin(String name) async {
78+
var mixin = await sessionHelper.getMixin2(widgetsUri, name);
7979
if (mixin != null) {
8080
requiredElementImports.add(mixin);
8181
}
8282
return mixin;
8383
}
8484

8585
DartType getType(
86-
InterfaceElement classElement, [
86+
InterfaceElement2 classElement, [
8787
NullabilitySuffix nullabilitySuffix = NullabilitySuffix.none,
8888
]) =>
8989
classElement.instantiate(
@@ -109,8 +109,8 @@ abstract class FlutterSnippetProducer extends DartSnippetProducer {
109109
/// A mixin that provides some common methods for producers that build snippets
110110
/// for Flutter widget classes.
111111
mixin FlutterWidgetSnippetProducerMixin on FlutterSnippetProducer {
112-
ClassElement? get classBuildContext;
113-
ClassElement? get classKey;
112+
ClassElement2? get classBuildContext;
113+
ClassElement2? get classKey;
114114
String get widgetClassName => 'MyWidget';
115115

116116
void writeBuildMethod(DartEditBuilder builder) {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:analysis_server/src/services/snippets/snippet.dart';
77
import 'package:analysis_server/src/services/snippets/snippet_context.dart';
88
import 'package:analysis_server/src/services/snippets/snippet_manager.dart';
99
import 'package:analysis_server/src/services/snippets/snippet_producer.dart';
10-
import 'package:analyzer/dart/element/element.dart';
10+
import 'package:analyzer/dart/element/element2.dart';
1111
import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
1212
import 'package:test/test.dart';
1313
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -78,7 +78,7 @@ class SnippetManagerTest extends AbstractSingleUnitTest {
7878
SnippetContext.inClass: [
7979
(
8080
context, {
81-
required Map<Element, LibraryElement?> elementImportCache,
81+
required Map<Element2, LibraryElement2?> elementImportCache,
8282
}) =>
8383
throw 'Tried to create producer for wrong context',
8484
]
@@ -125,7 +125,7 @@ class _NotValidSnippetProducer extends SnippetProducer {
125125
Future<bool> isValid() async => false;
126126

127127
static _NotValidSnippetProducer newInstance(DartSnippetRequest request,
128-
{required Map<Element, LibraryElement?> elementImportCache}) =>
128+
{required Map<Element2, LibraryElement2?> elementImportCache}) =>
129129
_NotValidSnippetProducer._(request);
130130
}
131131

@@ -158,6 +158,6 @@ class _ValidSnippetProducer extends SnippetProducer {
158158
Future<bool> isValid() async => true;
159159

160160
static _ValidSnippetProducer newInstance(DartSnippetRequest request,
161-
{required Map<Element, LibraryElement?> elementImportCache}) =>
161+
{required Map<Element2, LibraryElement2?> elementImportCache}) =>
162162
_ValidSnippetProducer._(request);
163163
}

pkg/analyzer/lib/src/dart/analysis/session_helper.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,20 @@ class AnalysisSessionHelper {
107107
return null;
108108
}
109109

110+
/// Return the [MixinElement] with the given [name] that is exported
111+
/// from the library with the given [libraryUri], or `null` if the library
112+
/// does not export a class with such name.
113+
Future<MixinElement2?> getMixin2(String libraryUri, String name) async {
114+
var libraryResult = await session.getLibraryByUri(libraryUri);
115+
if (libraryResult is LibraryElementResult) {
116+
var element = libraryResult.element2.exportNamespace.get2(name);
117+
if (element is MixinElement2) {
118+
return element;
119+
}
120+
}
121+
return null;
122+
}
123+
110124
/// Return the resolved unit that declares the given [element].
111125
Future<ResolvedUnitResult?> getResolvedUnitByElement(Element element) async {
112126
var libraryPath = element.library!.source.fullName;

0 commit comments

Comments
 (0)