我正在开发一个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
吗?
问题是由于我使用插件的运行时配置选项卡通过.jar添加了CDT。
我对CDT环境的调用(CCoReplugin
、CoreModel
等)最终与正在执行的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插件。