blob: d0d50fae8a0ff73274c289daa8cb17361d5d19c8 [file] [log] [blame]
/**
* Copyright (c) 2012 Eclipse contributors 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.eclipse.emf.ecore.xcore.findrefs;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.findReferences.ReferenceFinder;
import org.eclipse.xtext.findReferences.TargetURIs;
import org.eclipse.xtext.resource.IReferenceDescription;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.util.Pair;
import org.eclipse.xtext.util.Tuples;
import com.google.common.base.Predicate;
import com.google.common.collect.Sets;
public class XcoreReferenceFinder extends ReferenceFinder
{
/**
* @inheritDoc
*
* Xtext 2.10.x
*/
@Override
protected void findLocalReferencesFromElement(Predicate<URI> targetURIs, EObject sourceCandidate, Resource localResource,
Acceptor acceptor)
{
super.findLocalReferencesFromElement(targetURIs, sourceCandidate, localResource, new DuplicateFilter(acceptor));
}
@Override
protected void findReferencesInDescription(TargetURIs targetURIs, IResourceDescription resourceDescription,
IResourceAccess resourceAccess, Acceptor acceptor, IProgressMonitor monitor)
{
super.findReferencesInDescription(targetURIs, resourceDescription, resourceAccess, new DuplicateFilter(acceptor), monitor);
}
private static class DuplicateFilter implements Acceptor
{
private Acceptor delegate;
final Set<Pair<URI, EReference>> sourceURIEReferencePairs = Sets.newHashSet();
public DuplicateFilter(Acceptor delegate)
{
this.delegate = delegate;
}
public void accept(EObject source, URI sourceURI, EReference eReference, int index, EObject targetOrProxy,
URI targetURI)
{
if (sourceURIEReferencePairs.add(Tuples.pair(sourceURI, eReference)))
{
delegate.accept(source, sourceURI, eReference, index, targetOrProxy, targetURI);
}
}
public void accept(IReferenceDescription description)
{
if (sourceURIEReferencePairs.add(Tuples.pair(description.getSourceEObjectUri(), description.getEReference())))
{
delegate.accept(description);
}
}
}
}