2009-11-11 21 views
5

Jestem nowy w rozwoju wtyczki Eclipse i próbuję przekonwertować IMethod na ciąg reprezentujący pełną nazwę metody. TO ZNACZY.Użyj JDT, aby uzyskać pełną nazwę metody

my.full.package.ClassName.methodName(int param, String string) 

Do tej pory musiałem przekazać własne rozwiązanie. Czy istnieje lepszy sposób?

private static String getMethodFullName(IMethod iMethod) 
{ 
    String packageString = "[Default Package]"; 
    try { 
     IPackageDeclaration[] declarations = iMethod.getCompilationUnit().getPackageDeclarations(); 
     if(declarations.length > 0) 
     { 
      packageString = declarations[0].getElementName(); 
     }   
    } catch (JavaModelException e) { 
    } 

    String classString = iMethod.getCompilationUnit().getElementName(); 
    classString = classString.replaceAll(".java", ""); 

    String methodString = iMethod.getElementName() + "("; 
    for (String type : iMethod.getParameterTypes()) { 
     methodString += type + ","; 
    } 
    methodString += ")"; 

    return packageString + "." + classString + "." + methodString; 
} 

Odpowiedz

3

Dzięki iain i innym badaniom wymyśliłem to rozwiązanie. Wygląda na to, że coś takiego powinno być wbudowane w JDT ....

import org.eclipse.jdt.core.Signature; 

private static String getMethodFullName(IMethod iMethod) 
{ 
     StringBuilder name = new StringBuilder(); 
     name.append(iMethod.getDeclaringType().getFullyQualifiedName()); 
     name.append("."); 
     name.append(iMethod.getElementName()); 
     name.append("("); 

     String comma = ""; 
     String[] parameterTypes = iMethod.getParameterTypes(); 
     try { 
      String[] parameterNames = iMethod.getParameterNames(); 
      for (int i=0; i<iMethod.getParameterTypes().length; ++i) { 
       name.append(comma); 
       name.append(Signature.toString(parameterTypes[i])); 
       name.append(" "); 
       name.append(parameterNames[i]); 
       comma = ", "; 
      } 
     } catch (JavaModelException e) { 
     } 

     name.append(")"); 

     return name.toString(); 
} 
+0

To miłe, że nigdy wcześniej nie widziałem klasy Signature – iain

0

Nie jestem pewien, czy to uwzględniać wszystkie przypadki (metoda wewnątrz klasy wewnętrznej, anonimowy klasy z parametrów ogólnych ...)

Jeśli chodzi o metody podpisów, zajęcia dla spojrzeć na to:

Musisz uzyskać jdt.core.dom.IMethodBinding, z którego możesz wydobyć wszystko, czego potrzebujesz.

Jeśli masz MethodInvocation można:

//MethodInvocation node 
ITypeBinding type = node.getExpression().resolveTypeBinding(); 
IMethodBinding method=node.resolveMethodBinding(); 
+0

Tak. VonC ma dobry punkt. ITypeBindings reprezentujące lokalne klasy i anonimowe klasy zwrócą pusty łańcuch, gdy wywoływana jest funkcja getFullyQualifiedName(). Ma to sens, ponieważ nie mają oficjalnej nazwy, ale jeśli używasz w pełni kwalifikowanych nazw, aby mieć unikalny identyfikator, możesz rozważyć użycie funkcji getKey() zamiast ... –

4

można uzyskać pełną nazwę dla typu używając

method.getDeclaringType().getFullyQualifiedName(); 

Jest to prawdopodobnie łatwiejsze niż dostęp do pakietu z jednostki kompilacji . Reszta z was wygląda dobrze.

Jeden mały punkt: należy użyć StringBuilder, aby zbudować ciąg zamiast dodawania do standardowego ciągu. Ciągi są niezmienne, więc dodanie tworzy mnóstwo niepotrzebnych obiektów tymczasowych.

private static String getMethodFullName(IMethod iMethod) 
{ 
     StringBuilder name = new StringBuilder(); 
     name.append(iMethod.getDeclaringType().getFullyQualifiedName()); 
     name.append("."); 
     name.append(iMethod.getElementName()); 
     name.append("("); 

     String comma = ""; 
     for (String type : iMethod.getParameterTypes()) { 
       name.append(comma); 
       comma = ", "; 
       name.append(type); 
     } 
     name.append(")"); 

     return name.toString(); 
} 
+0

To wygląda dobrze. Znalazłem sposób, aby typy parametrów były bardziej czytelne, więc połączę to rozwiązanie z moim. –

Powiązane problemy