{ "defaults": { "doc": [ "A rule to provide default paths common to all lint targets." , "" , "While lint targets bring their own host directory via the" , "field \"config\", it can still be necessary to bring some" , "default paths, e.g., for finding the compiler, or the interpreter" , "for the runner." ] , "string_fields": ["PATH"] , "target_fields": ["base"] , "field_doc": { "base": ["Other targets to inherit values from."] , "PATH": [ "Paths for looking up system tools." , "Specifying this field extends values from \"base\"." ] } , "imports": {"base-provides-++": ["CC", "defaults-base-provides-++"]} , "expression": { "type": "let*" , "bindings": [ [ "PATH" , { "type": "nub_left" , "$1": { "type": "++" , "$1": [ {"type": "FIELD", "name": "PATH"} , { "type": "let*" , "bindings": [["provider", "PATH"]] , "body": {"type": "CALL_EXPRESSION", "name": "base-provides-++"} } ] } } ] ] , "body": {"type": "RESULT", "provides": {"type": "env", "vars": ["PATH"]}} } } , "targets": { "doc": [ "Run a given linter on the lint information provided by the given targets." ] , "target_fields": ["linter", "config", "summarizer", "targets"] , "string_fields": ["name"] , "tainted": ["lint"] , "field_doc": { "linter": [ "Single artifact running the lint checks." , "" , "This program is invoked with" , "- argv[1] the file to lint, and" , "- argv[2:] the original command line." , "This invocation happens in an environment with" , "- CONFIG pointing to the directory with all the artifacts given" , " by the field \"config\", and" , "- OUT pointing to a directory to which files with the lint result" , " can be written." , "- META pointing to a json file containing" , " - at key \"direct deps artifact names\" a list of all input" , " artifacts that come from the target itself or are runfiles of a" , " direct dependency." , " - at key \"extra outs\" a list of extra output artifacts that the" , " command might produce, such as DWARF objects if debug fission is" , " enabled." , "- TMPDIR pointing to a directory location that can be used to" , " create additional temporary files." , "It is supposed to indicate by the exit code whether the file to lint" , "complies with the given linting policy, with 0 meaning" , "compliant." , "Stdout and stderr, as well as the directory ${OUT} can be used to" , "provide additional information." ] , "config": ["Any configuration or other files needed by the linter."] , "summarizer": [ "Single artifact generating a summary of the individual lint results." , "It will be called in a directory where all subdirectories" , "except . and .. represent the results of the individual lint" , "actions. Those are given as" , " - a file \"result\" with content \"PASS\" if and only if the lint" , " action exited 0," , " - files \"stdout\" and \"stderr\" with stdout and stderr of the lint" , " action, and" , " - a directory \"out\" with the additional information provided by the" , " lint action." , "The summarizer is required to indicate the overall result by the exit" , "code, produce a human-readable summary on stdout, and optionally" , "additional information in the directory ${OUT}." ] , "call_lint": ["Launcher for the linter"] , "call_summary": ["Launcher for the summarizer"] , "name": [ "Name of the kind of lint check performed, to be reported" , "when an action is failing." ] } , "implicit": { "defaults": ["defaults"] , "call_lint": ["call_lint"] , "call_summary": ["call_summary"] } , "config_transitions": {"targets": [{"type": "'", "$1": {"LINT": true}}]} , "anonymous": {"lint": {"target": "targets", "provider": "lint", "rule_map": {}}} , "imports": { "stage": ["", "stage_singleton_field"] , "artifacts": ["", "field_artifacts"] , "default-PATH": ["CC", "default-PATH"] } , "expression": { "type": "let*" , "bindings": [ [ "linter" , { "type": "let*" , "bindings": [["fieldname", "linter"], ["location", "linter"]] , "body": {"type": "CALL_EXPRESSION", "name": "stage"} } ] , [ "runner" , { "type": "let*" , "bindings": [["fieldname", "call_lint"], ["location", "runner"]] , "body": {"type": "CALL_EXPRESSION", "name": "stage"} } ] , [ "config" , { "type": "let*" , "bindings": [["fieldname", "config"]] , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"} } ] , [ "PATH" , { "type": "join" , "separator": ":" , "$1": {"type": "CALL_EXPRESSION", "name": "default-PATH"} } ] , ["name", {"type": "join", "$1": {"type": "FIELD", "name": "name"}}] , [ "lint results" , { "type": "foreach" , "range": {"type": "FIELD", "name": "lint"} , "body": { "type": "let*" , "bindings": [ [ "src" , { "type": "DEP_PROVIDES" , "dep": {"type": "var", "name": "_"} , "provider": "src" } ] , [ "cmd" , { "type": "DEP_PROVIDES" , "dep": {"type": "var", "name": "_"} , "provider": "cmd" } ] , [ "src input" , { "type": "DEP_ARTIFACTS" , "dep": {"type": "var", "name": "_"} } ] , [ "direct deps artifact names" , { "type": "DEP_PROVIDES" , "dep": {"type": "var", "name": "_"} , "provider": "direct deps artifact names" } ] , [ "extra outs" , { "type": "DEP_PROVIDES" , "dep": {"type": "var", "name": "_"} , "provider": "extra outs" } ] ] , "body": { "type": "TREE" , "$1": { "type": "ACTION" , "inputs": { "type": "map_union" , "$1": [ {"type": "var", "name": "runner"} , {"type": "var", "name": "linter"} , { "type": "to_subdir" , "subdir": "work" , "$1": {"type": "var", "name": "src input"} } , { "type": "to_subdir" , "subdir": "config" , "$1": {"type": "var", "name": "config"} } , { "type": "singleton_map" , "key": "meta.json" , "value": { "type": "BLOB" , "data": { "type": "json_encode" , "$1": { "type": "env" , "vars": ["direct deps artifact names", "extra outs"] } } } } ] } , "cmd": { "type": "++" , "$1": [ ["./runner", {"type": "var", "name": "src"}] , {"type": "var", "name": "cmd"} ] } , "env": {"type": "env", "vars": ["PATH"]} , "outs": ["stdout", "stderr", "result"] , "out_dirs": ["out"] , "may_fail": ["lint"] , "fail_message": { "type": "join" , "$1": [ "lint " , {"type": "var", "name": "name"} , " failed for " , {"type": "var", "name": "src"} ] } } } } } ] , [ "lint results" , {"type": "nub_right", "$1": {"type": "var", "name": "lint results"}} ] , [ "summary input" , {"type": "enumerate", "$1": {"type": "var", "name": "lint results"}} ] , [ "summarizer" , { "type": "let*" , "bindings": [["fieldname", "summarizer"], ["location", "summarizer"]] , "body": {"type": "CALL_EXPRESSION", "name": "stage"} } ] , [ "runner" , { "type": "let*" , "bindings": [["fieldname", "call_summary"], ["location", "runner"]] , "body": {"type": "CALL_EXPRESSION", "name": "stage"} } ] , [ "summary" , { "type": "ACTION" , "inputs": { "type": "map_union" , "$1": [ {"type": "var", "name": "runner"} , {"type": "var", "name": "summarizer"} , { "type": "to_subdir" , "subdir": "work" , "$1": {"type": "var", "name": "summary input"} } ] } , "cmd": ["./runner"] , "outs": ["report", "result"] , "out_dirs": ["out"] } ] ] , "body": { "type": "RESULT" , "artifacts": { "type": "map_union" , "$1": [ {"type": "var", "name": "summary"} , { "type": "singleton_map" , "key": "work" , "value": {"type": "TREE", "$1": {"type": "var", "name": "summary input"}} } ] } } } } }