Я обновляю тип переменной (например, Foo a; -> Bar b), как MPS обновляет ссылки x.field на новый тип?

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

Если я обновлю Foo с Bar в 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
}

Если я обновлю тип переменной a в Barтогда код в test метод будет по-прежнему ссылаться на поля Foo, Конечно, check model идентифицирует неработающую ссылку, однако мне интересно, каков ожидаемый способ решения таких проблем с DSL в MPS?

Должны ли скрипты "при обновлении" находить все "поля" и обновлять модель соответственно? Следует ли запретить "обновления типа поля" и запрашивать подтверждение пользователя? (например, какой-то рефакторинг или другое намерение)

Я создаю 61131 ST язык в MPS, поэтому я смотрю на DSL типа "статический язык типизации".

1 ответ

Решение

На мой взгляд, это в основном ошибка в MPS. MPS должен быть похож на систему типов, а также отслеживать зависимости областей видимости и переоценивать их, когда что-то меняется. MPS по какой-то причине не знает, что от вашей точечной операции (доступа к полю) есть зависимость от операнда локальной переменной. Поэтому, когда вы изменяете тип локальной переменной, она не будет переоценивать объем операции. Если вы нажмете F5, он переоценит и покажет ошибку, но это обычно не желаемое поведение. Я думаю, что это должно быть решено в MPS в общем виде.

Обычно MPS хорошо справляется с перепривязкой ссылок на основе имени, если они выходят за рамки, но пользователь должен нажать F5, чтобы это произошло.

Кроме того, мы сталкиваемся с той же проблемой, что и вы, что эти ошибки не представлены пользователю, тип переменной изменяется. Даже baseLanguage имеет эту проблему.

Я только что отправил запрос на добавление функций в систему отслеживания проблем MPS, не стесняйтесь голосовать за него и / или добавляйте туда свои комментарии.

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

Другие вопросы по тегам