@@ -45,6 +45,8 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
4545 RustAnalyzerInfo: Info with the embedded spec file.
4646 """
4747 crate_spec = ctx .actions .declare_file ("{}.rust_analyzer_crate_spec.json" .format (owner .name ))
48+ proc_macro_dylibs = [base_info .proc_macro_dylib ] if base_info .proc_macro_dylib else None
49+ build_info_out_dirs = [base_info .build_info .out_dir ] if base_info .build_info != None and base_info .build_info .out_dir != None else None
4850
4951 # Recreate the provider with the spec file embedded in it.
5052 rust_analyzer_info = RustAnalyzerInfo (
@@ -55,7 +57,9 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
5557 deps = base_info .deps ,
5658 id = base_info .id ,
5759 crate_specs = depset (direct = [crate_spec ], transitive = [base_info .crate_specs ]),
58- proc_macro_dylib_path = base_info .proc_macro_dylib_path ,
60+ proc_macro_dylibs = depset (direct = proc_macro_dylibs , transitive = [base_info .proc_macro_dylibs ]),
61+ build_info_out_dirs = depset (direct = build_info_out_dirs , transitive = [base_info .build_info_out_dirs ]),
62+ proc_macro_dylib = base_info .proc_macro_dylib ,
5963 build_info = base_info .build_info ,
6064 )
6165
@@ -101,23 +105,36 @@ def _rust_analyzer_aspect_impl(target, ctx):
101105 # Gather required info from dependencies.
102106 label_to_id = {} # {Label of dependency => crate_id}
103107 crate_specs = [] # [depset of File - transitive crate_spec.json files]
108+ proc_macro_dylibs = [] # [depset of File - transitive crate_spec.json files]
109+ build_script_out_dirs = [] # [depset of File - transitive crate_spec.json files]
104110 attrs = ctx .rule .attr
105111 all_deps = getattr (attrs , "deps" , []) + getattr (attrs , "proc_macro_deps" , []) + \
106112 [dep for dep in [getattr (attrs , "crate" , None ), getattr (attrs , "actual" , None )] if dep != None ]
107113 for dep in all_deps :
108114 if RustAnalyzerInfo in dep :
109115 label_to_id [dep .label ] = dep [RustAnalyzerInfo ].id
110116 crate_specs .append (dep [RustAnalyzerInfo ].crate_specs )
117+ proc_macro_dylibs .append (dep [RustAnalyzerInfo ].proc_macro_dylibs )
118+ build_script_out_dirs .append (dep [RustAnalyzerInfo ].build_info_out_dirs )
111119 if RustAnalyzerGroupInfo in dep :
112120 for expanded_dep in dep [RustAnalyzerGroupInfo ].deps :
113121 label_to_id [expanded_dep ] = expanded_dep
114122 crate_specs .append (dep [RustAnalyzerGroupInfo ].crate_specs )
123+ proc_macro_dylibs .append (dep [RustAnalyzerGroupInfo ].proc_macro_dylibs )
124+ build_script_out_dirs .append (dep [RustAnalyzerGroupInfo ].build_info_out_dirs )
115125
116126 deps = label_to_id .values ()
117127 crate_specs = depset (transitive = crate_specs )
128+ proc_macro_dylibs = depset (transitive = proc_macro_dylibs )
129+ build_script_out_dirs = depset (transitive = build_script_out_dirs )
118130
119131 if rust_common .crate_group_info in target :
120- return [RustAnalyzerGroupInfo (deps = deps , crate_specs = crate_specs )]
132+ return [RustAnalyzerGroupInfo (
133+ deps = deps ,
134+ crate_specs = crate_specs ,
135+ proc_macro_dylibs = proc_macro_dylibs ,
136+ build_info_out_dirs = build_script_out_dirs ,
137+ )]
121138 elif rust_common .crate_info in target :
122139 crate_info = target [rust_common .crate_info ]
123140 elif rust_common .test_crate_info in target :
@@ -134,6 +151,8 @@ def _rust_analyzer_aspect_impl(target, ctx):
134151 # An arbitrary unique and stable identifier.
135152 crate_id = "ID-" + crate_info .root .path
136153
154+ proc_macro_dylib = find_proc_macro_dylib (toolchain , target )
155+
137156 rust_analyzer_info = write_rust_analyzer_spec_file (ctx , ctx .rule .attr , ctx .label , RustAnalyzerInfo (
138157 id = crate_id ,
139158 aliases = aliases ,
@@ -142,23 +161,29 @@ def _rust_analyzer_aspect_impl(target, ctx):
142161 env = crate_info .rustc_env ,
143162 deps = deps ,
144163 crate_specs = crate_specs ,
145- proc_macro_dylib_path = find_proc_macro_dylib_path (toolchain , target ),
164+ proc_macro_dylibs = proc_macro_dylibs ,
165+ build_info_out_dirs = build_script_out_dirs ,
166+ proc_macro_dylib = proc_macro_dylib ,
146167 build_info = build_info ,
147168 ))
148169
149170 return [
150171 rust_analyzer_info ,
151- OutputGroupInfo (rust_analyzer_crate_spec = rust_analyzer_info .crate_specs ),
172+ OutputGroupInfo (
173+ rust_analyzer_crate_spec = rust_analyzer_info .crate_specs ,
174+ rust_analyzer_proc_macro_dylibs = rust_analyzer_info .proc_macro_dylibs ,
175+ rust_analyzer_build_info_out_dirs = rust_analyzer_info .build_info_out_dirs ,
176+ ),
152177 ]
153178
154- def find_proc_macro_dylib_path (toolchain , target ):
155- """Find the proc_macro_dylib_path of target. Returns None if target crate is not type proc-macro.
179+ def find_proc_macro_dylib (toolchain , target ):
180+ """Find the proc_macro_dylib of target. Returns None if target crate is not type proc-macro.
156181
157182 Args:
158183 toolchain: The current rust toolchain.
159184 target: The current target.
160185 Returns:
161- (path ): The path to the proc macro dylib, or None if this crate is not a proc-macro.
186+ (File ): The path to the proc macro dylib, or None if this crate is not a proc-macro.
162187 """
163188 if rust_common .crate_info in target :
164189 crate_info = target [rust_common .crate_info ]
@@ -174,7 +199,7 @@ def find_proc_macro_dylib_path(toolchain, target):
174199 for action in target .actions :
175200 for output in action .outputs .to_list ():
176201 if output .extension == dylib_ext [1 :]:
177- return output . path
202+ return output
178203
179204 # Failed to find the dylib path inside a proc-macro crate.
180205 # TODO: Should this be an error?
@@ -266,8 +291,8 @@ def _create_single_crate(ctx, attrs, info):
266291 crate ["cfg" ] = info .cfgs
267292 toolchain = find_toolchain (ctx )
268293 crate ["target" ] = (_EXEC_ROOT_TEMPLATE + toolchain .target_json .path ) if toolchain .target_json else toolchain .target_flag_value
269- if info .proc_macro_dylib_path != None :
270- crate ["proc_macro_dylib_path" ] = _EXEC_ROOT_TEMPLATE + info .proc_macro_dylib_path
294+ if info .proc_macro_dylib != None :
295+ crate ["proc_macro_dylib_path" ] = _EXEC_ROOT_TEMPLATE + info .proc_macro_dylib . path
271296 return crate
272297
273298def _rust_analyzer_toolchain_impl (ctx ):
0 commit comments