gpt4 book ai didi

java - Eclipse 插件 : IDE. openEditor 抛出 IllegalArgumentException

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:41 26 4
gpt4 key购买 nike

我正在编写一个 Eclipse 插件。它对 Java 代码运行代码分析,并使用 ListViewer 报告违反特定标准的代码行。当有人在列表查看器中选择其中一行时,我想打开 Eclipse Java 文件编辑器到该文件并转到该行。分析工作的方式是,每个违规都有一个字段,其中包含作为标准 java.io.File 发生违规的文件。因此,我需要将其转换为 IFile,以便我可以在 Eclipse Java 编辑器中打开它。

以下是当用户单击列表查看器中的某一行时运行的大部分代码。违规是我创建的类,用于表示违反某些标准的特定 Java 代码行:

Violation selectedViolation = <I get this from the ListViewer> 
IPath path = new Path(violation.getSourceFile().getAbsolutePath());
IFile toOpen = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if (editorPart == null) {
IWorkbenchPage curPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
editorPart = IDE.openEditor(curPage, toOpen, true);
}

运行此程序,我在调用 IDE.openEditor(对应于 CalisthenicsView.java:75)的行上得到 IllegalArgumentException:

at org.eclipse.ui.part.FileEditorInput.getPath(FileEditorInput.java:218)
at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3163)
at org.eclipse.ui.internal.WorkbenchPage.access$25(WorkbenchPage.java:3149)
at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:3131)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3126)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3090)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3080)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:541)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:500)
at com.chairbender.eclipse.object_calisthenics_analyzer.views.CalisthenicsView$1.selectionChanged(CalisthenicsView.java:75)

我查看了在 FileEditorInput.java:218 中抛出此问题的源代码行。显然它是这样做的(其中"file"与第一个代码块中的“toOpen”相同):

 final URI locationURI = file.getLocationURI();
if (locationURI == null)
throw new IllegalArgumentException();

对我来说,出于某种原因,.getFile(path) 似乎返回了一个没有 locationURI 的 IFile。我不知道为什么。

有办法解决这个问题吗?有没有其他方法可以完成此操作(将 Java 编辑器打开到特定文件的特定行)?请记住,我无权访问 IProject,因为此分析可以在工作区甚至整个工作区中的任何项目上运行。

编辑:我不明白的另一件事是试图调用 FileEditorInput.getPaht() 的代码。查看第 3163 行的 WorkbenchPage.busyOpenEditor:

// Special handling for external editors (they have no tabs...)
if ("org.eclipse.ui.systemExternalEditor".equals(editorId)) { //$NON-NLS-1$
IPathEditorInput fileInput = getPathEditorInput(input);
if (fileInput == null) {
throw new PartInitException(WorkbenchMessages.EditorManager_systemEditorError);
}

String fullPath = fileInput.getPath().toOSString();
Program.launch(fullPath);
return null;
}

这是调用 FileEditorInput.getPath() 的代码。显然它试图打开一个叫做“外部编辑器”的东西,这听起来不是我想要的。我只想打开默认的 Java 源代码编辑器。这听起来像是在尝试打开其他东西。

此外,我想补充一点,toOpen(我试图打开的 IFile)的 .toString() 值是:L/Programming/runtime-New_configuration/slackbot-resistance/src/main/java/com/chairbender/slackbot/resistance/ResistanceBot.java

...所以它绝对不是 null 或无效的,我假设 Eclipse 知道它是一个 Java 文件。

最佳答案

IPath path = new Path(violation.getSourceFile().getAbsolutePath());
IFile toOpen = ResourcesPlugin.getWorkspace().getRoot().getFile(path);

您似乎将绝对文件路径传递给 getFile 方法。 JavaDoc 说:

This is a resource handle operation; neither the resource nor the result need exist in the workspace. The validation check on the resource name/path is not done when the resource handle is constructed; rather, it is done automatically as the resource is created.

The supplied path may be absolute or relative; in either case, it is interpreted as relative to this resource and is appended to this container's full path to form the full path of the resultant resource. A trailing separator is ignored. The path of the resulting resource must have at least two segments.

因此路径被解释为相对于当前工作区(即您的测试工作区而不是您的开发工作区)。没有进行任何测试来查看该文件是否确实存在。

IDE.openEditor 中的异常是因为 IFile 似乎不在工作区的有效项目中。这也是它尝试打开外部编辑器的原因。

如果你想打开一个不在工作区中的文件,你需要使用 IURIEditorInput,它由 FileStoreEditorInput 实现:

IFileStore store = EFS.getStore(file.toURI());

IEditorInput input = new FileStoreEditorInput(store);

IDE.openEditor(page, input, "editor id", true);

注意:一些编辑器不支持不在工作区中的文件,其他编辑器的功能可能有所减少。

Java 编辑器的编辑器 ID 由 JavaUI.ID_CU_EDITOR ("org.eclipse.jdt.ui.CompilationUnitEditor") 给出

如果您有一个位于工作区中的文件,但您只有该文件的绝对路径,请使用 IWorkspaceRoot.getFileForLocation:

IFile toOpen = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);

注意:如果找不到 IFile,这将返回 null

关于java - Eclipse 插件 : IDE. openEditor 抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34367020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com