Version 2.14.0-240.0.dev

Merge commit '0e4c6404510974efce6dd8d7ccc72f472ba3c7fe' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index b6d71a6..268064a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -403,7 +403,7 @@
     } else if (entity is FormalParameter) {
       var beginToken = entity.beginToken;
       var offset = request.target.offset;
-      if (beginToken.offset <= offset && offset <= beginToken.end) {
+      if (offset <= beginToken.end) {
         _addSuggestion(Keyword.COVARIANT);
         _addSuggestion(Keyword.DYNAMIC);
         _addSuggestion(Keyword.VOID);
@@ -679,6 +679,22 @@
   }
 
   @override
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
+    var entity = this.entity;
+    if (node.type == entity && entity is GenericFunctionType) {
+      var offset = request.offset;
+      var returnType = entity.returnType;
+      if ((returnType == null && offset < entity.offset) ||
+          (returnType != null &&
+              offset >= returnType.offset &&
+              offset < returnType.end)) {
+        _addSuggestion(Keyword.DYNAMIC);
+        _addSuggestion(Keyword.VOID);
+      }
+    }
+  }
+
+  @override
   void visitSpreadElement(SpreadElement node) {
     _addExpressionKeywords(node);
     return super.visitSpreadElement(node);
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index baa577fc..8ace81f 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -108,7 +108,7 @@
       '1+void',
       '1-null',
       '2+Arrays',
-      '2-void',
+      '2+void',
       '2-null'
     ]);
 
diff --git a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
index 14b5877..d131792 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
@@ -17,6 +17,7 @@
     defineReflectiveTests(ExpressionFunctionBodyCompletionTest);
     defineReflectiveTests(ExtensionCompletionTest);
     defineReflectiveTests(FormalParameterCompletionTest);
+    defineReflectiveTests(GenericFunctionTypeCompletionTest);
     defineReflectiveTests(GenericTypeAliasCompletionTest);
     defineReflectiveTests(PropertyAccessCompletionTest);
     defineReflectiveTests(RedirectedConstructorCompletionTest);
@@ -405,6 +406,57 @@
 }
 
 @reflectiveTest
+class GenericFunctionTypeCompletionTest extends CompletionTestCase {
+  Future<void> test_returnType_beforeType() async {
+    addTestFile('''
+void f({^vo Function() p}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_returnType_beforeType_afterRequired() async {
+    addTestFile('''
+void f({required ^vo Function() p}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_returnType_inType() async {
+    addTestFile('''
+void f({v^o Function() p}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_returnType_inType_afterRequired() async {
+    addTestFile('''
+void f({required v^o Function() p}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_returnType_partialFunctionType() async {
+    addTestFile('''
+void f({^ Function() p}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_returnType_partialFunctionType_afterRequired() async {
+    addTestFile('''
+void f({required ^ Function() p}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('void');
+  }
+}
+
+@reflectiveTest
 class GenericTypeAliasCompletionTest extends CompletionTestCase {
   Future<void> test_returnType_void() async {
     addTestFile('''
diff --git a/tools/VERSION b/tools/VERSION
index c297383..08c8f41 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 239
+PRERELEASE 240
 PRERELEASE_PATCH 0
\ No newline at end of file