1414
1515"""A module defining clippy rules""" 
1616
17+ load ("@bazel_skylib//lib:structs.bzl" , "structs" )
1718load ("//rust/private:common.bzl" , "rust_common" )
18- load ("//rust/private:providers.bzl" , "CaptureClippyOutputInfo" , "ClippyInfo" , "LintsInfo" )
19+ load (
20+     "//rust/private:providers.bzl" ,
21+     "CaptureClippyOutputInfo" ,
22+     "ClippyInfo" ,
23+     "ClippyOutputDiagnosticsInfo" ,
24+     "LintsInfo" ,
25+ )
1926load (
2027    "//rust/private:rustc.bzl" ,
2128    "collect_deps" ,
@@ -146,6 +153,13 @@ def _clippy_aspect_impl(target, ctx):
146153        "_clippy_error_format"  if  use_clippy_error_format  else  "_error_format" ,
147154    )
148155
156+     clippy_diagnostics  =  None 
157+     if  ctx .attr ._clippy_output_diagnostics [ClippyOutputDiagnosticsInfo ].output_diagnostics :
158+         clippy_diagnostics  =  ctx .actions .declare_file (ctx .label .name  +  ".clippy.diagnostics" , sibling  =  crate_info .output )
159+         crate_info_dict  =  structs .to_dict (crate_info )
160+         crate_info_dict ["rustc_output" ] =  clippy_diagnostics 
161+         crate_info  =  rust_common .create_crate_info (** crate_info_dict )
162+ 
149163    args , env  =  construct_arguments (
150164        ctx  =  ctx ,
151165        attr  =  ctx .rule .attr ,
@@ -165,6 +179,7 @@ def _clippy_aspect_impl(target, ctx):
165179        build_flags_files  =  build_flags_files ,
166180        emit  =  ["dep-info" , "metadata" ],
167181        skip_expanding_rustc_env  =  True ,
182+         use_json_output  =  bool (clippy_diagnostics ),
168183        error_format  =  error_format ,
169184    )
170185
@@ -217,7 +232,7 @@ def _clippy_aspect_impl(target, ctx):
217232    ctx .actions .run (
218233        executable  =  ctx .executable ._process_wrapper ,
219234        inputs  =  compile_inputs ,
220-         outputs  =  [clippy_out ],
235+         outputs  =  [clippy_out ]  +  [ x   for   x   in  [ clippy_diagnostics ]  if   x ] ,
221236        env  =  env ,
222237        tools  =  [toolchain .clippy_driver ],
223238        arguments  =  args .all ,
@@ -226,8 +241,12 @@ def _clippy_aspect_impl(target, ctx):
226241        toolchain  =  "@rules_rust//rust:toolchain_type" ,
227242    )
228243
244+     output_group_info  =  {"clippy_checks" : depset ([clippy_out ])}
245+     if  clippy_diagnostics :
246+         output_group_info ["clippy_output" ] =  depset ([clippy_diagnostics ])
247+ 
229248    return  [
230-         OutputGroupInfo (clippy_checks   =   depset ([ clippy_out ]) ),
249+         OutputGroupInfo (** output_group_info ),
231250        ClippyInfo (output  =  depset ([clippy_out ])),
232251    ]
233252
@@ -255,6 +274,10 @@ rust_clippy_aspect = aspect(
255274            doc  =  "Arguments to pass to clippy" ,
256275            default  =  Label ("//rust/settings:clippy_flags" ),
257276        ),
277+         "_clippy_output_diagnostics" : attr .label (
278+             doc  =  "Value of the `clippy_output_diagnostics` build setting" ,
279+             default  =  "//rust/settings:clippy_output_diagnostics" ,
280+         ),
258281        "_config" : attr .label (
259282            doc  =  "The `clippy.toml` file used for configuration" ,
260283            allow_single_file  =  True ,
@@ -395,3 +418,25 @@ capture_clippy_output = rule(
395418    implementation  =  _capture_clippy_output_impl ,
396419    build_setting  =  config .bool (flag  =  True ),
397420)
421+ 
422+ def  _clippy_output_diagnostics_impl (ctx ):
423+     """Implementation of the `clippy_output_diagnostics` rule 
424+ 
425+     Args: 
426+         ctx (ctx): The rule's context object 
427+ 
428+     Returns: 
429+         list: A list containing the CaptureClippyOutputInfo provider 
430+     """ 
431+     return  [ClippyOutputDiagnosticsInfo (output_diagnostics  =  ctx .build_setting_value )]
432+ 
433+ clippy_output_diagnostics  =  rule (
434+     doc  =  (
435+         "Setting this flag from the command line with `--@rules_rust//rust/settings:clippy_output_diagnostics` "  + 
436+         "makes rules_rust save lippy json output (suitable for consumption by rust-analyzer) in a file, "  + 
437+         "available from the `clippy_output` output group. This is the clippy equivalent of "  + 
438+         "`@rules_rust//settings:rustc_output_diagnostics`." 
439+     ),
440+     implementation  =  _clippy_output_diagnostics_impl ,
441+     build_setting  =  config .bool (flag  =  True ),
442+ )
0 commit comments