Generated from graph/bundle/schema.ts (schema version 1). Do not edit; run npm run schema-doc.
Every run, in every language, writes the same thing:
<out>/
graph.sqlite the contract — the tables below, the ext_* tables, and this document as tables
and only with --debug:
csv/<table>.csv the core tables as headered, tab-delimited text (RFC 4180 quoting)
raw/ the per-language Soufflé relations, verbatim. Engine-internal; not a contract.
The same schema in every language — a table a front end does not derive is empty, not missing, and a note below says so. Where the front ends differ (which values a column can hold, what an id may point at) the difference is written here and in the schema_vocab / schema_notes tables inside the database, so a query can read it without leaving SQLite:
SELECT value, meaning FROM schema_vocab WHERE table_name='call_edges' AND column_name='tier'
AND language = (SELECT value FROM run WHERE key='language');Identifiers are the parser's hashes and are opaque; join them to methods / types / call_sites for names and positions. NULL in SQLite is the empty field in CSV.
- This is a call graph of one codebase, derived by a type-directed Datalog engine. Start with
SELECT value FROM run WHERE key='language'— every language-specific fact below is keyed on it. - The graph is
call_edges: one row per (call site, possible target). Rows join tomethods(names, files, lines) oncaller_id/callee_method_id, and tocall_sitesoncall_site_idfor where the call is written. Identifiers are opaque hashes — never parse them, always join. - Trust is explicit.
tiersays what kind of claim a row is:known_edge(one resolved target),multi_inferred(a sound set — every row of the set is a real possibility),boundary_lib(leaves the client; not expanded further),ambiguous_*(a declared unknown: callee is NULL). Pick the tiers your question tolerates and filter on them; never treat anambiguous_*row as an edge. - For a FIELD rather than a callable, the graph is
field_access: one row per (site, resolved field), joined tofieldsonfield_idand tomethodsoncaller_id, withaccesssaying read / write / readwrite. It carries the same four tiers and the same promise ascall_edges, so "who writes Foo.bar" is answered with a confidence, not with a name match. Java only so far; the table is present and empty elsewhere. - For a TYPE, the graph is
type_use: one row per place the type is named, with thecontextit was written in (FIELD_TYPE, METHOD_PARAM, METHOD_RETURN, OBJECT_CREATION_TYPE, CAST_EXPRESSION, SUPER_TYPE and the rest) and thedepththat separates the type as written from its type arguments. That is what makes "what breaks if I change T" specific per construct rather than a count of mentions. Java only so far. call_edgesis what the engine CONCLUDED;dispatch_candidatesis what the hierarchy ADMITTED. Read the second when you need an upper bound rather than a best answer — a candidate whose owner is absent fromtype_instantiatedis admitted by the hierarchy but never constructed in this run, which is how you narrow it yourself.basisseparates a declared relationship from a shape match.- Before answering "nothing calls X" or "X cannot reach Y", check
unresolved_sitesfor the methods on the path: a caller listed there has a call the engine could not resolve, so the answer is a lower bound and should say so. - Library targets (
callee_provenance = lib) are named inmethodswithprovenance = libbut their bodies were not analysed; a Pythonbuiltin/externaltarget has no methods row and lives incallee_label. schema_vocablists every value a column can hold FOR THIS LANGUAGE with its meaning — filter onlanguage = (SELECT value FROM run WHERE key='language').schema_noteslists the caveats for this language (empty tables, what an id may point at). Read both before interpretingkind,tieror an empty table.schema_queriesholds tested SQL for the common questions (callers, callees, blast radius, entry reachability, the method at a file:line, the blind spots of a method, the dispatch envelope of a method). Bind the named parameters and run.- Tables named
ext_<relation>are the language's raw engine relations with positional columns c0…cN;schema_tablescarries each one's description lifted from its rule. Use them only when a core table does not hold what you need. - When you report a result, carry the tier and the unresolved count with it. A consumer who cannot see the confidence of an edge cannot use it.
Each is verified to run against every language's bundle. Bind the named parameters.
skipped_files — Which files is this graph missing, and why? (Run this before reading any absence as an answer.) ((none))
SELECT k.file_path, k.reason, k.construct, k.start_line, k.detail,
(SELECT count(*) FROM methods m WHERE m.file_path = k.file_path) AS methods_in_graph
FROM skipped k
ORDER BY k.reason, k.file_pathcallers_of — Who calls this method, from where, and how sure is each edge? (:qualified_name)
SELECT caller.qualified_name AS caller, caller.file_path, s.start_line, e.tier, e.kind
FROM call_edges e
JOIN methods callee ON callee.id = e.callee_method_id
JOIN methods caller ON caller.id = e.caller_id
LEFT JOIN call_sites s ON s.id = e.call_site_id
WHERE callee.qualified_name = :qualified_name
ORDER BY caller.file_path, s.start_linecallees_of — What does this method call — resolved targets, library boundaries, and the sites it could not resolve? (:qualified_name)
SELECT s.start_line, s.callee_name AS written, e.tier, e.callee_provenance,
COALESCE(t.qualified_name, e.callee_label) AS target
FROM call_edges e
JOIN methods caller ON caller.id = e.caller_id
LEFT JOIN methods t ON t.id = e.callee_method_id
LEFT JOIN call_sites s ON s.id = e.call_site_id
WHERE caller.qualified_name = :qualified_name
ORDER BY s.start_line, targetblast_radius — If this method changes, which methods are transitively affected, up to :depth hops, through RESOLVED client edges only (a declared unknown is not traversed, and the count of them is returned alongside)? (:qualified_name, :depth)
WITH RECURSIVE up(id, depth) AS (
SELECT id, 0 FROM methods WHERE qualified_name = :qualified_name
UNION
SELECT e.caller_id, up.depth + 1
FROM call_edges e JOIN up ON e.callee_method_id = up.id
WHERE e.tier IN ('known_edge', 'multi_inferred', 'ambient_terminal', 'intrinsic_terminal')
AND up.depth < :depth
)
SELECT MIN(up.depth) AS depth, m.qualified_name, m.file_path, m.start_line,
(SELECT count(*) FROM unresolved_sites u WHERE u.caller_id = m.id) AS unresolved_calls_inside
FROM up JOIN methods m ON m.id = up.id
WHERE up.depth > 0
GROUP BY m.id ORDER BY depth, m.qualified_namereachable_from_entries — Is this method reachable from any entry point (a main, a test, an HTTP handler, an unimported module)? (:qualified_name)
SELECT m.qualified_name,
EXISTS (SELECT 1 FROM entry_reachable r WHERE r.method_id = m.id) AS reachable,
(SELECT count(*) FROM entry_points) AS entry_points_known
FROM methods m WHERE m.qualified_name = :qualified_namemethod_at — Which method contains this file:line? (:file_path, :line)
SELECT qualified_name, kind, start_line, end_line
FROM methods
WHERE file_path = :file_path AND start_line <= :line AND end_line >= :line
ORDER BY (end_line - start_line) LIMIT 1blind_spots_of — Which calls inside this method could the engine not resolve — the caveat to attach to any answer about it? (:qualified_name)
SELECT s.start_line, s.callee_name AS written, s.kind
FROM unresolved_sites u
JOIN methods m ON m.id = u.caller_id
LEFT JOIN call_sites s ON s.id = u.call_site_id
WHERE m.qualified_name = :qualified_name
ORDER BY s.start_linedispatch_envelope_of — What else might actually run at a call that resolves to this method — the set the graph narrowed from, and whether each candidate is a declaration or a shape match? (:qualified_name)
SELECT cand.qualified_name AS candidate, cand.file_path, cand.start_line, d.basis,
EXISTS (SELECT 1 FROM type_instantiated i WHERE i.type_id = cand.owner_type_id) AS owner_instantiated
FROM dispatch_candidates d
JOIN methods base ON base.id = d.base_method_id
JOIN methods cand ON cand.id = d.candidate_method_id
WHERE base.qualified_name = :qualified_name
ORDER BY d.basis, cand.qualified_namesubtypes_of — Which types extend or implement this type (transitively)? (:qualified_name)
SELECT sub.qualified_name, sub.category, sub.file_path
FROM type_ancestors a
JOIN types anc ON anc.id = a.ancestor_type_id
JOIN types sub ON sub.id = a.type_id
WHERE anc.qualified_name = :qualified_name
ORDER BY sub.qualified_namevalues_of — What can this column hold in THIS bundle's language, and what does each value mean? (:table_name, :column_name)
SELECT value, meaning FROM schema_vocab
WHERE table_name = :table_name AND column_name = :column_name AND language = (SELECT value FROM run WHERE key='language')
ORDER BY valuefield_impact — Who reads or writes this field — and which of those answers are certain? (:owner_qualified_name, :field_name)
SELECT m.qualified_name AS accessor, fa.access, fa.tier, fa.file_path, fa.start_line
FROM field_access fa
JOIN fields f ON f.id = fa.field_id
LEFT JOIN methods m ON m.id = fa.caller_id
WHERE f.owner_qualified_name = :owner_qualified_name AND f.name = :field_name
ORDER BY fa.tier, m.qualified_name, fa.start_linefield_blind_spots — Which field accesses could the engine not resolve — the caveat to attach to any answer about a field?
SELECT m.qualified_name AS accessor, fa.access, fa.file_path, fa.start_line
FROM field_access fa
LEFT JOIN methods m ON m.id = fa.caller_id
WHERE fa.tier = 'ambiguous_unknown'
ORDER BY fa.file_path, fa.start_linetype_impact — Where is this type used, and in what construct — the answer to "what breaks if I change it"? (:qualified_name)
SELECT u.context, u.depth, u.tier,
coalesce(m.qualified_name, ot.qualified_name) AS used_in,
coalesce(m.file_path, ot.file_path) AS file_path
FROM type_use u
JOIN types t ON t.id = u.type_id
LEFT JOIN methods m ON m.id = u.owner_method_id
LEFT JOIN types ot ON ot.id = u.owner_type_id
WHERE t.qualified_name = :qualified_name
ORDER BY u.context, used_intier_summary — How much of this graph is certain, inferred, at a library boundary, or unknown?
SELECT tier, count(*) AS edges, count(DISTINCT call_site_id) AS sites
FROM call_edges GROUP BY tier ORDER BY edges DESCWhat produced this bundle: one key/value row per fact about the run (language, engine commit, inputs, knobs, timestamps, schema version). Read language first — it selects which vocabulary rows apply.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | key |
TEXT | yes | Fact name — see the run.key vocabulary. |
||
| 1 | value |
TEXT | Fact value, as text. |
run.key values
| value | languages | meaning |
|---|---|---|
schema_version |
all | Version of this contract (SCHEMA.md). |
language |
all | Front end: java | typescript | python | javascript | csharp. Selects the applicable vocabulary rows. |
engine_commit |
all | Git commit of the rule set that produced the graph, when known. |
client_ir |
all | Path of the client IR directory the engine read. |
library_roots |
all | Comma-separated library IR roots staged as the type oracle; empty for a client-only run. |
dispatch_cap |
all | Fan-width cap on virtual dispatch in effect; off when uncapped. |
jdk_depth |
all | Platform-library hop cap (engine-ii). |
lib_depth |
all | External-library hop cap; uncapped when unset. |
engine_ii |
all | on when the library-frontier forward chain (engine-ii) was included; off for a client-only solve. |
solve_iterations |
all | Stage↔solve rounds until the library frontier converged. |
solve_seconds |
all | Wall-clock seconds of staging + solving, before the bundle stage. |
created_at |
all | ISO-8601 timestamp of the bundle. |
raw_dir |
all | Where the per-language Soufflé relations were read from (raw/ next to the bundle). |
source_version |
all | The version the IR was stamped with (bin/axiomcode): the git commit of the analysed source, or v1.0.0 when it was not a checkout. Present when the run went through bin/axiomcode all. |
source_dir |
all | The source directory that was parsed. Present when the run went through bin/axiomcode all. |
Every callable the graph refers to: all client methods/functions from the IR, plus every LIBRARY method some edge reaches (library methods nothing reaches are not listed — a library IR is GB-scale). A module-level function is a method whose owner columns are NULL; top-level code is the module initializer method (kind MODULE_INITIALIZER in TypeScript and Python, absent in Java).
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | id |
TEXT | yes | The parser's unique hash for the method (METHOD_REGISTRY_… / TS_METHOD_… / PY_METHOD_…). The value every other table uses to refer to a method. | ||
| 1 | name |
TEXT | yes | Simple name as written (render, __init__). A constructor is named after its class in Java (Circle) and <constructor> in TypeScript, JavaScript and C#. |
||
| 2 | qualified_name |
TEXT | yes | Parser-qualified name — package/module path plus owner plus name. Unique only together with the signature. | ||
| 3 | signature |
TEXT | Parameter-type signature as the parser prints it, e.g. main(String[]); language-native formatting. |
|||
| 4 | kind |
TEXT | The parser's methodKind — see vocabulary; the sets differ per language. | |||
| 5 | owner_type_id |
TEXT | yes | yes | FK → types.id of the declaring class/interface/enum; NULL for a free function or a module initializer. | |
| 6 | owner_qualified_name |
TEXT | yes | Qualified name of the owner, denormalised so a row prints without a join; NULL when owner_type_id is NULL. | ||
| 7 | file_path |
TEXT | yes | Source file, as the parser recorded it (relative to the project root it was given). | ||
| 8 | start_line |
INTEGER | 1-based first line of the declaration. | |||
| 9 | end_line |
INTEGER | 1-based last line of the declaration. | |||
| 10 | provenance |
TEXT | client — from the analysed project; lib — from a staged library IR; generated — declared by an annotation processor and synthesised here (Java). See vocabulary. |
|||
| 11 | visibility |
TEXT | yes | yes | Declared access as the parser recorded it, normalised (PUBLIC / PROTECTED / PACKAGE / PRIVATE). NULL where the language has no access modifiers. A public or protected declaration with no dependent in this graph is exported surface, not dead code. |
methods.kind values
| value | languages | meaning |
|---|---|---|
METHOD |
csharp | An ordinary method. |
CONSTRUCTOR |
csharp | A constructor, written as one. The parser names it <constructor>, while a new Foo(...) site carries Foo. |
PRIMARY_CONSTRUCTOR |
csharp | A constructor declared in the type header: class Svc(IDep d), and every positional record. It is the only constructor such a type has. |
STATIC_CONSTRUCTOR |
csharp | The type initializer. Static field initializers run in it; the compiler emits one only where it is needed, so it is often absent. |
DESTRUCTOR |
csharp | A finalizer. Called by the garbage collector, so it has no caller in the graph. |
OPERATOR |
csharp | A user-defined operator. a + b on such a type is a static call to it, with no call syntax at the site. |
CONVERSION_OPERATOR |
csharp | A user-defined conversion. An implicit one runs with no syntax at the call site at all. |
LOCAL_FUNCTION |
csharp | A function declared inside a method body. Visible only there, and it may capture the enclosing locals. |
LAMBDA |
csharp | A lambda body, which is its own method. Calls written in it are attributed to it, not to the method containing the lambda: the runtime reaches it through a delegate. |
ANONYMOUS_METHOD |
csharp | A delegate { ... } body. Same shape as LAMBDA. |
TOP_LEVEL_ENTRY_POINT |
csharp | The synthetic method holding a file of C# 9 top-level statements. An entry point, and the caller every top-level call site is attributed to. |
PROPERTY_GET |
csharp | A property getter. x.Name is a call to it. An auto-property getter has no body, which is the correct answer rather than a gap. |
PROPERTY_SET |
csharp | A property setter. x.Name = v is a call to it. |
PROPERTY_INIT |
csharp | An init accessor: settable only in an object initializer or a constructor. |
INDEXER_GET |
csharp | An indexer getter. a[i] on the read side is a call to it. |
INDEXER_SET |
csharp | An indexer setter. a[i] = v. |
INDEXER_INIT |
csharp | An indexer init accessor. |
EVENT_ADD |
csharp | An event add accessor. e += h is a call to it. |
EVENT_REMOVE |
csharp | An event remove accessor. e -= h. |
INSTANCE_METHOD |
java | Non-static method. |
STATIC_METHOD |
java | Static method. |
ABSTRACT_METHOD |
java | Abstract or interface method without a body. |
DEFAULT_METHOD |
java | Interface default method. |
CONSTRUCTOR |
java, typescript | A declared constructor. Java names it after the class (Circle, qualified shapes.Circle.Circle); TypeScript names it <constructor>. |
STATIC_INITIALIZER |
java | static { … } block. |
GENERATED_METHOD |
java, csharp | Synthesised for a member no IR declares, so it has no real methodKind: in Java one an annotation processor declares, in C# the Invoke of the delegate a field or property holds. Always paired with provenance generated. |
ENUM_CONSTANT_METHOD |
java | Method body declared on an enum constant. |
RECORD_ACCESSOR |
java | A record component accessor. |
COMPACT_CONSTRUCTOR |
java | A record's compact canonical constructor. |
DEFAULT_CONSTRUCTOR |
java, typescript | The implicit no-arg constructor the parser synthesises for a class that declares none (TypeScript: and extends nothing; a subclass runs the nearest declared base constructor). Named as a declared one is. |
INSTANCE_INITIALIZER |
java | { … } instance initializer block. |
ANNOTATION_ELEMENT |
java | An element of an annotation interface. |
RECORD_EQUALS |
java | A record's implicit equals. |
RECORD_HASH_CODE |
java | A record's implicit hashCode. |
RECORD_TO_STRING |
java | A record's implicit toString. |
ENUM_VALUES |
java | An enum's implicit values(). |
ENUM_VALUE_OF |
java | An enum's implicit valueOf(String). |
FUNCTION_DECLARATION |
typescript | function f() {}. |
METHOD_DECLARATION |
typescript | Class or interface method. |
GETTER |
typescript | get x(). |
SETTER |
typescript | set x(v). |
ARROW_FUNCTION |
typescript | Arrow function value. |
FUNCTION_EXPRESSION |
typescript | function () {} value. |
METHOD_SIGNATURE |
typescript | Bodiless method in an interface/type. |
CALL_SIGNATURE |
typescript | Interface call signature (x): y. |
CONSTRUCT_SIGNATURE |
typescript | Interface construct signature new (x): y. |
TYPE_LITERAL_METHOD_SIGNATURE |
typescript | Method signature inside a type literal. |
TYPE_LITERAL_CALL_SIGNATURE |
typescript | Call signature inside a type literal. |
TYPE_LITERAL_CONSTRUCT_SIGNATURE |
typescript | Construct signature inside a type literal. |
FUNCTION_TYPE_SIGNATURE |
typescript | A function type (x) => y. |
CONSTRUCTOR_TYPE_SIGNATURE |
typescript | A constructor type new (x) => y. |
OBJECT_LITERAL_METHOD |
typescript | Method in an object literal. |
CLASS_STATIC_BLOCK |
typescript | static { … } in a class. |
MODULE_INITIALIZER |
typescript, python | Synthetic method holding a module's top-level code. Every module has one; top-level call sites belong to it. |
FUNCTION |
python | Module-level def. |
INSTANCE_METHOD |
python | Method taking self. |
STATIC_METHOD |
python | @staticmethod. |
CLASS_METHOD |
python | @classmethod. |
PROPERTY_GETTER |
python | @property. |
PROPERTY_SETTER |
python | @x.setter. |
PROPERTY_DELETER |
python | @x.deleter. |
CONSTRUCTOR |
python | __init__. |
ALLOCATOR |
python | __new__. |
DUNDER_METHOD |
python | Other __x__ method. |
ABSTRACT_METHOD |
python | @abstractmethod. |
OVERLOAD_STUB |
python | @overload signature. |
LAMBDA |
python | A lambda expression. |
NESTED_FUNCTION |
python | def inside a function. |
GENERATOR |
python | Function with yield. |
ASYNC_FUNCTION |
python | async def. |
ASYNC_GENERATOR |
python | async def with yield. |
CLASS_INITIALIZER |
python | Synthetic method holding a class body's top-level code. |
FUNCTION_DECLARATION |
javascript | function f() {} — hoisted. |
FUNCTION_EXPRESSION |
javascript | function () {} value, including an object literal's m() {}. |
ARROW |
javascript | Arrow function value; this is lexical. |
CLASS_METHOD |
javascript | A class member, syntactic or declared by assignment (F.prototype.m = …, F.s = …). |
CONSTRUCTOR |
javascript | constructor() of a class, named <constructor>. A pre-ES6 constructor function is not a CONSTRUCTOR: its row keeps the kind and name of its syntax (function F() {} is FUNCTION_DECLARATION F; var F = function () {} and exports.F = function () {} are FUNCTION_EXPRESSION <function-expression>, or the expression's own name if it has one), and the type it introduces, F, is CONSTRUCTOR_FUNCTION. |
GETTER |
javascript | get x(). |
SETTER |
javascript | set x(v). |
STATIC_BLOCK |
javascript | static {} block of a class. |
MODULE_INITIALIZER |
javascript | Synthetic method holding a module's top-level code. Every module has one; top-level call sites belong to it. |
methods.visibility values
| value | languages | meaning |
|---|---|---|
PUBLIC |
java | Callable from anywhere; exported surface. No in-repo caller does not mean unused. |
PROTECTED |
java | Callable by subclasses outside the package; exported surface for extension. |
PACKAGE |
java | Default access; callable only within the declaring package. |
PRIVATE |
java | Callable only within the declaring type. |
methods.provenance values
| value | languages | meaning |
|---|---|---|
client |
all | Declared in the analysed project. |
lib |
all | Declared in a staged library IR; listed because an edge reaches it. |
generated |
java | Declared by a compile-time annotation processor: present in the compiled artefact and in every caller's source, and in no IR, so the bundle synthesises it to give the edge a target. id generated:<owner qualified name>#<name>/<arity>, no file and no line numbers. |
generated |
csharp | The Invoke of the delegate held in one field or property: id generated:<owner qualified name>#<member>.Invoke, no file and no line numbers. Every call through that member is an edge to it (tier boundary_lib, which is also where the compiler binds the call), and what the member holds is in dispatch_candidates with basis value. |
Notes
- all — Library rows are the subset an edge reaches. To see a library method nothing calls, query the library IR itself.
- javascript — signature is empty and owner_qualified_name is NULL: JavaScript declares neither. owner_type_id is set for class members, including members declared by assignment.
- javascript — A library row's qualified_name and file_path are prefixed with the package: its path under the client when installed there (
node_modules/<pkg>/…, nested versions included), else its package name (<pkg>/…; a second root with the same name gets#2). The parser records both relative to the package root, where two packages with an index.js are indistinguishable. Same for types.
Every class-like declaration the graph refers to: all client types, plus every library type that owns a listed library method or appears in type_ancestors.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | id |
TEXT | yes | The parser's unique hash (TYPE_REGISTRY_… / TS_TYPE_… / PY_TYPE_…). | ||
| 1 | name |
TEXT | yes | Simple name. | ||
| 2 | qualified_name |
TEXT | yes | Parser-qualified name. | ||
| 3 | category |
TEXT | The parser's typeCategory — see vocabulary. | |||
| 4 | file_path |
TEXT | yes | yes | Source file; NULL for an external type (no declaration was staged). | |
| 5 | start_line |
INTEGER | yes | 1-based first line; NULL for an external type. | ||
| 6 | end_line |
INTEGER | yes | 1-based last line; NULL for an external type. | ||
| 7 | provenance |
TEXT | client, lib, or external (Java: an unstaged ancestor, see vocabulary). |
|||
| 8 | visibility |
TEXT | yes | yes | Declared access as the parser recorded it, normalised (PUBLIC / PROTECTED / PACKAGE / PRIVATE). NULL where the language has no access modifiers. |
types.category values
| value | languages | meaning |
|---|---|---|
CLASS |
csharp | A class. |
INTERFACE |
csharp | An interface. Its members may have bodies (C# 8 default implementations), so an interface method is not always an abstract stub. |
STRUCT |
csharp | A struct. It cannot be derived from, so a receiver of this type is exact and needs no dispatch fan. |
ENUM |
csharp | An enum. Cannot be derived from. |
DELEGATE |
csharp | A delegate type. It names a signature; a call through a value of it is resolved by value flow rather than by member lookup. |
RECORD |
csharp | A record declared with the record keyword. Also a CLASS or STRUCT underneath; the row says which via its modifiers. |
CLASS_TYPE |
all | A class. |
EXTERNAL_TYPE |
java | An unstaged ancestor named by the client — see provenance external. Class or interface is not known. |
INTERFACE_TYPE |
java, typescript | An interface. |
ENUM_TYPE |
java, typescript | An enum. |
RECORD_TYPE |
java | A record. |
ANNOTATION_TYPE |
java | An annotation interface. |
ANNOTATION_INTERFACE_TYPE |
java | An annotation interface (@interface), as the parser categorises it in newer output. |
CONST_ENUM_TYPE |
typescript | const enum. |
TYPE_ALIAS_TYPE |
typescript | type X = …. |
NAMESPACE_TYPE |
typescript | namespace X {}. |
CLASS_EXPRESSION_TYPE |
typescript | A class expression value. |
CLASS |
javascript | An ES class declaration. |
ANONYMOUS_CLASS |
javascript | A class expression. |
CONSTRUCTOR_FUNCTION |
javascript | A function with prototype members — a pre-ES6 class. |
JSDOC_TYPEDEF |
javascript | A @typedef — comment-only, never constructed or dispatched into. |
JSDOC_CALLBACK |
javascript | A @callback — comment-only. |
EXCEPTION_CLASS_TYPE |
python | A class deriving from BaseException. |
ENUM_CLASS_TYPE |
python | An Enum subclass. |
PROTOCOL_TYPE |
python | A typing.Protocol. |
ABC_TYPE |
python | An abstract base class. |
NAMEDTUPLE_TYPE |
python | A NamedTuple class. |
TYPEDDICT_TYPE |
python | A TypedDict class. |
DATACLASS_TYPE |
python | A @dataclass. |
METACLASS_TYPE |
python | A metaclass (derives from type). |
GENERIC_TYPE |
python | A Generic[…] class. |
types.provenance values
| value | languages | meaning |
|---|---|---|
client |
all | Declared in the analysed project. |
lib |
all | Declared in a staged library IR. |
external |
java | Named by the client as an ancestor (extends/implements) but declared in no staged IR: id external:<qualified name>, category EXTERNAL_TYPE, no file, no members. Kept so the subtype edge survives; stage the library to replace it with the real declaration. |
One row per place a call is written (or, for a synthesised edge, the construct that implies the call). Every call_edges.call_site_id is here. Location columns come from the IR; they are NULL when the site is a construct the IR does not position (see notes).
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | id |
TEXT | yes | Site identifier — an expression hash in every language; in Python it may also be a decorator hash or, for METACLASS_CREATION, the class's type hash (see notes). | ||
| 1 | caller_id |
TEXT | yes | The method whose body contains the site (FK → methods.id) — or, for code that runs outside any method, the enclosing TYPE (Java: TYPE_REGISTRY_… = the type's static/instance initializer) or MODULE (TypeScript: TS_MODULE_… as a fallback marker). Never NULL. See notes. | ||
| 2 | kind |
TEXT | What syntactic form the call takes — the same value as call_edges.kind for this site; see vocabulary (language-specific sets). | |||
| 3 | callee_name |
TEXT | yes | yes | The name written at the site (render in w.render(), the class name in new Widget()); NULL when the form has no written name (a constructor delegation, a record deconstruction). |
|
| 4 | file_path |
TEXT | yes | yes | Source file. | |
| 5 | start_line |
INTEGER | yes | 1-based line. | ||
| 6 | start_column |
INTEGER | yes | Column, as the parser counts it. | ||
| 7 | end_line |
INTEGER | yes | 1-based last line; NULL where the IR records only the start. | ||
| 8 | end_column |
INTEGER | yes | End column; NULL where the IR records only the start. |
Notes
- java — caller_id is a TYPE_REGISTRY_ id (a types row, not a methods row) for a call written in a field initializer or a static/instance initializer block: the parser gives such code no enclosing method, and the rule set attributes it to the type — read it as "runs in this type's /".
- typescript — caller_id is normally the parser's caller method, or the module initializer for top-level code; when neither exists it is the TS_MODULE_ hash itself, kept as a greppable marker rather than a blank.
- java — callee_name for
new X()and fornew X() { … }(anon_new) is the class name written at the site; NULL for ctor_delegate (this(…)/super(…)) and record_accessor, which write no name. A by-name lookup must therefore exclude kind IN (new, anon_new) to avoid counting a construction as a call to a same-named method. - java — A record_accessor site is the RECORD_PATTERN expression, positioned where the pattern is written.
- java — A resource_close site is the resource LOCAL of a try-with-resources, positioned at its declaration (line only, no column); callee_name is NULL.
- python — A DECORATOR_APPLICATION edge targets the callable the decorator factory RETURNS, not the name written at the
@—@deco(X)applies the inner callable thatdecoreturned. The written name is carried by the separate DECORATOR_CALL row, so a by-name lookup must exclude DECORATOR_APPLICATION or it will read the wrapper as a mismatch. - typescript — end_line / end_column come from the expression row; the call-site row itself records only the start.
- javascript — caller_id is the parser's enclosing method, or the module initializer for top-level code. end_line / end_column come from the expression row.
require()is a module edge, not a call site. - typescript — PROPERTY_READ and PROPERTY_WRITE rows are accessor invocations with no written call: the site is the property-access expression that runs the getter or setter, positioned from the expressions table, and callee_name is NULL because nothing was written; the accessor's name is on the callee's methods row. Filter them out with kind NOT IN (…) when counting calls.
- python — PROPERTY_READ, CONTEXT_MANAGER, ITERATION_PROTOCOL, METACLASS_CREATION and DYNAMIC_CALL rows are protocol or indirect edges with no written call: their site is the expression that triggers them, and callee_name is always NULL because nothing was written. SUBSCRIPT_CALL is NULL only when the subscript is not a written name (measured 206 of 337 rows on a Python subject). Filter them out with kind NOT IN (…) when counting calls.
- python — The id is an EXPRESSION hash for a written call; a DECORATOR hash (PY_DECORATOR_…) for DECORATOR_APPLICATION and DECORATOR_* sites, positioned at the decorator line; and the class's TYPE hash for METACLASS_CREATION, positioned at the class declaration.
THE GRAPH. One row per (site, resolved target). A site with N possible targets has N rows, each carrying the same tier; a site the engine could not resolve has exactly one row with a NULL callee and an ambiguous_* tier — so every call site written in the client appears at least once, and the table alone shows where every chain ends and why. Filter on tier to choose your risk tolerance.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | call_site_id |
TEXT | yes | FK → call_sites.id. | ||
| 1 | caller_id |
TEXT | yes | Same value as call_sites.caller_id for this site: the containing method, or the enclosing type/module id when there is none (see call_sites). | ||
| 2 | callee_method_id |
TEXT | yes | yes | FK → methods.id of the resolved target, when the target is a method the bundle knows (callee_provenance client or lib). NULL otherwise. | |
| 3 | callee_label |
TEXT | yes | The target when it is NOT a method row: a builtin (builtin:len) or an import path outside every staged IR (requests.get) — Python only today. NULL when callee_method_id is set or the site is unresolved. |
||
| 4 | callee_provenance |
TEXT | yes | Where the target lives — see vocabulary. NULL for an unresolved site. | ||
| 5 | tier |
TEXT | yes | Confidence class of this edge — see vocabulary. known_edge and multi_inferred are assertions about client code; boundary_lib leaves the client; the ambiguous_* tiers are declared blind spots, not edges. |
||
| 6 | kind |
TEXT | Syntactic form of the site — see vocabulary; language-specific sets, kept native. |
call_edges.kind values
| value | languages | meaning |
|---|---|---|
method |
csharp | A call written with or without a receiver: a.M(), M(), a?.M(). |
new |
csharp | An object creation. The target is the constructed type's constructor, and it is never dispatched. |
ctor_delegate |
csharp | : this(...) or : base(...). No name is written, so the target is structural. |
primary_ctor_base |
csharp | SYNTHESISED. A primary constructor's base invocation, written in the heritage clause: class D(int a) : B(a). There is no call syntax anywhere in the body. FromExpr is the heritage type reference. |
delegate |
csharp | A call through a delegate value: handler(x) or handler.Invoke(x). |
operator |
csharp | A user-defined operator invoked by operator syntax. |
conversion |
csharp | A user-defined conversion. An implicit one has no syntax at the call site. |
indexer |
csharp | A user-defined indexer accessor, invoked by a[i]. |
dynamic |
csharp | A call through a dynamic value. Dispatched at runtime by the DLR, so the target is undecidable from source; the tier is ambiguous_dynamic and that is final, not a gap. |
property_read |
csharp | Reading a property runs its get accessor. No written call; the site is the member access. |
property_write |
csharp | Assigning a property runs its set (or init) accessor. |
event_subscribe |
csharp | e += h / e -= h on an event with custom add / remove accessors runs that accessor. |
runtime |
csharp | The edge of a runtime_observed row: no written call behind it. |
other |
csharp | A call kind this engine has no rule for. Present so a kind added to the schema later is unresolved rather than invisible. |
method |
java | obj.m(), Class.m(), super.m(), or an unqualified m(). |
new |
java | new X(…). |
ref |
java | A method reference X::m, obj::m, X::new. |
lambda_body |
java | An edge from the method that INVOKES a lambda to something the lambda body calls. The body is not a method of its own, so its calls are attributed to the invoker rather than lost (call-edge-generation/lambda_dispatch.dl). |
ctor_delegate |
java | this(…) / super(…) inside a constructor. |
anon_new |
java | new X() { … } — an anonymous class creation. |
event |
java | Synthesised: the publishEvent call site to a listener it runs (tier event_dispatch). Not a written call to that method. |
entity_callback |
java | Synthesised: a call that writes an entity (repository.save(e), em.persist(e), delete(e)) to a JPA lifecycle callback it runs (tier event_dispatch). Not a written call to that method. |
record_accessor |
java | Synthesised: a record pattern case Pair(var l, var r) calls each accessor. Not a written call; the site is the pattern expression. |
resource_close |
java | Synthesised: a try-with-resources resource try (var w = open()) is closed when the block exits, so its close() is called. Not a written call; the site is the resource local. |
FUNCTION_CALL |
typescript | f(…) — a bare callee. |
METHOD_CALL |
typescript | obj.m(…). |
CONSTRUCTOR_CALL |
typescript | new X(…). |
SUPER_CALL |
typescript | super(…) or super.m(…). |
TAGGED_TEMPLATE_CALL |
typescript | tag…. |
INDEX_CALL |
typescript | obj[k](…) through an index signature. |
DYNAMIC_IMPORT_CALL |
typescript | import(…). |
DECORATOR_CALL |
typescript | A decorator application @d / @d(…). |
OPTIONAL_CALL |
typescript | f?.(…). |
JSX_COMPONENT_CALL |
typescript | <Component …/> — a JSX element naming a component; <div> emits no site. |
PROPERTY_READ |
typescript, javascript | Reading obj.x where x is a get accessor runs the getter (engine-authored). No written call; the site is the property-access expression. A compound assignment or ++ reads before it writes, so it carries this and PROPERTY_WRITE. |
PROPERTY_WRITE |
typescript, javascript | Assigning obj.x = v where x is a set accessor runs the setter (engine-authored). No written call; the site is the property-access expression on the left. |
FUNCTION_CALL |
javascript | f(…) — a bare callee, resolved by the binder. |
METHOD_CALL |
javascript | obj.m(…). |
CONSTRUCTOR_CALL |
javascript | new X(…). |
SUPER_CALL |
javascript | super(…). |
COMPUTED_CALL |
javascript | obj[expr](…) — the name is not fixed by syntax. |
FUNCTION_CALL_CALL |
javascript | f.call(o, …) — the target is f; the receiver moved into argument position. |
FUNCTION_CALL_APPLY |
javascript | f.apply(o, args) — the target is f. |
FUNCTION_CALL_BIND |
javascript | f.bind(o) — produces a function that runs f; the edge names f. |
IIFE_CALL |
javascript | (function () {…})(). |
OPTIONAL_CALL |
javascript | obj?.m(…). |
TAGGED_TEMPLATE_CALL |
javascript | tag…. |
DYNAMIC_CODE_CALL |
javascript | eval(…) / new Function(…) — unknowable by construction. |
DYNAMIC_IMPORT_CALL |
javascript | import(…) — a module load that is also a site. |
JSX_ELEMENT |
javascript | <Component …/> — the renderer runs the component (a function component, or a class component's constructor and render) with the element's attributes as its props. Engine-authored: no written call; the site is the JSX element expression. An intrinsic tag (<div/>) is no site. |
JSX_ATTRIBUTE |
javascript | <form onSubmit={submit}>, <UserForm action={create}/> — a function handed over as a JSX attribute, on any tag; always tier callback_registered. Engine-authored: the site is the attribute. |
SIMPLE_CALL |
python | f(…) — a bare name. |
METHOD_CALL |
python | obj.m(…). |
CHAINED_CALL |
python | a.b().c(…) — the receiver is itself a call. |
SUPER_CALL |
python | super().m(…). |
SELF_CALL |
python | self.m(…). |
CLS_CALL |
python | cls.m(…). |
MODULE_CALL |
python | module.f(…) on an imported module. |
SUBSCRIPT_CALL |
python | d[k](…). |
DYNAMIC_CALL |
python | Callee computed at runtime (getattr(...)() and the like). |
DECORATOR_CALL |
python | The factory call of a parenthesised decorator @d(…). |
INSTANCE_CALL |
python | Calling an instance — dispatches to __call__. |
BUILTIN_CALL |
python | The parser recognised a builtin (len, print, …). |
UNKNOWN_CALLEE_CALL |
python | The parser could not classify the callee. |
DECORATOR_APPLICATION |
python | Applying a parenthesised decorator's RESULT to the decorated definition. The site is the decorator hash. |
DECORATOR_* |
python | Applying an unparenthesised decorator; the suffix is the parser's decorator kind: BARE, ATTRIBUTE, SUBSCRIPT, EXPRESSION (and CALL/ATTRIBUTE_CALL when the factory expression is not itself a call site). The site is the decorator hash. |
METACLASS_CREATION |
python | A class statement invokes its metaclass's __new__ / __init__ at import time, whether the metaclass is written on the statement (class X(metaclass=M)) or inherited from a base, and the nearest base's __init_subclass__. No written call; the site is the class's type hash. |
PROPERTY_READ |
python | Reading obj.attr where attr is a @property runs the getter; reading Cls.attr where the METACLASS defines attr as a property runs that getter. No written call; the site is the attribute-access expression. |
CONTEXT_MANAGER |
python | with expr: runs __enter__ / __exit__ (or the async pair). No written call; the site is the context-manager expression. |
ITERATION_PROTOCOL |
python | for x in expr: (and comprehensions) runs __iter__ / __next__ (or the async pair). No written call; the site is the iterated expression. |
SUBSCRIPT_PROTOCOL |
python | x[k] runs __getitem__ (and x[k] = v / del x[k] the setter and deleter) of the receiver's class. No written call; the site is the subscript expression. Its own kind so it is never counted as a written call. |
call_edges.tier values
| value | languages | meaning |
|---|---|---|
ambiguous_dynamic |
csharp | A call through dynamic. Unresolvable BY DESIGN rather than by omission, and separated from ambiguous_unknown so a known-undecidable site is not counted as an engine failure. |
known_builtin_operator |
csharp | An operator or conversion with no user-defined declaration anywhere (a + b on built-in types). No user code runs, so no target is the right answer; callee is NULL. An operator on an unstaged type IS a library member and is boundary_lib instead. |
boundary_generated |
csharp | A read of a property the compiler generated (a positional record's property). There is no written accessor to point at, so callee_method_id is NULL, callee_label names the member and callee_provenance is generated. A correct end, not a blind spot. |
runtime_observed |
csharp | Only when a runtime trace is supplied: an edge the trace saw and the static pass did not name. Real by construction, and added only, never used to remove an edge. The site is the CALLER METHOD, not an expression (the tracer sees method entry, not the call site), and kind is runtime. |
known_implicit_ctor |
csharp | new Foo() where Foo declares no constructor. The compiler supplies a parameterless one, so there is no user code to call and nothing resolving is the right answer. |
event_dispatch |
csharp | A mediator's Send(request) reaching the Handle of the handler registered for the request's type (IRequestHandler<TRequest, TResponse>, with a generic request's type arguments), or Publish(notification) reaching every INotificationHandler<T> for its type and each of its bases. Not the site's own callee: the site also keeps its row for the library method. The container picks the handler in process, before the call returns, so this is a call edge and not a remote_edge. A request declared as a base (not an interface) fans to the handler of each type in its family. |
known_edge |
all | Exactly one target resolved. The strongest claim. |
multi_inferred |
all | A sound SET of possible targets; each member is one row. The set over-approximates — every member is a real possibility, but not every member runs. HOW WIDE the set is differs by language: see the per-language notes on this table for whether the fan is narrowed by the instantiation set. |
boundary_lib |
all | The target is outside the client (library, builtin, or unstaged external). The chain is not expanded past it here. |
ambiguous_unknown |
all | Declared blind spot: the engine could not resolve the site (unresolved receiver, missing type, reflection…). callee is NULL. Never dropped. |
ambiguous_anon |
java | Known structural gap: an anonymous-class creation has no candidate rule yet. callee is NULL. |
ambient_terminal |
typescript | The target is an ambient declaration (a .d.ts signature with no body anywhere) — resolved, but there is nothing to expand into. |
ambient_terminal |
javascript | The callee or receiver VALUE is the platform (console.log, path.join, arr.forEach) — a correct end, not a blind spot; callee is NULL. Beside a project edge it is the platform ALTERNATIVE of a multi_inferred site. |
implicit_constructor |
javascript | new C() / super() where no constructor exists up the chain: the synthesized default runs. A correct end; callee is NULL. |
dynamic_terminal |
javascript | obj[expr](), eval, import(): no static target by construction; callee is NULL. |
fan_capped |
javascript, java, csharp | More targets than --dispatch-cap: the set was refused rather than emitted. JavaScript: callee is NULL. Java and C#: callee is the declared base method the fan would have started from; dispatch-capped-sites.csv carries the refused count. |
callback_registered |
javascript, typescript | The site HANDS the callee this function (xs.forEach(f), p.then(f), emitter.on('x', h), setTimeout(f)), which may invoke it. Not the site's own callee; a reachability edge, labelled so it is never read as a resolved call. |
event_dispatch |
javascript | x.emit('name') reaching a handler registered by x.on('name', h) on a value x may hold — name-sensitive for literal names, every handler on that value for a computed one. |
event_dispatch |
java | A Spring application event: publishEvent(e) reaching each listener (@EventListener, @TransactionalEventListener, ApplicationListener<E>.onApplicationEvent) whose declared event type e's static type is, or is a subtype of. Added beside the publishEvent boundary row, never in place of it (call-edge-generation/event_dispatch.dl). Also a JPA entity write (save, persist, merge, delete on a repository or EntityManager) reaching the @PrePersist/@PreUpdate/@PreRemove-style callbacks of the written entity's type and of the listeners @EntityListeners names on it or a superclass (kind entity_callback; call-edge-generation/entity_lifecycle.dl). |
intrinsic_terminal |
typescript | The site is a JSX intrinsic element or a dynamic import() — a runtime intrinsic, not a function the graph can name. |
call_edges.callee_provenance values
| value | languages | meaning |
|---|---|---|
external |
all | The target is outside every staged IR. callee_method_id is NULL and callee_label names it, as external:<Type>.<Member>. A client-only run of a C# project reaches the BCL this way for most of its calls. |
client |
all | Target is a client method (callee_method_id set). |
lib |
all | Target is a method of a staged library IR (callee_method_id set, methods.provenance = lib). |
generated |
csharp | The target is a member the compiler generated and no source declares (a boundary_generated row); callee_label names it. |
builtin |
python | Target is a CPython builtin with no Python source (callee_label = builtin:NAME). |
external |
python, java | Target is outside every staged IR and has no methods row. Python: an import path (callee_label = the written path). Java: a method of an unstaged ancestor type (callee_label = external:<type>.<name>), reached through a receiver declared as that type or inherited by a client subclass; see types.provenance external. |
Notes
- javascript — Targets are VALUES the receiver may hold, not declared types: a
multi_inferredset is the union of what flowed into the receiver. An untyped receiver isambiguous_unknown, never a name match. - python — A
boundary_libedge may point at a builtin (callee_provenance builtin, callee_labelbuiltin:NAME) or at an unstaged import path (callee_provenance external) — neither has a methods row. - java — A
boundary_libedge with callee_provenance external names a method of an ancestor type no staged IR declares (callee_labelexternal:<type>.<name>, no methods row). A site whose receiver is declared as such a type is multi_inferred even with one client override: the platform method itself, and the platform's own subclasses, are the other possible targets. Stage the library to replace the label with the real method. - python — The reason a site is ambiguous_unknown is exported per site in ext_call_site_unresolved (site, caller, reason, detail).
- all — THE TRUST LINE, and it is not the same set of tiers in every language. RESOLVED (callee_method_id is set): known_edge and multi_inferred in every language, and boundary_lib where the library is staged (--library) — without it boundary_lib names the target in callee_label and leaves callee_method_id NULL; ALSO ambient_terminal in TypeScript, fan_capped in Java and C# (the declared base, the fan refused), and runtime_observed in C#. HANDED OVER (callee set, but the site passes the function rather than calling it): callback_registered and event_dispatch in JavaScript, callback_registered in TypeScript; event_dispatch in C# too, where a mediator Send or Publish runs the handler for the request type, beside the row for the site itself. CORRECT END (callee NULL, and nothing is missing): intrinsic_terminal in TypeScript; ambient_terminal, implicit_constructor and dynamic_terminal in JavaScript; known_implicit_ctor, known_builtin_operator and boundary_generated (callee_label set) in C#. BLIND SPOT (callee NULL; exactly the tiers named
ambiguous_*, which are what unresolved_sites holds): ambiguous_unknown everywhere, ALSO ambiguous_anon in Java and ambiguous_dynamic in C#. CAPPED (callee NULL, not in unresolved_sites): fan_capped in JavaScript. Python emits only the four shared tiers. A filter written astier IN (known_edge, multi_inferred)therefore drops resolved edges in every language but Python — derive the set from this note or from unresolved_sites, never from a hardcoded list. - java — A multi_inferred fan is CHA-wide: it is every override the hierarchy admits, bounded only by the dispatch cap. type_instantiated is computed and exported but NOT read by any rule, so the fan is not narrowed to types the program constructs. Narrow it yourself by joining dispatch_candidates to type_instantiated — see the dispatch_envelope_of query. A receiver is ALSO typed by what flows into it (a local's initializer, the arguments callers pass to a parameter, the receivers callers invoke a method on for its
this), and each flow-in type resolves its member directly, outside the fan: that is why afan_cappedsite still carries edges, and why they are the types the program was seen to hand over, not the whole hierarchy. - typescript — A multi_inferred fan is CHA-wide, as in Java: type_instantiated is computed and exported but NOT read by any rule. The fan also has sources that are not virtual dispatch at all — an overload set or a union-typed receiver produces one too.
- python — A multi_inferred fan IS narrowed by the instantiation set: type_instantiated_reachable (the constructed classes and their bases) bounds dispatch in resolution/dispatch.dl. Python is the only front end where that narrowing is applied, so a fan here is tighter than the same shape would be in Java or TypeScript.
- all — The raw relation has a seventh column, ToExpr, that is always
-(reserved). It is dropped here. - all — An unresolved site (tier ambiguous_*) has NULL callee_method_id, callee_label and callee_provenance. The raw relation writes
-in those slots.
Transitive supertype closure: (type, ancestor) for every ancestor reachable through extends/implements/bases, client and library alike. Not a member-inheritance claim — in TypeScript an implements edge inherits nothing (the rule set keeps two closures; this is the conformance one).
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | type_id |
TEXT | yes | yes | FK → types.id. | |
| 1 | ancestor_type_id |
TEXT | yes | yes | FK → types.id. |
THE DISPATCH ENVELOPE: (base method, method that may run instead) for every call that statically resolves to the base. This is the set call_edges narrowed FROM — the difference between "these are the targets" and "these are the targets, out of these possibilities". Populated in every language but JavaScript (see its note); basis says what admitted the pair, because the front ends admit by different means.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | base_method_id |
TEXT | yes | yes | FK → methods.id — the method a call resolves to statically. | |
| 1 | candidate_method_id |
TEXT | yes | yes | FK → methods.id — a method that may run instead at such a call. | |
| 2 | basis |
TEXT | yes | What admitted the pair — see vocabulary. Filter on it to trust only declarations. |
dispatch_candidates.basis values
| value | languages | meaning |
|---|---|---|
nominal |
java, typescript, csharp | A written extends/implements reaches the candidate's owner from the base's owner. The strongest evidence there is: the author declared the relationship. |
structural |
typescript | No declaration; the candidate's owner satisfies the base's owner by SHAPE. Emitted only for supertypes with no nominal implementor at all, so it never competes with a declared answer — but it is a heuristic, and a consumer that wants declarations only filters it out. |
value |
java, typescript, csharp, python | A function stored in a field, variable or parameter whose type is the base's callable type; a call through that holder may run it. In TypeScript also a function written as an implementation of an interface's member signature: an object-literal member of a literal typed by the interface (#1208), or a function assigned to the member through a property chain, inst.i.run = (x) => … (#1283). In C# also what one delegate member is assigned from another (a.Run = a.Parse). In Python, a function assigned onto an instance's member from outside its class, which shadows the class's method of that name. The base is the signature the call resolves to (bodiless), so the pair is how a walk over callers reaches the function that runs. Flow-derived rather than declared: a consumer that wants declarations only filters it out. |
mro |
python | The subtype's C3 linearisation picks the candidate for that attribute name. Not merely "the subtype declares this name" — a name a sibling base wins is attributed to that sibling. |
Notes
- javascript — EMPTY — JavaScript has no declared dispatch to widen from: a multi_inferred set is already the values the receiver may hold (see call_edges), so there is no envelope to record.
Virtual-dispatch pairs: (base method, overriding method) wherever a call to the base may run the override. Java and C# only, and kept for compatibility — it is exactly dispatch_candidates filtered to basis = nominal. Prefer dispatch_candidates, which is populated in every language.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | method_id |
TEXT | yes | yes | FK → methods.id — the base (declared) method. | |
| 1 | overriding_method_id |
TEXT | yes | yes | FK → methods.id — the override in a subtype. |
Notes
- typescript — EMPTY — this table is Java-shaped. The TypeScript dispatch envelope is in dispatch_candidates, with basis
nominalorstructural. - python — EMPTY — this table is Java-shaped. The Python dispatch envelope is in dispatch_candidates with basis
mro, andvaluefor a function assigned onto an instance's member; the raw linearisation is in ext_mro_position.
Methods the runtime invokes without a client call site — process roots, test methods, HTTP handlers, framework hooks. The seeds of entry_reachable.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | method_id |
TEXT | yes | yes | FK → methods.id. | |
| 1 | reason |
TEXT | yes | Why it is an entry — see vocabulary. |
entry_points.reason values
| value | languages | meaning |
|---|---|---|
main |
java, csharp | A static main. C#: a static Main, or the method top-level statements compile to. |
test |
java, typescript, csharp | Java: a JUnit test or lifecycle method. TypeScript: a function body handed to a test registrar (it, describe), inline or named, which the runner invokes. C#: an xUnit, NUnit or MSTest test method, or a set-up or tear-down hook of one. |
http |
java, python, typescript, csharp | A route handler a web framework invokes on a request. Java: a JAX-RS / Spring MVC handler. Python: a function registered with a decorator naming an HTTP verb and a URL path. TypeScript: a handler passed to a route registration (app.get('/x', h)), inline or named, or a method carrying a route decorator inside a container-owned class (@Controller + @Get). C#: a routed controller action, or a Razor Pages page model's On<Verb>[Handler][Async] method. |
cli |
java | A CLI command method (picocli etc.). |
bean_ctor |
java, typescript | Constructor of a container-managed class. TypeScript: the class carries a framework decorator (@Injectable, @Component, @Module), so the container constructs it and nothing in the repository does. |
factory |
java | A @Bean factory method. |
lifecycle |
java, typescript, csharp | Java: @PostConstruct / @PreDestroy and similar hooks. TypeScript: a hook the container calls by name on a decorated class (ngOnInit, onModuleInit), which has no call site anywhere. C#: a method the host calls on a hosted service (ExecuteAsync, StartAsync, StopAsync, and the IHostedLifecycleService hooks), including one that derives from the host's base through the project's own base class. |
queue |
java, csharp | A message-listener method. Java: also a Spring application event listener (@EventListener, @TransactionalEventListener, an ApplicationListener implementation). C#: a broker consumer or a bus message handler. |
scheduled |
java | A @Scheduled method. |
grpc_service |
java, python, csharp | A gRPC service implementation the server invokes on a request, with no call site reaching it: a generated ImplBase override (Java); a class deriving from a generated *Servicer base in a _pb2_grpc module, overriding a method that base declares (Python). |
web_servlet |
java | A servlet class named in web.xml (<servlet-class>): its container callbacks (doGet, service, …) and the library methods it overrides are invoked by the container. |
web_filter |
java | A filter class named in web.xml (<filter-class>); the container calls its callbacks. |
web_listener |
java | A listener class named in web.xml (<listener-class>); the container calls its callbacks (contextInitialized, sessionCreated, …). |
lifecycle_init |
java | The method an XML bean definition names as init-method; the container calls it after construction. |
lifecycle_destroy |
java | The method an XML bean definition names as destroy-method; the container calls it at shutdown. |
lifecycle_factory |
java | The method an XML bean definition names as factory-method; the container calls it to build the bean. |
config_handler |
java | A callback of a class a configuration file names under a key that expects a class (not an annotation); the container instantiates it and calls it. |
service_loader |
java | A callback of a provider listed in META-INF/services; ServiceLoader instantiates it and the caller reaches it through the service interface. |
auto_configuration |
java | The constructor or a container callback of a configuration class named in META-INF/spring/*.imports or under a configuration key of META-INF/spring.factories (EnableAutoConfiguration); Spring Boot registers it as a bean. |
spring_factories |
java | The constructor or callback of a class named under any other key of META-INF/spring.factories (ApplicationContextInitializer, EnvironmentPostProcessor, …); SpringFactoriesLoader instantiates it and calls it. Not a bean. |
unimported_module |
typescript, javascript | The initializer of a module nothing imports — a script or a bundle root. |
exported_from_entry_module |
typescript | A named function exported from a module nothing in the project imports. Its caller is the package's consumer, which is not in the repository. Placeholder names (<arrow>) are not roots. |
package_export |
typescript | A named function exported from a module the project's package.json publishes (main, module, exports, types, source), mapped from build output back to its source. Its caller is the package's consumer. Covers the entry a project's own tests import, which exported_from_entry_module cannot see. |
task |
python | A function registered as a queue task. A worker process runs the body; the producer only enqueues, so nothing in the client calls it. |
fixture |
python | A declared fixture that some collected test requests by parameter name. The runner calls it to build the argument. |
url |
python | A view named as a value in a module-level route table. The framework calls it on a request. |
signal_receiver |
python | A handler attached to a signal, by decorator or by connect(). It runs when the signal fires, whether or not this tree contains the send. |
di_provider |
python | A provider named in a dependency-injection marker in a parameter default. The framework calls it and passes the result in. |
orm_hook |
python, csharp | A hook the data layer calls; nothing in the client does. Python: a lifecycle or validation hook registered by decoration. C#: an Entity Framework Core override or implementation: OnModelCreating, OnConfiguring, IEntityTypeConfiguration<T>.Configure, a migration's Up/Down, a save-changes interceptor, IDesignTimeDbContextFactory<T>.CreateDbContext. |
framework_hook |
csharp | A method a framework calls on a class because the class derives from one of its base types or implements one of its interfaces, directly or through the project's own bases: an options setup class, a view component, an authorization handler, a model binder, a gRPC interceptor, a FluentValidation validator's constructor and overrides, a MediatR request or notification handler, Dispose/DisposeAsync on an IDisposable/IAsyncDisposable. |
hub |
csharp | A public instance method of a SignalR hub. A connected client invokes it by name. |
Notes
- python — Framework entry points only: url, http, orm_hook, task, signal_receiver, fixture, di_provider and grpc_service. There is no test and no main reason: a pytest test is recognised by the query layer from its file and name, not here.
Methods reachable from some entry point through call_edges (client edges only). A method absent here is dead from every known entry — or reachable only through a declared unknown.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | method_id |
TEXT | yes | FK → methods.id. |
The blind spots, attributed to the code that contains them: (caller, site) for every call site whose tier is ambiguous_* — a declared unknown, not an edge. A change-impact answer computed from a caller listed here is a lower bound. Derived from call_edges, so it is present in every language.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | caller_id |
TEXT | yes | yes | Same domain as call_sites.caller_id: usually FK → methods.id. | |
| 1 | call_site_id |
TEXT | yes | FK → call_sites.id. |
Every field-like storage location the graph refers to: all client fields and enum constants from the IR, plus every LIBRARY field some field_access edge reaches OR some config_binding row names. A field is not a callable, so it has no row in methods; this is where field_access.field_id resolves to a name, an owner and a position.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | id |
TEXT | yes | The parser's unique hash for the field or enum constant (FIELD_REGISTRY_… / ENUM_CONSTANT_…). The value field_access.field_id refers to. | ||
| 1 | name |
TEXT | yes | Simple name as written (count, RED). |
||
| 2 | kind |
TEXT | field or enum_constant — see vocabulary. An enum constant is a static final field of its enum and is recorded here so Colour.RED resolves like any other read. |
|||
| 3 | owner_type_id |
TEXT | yes | yes | FK → types.id of the declaring class/interface/enum/record. | |
| 4 | owner_qualified_name |
TEXT | yes | Qualified name of the owner, denormalised so a row prints without a join. | ||
| 5 | type_name |
TEXT | yes | The declared type as the parser wrote it; NULL for an enum constant, whose type is its own enum. | ||
| 6 | modifiers |
TEXT | yes | The parser's comma-separated modifier set (STATIC,FINAL); NULL where the IR records none. |
||
| 7 | file_path |
TEXT | yes | yes | Source file. | |
| 8 | start_line |
INTEGER | yes | 1-based first line of the declaration. | ||
| 9 | end_line |
INTEGER | yes | 1-based last line. | ||
| 10 | provenance |
TEXT | client — from the analysed project; lib — from a staged library IR; generated — declared by an annotation processor and synthesised here (Java). See vocabulary. |
fields.kind values
| value | languages | meaning |
|---|---|---|
field |
csharp | A field declaration, including a const. |
field |
java, typescript | An ordinary field declaration. |
enum_constant |
java | An enum constant. It is a static final field of its enum, and is listed here so Colour.RED resolves like any other read; the parser gives it its own table and its own hash prefix. |
fields.provenance values
| value | languages | meaning |
|---|---|---|
client |
csharp | Declared in the analysed project. |
lib |
csharp | Declared in a staged library IR. |
client |
java, typescript | Declared in the analysed project. |
lib |
java, typescript | Declared in a staged library IR. |
generated |
java | Declared by a compile-time annotation processor and synthesised by the bundle, same shape and same reason as methods.provenance generated. |
Notes
- all — JAVA, TYPESCRIPT AND C#. EMPTY for Python and JavaScript: a Python attribute is a symbols row of kind field. In C# it holds true fields only; a property is a symbols row of kind field with a property id, and its accessors are methods rows (PROPERTY_GET, PROPERTY_SET, PROPERTY_INIT).
- typescript — An enum member is absent: the parser gives it its own table with no declared type, and the property-access relation resolves through the field table.
Colour.Redis therefore an unresolved field access, unlike Java where an enum constant is a fields row. - java — A library field is listed when some field_access edge reaches it, exactly as methods lists only the library methods an edge reaches, OR when a config_binding row names it as the field a configuration key binds to. The second was added in #890: a @Value field on a library type that nothing reads has no access edge, so config_binding named a field the table did not list and the join lost the row silently.
THE DATA GRAPH. One row per (site, resolved field), and the answer to "who reads or writes this field" — the question call_edges cannot answer, because a field access is not a call. A site with N possible fields has N rows carrying the same tier; a site the engine could not resolve has exactly one row with a NULL field and tier ambiguous_unknown, so every field access written in the client appears at least once and the table alone shows where the resolution stopped. A field is NOT virtually dispatched: a known_edge row names the storage location, not a best estimate of one.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | site_id |
TEXT | yes | The expression where the access is written. Not a call_sites id: a field access is not a call site. The location columns on this row are the site's own. | ||
| 1 | caller_id |
TEXT | yes | The method whose body contains the access (FK → methods.id) — or, for an access written in a field initializer or an initializer block, the enclosing TYPE, exactly as call_sites.caller_id does. Never NULL. | ||
| 2 | field_id |
TEXT | yes | yes | FK → fields.id of the resolved field or enum constant. NULL when the site is unresolved. | |
| 3 | field_provenance |
TEXT | yes | Where the field is declared — client or lib. NULL for an unresolved site. |
||
| 4 | access |
TEXT | yes | Which way the data moves — see vocabulary. Present on an unresolved row too: the direction is decided by how the access is WRITTEN, which does not need the receiver to resolve. | ||
| 5 | tier |
TEXT | yes | Confidence class of this edge — see vocabulary. Same four values and same promises as call_edges.tier. | ||
| 6 | file_path |
TEXT | yes | yes | Source file of the site. | |
| 7 | start_line |
INTEGER | yes | 1-based line of the site. | ||
| 8 | start_column |
INTEGER | yes | Column, as the parser counts it. | ||
| 9 | end_line |
INTEGER | yes | 1-based last line. | ||
| 10 | end_column |
INTEGER | yes | End column. |
field_access.access values
| value | languages | meaning |
|---|---|---|
read |
java, typescript | The value is used and not replaced. |
write |
java, typescript | The value is replaced without being read: a plain assignment f = v. |
readwrite |
java, typescript | The value is read and replaced at the one site: a compound assignment f += v, or f++ / --f. One row, not two — a consumer asking "who writes f" and one asking "who reads f" must both match it. |
field_access.tier values
| value | languages | meaning |
|---|---|---|
known_edge |
java, typescript | Exactly one field resolved. Stronger than the call_edges tier of the same name: a field is not virtually dispatched, so this IS the storage location the access binds to. |
multi_inferred |
java, typescript | A sound SET: the receiver has more than one possible type, or two unrelated ancestors declare the name (which Java itself treats as ambiguous). Each member is one row. |
boundary_lib |
java, typescript | The field is declared in a staged library type. field_id is set and resolves in fields with provenance lib. |
ambiguous_unknown |
java, typescript | Declared blind spot: the receiver could not be typed, or the name is not a member of the type it was typed to. field_id is NULL. Never dropped, and never replaced by a match on simple name. |
field_access.field_provenance values
| value | languages | meaning |
|---|---|---|
client |
java, typescript | The field is declared in the analysed project. |
lib |
java, typescript | The field is declared in a staged library IR. |
Notes
- all — JAVA AND TYPESCRIPT. The table is declared in every bundle and is EMPTY for Python, JavaScript and C# (C# fills
fields, notfield_access), so the schema does not churn as the remaining front ends land (#663). CheckSELECT count(*) FROM field_accessbefore reading an empty result as "nothing reads this field". - typescript — AN ACCESSOR IS NOT HERE.
get url()read asc.urlis a CALL, and call_edges already carries it with kind PROPERTY_READ or PROPERTY_WRITE (#703). The two tables are disjoint by construction: this one holds properties, call_edges holds accessors. Ask both when you want every read of a member. - typescript — AN ELEMENT ACCESS IS NOT HERE either:
obj["x"]with a literal key is a different node kind and is not yet a site. A known gap, not a silent one. - typescript — A METHOD IS NOT A SITE. The callee of
obj.m()is a PROPERTY_ACCESS node (37% of them, measured on one TypeScript library), andconst f = obj.mreads a method as a value; neither is a data edge, and admitting them would fill the ambiguous_unknown tier with sites the engine HAS resolved elsewhere. Both are excluded and counted in ext_field_site_excluded with reasons method_callee and method_value. - java — A field access written in a SWITCH CASE LABEL is deliberately absent. An enum constant in a case label is recorded TYPE for some arms and FIELD for others (#760), and javac compiles the switch through a $SwitchMap array rather than through a read of the constant, so there is no field access in the bytecode either.
- java — A field read that PRECEDES a same-named local declared later in the same method is missing: the parser classifies such a name LOCAL_VARIABLE against the whole body rather than against the scope at the use site (#725), so the site never reaches the engine and is absent rather than ambiguous. Rare (1 in 5,647 local references measured) but it is an absence, not a declared unknown.
- java — ARRAY ELEMENTS are not tracked:
a[i] = vwhereais a field is recorded as a READ ofa(the array reference is read; the element write is not a field write). This matches the bytecode, where the instruction isgetfield afollowed byaastore.
THE OTHER HALF OF CHANGE IMPACT: one row per place a type is NAMED, with the context it was written in. call_edges says who calls a method and field_access who touches a field; this says what breaks if the TYPE changes — every signature, field, local, new, cast, instanceof, throws clause and generic argument that mentions it. A name that resolved to nothing is one row with a NULL type and tier ambiguous_unknown, so an unstaged third party is a declared unknown rather than an absence.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | reference_id |
TEXT | yes | The type-reference node. Not an expression id: a type reference is its own IR entity. | ||
| 1 | type_id |
TEXT | yes | yes | FK → types.id of the type the name denotes. NULL when it resolved to nothing. | |
| 2 | context |
TEXT | yes | Where the reference is written — see vocabulary. This is the column that makes an impact answer specific: seventeen METHOD_PARAM and four FIELD_TYPE, not twenty-one mentions. |
||
| 3 | depth |
INTEGER | 0 for the type as written, 1 or more for a type argument of the one above it. A field of type Map<String, Widget> yields Map at depth 0 and String and Widget at depth 1; all three are uses of the type named. |
|||
| 4 | owner_kind |
TEXT | What kind of declaration carries the reference — see vocabulary. It says what owner_id points at. |
|||
| 5 | owner_id |
TEXT | The declaration that carries the reference. FK → methods.id when owner_kind is METHOD, → types.id for TYPE, → fields.id for FIELD; for METHOD_PARAM, LOCAL_VARIABLE, EXPRESSION and the annotation kinds it is the parser hash of an entity the bundle does not table, so join on owner_method_id / owner_type_id instead. | |||
| 6 | owner_method_id |
TEXT | yes | yes | FK → methods.id of the method whose declaration or body contains the reference; NULL where there is none (a field type, a supertype clause). | |
| 7 | owner_type_id |
TEXT | yes | yes | FK → types.id of the type whose source contains the reference. Set for every reference written inside a type declaration. | |
| 8 | type_provenance |
TEXT | yes | Where the referenced type is declared — client or lib. NULL when unresolved. |
||
| 9 | tier |
TEXT | yes | Confidence class — see vocabulary. Same four values and same promises as call_edges.tier. |
type_use.tier values
| value | languages | meaning |
|---|---|---|
known_edge |
java, typescript | Exactly one type. A type reference is not dispatched, so this IS the declaration the name denotes. |
multi_inferred |
java, typescript | A sound SET: two resolution paths both answer a simple name. Each member is one row. |
boundary_lib |
java, typescript | The type is declared in a staged library IR. type_id resolves in types with provenance lib. |
ambiguous_unknown |
java, typescript | Declared blind spot: the name resolved to nothing — an unstaged third party, or a type variable with no bound in view. type_id is NULL. Never dropped. |
type_use.type_provenance values
| value | languages | meaning |
|---|---|---|
client |
java, typescript | The referenced type is declared in the analysed project. |
lib |
java, typescript | The referenced type is declared in a staged library IR. |
type_use.owner_kind values
| value | languages | meaning |
|---|---|---|
TYPE |
java, typescript | The reference is on the type declaration itself: an extends or implements clause, or a type parameter bound. owner_id is a types.id. |
METHOD |
java, typescript | A return type, a throws clause, or a method type-parameter bound. owner_id is a methods.id. |
METHOD_PARAM |
java, typescript | A formal parameter's declared type. owner_id is the parameter's parser hash; join on owner_method_id. |
FIELD |
java, typescript | A field's declared type. owner_id is a fields.id. |
LOCAL_VARIABLE |
java | A local, a catch parameter or a resource's declared type. owner_id is the local's parser hash; join on owner_method_id. |
EXPRESSION |
java, typescript | A type written inside an expression: new T(), a cast, an instanceof, a pattern, a method-reference qualifier. owner_id is the expression hash; join on owner_method_id. |
ANNOTATION |
java | The annotation type itself, on whatever it annotates. |
ANNOTATION_ARGUMENT |
java | A type named as an annotation argument, e.g. a Class<?> value. |
VARIABLE |
typescript | A const / let declaration's written type. A module-scope variable is a first-class declaration in TypeScript, so this covers what Java splits between FIELD and LOCAL_VARIABLE. |
HERITAGE |
typescript | An extends or implements clause, which the parser gives its own entity rather than hanging off the type. |
TYPE_PARAMETER |
typescript | A type parameter's bound or default. |
TYPE_REFERENCE |
typescript | Another type reference: the row is a type ARGUMENT or an element of the reference named in owner_id. depth says how deep. |
DECORATOR |
typescript | A decorator application. |
ENUM_MEMBER |
typescript | An enum member's written type. |
EXPORT |
typescript | An export type clause. |
MODULE |
typescript | A module-level position with no finer owner. |
type_use.context values
| value | languages | meaning |
|---|---|---|
FIELD_TYPE |
java, typescript | The declared type of a field. |
METHOD_PARAM |
java, typescript | The declared type of a formal parameter. |
METHOD_RETURN |
java, typescript | The declared return type. |
LAMBDA_PARAMETER_TYPE |
java | The declared type of an explicitly typed lambda parameter, (Foo f) -> f.bar(). It is a receiver-typing source, so it is what types f at the call inside the body. |
LOCAL_VARIABLE |
java | The declared type of a local, a catch parameter or a try-with-resources resource. |
OBJECT_CREATION_TYPE |
java, typescript | The type of a new T(...). |
ARRAY_CREATION_TYPE |
java | The element type of a new T[n]. |
CAST_EXPRESSION |
java | The type of a (T) x. |
INSTANCEOF_TYPE |
java, typescript | The type tested by an x instanceof T. |
PERMITS |
java | A permitted subtype named in a sealed type's permits clause. |
SUPER_TYPE |
java, typescript | An extends clause. |
IMPLEMENTS_INTERFACE |
java, typescript | An implements clause. |
THROWS_CLAUSE |
java | A declared thrown type. |
ANNOTATION_TYPE |
java | The annotation type applied to a declaration. |
ANNOTATION_PARAM |
java | A type named as an annotation argument. |
TYPE_PARAM_BOUND |
java, typescript | The bound of a type parameter declared on a TYPE. |
METHOD_TYPE_PARAM_BOUND |
java, typescript | The bound of a type parameter declared on a METHOD. |
METHOD_TYPE_ARGUMENT |
java, typescript | An explicit type argument at a call site, x.<T>m(). |
METHOD_REFERENCE_QUALIFIER |
java | The qualifier of a method reference, T::m. |
PATTERN_BINDING_TYPE |
java | The type of a record-pattern component. |
SWITCH_TYPE_PATTERN |
java | The type of a switch type pattern, case T t ->. |
RECORD_PATTERN_TYPE |
java | The record type a deconstruction pattern matches. |
VARIABLE_TYPE |
typescript | The written type of a const / let / var. |
TYPE_ELEMENT |
typescript | A member's type inside an interface or a type literal. |
HERITAGE_TWIN |
typescript | The second half of a heritage clause a declaration-merged type carries. |
AS_TARGET |
typescript | The target of an x as T. |
SATISFIES_TARGET |
typescript | The target of an x satisfies T. |
TYPE_ASSERTION |
typescript | The target of a <T>x assertion. |
TYPE_ARGUMENT |
typescript | A type argument of the reference in owner_id — Widget in Map<string, Widget>. |
TYPE_PARAM_DEFAULT |
typescript | A type parameter's default, the = T in <K = string>. |
TYPE_ALIAS_RHS |
typescript | The right-hand side of a type X = …. |
INDEX_SIGNATURE_KEY |
typescript | The key type of an index signature. |
INDEX_SIGNATURE_VALUE |
typescript | The value type of an index signature. |
MAPPED_CONSTRAINT |
typescript | The constraint of a mapped type. |
MAPPED_TEMPLATE |
typescript | The template of a mapped type. |
CONDITIONAL_* |
typescript | A prefix: the check, extends, true and false branches of a conditional type. |
TEMPLATE_SPAN |
typescript | A span of a template-literal type. |
IMPORT_TYPE_QUALIFIER |
typescript | The qualifier of an import("m").T. |
TYPE_PREDICATE_TARGET |
typescript | The target of an x is T predicate. |
ENUM_MEMBER_TYPE |
typescript | An enum member's written type. |
DECORATOR_TYPE |
typescript | The decorator itself. |
DECORATOR_ARGUMENT_TYPE |
typescript | A type named in a decorator argument. |
Notes
- all — JAVA AND TYPESCRIPT. Declared in every bundle and EMPTY for Python, JavaScript and C#, so the schema does not churn as the remaining front ends land (#663).
- typescript — The context set is TypeScript's own and is wider than Java's: AS_TARGET, SATISFIES_TARGET, TYPE_ALIAS_RHS, the CONDITIONAL_* family, MAPPED_, INDEX_SIGNATURE_ and TEMPLATE_SPAN have no Java counterpart. A use inside a conditional type IS a use of that type and is recorded as one.
- typescript — Only a reference whose KIND can name a declaration is a row: TYPE_REFERENCE and IMPORT_TYPE. ARRAY, UNION, TUPLE and PARENTHESIZED are structure whose CHILDREN are the named references; PRIMITIVE, LITERAL, TYPE_VARIABLE, MAPPED, CONDITIONAL, INDEXED_ACCESS and INTRINSIC name nothing declared.
- java — EVERY DEPTH is here, unlike the receiver-typing relations the engine uses internally, which filter to depth 0. A field of type
Map<String, Widget>produces three rows. Filter ondepth = 0when you want the type an expression has rather than every type its declaration mentions. - java — A TYPE_VARIABLE reference (
T,E) is not a row: it names the declaration's own parameter, not a type. Where the parameter has a written bound the USE resolves to that bound and IS a row, so<T extends Node> void f(T t)records a use of Node. - java — The reference rows carry no line in the Java IR (every all-type-references row has an empty startLine), so this table has no position columns. Use owner_method_id, or owner_type_id plus the types row, to locate a use.
- csharp — EMPTY — the C# front end does not export type uses yet.
WHAT THE PARSER DID NOT READ — one row per source file it declined, with the reason. Every other table describes code that WAS read, so without this one a file the parser skipped is indistinguishable from a file with nothing in it: its declarations are absent, and every call that targets them reads as an engine miss rather than as a target that was never indexed. Join file_path against the other tables' file_path to separate the two. Empty is the normal case and means the parser read everything it was given.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | file_path |
TEXT | yes | The file that was not read, as the parser recorded it — the same spelling the other tables' file_path uses, so the two join. For a DIRECTORY_EXCLUDED row it is a DIRECTORY, not a file (see notes). | ||
| 1 | reason |
TEXT | yes | Why it was declined — see vocabulary. The sets differ per language because the front ends decline for different things. | ||
| 2 | construct |
TEXT | yes | The syntactic form that caused the rejection (except_clause_comma_target), where the front end names one. Python only; NULL everywhere else. |
||
| 3 | start_line |
INTEGER | yes | 1-based line the offending construct is written at; NULL where the reason is a property of the whole file rather than of one place in it. | ||
| 4 | start_column |
INTEGER | yes | Column, as the parser counts it; NULL with start_line. | ||
| 5 | detail |
TEXT | yes | Free text from the front end: the error message for a READ_ERROR or EXTRACTION_ERROR, the count of files behind a DIRECTORY_EXCLUDED row. Not a vocabulary — do not match on it. |
skipped.reason values
| value | languages | meaning |
|---|---|---|
READ_ERROR |
java, typescript, python, javascript | The file could not be read — an I/O or encoding failure. The ENVIRONMENT failed, which is nobody's bug; contrast EXTRACTION_ERROR. |
EMPTY_CONTENT |
java | The file is empty or is only whitespace. Nothing was lost. |
FILE_TOO_LARGE |
java | The file is longer than the parser's line threshold and was declined whole. Everything it declares is missing from every other table. |
EXTRACTION_ERROR |
typescript, python, javascript | The file read and parsed, and the extractor then threw. The PARSER failed, which is always a bug — detail carries the message. |
PY2_CONSTRUCT_DETECTED |
python | Python 2 source, rejected whole rather than misread under Python 3 scoping (tree-sitter parses print "x" without erroring). construct, start_line and start_column name the form that gave it away. |
NO_PROGRAM_CLAIMS_FILE |
typescript | A file under a root that declares programs (a tsconfig) which no program claims and no claimed file imports. It is out of every program, not unparseable. |
DIRECTORY_EXCLUDED |
javascript | A directory the walker pruned by name (node_modules, dist, …). ONE row per DIRECTORY, with the file count in detail — the files were never enumerated, and naming them individually would invent paths. |
Notes
- all — THE ONLY TABLE ABOUT CODE THAT IS NOT IN THE GRAPH. Read it before reading any absence as an engine result: a call into a skipped file is unresolved because the target was never indexed, not because the rules could not resolve it. Rows describe the CLIENT only — a library file the parser skipped is not reported here.
- csharp — EMPTY — the C# front end writes no skipped-files report. It takes the opposite line: a construct its grammar does not cover fails the run rather than skipping the file, so there is no per-file decision to record. An empty table here is not evidence that every file was read.
- javascript — A DIRECTORY_EXCLUDED row's file_path is a PRUNED DIRECTORY, not a file, and
detailcarries how many files are behind it; those files have no rows of their own. SoSELECT count(*) FROM skippedis not the number of files missing, and a join on file_path will not match them. Filter the reason out when you want per-file rows. - python — The only front end that positions a skip: a PY2_CONSTRUCT_DETECTED row carries the construct and its line and column, so the file can be triaged without re-running the parser.
Types this run creates an instance of — the rapid-type-analysis set that bounds virtual dispatch. (A subtype nothing instantiates cannot receive a dispatched call.) Deliberately an over-approximation: narrowing it on evidence the run does not have would lose real edges. Populated in every language.
| # | column | type | key | null | idx | meaning |
|---|---|---|---|---|---|---|
| 0 | type_id |
TEXT | yes | yes | FK → types.id. | |
| 1 | how |
TEXT | yes | What creates the instance — see vocabulary. |
type_instantiated.how values
| value | languages | meaning |
|---|---|---|
new |
all | A constructor call — new C() / C(). |
anonymous |
java | An anonymous class exists only by being instantiated. |
enum_constant |
java | An enum's constants are its instances. |
service_loader |
java | A provider listed in META-INF/services: ServiceLoader constructs it reflectively, with no new in the source. |
auto_configuration |
java | A configuration class named in META-INF/spring/*.imports or spring.factories (EnableAutoConfiguration): Spring Boot constructs it reflectively. |
spring_factories |
java | A class named under another key of META-INF/spring.factories: SpringFactoriesLoader constructs it reflectively. |
Notes
- typescript — Every row has how =
new. Not restricted to client provenance: a type the library constructs is still a type that exists at run time, and dropping it would narrow the envelope unsoundly. - python — Every row has how =
new: the rule set records that some client call constructs the class, not which form. - csharp — EMPTY — the C# engine derives the instantiation set but does not export it. Dispatch in C# is not narrowed by it either (see the README of the C# engine).
Every relation in the language's graph/<lang>/souffle/export_manifest.tsv, loaded as ext_<relation> with positional columns c0…cN (the raw relation is declared positionally; nothing here invents a name). schema_tables lists each one with its arity and the comment lifted from the rule that derives it — read that before querying. They are language-specific by construction: a bundle holds only the ext tables of its own language.
Every table in this bundle with its scope and what it holds.
| # | column | type | meaning |
|---|---|---|---|
| 0 | name |
TEXT | Table name. |
| 1 | scope |
TEXT | core — same schema in every language; ext — a language-specific relation, columns c0…cN; catalog — this documentation. |
| 2 | language |
TEXT | For ext: the front end that defines it. NULL for core and catalog. |
| 3 | description |
TEXT | What a row means. For ext this is the comment lifted from the rule that derives the relation, verbatim. |
Every column of every core and catalog table. (ext tables are positional: c0…cN, arity in schema_tables.description.)
| # | column | type | meaning |
|---|---|---|---|
| 0 | table_name |
TEXT | FK → schema_tables.name. |
| 1 | ordinal |
INTEGER | 0-based position. |
| 2 | name |
TEXT | Column name. |
| 3 | type |
TEXT | TEXT or INTEGER. |
| 4 | nullable |
INTEGER | 1 if the column may be NULL (empty in CSV). |
| 5 | description |
TEXT | Meaning. |
Every enumerated value a core column may hold, and WHICH LANGUAGES emit it. Filter on the language in run to see the values that can occur in this bundle. A value observed in this run but not in the authored list is inserted with meaning undocumented — observed in this run, so the table is complete for the data it sits next to.
| # | column | type | meaning |
|---|---|---|---|
| 0 | table_name |
TEXT | Core table. |
| 1 | column_name |
TEXT | Column. |
| 2 | language |
TEXT | java, typescript, javascript, python, csharp — the front end that emits this value (one row per language; a value shared by all has one row for each). |
| 3 | value |
TEXT | The value as it appears in the column. A trailing * marks a prefix (e.g. DECORATOR_*). |
| 4 | meaning |
TEXT | What it means. |
READ THIS FIRST. An ordered walkthrough of how to use this database: which tables answer which questions, what to check before trusting an answer, and where the language-specific details are.
| # | column | type | meaning |
|---|---|---|---|
| 0 | step |
INTEGER | Reading order. |
| 1 | text |
TEXT | The instruction. |
Canonical questions and the SQL that answers each, parameterised with named :params. Every query is verified to run against every language's bundle. Copy, bind, run.
| # | column | type | meaning |
|---|---|---|---|
| 0 | name |
TEXT | Short identifier. |
| 1 | question |
TEXT | The question in words. |
| 2 | params |
TEXT | Comma-separated named parameters the SQL expects, e.g. :qualified_name, :depth. |
| 3 | sql |
TEXT | The SQL. |
Per-language caveats that are not a vocabulary: what a table lacks in one front end, where an id may point, what a NULL means here.
| # | column | type | meaning |
|---|---|---|---|
| 0 | language |
TEXT | java, typescript, javascript, python, csharp, or all. |
| 1 | table_name |
TEXT | The table the note is about. |
| 2 | note |
TEXT | The caveat. |