Problem
Six Java accessors raise NotImplementedError, and the graph already carries everything they need. They were deferred out of leg 3 by the spec's §4 erratum and pinned in tests/analysis/java/test_java_public_surface.py::RAISING so the gap is recorded rather than silent — but nothing upstream is blocking them.
Measured on the leg-3 reference graph (daytrader8 + thingsboard, codeanalyzer-java 3.0.3):
| accessor |
data it needs |
present |
get_imports |
J_IMPORTS |
42,231 edges |
get_variables |
J_DECLARES_VAR |
30,667 edges |
get_class_hierarchy |
J_EXTENDS / J_IMPLEMENTS |
1,197 / 959 edges |
get_methods_with_annotations |
J_ANNOTATED_BY |
26,162 edges |
get_call_targets |
the call graph |
present |
get_calling_lines |
the call graph |
present; the SDK already computes these absolute file lines |
Python answers all six. This is the largest remaining behavioural gap between the Java facade and Python's, and it needs no analyzer release.
Scope boundary
In scope: those six, on both backends, and removing them from the RAISING record.
Out of scope: the three Java accessors that genuinely need a codeanalyzer-java release (config readers, entrypoint coverage, comment nodes over Neo4j) and CRUD (codeanalyzer-java#187). remove_all_comments is half in and half out — the in-process payload carries comments, the projection carries none — so treat it separately.
Goals
Caveats and known risks
get_calling_lines is absolute file lines on both backends. Leg 3a deliberately made these agree rather than shift by a declaration prefix; do not reintroduce the shift.
get_class_hierarchy returns a graph. Python's shape is the contract, not whatever is convenient to build from J_EXTENDS/J_IMPLEMENTS.
- Java's
imports are aggregated per import target in the projection, so file-level import order is not recoverable. Assert the set, and say so.
- Six accessors is enough to be worth splitting across more than one PR. Tracking granularity follows PR granularity — split this if it does.
Definition of done
- A reviewer can point at the assertion, per accessor, showing both backends give the same answer, and
RAISING names only accessors that are genuinely blocked upstream.
Problem
Six Java accessors raise
NotImplementedError, and the graph already carries everything they need. They were deferred out of leg 3 by the spec's §4 erratum and pinned intests/analysis/java/test_java_public_surface.py::RAISINGso the gap is recorded rather than silent — but nothing upstream is blocking them.Measured on the leg-3 reference graph (daytrader8 + thingsboard, codeanalyzer-java 3.0.3):
get_importsJ_IMPORTSget_variablesJ_DECLARES_VARget_class_hierarchyJ_EXTENDS/J_IMPLEMENTSget_methods_with_annotationsJ_ANNOTATED_BYget_call_targetsget_calling_linesPython answers all six. This is the largest remaining behavioural gap between the Java facade and Python's, and it needs no analyzer release.
Scope boundary
In scope: those six, on both backends, and removing them from the
RAISINGrecord.Out of scope: the three Java accessors that genuinely need a
codeanalyzer-javarelease (config readers, entrypoint coverage, comment nodes over Neo4j) and CRUD (codeanalyzer-java#187).remove_all_commentsis half in and half out — the in-process payload carries comments, the projection carries none — so treat it separately.Goals
JCodeanalyzerandJNeo4jBackend, identically, including on miss pathsRAISINGshrinks by six, and the public-surface test still pins what remainsCaveats and known risks
get_calling_linesis absolute file lines on both backends. Leg 3a deliberately made these agree rather than shift by a declaration prefix; do not reintroduce the shift.get_class_hierarchyreturns a graph. Python's shape is the contract, not whatever is convenient to build fromJ_EXTENDS/J_IMPLEMENTS.importsare aggregated per import target in the projection, so file-level import order is not recoverable. Assert the set, and say so.Definition of done
RAISINGnames only accessors that are genuinely blocked upstream.