2

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
}

0 Answers0