以编程方式获取 java eclipse bundle 提案

Programmatically get java proposals for eclipse bundle

我尝试了各种组合来解决我的问题,但没有用。

问题

我正在开发一个 eclipse osgi 包来自动更正 java 源代码。我能够在其中获得 java 项目对象和一个 class 对象,我想更正这些对象。每次我尝试收集 java 代码建议时,我都会放置一个可以更正的测试文件(如重复导入)

我总是收到类似下面的错误

java.lang.NullPointerException
    at org.eclipse.jdt.internal.ui.JavaPlugin.getImageDescriptorRegistry(JavaPlugin.java:335)
    at org.eclipse.jdt.ui.text.java.CompletionProposalCollector.<init>(CompletionProposalCollector.java:103)
    at org.eclipse.jdt.ui.text.java.CompletionProposalCollector.<init>(CompletionProposalCollector.java:157)

请告诉我我做错了什么。这是我的代码片段:

....
CompletionProposalCollector collectorPrjTemp= new CompletionProposalCollector(javaProject); // this line throws error
IJavaCompletionProposal[] prjProposals = collectorPrjTemp.getJavaCompletionProposals();
System.out.println("prjProposals == "+prjProposals.length);
....

7 月 28 日编辑

现在,当我在 NullPointer 上方包含 org.eclipse.jdt.ui 的依赖项时,错误消失了。但现在收到以下错误

!ENTRY org.eclipse.jdt.ui 4 2 2015-07-28 13:07:37.926 !MESSAGE 从插件调用代码时出现问题:"org.eclipse.jdt.ui"。 !堆叠 0

java.lang.IllegalStateException: Workbench has not been created yet.
    at org.eclipse.ui.PlatformUI.getWorkbench(PlatformUI.java:93)
    at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.install(ASTProvider.java:236)
    at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.<init>(ASTProvider.java:227)
    at org.eclipse.jdt.internal.ui.JavaPlugin.getASTProvider(JavaPlugin.java:741)
    at org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:128)
    at org.eclipse.jdt.internal.ui.text.correction.AssistContext.getASTRoot(AssistContext.java:119)
    at org.eclipse.jdt.internal.ui.text.correction.ReorgCorrectionsSubProcessor.removeImportStatementProposals(ReorgCorrectionsSubProcessor.java:210)
    at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.process(QuickFixProcessor.java:337)
    at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.getCorrections(QuickFixProcessor.java:316)
    at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor$SafeCorrectionCollector.safeRun(JavaCorrectionProcessor.java:378)
    at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor$SafeCorrectionProcessorAccess.run(JavaCorrectionProcessor.java:339)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor$SafeCorrectionProcessorAccess.process(JavaCorrectionProcessor.java:335)
    at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.collectCorrections(JavaCorrectionProcessor.java:468)

更新 - 7 月 29 日

现在我正在尝试通过命令创建 workbench 对象

    WorkbenchAdvisor advisor=new WorkbenchAdvisor(){
        public String getInitialWindowPerspectiveId(){
          return "org.eclipse.rap.junit.runtime.emptyPerspective";
        }
      };
    //Display display = Display.getCurrent (); // did not worked, gives null
    //Display display = Display.getDefault (); // did not worked, gives null
    Display display = PlatformUI.getDisplay (); // did not worked, gives null
    PlatformUI.createAndRunWorkbench(display, advisor);

当我尝试下面的代码时

Display display = new Display ();

然后出现以下错误:

No context available outside of the request processing

请阅读我和格雷格之间的评论以了解我的尝试。任何 help/clue 将不胜感激。

要测试您使用的 Eclipse 插件 'Run As > Eclipse Application'。

对于插件,这将启动一个新的 Eclipse 实例和一个新的工作区(最初是空的)。您必须在此工作区中创建测试项目才能使用。

'Run > Run Configurations' 菜单将显示测试工作区在应用程序配置条目中的位置。

我需要从获取 ExecutionEvent 对象的位置创建一个处理程序,然后从该点触发流程并获取 Workbench、ResourcePlugin、Workspace 和 Project/JavaProject 的对象。

我终于得到了我需要的提案。所以如果你需要 workbench 对象你需要 UI.