【问题标题】:Eclipse CDT ASTRewrite NPEEclipse CDT ASTRewrite NPE
【发布时间】: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


    【解决方案1】:

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

    我对 CDT 环境的调用(CCorePluginCoreModel 等)最终与正在执行的 Eclipse 中运行的 CDT 无关。因此,我在CoreModel 上获得了 NPE 和其他东西。

    我通过克隆 CDT 源代码库 (https://git.eclipse.org/r/cdt/org.eclipse.cdt.git) 并将项目导入我的 Eclipse Committers IDE 解决了这个问题。 (此处解释:https://wiki.eclipse.org/Getting_started_with_CDT_development#Setting_up_the_Sources

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 2014-02-07
      • 2023-03-30
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多