Skip to content

Commit 29db621

Browse files
authored
Add nullability suffix to callback parameters - Fixes #2477 (#2478)
* Add nullability suffix to callback parameters - Fixes #2477 * Add end2end rendering test
1 parent fccdb1e commit 29db621

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

lib/src/render/parameter_renderer.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ abstract class ParameterRenderer {
185185
buf.write(renderLinkedParams(paramModelType.element.parameters,
186186
showMetadata: showMetadata, showNames: showNames));
187187
buf.write(')');
188+
buf.write(paramModelType.nullabilitySuffix);
188189
}
189190
if (!paramModelType.isTypedef && paramModelType.type is FunctionType) {
190191
buf.write('(');
@@ -193,6 +194,7 @@ abstract class ParameterRenderer {
193194
showMetadata: showMetadata,
194195
showNames: showNames));
195196
buf.write(')');
197+
buf.write(paramModelType.nullabilitySuffix);
196198
}
197199
} else if (param.modelType != null) {
198200
var linkedTypeName = paramModelType.linkedName;

test/end2end/model_special_cases_test.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void main() {
8989
optOutOfNullSafety,
9090
nullableElements;
9191
Class b;
92+
Class c;
9293

9394
setUpAll(() async {
9495
lateFinalWithoutInitializer = (await _testPackageGraphExperiments)
@@ -105,6 +106,8 @@ void main() {
105106
.firstWhere((lib) => lib.name == 'nullable_elements');
106107
b = nullSafetyClassMemberDeclarations.allClasses
107108
.firstWhere((c) => c.name == 'B');
109+
c = nullSafetyClassMemberDeclarations.allClasses
110+
.firstWhere((c) => c.name == 'C');
108111
});
109112

110113
test('isNullSafety is set correctly for libraries', () {
@@ -154,6 +157,24 @@ void main() {
154157
'</ol>'));
155158
});
156159

160+
test('anonymous callback parameters are correctly marked as nullable', () {
161+
var m3 = c.instanceMethods.firstWhere((m) => m.name == 'm3');
162+
var listen = m3.allParameters.firstWhere((p) => p.name == 'listen');
163+
var onDone = m3.allParameters.firstWhere((p) => p.name == 'onDone');
164+
expect(listen.isRequiredPositional, isTrue);
165+
expect(onDone.isNamed, isTrue);
166+
167+
expect(
168+
m3.linkedParamsLines,
169+
equals(
170+
'<ol class="parameter-list"><li><span class="parameter" id="m3-param-listen"><span class="type-annotation">void</span> <span class="parameter-name">listen</span>(<ol class="parameter-list"><li><span class="parameter" id="param-t"><span class="type-annotation">int</span> <span class="parameter-name">t</span></span></li>\n'
171+
'</ol>\n'
172+
')?, </span></li>\n'
173+
'<li><span class="parameter" id="m3-param-onDone">{<span class="type-annotation">void</span> <span class="parameter-name">onDone</span>(<ol class="parameter-list"></ol>\n'
174+
')?}</span></li>\n'
175+
'</ol>'));
176+
});
177+
157178
test('Late final class member test', () {
158179
var c = lateFinalWithoutInitializer.allClasses
159180
.firstWhere((c) => c.name == 'C');

testing/test_package_experiments/lib/nnbd_class_member_declarations.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ class C {
2626
List<int?> get testFieldNullableParameter => [];
2727

2828
List<Map<String, num?>>? method1() => null;
29+
30+
void m3(void listen(int t)?, {void onDone()?});
2931
}

0 commit comments

Comments
 (0)