rust: handle modules with same crate_name

crate_name do not need to be unique. A library may depend on two
different versions of the same crate. Use the module name instead of the
crate name when indexing the modules for rust-project.json.

Test: SOONG_GEN_RUST_PROJECT=1 m nothing
Bug: 162896400
Change-Id: I275f04639ef05f2b649c30168046e13b2efcacb9
This commit is contained in:
Thiébaud Weksteen
2020-08-05 14:27:32 +02:00
parent 891cd578c7
commit ad8ac53581
2 changed files with 59 additions and 6 deletions

View File

@@ -76,15 +76,15 @@ func mergeDependencies(ctx android.SingletonContext, project *rustProjectJson,
crate *rustProjectCrate, deps map[string]int) {
ctx.VisitDirectDeps(module, func(child android.Module) {
childId, childName, ok := appendLibraryAndDeps(ctx, project, knownCrates, child)
childId, childCrateName, ok := appendLibraryAndDeps(ctx, project, knownCrates, child)
if !ok {
return
}
if _, ok = deps[childName]; ok {
if _, ok = deps[ctx.ModuleName(child)]; ok {
return
}
crate.Deps = append(crate.Deps, rustProjectDep{Crate: childId, Name: childName})
deps[childName] = childId
crate.Deps = append(crate.Deps, rustProjectDep{Crate: childId, Name: childCrateName})
deps[ctx.ModuleName(child)] = childId
})
}
@@ -105,8 +105,9 @@ func appendLibraryAndDeps(ctx android.SingletonContext, project *rustProjectJson
if !ok {
return 0, "", false
}
moduleName := ctx.ModuleName(module)
crateName := rModule.CrateName()
if cInfo, ok := knownCrates[crateName]; ok {
if cInfo, ok := knownCrates[moduleName]; ok {
// We have seen this crate already; merge any new dependencies.
crate := project.Crates[cInfo.ID]
mergeDependencies(ctx, project, knownCrates, module, &crate, cInfo.Deps)
@@ -125,7 +126,7 @@ func appendLibraryAndDeps(ctx android.SingletonContext, project *rustProjectJson
mergeDependencies(ctx, project, knownCrates, module, &crate, deps)
id := len(project.Crates)
knownCrates[crateName] = crateInfo{ID: id, Deps: deps}
knownCrates[moduleName] = crateInfo{ID: id, Deps: deps}
project.Crates = append(project.Crates, crate)
// rust-analyzer requires that all crates belong to at least one root:
// https://github.com/rust-analyzer/rust-analyzer/issues/4735.