如何使用代码同步intellij中的当前文件?

时间:2019-01-02 14:27:07

标签: java intellij-idea

我正在编写一个插件,该插件将getter和setter方法插入当前的Java文件中。我的问题是,每次我运行插件时,似乎都没有任何变化。但是,只有在我进入File |之后,更改才会发生。同步它们是否显示在文件中。

我已打开自动同步设置,但这不能解决问题。我还尝试研究了intellij社区版源代码,以尝试查看File | File背后的代码。同步但没有管理。

public void makeGetters(AnActionEvent e, ArrayList<String> lines, String mainLine) {
    Project project = e.getProject();
    Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
    Document document = FileEditorManager.getInstance(project).getSelectedTextEditor().getDocument();
    SelectionModel selectionModel = editor.getSelectionModel();
    VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document);
    String fileName = virtualFile.getPath();

    String method = "Error method not initiated";
    String returnType = "Error return type not initiated";
    for (String s : lines) {
        String[] lineArray = s.split(" ");
        if (s.contains(" String ")) {
            returnType = "String";
        }
        else if (s.contains(" int ")) {
            returnType = "int";
        }
        else if (s.contains(" double ")) {
            returnType = "double";
        }
        else if (s.contains(" boolean ")) {
            returnType = "boolean";
        }
        method = "\n\tpublic " + returnType + " getName () { return " + lineArray[5] + " }\n";
        try {
            insert(fileName, method, mainLine);
        } catch (IOException exception) {
            Messages.showInfoMessage("IOException in insert method", "IOException!");
        } finally {
          //Some line(s) of code which will synchronize the document.
        }

public void insert(String fileName, String method, String mainLine) throws IOException {
    Path path = Paths.get(fileName);
    List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
    int line = lines.indexOf("    public static void main(String[] args) {") - 1;
    lines.add(line,method);
    Files.write(path, lines, StandardCharsets.UTF_8);
}

我希望代码先写入文件,然后最后使文件同步。

任何帮助或指导都是很好的。

2 个答案:

答案 0 :(得分:1)

查看documentation ...也许您应该尝试在插入方法的最后一行将最后一个参数传递给Files.write方法,即var args。检查一下:

“ options参数指定如何创建或打开文件。如果不存在任何选项,则此方法就像存在CREATE,TRUNCATE_EXISTING和WRITE选项一样工作。”

尝试传入SYNC。这是一个猜测,但有一定道理。

答案 1 :(得分:1)

下面的代码行解决了我的问题:

#define ON_WM_CHAR() \
    { WM_CHAR, 0, 0, 0, AfxSig_vwww, \
        (AFX_PMSG)(AFX_PMSGW) \
        (static_cast< void (AFX_MSG_CALL CWnd::*)(UINT, UINT, UINT) > ( &ThisClass :: OnChar)) },

#define ON_MESSAGE(message, memberFxn) \
    { message, 0, 0, 0, AfxSig_lwl, \
        (AFX_PMSG)(AFX_PMSGW) \
        (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > \
        (memberFxn)) },