/******************************************************************************* * Copyright (c) 2012 BMW Car IT and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.jnario.spec.ui.highlighting; import static org.eclipse.xtext.nodemodel.util.NodeModelUtils.findNodesForFeature; import static org.eclipse.xtext.xbase.ui.highlighting.XbaseHighlightingConfiguration.EXTENSION_METHOD_INVOCATION; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtend.core.xtend.XtendField; import org.eclipse.xtend.core.xtend.XtendFunction; import org.eclipse.xtend.core.xtend.XtendMember; import org.eclipse.xtend.core.xtend.XtendPackage; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation; import org.jnario.ExampleTable; import org.jnario.JnarioPackage; import org.jnario.spec.spec.Example; import org.jnario.spec.spec.ExampleGroup; import org.jnario.spec.spec.SpecFile; import org.jnario.spec.spec.SpecPackage; import org.jnario.spec.spec.TestFunction; import org.jnario.ui.highlighting.JnarioHighlightingCalculator; import com.google.common.collect.Iterables; /** * @author Sebastian Benz - Initial contribution and API */ @SuppressWarnings("restriction") public class SpecHighlightingCalculator extends JnarioHighlightingCalculator { @Override protected void doProvideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor) { EObject root = resource.getContents().get(0); if (!(root instanceof SpecFile)) { return; } SpecFile file = (SpecFile) root; for (ExampleGroup exampleGroup : Iterables.filter(file.getXtendTypes(), ExampleGroup.class)) { for (XAnnotation annotation : exampleGroup.getAnnotations()) { highlightDeprecatedXtendAnnotationTarget(acceptor, exampleGroup, annotation); } provideHighlightingFor(exampleGroup, acceptor); } super.doProvideHighlightingFor(resource, acceptor); } protected void provideHighlightingFor(ExampleGroup exampleGroup, IHighlightedPositionAcceptor acceptor) { if (exampleGroup != null) { for (XtendMember member : exampleGroup.getMembers()) { if (XtendPackage.Literals.XTEND_FUNCTION.isSuperTypeOf(member.eClass())) { XtendFunction function = (XtendFunction) member; XExpression rootExpression = function.getExpression(); highlightRichStrings(rootExpression, acceptor); }else if(member.eClass() == XtendPackage.Literals.XTEND_FIELD){ XtendField field = (XtendField) member; highlightXtendField(field,acceptor); XExpression initializer = field.getInitialValue(); highlightRichStrings(initializer, acceptor); }else if(member.eClass() == SpecPackage.Literals.EXAMPLE){ Example example = (Example) member; highlightRichStrings(example.getExpression() ,acceptor); }else if(member.eClass() == SpecPackage.Literals.EXAMPLE_GROUP){ ExampleGroup subExampleGroup = (ExampleGroup) member; provideHighlightingFor(subExampleGroup,acceptor); }else if(member.eClass() == JnarioPackage.Literals.EXAMPLE_TABLE){ provideHighlightingFor((ExampleTable)member,acceptor); }else if(member.eClass() == SpecPackage.Literals.TEST_FUNCTION){ TestFunction function = (TestFunction) member; highlightRichStrings(function.getExpression() ,acceptor); } for (XAnnotation annotation : member.getAnnotations()) { highlightDeprecatedXtendAnnotationTarget(acceptor, member, annotation); } } } } private void provideHighlightingFor(ExampleTable table, IHighlightedPositionAcceptor acceptor) { if(table == null){ return; } List<INode> nodes = findNodesForFeature(table, JnarioPackage.Literals.EXAMPLE_TABLE__COLUMNS); if(nodes.isEmpty()){ return; } highlighColumnNode(acceptor, nodes.get(0).getPreviousSibling()); for (INode node : nodes) { highlighColumnNode(acceptor, node); } } private void highlighColumnNode(IHighlightedPositionAcceptor acceptor, INode node) { highlightNode(node, EXTENSION_METHOD_INVOCATION, acceptor); } }