package org.jnario.compiler; import static com.google.common.collect.Iterators.concat; import static com.google.common.collect.Iterators.filter; import static org.jnario.jvmmodel.DoubleArrowSupport.isDoubleArrow; import static org.jnario.util.EObjects.allParents; import java.util.Iterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtend.core.typing.XtendExpressionHelper; import org.eclipse.xtext.xbase.XAbstractFeatureCall; import org.eclipse.xtext.xbase.XBinaryOperation; import org.eclipse.xtext.xbase.XBooleanLiteral; import org.eclipse.xtext.xbase.XClosure; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.XNullLiteral; import org.eclipse.xtext.xbase.XNumberLiteral; import org.eclipse.xtext.xbase.XStringLiteral; import org.eclipse.xtext.xbase.XTypeLiteral; import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation; import org.jnario.Assertion; public class JnarioExpressionHelper extends XtendExpressionHelper { @Override public boolean isShortCircuitOperation(XAbstractFeatureCall featureCall) { // if (!(featureCall instanceof XBinaryOperation)) { // return false; // } if (isInAssertion(featureCall)) { return false; } return super.isShortCircuitOperation(featureCall); } protected boolean isInAssertion(XAbstractFeatureCall featureCall) { Iterator<XExpression> context = concat(filterExpressions(featureCall.eAllContents()), filterExpressions(allParents(featureCall))); while(context.hasNext()){ XExpression current = context.next(); if(isDoubleArrow((XExpression)current)){ return true; }else if(current instanceof Assertion){ return true; }else if (current instanceof XClosure) { return false; } } return false; } private Iterator<XExpression> filterExpressions( Iterator<EObject> elements) { return filter(elements, XExpression.class); } public boolean isLiteral(XExpression expr) { return expr instanceof XClosure || expr instanceof XStringLiteral || expr instanceof XTypeLiteral || expr instanceof XBooleanLiteral || expr instanceof XNumberLiteral || expr instanceof XNullLiteral || expr instanceof XAnnotation; } }