当前位置: 首页 > 知识库问答 >
问题:

Eclipse CDT ASTRewrite NPE

端木兴国
2023-03-14

我正在开发一个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());

我进一步研究了CDT源代码,在我的例子中,ccoReplugin似乎没有初始化。如果调用ccoReplugin.getDefault();,则返回null。我认为这就造成了上面提到的例外。我需要以任何方式引导ccoReplugin吗?

共有1个答案

白信鸿
2023-03-14

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

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

我通过克隆CDT源代码repo(https://git.Eclipse.org/r/CDT/org.Eclipse.CDT.git)并将项目导入我的Eclipse Committers IDE来解决这个问题。(如下所述:https://wiki.eclipse.org/gett_started_with_cdt_development#setting_up_the_sources)

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

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

 类似资料:

相关问答

相关文章

相关阅读