Я обновляю тип переменной (например, 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, не стесняйтесь голосовать за него и / или добавляйте туда свои комментарии.