public static EReference getReference(CrossReference crossRef) { EClassifier referenceOwner = findCurrentType(crossRef); if (referenceOwner instanceof EClass) return getReference(crossRef, (EClass) referenceOwner); return null; }
protected String getFullReferenceName(EObject semanticObject, CrossReference reference) { EReference ref = GrammarUtil.getReference(reference); String clazz = semanticObject.eClass().getName(); if (ref.getEContainingClass() != semanticObject.eClass()) clazz = ref.getEContainingClass().getName() + "(" + clazz + ")"; return clazz + "." + ref.getName(); }
protected Iterable<AbstractElement> findValidAssignmentsForCrossRef(EObject semanticObj, Iterable<AbstractElement> assignedElements, EObject value, INode node) { List<AbstractElement> result = Lists.newArrayList(); for (AbstractElement ass : assignedElements) { CrossReference crossref = GrammarUtil.containingCrossReference(ass); EReference eref = GrammarUtil.getReference(crossref, semanticObj.eClass()); if (EcoreUtil2.isAssignableFrom(eref.getEReferenceType(), value.eClass()) && crossRefSerializer.isValid(semanticObj, crossref, value, node, null)) result.add(ass); } return result; }
public boolean equalsOrReplacesNode(EObject context, CrossReference crossref, EObject target, INode node) { if (crossref != node.getGrammarElement()) return false; EReference ref = GrammarUtil.getReference(crossref); if (!ref.isMany()) return true; List<EObject> objects = linkingService.getLinkedObjects(context, ref, node); return objects.contains(target); }
protected void lookupCrossReference(CrossReference crossReference, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor, Predicate<IEObjectDescription> filter) { ParserRule containingParserRule = GrammarUtil.containingParserRule(crossReference); if (!GrammarUtil.isDatatypeRule(containingParserRule)) { EReference ref = GrammarUtil.getReference(crossReference); lookupCrossReference(crossReference, ref, contentAssistContext, acceptor, filter); } }
protected void lookupCrossReference(CrossReference crossReference, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor, Predicate<IEObjectDescription> filter, Function<IEObjectDescription, ICompletionProposal> proposalFactory) { ParserRule containingParserRule = GrammarUtil.containingParserRule(crossReference); if (!GrammarUtil.isDatatypeRule(containingParserRule)) { EReference ref = GrammarUtil.getReference(crossReference); lookupCrossReference(crossReference, ref, acceptor, filter, proposalFactory); } }
public boolean isValid(EObject context, CrossReference crossref, EObject target, IErrorAcceptor errorAcceptor) { try { final EReference ref = GrammarUtil.getReference(crossref, context.eClass()); String text = getUnconvertedLinkText(target, ref, context); if (text == null) return true; // maybe we'll find something useful in the node model later on? getConvertedValue(text, crossref); return true; } catch (ValueConverterException e) { if (errorAcceptor != null) errorAcceptor.error(e.getMessage()); return false; } }
public boolean isValid(EObject semanticObject, CrossReference crossref, EObject target, INode node, Acceptor errors) { if (target.eIsProxy() && node != null) return true; final EReference ref = GrammarUtil.getReference(crossref, semanticObject.eClass()); final IScope scope = scopeProvider.getScope(semanticObject, ref); if (scope == null) { if (errors != null) errors.accept(diagnostics.getNoScopeFoundDiagnostic(semanticObject, crossref, target)); return false; } return getCrossReferenceNameFromScope(semanticObject, crossref, target, scope, errors) != null; }
protected EReference getUnresolvedEReference(final Issue issue, EObject target) { final ICompositeNode node = NodeModelUtils.getNode(target); if (node==null) return null; ICompositeNode rootNode = node.getRootNode(); ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(rootNode, issue.getOffset()); CrossReference crossReference = findCrossReference(target, leaf); if (crossReference != null) { return GrammarUtil.getReference(crossReference, target.eClass()); } return null; }
public String serializeCrossRef(EObject context, CrossReference grammarElement, final EObject target, INode node) { final EReference ref = GrammarUtil.getReference(grammarElement, context.eClass()); String text = null; if (node != null) { List<EObject> objects = linkingService.getLinkedObjects(context, ref, node); if (Iterables.any(objects, new Predicate<EObject>() { private final URI targetURI = EcoreUtil.getURI(target); public boolean apply(EObject input) { return input == target || EcoreUtil.getURI(input).equals(targetURI); } })) return ITokenSerializer.KEEP_VALUE_FROM_NODE_MODEL; } text = getUnconvertedLinkText(target, ref, context); if (text != null) return getConvertedValue(text, grammarElement); if (node != null) { return linkingHelper.getCrossRefNodeAsString(node, false); } return null; }
protected void _createProposals(final CrossReference reference, final ContentAssistContext context, final IIdeContentProposalAcceptor acceptor) { final EClassifier type = this._currentTypeFinder.findCurrentTypeAfter(reference); if ((type instanceof EClass)) { final EReference ereference = GrammarUtil.getReference(reference, ((EClass)type)); final EObject currentModel = context.getCurrentModel(); if (((ereference != null) && (currentModel != null))) { final IScope scope = this.scopeProvider.getScope(currentModel, ereference); this.crossrefProposalProvider.lookupCrossReference(scope, reference, context, acceptor, this.getCrossrefFilter(reference, context)); } } }
public String getCrossRefText(EObject owner, CrossReference crossref, EObject target, RefTextEvaluator refTextEvaluator, ITextRegion linkTextRegion, StatusWrapper status) { try { final EReference ref = GrammarUtil.getReference(crossref, owner.eClass()); final IScope scope = scopeProvider.getScope(owner, ref); if (scope == null) {
private void installProxies(EObject obj, IDiagnosticProducer producer, Multimap<EStructuralFeature.Setting, INode> settingsToLink, ICompositeNode parentNode) { final EClass eClass = obj.eClass(); if (eClass.getEAllReferences().size() - eClass.getEAllContainments().size() == 0) return; for (INode node = parentNode.getFirstChild(); node != null; node = node.getNextSibling()) { EObject grammarElement = node.getGrammarElement(); if (grammarElement instanceof CrossReference && hasLeafNodes(node)) { producer.setNode(node); final EReference eRef = GrammarUtil.getReference((CrossReference) grammarElement, eClass); if (eRef == null) { throw new IllegalStateException("Couldn't find EReference for crossreference " + grammarElement); } if (!eRef.isResolveProxies() /*|| eRef.getEOpposite() != null see https://bugs.eclipse.org/bugs/show_bug.cgi?id=282486*/) { final EStructuralFeature.Setting setting = ((InternalEObject) obj).eSetting(eRef); settingsToLink.put(new SettingDelegate(setting), node); } else { createAndSetProxy(obj, node, eRef); } } } if (shouldCheckParentNode(parentNode)) { installProxies(obj, producer, settingsToLink, parentNode.getParent()); } }
protected EObject resolveCrossReferencedElement(INode node) { EObject referenceOwner = NodeModelUtils.findActualSemanticObjectFor(node); if (referenceOwner != null) { EReference crossReference = GrammarUtil.getReference((CrossReference) node.getGrammarElement(), referenceOwner.eClass()); if (!crossReference.isMany()) { return (EObject) referenceOwner.eGet(crossReference); } else { List<?> listValue = (List<?>) referenceOwner.eGet(crossReference); List<INode> nodesForFeature = NodeModelUtils.findNodesForFeature(referenceOwner, crossReference); int currentIndex = 0; for (INode nodeForFeature : nodesForFeature) { if (currentIndex >= listValue.size()) return null; if (nodeForFeature.getTotalOffset() <= node.getTotalOffset() && nodeForFeature.getTotalEndOffset() >= node.getTotalEndOffset()) return (EObject) listValue.get(currentIndex); currentIndex++; } } } return null; }
@Override public void completeVariable_Parameters(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if ((mode & NORMAL) != 0) { VariableData data = new VariableData(model); if (data.doCreateProposals()) { String variableType = data.variable.getType(); if ("CrossReference".equals(variableType)) { List<CrossReference> crossReferences = GrammarUtil.containedCrossReferences(data.rule); for(CrossReference crossReference: crossReferences) { EReference reference = GrammarUtil.getReference(crossReference); String fqn = reference.getEContainingClass().getName() + "." + reference.getName(); acceptor.accept(createCompletionProposal(fqn, context)); acceptor.accept(createCompletionProposal("'" + fqn + "'", context)); } } else if ("Enum".equals(variableType)) { } super.completeVariable_Parameters(model, assignment, context, acceptor); } } }
@Override protected EObject resolveCrossReferencedElement(INode node) { EObject referenceOwner = NodeModelUtils.findActualSemanticObjectFor(node); if (referenceOwner != null) { EReference crossReference = GrammarUtil.getReference((CrossReference) node.getGrammarElement(), referenceOwner.eClass()); if (!crossReference.isMany()) { EObject resultOrProxy = (EObject) referenceOwner.eGet(crossReference); if (resultOrProxy != null && resultOrProxy.eIsProxy() && crossReference == XbasePackage.Literals.XCONSTRUCTOR_CALL__CONSTRUCTOR) { if (referenceOwner instanceof XConstructorCall) { JvmIdentifiableElement linkedType = batchTypeResolver.resolveTypes(referenceOwner).getLinkedFeature((XConstructorCall)referenceOwner); if (linkedType != null) return linkedType; } } return resultOrProxy; } else { return super.resolveCrossReferencedElement(node); } } return null; }
@SuppressWarnings({ "rawtypes", "unchecked" }) protected void ensureIsLinked(EObject obj, INode node, CrossReference ref, Set<EReference> handledReferences, IDiagnosticProducer producer) { final EReference eRef = GrammarUtil.getReference(ref, obj.eClass()); if (eRef == null) { ILinkingDiagnosticMessageProvider.ILinkingDiagnosticContext context = createDiagnosticContext(obj, eRef,
public void completeNestedCrossReference(CrossReference crossReference, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { Assignment assignment = (Assignment) crossReference.eContainer(); EReference reference = GrammarUtil.getReference(crossReference); if (reference != null) { String proposalText = "${" + assignment.getFeature() + ":CrossReference("+ reference.getEContainingClass().getName() + "." + reference.getName() +")}"; StyledString displayText = new StyledString("${", StyledString.DECORATIONS_STYLER) .append(assignment.getFeature()) .append(":CrossReference(", StyledString.DECORATIONS_STYLER) .append(reference.getEContainingClass().getName() + "." + reference.getName(), StyledString.COUNTER_STYLER) .append(")}", StyledString.DECORATIONS_STYLER) .append(" - Create a new template variable", StyledString.QUALIFIER_STYLER); ICompletionProposal proposal = createCompletionProposal(proposalText, displayText, null, context); if (proposal instanceof ConfigurableCompletionProposal) { ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal; configurable.setSelectionStart(configurable.getReplacementOffset() + 2); configurable.setSelectionLength(assignment.getFeature().length()); configurable.setAutoInsertable(false); configurable.setSimpleLinkedMode(context.getViewer(), '\t'); configurable.setPriority(configurable.getPriority() * 2); } acceptor.accept(proposal); } }
public String serializeCrossRef(EObject semanticObject, CrossReference crossref, EObject target, INode node, Acceptor errors) { if (target.eIsProxy() && node != null) return tokenUtil.serializeNode(node); final EReference ref = GrammarUtil.getReference(crossref, semanticObject.eClass()); final IScope scope = scopeProvider.getScope(semanticObject, ref); if (scope == null) { if (errors != null) errors.accept(diagnostics.getNoScopeFoundDiagnostic(semanticObject, crossref, target)); return null; } if (node != null) { String text = linkingHelper.getCrossRefNodeAsString(node, true); QualifiedName qn = qualifiedNameConverter.toQualifiedName(text); URI targetURI = EcoreUtil.getURI(target); if (target.eResource() != null && target.eResource().getResourceSet() != null) targetURI = target.eResource().getResourceSet().getURIConverter().normalize(targetURI); for (IEObjectDescription desc : scope.getElements(qn)) if (desc.getEObjectURI().equals(targetURI)) return tokenUtil.serializeNode(node); } return getCrossReferenceNameFromScope(semanticObject, crossref, target, scope, errors); }