【问题标题】:How to create a file from an action event for an IntelliJ plugin?如何从 IntelliJ 插件的操作事件创建文件?
【发布时间】:2018-12-30 20:12:31
【问题描述】:

我正在使用 IntelliJ IDEA 社区版创建一个 PhpStorm 插件,我想知道如何从 PSIFileVirtualFile 在磁盘上创建文件。

这是我的代码:(上下文是来自 NewGroup 的操作)

我尝试使用PsiDirectory.copyFileFrom 方法创建文件,但我有一个异常com.intellij.util.IncorrectOperationException: Cannot copy non-physical file: PHP file

package fr.florent.idea.zendgenerator.action.NewGroup;

import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.util.ResourceUtil;
import com.jetbrains.php.lang.PhpFileType;
import fr.florent.idea.zendgenerator.action.AbstractDumbAwareAction;
import icons.PhpIcons;
import org.jetbrains.annotations.NotNull;

import java.net.URL;

public class CreateQueryAction extends AbstractDumbAwareAction {

    public CreateQueryAction() {
        super("Query", "Create query", PhpIcons.Php_icon);
    }

    @Override
    public void actionPerformed(@NotNull AnActionEvent e) {
        URL url = ResourceUtil.getResource(getClass(), "templates", "query.php"); // it contains an empty PHP class
        VirtualFile virtualFile = VfsUtil.findFileByURL(url);

        PsiFile file = PsiFileFactory.getInstance(e.getProject()).createFileFromText(
                virtualFile.getPath(),
                PhpFileType.INSTANCE,
                LoadTextUtil.loadText(virtualFile)
        );

        PsiDirectory directory = LangDataKeys.IDE_VIEW.getData(e.getDataContext()).getOrChooseDirectory();

        directory.copyFileFrom("query.php", file);

        System.out.println("Create query");
    }
}

我想根据我的操作在项目文件夹中创建文件。

如果有人能解释在 IntelliJ 插件中创建文件的过程,那就太好了。我认为文档真的很轻松。

在我的情况下,我想要编辑query.php 文件、重命名类名、添加方法、属性、doc 块并将其保存到磁盘的过程,但我不了解 PSI 元素。

【问题讨论】:

    标签: java intellij-idea intellij-plugin


    【解决方案1】:

    您可能还想在JB forum 上问这个问题,有一个类似的问题:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360001787320-Create-VirtualFile-or-PsiFile-from-content

    答案是:

    final PsiFileFactory factory = PsiFileFactory.getInstance(project);
    
    final PsiFile file = factory.createFileFromText(language, text);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2017-12-01
    • 2011-05-08
    相关资源
    最近更新 更多