diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart index a8398e4ebc647..1e49400ba0611 100644 --- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart +++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart @@ -98,6 +98,11 @@ class DefaultValueResolver { } void _parameter(ParameterElementImpl parameter) { + // If a function typed parameter, process nested parameters. + for (var localParameter in parameter.parameters) { + _parameter(localParameter); + } + var node = _defaultParameter(parameter); if (node == null) return; diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart index 8703b9dcc2b03..b4af04033e77e 100644 --- a/pkg/analyzer/test/src/summary/element_text.dart +++ b/pkg/analyzer/test/src/summary/element_text.dart @@ -301,16 +301,17 @@ class _ElementWriter { var initializers = (e as ConstructorElementImpl).constantInitializers; if (withFullyResolvedAst) { buffer.writeln(';'); - if (initializers != null && initializers.isNotEmpty) { - _withIndent(() { + _withIndent(() { + if (initializers != null && initializers.isNotEmpty) { _writelnWithIndent('constantInitializers'); _withIndent(() { for (var initializer in initializers) { _writeResolvedNode(initializer); } }); - }); - } + } + _writeParameterElementDefaultValues(e.parameters); + }); } else { if (initializers != null) { writeList(' : ', '', initializers, ', ', writeNode); @@ -407,6 +408,12 @@ class _ElementWriter { writeBodyModifiers(e); buffer.writeln(' {}'); + + if (withFullyResolvedAst) { + _withIndent(() { + _writeParameterElementDefaultValues(e.parameters); + }); + } } void writeIf(bool flag, String str) { @@ -530,6 +537,7 @@ class _ElementWriter { _withIndent(() { _writeResolvedTypeParameters(e.typeParameters); _writeResolvedMetadata(e.metadata); + _writeParameterElementDefaultValues(e.parameters); }); } } @@ -828,15 +836,17 @@ class _ElementWriter { writeName(e); writeCodeRange(e); - if (e.parameters.isNotEmpty) { - buffer.write('/*'); - writeList('(', ')', e.parameters, ', ', writeParameterElement); - buffer.write('*/'); - } + if (!withFullyResolvedAst) { + if (e.parameters.isNotEmpty) { + buffer.write('/*'); + writeList('(', ')', e.parameters, ', ', writeParameterElement); + buffer.write('*/'); + } - if (defaultValue != null) { - buffer.write(defaultValueSeparator); - writeNode(defaultValue); + if (defaultValue != null) { + buffer.write(defaultValueSeparator); + writeNode(defaultValue); + } } buffer.write(closeString); @@ -1194,6 +1204,30 @@ class _ElementWriter { buffer.writeln(line); } + void _writeParameterElementDefaultValues( + List parameters, { + String enclosingNames = '', + }) { + for (var parameter in parameters) { + if (parameter is DefaultParameterElementImpl) { + var defaultValue = parameter.constantInitializer; + if (defaultValue != null) { + _writelnWithIndent(enclosingNames + parameter.name); + _withIndent(() { + _writeResolvedNode(defaultValue); + }); + } + } + var subParameters = parameter.parameters; + _withIndent(() { + _writeParameterElementDefaultValues( + subParameters, + enclosingNames: enclosingNames + parameter.name + '::', + ); + }); + } + } + void _writeResolvedMetadata(List metadata) { if (metadata.isNotEmpty) { _writelnWithIndent('metadata'); diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart index ebb8c92dca4e9..3e5d249ba88e9 100644 --- a/pkg/analyzer/test/src/summary/resynthesize_common.dart +++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart @@ -4832,7 +4832,7 @@ class A { r''' class A { final int _f; - const A([int f = 0]); + const A([int f]); constantInitializers ConstructorFieldInitializer equals: = @@ -4844,6 +4844,10 @@ class A { staticElement: self::@class::A::@field::_f staticType: null token: _f + f + IntegerLiteral + literal: 0 + staticType: int } ''', withFullyResolvedAst: true); @@ -5600,6 +5604,30 @@ class B { '''); } + test_defaultValue_inFunctionTypedFormalParameter() async { + var library = await checkLibrary(''' +void f( g({a: 0 is int}) ) {} +'''); + checkElementText( + library, + r''' +void f(dynamic Function({dynamic a}) g) {} + g::a + IsExpression + expression: IntegerLiteral + literal: 0 + staticType: int + staticType: bool + type: TypeName + name: SimpleIdentifier + staticElement: dart:core::@class::int + staticType: null + token: int + type: int +''', + withFullyResolvedAst: true); + } + test_defaultValue_refersToExtension_method_inside() async { var library = await checkLibrary(''' class A {}