修改抽象语法树eclipse cdt C代码

时间:2017-11-02 12:57:23

标签: java eclipse-cdt abstract-syntax-tree

我有一个像这样的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!

1 个答案:

答案 0 :(得分:0)

许多CDT基础架构(包括ASTRewrite)并非设计为在Eclipse项目/工作区之外运行。

在这种情况下,您通常需要做的是:

  • 创建Eclipse工作区。如果您不需要Eclipse工作区,则可以创建一个临时工作区,并在完成后将其删除。

  • 在工作区内创建CDT C项目。

  • 确保您要处理的代码是项目的一部分。如果文件包含在项目的目录树中,则会自动发生。否则,您可以设置一个"链接文件夹"在项目中引用项目目录树之外的位置。

  • 根据您的重构需求,您可能需要在项目上运行CDT的索引器。

  • 获取代表您要处理的文件的ITranslationUnit(类似于您在评论中所写的内容)。

  • IASTTranslationUnit

  • 获取ITranslationUnit

前四个步骤可以手动完成,也可以使用Eclipse API自动完成。