feat(p10-1C-JK): Java + Kotlin AST chunkers — JVM family 코드 색인 활성화 #152

Merged
altair823 merged 12 commits from feat/p10-1c-jk into main 2026-05-20 11:57:42 +00:00
Owner

요약

1C 의 후반부 — JVM family (Java + Kotlin) 묶음 PR. 1C-Go (PR #151 / v0.12.0) 의 자매. 머지 시점부터 .java / .kt / .kts 파일 dogfooding 가능. 1C phase 완성.

frozen design: §1C, §3.4 Java/Kotlin row (package.Class.method).
task spec (frozen on merge): tasks/p10/p10-1c-jk-ast-chunker.md.
plan: docs/superpowers/plans/2026-05-20-p10-1c-jk-ast-chunker.md.

동결된 설계 결정

  • Symbol prefix = 소스의 package 선언 (design §3.4, 1C-Go 모델 동일):
    • Java: tree-sitter-java 의 package_declarationscoped_identifier / identifier.
    • Kotlin: tree-sitter-kotlin-ng 의 package_headerqualified_identifier.
  • Symbol 형식: package.Class.method (예: com.kebab.chunk.MdHeadingV1Chunker.chunkDoc). 1B Python 의 class-nesting 패턴.
  • tree-sitter-kotlin-ng 선택: bare tree-sitter-kotlin = "0.3.8" 가 tree-sitter 0.21-0.23 만 지원 → 0.26 incompatible. tree-sitter-kotlin-ng v1.1.0 (tree-sitter-grammars org 의 maintained fork, Amaan Qureshi 유지) 가 tree-sitter-language = "0.1" shim 으로 0.24+ 호환.

Java 핵심 특징

  • Root: program (1C-Go 의 source_file 과 다름).
  • Comments: line_comment / block_comment (Go 의 comment 와 다름) — unit_start 가 두 변종 모두 fold.
  • 5 type declarations (class / interface / enum / record / annotation_type) 각자 1 unit + class body 재귀.
  • Constructor: <pkg>.<Class>.<ClassName> (Java 의 class-name-as-method-name 관습).
  • compact_constructor_declaration (record canonical constructor) 동일 처리.
  • Field declaration → unit 아님 (count explosion 방지).

Kotlin 핵심 특징 (grammar quirks 8건 정확 처리)

  1. Root source_file.
  2. qualified_identifier for package (Java 의 scoped_identifier 와 다름).
  3. ONE class_declaration for class / interface / enum class / data class / sealed class — modifier 로 구별. class_modifier 텍스트 "enum" 감지로 enum body recursion skip.
  4. body field 없음class_body (regular) / enum_class_body (enum) 직접 lookup.
  5. companion_object own node — name optional → 기본값 Companion. Symbol: <pkg>.<Class>.Companion, methods: <pkg>.<Class>.Companion.<method>.
  6. Top-level function_declaration 지원 (Kotlin-specific) → <pkg>.<fn>. Inside class → <pkg>.<Class>.<method> (same node kind, different mod_path).
  7. secondary_constructor — name field 없음 → 클래스 이름 inherit (Java duplication 관습 보존).
  8. import (singular, no _declaration suffix) — glue.

변경

  • Workspace deps: tree-sitter-java = "0.23", tree-sitter-kotlin-ng = "1.1".
  • kebab-parse-code: java.rs (461 lines) + kotlin.rs (~470 lines) + 2 fixtures.
  • kebab-chunk: code-java-ast-v1 + code-kotlin-ast-v1 chunkers (1A-2 near-duplicate).
  • kebab-source-fs: .java / .kt / .kts routing.
  • kebab-app: dispatch allowlist + 4 match arm × 2 langs 활성화.
  • 회귀 테스트: extractor 단위 3+3 = 6 + chunker 단위 6+6 = 12 + snapshot 2+2 = 4 + integration 1+1 = 2.
  • docs: README + HANDOFF + ARCHITECTURE + SMOKE + 2 INDEX + design §10.1.
  • chore: workspace version 0.12.0 → 0.13.0 (minor — surface 확장).

검증

  • cargo test --workspace --no-fail-fast -j 1 → exit 0, all green
  • cargo clippy --workspace --all-targets -- -D warnings → clean
  • Manual SMOKE 확인:
    • Java: com.foo.Foo.bar symbol
    • Kotlin class method: com.foo.Bar.baz
    • Kotlin top-level fn: com.foo.freeFn (Kotlin-specific 동작 입증)
    • code_lang_breakdown: { "java": 1, "kotlin": 1 }

영향

  • wire schema additive (1A-2 의 Citation::Code 그대로, lang "java" / "kotlin" 값 확장).
  • frozen design 변경 없음 (§3.4 가 이미 본 구현과 일치).
  • 기존 색인 데이터 invalidation 없음.

1C phase 완성

Sub-PR Languages Release
1C-Go (PR #151) Go v0.12.0
1C-JK (이 PR) Java + Kotlin v0.13.0

다음 phase: p10-1D (C + C++).

🤖 Generated with Claude Code

## 요약 1C 의 후반부 — JVM family (Java + Kotlin) 묶음 PR. 1C-Go (PR #151 / v0.12.0) 의 자매. 머지 시점부터 `.java` / `.kt` / `.kts` 파일 dogfooding 가능. **1C phase 완성**. frozen design: §1C, §3.4 Java/Kotlin row (`package.Class.method`). task spec (frozen on merge): `tasks/p10/p10-1c-jk-ast-chunker.md`. plan: `docs/superpowers/plans/2026-05-20-p10-1c-jk-ast-chunker.md`. ## 동결된 설계 결정 - **Symbol prefix = 소스의 `package` 선언** (design §3.4, 1C-Go 모델 동일): - **Java**: tree-sitter-java 의 `package_declaration` → `scoped_identifier` / `identifier`. - **Kotlin**: tree-sitter-kotlin-ng 의 `package_header` → `qualified_identifier`. - **Symbol 형식**: `package.Class.method` (예: `com.kebab.chunk.MdHeadingV1Chunker.chunkDoc`). 1B Python 의 class-nesting 패턴. - **tree-sitter-kotlin-ng 선택**: bare `tree-sitter-kotlin = "0.3.8"` 가 tree-sitter 0.21-0.23 만 지원 → 0.26 incompatible. `tree-sitter-kotlin-ng v1.1.0` (tree-sitter-grammars org 의 maintained fork, Amaan Qureshi 유지) 가 `tree-sitter-language = "0.1"` shim 으로 0.24+ 호환. ## Java 핵심 특징 - Root: `program` (1C-Go 의 `source_file` 과 다름). - Comments: `line_comment` / `block_comment` (Go 의 `comment` 와 다름) — `unit_start` 가 두 변종 모두 fold. - 5 type declarations (class / interface / enum / record / annotation_type) 각자 1 unit + class body 재귀. - Constructor: `<pkg>.<Class>.<ClassName>` (Java 의 class-name-as-method-name 관습). - `compact_constructor_declaration` (record canonical constructor) 동일 처리. - Field declaration → unit 아님 (count explosion 방지). ## Kotlin 핵심 특징 (grammar quirks 8건 정확 처리) 1. Root `source_file`. 2. `qualified_identifier` for package (Java 의 `scoped_identifier` 와 다름). 3. **ONE `class_declaration`** for class / interface / enum class / data class / sealed class — modifier 로 구별. `class_modifier` 텍스트 `"enum"` 감지로 enum body recursion skip. 4. **`body` field 없음** — `class_body` (regular) / `enum_class_body` (enum) 직접 lookup. 5. **`companion_object`** own node — name optional → 기본값 `Companion`. Symbol: `<pkg>.<Class>.Companion`, methods: `<pkg>.<Class>.Companion.<method>`. 6. **Top-level `function_declaration`** 지원 (Kotlin-specific) → `<pkg>.<fn>`. Inside class → `<pkg>.<Class>.<method>` (same node kind, different `mod_path`). 7. `secondary_constructor` — name field 없음 → 클래스 이름 inherit (Java duplication 관습 보존). 8. `import` (singular, no `_declaration` suffix) — glue. ## 변경 - **Workspace deps**: `tree-sitter-java = "0.23"`, `tree-sitter-kotlin-ng = "1.1"`. - **`kebab-parse-code`**: `java.rs` (461 lines) + `kotlin.rs` (~470 lines) + 2 fixtures. - **`kebab-chunk`**: `code-java-ast-v1` + `code-kotlin-ast-v1` chunkers (1A-2 near-duplicate). - **`kebab-source-fs`**: `.java` / `.kt` / `.kts` routing. - **`kebab-app`**: dispatch allowlist + 4 match arm × 2 langs 활성화. - **회귀 테스트**: extractor 단위 3+3 = 6 + chunker 단위 6+6 = 12 + snapshot 2+2 = 4 + integration 1+1 = 2. - **docs**: README + HANDOFF + ARCHITECTURE + SMOKE + 2 INDEX + design §10.1. - **chore**: workspace version `0.12.0 → 0.13.0` (minor — surface 확장). ## 검증 - `cargo test --workspace --no-fail-fast -j 1` → exit 0, all green - `cargo clippy --workspace --all-targets -- -D warnings` → clean - Manual SMOKE 확인: - Java: `com.foo.Foo.bar` symbol - Kotlin class method: `com.foo.Bar.baz` - Kotlin top-level fn: `com.foo.freeFn` ✅ (Kotlin-specific 동작 입증) - `code_lang_breakdown: { "java": 1, "kotlin": 1 }` ## 영향 - wire schema additive (1A-2 의 `Citation::Code` 그대로, lang `"java"` / `"kotlin"` 값 확장). - frozen design 변경 없음 (§3.4 가 이미 본 구현과 일치). - 기존 색인 데이터 invalidation 없음. ## 1C phase 완성 | Sub-PR | Languages | Release | |--------|-----------|---------| | 1C-Go (PR #151) | Go | v0.12.0 | | **1C-JK (이 PR)** | Java + Kotlin | **v0.13.0** | 다음 phase: **p10-1D** (C + C++). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
altair823 added 12 commits 2026-05-20 11:39:52 +00:00
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bare tree-sitter-kotlin v0.3.8 requires tree-sitter >=0.21,<0.23 which
conflicts with the workspace's tree-sitter 0.26 (links = "tree-sitter"
is a singleton). tree-sitter-kotlin-ng v1.1.0 (from
tree-sitter-grammars/tree-sitter-kotlin) uses the tree-sitter-language
0.1 shim which is compatible with tree-sitter 0.26. Using
tree-sitter-kotlin-ng as the Kotlin grammar crate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Duplicate of code-rust-ast-v1 / code-go-ast-v1 with language-agnostic body
unchanged. Cross-chunker policy_hash identity asserted vs md-heading-v1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces Java bail! arms with JavaAstExtractor + CodeJavaAstV1Chunker. Adds
java_file_ingests_and_searches_as_code_citation integration test — asserts
citation.lang=java, symbol=com.foo.Foo.bar, code_lang=java.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Uses tree-sitter-kotlin-ng (bare tree-sitter-kotlin is stuck on tree-sitter
0.21-0.23, incompatible with our 0.26). Mirrors JavaAstExtractor (JVM family,
source-side package extraction + class-nesting) with Kotlin grammar quirks:

- Root is `source_file`, not `program`.
- `package_header` child is `qualified_identifier` (its slice text is the
  dotted path); the bare `identifier` shape is also accepted as a fallback.
- `class_declaration` is the single node kind for `class` / `data class` /
  `sealed class` / `interface` / `enum class` — distinguished only by its
  `modifiers` child. Body is `class_body` for non-enum, `enum_class_body`
  for enum class; neither carries a `body` field name, so the extractor
  looks the body up by node kind rather than `child_by_field_name("body")`.
- `companion_object` is its own node kind (NOT object_declaration with a
  modifier); its `name` field is optional, so the extractor fills in the
  implicit Kotlin convention name `Companion`.
- `function_declaration` is allowed at top level (unlike Java), emitted as
  `<pkg>.<fn_name>`; the same node kind nested in `class_body` becomes
  `<pkg>.<...>.<Class>.<method>` via the same mod_path mechanism.
- `secondary_constructor` has no `name` field; symbol uses the enclosing
  class name (Java duplication convention: `<pkg>.<...>.<Class>.<Class>`).
- Enum bodies (`enum_class_body`) are NOT recursed — `enum_entry` is not
  emitted as a unit (matches Java 1차 scope).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Duplicate of code-java-ast-v1 with language-agnostic body unchanged. Cross-
chunker policy_hash identity asserted vs md-heading-v1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces Kotlin bail! arms with KotlinAstExtractor + CodeKotlinAstV1Chunker.
Adds kotlin_file_ingests_and_searches_as_code_citation integration test —
asserts citation.lang=kotlin, symbol=com.foo.Foo.bar, code_lang=kotlin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirrors code_go_ast_snapshot pattern. In-memory CanonicalDocument (no
kebab-parse-code dep — boundary §6.3).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
claude-reviewer-01 approved these changes 2026-05-20 11:56:45 +00:00
claude-reviewer-01 left a comment
Member

회차 1 — APPROVE: Java + Kotlin AST chunkers (p10-1C-JK) 전체 검증 완료 — 1C phase 완성

요약

12 커밋 / 27 파일 / +3470 -38 전량 리뷰 + 테스트 직접 실행. 모든 검증 통과. merge 준비 완료.

검증 결과

항목 결과
cargo test -p kebab-parse-code 43 passed
cargo test -p kebab-chunk 81 passed
cargo test -p kebab-source-fs 55 passed (1 ignored)
cargo test -p kebab-app --test code_ingest_smoke 9 passed (Java·Kotlin 신규 2 포함)
cargo test -p kebab-app --test twin_files_idempotent pass
cargo test -p kebab-app --test file_deletion_auto_purge pass
cargo test -p kebab-app --test reset_orphans pass
cargo test -p kebab-app --test twin_files_fetch_span pass
cargo test -p kebab-app --lib 52 passed
cargo clippy --workspace --all-targets -- -D warnings clean

Java correctness

  • extract_package: program root → package_declarationscoped_identifier | identifier 텍스트. 정확.
  • Constructor convention <pkg>.<Class>.<ClassName> (name 중복): java_units_match_design_3_4_symbolsMdHeadingV1Chunker.MdHeadingV1Chunker assert
  • Nested static class Builder + methods: Builder.withName, Builder.build assert
  • line_comment / block_comment 두 종 모두 unit_start fold (Javadoc 포함)
  • compact_constructor_declarationwalk_body 에서만 처리 — Java 문법상 record body 내에서만 등장하므로 올바른 배치.

Kotlin correctness (8 quirk)

PR body 에 열거된 8개 quirk 모두 구현에서 정확하게 처리됨. kotlin_units_match_design_3_4_symbols 가 Companion · freeFunction · Singleton · Singleton.ping · <top-level> 를 모두 assert → 회귀 보호 충분.

의존성 경계

  • cargo tree -p kebab-chunk --depth 1: tree-sitter 계열 없음 (design §6.3 준수)
  • cargo tree -p kebab-parse-code --depth 1: tree-sitter-java v0.23.5 + tree-sitter-kotlin-ng v1.1.0 만 추가
  • tree-sitter-kotlin-ng 선택 근거 (bare tree-sitter-kotlin 0.21–0.23 고착) 이 Cargo.toml 주석 + ARCHITECTURE + PR body 에 문서화됨

문서

README (.java/.kt/.kts + --code-lang java/kotlin flags + symbol 예시) · HANDOFF (P10 row) · ARCHITECTURE (parser 목록 + ng 선택 근거) · SMOKE (1C-JK 검증 항목) · tasks/INDEX + tasks/p10/INDEX · design §10.1 — 모두 정확하게 갱신됨.

minor note (블로커 아님)

compact_constructor_declaration (Java Record canonical constructor) + annotation_type_declarationtests/fixtures/sample.java 에 없어 단위 커버리지 공백. 코드 경로는 존재하고 clippy 통과. 1차 cut 범위에서 허용 가능 — 추후 Record 타입 픽스처 추가 시 보완 가능.


🤖 Generated with Claude Code

회차 1 — APPROVE: Java + Kotlin AST chunkers (p10-1C-JK) 전체 검증 완료 — 1C phase 완성 ## 요약 12 커밋 / 27 파일 / +3470 -38 전량 리뷰 + 테스트 직접 실행. 모든 검증 통과. **merge 준비 완료.** ## 검증 결과 | 항목 | 결과 | |------|------| | `cargo test -p kebab-parse-code` | ✅ 43 passed | | `cargo test -p kebab-chunk` | ✅ 81 passed | | `cargo test -p kebab-source-fs` | ✅ 55 passed (1 ignored) | | `cargo test -p kebab-app --test code_ingest_smoke` | ✅ 9 passed (Java·Kotlin 신규 2 포함) | | `cargo test -p kebab-app --test twin_files_idempotent` | ✅ pass | | `cargo test -p kebab-app --test file_deletion_auto_purge` | ✅ pass | | `cargo test -p kebab-app --test reset_orphans` | ✅ pass | | `cargo test -p kebab-app --test twin_files_fetch_span` | ✅ pass | | `cargo test -p kebab-app --lib` | ✅ 52 passed | | `cargo clippy --workspace --all-targets -- -D warnings` | ✅ clean | ## Java correctness - `extract_package`: `program` root → `package_declaration` → `scoped_identifier` | `identifier` 텍스트. 정확. - Constructor convention `<pkg>.<Class>.<ClassName>` (name 중복): `java_units_match_design_3_4_symbols` 가 `MdHeadingV1Chunker.MdHeadingV1Chunker` assert ✅ - Nested static class `Builder` + methods: `Builder.withName`, `Builder.build` assert ✅ - `line_comment` / `block_comment` 두 종 모두 `unit_start` fold (Javadoc 포함) ✅ - `compact_constructor_declaration` 은 `walk_body` 에서만 처리 — Java 문법상 record body 내에서만 등장하므로 올바른 배치. ## Kotlin correctness (8 quirk) PR body 에 열거된 8개 quirk 모두 구현에서 정확하게 처리됨. `kotlin_units_match_design_3_4_symbols` 가 Companion · freeFunction · Singleton · Singleton.ping · `<top-level>` 를 모두 assert → 회귀 보호 충분. ## 의존성 경계 - `cargo tree -p kebab-chunk --depth 1`: tree-sitter 계열 없음 ✅ (design §6.3 준수) - `cargo tree -p kebab-parse-code --depth 1`: `tree-sitter-java v0.23.5` + `tree-sitter-kotlin-ng v1.1.0` 만 추가 ✅ - `tree-sitter-kotlin-ng` 선택 근거 (`bare tree-sitter-kotlin` 0.21–0.23 고착) 이 Cargo.toml 주석 + ARCHITECTURE + PR body 에 문서화됨 ✅ ## 문서 README (`.java`/`.kt`/`.kts` + `--code-lang java`/`kotlin` flags + symbol 예시) · HANDOFF (P10 row) · ARCHITECTURE (parser 목록 + ng 선택 근거) · SMOKE (1C-JK 검증 항목) · tasks/INDEX + tasks/p10/INDEX · design §10.1 — 모두 정확하게 갱신됨. ## minor note (블로커 아님) `compact_constructor_declaration` (Java Record canonical constructor) + `annotation_type_declaration` 이 `tests/fixtures/sample.java` 에 없어 단위 커버리지 공백. 코드 경로는 존재하고 clippy 통과. 1차 cut 범위에서 허용 가능 — 추후 Record 타입 픽스처 추가 시 보완 가능. --- 🤖 Generated with [Claude Code](https://claude.com/claude-code)

[E2E smoke 9개 모두 green ✓]

java_file_ingests_and_searches_as_code_citation + kotlin_file_ingests_and_searches_as_code_citation 포함 9개 pass. 각 테스트가 parser_version · chunker_version · citation.lang · citation.symbol (fully-qualified) · SearchHit.code_lang 를 모두 assert — end-to-end wiring 검증 충분합니다.

**[E2E smoke 9개 모두 green ✓]** `java_file_ingests_and_searches_as_code_citation` + `kotlin_file_ingests_and_searches_as_code_citation` 포함 9개 pass. 각 테스트가 parser_version · chunker_version · citation.lang · citation.symbol (fully-qualified) · SearchHit.code_lang 를 모두 assert — end-to-end wiring 검증 충분합니다.
@@ -0,0 +1,322 @@
//! `code-java-ast-v1` — maps a tree-sitter-derived Java AST

[chunker 경계 — design §6.3 준수 ✓]

tree-sitter / tree-sitter-java import 없음. cargo tree -p kebab-chunk --depth 1 에서 tree-sitter 계열 crate 가 보이지 않음을 직접 확인. code-kotlin-ast-v1 동일. kebab_core 타입만 소비하는 순수 chunker 경계 유지.

**[chunker 경계 — design §6.3 준수 ✓]** `tree-sitter` / `tree-sitter-java` import 없음. `cargo tree -p kebab-chunk --depth 1` 에서 tree-sitter 계열 crate 가 보이지 않음을 직접 확인. `code-kotlin-ast-v1` 동일. `kebab_core` 타입만 소비하는 순수 chunker 경계 유지.
@@ -0,0 +1,543 @@
//! `kebab-parse-code::java` — tree-sitter Java AST extractor (P10-1C-JK Task D).

[Java 타입 선언 5종 + constructor 처리 확인 — LGTM]

extract_package: program root → package_declarationscoped_identifier | identifier 텍스트. 5 type 선언 (class/interface/enum/record/annotation_type) 모두 walk_top 에서 처리됨. compact_constructor_declaration 은 record body 안에서만 등장하므로 walk_body 전담 처리가 맞습니다.

unit_startline_comment / block_comment 두 종 모두 fold 하고 있어 Javadoc(/** ... */ = block_comment) 도 올바르게 처리됩니다.

minor coverage note: compact_constructor_declaration (Java Record canonical constructor) 와 annotation_type_declarationtests/fixtures/sample.java 픽스처에 없습니다 — 코드 경로는 있으나 단위 검증은 없습니다. 1차 cut 범위에서는 허용 가능 수준이며, 실제 Java 코드베이스 ingest 시 첫 커버리지를 얻게 됩니다.

**[Java 타입 선언 5종 + constructor 처리 확인 — LGTM]** `extract_package`: `program` root → `package_declaration` → `scoped_identifier` | `identifier` 텍스트. 5 type 선언 (class/interface/enum/record/annotation_type) 모두 `walk_top` 에서 처리됨. `compact_constructor_declaration` 은 record body 안에서만 등장하므로 `walk_body` 전담 처리가 맞습니다. `unit_start` 가 `line_comment` / `block_comment` 두 종 모두 fold 하고 있어 Javadoc(`/** ... */` = `block_comment`) 도 올바르게 처리됩니다. **minor coverage note**: `compact_constructor_declaration` (Java Record canonical constructor) 와 `annotation_type_declaration` 은 `tests/fixtures/sample.java` 픽스처에 없습니다 — 코드 경로는 있으나 단위 검증은 없습니다. 1차 cut 범위에서는 허용 가능 수준이며, 실제 Java 코드베이스 ingest 시 첫 커버리지를 얻게 됩니다.
@@ -0,0 +1,627 @@
//! `kebab-parse-code::kotlin` — tree-sitter Kotlin AST extractor (P10-1C-JK Task G).

[Kotlin grammar quirk 8개 일괄 확인 — LGTM]

헤더 주석이 8개 quirk 를 정확하게 열거하고 있고, 구현도 일치 확인:

  1. Root source_file ✓ (build_blockstree.root_node())
  2. qualified_identifier for package ✓ (extract_packagepackage_headerqualified_identifier 텍스트 슬라이스)
  3. ONE class_declaration + class_decl_is_enum ✓ (modifier walk → class_modifier text == "enum")
  4. class_body / enum_class_bodyfirst_child_of_kinds ✓ (field name 없으므로 kind 기반 lookup)
  5. companion_object + optional name → "Companion" fallback ✓ (node_name_text(...).unwrap_or("Companion"))
  6. Top-level function_declaration ✓ (walk_top "function_declaration" arm)
  7. secondary_constructormod_path.last() 로 class 이름 상속 ✓
  8. "import" (singular, no _declaration suffix) as glue ✓

kotlin_units_match_design_3_4_symbols 테스트가 Companion·freeFunction·Singleton·Singleton.ping·<top-level> 를 모두 assert 하므로 quirk 결과에 대한 회귀 보호가 충분합니다.

**[Kotlin grammar quirk 8개 일괄 확인 — LGTM]** 헤더 주석이 8개 quirk 를 정확하게 열거하고 있고, 구현도 일치 확인: 1. Root `source_file` ✓ (`build_blocks` 의 `tree.root_node()`) 2. `qualified_identifier` for package ✓ (`extract_package` — `package_header` → `qualified_identifier` 텍스트 슬라이스) 3. ONE `class_declaration` + `class_decl_is_enum` ✓ (modifier walk → `class_modifier` text == `"enum"`) 4. `class_body` / `enum_class_body` — `first_child_of_kinds` ✓ (field name 없으므로 kind 기반 lookup) 5. `companion_object` + optional name → `"Companion"` fallback ✓ (`node_name_text(...).unwrap_or("Companion")`) 6. Top-level `function_declaration` ✓ (`walk_top` `"function_declaration"` arm) 7. `secondary_constructor` — `mod_path.last()` 로 class 이름 상속 ✓ 8. `"import"` (singular, no `_declaration` suffix) as glue ✓ `kotlin_units_match_design_3_4_symbols` 테스트가 Companion·freeFunction·Singleton·Singleton.ping·`<top-level>` 를 모두 assert 하므로 quirk 결과에 대한 회귀 보호가 충분합니다.
@@ -0,0 +1,69 @@
# p10-1C-JavaKotlin — Java + Kotlin AST chunkers

[task spec 내 pre-impl 부정확 — 동결 후 HOTFIXES 불필요]

spec 내 "tree-sitter-kotlin 의 package_headeridentifier 텍스트" 서술이 실제 grammar 과 다릅니다 — 구현은 qualified_identifier 를 올바르게 사용합니다. 계획 작성 시 grammar 을 미리 확인하지 않아 생긴 사전 오류이며, 동작 편차 아님 — HOTFIXES 대상이 아닙니다. task spec 은 merge 시 동결되므로 수정 불필요.

**[task spec 내 pre-impl 부정확 — 동결 후 HOTFIXES 불필요]** spec 내 "tree-sitter-kotlin 의 `package_header` → `identifier` 텍스트" 서술이 실제 grammar 과 다릅니다 — 구현은 `qualified_identifier` 를 올바르게 사용합니다. 계획 작성 시 grammar 을 미리 확인하지 않아 생긴 사전 오류이며, 동작 편차 아님 — HOTFIXES 대상이 아닙니다. task spec 은 merge 시 동결되므로 수정 불필요.
altair823 merged commit 1e4cff879b into main 2026-05-20 11:57:42 +00:00
altair823 deleted branch feat/p10-1c-jk 2026-05-20 11:57:43 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: altair823-org/kebab#152