Skip to content

Commit 42f334f

Browse files
[analysis_server] fix nullable types in closure params of default values
Change-Id: I58d4e2770089e551f431883b385d35314eac4592 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/163001 Auto-Submit: Mike Fairhurst <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Mike Fairhurst <[email protected]>
1 parent 7da89da commit 42f334f

File tree

4 files changed

+106
-6
lines changed

4 files changed

+106
-6
lines changed

pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,9 @@ class SuggestionBuilder {
800800
var element = parameter.enclosingElement;
801801
if (element is ConstructorElement) {
802802
if (Flutter.instance.isWidget(element.enclosingElement)) {
803-
var defaultValue = getDefaultStringParameterValue(parameter);
803+
// Don't bother with nullability. It won't affect default list values.
804+
var defaultValue =
805+
getDefaultStringParameterValue(parameter, withNullability: false);
804806
// TODO(devoncarew): Should we remove the check here? We would then
805807
// suggest values for param types like closures.
806808
if (defaultValue != null && defaultValue.text == '[]') {

pkg/analysis_server/lib/src/services/completion/dart/utilities.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import 'package:analyzer/src/dart/ast/token.dart';
1515
import 'package:analyzer/src/generated/source.dart';
1616
import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol
1717
show Element, ElementKind;
18+
import 'package:meta/meta.dart';
1819

1920
/// The name of the type `dynamic`;
2021
const DYNAMIC = 'dynamic';
@@ -169,7 +170,8 @@ protocol.Element createLocalElement(
169170
}
170171

171172
/// Return a default argument value for the given [parameter].
172-
DefaultArgument getDefaultStringParameterValue(ParameterElement parameter) {
173+
DefaultArgument getDefaultStringParameterValue(ParameterElement parameter,
174+
{@required bool withNullability}) {
173175
if (parameter != null) {
174176
var type = parameter.type;
175177
if (type is InterfaceType) {
@@ -182,7 +184,8 @@ DefaultArgument getDefaultStringParameterValue(ParameterElement parameter) {
182184
}
183185
} else if (type is FunctionType) {
184186
var params = type.parameters
185-
.map((p) => '${getTypeString(p.type)}${p.name}')
187+
.map((p) =>
188+
'${getTypeString(p.type, withNullability: withNullability)}${p.name}')
186189
.join(', ');
187190
// TODO(devoncarew): Support having this method return text with newlines.
188191
var text = '($params) { }';
@@ -209,11 +212,11 @@ String getRequestLineIndent(DartCompletionRequest request) {
209212
return content.substring(lineStartOffset, notWhitespaceOffset);
210213
}
211214

212-
String getTypeString(DartType type) {
215+
String getTypeString(DartType type, {@required bool withNullability}) {
213216
if (type.isDynamic) {
214217
return '';
215218
} else {
216-
return type.getDisplayString(withNullability: false) + ' ';
219+
return type.getDisplayString(withNullability: withNullability) + ' ';
217220
}
218221
}
219222

pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ class AddMissingRequiredArgument extends CorrectionProducer {
7878
}
7979
}
8080
}
81-
var defaultValue = getDefaultStringParameterValue(missingParameter);
81+
var defaultValue = getDefaultStringParameterValue(missingParameter,
82+
withNullability: libraryElement.isNonNullableByDefault &&
83+
missingParameter.library.isNonNullableByDefault);
8284

8385
await builder.addDartFileEdit(file, (builder) {
8486
builder.addInsertion(offset, (builder) {

pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,99 @@ main() {
250250
''');
251251
}
252252

253+
Future<void> test_constructor_single_closure_nnbd() async {
254+
createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
255+
addMetaPackage();
256+
addSource('/home/test/lib/a.dart', r'''
257+
import 'package:meta/meta.dart';
258+
259+
typedef int Callback(int? a);
260+
261+
class A {
262+
A({@required Callback callback}) {}
263+
}
264+
''');
265+
await resolveTestUnit('''
266+
import 'package:test/a.dart';
267+
268+
main() {
269+
A a = new A();
270+
print(a);
271+
}
272+
''');
273+
await assertHasFix('''
274+
import 'package:test/a.dart';
275+
276+
main() {
277+
A a = new A(callback: (int? a) { });
278+
print(a);
279+
}
280+
''');
281+
}
282+
283+
Future<void> test_constructor_single_closure_nnbd_from_legacy() async {
284+
createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
285+
addMetaPackage();
286+
addSource('/home/test/lib/a.dart', r'''
287+
// @dart = 2.8
288+
import 'package:meta/meta.dart';
289+
290+
typedef int Callback(int a);
291+
292+
class A {
293+
A({@required Callback callback}) {}
294+
}
295+
''');
296+
await resolveTestUnit('''
297+
import 'package:test/a.dart';
298+
299+
main() {
300+
A a = new A();
301+
print(a);
302+
}
303+
''');
304+
await assertHasFix('''
305+
import 'package:test/a.dart';
306+
307+
main() {
308+
A a = new A(callback: (int a) { });
309+
print(a);
310+
}
311+
''');
312+
}
313+
314+
Future<void> test_constructor_single_closure_nnbd_into_legacy() async {
315+
createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
316+
addMetaPackage();
317+
addSource('/home/test/lib/a.dart', r'''
318+
import 'package:meta/meta.dart';
319+
320+
typedef int Callback(int? a);
321+
322+
class A {
323+
A({@required Callback callback}) {}
324+
}
325+
''');
326+
await resolveTestUnit('''
327+
// @dart = 2.8
328+
import 'package:test/a.dart';
329+
330+
main() {
331+
A a = new A();
332+
print(a);
333+
}
334+
''');
335+
await assertHasFix('''
336+
// @dart = 2.8
337+
import 'package:test/a.dart';
338+
339+
main() {
340+
A a = new A(callback: (int a) { });
341+
print(a);
342+
}
343+
''');
344+
}
345+
253346
Future<void> test_constructor_single_list() async {
254347
addMetaPackage();
255348
addSource('/home/test/lib/a.dart', r'''

0 commit comments

Comments
 (0)