Trait methods have the same name as regular methods
还没有人认领这个 Issue。
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 35/100
调研方向
首先跟踪 parser 输出如何填充 uniast.Type.Methods,以及 collect 阶段如何处理符号类型 Object。将 Rust 中的 trait 方法冲突与 issue 中描述的 C++ 父类/子类方法情况进行比较。完成的标准是选择并实现一种稳定的表示方式,在不依赖不稳定的 parser 输出的情况下区分同名方法。
由索引模型根据 Issue 内容生成。
描述
处理同名方法和 trait 方法
考虑 rust 的例子:
struct Foo;
impl Foo { fn say(&self) { println!("foo.say") } }
trait Bar { fn say(&self); }
impl Bar for Foo { fn say(&self) { println!("Bar<Foo>.say") } }
fn g<T: Bar>(x: &T) { x.say(); }
Foo 的 say 方法应该有哪个?
按理说应该是 Foo.say,不是 Bar.say。
但是当前实现里,后者名为 say 也归属于 Foo,所以导致了重名函数的问题。
并且因为 uniast.Type.Methods[name] 只有一个函数,所以会导致 parser 输出不稳定。
要解决这个问题,有两个方法1
- 让 Bar.say 也归属于 Foo,把 uniast.Type.Methods 变成 name -> list[Identity]
- 让它单独归属于一个 trait object(标准 Rust 方法),需要在 collect 阶段处理 symbol kind Object。
同样,考虑到 C++ 有 OOP,类似问题存在,比如 Child.foo 重载 Parent.foo。
但是解决很简单,用亲类和后代类来区分就好。
(当然,如果有 C++ concept 了的话,需要更好的设计,但先不考虑)
- 主要语言
- Go
- 星标
- 391
- 派生
- 58
- 平均合并
- 2 天 21 小时
- 30 天内合并 PR
- 1
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
cloudwego/abcoder 的其他 Issue
-
难度 4/5 3-5 天 新手友好度 42/100
-
难度 4/5 3-5 天 新手友好度 55/100
-
难度 4/5 3-5 天 新手友好度 35/100
-
难度 3/5 1-2 天 新手友好度 55/100
-
难度 4/5 3-5 天 新手友好度 35/100
查看 cloudwego/abcoder 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 65/100
-
bug group: validation priority: low
难度 2/5 1-3 小时 新手友好度 75/100
codecheckers/chekhov#51 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
-
难度 2/5 1-3 小时 新手友好度 75/100
-
难度 2/5 1-3 小时 新手友好度 75/100