我更新变量的类型(例如 Foo a; -> Bar b)MPS 如何更新 x.field 对新类型的引用?

I update type of a variable (e.g. Foo a; -> Bar b) how MPS updates x.field references to the new type?

TL;DR:我知道 MPS 2017.2 不会更新字段引用。问题是如何正确输入,这样 DSL 用户就不必在单个 "variable type change"

的情况下重新输入所有程序

这是 MPS 基本语言的示例:

public class Foo { 
  public int x; 
  public int y; 
} 

public class Bar { 
  public long x; 
  public long z; 
} 

public void test() { 
  Foo a; 
  a.x = 1; // "x" points to the field of class Foo
  a.y = 1; 
}

如果我在 Foo a; 中用 Bar 更新 Foo,那么测试代码看起来是一样的

public void test() { 
  Bar a; 
  a.x = 1; // "x" still points to the field of class Foo
  a.y = 1; // Of course this reference is now invalid, however MPS does not underline that
}

如果我将变量 a 的类型更新为 Bar,那么 test 方法中的代码仍将引用 Foo 的字段。当然,check model 识别出损坏的引用,但是我想知道在 MPS 中解决此类 DSL 问题的预期方法是什么?

"on update" 脚本是否应该找到所有 "field usages" 并相应地更新模型? 应该禁止 "field type updates" 并要求用户确认吗? (例如某种重构或任何意图)

我正在 MPS 中构建 61131 ST 语言,所以我正在研究 "static typed language" 种 DSL。

在我看来,这主要是 MPS 中的错误。 MPS 应该类似于类型系统,也跟踪范围规则的依赖关系,并在某些内容发生变化时重新评估它们。由于某种原因,MPS 不知道点操作(字段访问)对操作数局部变量有依赖性。因此,当您更改局部变量的类型时,它不会重新评估操作的范围。如果您按 F5,它将重新评估并显示错误,但这通常不是所需的行为。我认为这应该以通用方式在 MPS 中得到解决。

如果引用超出范围,MPS 通常会根据名称重新绑定引用,但用户必须按 F5 键才能实现。

除此之外,我们遇到了与您相同的问题,即这些错误未呈现给用户,变量类型已更改。甚至 baseLanguage 也有这个问题。

我刚刚在 MPS 问题跟踪器中提出了一个功能请求,请随时为它投票 and/or 在其中添加您的评论。

https://youtrack.jetbrains.com/issue/MPS-27328