在不使用内部类的情况下创建自定义CDT重构

时间:2013-02-25 00:48:01

标签: eclipse eclipse-plugin eclipse-cdt automated-refactoring

我正在尝试使用Eclipse Indigo和CDT 8.0.2编写自定义C ++重构。 CDT提供了一个类CRefactoring2,它获取AST并提供钩子。但是这个类是在一个内部包中,所以我认为它将在Eclipse的未来版本中发生变化,而且我不应该将其子类化。

是否有外部API(在CDT中;我不特别想从头开始编写所有AST获取代码)我可以用来获取AST并声明我自己的Eclipse CDT重构?

2 个答案:

答案 0 :(得分:1)

有关访问和操作AST的信息,请参阅here(请注意,此代码是为Java编写的.ASVVisitor基类的CDT版本位于org.eclipse.cdt.core.dom.ast.ASTVisitor)。

我们最终编写的用于从文件访问C ++ AST的代码基本上是这样的:

import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.core.resources.IFile;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;

private IASTTranslationUnit getASTFromFile(IFile file) {
    ITranslationUnit tu = (ITranslationUnit) CoreModel.getDefault().create(file);
    return tu.getAST();
}

至于定义和注册新的重构,您需要查看this article

答案 1 :(得分:1)

感谢Jeff分享您获取AST的方法。我查看了我的代码,我有一个不同的获取AST的方法,但它也使用公共API。我也想发布这个方法:

// Assume there is a variable, 'file', of type IFile
ICProject cProject = CoreModel.getDefault().create(file.getProject() );
ITranslationUnit unit = CoreModelUtil.findTranslationUnit(file);
if (unit == null) {
    unit = CoreModel.getDefault().createTranslationUnitFrom(cProject, file.getLocation() );
}
IASTTranslationUnit ast = null;
IIndex index = null;
try {
    index = CCorePlugin.getIndexManager().getIndex(cProject);
} catch (CoreException e) {
    ...
}

try {
    index.acquireReadLock();
    ast = unit.getAST(index, ITranslationUnit.AST_PARSE_INACTIVE_CODE);
    if (ast == null) {
        throw new IllegalArgumentException(file.getLocation().toPortableString() + ": not a valid C/C++ code file");
    }
} catch (InterruptedException e) {
    ...
} catch (CoreException e) {
    ...
} finally {
    index.releaseReadLock();
}

我的参与更多一点;我基本上不断改变事物,直到100%的时间开始工作。我还没有更多关于你对实际重构的看法。

编辑:澄清:这是我迄今为止获得翻译单位最安全的方式。