java - 如何从 IntelliJ 插件的操作事件创建文件?
问题描述
我正在使用 IntelliJ IDEA 社区版创建一个 PhpStorm 插件,我想知道如何从PSIFile
或VirtualFile
.
这是我的代码:(上下文是 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
文件、重命名类名、添加方法、属性、文档块并将其保存到磁盘的过程,但我不了解 PSI 元素。
解决方案
您可能还想在JB 论坛上问这个问题,有一个类似的问题:https ://intellij-support.jetbrains.com/hc/en-us/community/posts/360001787320-Create-VirtualFile-or-PsiFile-from-内容
答案是:
final PsiFileFactory factory = PsiFileFactory.getInstance(project);
final PsiFile file = factory.createFileFromText(language, text);
推荐阅读
- ios - iOS12 导致 Metal Command Buffer 执行出错,渲染出现故障或未发生
- puppeteer - 使用 puppeteer 加载动态内容?
- r - 如何在R中找到曲线下的面积?
- mysql - 如何在我的 sql 中模拟“Intead of”触发器
- amazon-web-services - 在 Google Cloud Platform 上构建 API
- java - JAVA - 比较两个数组并创建一个仅包含第一个唯一值的新数组
- database - Amazon Mobile Hub vs 自定义后端 vs Parse
- dll - Windows 10 点本地重定向未按预期运行
- xml - 仅当标签包含特定字符串时才具有属性
- java - Unity AndroidJNI 解析类但不解析方法