Uploaded image for project: 'Tools (JBoss Tools)'
  1. Tools (JBoss Tools)
  2. JBIDE-17708

Workaround different classnames when finding working copy for quickfix/resolution change

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Done
    • Icon: Major Major
    • 4.2.0.Beta3
    • 4.2.0.Beta2
    • common
    • None

      I'm writing a JUnit test to verify that a quickfix for a JAX-RS problem works fine, but my test fails because the change is not applied during the call to Change#perform().
      When digging into the code, I found that my problem is in the following method of org.jboss.tools.common.refactoring.MarkerResolutionUtils:

      @SuppressWarnings("unchecked")
      	public static <T extends IJavaElement> T findWorkingCopy(ICompilationUnit compilationUnit, T element) throws JavaModelException{
      		if(element instanceof IAnnotation){
      			IJavaElement parent = findWorkingCopy(compilationUnit, element.getParent());
      			if(parent instanceof IAnnotatable){
      				for(IAnnotation a : ((IAnnotatable)parent).getAnnotations()){
      					if(a.getElementName().equals(element.getElementName()))
      						return (T)a;
      				}
      			}
      		}else if(element instanceof ILocalVariable && ((ILocalVariable) element).isParameter()){
      			IJavaElement parent = findWorkingCopy(compilationUnit, element.getParent());
      			if(parent instanceof IMethod){
      				for(ILocalVariable parameter : ((IMethod)parent).getParameters()){
      					if(parameter.getElementName().equals(element.getElementName()) && parameter.getTypeSignature().equals(((ILocalVariable)element).getTypeSignature()))
      						return (T)parameter;
      				}
      			}
      		}else{
      			IJavaElement[] elements = compilationUnit.findElements(element);
      			if(elements != null){
      				for(IJavaElement e : elements){
      					if(e.getClass().equals(element.getClass()))
      						return (T)e;
      				}
      			}
      		}
      		return null;
      	}
      
      

      In the code above, the last if/else block checks if e.getClass().equals(element.getClass()), which does not work in my case because I have org.eclipse.jdt.internal.core.SourceType vs org.eclipse.jdt.internal.core.ResolvedSourceType. I wonder if we should not replace this part with a comparison of a comparision of getHandleIdentifier() of both elements, which would make more sense, I believe.
      For example, in my unit tests, it would be: =org.jboss.tools.ws.jaxrs.tests.sampleproject/src\/main\/java<org.jboss.tools.ws.jaxrs.sample.services{BAZ.java[BAZ in both cases

            xcoulon@redhat.com Xavier Coulon
            xcoulon@redhat.com Xavier Coulon
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: