구조와 캐시
구성 요소
| 구성 요소 | 책임 |
|---|---|
| CodeAssist.Core | C++ 어휘 마스킹, 블록 문맥, 문서 버전, 선택 항목 검증 |
| CodeAssist.Indexing | 심볼 인덱싱·조회·캐시, 컴파일 구성 모델, 작업자 실행 |
| CodeAssist.Extension | Visual Studio 문서·자동완성·명령·검색 창 연동 |
| CodeAssist.Worker | 선택형 .NET Framework 4.7.2 인덱싱 프로세스 |
문서 수명과 결과 게시
문서 변경 시 150ms 지연 분석을 예약하고 새 revision을 발급합니다. 이전 취소 토큰은 취소합니다. 결과는 현재 revision과 일치할 때만 게시합니다. 동일 버퍼의 마지막 편집기 뷰가 닫히면 Changed 이벤트, Timer, 취소 토큰, live 결과와 버퍼 속성을 정리합니다. 닫기 전 작업이 나중에 끝나더라도 제거되거나 다시 열린 문서에 결과를 게시할 수 없습니다.
텍스트 분석 중 취소는 이미 시작한 개별 정규식 호출을 강제 중단하는 방식이 아닙니다. 결과 게시 전 취소 및 revision을 확인합니다. 프로젝트·엔진 파일 처리에는 CancellationToken을 전달하고, 별도 프로세스는 종료할 수 있습니다.
심볼과 타입
IndexedSymbol.Identity에 파일·scope ID·소유 타입·종류·이름·원시 함수 시그니처·위치를 포함합니다. 같은 이름의 오버로드를 인덱스에서 합쳐 버리지 않습니다. 지역 심볼은 클래스 멤버와 전역 자동완성 목록에서 제외합니다.
블록 ID는 해당 텍스트 분석에만 유효하며 편집 후에도 유지되는 영구 심볼 ID가 아닙니다. 함수 시그니처는 선언 줄에서 추출한 텍스트이고, 여러 줄 선언이나 C++ ABI 시그니처의 완전한 정규화는 아닙니다.
소유 타입을 지정한 조회가 실패하면 다른 클래스의 같은 이름으로 무조건 fallback하지 않습니다. 서로 다른 확정 타입이 충돌하면 null로 유지합니다. 템플릿 자리표시자보다 비자리표시자 반환형을 우선하는 기존 Unreal 지원은 유지합니다.
컴파일 구성
루트와 Intermediate/ProjectFiles의 .vcxproj에서 조건별 NMake/CL include·define을 수집합니다. $(ProjectDir)와 $(SolutionDir)는 치환하고, 기타 MSBuild 표현식과 상속 항목은 unresolved로 보존합니다. Source 아래 .Build.cs와 프로젝트 파일 내용의 해시가 변경되면 프로젝트 캐시를 다시 만듭니다.
확인된 include 디렉터리를 기준으로 이미 인덱싱된 헤더의 상대 경로를 계산해 #include 후보에 추가합니다. 여러 구성의 경로를 후보로 제공하므로 활성 타깃에서 실제로 include 가능한지까지 보장하지 않습니다.
MSBuild/UBT를 실행해 최종 구성 값을 평가하거나 활성 타깃에 따라 #if 분기를 완전히 해석하지 않습니다. 일반 프로젝트 root 및 Unreal 모듈 탐색 범위는 기존 흐름을 유지합니다. 외부 include 디렉터리를 무제한 재귀 분석하지 않습니다.
캐시
캐시 헤더는 CODEASSIST5입니다. scope·signature·local 표시와 파일 목록을 보존합니다. 이전 CODEASSIST4 캐시는 새 포맷으로 읽지 않고 다음 초기화에서 다시 분석합니다. 따라서 첫 업데이트 후 인덱싱 시간이 추가로 필요합니다.
프로젝트별 캐시와 엔진 설치별 공용 캐시를 계속 분리합니다. 공용 캐시를 검색하면서 사용 모듈을 백그라운드로 최신화하며, 새 조회 테이블을 잠금 밖에서 완성한 뒤 교체합니다.
작업자 프로토콜
작업자의 stdin에 mode, root, project root, 임시 출력 경로를 UTF-8/base64 줄로 전달합니다. 작업자는 프로젝트 또는 엔진 인덱스를 만들고 캐시 파일로 반환합니다. 코어·인덱싱 DLL은 확장 패키지에 포함되며 VA DLL을 사용하지 않습니다.
작업자 출력은 캐시 로더로 검증한 뒤 사용합니다. 실패·시간 초과 시 내부 인덱싱으로 fallback합니다. 패키지 종료 시 CancellationToken을 취소하고 실행 중인 작업자를 종료합니다. 기본값은 내부 처리입니다.