diff --git a/context.go b/context.go index 5d7ba32..80725ab 100644 --- a/context.go +++ b/context.go @@ -2284,6 +2284,18 @@ type JSONDataSupplier interface { AddJSONData(d *map[string]interface{}) } +// JSONAction contains the action-related info we expose to json module graph +type JSONAction struct { + Inputs []string + Outputs []string +} + +// JSONActionSupplier allows JSON representation of additional actions that are not registered in +// Ninja +type JSONActionSupplier interface { + JSONActions() []JSONAction +} + func jsonModuleFromModuleInfo(m *moduleInfo) *JsonModule { result := &JsonModule{ jsonModuleName: *jsonModuleNameFromModuleInfo(m), @@ -2313,17 +2325,27 @@ func jsonModuleWithActionsFromModuleInfo(m *moduleInfo) *JsonModule { Blueprint: m.relBlueprintsFile, Module: make(map[string]interface{}), } - var actions []map[string]interface{} + var actions []JSONAction for _, bDef := range m.actionDefs.buildDefs { - actions = append(actions, map[string]interface{}{ - "Inputs": append( + actions = append(actions, JSONAction{ + Inputs: append( getNinjaStringsWithNilPkgNames(bDef.Inputs), getNinjaStringsWithNilPkgNames(bDef.Implicits)...), - "Outputs": append( + Outputs: append( getNinjaStringsWithNilPkgNames(bDef.Outputs), getNinjaStringsWithNilPkgNames(bDef.ImplicitOutputs)...), }) } + + if j, ok := m.logicModule.(JSONActionSupplier); ok { + actions = append(actions, j.JSONActions()...) + } + for _, p := range m.providers { + if j, ok := p.(JSONActionSupplier); ok { + actions = append(actions, j.JSONActions()...) + } + } + result.Module["Actions"] = actions return result }