@@ -53,7 +53,6 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
5353 cfgs = base_info .cfgs ,
5454 env = base_info .env ,
5555 deps = base_info .deps ,
56- id = base_info .id ,
5756 crate_specs = depset (direct = [crate_spec ], transitive = [base_info .crate_specs ]),
5857 proc_macro_dylib_path = base_info .proc_macro_dylib_path ,
5958 build_info = base_info .build_info ,
@@ -73,6 +72,21 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
7372
7473 return rust_analyzer_info
7574
75+ def _accumulate_rust_analyzer_info (dep_infos_to_accumulate , label_index_to_accumulate , dep ):
76+ if dep == None :
77+ return
78+ if RustAnalyzerInfo in dep :
79+ label_index_to_accumulate [dep .label ] = dep [RustAnalyzerInfo ]
80+ dep_infos_to_accumulate .append (dep [RustAnalyzerInfo ])
81+ if RustAnalyzerGroupInfo in dep :
82+ for expanded_dep in dep [RustAnalyzerGroupInfo ].deps :
83+ label_index_to_accumulate [expanded_dep .crate .owner ] = expanded_dep
84+ dep_infos_to_accumulate .append (expanded_dep )
85+
86+ def _accumulate_rust_analyzer_infos (dep_infos_to_accumulate , label_index_to_accumulate , deps_attr ):
87+ for dep in deps_attr :
88+ _accumulate_rust_analyzer_info (dep_infos_to_accumulate , label_index_to_accumulate , dep )
89+
7690def _rust_analyzer_aspect_impl (target , ctx ):
7791 if (rust_common .crate_info not in target and
7892 rust_common .test_crate_info not in target and
@@ -93,55 +107,41 @@ def _rust_analyzer_aspect_impl(target, ctx):
93107 cfgs += [f [6 :] for f in ctx .rule .attr .rustc_flags if f .startswith ("--cfg " ) or f .startswith ("--cfg=" )]
94108
95109 build_info = None
110+ dep_infos = []
111+ labels_to_rais = {}
112+
96113 for dep in getattr (ctx .rule .attr , "deps" , []):
97114 # Save BuildInfo if we find any (for build script output)
98115 if BuildInfo in dep :
99116 build_info = dep [BuildInfo ]
100117
101- # Gather required info from dependencies.
102- label_to_id = {} # {Label of dependency => crate_id}
103- crate_specs = [] # [depset of File - transitive crate_spec.json files]
104- attrs = ctx .rule .attr
105- all_deps = getattr (attrs , "deps" , []) + getattr (attrs , "proc_macro_deps" , []) + \
106- [dep for dep in [getattr (attrs , "crate" , None ), getattr (attrs , "actual" , None )] if dep != None ]
107- for dep in all_deps :
108- if RustAnalyzerInfo in dep :
109- label_to_id [dep .label ] = dep [RustAnalyzerInfo ].id
110- crate_specs .append (dep [RustAnalyzerInfo ].crate_specs )
111- if RustAnalyzerGroupInfo in dep :
112- for expanded_dep in dep [RustAnalyzerGroupInfo ].deps :
113- label_to_id [expanded_dep ] = expanded_dep
114- crate_specs .append (dep [RustAnalyzerGroupInfo ].crate_specs )
115-
116- deps = label_to_id .values ()
117- crate_specs = depset (transitive = crate_specs )
118+ _accumulate_rust_analyzer_infos (dep_infos , labels_to_rais , getattr (ctx .rule .attr , "deps" , []))
119+ _accumulate_rust_analyzer_infos (dep_infos , labels_to_rais , getattr (ctx .rule .attr , "proc_macro_deps" , []))
120+
121+ _accumulate_rust_analyzer_info (dep_infos , labels_to_rais , getattr (ctx .rule .attr , "crate" , None ))
122+ _accumulate_rust_analyzer_info (dep_infos , labels_to_rais , getattr (ctx .rule .attr , "actual" , None ))
118123
119124 if rust_common .crate_group_info in target :
120- return [RustAnalyzerGroupInfo (deps = deps , crate_specs = crate_specs )]
125+ return [RustAnalyzerGroupInfo (deps = dep_infos )]
121126 elif rust_common .crate_info in target :
122127 crate_info = target [rust_common .crate_info ]
123128 elif rust_common .test_crate_info in target :
124129 crate_info = target [rust_common .test_crate_info ].crate
125130 else :
126131 fail ("Unexpected target type: {}" .format (target ))
127132
128- aliases = {
129- label_to_id [target .label ]: name
130- for (target , name ) in getattr (attrs , "aliases" , {}).items ()
131- if target .label in label_to_id
132- }
133-
134- # An arbitrary unique and stable identifier.
135- crate_id = "ID-" + crate_info .root .path
133+ aliases = {}
134+ for aliased_target , aliased_name in getattr (ctx .rule .attr , "aliases" , {}).items ():
135+ if aliased_target .label in labels_to_rais :
136+ aliases [labels_to_rais [aliased_target .label ]] = aliased_name
136137
137138 rust_analyzer_info = write_rust_analyzer_spec_file (ctx , ctx .rule .attr , ctx .label , RustAnalyzerInfo (
138- id = crate_id ,
139139 aliases = aliases ,
140140 crate = crate_info ,
141141 cfgs = cfgs ,
142142 env = crate_info .rustc_env ,
143- deps = deps ,
144- crate_specs = crate_specs ,
143+ deps = dep_infos ,
144+ crate_specs = depset ( transitive = [ dep . crate_specs for dep in dep_infos ]) ,
145145 proc_macro_dylib_path = find_proc_macro_dylib_path (toolchain , target ),
146146 build_info = build_info ,
147147 ))
@@ -193,6 +193,14 @@ _WORKSPACE_TEMPLATE = "__WORKSPACE__/"
193193_EXEC_ROOT_TEMPLATE = "__EXEC_ROOT__/"
194194_OUTPUT_BASE_TEMPLATE = "__OUTPUT_BASE__/"
195195
196+ def _crate_id (crate_info ):
197+ """Returns a unique stable identifier for a crate
198+
199+ Returns:
200+ (string): This crate's unique stable id.
201+ """
202+ return "ID-" + crate_info .root .path
203+
196204def _create_single_crate (ctx , attrs , info ):
197205 """Creates a crate in the rust-project.json format.
198206
@@ -206,7 +214,8 @@ def _create_single_crate(ctx, attrs, info):
206214 """
207215 crate_name = info .crate .name
208216 crate = dict ()
209- crate ["crate_id" ] = info .id
217+ crate_id = _crate_id (info .crate )
218+ crate ["crate_id" ] = crate_id
210219 crate ["display_name" ] = crate_name
211220 crate ["edition" ] = info .crate .edition
212221 crate ["env" ] = {}
@@ -254,8 +263,8 @@ def _create_single_crate(ctx, attrs, info):
254263 # There's one exception - if the dependency is the same crate name as the
255264 # the crate being processed, we don't add it as a dependency to itself. This is
256265 # common and expected - `rust_test.crate` pointing to the `rust_library`.
257- crate ["deps" ] = [id for id in info .deps if id != info . id ]
258- crate ["aliases" ] = info .aliases
266+ crate ["deps" ] = [_crate_id ( dep . crate ) for dep in info .deps if _crate_id ( dep . crate ) != crate_id ]
267+ crate ["aliases" ] = { _crate_id ( alias_target . crate ): alias_name for alias_target , alias_name in info .aliases . items ()}
259268 crate ["cfg" ] = info .cfgs
260269 toolchain = find_toolchain (ctx )
261270 crate ["target" ] = (_EXEC_ROOT_TEMPLATE + toolchain .target_json .path ) if toolchain .target_json else toolchain .target_flag_value
0 commit comments