Как получить CompilationUnit из IJavaCompletionProposal

1

Я пишу плагин, который читает java-проект, и в случае ошибки компилятора в программе он использует Eclipse JDT Quick fix для извлечения возможных решений для исправления ошибок компилятора. Код, который используется для поиска ошибки и решения eclipse для модуля ввода данных, приведен ниже:

private void collectCorrections(final ICompilationUnit cu, final CompilationUnit astRoot) {

    ArrayList<IProblem> problems = new ArrayList<IProblem>();
    for (IProblem iProblem : astRoot.getProblems()) 
        if (iProblem.isError()) problems.add(iProblem);

    Map<IProblem, ArrayList<IJavaCompletionProposal>> ErrorproposalsMap = new HashMap<IProblem,  ArrayList<IJavaCompletionProposal>>();

    for (IProblem iProblem : problems) {

         int offset = iProblem.getSourceStart();
         int length = iProblem.getSourceEnd() + 1 - offset;
         context = new AssistContext(cu, offset, length);
    }

    ProblemLocation problem = new ProblemLocation(iProblem);

    ArrayList<IJavaCompletionProposal> proposals = new ArrayList<IJavaCompletionProposal>();

    JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem }, proposals);

    ErrorproposalsMap.put(iProblem, proposals);
}

Я использую как iProblem, так и предложения, чтобы получить более подробную информацию об ошибке и решении. В качестве примера я использую iProblem.getOriginatingFileName(), чтобы извлечь файл, в котором произошла ошибка. Тем не менее, проблема, с которой я столкнулась, заключается в том, что я не знаю, как извлечь comilationUnit класса, который должен быть изменен для исправления ошибки.

В качестве простого примера, когда у нас есть ссылка на частную регистрацию (определенную в классе1) из другого класса (класс2), мы имеем ошибку компилятора. В этом случае мне нужно извлечь compilationUnit для класса 1. Обратите внимание, что getOriginatingFileName возвращает класс2.

Пожалуйста, дайте мне знать, как я могу извлечь непосредственно comilationUnit класса1, используя org.eclipse.jdt.core.compiler.IProblem и IJavaCompletionProposal.

Теги:
compiler-errors
eclipse-jdt

1 ответ

1
Лучший ответ

Вы можете использовать getCompilationUnit(), определенный в CUCorrectionProposal, для извлечения CompilationUnit класса 1. Обратите внимание, что LinkedCorrectionProposal расширяет CUCorrectionProposal. Тем не менее, я не уверен, что все Eclipse CorrectionProposal расширяют LinkedCorrectionProposal. Проверь это.

Решение может быть таким.

    CUCorrectionProposal cUCorrectionProposal = (CUCorrectionProposal) eclipseProposal;
    ICompilationUnit iCompilationUnit = cUCorrectionProposal.getCompilationUnit();

    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(iCompilationUnit );

    CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню