2

EclipseIndigoとCDT8.0.2を使用してカスタムC++リファクタリングを作成しようとしています。CDTはCRefactoring2、ASTを取得してフックを提供するクラスを提供します。ただし、このクラスは内部パッケージに含まれているため、Eclipseの将来のバージョンで変更されると思います。また、サブクラス化しないでください。

ASTを取得して独自のEclipseCDTリファクタリングを宣言するために使用できる外部API(CDT内。特にすべてのAST取得コードを最初から作成する必要はありません)はありますか?

4

2 に答える 2

1

ASTへのアクセスと操作については、ここを参照してください(このコードはJava用に記述されていることに注意してください。ASTVisitor基本クラスの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();
}

新しいリファクタリングの定義と登録については、この記事を参照してください。

于 2013-07-17T04:28:58.867 に答える
1

ASTの入手方法を共有してくれたJeffに感謝します。コードを調べたところ、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%一貫して機能し始めるまで、物事を変え続けました。実際のリファクタリングについてあなたが言ったことをこれ以上追加する必要はありません。

編集:明確にするために:これは私がこれまでに翻訳ユニットを取得するための最も安全な方法です。

于 2013-07-19T14:09:45.153 に答える