Используйте JDT, чтобы получить полное имя метода - PullRequest
5 голосов
/ 11 ноября 2009

Я новичок в разработке плагинов для затмения и пытаюсь преобразовать IMethod в строковое представление полного имени метода. И.Е.

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

До сих пор мне приходилось вручную раскручивать свое решение. Есть ли лучший способ?

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;
}

Ответы [ 3 ]

4 голосов
/ 11 ноября 2009

Вы можете получить полное имя для типа, используя

method.getDeclaringType().getFullyQualifiedName();

Это, вероятно, проще, чем доступ к пакету из модуля компиляции. Функция остальных из вас выглядит правильно.

Одна небольшая точка: вы должны использовать StringBuilder для создания строки вместо добавления к стандартной строке. Строки являются неизменяемыми, поэтому сложение создает множество ненужных временных объектов.

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();
}
3 голосов
/ 12 ноября 2009

Благодаря iain и дополнительным исследованиям я придумала это решение. Кажется, что-то вроде этого должно быть встроено в 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 голосов
/ 11 ноября 2009

Я не уверен, что он учел бы все случаи (метод внутри класса, анонимный класс с общими параметрами ...)

Когда дело доходит до сигнатур методов, нужно рассмотреть следующие классы:

Вам необходимо получить jdt.core.dom.IMethodBinding, из которого вы можете извлечь все, что вам нужно.

Если у вас есть MethodInvocation, вы можете:

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