Skip to content

Commit 925fac2

Browse files
author
Paolo Tranquilli
committed
Rust: split ImplItemCanonicalPath for trait and type impls
1 parent 874a2f1 commit 925fac2

25 files changed

+529
-273
lines changed

rust/extractor/src/generated/.generated.list

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/extractor/src/generated/mod.rs

Lines changed: 97 additions & 52 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/extractor/src/translate/base.rs

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -643,19 +643,36 @@ impl<'a> Translator<'a> {
643643
)
644644
}
645645
ItemContainer::Impl(it) => {
646-
let trait_ref = it.trait_ref(sema.db);
647-
let type_path = self.canonical_path_from_type(it.self_ty(sema.db))?;
648-
let trait_path = trait_ref.and_then(|t| self.canonical_path_from_trait_ref(t));
649-
Some(
650-
self.trap
651-
.emit(generated::ImplItemCanonicalPath {
652-
id: trap_key!("<", type_path, "as", trait_path, ">::", name),
653-
type_path,
654-
trait_path,
655-
name,
656-
})
657-
.into(),
658-
)
646+
let ty = it.self_ty(sema.db);
647+
if let Some(trait_path) = it
648+
.trait_ref(sema.db)
649+
.and_then(|t| self.canonical_path_from_trait_ref(t))
650+
{
651+
let type_path = self.canonical_path_from_type(ty)?;
652+
Some(
653+
self.trap
654+
.emit(generated::TraitImplItemCanonicalPath {
655+
id: trap_key!("<", type_path, "as", trait_path, ">::", name),
656+
type_path,
657+
trait_path,
658+
name,
659+
})
660+
.into(),
661+
)
662+
} else {
663+
// with no trait this must be an Adt impl
664+
let adt = ty.as_adt()?;
665+
let parent = self.canonical_path_from_module_item(adt)?;
666+
Some(
667+
self.trap
668+
.emit(generated::TypeImplItemCanonicalPath {
669+
id: trap_key!(parent, name),
670+
parent,
671+
name,
672+
})
673+
.into(),
674+
)
675+
}
659676
}
660677
ItemContainer::Module(it) => {
661678
let namespace = self.canonical_path_from_module(it)?;

rust/extractor/src/translate/label_cache.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use crate::generated::{self};
22
use crate::trap::{Label, TrapClass, UntypedLabel};
3-
use ra_ap_hir::{Crate, Enum, Function, Module, Struct, Trait, TraitRef, Type, Union, Variant};
3+
use ra_ap_hir::{
4+
Adt, Crate, Enum, Function, Module, Struct, Trait, TraitRef, Type, Union, Variant,
5+
};
46
use std::collections::HashMap;
57

68
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -57,6 +59,16 @@ impl StorableAsModuleItemCanonicalPath for Trait {
5759
}
5860
}
5961

62+
impl StorableAsModuleItemCanonicalPath for Adt {
63+
fn to_key(&self) -> Key {
64+
match *self {
65+
Adt::Struct(it) => Key::Struct(it),
66+
Adt::Union(it) => Key::Union(it),
67+
Adt::Enum(it) => Key::Enum(it),
68+
}
69+
}
70+
}
71+
6072
impl StorableAsModuleItemCanonicalPath for Enum {
6173
fn to_key(&self) -> Key {
6274
Key::Enum(*self)

rust/extractor/src/translate/mappings.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::translate::label_cache::StorableAsModuleItemCanonicalPath;
2-
use ra_ap_hir::{Enum, Module, Semantics, Struct, Trait, Union};
2+
use ra_ap_hir::{Adt, Enum, Module, Semantics, Struct, Trait, Union};
33
use ra_ap_ide_db::RootDatabase;
44
use ra_ap_syntax::{ast, ast::RangeItem, AstNode};
55

@@ -92,6 +92,16 @@ pub trait ModuleItem: StorableAsModuleItemCanonicalPath {
9292
fn name(&self, sema: &Semantics<'_, RootDatabase>) -> String;
9393
}
9494

95+
impl ModuleItem for Adt {
96+
fn module(&self, sema: &Semantics<'_, RootDatabase>) -> Module {
97+
Adt::module(*self, sema.db)
98+
}
99+
100+
fn name(&self, sema: &Semantics<'_, RootDatabase>) -> String {
101+
Adt::name(*self, sema.db).as_str().to_owned()
102+
}
103+
}
104+
95105
impl ModuleItem for Enum {
96106
fn module(&self, sema: &Semantics<'_, RootDatabase>) -> Module {
97107
Enum::module(*self, sema.db)

0 commit comments

Comments
 (0)