【发布时间】:2021-07-26 20:27:59
【问题描述】:
我正在开发一个 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 在 org.eclipse.cdt.internal.formatter.ChangeFormatter.formatChangedCode(ChangeFormatter.java:95) 在 org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGenerator.generateChange(ChangeGenerator.java:119) 在 org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGenerator.generateChange(ChangeGenerator.java:107) 在 org.eclipse.cdt.internal.core.dom.rewrite.ASTRewriteAnalyzer.rewriteAST(ASTRewriteAnalyzer.java:29) 在 org.eclipse.cdt.core.dom.rewrite.ASTRewrite.rewriteAST(ASTRewrite.java:213) 在 sheaperdexecuter.AstParser.parse(AstParser.java:155) 在 sheaperdexecuter.parts.SheaperdView$3.mouseDown(SheaperdView.java:140) 在 org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:196) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) 在 org.eclipse.swt.widgets.Display.sendEvent(Display.java:4209) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1043) 在 org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4026) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3626) 在 org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1157) 在 org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) 在 org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046) 在 org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155) 在 org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644) 在 org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) 在 org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551) 在 org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156) 在 org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152) 在 org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653) 在 org.eclipse.equinox.launcher.Main.basicRun(Main.java:590) 在 org.eclipse.equinox.launcher.Main.run(Main.java:1461) 在 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 返回。我认为这会导致上述异常。
我是否需要以任何方式引导CCorePlugin?
【问题讨论】:
标签: eclipse plugins eclipse-plugin eclipse-cdt abstract-syntax-tree