/*
* generated by Xtext
* Updated manually.
* @author mrb
*/
package net.certware.argument.language.validation;
import java.util.List;
import net.certware.argument.language.l.LPackage;
import net.certware.argument.language.l.Program;
import net.certware.argument.language.l.Range;
import net.certware.argument.language.l.Rule;
import net.certware.argument.language.l.Sentence;
import net.certware.argument.language.l.TVar;
import net.certware.argument.language.l.TypeDeclaration;
import net.certware.argument.language.l.TypeId;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.validation.Check;
/**
* Custom validation rules.
* Using Guice injection method with the Java-based EValidator API.
*/
public class LJavaValidator extends net.certware.argument.language.validation.AbstractLJavaValidator {
/**
* Check program has at least one sentence.
* @param program
* @category error if program has no sentences
*/
@Check public void checkProgramEmpty(Program program) {
if ( program.getStatements().isEmpty() ) {
error(Messages.getString("LJavaValidator.0"), //$NON-NLS-1$
LPackage.Literals.PROGRAM__STATEMENTS);
}
}
/**
* Check whether range has both left and right sides.
* @param range
* @category warning if either left or right elements is empty
*/
@Check public void checkRangeIncludesLeftAndRight(Range range) {
if ( range.getLhs().eContents().isEmpty() == true ||
range.getRhs().eContents().isEmpty() == true ) {
warning(Messages.getString("LJavaValidator.1"), //$NON-NLS-1$
LPackage.Literals.RANGE__LHS);
}
}
/**
* Check type variable refers to defined type.
* @param tvar typed variable
* @category error if type variable refers to undefined type
*/
@Check public void checkTypeVariableRefersToDefinedType(TVar tvar) {
boolean found = false;
String id = tvar.getId().getName();
if ( id.isEmpty() ) // premature test, bail out
return;
EObject program = EcoreUtil2.getRootContainer(tvar);
List<TypeDeclaration> typeDeclarations =
EcoreUtil2.getAllContentsOfType(program, TypeDeclaration.class);
for ( TypeDeclaration td : typeDeclarations ) {
TypeId typeId = td.getName();
if ( typeId.getName().equals(id)) {
found = true;
break;
}
}
if ( ! found ) { // haven't found a declaration, emit error
error(Messages.getString("LJavaValidator.2"), //$NON-NLS-1$
LPackage.Literals.TVAR__ID);
}
}
/**
* Check body of conditional rule.
* May not reach here because parser seems to trap the condition.
* @param rule program rule with 'if' part provided
* @category error when 'if' provided but body empty
*/
@Check public void checkRuleConditionWithoutBody(Rule rule) {
if ( rule.getCondition().equalsIgnoreCase("if")) { //$NON-NLS-1$
if ( rule.eIsSet(LPackage.Literals.RULE__BODY) == false ) {
error(Messages.getString("LJavaValidator.3"), //$NON-NLS-1$
LPackage.Literals.RULE__BODY);
}
}
}
/**
* Check that rule RHS bodies ultimately are found to have LHS heads.
* @param rule rule to check
*/
@Check public void checkRuleBodyCompletedWithHeads(Rule rule) {
//System.err.println("rule " + rule.getHead().toString());
if ( rule.eIsSet(LPackage.Literals.RULE__BODY) == true ) {
Sentence sentence = rule.getBody();
//System.err.println("rule body " + sentence.toString());
for ( EObject eo : sentence.eContents() ) {
//System.err.println("item " + eo);
}
}
}
}