언어 지원 및 API 정확도
Codeknit은 컴파일러를 실행하거나 매크로를 평가하거나 프로젝트의 종속성을 로드하지 않고 구문을 추출합니다. 아래 매트릭스는 테스트된 구문을 설명하며, 완전한 언어 준수나 보장된 크로스 파일 이름 해결을 의미하지 않습니다.
모든 언어에는 internal/plugin/api_fidelity_test.go에 정확한 기본 매개변수/반환 시그니처 단언문이 있습니다. 선언 범위는 internal/plugin/coverage_test.go 및 개별 언어 테스트 패키지에서도 확인됩니다.
| 언어 | 확장자 | 시그니처 기준 | 선언 및 컨테이너 범위 |
|---|---|---|---|
| C | .c, .h |
정의 및 프로토타입의 명명된 매개변수와 반환 유형 | 구조체, 공용체, 열거형, typedef, 매크로; 헤더 가드 내 선언 |
| C++ | .cpp, .cc, .cxx, .hpp, .hxx, .h |
함수, 프로토타입 및 메서드 선언의 명명된 매개변수와 반환 유형 | 클래스, 구조체, 메서드, 네임스페이스, 템플릿; 헤더 가드 및 extern "C" 래퍼 |
| C# | .cs |
명명된 형식 매개변수 및 명시적 반환 유형 | 클래스, 구조체, 인터페이스, 메서드, 필드, 대리자, 네임스페이스 |
| Go | .go |
그룹화된, 명명되지 않은, 가변 인자, 함수 유형 및 제네릭 매개변수; 명명된/다중 결과; 제네릭 리시버 | 유형 및 태그가 있는 구조체 필드, 임베디드 필드, 인터페이스 메서드 시그니처, 유형 매개변수, 패키지 |
| Java | .java |
명명된 형식 매개변수 및 명시적 반환 유형 | 클래스, 인터페이스, 생성자, 메서드, 필드, 중첩 클래스, 패키지 |
| JavaScript | .js, .jsx, .mjs, .cjs |
명명된 매개변수; 추론된 반환 유형 없음 | 함수, 화살표 함수, 클래스, 필드, 메서드, JSX를 포함하는 선언 |
| PHP | .php |
명명된 형식 매개변수 및 명시적 반환 유형 | 클래스, 인터페이스, 트레이트, 열거형, 메서드, 속성, 네임스페이스 |
| Python | .py, .pyi |
어노테이션, 기본값, *args, **kwargs, 위치/키워드 구분자, 반환 어노테이션 |
함수, 클래스, 중첩 클래스, 데코레이트된 메서드; 관례적인 바운드 리시버 생략 |
| Ruby | .rb |
명명된 매개변수; 추론된 반환 유형 없음 | 클래스, 모듈, 인스턴스/싱글턴 메서드, 상수 |
| Rust | .rs |
형식화된 패턴, self/&self/&mut self, 변경 가능한 바인딩, 명시적 반환 유형 |
인라인 및 중첩 모듈, 명명된 구조체 필드, 트레이트 메서드 및 구현 메서드 |
| Scala | .scala, .sc |
명명된 형식 매개변수 및 명시적 반환 유형 | 클래스, 트레이트, 객체, 메서드, 열거형, 패키지 |
| TypeScript | .ts, .tsx, .mts, .cts |
명명된 형식 매개변수 및 명시적 반환 어노테이션 | 함수, 화살표 함수, 인터페이스, 클래스, 필드, 네임스페이스; TSX는 자체 문법을 사용 |
헤더 언어 선택
섹션 제목: “헤더 언어 선택”모든 소스 처리 CLI 명령은 --header-language c|cpp를 허용합니다. 이 선택은 .h 파일에만 적용됩니다. 다른 확장자는 일반적인 파서를 유지합니다.
codeknit parse ./src --header-language cppcodeknit fingerprint ./src --header-language ccodeknit graph analyze ./src --header-language cpp기본값은 c로, C 매크로, typedef 및 공용체 추출을 보존합니다. .h로 명명된 C++ 헤더에는 cpp를 사용하세요. .hpp 및 .hxx로 명명된 파일은 이미 C++을 사용합니다. 이 선택은 명시적입니다. 두 문법 모두 다른 언어의 구문을 일부 수용할 수 있지만 해당 구조의 전체 추출은 보장하지 않기 때문입니다.
헤더 가드 및 조건부 분기는 조건을 평가하지 않고 탐색됩니다. 따라서 상호 배타적인 분기의 선언이 결과에 포함될 수 있습니다. 매크로 확장, 포함 해결 및 빌드 플래그는 적용되지 않습니다. TUI는 .h 파일에 대해 기본 C 선택을 사용합니다.
API 형태 보존
섹션 제목: “API 형태 보존”예를 들어, Go:
func Pair(a, b int, rest ...string) (string, error)는 다음을 생성합니다:
Pair(a: int, b: int, rest: ...string) -> (string, error)Go 인터페이스 메서드와 Go/Rust 명명된 필드는 일반 모드와 fingerprint 모드 모두에서 심볼로 나타납니다. 메서드와 필드는 소유 유형을 유지합니다. 중첩된 Rust 모듈은 service.storage.read와 같은 정규화된 이름을 유지하며, 다른 모듈이 동일한 이름의 함수를 선언하더라도 마찬가지입니다.
Rust는 동일한 이름의 필드와 메서드를 허용합니다. 필드 범위 이름은 ID와 포함 엣지를 구분하기 위해 내부적으로 #field 접미사를 사용합니다. 표시 이름과 시그니처는 원래 필드 이름을 유지합니다.
Python 시그니처는 어노테이션, 기본값, 스플랫 및 호출 규칙 구분자를 유지합니다. 관례적인 첫 번째 self 또는 cls 매개변수는 바운드 메서드에서 생략되지만, 자유 함수 또는 정적 메서드에서는 보존됩니다.
여러 줄 시그니처는 JSON에서 소스 줄 바꿈을 유지합니다. SKT는 줄 바꿈을 \n 및 \r로 이스케이프하여 각 심볼이 하나의 물리적 출력 줄에 유지되도록 합니다.
관계 해결
섹션 제목: “관계 해결”관계는 리시버 정규화 및 어휘적 소유권을 유지합니다. 상대 임포트 및 JavaScript/TypeScript와 Python의 이름 변경된 임포트는 대상 컨텍스트를 제공합니다. Go와 Java 패키지 선언은 동일한 디렉터리의 파일 간에 해결될 수 있습니다. 일치하지 않는 임포트는 관련 없는 선언으로 대체되지 않으며, 경쟁하는 후보는 모호한 상태로 유지됩니다.
로컬 리시버 바인딩은 네임스페이스 임포트보다 우선하며, 매개변수가 임포트된 네임스페이스를 가릴 때도 마찬가지입니다. Python 패키지 임포트는 패키지의 __init__ 모듈에서 선언을 고려하며, 임의 하위 모듈은 고려하지 않습니다. 해당 모듈에서 확립할 수 없는 재수출은 해결되지 않은 상태로 유지됩니다.
Java, C++, C#, Scala 및 TypeScript 호출 가능 추출은 선언 바이트 범위를 유지하여 오버로드된 본문이 고유한 호출자와 별칭 범위를 가질 수 있도록 하며, 동일한 줄에 선언된 경우도 포함됩니다. 오버로드된 대상을 선택하는 것은 보수적입니다. Java, C++, C#, Scala 및 TypeScript의 명시적 오버라이드 관계는 가장 가까운 상속된 선언을 찾습니다. 누락된 기본 클래스, 순환 또는 경쟁하는 후보는 자기 링크 대신 불확실성을 유지합니다.
이는 구문 기반 분석으로, 컴파일러나 런타임 호출 그래프가 아닙니다. 순수한 JavaScript 패키지 지정자, 패키지 재수출, 빌드 구성, 복잡한 리시버 유형 및 동적 디스패치는 해결되지 않은 상태로 유지될 수 있습니다. 저장소의 다른 위치에 있는 고유한 이름은 종속성의 충분한 증거가 아닙니다.
JSON은 불확실한 엣지를 resolution: "unresolved" 또는 "ambiguous"로 보존하며, 사용 가능한 경우 후보 ID를 포함합니다. 이러한 엣지는 대상 ShortID가 없습니다.
SKT는 모든 관계에 동일한 엣지 표기법을 사용하며, 선택적 해결 마커가 있습니다:
S8 --references--> S5S10 --references[unresolved]--> string, boolS11 --calls[ambiguous]--> Helper [candidates=S12, S15]알려진 엔드포인트와 후보는 ShortID를 사용하며, 해결되지 않은 관계의 엔드포인트도 포함됩니다. 심볼이 없는 불확실한 대상은 소스 파일에 상대적인 이름입니다. ShortID처럼 보이는 리터럴 이름 및 기타 복잡한 식별자는 모호성을 피하기 위해 인용된 전체 ID를 사용합니다. 동일한 소스, 종류, 해결 및 후보 집합을 가진 엣지는 하나의 대상 목록을 공유합니다. SKT 리더는 해결 및 후보를 보존하며, 이후 출력 청크의 심볼에 대한 참조도 포함합니다. 축소된 출력은 관계 종류를 인코딩하면서 해결 마커를 읽을 수 있게 유지합니다.
C/C++ 포함은 명시적 meta/file 및 meta/include 심볼을 가집니다. 헤더 철자는 심볼 목록에 한 번 나타납니다. 엣지는 해당 ShortID를 사용합니다:
[symbols]## src/main.cS1 meta/file L1-L4 main.cS2 meta/include L1-L1 "config.h" {resolution=unresolved}S3 meta/include L2-L2 "utils.h" {resolution=unresolved}S4 meta/include L3-L3 <stdio.h> {resolution=unresolved}
[edges]S1 --references[unresolved]--> S2, S3, S4포함 심볼은 작성된 지시문을 설명하며, 해결된 헤더 선언이 아닙니다. 파일 내 반복된 포함은 엔드포인트를 공유합니다. 파일/포함 메타데이터는 종속성 순위 및 데드 코드 발견에서 제외됩니다. ID를 추가해도 컴파일러의 포함 검색 구성을 통해 헤더가 발견되었다는 것을 주장하지 않습니다.
종속성 메트릭 및 HTML 그래프 링크는 해결된 엣지만 사용합니다. 보고서는 제외된 관계 수를 표시하며, HTML 그래프는 불확실성 수를 표시합니다. 팬인 및 팬아웃은 고유한 이웃을 계산합니다. 상속 분석은 모든 기본 클래스 및 인터페이스를 고려하며, 순환 상속은 보고된 깊이가 없습니다. 도달 가능성은 명명된 main, Main 또는 init 호출 가능에서 시작하여 종속성 엣지를 따릅니다. 멤버에 도달하면 해당 컨테이너가 관련성이 있지만 모든 형제가 도달 가능하지는 않습니다. 인식된 진입점이 없으면 도달 가능성 발견은 생략됩니다.
콜백 인수 및 반환된 호출 가능은 호출의 증거가 아닌 참조입니다. 별칭 해결은 파일, 함수 및 객체 ID를 유지하며, 충돌하는 할당은 불확실한 상태로 유지됩니다. 그래프 발견은 검토 후보입니다. 외부 호출자 및 동적 동작은 결과를 변경할 수 있습니다. 디렉터리 기반 계층 규칙 및 변경 전파 가중치는 휴리스틱이며, 측정된 확률이 아닙니다.
알려진 제한 사항
섹션 제목: “알려진 제한 사항”- 복잡한 C/C++ 포인터, 참조, 배열 및 함수 포인터 선언자는 여전히 불완전한 시그니처를 가질 수 있습니다. 매크로 생성 선언은 확장되지 않습니다.
- TypeScript/JavaScript 생성자 처리 및 일부 선택적, 나머지 또는 구조 분해된 매개변수 형식은 불완전합니다.
- 테스트된 사례 외부의 고급 제네릭 제약 조건 및 유형 형식은 언어별로 다릅니다. 반환 유형은 추론되지 않습니다.
- Rust 매크로는 확장되지 않습니다. 아웃라인 모듈 선언은 기록되지만, 해당 파일은 스캔에 포함되어야 합니다. 튜플 필드, 열거형 변형 세부 정보 및 연관 항목은 부분적으로만 지원됩니다.
- 구문 추출은 동적 디스패치, 오버로드, 임포트된 종속성 또는 빌드 구성 의미론을 컴파일러 정확도로 해결하지 않습니다.
- 부분적인 구문 오류는 여전히 선언을 생략할 수 있습니다. 보고된 경고를 검사하고 리팩터링을 적용하기 전에 소스를 확인하세요.
더 완전한 추출은 심볼 수와 ShortID를 변경합니다. 기존 skeleton 출력을 업그레이드할 때는 이전 출력과 혼합하지 말고 다시 생성하세요.