blob: 1a47c928021876998d2874cbe994f616ed2d970d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 1C-Soft LLC.
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Vladimir Piskarev (1C) - initial API and implementation
*******************************************************************************/
package org.eclipse.handly.internal.examples.xtext.xtext.ui.callhierarchy;
import java.util.Iterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.handly.xtext.ui.callhierarchy.XtextCallHierarchyUtility;
import org.eclipse.xtext.AbstractRule;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.XtextPackage;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.IReferenceDescription;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.IResourceDescriptions;
import org.eclipse.xtext.ui.editor.findrefs.EditorResourceAccess;
import org.eclipse.xtext.util.ITextRegion;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
final class XtextXtextCallHierarchyUtility
extends XtextCallHierarchyUtility
{
@Inject
XtextXtextCallHierarchyUtility(EditorResourceAccess resourceAccess,
IResourceDescriptions indexData)
{
setResourceAccess(resourceAccess);
setIndexData(indexData);
}
@Override
protected boolean isCallReference(IReferenceDescription reference)
{
return super.isCallReference(reference) && isRule(
reference.getEReference().getEReferenceType());
}
@Override
protected ITextRegion getCallRegion(EObject sourceObject,
EReference callReference, int indexInList)
{
Assignment assignment = GrammarUtil.containingAssignment(sourceObject);
if (assignment != null)
return locationInFileProvider.getSignificantTextRegion(assignment);
return super.getCallRegion(sourceObject, callReference, indexInList);
}
IEObjectDescription getRuleDescription(URI objectUri)
{
IEObjectDescription description = getDescription(objectUri);
if (description != null && isRule(description.getEClass()))
return description;
return readOnly(objectUri, object -> getDescription(
EcoreUtil2.getContainerOfType(object, AbstractRule.class)));
}
IEObjectDescription getGrammarDescription(URI objectUri)
{
IResourceDescription resourceDescription =
indexData.getResourceDescription(objectUri.trimFragment());
if (resourceDescription != null)
{
Iterator<IEObjectDescription> it =
resourceDescription.getExportedObjectsByType(
XtextPackage.Literals.GRAMMAR).iterator();
if (it.hasNext())
return it.next();
}
return null;
}
IEObjectDescription getDescription(URI objectUri)
{
IResourceDescription resourceDescription =
indexData.getResourceDescription(objectUri.trimFragment());
if (resourceDescription != null)
{
Iterable<IEObjectDescription> descriptions =
resourceDescription.getExportedObjects();
for (IEObjectDescription description : descriptions)
{
if (objectUri.equals(description.getEObjectURI()))
return description;
}
}
return null;
}
IEObjectDescription getDescription(EObject object)
{
if (object != null)
{
Iterator<IEObjectDescription> it =
indexData.getExportedObjectsByObject(object).iterator();
if (it.hasNext())
return it.next();
}
return null;
}
static boolean isRule(EClass someClass)
{
return XtextPackage.Literals.ABSTRACT_RULE.isSuperTypeOf(someClass);
}
}