Skip to content

trait加法错误检查 #281

Description

@kamome1037

目前的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,整个检查过程需要递归完成。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions