У нас есть пользовательский DSL на основе Xtext и мы генерируем код C ++ из документа, написанного в этом DSL, через Xtend. Вот простой пример DSL:
component CMP
{
type A
{
B member_1;
}
type B
{
string member_1;
}
}
В конце концов, заголовочный файл, содержащий структуры C ++ (основанный на type
элементы) генерируется для каждого component
элемент. Теперь возникает следующая проблема: в моем DSL A
а также B
может быть правильно решена (хотя B
объявлен позже, чем A
). Но когда мы генерируем код C ++ и делаем что-то вроде resource.contents.filter(TypeElement)
перебирать все type
элементы, они доставляются в том же порядке, как заявлено в документе. Это приводит к ошибкам компилятора для получающегося заголовка C ++, потому что B
объявлен позже, чем A
и не может быть решен компилятором без предварительного объявления.
В таком случае я хочу показать ошибку в IDE (то есть, если существует ссылка на type
что происходит позже в документе). Есть ли какой-то стандартный валидатор для таких сценариев? Если нет, то как лучше всего решить эту проблему?
Заранее спасибо!
Не существует стандартного валидатора для прямых ссылок. Вам нужно будет определить один из них самостоятельно, основываясь на значениях ваших целей перекрестных ссылок. Введите ILocationInFileProvider
в свой валидатор, чтобы получить регион ссылочного экземпляра и сравнить его с регионом ссылочного владельца. Это поможет обнаружить прямые ссылки.
Других решений пока нет …