Fix following comma detection in code completion (#29503).
BUG=
R=brianwilkerson@google.com
Fixes: https://github.com/dart-lang/sdk/issues/29503
Review-Url: https://codereview.chromium.org/2849703002 .
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index 01775a3..59fc1c0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -330,10 +330,17 @@
}
bool _isFollowedByAComma(DartCompletionRequest request) {
+ // new A(^); NO
+ // new A(one: 1, ^); NO
+ // new A(^ , one: 1); YES
+ // new A(^), ... NO
+
+ var containingNode = request.target.containingNode;
var entity = request.target.entity;
Token token =
entity is AstNode ? entity.endToken : entity is Token ? entity : null;
- return token?.next?.type == TokenType.COMMA;
+ return (token != containingNode?.endToken) &&
+ token?.next?.type == TokenType.COMMA;
}
bool _isInFlutterCreation(DartCompletionRequest request) {
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 1fd8852..31f5725 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -892,6 +892,31 @@
selectionOffset: 10);
}
+ test_ArgumentList_Flutter_InstanceCreationExpression_01() async {
+ configureFlutterPkg({
+ 'src/widgets/framework.dart': flutter_framework_code,
+ });
+
+ addTestSource('''
+import 'package:flutter/src/widgets/framework.dart';
+
+ build() => new Scaffold(
+ appBar: new AppBar(
+ ^
+ ),
+ );
+''');
+
+ // Don't generate children boilerplate.
+ await computeSuggestions();
+
+ assertSuggest('color: ,',
+ csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+ relevance: DART_RELEVANCE_NAMED_PARAMETER,
+ defaultArgListString: null, // No default values.
+ selectionOffset: 7);
+ }
+
test_ArgumentList_Flutter_InstanceCreationExpression_1() async {
configureFlutterPkg({
'src/widgets/framework.dart': flutter_framework_code,
diff --git a/pkg/analysis_server/test/services/correction/flutter_util.dart b/pkg/analysis_server/test/services/correction/flutter_util.dart
index a15dd90..100f1b0 100644
--- a/pkg/analysis_server/test/services/correction/flutter_util.dart
+++ b/pkg/analysis_server/test/services/correction/flutter_util.dart
@@ -10,6 +10,7 @@
class Widget {}
class RenderObjectWidget extends Widget {}
class StatelessWidget extends Widget {}
+abstract class StatefulWidget extends Widget { }
class SingleChildRenderObjectWidget extends RenderObjectWidget {}
class Transform extends SingleChildRenderObjectWidget {}
class ClipRect extends SingleChildRenderObjectWidget { ClipRect.rect(){} }
@@ -19,5 +20,7 @@
class DefaultTextStyle extends StatelessWidget { DefaultTextStyle({child: null}){}}
class Row extends Widget { Row({List<Widget> children: null, key: null}){}}
class GestureDetector extends SingleChildRenderObjectWidget { GestureDetector({child: null, onTap: null}){}}
-class Scaffold extends Widget { Scaffold({body: null}){}}
+class AppBar extends StatefulWidget implements PreferredSizeWidget { AppBar(title: null, color: null, key: null) }
+class Scaffold extends Widget { Scaffold({body: null, PreferredSizeWidget appBar: null}){}}
+class PreferredSizeWidget implements Widget {}
''';