Skip to content

Commit 943032f

Browse files
Clean up and improve prop forwarding debug infos, add demo
1 parent d0aca29 commit 943032f

File tree

4 files changed

+20
-22
lines changed

4 files changed

+20
-22
lines changed

tools/analyzer_plugin/lib/src/diagnostic/missing_required_prop.dart

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class MissingRequiredPropDiagnostic extends ComponentUsageDiagnosticContributor
174174
final debugHelper = AnalyzerDebugHelper(result, collector, enabled: _cachedIsDebugHelperEnabled(result));
175175
// A flag to help verify during debugging/testing whether propsSetByFactory was computed.
176176
var hasPropsSetByFactoryBeenComputed = false;
177-
final debugInfoByForwardedRequiredProp = <FieldElement, _ForwardedRequiredPropDebugInfo>{};
177+
final debugSuppressedRequiredPropsDueToForwarding = <FieldElement>{};
178178

179179
// Use late variables to compute these only when we need to.
180180
late final propsSetByFactory = () {
@@ -209,7 +209,7 @@ class MissingRequiredPropDiagnostic extends ComponentUsageDiagnosticContributor
209209
if (sourcePropsClass is InterfaceElement) {
210210
if (forwardedProps != null && forwardedProps.definitelyForwardsPropsFrom(sourcePropsClass)) {
211211
if (debugHelper.enabled) {
212-
debugInfoByForwardedRequiredProp[field] = _ForwardedRequiredPropDebugInfo(forwardedProps.debugSourceNode);
212+
debugSuppressedRequiredPropsDueToForwarding.add(field);
213213
}
214214
continue;
215215
}
@@ -236,19 +236,20 @@ class MissingRequiredPropDiagnostic extends ComponentUsageDiagnosticContributor
236236
}
237237
}
238238

239-
if (debugHelper.enabled) {
240-
final fieldsByReasonNode =
241-
debugInfoByForwardedRequiredProp.keys.groupListsBy((field) => debugInfoByForwardedRequiredProp[field]!.node);
242-
fieldsByReasonNode.forEach((reasonNode, fields) {
243-
debugHelper.log(() {
244-
return 'Suppressing missing required props warnings due to forwarding here, for the following props:'
245-
' ${fields.map((f) => '${f.enclosingElement.name}.${f.name}').join(', ')}';
246-
}, () => result.locationFor(reasonNode));
247-
});
239+
if (forwardedProps != null) {
240+
debugHelper.log(() {
241+
var message = StringBuffer()..writeln(forwardedProps);
242+
if (debugSuppressedRequiredPropsDueToForwarding.isNotEmpty) {
243+
final propsNamesByClassName = <String?, Set<String>>{};
244+
for (final field in debugSuppressedRequiredPropsDueToForwarding) {
245+
propsNamesByClassName.putIfAbsent(field.enclosingElement.name, () => {}).add(field.name);
246+
}
247+
message.write('Required props set only via forwarding: ${prettyPrint(propsNamesByClassName)}');
248+
} else {}
249+
return message.toString();
250+
}, () => result.locationFor(forwardedProps.debugSourceNode));
248251
}
249252

250-
debugHelper.log(() => 'Forwarded props: $forwardedProps', () => result.locationFor(usage.builder));
251-
252253
// Include debug info for each invocation ahout all the props and their requirednesses.
253254
debugHelper.log(() {
254255
final propNamesByRequirednessName = <String, Set<String>>{};
@@ -272,9 +273,3 @@ class MissingRequiredPropDiagnostic extends ComponentUsageDiagnosticContributor
272273
}, () => result.locationFor(usage.builder));
273274
}
274275
}
275-
276-
class _ForwardedRequiredPropDebugInfo {
277-
final AstNode node;
278-
279-
_ForwardedRequiredPropDebugInfo(this.node);
280-
}

tools/analyzer_plugin/lib/src/util/prop_forwarding/forwarded_props.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ForwardedProps {
5252
}
5353

5454
@override
55-
String toString() => 'Props from ${propsClassBeingForwarded.name}: ${forwardingConfig ?? '(unresolved)'}';
55+
String toString() => 'Forwards props from ${propsClassBeingForwarded.name}: ${forwardingConfig ?? '(unresolved)'}';
5656
}
5757

5858
extension on InterfaceElement {

tools/analyzer_plugin/lib/src/util/prop_forwarding/forwarding_config.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class _PropForwardingConfig$Only extends PropForwardingConfig {
2929
bool excludesProps(InterfaceElement e) => !_onlyProps.contains(e);
3030

3131
@override
32-
String get debugDescription => 'only ${_onlyProps.map((e) => e.name).toSet()}';
32+
String get debugDescription => 'only props from ${_onlyProps.map((e) => e.name).toSet()}';
3333
}
3434

3535
class _PropForwardingConfig$AllExceptFor extends PropForwardingConfig {
@@ -41,5 +41,6 @@ class _PropForwardingConfig$AllExceptFor extends PropForwardingConfig {
4141
bool excludesProps(InterfaceElement e) => _excludedProps.contains(e);
4242

4343
@override
44-
String get debugDescription => 'all except ${_excludedProps.map((e) => e.name).toSet()}';
44+
String get debugDescription =>
45+
_excludedProps.isEmpty ? 'all props' : 'all except props from ${_excludedProps.map((e) => e.name).toSet()}';
4546
}

tools/analyzer_plugin/playground/web/missing_required_props.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ UiFactory<WrapsInheritsLateRequiredProps> WrapsInheritsLateRequired = uiFunction
120120
// InheritsLateRequiredPropsMixin,
121121
}))
122122
)();
123+
// de bug:over_react_required_props
124+
// ^ Also, try deleting this space to enable prop forwarding debug infos on lines where props are forwarded
123125
},
124126
_$WrapsInheritsLateRequiredConfig, // ignore: undefined_identifier
125127
);

0 commit comments

Comments
 (0)