@@ -204,7 +204,7 @@ private class RefArg extends AssignableAccess {
204204 AssignableDefinition getAnAnalyzableRefDef ( Parameter p ) {
205205 this .isAnalyzable ( p ) and
206206 result .getTarget ( ) = p and
207- not result = TImplicitParameterDefinition ( _)
207+ not result = TImplicitParameterDefinition ( _, _ )
208208 }
209209
210210 /**
@@ -271,6 +271,11 @@ module AssignableInternal {
271271 def = TPatternDefinition ( result )
272272 or
273273 def = TAssignOperationDefinition ( result )
274+ or
275+ exists ( Parameter p |
276+ def = TImplicitParameterDefinition ( p , true ) and
277+ result = p .getDefaultValue ( )
278+ )
274279 }
275280
276281 /** A local variable declaration at the top-level of a pattern. */
@@ -304,12 +309,18 @@ module AssignableInternal {
304309 not lvde instanceof TopLevelPatternDecl and
305310 not lvde .isOutArgument ( )
306311 } or
307- TImplicitParameterDefinition ( Parameter p ) {
312+ TImplicitParameterDefinition ( Parameter p , boolean isDefault ) {
308313 exists ( Callable c | p = c .getAParameter ( ) |
309314 c .hasBody ( )
310315 or
311316 // Same as `c.(Constructor).hasInitializer()`, but avoids negative recursion warning
312317 c .getAChildExpr ( ) instanceof @constructor_init_expr
318+ ) and
319+ (
320+ isDefault = false
321+ or
322+ p .hasDefaultValue ( ) and
323+ isDefault = true
313324 )
314325 } or
315326 TAddressOfDefinition ( AddressOfExpr aoe ) or
@@ -349,6 +360,8 @@ module AssignableInternal {
349360 any ( AssignableDefinitions:: PatternDefinition pd | result = pd .getDeclaration ( ) .getVariable ( ) )
350361 or
351362 def = any ( AssignableDefinitions:: InitializerDefinition init | result = init .getAssignable ( ) )
363+ or
364+ def = TImplicitParameterDefinition ( result , _)
352365 }
353366
354367 // Not defined by dispatch in order to avoid too conservative negative recursion error
@@ -492,11 +505,6 @@ class AssignableDefinition extends TAssignableDefinition {
492505 exists ( Ssa:: ExplicitDefinition def | result = def .getAFirstReadAtNode ( cfn ) |
493506 this = def .getADefinition ( )
494507 )
495- or
496- exists ( Ssa:: ImplicitParameterDefinition def | result = def .getAFirstReadAtNode ( cfn ) |
497- this .( AssignableDefinitions:: ImplicitParameterDefinition ) .getParameter ( ) =
498- def .getParameter ( )
499- )
500508 )
501509 }
502510
@@ -673,7 +681,7 @@ module AssignableDefinitions {
673681 class ImplicitParameterDefinition extends AssignableDefinition , TImplicitParameterDefinition {
674682 Parameter p ;
675683
676- ImplicitParameterDefinition ( ) { this = TImplicitParameterDefinition ( p ) }
684+ ImplicitParameterDefinition ( ) { this = TImplicitParameterDefinition ( p , false ) }
677685
678686 /** Gets the underlying parameter. */
679687 Parameter getParameter ( ) { result = p }
@@ -688,7 +696,32 @@ module AssignableDefinitions {
688696
689697 override string toString ( ) { result = p .toString ( ) }
690698
691- override Location getLocation ( ) { result = this .getTarget ( ) .getLocation ( ) }
699+ override Location getLocation ( ) { result = p .getLocation ( ) }
700+ }
701+
702+ /**
703+ * A default value assigned to a parameter.
704+ */
705+ class ParameterDefaultDefinition extends AssignableDefinition , TImplicitParameterDefinition {
706+ Parameter p ;
707+
708+ ParameterDefaultDefinition ( ) { this = TImplicitParameterDefinition ( p , true ) }
709+
710+ /** Gets the underlying parameter. */
711+ Parameter getParameter ( ) { result = p }
712+
713+ /** Gets the default value expression for the parameter. */
714+ Expr getDefaultValue ( ) { result = p .getDefaultValue ( ) }
715+
716+ override Expr getSource ( ) { result = p .getDefaultValue ( ) }
717+
718+ override Expr getElement ( ) { result = p .getDefaultValue ( ) }
719+
720+ override Callable getEnclosingCallable ( ) { result = p .getCallable ( ) }
721+
722+ override string toString ( ) { result = p .toString ( ) + " = ..." }
723+
724+ override Location getLocation ( ) { result = p .getDefaultValue ( ) .getLocation ( ) }
692725 }
693726
694727 /**
0 commit comments