1

TL;DR:我知道 MPS 2017.2 不会更新字段引用。问题是如何正确处理,以便 DSL 用户不必重新键入所有程序,以防发生单个“变量类型更改”

这是 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; 
}

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

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
}

如果我将变量的类型更新aBar,则test方法中的代码仍将引用Foo. 当然,check model识别损坏的参考,但是我想知道在 MPS 中解决这类 DSL 问题的预期方法是什么?

“更新”脚本是否应该找到所有“字段用法”并相应地更新模型?是否应该禁止“字段类型更新”并要求用户确认?(例如某种重构或任何意图)

我正在 MPS 中构建 61131 ST 语言,所以我正在研究“静态类型语言”类型的 DSL。

4

1 回答 1

1

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

如果引用超出范围,MPS 通常会根据名称重新绑定引用,但用户必须按 F5 才能做到这一点。

除此之外,我们遇到了与您相同的问题,即这些错误没有呈现给用户,变量的类型发生了变化。即使是 baseLanguage 也有这个问题。

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

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

于 2018-01-19T19:27:54.670 回答