我有一个像这样的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)从整个应用程序的开头就是null,
任何想法GEEKS!
答案 0 :(得分:0)
许多CDT基础架构(包括ASTRewrite
)并非设计为在Eclipse项目/工作区之外运行。
在这种情况下,您通常需要做的是:
创建Eclipse工作区。如果您不需要Eclipse工作区,则可以创建一个临时工作区,并在完成后将其删除。
在工作区内创建CDT C项目。
确保您要处理的代码是项目的一部分。如果文件包含在项目的目录树中,则会自动发生。否则,您可以设置一个"链接文件夹"在项目中引用项目目录树之外的位置。
根据您的重构需求,您可能需要在项目上运行CDT的索引器。
获取代表您要处理的文件的ITranslationUnit
(类似于您在评论中所写的内容)。
从IASTTranslationUnit
。
ITranslationUnit
前四个步骤可以手动完成,也可以使用Eclipse API自动完成。