1

Eclipse Indigo 및 CDT 8.0.2를 사용하여 사용자 지정 C++ 리팩터링을 작성하려고합니다. CDT는 AST를 획득하고 후크를 제공하는 클래스 CRefactoring2을 제공합니다. 하지만이 클래스는 내부 패키지에 있으므로 이클립스의 향후 버전에서 변경 될 것이라고 가정하고 서브 클래스를 작성하면 안된다.내부 클래스를 사용하지 않고 사용자 지정 CDT 리팩터링 만들기

외부 API가 있습니까 (CDT 내에서, 특히 모든 AST- 코드를 처음부터 작성하고 싶지는 않습니다) AST를 가져 와서 내 자신의 Eclipse CDT 리팩토링을 선언하는 데 사용할 수 있습니까?

+0

그래서 마지막으로 무엇을 했습니까? –

답변

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 % 일하기 시작할 때까지 물건들을 바꾸어 놓았다. 실제 리팩터링에 대해 말한 내용을 추가 할 필요가 없습니다.

편집 : 명확히하기 위해 : 이것은 제가 지금까지 번역 단위를 얻는 데있어 가장 안전한 방법입니다.

1

AST 액세스 및 조작에 대한 자세한 내용은 here을 참조하십시오.이 코드는 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(); 
} 

, 당신은 this article보고 싶을 것이다.

관련 문제