@@ -45,6 +45,8 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
45
45
RustAnalyzerInfo: Info with the embedded spec file.
46
46
"""
47
47
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
48
50
49
51
# Recreate the provider with the spec file embedded in it.
50
52
rust_analyzer_info = RustAnalyzerInfo (
@@ -55,7 +57,9 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
55
57
deps = base_info .deps ,
56
58
id = base_info .id ,
57
59
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 ,
59
63
build_info = base_info .build_info ,
60
64
)
61
65
@@ -101,23 +105,36 @@ def _rust_analyzer_aspect_impl(target, ctx):
101
105
# Gather required info from dependencies.
102
106
label_to_id = {} # {Label of dependency => crate_id}
103
107
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]
104
110
attrs = ctx .rule .attr
105
111
all_deps = getattr (attrs , "deps" , []) + getattr (attrs , "proc_macro_deps" , []) + \
106
112
[dep for dep in [getattr (attrs , "crate" , None ), getattr (attrs , "actual" , None )] if dep != None ]
107
113
for dep in all_deps :
108
114
if RustAnalyzerInfo in dep :
109
115
label_to_id [dep .label ] = dep [RustAnalyzerInfo ].id
110
116
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 )
111
119
if RustAnalyzerGroupInfo in dep :
112
120
for expanded_dep in dep [RustAnalyzerGroupInfo ].deps :
113
121
label_to_id [expanded_dep ] = expanded_dep
114
122
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 )
115
125
116
126
deps = label_to_id .values ()
117
127
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 )
118
130
119
131
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
+ )]
121
138
elif rust_common .crate_info in target :
122
139
crate_info = target [rust_common .crate_info ]
123
140
elif rust_common .test_crate_info in target :
@@ -134,6 +151,8 @@ def _rust_analyzer_aspect_impl(target, ctx):
134
151
# An arbitrary unique and stable identifier.
135
152
crate_id = "ID-" + crate_info .root .path
136
153
154
+ proc_macro_dylib = find_proc_macro_dylib (toolchain , target )
155
+
137
156
rust_analyzer_info = write_rust_analyzer_spec_file (ctx , ctx .rule .attr , ctx .label , RustAnalyzerInfo (
138
157
id = crate_id ,
139
158
aliases = aliases ,
@@ -142,23 +161,29 @@ def _rust_analyzer_aspect_impl(target, ctx):
142
161
env = crate_info .rustc_env ,
143
162
deps = deps ,
144
163
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 ,
146
167
build_info = build_info ,
147
168
))
148
169
149
170
return [
150
171
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
+ ),
152
177
]
153
178
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.
156
181
157
182
Args:
158
183
toolchain: The current rust toolchain.
159
184
target: The current target.
160
185
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.
162
187
"""
163
188
if rust_common .crate_info in target :
164
189
crate_info = target [rust_common .crate_info ]
@@ -174,7 +199,7 @@ def find_proc_macro_dylib_path(toolchain, target):
174
199
for action in target .actions :
175
200
for output in action .outputs .to_list ():
176
201
if output .extension == dylib_ext [1 :]:
177
- return output . path
202
+ return output
178
203
179
204
# Failed to find the dylib path inside a proc-macro crate.
180
205
# TODO: Should this be an error?
@@ -266,8 +291,8 @@ def _create_single_crate(ctx, attrs, info):
266
291
crate ["cfg" ] = info .cfgs
267
292
toolchain = find_toolchain (ctx )
268
293
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
271
296
return crate
272
297
273
298
def _rust_analyzer_toolchain_impl (ctx ):
0 commit comments