using CDT index
intro
CDT는 내부적으로 우리가 자주 사용하는 code assist, Open Declaration(F3), Open call Hierarchy(Ctrl + Alt + H) 등에 사용하기 위해서 내부적으로 c/c++ 코드를 parsing 해서 그 정보를 가지고 있는데 이것을 Index라고 한다. Indexer를 사용해서 특정 변수/함수 의 definition , declaration, reference 등의 정보를 가지고 올 수 있다.
getting IIndex
ICProject project = CoreModel.getDefault().getCModel().getCProject("hello"); CCorePlugin.getIndexManager().joinIndexer(IIndexManaer.FOREVER, null); // wait until indexing completes IIndex index = null; try{ index = CCorePlugin.getIndexManager().getIndex(project); index.acquireReadLock(); // lock index IIndexBinding[] bindings = index.findBindings(Pattern.compile("main"), false, IndexFilter.All, null); for (IIndexBinding b : bindings) { System.out.print("name: " + b.getName()+" " ); String[] qnames = b.getQualifiedName(); } }catch(Exception e){ e.printStackTrace(); }finally{ try{ index.releaseReadLock(); }catch (Exception e2){ e.printStackTrace(); } }Indexing 작업은 보통 main thread와 다른 thread에서 수행이 되기 때문에 joinIndexer로 인덱싱이 끝날때까지 기다린후 index에 lock을 걸고 findBinding 으로 쿼리를 수행할 수 있다.
querying
findBinding으로 IIndexBinding 을 얻고 여기서 얻은 IIndexBinding으로 아래 함수들을 불러 원하는 IIndexName을 얻을 수 있다.
IIndex::findDeclarations : 함수/변수의 선언부와 구현부
IIndex::findDefinitions : 함수의 구현부
IIndex::findReferences : 합수나 변수가 사용된(use) 부분
그렇다면 함수의 선언부만 쿼리하고싶으면 어떻게 할까?
IIndex::findNames(binding, IIndex.FINDDECLARATIONS)를 부르면 된다. 실제로 IIndex::findDeclarations은 IIndex::findNames(binding, IINdex.FINDDECLARATIONSDEFINITIONS)와 같다.
// finding declaration of BasicApp::CreateInstance Pattern[] p = new Pattern[2]; p[0] = Pattern.compile("BasicApp"); p[1] = Pattern.compile("CreateInstance"); IIndexBinding[] bindings = index.findBindings(p , true, IndexFilter.CPP_DECLARED_OR_IMPLICIT, monitor); for (IIndexBinding binding : bindings) { IIndexName[] names = index.findNames(binding, IIndex.FIND_DECLARATIONS); }
getting index info
위 쿼리 함수들로 얻은 IIndexName으로 파일 위치나 기타 정보등을 얻을 수 있다.
for(IIndexName name: names){ // get full path String path = name.getFile().getLocation().getFullPath(); // get offset & length int offset = name.getNodeOffset(); int length = name.getNodeLength(); }
댓글 없음:
댓글 쓰기