在插入符号

时间:2018-03-07 08:24:50

标签: intellij-idea intellij-plugin

我正在开发一个IntelliJ IDEA插件,以获取当前插入符号的上下文。更具体地说,我需要获得可以在插入符号中使用的变量类型和名称的列表。例如:

public static void main(String[] args) throws IOException {
    Workbook wb = new HSSFWorkbook();
    // caret 1
    Sheet sheet = wb.createSheet("new sheet");
    Row row = sheet.createRow((short) 1);
    for(int i = 0; i < 5; i++) {
        // caret 2
        row.createCell(i).setCellValue("X");
    }
    // caret 3
}

我需要在插入符1处获得wb: Workbook,在插入符号2处获得wb: Workbook, sheet: Sheet, row: Row, i: int,在插入符3处获得wb: Workbook, sheet: Sheet, row: Row因为i: int不再在范围内。

This link似乎有关,它建议file.findElementAt(editor.getCaretModel().getOffset())。此表达式返回PsiElement个对象。但是,当我获取此对象的上下文并使用PsiRecursiveElementVisitor遍历上下文时,它将访问在插入符号后定义的元素,这不符合我的上述要求。

我的代码:

public class ContextView extends AnAction {

    public void actionPerformed(AnActionEvent event) {
        final Editor editor = event.getRequiredData(CommonDataKeys.EDITOR);
        final Project project = event.getRequiredData(CommonDataKeys.PROJECT);
        //Access document, caret, and selection
        final Document document = editor.getDocument();
        PsiJavaFile javaFile = (PsiJavaFile) PsiDocumentManager.getInstance(project).getPsiFile(document);

        PsiElement currentEle = javaFile.findElementAt(editor.getCaretModel().getOffset());
        PsiElement cxt = currentEle.getContext();

        cxt.accept(new PsiRecursiveElementVisitor() {
            @Override
            public void visitElement(PsiElement element) {
                System.out.println(element.toString());
                super.visitElement(element);
            }
        });
    }
}

那么如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

  

此链接似乎相关,它建议使用file.findElementAt(editor.getCaretModel()。getOffset())。此表达式返回PsiElement对象。但是,当我获取此对象的上下文并使用PsiRecursiveElementVisitor遍历上下文时,它将访问在插入符号后定义的元素,这不符合我的上述要求。

你试过com.intellij.psi.util.PsiTreeUtil#getParentOfType(com.intellij.psi.PsiElement, java.lang.Class<T>)吗?您可以使用findElementAt的结果填充第一个参数,使用PsiDeclarationStatement.class填充第二个参数,这是变量声明的Psi类。

通过这个你可以得到局部变量声明。您可以按sout(parent.getText())

进行测试