Это то, что я хочу, я пытаюсь разобратьXText устанавливающих перекрестные ссылки для универсального типа
type Number(); // define a type called "Number" with no member variables
type Point(Number x, Number y); // define a type called Point with member variables
// and something with generic types
type Pair[T, V](T first, V second);
// and even something cyclic:
type LinkedList[T](T payload, LinkedList[T] rest);
И вот моя XText грамматика позволяет:
TypeDecl returns SSType:
'type' name=TypeName
('[' typeParams += TypeName (',' typeParams += TypeName)* ']')?
'(' (args += Arg (',' args += Arg)*)? ')' ';'
;
TypeName returns SSTypeName:
name=ID
;
Type:
tn = [SSTypeName] ('[' typeParams += Type (',' typeParams += Type)* ']')?
;
Arg:
type = Type argName = ID
;
Который работает, но слишком либеральным в том, что он принимает. Если что-то объявлено как общий (например, LinkedList в приведенном выше примере), оно должно быть действительным только для использования его в качестве общего (например, LinkedList[Number]
, а не LinkedList
), и в идеале арктичность аргументов типа будет принудительно применена.
И, конечно, если что-то объявлено не универсальным типом (например, Number), оно не должно быть действительным, чтобы дать ему аргументы типа.
Пример материала будет ошибочно принимаем:
type Wrong1(Number[Blah] a); // number doesn't have type arguments
type Wrong2(Pair a); // Pair has type arguments
type Wrong3(Pair[Number, Number, Number] a); // wrong arity
Любые предложения, комментарии, код или советы о том, как сделать это правильно будет высоко ценится.
Как насчет с точки зрения завершения кода? Когда кто-то вводит общий тип, я хочу, чтобы редактор знал, что им нужно вводить аргументы типа. Подобно этому не следует предлагать «парную» как таковую, она должна предлагать «Пара [T, V]» – Heptic
Вы должны настроить поддержку контента для этой цели (например, путем предоставления значимых значений для T, V, включая заполнителей после применения предложения) , –