package org.erlide.ui.syntaxcoloring;
import com.google.common.base.Objects;
import com.google.inject.Inject;
import java.util.Arrays;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.xtext.AbstractRule;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.nodemodel.BidiTreeIterable;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.parser.IParseResult;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.syntaxcoloring.DefaultHighlightingConfiguration;
import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor;
import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.InputOutput;
import org.erlide.erlang.Atom;
import org.erlide.erlang.Expression;
import org.erlide.erlang.Macro;
import org.erlide.erlang.ModelExtensions;
import org.erlide.erlang.Module;
import org.erlide.erlang.RemoteTarget;
import org.erlide.services.ErlangGrammarAccess;
import org.erlide.ui.syntaxcoloring.ErlangSemanticHighlightingConfiguration;
import org.erlide.ui.syntaxcoloring.SafeAcceptorWrapper;
@SuppressWarnings("all")
public class ErlangSemanticHighlightingCalculator implements ISemanticHighlightingCalculator {
@Inject
private ErlangGrammarAccess grammarAccess;
@Inject
@Extension
private ModelExtensions modelExtensions;
@Override
public void provideHighlightingFor(final XtextResource resource, final IHighlightedPositionAcceptor acceptor) {
boolean _equals = Objects.equal(resource, null);
if (_equals) {
return;
}
final SafeAcceptorWrapper myacceptor = new SafeAcceptorWrapper(acceptor);
this.provideNodeBasedHighlighting(resource, myacceptor);
this.provideSemanticHighlighting(resource, myacceptor);
this.provideTextualHighlighting(resource, myacceptor);
this.provideResourceLevelHighlighting(resource, myacceptor);
}
protected void _highlight(final RuleCall grammarElement, final INode node, final IHighlightedPositionAcceptor acceptor) {
AbstractRule _rule = grammarElement.getRule();
boolean _equals = Objects.equal(_rule, null);
if (_equals) {
return;
}
AbstractRule _rule_1 = grammarElement.getRule();
ParserRule _kWRule = this.grammarAccess.getKWRule();
boolean _equals_1 = Objects.equal(_rule_1, _kWRule);
if (_equals_1) {
this.highlightNode(node, DefaultHighlightingConfiguration.DEFAULT_ID, acceptor);
}
boolean _or = false;
boolean _or_1 = false;
AbstractRule _rule_2 = grammarElement.getRule();
ParserRule _ifdefAttributeRule = this.grammarAccess.getIfdefAttributeRule();
boolean _equals_2 = Objects.equal(_rule_2, _ifdefAttributeRule);
if (_equals_2) {
_or_1 = true;
} else {
AbstractRule _rule_3 = grammarElement.getRule();
ParserRule _elseAttributeRule = this.grammarAccess.getElseAttributeRule();
boolean _equals_3 = Objects.equal(_rule_3, _elseAttributeRule);
_or_1 = _equals_3;
}
if (_or_1) {
_or = true;
} else {
AbstractRule _rule_4 = grammarElement.getRule();
ParserRule _endifAttributeRule = this.grammarAccess.getEndifAttributeRule();
boolean _equals_4 = Objects.equal(_rule_4, _endifAttributeRule);
_or = _equals_4;
}
if (_or) {
this.highlightNode(node,
ErlangSemanticHighlightingConfiguration.STRUCTURAL_ATTRIBUTE_ID, acceptor);
}
}
protected void _highlight(final Keyword grammarElement, final INode node, final IHighlightedPositionAcceptor acceptor) {
}
protected void _highlight(final EObject grammarElement, final INode node, final IHighlightedPositionAcceptor acceptor) {
InputOutput.<String>println(("!!! highlight -- " + grammarElement));
}
private void highlightNode(final INode node, final String id, final IHighlightedPositionAcceptor acceptor) {
boolean _equals = Objects.equal(node, null);
if (_equals) {
return;
}
int _offset = node.getOffset();
int _length = node.getLength();
acceptor.addPosition(_offset, _length, id);
if ((node instanceof ILeafNode)) {
int _offset_1 = ((ILeafNode)node).getOffset();
int _length_1 = ((ILeafNode)node).getLength();
acceptor.addPosition(_offset_1, _length_1, id);
} else {
Iterable<ILeafNode> _leafNodes = node.getLeafNodes();
for (final ILeafNode leaf : _leafNodes) {
boolean _isHidden = leaf.isHidden();
boolean _not = (!_isHidden);
if (_not) {
int _offset_2 = leaf.getOffset();
int _length_2 = leaf.getLength();
acceptor.addPosition(_offset_2, _length_2, id);
}
}
}
}
public INode getFirstFeatureNode(final EObject semantic, final EStructuralFeature feature) {
boolean _equals = Objects.equal(feature, null);
if (_equals) {
return NodeModelUtils.findActualNodeFor(semantic);
}
final List<INode> nodes = NodeModelUtils.findNodesForFeature(semantic, feature);
boolean _isEmpty = nodes.isEmpty();
boolean _not = (!_isEmpty);
if (_not) {
return nodes.get(0);
}
return null;
}
/**
* Iterate over parser nodes and provide highlighting based on rule calls.
*
* @param resource
* @param acceptor
*/
private void provideNodeBasedHighlighting(final XtextResource resource, final IHighlightedPositionAcceptor acceptor) {
IParseResult _parseResult = resource.getParseResult();
ICompositeNode _rootNode = _parseResult.getRootNode();
final BidiTreeIterable<INode> allNodes = _rootNode.getAsTreeIterable();
for (final INode node : allNodes) {
{
final EObject gElem = node.getGrammarElement();
if ((gElem instanceof RuleCall)) {
this.highlight(gElem, node, acceptor);
} else {
if ((gElem instanceof Keyword)) {
this.highlight(gElem, node, acceptor);
}
}
}
}
}
private void provideResourceLevelHighlighting(final XtextResource resource, final IHighlightedPositionAcceptor acceptor) {
}
/**
* Iterate over the generated model and provide highlighting
*
* @param resource
* @param acceptor
*/
private void provideSemanticHighlighting(final XtextResource resource, final IHighlightedPositionAcceptor acceptor) {
final EList<EObject> contents = resource.getContents();
boolean _or = false;
boolean _equals = Objects.equal(contents, null);
if (_equals) {
_or = true;
} else {
int _size = contents.size();
boolean _equals_1 = (_size == 0);
_or = _equals_1;
}
if (_or) {
return;
}
EObject _get = contents.get(0);
final Module model = ((Module) _get);
this.highlight(model, acceptor);
}
private void provideTextualHighlighting(final XtextResource resource, final IHighlightedPositionAcceptor acceptor) {
}
protected void _highlight(final Module model, final IHighlightedPositionAcceptor acceptor) {
final TreeIterator<EObject> all = model.eAllContents();
while (all.hasNext()) {
EObject _next = all.next();
this.highlight(_next, acceptor);
}
}
protected void _highlight(final Macro model, final IHighlightedPositionAcceptor acceptor) {
final INode node = NodeModelUtils.getNode(model);
this.highlightNode(node, ErlangSemanticHighlightingConfiguration.MACRO_ID, acceptor);
}
protected void _highlight(final Atom model, final IHighlightedPositionAcceptor acceptor) {
final INode node = NodeModelUtils.getNode(model);
boolean _and = false;
EObject _eContainer = model.eContainer();
if (!(_eContainer instanceof RemoteTarget)) {
_and = false;
} else {
EObject _eContainer_1 = model.eContainer();
Expression _module = ((RemoteTarget) _eContainer_1).getModule();
boolean _equals = Objects.equal(_module, model);
_and = _equals;
}
if (_and) {
this.highlightNode(node, ErlangSemanticHighlightingConfiguration.STRING_ID, acceptor);
}
boolean _and_1 = false;
EObject _eContainer_2 = model.eContainer();
if (!(_eContainer_2 instanceof RemoteTarget)) {
_and_1 = false;
} else {
EObject _eContainer_3 = model.eContainer();
Expression _function = ((RemoteTarget) _eContainer_3).getFunction();
boolean _equals_1 = Objects.equal(_function, model);
_and_1 = _equals_1;
}
if (_and_1) {
this.highlightNode(node, ErlangSemanticHighlightingConfiguration.COMMENT_ID, acceptor);
}
}
protected void _highlight(final EObject o, final IHighlightedPositionAcceptor acceptor) {
}
public void highlight(final EObject grammarElement, final INode node, final IHighlightedPositionAcceptor acceptor) {
if (grammarElement instanceof Keyword) {
_highlight((Keyword)grammarElement, node, acceptor);
return;
} else if (grammarElement instanceof RuleCall) {
_highlight((RuleCall)grammarElement, node, acceptor);
return;
} else if (grammarElement != null) {
_highlight(grammarElement, node, acceptor);
return;
} else {
throw new IllegalArgumentException("Unhandled parameter types: " +
Arrays.<Object>asList(grammarElement, node, acceptor).toString());
}
}
public void highlight(final EObject model, final IHighlightedPositionAcceptor acceptor) {
if (model instanceof Atom) {
_highlight((Atom)model, acceptor);
return;
} else if (model instanceof Macro) {
_highlight((Macro)model, acceptor);
return;
} else if (model instanceof Module) {
_highlight((Module)model, acceptor);
return;
} else if (model != null) {
_highlight(model, acceptor);
return;
} else {
throw new IllegalArgumentException("Unhandled parameter types: " +
Arrays.<Object>asList(model, acceptor).toString());
}
}
}