/** * 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.lang.reflect.Method; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.xcore.ui.XcoreJavaProjectProvider; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.ILocalVariable; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.xtext.common.types.JvmFormalParameter; import org.eclipse.xtext.common.types.JvmIdentifiableElement; import org.eclipse.xtext.common.types.JvmTypeParameter; import org.eclipse.xtext.common.types.JvmTypeParameterDeclarator; import org.eclipse.xtext.common.types.util.jdt.JavaElementFinder; import com.google.inject.Inject; public class XcoreJavaElementFinder extends JavaElementFinder { @Inject private XcoreJavaProjectProvider projectProvider; @Override protected IJavaElement internalFindElementFor(JvmIdentifiableElement element, boolean isExactMatchOnly) { if (element != null) { Resource resource = element.eResource(); if (resource != null) { for (IJavaProject javaProject : projectProvider.getJavaProjects(resource)) { Implementation implementation = new Finder(javaProject, isExactMatchOnly); IJavaElement result = implementation.doSwitch(element); if (result != null) { return result; } } } } return null; } public static class Finder extends Implementation { public Finder(IJavaProject javaProject, boolean isExactMatchOnly) { super(javaProject, isExactMatchOnly); } @Override public IJavaElement caseJvmTypeParameter(JvmTypeParameter jvmTypeParameter) { JvmTypeParameterDeclarator declarator = jvmTypeParameter.getDeclarator(); IJavaElement javaElement = this.doSwitch(declarator); return javaElement instanceof IType ? ((IType)javaElement).getTypeParameter(jvmTypeParameter.getName()) : javaElement instanceof IMethod ? ((IMethod)javaElement).getTypeParameter(jvmTypeParameter.getName()) : null; } @Override public IJavaElement caseJvmFormalParameter(JvmFormalParameter jvmFormalParameter) { IJavaElement javaElement = this.doSwitch(jvmFormalParameter.eContainer()); if (javaElement instanceof IMethod) { String name = jvmFormalParameter.getName(); for (ILocalVariable parameter : getParameters((IMethod)javaElement)) { if (name.equals(parameter.getElementName())) { return parameter; } } } return null; } private static final Method GET_PARAMETERS_METHOD; static { Method getParametersMethod = null; try { getParametersMethod = IMethod.class.getMethod("getParameters"); } catch (Throwable exception) { // Ignore. } GET_PARAMETERS_METHOD = getParametersMethod; } private ILocalVariable[] getParameters(IMethod method) { try { return (ILocalVariable[])GET_PARAMETERS_METHOD.invoke(method); } catch (Throwable exception) { return new ILocalVariable[0]; } } } }