pivot-lang icon indicating copy to clipboard operation
pivot-lang copied to clipboard

trait加法错误检查

Open RINNE-TAN opened this issue 1 year ago • 0 comments

目前的trait加法以及继承

trait A {
    fn a() bool;
}

trait B {
    fn b() i64;
}

trait C: A+B {
    fn c() void;
}

相当于C继承了A、B的方法变成

trait C {
    fn c() void;
    fn b() i64;
    fn a() bool;
}

但是在出现同名方法的时候(只需要名字一样,不需要整个函数签名一样),需要报错 比如以下几种情况都需要报错

trait A {
    fn a() bool;
}
trait B: A {
    fn a() void;
}
trait A {
    fn a() bool;
}

trait B {
    fn a() i64;
}

trait C: A+B {
    fn c() void;
}

需要关注的代码

pub struct STType {
    pub name: String,
    pub path: String,
    pub fields: LinkedHashMap<String, Field>,
    pub range: Range,
    pub doc: Vec<Box<NodeEnum>>,
    pub generic_map: IndexMap<String, Arc<RefCell<PLType>>>,
    pub derives: Vec<Arc<RefCell<PLType>>>,
    pub modifier: Option<(TokenType, Range)>,
    pub body_range: Range,
    pub is_trait: bool,
}

对于Trait C: A+B来说,derives就是[A,B] 需要在这个数组做初始化的时候,检查A,B,C的field是否存在名字冲突,初始化的逻辑在MultiTraitNode的get_types方法被调用的地方,需要注意的是A和B本身也可能继承别的trait,整个检查过程需要递归完成。

RINNE-TAN avatar Apr 26 '23 12:04 RINNE-TAN