@Override protected List<INode> getLocationNodes(EObject obj) { if (obj instanceof XMemberFeatureCall || obj instanceof XAssignment || obj instanceof XFeatureCall) { List<INode> resultNodes = Lists.newArrayList(); final ICompositeNode startNode = findNodeFor(obj); boolean crossRefConsumed = false; for (INode child : startNode.getChildren()) { if (crossRefConsumed) { resultNodes.add(child); } else { EObject grammarElement = child.getGrammarElement(); if (grammarElement instanceof CrossReference) { // We don't use the grammar access to be more robust against // overwriting grammars Assignment assignment = GrammarUtil.containingAssignment(grammarElement); if (XbasePackage.Literals.XABSTRACT_FEATURE_CALL__FEATURE .getName() .equals(assignment.getFeature())) { crossRefConsumed = true; resultNodes.add(child); } } } } if (!resultNodes.isEmpty()) return resultNodes; } return super.getLocationNodes(obj); }
/** * @return true, if the parent node could contain cross references to the same semantic element as * the given node. */ protected boolean shouldCheckParentNode(INode node) { EObject grammarElement = node.getGrammarElement(); if (grammarElement instanceof AbstractElement) { ICompositeNode parent = node.getParent(); if (parent != null && !parent.hasDirectSemanticElement()) { Assignment assignment = GrammarUtil.containingAssignment(grammarElement); return assignment == null; } } return false; }
protected EStructuralFeatureAndEObject find(XtextResource resource, int offset) { INode leaf = NodeModelUtils.findLeafNodeAtOffset(resource.getParseResult().getRootNode(), offset); NodeIterator ni = null; while (ni == null || ni.hasNext()) { INode next = ni == null ? leaf : ni.next(); if (ni == null) ni = new NodeIterator(leaf); EObject object = NodeModelUtils.findActualSemanticObjectFor(next); INode current = next; do { Assignment ass = GrammarUtil.containingAssignment(current.getGrammarElement()); if (ass != null) { EStructuralFeature feat = object.eClass().getEStructuralFeature(ass.getFeature()); if (feat != null && matches(object, feat)) return create(object, feat); } current = current.getParent(); } while (current != null && object == NodeModelUtils.findActualSemanticObjectFor(current)); } throw new RuntimeException("No EStructuralFeature found at offset " + offset); }
public boolean isUnassignedRuleCall(final RuleCall c) { boolean _xblockexpression = false; { boolean _isEObjectRuleCall = GrammarUtil.isEObjectRuleCall(c); if (_isEObjectRuleCall) { return false; } final Assignment ass = GrammarUtil.containingAssignment(c); boolean _or = false; boolean _equals = Objects.equal(ass, null); if (_equals) { _or = true; } else { boolean _isBooleanAssignment = GrammarUtil.isBooleanAssignment(ass); _or = _isBooleanAssignment; } _xblockexpression = _or; } return _xblockexpression; }