我正在开发一个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);
}
});
}
}
那么如何解决这个问题?
答案 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())