修改抽象语法树eclipse cdt C代码
我有这样的交流代码
static S16 test_1603b( const S16 *, const S16 * );
我想用实际的方式编辑这些代码,就像这样
static S16 test_1603b( const S16 *varName, const S16 *varName );
所以我做了什么,我在Eclipse之外使用了Eclipse CDT插件,并且我已经成功地提取了抽象语法树(AST)并访问了所有的方法参数声明,但是我找不到用新的修改重新编写AST的任何方法,我的代码片段:
公共类RuleChk继承AbstractRule {
public RuleChk(IASTTranslationUnit ast) {
super("RuleChk", false, ast);
shouldVisitDeclarations = true;
shouldVisitParameterDeclarations = true;
}
@Override
public int visit(IASTParameterDeclaration parameterDeclaration) {
if (!parameterDeclaration.getRawSignature().startsWith("void")) {
if (parameterDeclaration.getDeclarator().getName().getRawSignature().equals("")) {
IASTDeclarator oldDec = parameterDeclaration.getDeclarator();
//Create New Declarator Node
INodeFactory factory = ast.getASTNodeFactory();
IASTName name = factory.newName("varName".toCharArray());
IASTDeclarator declarator = factory.newDeclarator(name);
declarator.setParent(oldDec.getParent());
declarator.setInitializer(oldDec.getInitializer());
declarator.setName(name);
declarator.setNestedDeclarator(oldDec.getNestedDeclarator());
declarator.setPropertyInParent(oldDec.getPropertyInParent());
//get the rewriter
final TextEditGroup editGroup = new TextEditGroup("FakeGroup");
ASTRewrite rewriter = ASTRewrite.create(ast);
rewriter.replace(declarator,oldDec,editGroup);
rewriter.rewriteAST();
}
}
return super.visit(parameterDeclaration);
}
}
调试后,我发现org.eclipse.cdt.internal.formatter.ChangeFormatter#formatChangedCode,当它试图获得
ICProject project = tu.getCProject();
它会抛出一个空指针异常,因为TransionUnit(tu)从整个应用程序的开始处为空,
任何想法!
包括ASTRewrite
在内的许多CDT基础架构并非设计为在Eclipse项目/工作区之外运行。
你在这种情况下通常需要做的是:
创建一个Eclipse工作区。 如果您不需要Eclipse工作区,则可以创建一个临时的工作区,并在完成后将其删除。
在工作区内创建一个CDT C项目。
确保你想要处理的代码是项目的一部分。 如果文件包含在项目的目录树中,则会自动发生。 否则,您可以在项目中设置一个“链接文件夹”来引用项目目录树之外的位置。
根据您的重构需求,您可能需要在项目上运行CDT的索引器。
获取一个表示要处理的文件的ITranslationUnit
(类似于您在评论中所写的内容)。
从ITranslationUnit
获取IASTTranslationUnit
。
前四个步骤可以手动完成,也可以使用Eclipse API自动完成。
链接地址: http://www.djcxy.com/p/68215.html上一篇: Modify Abstract syntax tree eclipse cdt C code
下一篇: Library for C++ abstract syntax trees composition and code generation