Eclipse CDT ASTRewrite NPE

Eclipse CDT ASTRewrite NPE

我正在开发一个 Eclipse 插件,它应该重写一些 .c 源文件。 我正在使用 Eclipse CDT AST 解析器,但在尝试将调整保存到 AST 时遇到 NPE。 我从活动工作区的项目中获取要解析的 IFile(_file)。执行下面的代码时,我面临下面的 NPE。 NPE 抛出在:Change c = rw.rewriteAST();

Map<String, String> definedSymbols = new HashMap<String, String>();
String[] includePaths = new String[0];
IScannerInfo info = new ScannerInfo(definedSymbols, includePaths);
IParserLogService log = new DefaultLogService();
IncludeFileContentProvider emptyIncludes = IncludeFileContentProvider.getEmptyFilesProvider();
int opts = 8;
            
final IASTTranslationUnit tu =  GCCLanguage.getDefault().getASTTranslationUnit(FileContent.create(_file), info, emptyIncludes, null, opts, log);
final ASTRewrite rw = ASTRewrite.create(tu);
tu.accept(new ASTVisitor(true){
                
        @Override
        public int visit(IASTStatement statement){
            if(test) {
                test = false;
                rw.insertBefore(statement.getParent(), statement, rw.createLiteralNode("int i = 3;"), null);
            }
            return PROCESS_CONTINUE;
        }
});

Change c = rw.rewriteAST();
c.perform(new NullProgressMonitor());

java.lang.NullPointerException at org.eclipse.cdt.internal.formatter.ChangeFormatter.formatChangedCode(ChangeFormatter.java:95) at org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGenerator.generateChange(ChangeGenerator.java:119) at org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGenerator.generateChange(ChangeGenerator.java:107) at org.eclipse.cdt.internal.core.dom.rewrite.ASTRewriteAnalyzer.rewriteAST(ASTRewriteAnalyzer.java:29) at org.eclipse.cdt.core.dom.rewrite.ASTRewrite.rewriteAST(ASTRewrite.java:213) at sheaperdexecuter.AstParser.parse(AstParser.java:155) at sheaperdexecuter.parts.SheaperdView.mouseDown(SheaperdView.java:140) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:196) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4209) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1043) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4026) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3626) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1157) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155) at org.eclipse.ui.internal.Workbench.lambda(Workbench.java:644) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590) at org.eclipse.equinox.launcher.Main.run(Main.java:1461) at org.eclipse.equinox.launcher.Main.main(Main.java:1434)

这里提到了一个几乎相同的问题:Eclipse CDT ASTRewrite not working 该问题的答案是确保该程序在 osgi 框架上 运行。在我的例子中,该程序是一个 eclipse 插件,但我仍然面临这个 NPE。

CDT 有问题吗?我正在使用插件的 Runtime 配置选项卡通过 jar (org.eclipse.cdt.core_6.9.0.201909091953.jar) 添加 CDT。 (我会把它添加到 Dependencies 选项卡,但它在那里不可用)

//编辑:

我进一步研究了 CDT 源代码,在我的例子中 CCorePlugin 似乎没有被初始化。如果我调用 CCorePlugin.getDefault();,我会返回 null。我认为这会导致上述异常。 我需要以任何方式 bootstrap CCorePlugin 吗?

问题是由于我使用插件的 Runtime 配置选项卡通过 .jar 添加了 CDT。

我对 CDT 环境(CCorePluginCoreModel 等)的调用最终与 CDT 运行 在执行日食。因此我在 CoreModel 和东西上得到了 NPE。

我通过克隆 CDT 源代码库 (https://git.eclipse.org/r/cdt/org.eclipse.cdt.git) and importing the projects to my Eclipse Committers IDE. (As explained here: https://wiki.eclipse.org/Getting_started_with_CDT_development#Setting_up_the_Sources)

解决了这个问题

之后,我能够将 CDT 添加到插件的 Dependencies 配置选项卡:

添加依赖项后,NPE 消失了,我可以访问工作区相关模型等的正确实例。

我希望这对某些人有所帮助,因为我花了几个小时才获得 CDT 引导的 Eclipse 插件。