I would like to use Xtext's validation of the default terminal rule ID
programmatically. Using the default example grammar:
Model:
greetings+=Greeting*;
Greeting:
'Hello' name=ID '!';
and creating a Greeting
entity with an invalid name (ID
can't start with a number):
Greeting greeting = MyDSLFactory.eInstance.createGreeting();
greeting.setName("8Jane");
and checking it with the injected IConcreteSyntaxValidator
:
IConcreteSyntaxValidator syntaxValidator = Activator.getInstance().getInjector("MyDSL")
.getInstance(IConcreteSyntaxValidator.class);
ArrayList<Diagnostic> diagnostics = new ArrayList<Diagnostic>();
syntaxValidator.validateObject(greeting,
new IConcreteSyntaxValidator.DiagnosticListAcceptor(diagnostics), new HashMap<Object, Object>());
does not add an error message to diagnostics
. Maybe it doesn't work because ID
returns an EString
? Or the IConcreteSyntaxValidator is not validating terminal rules? Is there another way?
EDIT: In the end I used the DefaultTerminalConverters
to check if text
is an ID:
DefaultTerminalConverters valueConverter = Activator.getInstance()
.getInjector("MyDSL").getInstance(DefaultTerminalConverters.class);
try {
valueConverter.ID().toString(text);
} catch (ValueConverterException e) {
// give warning that text is not an ID
}