@@ -14,7 +14,7 @@ func doBind(sc *Collection, originalInvokeF *provider, originalInitF *provider,
1414 var invokeF * provider
1515 var initF * provider
1616 var debuggingProvider * * provider
17- funcs := make ([]* provider , 0 , len (sc .contents )+ 3 )
17+ funcs := make ([]* provider , 0 , len (sc .contents )+ 5 )
1818 {
1919 var err error
2020 invokeF , err = characterizeInitInvoke (originalInvokeF , charContext {inputsAreStatic : false })
@@ -61,10 +61,46 @@ func doBind(sc *Collection, originalInvokeF *provider, originalInitF *provider,
6161 funcs = append (funcs , invokeF )
6262 funcs = append (funcs , afterInvoke ... )
6363
64+ var consumesUnused bool
65+ var receivesUnused bool
6466 for _ , fm := range funcs {
6567 if fm .required {
6668 fm .include = true
6769 }
70+ for _ , in := range fm .flows [inputParams ] {
71+ if in == unusedTypeCode {
72+ consumesUnused = true
73+ }
74+ }
75+ for _ , in := range fm .flows [bypassParams ] {
76+ if in == unusedTypeCode {
77+ consumesUnused = true
78+ }
79+ }
80+ for _ , in := range fm .flows [receivedParams ] {
81+ if in == unusedTypeCode {
82+ receivesUnused = true
83+ }
84+ }
85+ }
86+ if consumesUnused {
87+ funcs = append (funcs , nil )
88+ for i := len (funcs ) - 1 ; i > 0 ; i -- {
89+ funcs [i ] = funcs [i - 1 ]
90+ }
91+ d , err := makeUnusedInputProvider ()
92+ if err != nil {
93+ return err
94+ }
95+ funcs [0 ] = d
96+ }
97+ if receivesUnused {
98+ d , err := makeUnusedReturnsProvider ()
99+ if err != nil {
100+ return err
101+ }
102+ funcs = append (funcs , d )
103+ funcs [len (funcs )- 1 ], funcs [len (funcs )- 2 ] = funcs [len (funcs )- 2 ], funcs [len (funcs )- 1 ]
68104 }
69105 }
70106
@@ -406,6 +442,7 @@ func addToVmap(fm *provider, param flowType, vMap map[typeCode]int, rMap map[typ
406442
407443func makeDebuggingProvider () (* provider , error ) {
408444 d := newProvider (func () * Debugging { return nil }, - 1 , "Debugging" )
445+ d .nonFinal = true
409446 d .cacheable = true
410447 d .mustCache = true
411448 d , err := characterizeFunc (d , charContext {inputsAreStatic : true })
@@ -415,3 +452,32 @@ func makeDebuggingProvider() (*provider, error) {
415452 d .isSynthetic = true
416453 return d , nil
417454}
455+
456+ func makeUnusedInputProvider () (* provider , error ) {
457+ d := newProvider (Unused {}, - 1 , "provide unused" )
458+ d .nonFinal = true
459+ d .cacheable = true
460+ d .mustCache = true
461+ d .consumptionOptional = true
462+ d , err := characterizeFunc (d , charContext {inputsAreStatic : true })
463+ if err != nil {
464+ return nil , fmt .Errorf ("internal error #328: problem with unused injectors: %w" , err )
465+ }
466+ d .isSynthetic = true
467+ d .shun = true
468+ return d , nil
469+ }
470+
471+ func makeUnusedReturnsProvider () (* provider , error ) {
472+ d := newProvider (func (inner func ()) Unused { inner (); return Unused {} }, - 1 , "return unused" )
473+ d .nonFinal = true
474+ d , err := characterizeFunc (d , charContext {inputsAreStatic : true })
475+ if err != nil {
476+ return nil , fmt .Errorf ("internal error #278: problem with unused injectors: %w" , err )
477+ }
478+ d .isSynthetic = true
479+ d .shun = true
480+ d .required = false
481+ d .consumptionOptional = true
482+ return d , nil
483+ }
0 commit comments