/** * 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.ui.refactoring; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.resource.IReferenceDescription; import org.eclipse.xtext.resource.IResourceDescriptions; import org.eclipse.xtext.resource.IResourceServiceProvider.Registry; import org.eclipse.xtext.ui.editor.findrefs.DefaultReferenceFinder; import org.eclipse.xtext.util.IAcceptor; import org.eclipse.xtext.util.Pair; import org.eclipse.xtext.util.Tuples; import com.google.common.collect.Sets; import com.google.inject.Inject; /** * This is specialized to filter out duplicates. */ public class XcoreReferenceFinder extends DefaultReferenceFinder { @Inject public XcoreReferenceFinder(IResourceDescriptions indexData, Registry serviceProviderRegistry) { super(indexData, serviceProviderRegistry); } @Override public void findReferences (Iterable<URI> targetURIs, Iterable<URI> sourceResourceURIs, ILocalResourceAccess localResourceAccess, IAcceptor<IReferenceDescription> referenceAcceptor, IProgressMonitor monitor) { super.findReferences(targetURIs, sourceResourceURIs, localResourceAccess, createFilteringReferenceAcceptor(referenceAcceptor), monitor); } @Override public void findAllReferences(Iterable<URI> targetURIs, ILocalResourceAccess localResourceAccess, IAcceptor<IReferenceDescription> referenceAcceptor, IProgressMonitor monitor) { super.findAllReferences(targetURIs, localResourceAccess, createFilteringReferenceAcceptor(referenceAcceptor), monitor); } protected IAcceptor<IReferenceDescription> createFilteringReferenceAcceptor(final IAcceptor<IReferenceDescription> referenceAcceptor) { final Set<Pair<URI, EReference>> sourceURIEReferencePairs = Sets.newHashSet(); return new IAcceptor<IReferenceDescription>() { public void accept(IReferenceDescription referenceDescription) { if (sourceURIEReferencePairs.add(Tuples.pair(referenceDescription.getSourceEObjectUri(), referenceDescription.getEReference()))) { referenceAcceptor.accept(referenceDescription); } } }; } }