【发布时间】:2017-11-06 01:38:26
【问题描述】:
我有这样的c代码
static S16 test_1603b( const S16 *, const S16 * );
我想把这段代码编辑成这样的样子
static S16 test_1603b( const S16 *varName, const S16 *varName );
所以我做了什么我在eclipse之外使用了Eclipse CDT插件,并且我已经成功提取了抽象语法树(AST)并访问了所有方法参数声明,但是我找不到任何方法来再次重写AST新修改,My Code sn-p:
公共类 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) 从整个应用程序开始就为空,
任何想法极客!
【问题讨论】:
-
你从哪里得到
IASTTranslationUnit?通常您通过ITranslationUnit.getAST()获得它,这意味着拥有ITranslationUnit... -
IASTTranslationUnit translationUnit = GCCLanguage.getDefault().getASTTranslationUnit(fileContent, info, emptyIncludes, null, opts, log);我在 Eclipse 之外作为独立项目运行 cdt 解析器,我正在使用 intellij,我尝试了这段代码IPath ipath= new Path(path); IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(ipath); ITranslationUnit tu= (ITranslationUnit) CoreModel.getDefault().create(file);但也失败了,因为 ResourcesPlugin.getWorkspace() 总是抛出异常说工作区已关闭:@HighCommander4
标签: java eclipse-cdt abstract-syntax-tree