Conversation
|
Thanks for the pull request, @hopstreax. A maintainer will review it soon. Want to talk it through while it is in review? Come join us on our Discord server. For longer-form discussion there is also GitHub Discussions. A couple of things that speed up review: make sure the test suite passes on Python 3.10 and 3.13, and that the change keeps extraction deterministic. |
There was a problem hiding this comment.
Graphify reviewed this change.
Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.
Formal verification. No changes could be formally verified in this run.
Graphify review — findings
Extends Kotlin annotation handling for JPA-style code: _kotlin_annotation_names now also reads annotations on property getters and setters and dedupes repeated names. A new _kotlin_annotation_class_literal_refs adds references edges with context="attribute" for class literals in annotation arguments, such as Customer::class, skipping Kotlin and Java builtins. These edges are emitted for classes, properties, and primary-constructor val/var parameters, and constructor-parameter annotations now produce edges even when the parameter's type node isn't found.
Worth a look
- Class-literal detection likely never matches
Foo::classin the Kotlin grammar —graphify/extractors/engine.py:820· Escalate · medium- agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
Analysis details — impact, health, verification
Impact & health
Graphify review
Impact — 774 functions depend on the 299 functions this change touches.
Health — this change adds coupling hotspots:
- new:
_extract_generic()— 18 callers, 29 callees - new:
extract_js()— 87 callers, 4 callees - new:
extract_xaml()— 19 callers, 17 callees - new:
extract_objc()— 27 callers, 9 callees - new:
extract_julia()— 19 callers, 7 callees - new:
extract_cpp()— 29 callers, 3 callees - new:
extract_vue()— 10 callers, 7 callees - new:
walk()— 1 callers, 65 callees - …and 9 more — each is listed as a finding
Verification — 774 functions in the blast radius were not formally verified this run (proofs are advisory here).
Gate & verification
graphify gate
PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.
Advisory (not blocking):
- verification_scope: 711 function(s) in the blast radius were not formally verified this run
Test selection
Test selection
26 of 308 test file(s) selected (8%) via static blast radius.
tests/test_astro_extraction.py— impacttests/test_build.py— impacttests/test_cjs_module_extension.py— impacttests/test_cpp_nested_and_cli.py— impacttests/test_dotnet.py— impacttests/test_extract.py— impacttests/test_extract_php_closures.py— impacttests/test_import_extension_resolution.py— impacttests/test_indirect_call_block_scoped_shadow.py— impacttests/test_indirect_dispatch.py— impacttests/test_indirect_dispatch_assign_return.py— impacttests/test_indirect_dispatch_getattr.py— impacttests/test_js_exported_scalar_bindings.py— impacttests/test_kotlin_grammar.py— impact, changed-testtests/test_languages.py— impacttests/test_multilang.py— impacttests/test_python_underscore_resolution.py— impacttests/test_rationale.py— impacttests/test_ruby_resolution.py— impacttests/test_scala_self_type.py— impacttests/test_swift_computed_properties.py— impacttests/test_swift_protocol_requirements.py— impacttests/test_trailing_newline_not_a_syntax_error.py— impacttests/test_ts_new_expression_calls.py— impacttests/test_typescript_module_extensions.py— impacttests/test_vue_extraction.py— impact
Selection is safe under the controlled-regression assumption; always-run tests + a periodic full run are the backstops. Advisory — it never changes the check verdict.
Formal verification
Could not verify: Could not verify \_extract\_generic.
The verifier did not have enough to check \_extract\_generic, so it is saying so rather than guessing. No false assurance is the whole point.
Guarantee: No guarantee either way, this is an honest abstention, not a pass.
Note: Reason: no capturable inputs from the test suite; property tier: parameter `config` is annotated `LanguageConfig` — outside the synthesizable primitive/collection set
Could not verify: Could not verify \_kotlin\_annotation\_names.
The verifier did not have enough to check \_kotlin\_annotation\_names, so it is saying so rather than guessing. No false assurance is the whole point.
Guarantee: No guarantee either way, this is an honest abstention, not a pass.
Note: Reason: no capturable inputs from the test suite; property tier: not verifiable: all 200 sampled inputs raised on both versions — the function never executed, so 'no divergence' would be vacuous (mostly AttributeError — names the real obstacle, not a sampling gap)
· 17 more finding(s) on lines outside this diff (see the check run).
|
Thanks @hopstreax. Heads-up that most of this PR's scope already landed on v8: #3848 (0.9.68) added Kotlin annotations (class/function/property, use-site targets, bracketed lists) as There is one genuinely net-new piece worth having on its own: annotation-argument class-literal extraction — mining Could you resubmit just that slice as a focused PR against current v8 (the |
Summary
Fixes #3835 by restoring Kotlin annotation and property dependency extraction while preserving Graphify's existing class-level JVM graph model.
Changes
@get:Transient.@get:[Transient VisibleForTesting].Customer::class.fieldreferences for primary-constructorval/varproperties.generic_argreferences for generic constructor and class-body properties.Tests
pytest tests/test_kotlin_grammar.py tests/test_kotlin_object_literal.py— 42 passedpytest tests/test_languages.py -k "kotlin or java"— 46 passedgit diff --check— cleanArchitectural Notes
This implementation intentionally uses Graphify's existing class-level dependency representation:
It does not introduce Kotlin-specific property/member nodes, avoiding inconsistencies with the existing Java/Kotlin JVM graph model and type-resolution infrastructure.