修改抽象语法树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