특정 구현에서 어떤 알고리즘이 사용되는지 정확히 말할 수는 없지만 몇 가지 정보를 바탕으로 추측 할 수 있습니다. 트라이은 이 문제에 대한 매우 유용한 데이터 구조입니다 : IDE에서 각 노드에서 몇 가지 추가 메타 데이터, 프로젝트의 모든 심볼의 메모리에 큰 트라이을 유지할 수 있습니다.
문자를 입력하면 트라이의 경로를 따라 이동합니다. 특정 트라이 노드의 모든 자손은 가능한 완료입니다. 그런 다음 IDE는 현재 컨텍스트에서 의미가있는 것으로 필터링하기 만하면되지만 탭 완성 팝업 창에 표시 할 수있는만큼만 계산하면됩니다.
고급 탭 완성에는 더 복잡한 시도가 필요합니다. 예를 들어 Visual Assist X 에는 CamelCase 기호의 대문자 만 입력하면되는 기능이 있습니다. 예를 들어 SFN을 입력하면 SomeFunctionName
탭 완성 창에 기호 가 표시됩니다.
트라이 (또는 기타 데이터 구조)를 계산하려면 프로젝트의 모든 기호 목록을 가져 오기 위해 모든 코드를 구문 분석해야합니다. Visual Studio는이를 .ncb
프로젝트와 함께 저장된 파일 인 IntelliSense 데이터베이스에 저장하므로 프로젝트를 닫고 다시 열 때마다 모든 것을 다시 구문 분석 할 필요가 없습니다. 대규모 프로젝트 (예 : 소스 컨트롤에서 방금 동기화 한 프로젝트)를 처음 열면 VS는 모든 것을 구문 분석하고 데이터베이스를 생성하는 데 시간이 걸립니다.
점진적 변경을 어떻게 처리하는지 모르겠습니다. 말했듯이 코드를 작성할 때 90 %의 유효하지 않은 구문이며, 유휴 상태 일 때마다 모든 것을 다시 구문 분석하면 CPU에 막대한 세금이 부과되지만 특히에 포함 된 헤더 파일을 수정하는 경우 많은 수의 소스 파일.
나는 그것이 (a) 프로젝트를 실제로 빌드 할 때만 (또는 아마도 그것을 닫거나 열 때) 재분석하거나, (b) 방금 한 곳에서만 코드를 구문 분석하는 일종의 로컬 구문 분석을 수행한다고 생각합니다. 관련 기호의 이름을 얻기 위해 제한된 방식으로 편집되었습니다. C ++에는 매우 복잡한 문법이 있기 때문에 무거운 템플릿 메타 프로그래밍 등을 사용하는 경우 어두운 구석에서 이상하게 작동 할 수 있습니다.