From 14d89015a53645c7b6733e94a7f9f54c148023d0 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 9 Sep 2026 10:13:48 -0400 Subject: [PATCH 1/3] Update schema Signed-off-by: Rahul Krishna --- README.md | 69 +- scripts/check.py | 21 +- v2/java/.gitkeep | 0 v2/json/analysis.schema.json | 1055 +++++++ v2/json/java/analysis.enum-record.sample.json | 1424 +++++++++ v2/json/java/analysis.l4.sample.json | 2627 +++++++++++++++++ v2/json/java/analysis.schema.json | 704 +++++ v2/json/python/analysis.dataflow.sample.json | 1 + .../python/analysis.entrypoints.sample.json | 1 + v2/json/python/analysis.l4.sample.json | 1 + v2/json/python/analysis.schema.json | 708 +++++ v2/json/typescript/analysis.l4.sample.json | 1 + v2/json/typescript/analysis.schema.json | 901 ++++++ v2/neo4j/contract.schema.json | 484 +++ v2/neo4j/java/schema.neo4j.json | 552 ++++ v2/neo4j/python/schema.neo4j.json | 514 ++++ v2/neo4j/typescript/schema.neo4j.json | 621 ++++ v2/python/.gitkeep | 0 v2/typescript/.gitkeep | 0 19 files changed, 9682 insertions(+), 2 deletions(-) delete mode 100644 v2/java/.gitkeep create mode 100644 v2/json/analysis.schema.json create mode 100644 v2/json/java/analysis.enum-record.sample.json create mode 100644 v2/json/java/analysis.l4.sample.json create mode 100644 v2/json/java/analysis.schema.json create mode 100644 v2/json/python/analysis.dataflow.sample.json create mode 100644 v2/json/python/analysis.entrypoints.sample.json create mode 100644 v2/json/python/analysis.l4.sample.json create mode 100644 v2/json/python/analysis.schema.json create mode 100644 v2/json/typescript/analysis.l4.sample.json create mode 100644 v2/json/typescript/analysis.schema.json create mode 100644 v2/neo4j/contract.schema.json create mode 100644 v2/neo4j/java/schema.neo4j.json create mode 100644 v2/neo4j/python/schema.neo4j.json create mode 100644 v2/neo4j/typescript/schema.neo4j.json delete mode 100644 v2/python/.gitkeep delete mode 100644 v2/typescript/.gitkeep diff --git a/README.md b/README.md index 5121a5f..9c8136c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,69 @@ # codeanalyzer-schema -Versioned schema + +Versioned schemas for what a codeanalyzer emits: the `analysis.json` payload and +the Neo4j graph contract, one directory per schema line. + +``` +v1/ the pre-canonical line: each analyzer's own v1 shape, descriptive +v2/ the canonical line: one shared spine + per-language schemas, prescriptive +``` + +## v2 layout + +``` +v2/json/analysis.schema.json the canonical spine (permissive, open nodes) +v2/json//analysis.schema.json the language's schema: $ref the spine, add its own + fields, close with unevaluatedProperties: false +v2/json//*.sample.json real analyzer output the schema is checked against +v2/neo4j/contract.schema.json meta-schema for the graph contract +v2/neo4j//schema.neo4j.json byte-identical copy of the analyzer's contract +``` + +The split is the point. The spine states the invariant shape — the containment +tree `application -> module -> type -> callable -> body`, the edge families, the +`can://` identity — and leaves every node **open**, so a language may add fields. +Each language schema then **closes** its nodes: a field an analyzer starts +emitting that nobody recorded fails validation there. Where the three analyzers +genuinely disagree, the spine states the intersection and the disagreement is +recorded verbatim under `x-cldk.divergences` rather than papered over. + +Sources for the current v2 files: codeanalyzer-java v3.1.2, codeanalyzer-python +v1.5.1, codeanalyzer-typescript v1.5.3 — all three on analysis schema and graph +contract `2.0.0`. + +## Checking + +``` +python3 scripts/check.py # every schema, every sample +python3 scripts/check.py v2/json # one subtree +``` + +Each schema is checked as a valid JSON Schema, then used to validate the +`*.sample.json` files beside it plus anything its `x-cldk.validates` globs match. +Cross-file `$ref`s resolve against the files in this repo by `$id` — nothing is +fetched over the network. + +## Refreshing the v2 samples + +The samples are unedited analyzer output on the analyzers' own test fixtures. +Each language keeps an `-a 4` sample for the full level ladder, plus whatever +extra runs are needed to reach parts of the tree the first one never populates: + +| Sample | Analyzer / fixture | Level | Covers | +| --- | --- | --- | --- | +| `java/analysis.l4.sample.json` | java, `test-applications/dataflow-test` | 4 | body, cfg/cdg/ddg, param edges | +| `java/analysis.enum-record.sample.json` | java, `test-applications/enum-record-bodies-test` | 2 | `enum_constants`, `record_components` | +| `python/analysis.l4.sample.json` | python, `whole_applications/manifests_app` | 4 | artifacts, config keys, dependencies | +| `python/analysis.dataflow.sample.json` | python, `single_functionalities/dataflow` | 4 | classes, attributes, `raise`/`handler` body nodes | +| `python/analysis.entrypoints.sample.json` | python, `single_functionalities/entrypoints_local` | 2 | `entrypoints`, `external_symbols` | +| `typescript/analysis.l4.sample.json` | typescript, `test/fixtures/sample-app` | 4 | interfaces, enums, namespaces, decorators, dataflow | + +``` +java -jar build/libs/codeanalyzer-.jar -i -o -a 4 # java +canpy -i -o -a 4 # python +bun run src/main.ts -i -o -a 4 # typescript +``` + +Copy the resulting `analysis.json` over the sample it replaces and re-run the +check. A new failure means the analyzer moved and the schema has +not — fix the schema, or the analyzer, on purpose. diff --git a/scripts/check.py b/scripts/check.py index 3f55354..8aaff83 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -13,10 +13,29 @@ from pathlib import Path from jsonschema import Draft202012Validator +from referencing import Registry, Resource ROOT = Path(__file__).resolve().parent.parent +def registry() -> Registry: + """Resolve cross-file $refs against the schemas in this repo, by their $id. + + The v2 per-language schemas $ref the canonical spine by its published URL, + which is not fetchable offline (and must not be fetched: the file on disk is + the thing under test). + """ + resources = [] + for path in ROOT.rglob("*.schema.json"): + schema = json.loads(path.read_text()) + if "$id" in schema: + resources.append((schema["$id"], Resource.from_contents(schema))) + return Registry().with_resources(resources) + + +REGISTRY = registry() + + def check(schema_path: Path) -> int: schema = json.loads(schema_path.read_text()) Draft202012Validator.check_schema(schema) @@ -28,7 +47,7 @@ def check(schema_path: Path) -> int: covered += schema_path.parent.glob(pattern) failures = 0 - validator = Draft202012Validator(schema) + validator = Draft202012Validator(schema, registry=REGISTRY) for sample in sorted(set(covered)): errors = sorted(validator.iter_errors(json.loads(sample.read_text())), key=lambda e: list(e.absolute_path)) diff --git a/v2/java/.gitkeep b/v2/java/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/v2/json/analysis.schema.json b/v2/json/analysis.schema.json new file mode 100644 index 0000000..35cce54 --- /dev/null +++ b/v2/json/analysis.schema.json @@ -0,0 +1,1055 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json", + "title": "codeanalyzer canonical v2 analysis output", + "description": "The canonical CLDK analysis schema (v2): the invariant spine every codeanalyzer emits and every SDK consumes. One additive containment tree (application -> module -> type -> callable -> body) with typed edge overlays (call_graph, cfg, cdg, ddg, summary, param_in, param_out). This document is PERMISSIVE by construction: it states what must be present and what a shared field means, and leaves every node open so a language may add its own fields. The per-language schemas under v2/json// $ref these definitions and close them with `unevaluatedProperties: false`, so a field an analyzer emits but nobody recorded fails validation there rather than here. Levels: L1 tree + call sites, L2 callee refinement + call_graph, L3 full body + cfg/cdg/ddg, L4 synthetic param vertices + param_in/param_out/summary. Absence means 'no fact'; the only sanctioned null is a call node's `callee` before L2.", + "x-cldk": { + "schemaVersion": "2.0.0", + "kind": "canonical-spine", + "sources": [ + { + "repo": "codellm-devkit/codeanalyzer-java", + "release": "v3.0.1", + "definedIn": "src/main/java/com/ibm/cldk/schema/" + }, + { + "repo": "codellm-devkit/codeanalyzer-python", + "release": "v1.4.0", + "definedIn": "codeanalyzer/schema/py_schema.py" + }, + { + "repo": "codellm-devkit/codeanalyzer-typescript", + "release": "v1.2.0", + "definedIn": "src/schema/schema.ts" + } + ], + "consumers": [ + { + "repo": "codellm-devkit/python-sdk", + "release": "v1.x" + } + ], + "note": "Derived from the three analyzer model sources named above and cross-checked against real output of each analyzer at its released version (the *.sample.json files beside the per-language schemas). Where the three disagree, the canonical schema states the intersection and the disagreement is recorded under x-cldk.divergences rather than papered over.", + "divergences": [ + "import: java names the imported path `path`; python and typescript name it `module`.", + "decorator arguments: java emits `args` (flat list); python and typescript emit `positional_arguments` + `keyword_arguments`.", + "leaf positions: java gives comments/imports/parameters/decorators a `span`; python and typescript give them flat start_line/start_column/end_line/end_column.", + "span offsets: java and python `span.bytes` are UTF-8 byte offsets; typescript `span.bytes` are UTF-16 char offsets into module.source.", + "span columns: java and typescript columns are 1-based; python columns are 0-based (ast semantics), lines are 1-based everywhere.", + "module node: python has no `span` and adds `file_path`/`module_name`; java and typescript carry `span` and key identity off the symbol_table key.", + "module cache metadata: python emits `last_modified` and `file_size` on the wire; typescript strips them (keeping `content_hash`); java emits `content_hash` only.", + "external_symbols values: python and typescript emit {id, kind, module, name}; java emits {kind, signature, declaring_type} and leaves the id to the map key.", + "unresolved config reads: python calls the list `config_reads_unresolved`; typescript calls it `config_reads`; java emits neither (it emits config keys under artifacts only).", + "ddg L3 provenance token: java tags syntactic edges `ssa`, typescript tags them `reaching-defs`, python emits both tokens.", + "callee refinement slot: typescript writes `callee: null` on an unresolved call node; java and python omit the key.", + "envelope k_limit: python and typescript emit it at L3+; java has no such field.", + "python-only application sections: `repository`, `entrypoint_report`, `unresolved_imports` are emitted by python (typescript emits `unresolved_imports` too, java neither)." + ] + }, + "type": "object", + "required": [ + "schema_version", + "language", + "max_level", + "analyzer", + "application" + ], + "properties": { + "schema_version": { + "description": "Version of this canonical schema line. All three analyzers ship 2.0.0.", + "type": "string", + "pattern": "^2\\.\\d+\\.\\d+$" + }, + "language": { + "description": "The analyzed language; also the `` segment of every can:// id.", + "type": "string" + }, + "max_level": { + "description": "Highest analysis level populated. Consumers read this rather than sniffing for keys.", + "type": "integer", + "minimum": 1, + "maximum": 4 + }, + "k_limit": { + "description": "Access-path depth bound of the L3/L4 dataflow. Present at L3+ on the analyzers that bound it.", + "type": "integer", + "minimum": 1 + }, + "analyzer": { + "$ref": "#/$defs/AnalyzerInfo" + }, + "application": { + "$ref": "#/$defs/Application" + } + }, + "$defs": { + "AnalyzerInfo": { + "description": "Which analyzer produced this payload, and how it was configured.", + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "config": { + "description": "Analyzer options in effect. Open map; not every analyzer emits it.", + "type": "object" + } + } + }, + "Span": { + "description": "Where a node lives in source. `start`/`end` are [line, column]; `bytes` are [from, to) offsets into the owning module's `source`, so source[bytes[0]:bytes[1]] reproduces the node's text.", + "type": "object", + "required": [ + "start", + "end", + "bytes" + ], + "properties": { + "start": { + "$ref": "#/$defs/Position" + }, + "end": { + "$ref": "#/$defs/Position" + }, + "bytes": { + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 2, + "maxItems": 2 + } + } + }, + "Position": { + "description": "[line, column]. Lines are 1-based everywhere; column base is language-specific (see x-cldk.divergences).", + "type": "array", + "items": { + "type": "integer" + }, + "minItems": 2, + "maxItems": 2 + }, + "Application": { + "description": "The root node: the containment tree plus the application-scope edge overlays. Every id in every edge list must resolve to a node reachable from here (no dangling endpoints).", + "type": "object", + "required": [ + "id", + "kind", + "symbol_table" + ], + "properties": { + "id": { + "description": "can:///", + "type": "string" + }, + "kind": { + "const": "application" + }, + "symbol_table": { + "description": "Per-file analysis, keyed by repo-relative POSIX path (no absolute paths, no '..').", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Module" + } + }, + "call_graph": { + "description": "L2. Callable -> callable edges, endpoints are can:// ids.", + "type": "array", + "items": { + "$ref": "#/$defs/CallEdge" + } + }, + "external_symbols": { + "description": "L2. Id homes for call-graph endpoints outside the project, keyed by their @external id.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/ExternalSymbol" + } + }, + "param_in": { + "description": "L4. actual_in -> formal_in, endpoints are global ordinal ids.", + "type": "array", + "items": { + "$ref": "#/$defs/ParamEdge" + } + }, + "param_out": { + "description": "L4. formal_out -> actual_out, endpoints are global ordinal ids.", + "type": "array", + "items": { + "$ref": "#/$defs/ParamEdge" + } + }, + "artifacts": { + "description": "The repository-artifact layer: recognized non-code files, keyed by repo-relative path. Level-free (identical at every -a level).", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Artifact" + } + }, + "dependencies": { + "description": "Declared third-party dependencies, evidence-tagged via `prov`. Level-free.", + "type": "array", + "items": { + "$ref": "#/$defs/Dependency" + } + }, + "unresolved_imports": { + "description": "Imports no declared dependency accounts for (the dependency-hygiene signal).", + "type": "array", + "items": { + "$ref": "#/$defs/ImportBinding" + } + }, + "config_uses": { + "description": "Resolved config reads: a recognized read joined to the ConfigKey it names.", + "type": "array", + "items": { + "$ref": "#/$defs/ConfigUseEdge" + } + }, + "entrypoint_report": { + "$ref": "#/$defs/EntrypointReport" + } + } + }, + "Module": { + "description": "One source file / compilation unit. Holds the file's text once; every node's text is a slice of it.", + "type": "object", + "required": [ + "id", + "kind", + "source", + "types" + ], + "properties": { + "id": { + "type": "string" + }, + "kind": { + "const": "module" + }, + "span": { + "$ref": "#/$defs/Span" + }, + "source": { + "description": "The whole file's text, stored once.", + "type": "string" + }, + "content_hash": { + "description": "Hash of `source`, for incremental caching and per-module diffing in the Neo4j push. Not identity.", + "type": "string" + }, + "imports": { + "type": "array", + "items": { + "$ref": "#/$defs/Import" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/Comment" + } + }, + "types": { + "description": "Top-level types declared in this file, keyed by name.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Type" + } + }, + "functions": { + "description": "Module-level callables, keyed by signature. Absent or empty for class-only languages.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Callable" + } + }, + "fields": { + "description": "Module-level bindings, keyed by name.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Field" + } + } + } + }, + "Type": { + "description": "A type node. `kind` is the specific type kind (class | struct | interface | enum | record | trait | type_alias | namespace | ...), never a pile of is_* booleans.", + "type": "object", + "required": [ + "id", + "kind", + "span" + ], + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "span": { + "$ref": "#/$defs/Span" + }, + "name": { + "type": "string" + }, + "signature": { + "type": "string" + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/Comment" + } + }, + "modifiers": { + "type": "array", + "items": { + "type": "string" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/Decorator" + } + }, + "callables": { + "description": "Methods and constructors, keyed by signature.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Callable" + } + }, + "fields": { + "description": "Declared fields / attributes / enum members, keyed by name.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Field" + } + }, + "types": { + "description": "Member / inner types, keyed by name. Nesting is encoded by this containment position.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Type" + } + } + } + }, + "Callable": { + "description": "A function, method, constructor, accessor or lambda. `span.bytes` slices the whole declaration out of module.source; it is present for every callable the source declares and absent only on a compiler-synthesized member (e.g. java's implicit default constructor, discovered at L2).", + "type": "object", + "required": [ + "id", + "kind", + "signature", + "body" + ], + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "signature": { + "description": "Human-readable signature; the last path segment of `id`, from the one signatureOf().", + "type": "string" + }, + "span": { + "$ref": "#/$defs/Span" + }, + "name": { + "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/Parameter" + } + }, + "return_type": { + "type": "string" + }, + "modifiers": { + "type": "array", + "items": { + "type": "string" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/Decorator" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/Comment" + } + }, + "body": { + "description": "L1 holds the call nodes; L3 completes it with the rest of the statements. Keyed by local ordinal id (`line:col`, or `@tag` for a synthetic vertex).", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/BodyNode" + } + }, + "callables": { + "description": "Nested callables (closures / local functions), keyed by signature.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Callable" + } + }, + "types": { + "description": "Local (body-declared) types, keyed by name.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/Type" + } + }, + "cfg": { + "description": "L3. Control-flow edges over this callable's body nodes.", + "type": "array", + "items": { + "$ref": "#/$defs/CfgEdge" + } + }, + "cdg": { + "description": "L3. Control-dependence edges.", + "type": "array", + "items": { + "$ref": "#/$defs/IdEdge" + } + }, + "ddg": { + "description": "L3 (syntactic) widened at L4 (alias-aware). Data-dependence edges.", + "type": "array", + "items": { + "$ref": "#/$defs/DdgEdge" + } + }, + "summary": { + "description": "L4. actual_in -> actual_out transitive intra-caller shortcuts.", + "type": "array", + "items": { + "$ref": "#/$defs/IdEdge" + } + } + } + }, + "BodyNode": { + "description": "A node inside a callable's `body`: an AST region (statement | call | return | branch | loop | switch) or a synthetic analysis vertex (entry | exit | formal_in | formal_out | actual_in | actual_out). The map key is its local id, so a body node carries no `id` of its own.", + "type": "object", + "required": [ + "kind" + ], + "properties": { + "id": { + "description": "The GLOBAL ordinal id of this body node: `@`, the same value the Neo4j projection merges its body-node label on. Optional on the spine only because an analyzer may not have adopted it yet; a language that emits it requires it (codeanalyzer-python#176).", + "type": "string" + }, + "kind": { + "type": "string" + }, + "span": { + "$ref": "#/$defs/Span" + }, + "callee": { + "description": "call nodes only: the callee's id. The one sanctioned refinement slot - absent (or null) at L1, an id from L2 on.", + "type": [ + "string", + "null" + ] + }, + "of": { + "description": "Synthetic param vertices: the value this vertex stands for (a parameter name, `argN`, `$ret`).", + "type": "string" + }, + "parent": { + "description": "actual_in / actual_out: the local id of the call site the vertex belongs to.", + "type": "string" + } + } + }, + "Field": { + "description": "A declared binding: a module-level variable, a class attribute / interface property, or an enum member.", + "type": "object", + "required": [ + "name" + ], + "properties": { + "id": { + "type": "string" + }, + "kind": { + "const": "field" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "span": { + "$ref": "#/$defs/Span" + }, + "initializer": { + "type": "string" + }, + "modifiers": { + "type": "array", + "items": { + "type": "string" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/Comment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/Decorator" + } + } + } + }, + "Parameter": { + "description": "One declared parameter, in declaration order.", + "type": "object", + "required": [ + "name" + ], + "properties": { + "id": { + "description": "`@formal_in:` for this parameter's position: the L4 formal_in vertex that carries it. A forward reference below level 4 - the vertex it names does not exist in `body` until `-a 4` (codeanalyzer-python#176).", + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "span": { + "$ref": "#/$defs/Span" + }, + "default_value": { + "type": "string" + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/Decorator" + } + } + } + }, + "Import": { + "description": "One import declaration. The imported path is `path` in java and `module` in python/typescript (see x-cldk.divergences).", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "module": { + "type": "string" + }, + "alias": { + "type": [ + "string", + "null" + ] + }, + "span": { + "$ref": "#/$defs/Span" + } + } + }, + "Comment": { + "description": "One comment or doc block.", + "type": "object", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "string" + }, + "span": { + "$ref": "#/$defs/Span" + } + } + }, + "Decorator": { + "description": "One decorator / annotation application, structured rather than a source string. Argument capture differs per language (see x-cldk.divergences).", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "qualified_name": { + "type": "string" + }, + "span": { + "$ref": "#/$defs/Span" + } + } + }, + "IdEdge": { + "description": "The bare edge shape: two node ids and nothing else. The list name IS the edge type, so there is no `type` field.", + "type": "object", + "required": [ + "src", + "dst" + ], + "properties": { + "src": { + "type": "string" + }, + "dst": { + "type": "string" + } + } + }, + "ParamEdge": { + "description": "A param_in (actual_in -> formal_in) or param_out (formal_out -> actual_out) edge at application scope. `var` is the callee-side formal the edge binds: the parameter name, `$ret` for the return port, or a global's access path on a global read/write. Set on every such edge - a property present on some edges and not others is a three-valued trap for any predicate on it (codeanalyzer-python#195).", + "type": "object", + "required": [ + "src", + "dst", + "var" + ], + "properties": { + "src": { + "type": "string" + }, + "dst": { + "type": "string" + }, + "var": { + "type": "string" + } + } + }, + "CallEdge": { + "description": "L2. One call-graph edge, callable -> callable, identity-only.", + "type": "object", + "required": [ + "src", + "dst" + ], + "properties": { + "src": { + "type": "string" + }, + "dst": { + "type": "string" + }, + "prov": { + "description": "Open-vocabulary provenance of the edge (e.g. `tsc`, `jedi`, `wala`, `defuse`, `import`).", + "type": "array", + "items": { + "type": "string" + } + }, + "weight": { + "description": "Number of call sites merged into this edge.", + "type": "integer" + } + } + }, + "CfgEdge": { + "description": "L3. One control-flow edge between body nodes of the same callable.", + "type": "object", + "required": [ + "src", + "dst", + "kind" + ], + "properties": { + "src": { + "type": "string" + }, + "dst": { + "type": "string" + }, + "kind": { + "description": "fallthrough | true | false | switch_case | loop_back | exception | return | break | continue, plus language additions.", + "type": "string" + } + } + }, + "DdgEdge": { + "description": "L3 (syntactic) / L4 (alias-aware). One data-dependence edge between body nodes of the same callable.", + "type": "object", + "required": [ + "src", + "dst" + ], + "properties": { + "src": { + "type": "string" + }, + "dst": { + "type": "string" + }, + "var": { + "description": "The k-limited access path the dependence carries.", + "type": "string" + }, + "prov": { + "description": "`ssa` / `reaching-defs` = syntactic (L3); `points-to` = semantic (L4).", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "ExternalSymbol": { + "description": "An id home for a call target outside the analyzed project - an edge endpoint, not a tree node. Keyed by its @external id.", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "module": { + "type": "string" + } + } + }, + "Artifact": { + "description": "A recognized non-code file (config, manifest, CI, container spec, data). Ids are language-neutral (can://artifact//) so sibling-language analyzers land on the same node.", + "type": "object", + "required": [ + "id", + "kind", + "path", + "format" + ], + "properties": { + "id": { + "type": "string" + }, + "kind": { + "const": "artifact" + }, + "path": { + "description": "Repo-relative POSIX path; also the map key.", + "type": "string" + }, + "format": { + "type": "string" + }, + "roles": { + "description": "Open vocabulary: dependency-manifest | tool-config | container-image | service-topology | iac | ci | env | packaging | legal | docs | script | unknown.", + "type": "array", + "items": { + "type": "string" + } + }, + "size_bytes": { + "type": "integer" + }, + "sha256": { + "type": "string" + }, + "source": { + "description": "The whole file's text when captured, else \"\" - never a prefix.", + "type": "string" + }, + "extraction": { + "enum": [ + "none", + "partial", + "full" + ] + }, + "config_keys": { + "type": "array", + "items": { + "$ref": "#/$defs/ConfigKey" + } + } + } + }, + "ConfigKey": { + "description": "One configuration key flattened out of a config-bearing artifact. Contained by its artifact; containment mirrors the DEFINES_CONFIG relationship in the graph projection.", + "type": "object", + "required": [ + "id", + "key", + "namespace" + ], + "properties": { + "id": { + "description": "@key/", + "type": "string" + }, + "key": { + "description": "Dotted path; numeric segments for arrays (services.web.ports.0).", + "type": "string" + }, + "namespace": { + "type": "string" + }, + "value": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + }, + "span": { + "$ref": "#/$defs/Span" + }, + "references": { + "description": "Recognized ${VAR}/$VAR tokens, deduplicated, in order of appearance.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Dependency": { + "description": "One declared third-party dependency (or a lockfile-only transitive pin).", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "ecosystem": { + "type": "string" + }, + "spec": { + "type": "string" + }, + "kind": { + "description": "runtime | dev | optional | build, plus language additions (npm `peer`).", + "type": "string" + }, + "extras": { + "type": "array", + "items": { + "type": "string" + } + }, + "declared_in": { + "description": "Id of the Artifact that declares it.", + "type": "string" + }, + "direct": { + "description": "false = lockfile-only transitive pin.", + "type": "boolean" + }, + "locked_version": { + "type": "string" + }, + "provides_imports": { + "type": "array", + "items": { + "type": "string" + } + }, + "prov": { + "description": "declared | lockfile | installed-metadata | heuristic.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "ImportBinding": { + "description": "A top-level import no declared dependency accounts for.", + "type": "object", + "required": [ + "module" + ], + "properties": { + "module": { + "type": "string" + }, + "bound_to": { + "type": "string" + }, + "prov": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "ConfigUseEdge": { + "description": "One resolved config read: a recognized read whose key closed on exactly one literal matching a declared ConfigKey. `src` is the read's global ordinal id, `dst` the ConfigKey id.", + "type": "object", + "required": [ + "src", + "dst" + ], + "properties": { + "src": { + "type": "string" + }, + "dst": { + "type": "string" + }, + "prov": { + "description": "literal (L2) | dataflow (L3/L4).", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "ConfigRead": { + "description": "A recognized config read that resolved to no declared key - first-class, so an untraceable read is as visible as a traced one. This list shrinks as levels rise; it is the one deliberately non-monotonic section.", + "type": "object", + "required": [ + "site", + "reason" + ], + "properties": { + "site": { + "description": "Global ordinal id of the read.", + "type": "string" + }, + "callee": { + "type": "string" + }, + "key": { + "type": "string" + }, + "reason": { + "enum": [ + "non-literal", + "undefined-key" + ] + }, + "prov": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "EntrypointReport": { + "description": "Coverage and failure record for the entrypoint pass. The pass under-approximates by design, so silence is its failure mode: this is what distinguishes 'this application has no entrypoints' from 'the pass found nothing'. Always present once an analyzer runs the pass.", + "type": "object", + "properties": { + "frameworks_detected": { + "description": "Frameworks the detector recognized in this application.", + "type": "array", + "items": { + "type": "string" + } + }, + "rulesets": { + "description": "Rule sources consulted: `shipped`, or `user:`.", + "type": "array", + "items": { + "type": "string" + } + }, + "unresolved": { + "description": "Written spelling -> count, for decorators and base classes the pass could not name.", + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "errors": { + "description": "Failures during the pass. The pass is additive: a failure loses flags, never the analysis.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Entrypoint": { + "description": "One way a callable or type is invoked from outside the application - a route, a CLI command, a scheduled task. A node may carry several. `confidence` lets a consumer threshold on evidence quality: `declared` (a manifest says so), `certain` (a framework rule matched a resolved name), `heuristic` (the written spelling reads like an entrypoint).", + "type": "object", + "required": [ + "framework" + ], + "properties": { + "framework": { + "type": "string" + }, + "confidence": { + "enum": [ + "declared", + "certain", + "heuristic" + ] + }, + "rule": { + "description": "A rules.yml `id:`, or an engine name.", + "type": "string" + }, + "ruleset": { + "description": "`shipped` or `user:`.", + "type": "string" + }, + "evidence": { + "type": "string" + }, + "route": { + "type": "string" + }, + "http_methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "via": { + "description": "can:// id of the routed node dispatching here.", + "type": "string" + } + } + } + } +} diff --git a/v2/json/java/analysis.enum-record.sample.json b/v2/json/java/analysis.enum-record.sample.json new file mode 100644 index 0000000..ece3125 --- /dev/null +++ b/v2/json/java/analysis.enum-record.sample.json @@ -0,0 +1,1424 @@ +{ + "schema_version": "2.0.0", + "language": "java", + "max_level": 2, + "analyzer": { + "name": "codeanalyzer-java", + "version": "3.1.2" + }, + "application": { + "id": "can://enum-record-bodies-test", + "kind": "application", + "symbol_table": { + "src/main/java/org/example/Money.java": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java", + "kind": "module", + "span": { + "start": [ + 1, + 1 + ], + "end": [ + 22, + 1 + ], + "bytes": [ + 0, + 568 + ] + }, + "package": "org.example", + "source": "package org.example;\n\nimport java.util.List;\n\n/**\n * A record whose canonical constructor is written in compact form. Its parameters come from the record\n * components, not from the (empty) compact parameter list, so its signature is what a {@code new\n * Money(...)} call site resolves to.\n */\npublic record Money(List tags, int cents) {\n\n public Money {\n if (cents < 0) {\n throw new IllegalArgumentException(\"negative\");\n }\n }\n\n public Money plus(Money other) {\n return new Money(tags, cents + other.cents());\n }\n}\n", + "comments": [], + "imports": [ + { + "name": "List", + "path": "java.util.List", + "span": { + "start": [ + 3, + 1 + ], + "end": [ + 3, + 22 + ], + "bytes": [ + 22, + 44 + ] + }, + "is_static": false, + "is_wildcard": false + } + ], + "types": { + "Money": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money", + "kind": "record", + "span": { + "start": [ + 10, + 1 + ], + "end": [ + 21, + 1 + ], + "bytes": [ + 294, + 567 + ] + }, + "comments": [ + { + "content": "\n * A record whose canonical constructor is written in compact form. Its parameters come from the record\n * components, not from the (empty) compact parameter list, so its signature is what a {@code new\n * Money(...)} call site resolves to.\n ", + "span": { + "start": [ + 5, + 1 + ], + "end": [ + 9, + 3 + ], + "bytes": [ + 46, + 293 + ] + }, + "is_javadoc": true + } + ], + "modifiers": [ + "public" + ], + "base_types": [], + "interfaces": [], + "decorators": [], + "type_parameters": [], + "is_entrypoint_class": false, + "entrypoint_frameworks": [], + "enum_constants": [], + "record_components": [ + { + "name": "tags", + "type": "java.util.List", + "span": { + "start": [ + 10, + 21 + ], + "end": [ + 10, + 37 + ], + "bytes": [ + 314, + 331 + ] + }, + "modifiers": [], + "decorators": [], + "comments": [], + "is_variadic": false + }, + { + "name": "cents", + "type": "int", + "span": { + "start": [ + 10, + 40 + ], + "end": [ + 10, + 48 + ], + "bytes": [ + 333, + 342 + ] + }, + "modifiers": [], + "decorators": [], + "comments": [], + "is_variadic": false + } + ], + "fields": {}, + "callables": { + "(java.util.List, int)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/(java.util.List, int)", + "kind": "constructor", + "signature": "(java.util.List, int)", + "span": { + "start": [ + 12, + 5 + ], + "end": [ + 16, + 5 + ], + "bytes": [ + 351, + 466 + ] + }, + "parameters": [], + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 12, + 18 + ], + "end": [ + 16, + 5 + ], + "bytes": [ + 364, + 466 + ] + }, + "declaration": "public Money()", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 2 + }, + "refs": { + "types": [ + "java.lang.IllegalArgumentException" + ], + "fields": [] + }, + "local_variables": [], + "body": { + "14:23": { + "kind": "call", + "span": { + "start": [ + 14, + 19 + ], + "end": [ + 14, + 58 + ], + "bytes": [ + 409, + 449 + ] + }, + "arguments": [ + "14:48" + ], + "receiver_type": "java.lang.IllegalArgumentException", + "argument_types": [ + "java.lang.String" + ], + "argument_expr": [ + "\"negative\"" + ], + "callee_signature": "(java.lang.String)", + "method_name": "", + "return_type": "java.lang.IllegalArgumentException", + "accessibility": "public", + "is_constructor_call": true + } + }, + "types": {} + }, + "cents()": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/cents()", + "kind": "method", + "signature": "cents()", + "parameters": [], + "return_type": "int", + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [], + "type_parameters": [], + "is_implicit": true, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "local_variables": [], + "body": {}, + "types": {} + }, + "plus(org.example.Money)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/plus(org.example.Money)", + "kind": "method", + "signature": "plus(org.example.Money)", + "span": { + "start": [ + 18, + 5 + ], + "end": [ + 20, + 5 + ], + "bytes": [ + 472, + 565 + ] + }, + "parameters": [ + { + "name": "other", + "type": "org.example.Money", + "span": { + "start": [ + 18, + 23 + ], + "end": [ + 18, + 33 + ], + "bytes": [ + 490, + 501 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "org.example.Money", + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 18, + 36 + ], + "end": [ + 20, + 5 + ], + "bytes": [ + 503, + 565 + ] + }, + "declaration": "public Money plus(Money other)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [ + "org.example.Money" + ], + "fields": [] + }, + "local_variables": [], + "body": { + "19:20": { + "kind": "call", + "span": { + "start": [ + 19, + 16 + ], + "end": [ + 19, + 53 + ], + "bytes": [ + 520, + 558 + ] + }, + "callee": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/(java.util.List, int)", + "arguments": [ + "19:26", + "19:32" + ], + "receiver_type": "org.example.Money", + "argument_types": [ + "java.util.List", + "int" + ], + "argument_expr": [ + "tags", + "cents + other.cents()" + ], + "callee_signature": "(java.util.List, int)", + "method_name": "", + "return_type": "org.example.Money", + "accessibility": "public", + "is_constructor_call": true + }, + "19:46": { + "kind": "call", + "span": { + "start": [ + 19, + 40 + ], + "end": [ + 19, + 52 + ], + "bytes": [ + 544, + 557 + ] + }, + "callee": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/cents()", + "arguments": [], + "receiver_expr": "other", + "receiver_type": "org.example.Money", + "argument_types": [], + "argument_expr": [], + "callee_signature": "cents()", + "method_name": "cents", + "return_type": "int", + "accessibility": "public", + "is_static_call": false, + "is_constructor_call": false + } + }, + "types": {} + }, + "tags()": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/tags()", + "kind": "method", + "signature": "tags()", + "parameters": [], + "return_type": "java.util.List", + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [], + "type_parameters": [], + "is_implicit": true, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "local_variables": [], + "body": {}, + "types": {} + } + }, + "types": {} + } + }, + "content_hash": "d2ccf46f7bc54c2dbca3a4dce5634d2ff1ec0b0a0513833c2af6c043c97fac94" + }, + "src/main/java/org/example/Op.java": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java", + "kind": "module", + "span": { + "start": [ + 1, + 1 + ], + "end": [ + 42, + 1 + ], + "bytes": [ + 0, + 873 + ] + }, + "package": "org.example", + "source": "package org.example;\n\n/**\n * An enum whose constants carry class bodies. Each such body is an anonymous subclass of the enum, so\n * its methods are real callables that a call graph must be able to reach.\n */\npublic enum Op {\n PLUS(\"+\") {\n @Override\n public int apply(int a, int b) {\n return record(a + b);\n }\n },\n MINUS(\"-\") {\n @Override\n public int apply(int a, int b) {\n return record(a - b);\n }\n },\n /** A constant with no body: it specialises nothing and gets no type of its own. */\n @Deprecated\n NOOP(\"\");\n\n private final String symbol;\n\n Op(String symbol) {\n this.symbol = symbol;\n }\n\n public String symbol() {\n return symbol;\n }\n\n public int apply(int a, int b) {\n return 0;\n }\n\n int record(int result) {\n return result;\n }\n}\n", + "comments": [], + "imports": [], + "types": { + "Op": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op", + "kind": "enum", + "span": { + "start": [ + 7, + 1 + ], + "end": [ + 41, + 1 + ], + "bytes": [ + 208, + 872 + ] + }, + "comments": [ + { + "content": "\n * An enum whose constants carry class bodies. Each such body is an anonymous subclass of the enum, so\n * its methods are real callables that a call graph must be able to reach.\n ", + "span": { + "start": [ + 3, + 1 + ], + "end": [ + 6, + 3 + ], + "bytes": [ + 22, + 207 + ] + }, + "is_javadoc": true + } + ], + "modifiers": [ + "public" + ], + "base_types": [], + "interfaces": [], + "decorators": [], + "type_parameters": [], + "is_entrypoint_class": false, + "entrypoint_frameworks": [], + "enum_constants": [ + { + "name": "PLUS", + "arguments": [ + "\"+\"" + ], + "span": { + "start": [ + 8, + 5 + ], + "end": [ + 13, + 5 + ], + "bytes": [ + 229, + 349 + ] + }, + "comments": [], + "decorators": [] + }, + { + "name": "MINUS", + "arguments": [ + "\"-\"" + ], + "span": { + "start": [ + 14, + 5 + ], + "end": [ + 19, + 5 + ], + "bytes": [ + 355, + 476 + ] + }, + "comments": [], + "decorators": [] + }, + { + "name": "NOOP", + "arguments": [ + "\"\"" + ], + "span": { + "start": [ + 21, + 5 + ], + "end": [ + 22, + 12 + ], + "bytes": [ + 570, + 594 + ] + }, + "comments": [ + { + "content": " A constant with no body: it specialises nothing and gets no type of its own. ", + "span": { + "start": [ + 20, + 5 + ], + "end": [ + 20, + 87 + ], + "bytes": [ + 482, + 565 + ] + }, + "is_javadoc": true + } + ], + "decorators": [ + { + "name": "Deprecated", + "args": [], + "span": { + "start": [ + 21, + 5 + ], + "end": [ + 21, + 15 + ], + "bytes": [ + 570, + 581 + ] + } + } + ] + } + ], + "record_components": [], + "fields": { + "symbol": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/symbol", + "kind": "field", + "name": "symbol", + "type": "java.lang.String", + "span": { + "start": [ + 24, + 5 + ], + "end": [ + 24, + 32 + ], + "bytes": [ + 601, + 629 + ] + }, + "modifiers": [ + "private", + "final" + ], + "comments": [], + "decorators": [] + } + }, + "callables": { + "(java.lang.String)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/(java.lang.String)", + "kind": "constructor", + "signature": "(java.lang.String)", + "span": { + "start": [ + 26, + 5 + ], + "end": [ + 28, + 5 + ], + "bytes": [ + 635, + 690 + ] + }, + "parameters": [ + { + "name": "symbol", + "type": "java.lang.String", + "span": { + "start": [ + 26, + 8 + ], + "end": [ + 26, + 20 + ], + "bytes": [ + 638, + 651 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 26, + 23 + ], + "end": [ + 28, + 5 + ], + "bytes": [ + 653, + 690 + ] + }, + "declaration": "Op(String symbol)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [ + "org.example.Op.symbol" + ] + }, + "local_variables": [], + "body": {}, + "types": {} + }, + "apply(int, int)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/apply(int, int)", + "kind": "method", + "signature": "apply(int, int)", + "span": { + "start": [ + 34, + 5 + ], + "end": [ + 36, + 5 + ], + "bytes": [ + 755, + 811 + ] + }, + "parameters": [ + { + "name": "a", + "type": "int", + "span": { + "start": [ + 34, + 22 + ], + "end": [ + 34, + 26 + ], + "bytes": [ + 772, + 777 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + }, + { + "name": "b", + "type": "int", + "span": { + "start": [ + 34, + 29 + ], + "end": [ + 34, + 33 + ], + "bytes": [ + 779, + 784 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 34, + 36 + ], + "end": [ + 36, + 5 + ], + "bytes": [ + 786, + 811 + ] + }, + "declaration": "public int apply(int a, int b)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": {}, + "types": {} + }, + "record(int)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/record(int)", + "kind": "method", + "signature": "record(int)", + "span": { + "start": [ + 38, + 5 + ], + "end": [ + 40, + 5 + ], + "bytes": [ + 817, + 870 + ] + }, + "parameters": [ + { + "name": "result", + "type": "int", + "span": { + "start": [ + 38, + 16 + ], + "end": [ + 38, + 25 + ], + "bytes": [ + 828, + 838 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 38, + 28 + ], + "end": [ + 40, + 5 + ], + "bytes": [ + 840, + 870 + ] + }, + "declaration": "int record(int result)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": {}, + "types": {} + }, + "symbol()": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/symbol()", + "kind": "method", + "signature": "symbol()", + "span": { + "start": [ + 30, + 5 + ], + "end": [ + 32, + 5 + ], + "bytes": [ + 696, + 749 + ] + }, + "parameters": [], + "return_type": "java.lang.String", + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 30, + 28 + ], + "end": [ + 32, + 5 + ], + "bytes": [ + 719, + 749 + ] + }, + "declaration": "public String symbol()", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [ + "org.example.Op.symbol" + ] + }, + "local_variables": [], + "body": {}, + "types": {} + }, + "valueOf(java.lang.String)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/valueOf(java.lang.String)", + "kind": "method", + "signature": "valueOf(java.lang.String)", + "parameters": [ + { + "name": "name", + "type": "java.lang.String", + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "org.example.Op", + "error_channel": [], + "modifiers": [ + "public", + "static" + ], + "decorators": [], + "type_parameters": [], + "is_implicit": true, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "local_variables": [], + "body": {}, + "types": {} + }, + "values()": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/values()", + "kind": "method", + "signature": "values()", + "parameters": [], + "return_type": "org.example.Op[]", + "error_channel": [], + "modifiers": [ + "public", + "static" + ], + "decorators": [], + "type_parameters": [], + "is_implicit": true, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "local_variables": [], + "body": {}, + "types": {} + } + }, + "types": { + "$enum$PLUS": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/$enum$PLUS", + "kind": "class", + "span": { + "start": [ + 8, + 5 + ], + "end": [ + 13, + 5 + ], + "bytes": [ + 229, + 349 + ] + }, + "comments": [], + "modifiers": [], + "base_types": [ + "org.example.Op" + ], + "interfaces": [], + "decorators": [], + "type_parameters": [], + "is_entrypoint_class": false, + "entrypoint_frameworks": [], + "enum_constants": [], + "record_components": [], + "fields": {}, + "callables": { + "apply(int, int)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/$enum$PLUS/apply(int, int)", + "kind": "method", + "signature": "apply(int, int)", + "span": { + "start": [ + 9, + 9 + ], + "end": [ + 12, + 9 + ], + "bytes": [ + 249, + 343 + ] + }, + "parameters": [ + { + "name": "a", + "type": "int", + "span": { + "start": [ + 10, + 26 + ], + "end": [ + 10, + 30 + ], + "bytes": [ + 284, + 289 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + }, + { + "name": "b", + "type": "int", + "span": { + "start": [ + 10, + 33 + ], + "end": [ + 10, + 37 + ], + "bytes": [ + 291, + 296 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [ + { + "name": "Override", + "args": [], + "span": { + "start": [ + 9, + 9 + ], + "end": [ + 9, + 17 + ], + "bytes": [ + 249, + 258 + ] + } + } + ], + "type_parameters": [], + "body_span": { + "start": [ + 10, + 40 + ], + "end": [ + 12, + 9 + ], + "bytes": [ + 298, + 343 + ] + }, + "declaration": "public int apply(int a, int b)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": { + "11:20": { + "kind": "call", + "span": { + "start": [ + 11, + 20 + ], + "end": [ + 11, + 32 + ], + "bytes": [ + 319, + 332 + ] + }, + "callee": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/record(int)", + "arguments": [ + "11:27" + ], + "argument_types": [ + "int" + ], + "argument_expr": [ + "a + b" + ], + "callee_signature": "record(int)", + "method_name": "record", + "return_type": "int", + "accessibility": "package_private", + "is_static_call": false, + "is_constructor_call": false + } + }, + "types": {} + } + }, + "types": {} + }, + "$enum$MINUS": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/$enum$MINUS", + "kind": "class", + "span": { + "start": [ + 14, + 5 + ], + "end": [ + 19, + 5 + ], + "bytes": [ + 355, + 476 + ] + }, + "comments": [], + "modifiers": [], + "base_types": [ + "org.example.Op" + ], + "interfaces": [], + "decorators": [], + "type_parameters": [], + "is_entrypoint_class": false, + "entrypoint_frameworks": [], + "enum_constants": [], + "record_components": [], + "fields": {}, + "callables": { + "apply(int, int)": { + "id": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/$enum$MINUS/apply(int, int)", + "kind": "method", + "signature": "apply(int, int)", + "span": { + "start": [ + 15, + 9 + ], + "end": [ + 18, + 9 + ], + "bytes": [ + 376, + 470 + ] + }, + "parameters": [ + { + "name": "a", + "type": "int", + "span": { + "start": [ + 16, + 26 + ], + "end": [ + 16, + 30 + ], + "bytes": [ + 411, + 416 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + }, + { + "name": "b", + "type": "int", + "span": { + "start": [ + 16, + 33 + ], + "end": [ + 16, + 37 + ], + "bytes": [ + 418, + 423 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [ + "public" + ], + "decorators": [ + { + "name": "Override", + "args": [], + "span": { + "start": [ + 15, + 9 + ], + "end": [ + 15, + 17 + ], + "bytes": [ + 376, + 385 + ] + } + } + ], + "type_parameters": [], + "body_span": { + "start": [ + 16, + 40 + ], + "end": [ + 18, + 9 + ], + "bytes": [ + 425, + 470 + ] + }, + "declaration": "public int apply(int a, int b)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": { + "17:20": { + "kind": "call", + "span": { + "start": [ + 17, + 20 + ], + "end": [ + 17, + 32 + ], + "bytes": [ + 446, + 459 + ] + }, + "callee": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/record(int)", + "arguments": [ + "17:27" + ], + "argument_types": [ + "int" + ], + "argument_expr": [ + "a - b" + ], + "callee_signature": "record(int)", + "method_name": "record", + "return_type": "int", + "accessibility": "package_private", + "is_static_call": false, + "is_constructor_call": false + } + }, + "types": {} + } + }, + "types": {} + } + } + } + }, + "content_hash": "08951da5283cc85272ae5604ccd5510847deb83b576fc029fa231c2ca439795c" + } + }, + "call_graph": [ + { + "src": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/plus(org.example.Money)", + "dst": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/(java.util.List, int)", + "prov": [ + "declared" + ], + "weight": 1 + }, + { + "src": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/plus(org.example.Money)", + "dst": "can://enum-record-bodies-test/java/src/main/java/org/example/Money.java/Money/cents()", + "prov": [ + "declared" + ], + "weight": 1 + }, + { + "src": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/$enum$MINUS/apply(int, int)", + "dst": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/record(int)", + "prov": [ + "declared" + ], + "weight": 1 + }, + { + "src": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/$enum$PLUS/apply(int, int)", + "dst": "can://enum-record-bodies-test/java/src/main/java/org/example/Op.java/Op/record(int)", + "prov": [ + "declared" + ], + "weight": 1 + } + ], + "entrypoint_report": { + "frameworks_detected": [], + "rulesets": [ + "jakarta", + "struts", + "spring", + "camel", + "jaxrs" + ], + "unresolved": {}, + "errors": [] + } + } +} \ No newline at end of file diff --git a/v2/json/java/analysis.l4.sample.json b/v2/json/java/analysis.l4.sample.json new file mode 100644 index 0000000..39803a3 --- /dev/null +++ b/v2/json/java/analysis.l4.sample.json @@ -0,0 +1,2627 @@ +{ + "schema_version": "2.0.0", + "language": "java", + "max_level": 4, + "analyzer": { + "name": "codeanalyzer-java", + "version": "3.1.2" + }, + "application": { + "id": "can://dataflow-test", + "kind": "application", + "symbol_table": { + "src/main/java/org/example/Dataflow.java": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java", + "kind": "module", + "span": { + "start": [ + 1, + 1 + ], + "end": [ + 72, + 1 + ], + "bytes": [ + 0, + 1248 + ] + }, + "package": "org.example", + "source": "package org.example;\n\n/**\n * A fixture exercising the L3 dataflow constructs: a loop-carried def-use, if/else, an early return,\n * try/catch/finally, and a shadowed variable in a nested block.\n */\npublic class Dataflow {\n\n int compute(int n) {\n int sum = 0;\n int other = n + 1;\n log(other);\n for (int i = 0; i < n; i++) {\n sum = sum + i;\n }\n return sum;\n }\n\n String classify(int x) {\n String r;\n if (x > 0) {\n r = \"pos\";\n } else {\n r = \"nonpos\";\n }\n return r;\n }\n\n int guarded(int x) {\n if (x < 0) {\n return -1;\n }\n return x;\n }\n\n int risky(int x) {\n int r;\n try {\n r = parse(x);\n } catch (NumberFormatException e) {\n r = 0;\n } finally {\n log(x);\n }\n return r;\n }\n\n int parse(int x) {\n return x;\n }\n\n int viaFinally(int x) {\n try {\n return parse(x);\n } finally {\n log(x);\n }\n }\n\n int shadowed(int x) {\n int y = x;\n {\n int z = y + 1;\n y = z;\n }\n return y;\n }\n\n void log(int v) {\n }\n}\n", + "comments": [], + "imports": [], + "types": { + "Dataflow": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow", + "kind": "class", + "span": { + "start": [ + 7, + 1 + ], + "end": [ + 71, + 1 + ], + "bytes": [ + 197, + 1247 + ] + }, + "comments": [ + { + "content": "\n * A fixture exercising the L3 dataflow constructs: a loop-carried def-use, if/else, an early return,\n * try/catch/finally, and a shadowed variable in a nested block.\n ", + "span": { + "start": [ + 3, + 1 + ], + "end": [ + 6, + 3 + ], + "bytes": [ + 22, + 196 + ] + }, + "is_javadoc": true + } + ], + "modifiers": [ + "public" + ], + "base_types": [], + "interfaces": [], + "decorators": [], + "type_parameters": [], + "is_entrypoint_class": false, + "entrypoint_frameworks": [], + "enum_constants": [], + "record_components": [], + "fields": {}, + "callables": { + "()": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/()", + "kind": "constructor", + "signature": "()", + "parameters": [], + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "is_implicit": true, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "local_variables": [], + "body": {}, + "types": {} + }, + "classify(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/classify(int)", + "kind": "method", + "signature": "classify(int)", + "span": { + "start": [ + 19, + 5 + ], + "end": [ + 27, + 5 + ], + "bytes": [ + 421, + 584 + ] + }, + "parameters": [ + { + "name": "x", + "type": "int", + "span": { + "start": [ + 19, + 21 + ], + "end": [ + 19, + 25 + ], + "bytes": [ + 437, + 442 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "java.lang.String", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 19, + 28 + ], + "end": [ + 27, + 5 + ], + "bytes": [ + 444, + 584 + ] + }, + "declaration": "String classify(int x)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 2 + }, + "refs": { + "types": [ + "java.lang.String" + ], + "fields": [] + }, + "local_variables": [ + { + "name": "r", + "type": "java.lang.String", + "span": { + "start": [ + 20, + 16 + ], + "end": [ + 20, + 16 + ], + "bytes": [ + 461, + 462 + ] + }, + "comments": [] + } + ], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "20:9": { + "kind": "statement", + "span": { + "start": [ + 20, + 9 + ], + "end": [ + 20, + 17 + ], + "bytes": [ + 454, + 463 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "21:9": { + "kind": "branch", + "span": { + "start": [ + 21, + 9 + ], + "end": [ + 25, + 9 + ], + "bytes": [ + 472, + 560 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "22:13": { + "kind": "statement", + "span": { + "start": [ + 22, + 13 + ], + "end": [ + 22, + 22 + ], + "bytes": [ + 497, + 507 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "24:13": { + "kind": "statement", + "span": { + "start": [ + 24, + 13 + ], + "end": [ + 24, + 25 + ], + "bytes": [ + 537, + 550 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "26:9": { + "kind": "return", + "span": { + "start": [ + 26, + 9 + ], + "end": [ + 26, + 17 + ], + "bytes": [ + 569, + 578 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "x" + }, + "@formal_out": { + "kind": "formal_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret" + } + }, + "cfg": [ + { + "src": "20:9", + "dst": "21:9", + "kind": "fallthrough" + }, + { + "src": "21:9", + "dst": "22:13", + "kind": "true" + }, + { + "src": "21:9", + "dst": "24:13", + "kind": "false" + }, + { + "src": "22:13", + "dst": "26:9", + "kind": "fallthrough" + }, + { + "src": "24:13", + "dst": "26:9", + "kind": "fallthrough" + }, + { + "src": "26:9", + "dst": "@exit", + "kind": "return" + }, + { + "src": "@entry", + "dst": "20:9", + "kind": "fallthrough" + } + ], + "cdg": [ + { + "src": "21:9", + "dst": "22:13" + }, + { + "src": "21:9", + "dst": "24:13" + } + ], + "ddg": [ + { + "src": "22:13", + "dst": "26:9", + "var": "r", + "prov": [ + "ssa" + ] + }, + { + "src": "24:13", + "dst": "26:9", + "var": "r", + "prov": [ + "ssa" + ] + }, + { + "src": "26:9", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "21:9", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "21:9", + "var": "x", + "prov": [ + "ssa" + ] + } + ], + "types": {} + }, + "compute(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/compute(int)", + "kind": "method", + "signature": "compute(int)", + "span": { + "start": [ + 9, + 5 + ], + "end": [ + 17, + 5 + ], + "bytes": [ + 226, + 415 + ] + }, + "parameters": [ + { + "name": "n", + "type": "int", + "span": { + "start": [ + 9, + 17 + ], + "end": [ + 9, + 21 + ], + "bytes": [ + 238, + 243 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 9, + 24 + ], + "end": [ + 17, + 5 + ], + "bytes": [ + 245, + 415 + ] + }, + "declaration": "int compute(int n)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 2 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [ + { + "name": "sum", + "type": "int", + "initializer": "0", + "span": { + "start": [ + 10, + 13 + ], + "end": [ + 10, + 19 + ], + "bytes": [ + 259, + 266 + ] + }, + "comments": [] + }, + { + "name": "other", + "type": "int", + "initializer": "n + 1", + "span": { + "start": [ + 11, + 13 + ], + "end": [ + 11, + 25 + ], + "bytes": [ + 280, + 293 + ] + }, + "comments": [] + }, + { + "name": "i", + "type": "int", + "initializer": "0", + "span": { + "start": [ + 13, + 18 + ], + "end": [ + 13, + 22 + ], + "bytes": [ + 332, + 337 + ] + }, + "comments": [] + } + ], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "12:9": { + "kind": "call", + "span": { + "start": [ + 12, + 9 + ], + "end": [ + 12, + 18 + ], + "bytes": [ + 303, + 313 + ] + }, + "callee": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)", + "arguments": [ + "12:13" + ], + "argument_types": [ + "int" + ], + "argument_expr": [ + "other" + ], + "callee_signature": "log(int)", + "method_name": "log", + "return_type": "void", + "accessibility": "package_private", + "is_static_call": false, + "is_constructor_call": false + }, + "10:9": { + "kind": "statement", + "span": { + "start": [ + 10, + 9 + ], + "end": [ + 10, + 20 + ], + "bytes": [ + 255, + 267 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "11:9": { + "kind": "statement", + "span": { + "start": [ + 11, + 9 + ], + "end": [ + 11, + 26 + ], + "bytes": [ + 276, + 294 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "13:9": { + "kind": "loop", + "span": { + "start": [ + 13, + 9 + ], + "end": [ + 15, + 9 + ], + "bytes": [ + 323, + 389 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "14:13": { + "kind": "statement", + "span": { + "start": [ + 14, + 13 + ], + "end": [ + 14, + 26 + ], + "bytes": [ + 365, + 379 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "16:9": { + "kind": "return", + "span": { + "start": [ + 16, + 9 + ], + "end": [ + 16, + 19 + ], + "bytes": [ + 398, + 409 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "n" + }, + "@formal_out": { + "kind": "formal_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret" + }, + "12:9/actual_in:0": { + "kind": "actual_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "arg0", + "parent": "12:9" + } + }, + "cfg": [ + { + "src": "10:9", + "dst": "11:9", + "kind": "fallthrough" + }, + { + "src": "11:9", + "dst": "12:9", + "kind": "fallthrough" + }, + { + "src": "12:9", + "dst": "13:9", + "kind": "fallthrough" + }, + { + "src": "13:9", + "dst": "14:13", + "kind": "true" + }, + { + "src": "13:9", + "dst": "16:9", + "kind": "false" + }, + { + "src": "14:13", + "dst": "13:9", + "kind": "loop_back" + }, + { + "src": "16:9", + "dst": "@exit", + "kind": "return" + }, + { + "src": "@entry", + "dst": "10:9", + "kind": "fallthrough" + } + ], + "cdg": [ + { + "src": "13:9", + "dst": "13:9" + }, + { + "src": "13:9", + "dst": "14:13" + } + ], + "ddg": [ + { + "src": "10:9", + "dst": "14:13", + "var": "sum", + "prov": [ + "ssa" + ] + }, + { + "src": "10:9", + "dst": "16:9", + "var": "sum", + "prov": [ + "ssa" + ] + }, + { + "src": "11:9", + "dst": "12:9", + "var": "other", + "prov": [ + "ssa" + ] + }, + { + "src": "12:9", + "dst": "12:9/actual_in:0", + "var": "arg0", + "prov": [ + "ssa" + ] + }, + { + "src": "13:9", + "dst": "13:9", + "var": "i", + "prov": [ + "ssa" + ] + }, + { + "src": "13:9", + "dst": "14:13", + "var": "i", + "prov": [ + "ssa" + ] + }, + { + "src": "14:13", + "dst": "14:13", + "var": "sum", + "prov": [ + "ssa" + ] + }, + { + "src": "14:13", + "dst": "16:9", + "var": "sum", + "prov": [ + "ssa" + ] + }, + { + "src": "16:9", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "11:9", + "var": "n", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "13:9", + "var": "n", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "11:9", + "var": "n", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "13:9", + "var": "n", + "prov": [ + "ssa" + ] + } + ], + "types": {} + }, + "guarded(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/guarded(int)", + "kind": "method", + "signature": "guarded(int)", + "span": { + "start": [ + 29, + 5 + ], + "end": [ + 34, + 5 + ], + "bytes": [ + 590, + 688 + ] + }, + "parameters": [ + { + "name": "x", + "type": "int", + "span": { + "start": [ + 29, + 17 + ], + "end": [ + 29, + 21 + ], + "bytes": [ + 602, + 607 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 29, + 24 + ], + "end": [ + 34, + 5 + ], + "bytes": [ + 609, + 688 + ] + }, + "declaration": "int guarded(int x)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 2 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "30:9": { + "kind": "branch", + "span": { + "start": [ + 30, + 9 + ], + "end": [ + 32, + 9 + ], + "bytes": [ + 619, + 664 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "31:13": { + "kind": "return", + "span": { + "start": [ + 31, + 13 + ], + "end": [ + 31, + 22 + ], + "bytes": [ + 644, + 654 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "33:9": { + "kind": "return", + "span": { + "start": [ + 33, + 9 + ], + "end": [ + 33, + 17 + ], + "bytes": [ + 673, + 682 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "x" + }, + "@formal_out": { + "kind": "formal_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret" + } + }, + "cfg": [ + { + "src": "30:9", + "dst": "31:13", + "kind": "true" + }, + { + "src": "30:9", + "dst": "33:9", + "kind": "false" + }, + { + "src": "31:13", + "dst": "@exit", + "kind": "return" + }, + { + "src": "33:9", + "dst": "@exit", + "kind": "return" + }, + { + "src": "@entry", + "dst": "30:9", + "kind": "fallthrough" + } + ], + "cdg": [ + { + "src": "30:9", + "dst": "31:13" + }, + { + "src": "30:9", + "dst": "33:9" + } + ], + "ddg": [ + { + "src": "31:13", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "33:9", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "30:9", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "33:9", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "30:9", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "33:9", + "var": "x", + "prov": [ + "ssa" + ] + } + ], + "types": {} + }, + "log(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)", + "kind": "method", + "signature": "log(int)", + "span": { + "start": [ + 69, + 5 + ], + "end": [ + 70, + 5 + ], + "bytes": [ + 1222, + 1245 + ] + }, + "parameters": [ + { + "name": "v", + "type": "int", + "span": { + "start": [ + 69, + 14 + ], + "end": [ + 69, + 18 + ], + "bytes": [ + 1231, + 1236 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "void", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 69, + 21 + ], + "end": [ + 70, + 5 + ], + "bytes": [ + 1238, + 1245 + ] + }, + "declaration": "void log(int v)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "v" + } + }, + "cfg": [ + { + "src": "@entry", + "dst": "@exit", + "kind": "fallthrough" + } + ], + "cdg": [], + "ddg": [], + "types": {} + }, + "parse(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)", + "kind": "method", + "signature": "parse(int)", + "span": { + "start": [ + 48, + 5 + ], + "end": [ + 50, + 5 + ], + "bytes": [ + 910, + 952 + ] + }, + "parameters": [ + { + "name": "x", + "type": "int", + "span": { + "start": [ + 48, + 15 + ], + "end": [ + 48, + 19 + ], + "bytes": [ + 920, + 925 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 48, + 22 + ], + "end": [ + 50, + 5 + ], + "bytes": [ + 927, + 952 + ] + }, + "declaration": "int parse(int x)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "49:9": { + "kind": "return", + "span": { + "start": [ + 49, + 9 + ], + "end": [ + 49, + 17 + ], + "bytes": [ + 937, + 946 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "x" + }, + "@formal_out": { + "kind": "formal_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret" + } + }, + "cfg": [ + { + "src": "49:9", + "dst": "@exit", + "kind": "return" + }, + { + "src": "@entry", + "dst": "49:9", + "kind": "fallthrough" + } + ], + "cdg": [], + "ddg": [ + { + "src": "49:9", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "49:9", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "49:9", + "var": "x", + "prov": [ + "ssa" + ] + } + ], + "types": {} + }, + "risky(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/risky(int)", + "kind": "method", + "signature": "risky(int)", + "span": { + "start": [ + 36, + 5 + ], + "end": [ + 46, + 5 + ], + "bytes": [ + 694, + 904 + ] + }, + "parameters": [ + { + "name": "x", + "type": "int", + "span": { + "start": [ + 36, + 15 + ], + "end": [ + 36, + 19 + ], + "bytes": [ + 704, + 709 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 36, + 22 + ], + "end": [ + 46, + 5 + ], + "bytes": [ + 711, + 904 + ] + }, + "declaration": "int risky(int x)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 2 + }, + "refs": { + "types": [ + "java.lang.NumberFormatException" + ], + "fields": [] + }, + "local_variables": [ + { + "name": "r", + "type": "int", + "span": { + "start": [ + 37, + 13 + ], + "end": [ + 37, + 13 + ], + "bytes": [ + 725, + 726 + ] + }, + "comments": [] + } + ], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "39:17": { + "kind": "call", + "span": { + "start": [ + 39, + 17 + ], + "end": [ + 39, + 24 + ], + "bytes": [ + 758, + 766 + ] + }, + "callee": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)", + "arguments": [ + "39:23" + ], + "argument_types": [ + "int" + ], + "argument_expr": [ + "x" + ], + "callee_signature": "parse(int)", + "method_name": "parse", + "return_type": "int", + "accessibility": "package_private", + "is_static_call": false, + "is_constructor_call": false + }, + "43:13": { + "kind": "call", + "span": { + "start": [ + 43, + 13 + ], + "end": [ + 43, + 18 + ], + "bytes": [ + 863, + 869 + ] + }, + "callee": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)", + "arguments": [ + "43:17" + ], + "argument_types": [ + "int" + ], + "argument_expr": [ + "x" + ], + "callee_signature": "log(int)", + "method_name": "log", + "return_type": "void", + "accessibility": "package_private", + "is_static_call": false, + "is_constructor_call": false + }, + "37:9": { + "kind": "statement", + "span": { + "start": [ + 37, + 9 + ], + "end": [ + 37, + 14 + ], + "bytes": [ + 721, + 727 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "39:13": { + "kind": "statement", + "span": { + "start": [ + 39, + 13 + ], + "end": [ + 39, + 25 + ], + "bytes": [ + 754, + 767 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "41:13": { + "kind": "statement", + "span": { + "start": [ + 41, + 13 + ], + "end": [ + 41, + 18 + ], + "bytes": [ + 824, + 830 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "45:9": { + "kind": "return", + "span": { + "start": [ + 45, + 9 + ], + "end": [ + 45, + 17 + ], + "bytes": [ + 889, + 898 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "x" + }, + "@formal_out": { + "kind": "formal_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret" + }, + "39:17/actual_in:0": { + "kind": "actual_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "arg0", + "parent": "39:17" + }, + "39:17/actual_out": { + "kind": "actual_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret", + "parent": "39:17" + }, + "43:13/actual_in:0": { + "kind": "actual_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "arg0", + "parent": "43:13" + } + }, + "cfg": [ + { + "src": "37:9", + "dst": "39:13", + "kind": "fallthrough" + }, + { + "src": "39:13", + "dst": "41:13", + "kind": "exception" + }, + { + "src": "39:13", + "dst": "43:13", + "kind": "fallthrough" + }, + { + "src": "41:13", + "dst": "43:13", + "kind": "fallthrough" + }, + { + "src": "43:13", + "dst": "45:9", + "kind": "fallthrough" + }, + { + "src": "45:9", + "dst": "@exit", + "kind": "return" + }, + { + "src": "@entry", + "dst": "37:9", + "kind": "fallthrough" + } + ], + "cdg": [ + { + "src": "39:13", + "dst": "41:13" + } + ], + "ddg": [ + { + "src": "39:13", + "dst": "39:17/actual_in:0", + "var": "arg0", + "prov": [ + "ssa" + ] + }, + { + "src": "39:13", + "dst": "45:9", + "var": "r", + "prov": [ + "ssa" + ] + }, + { + "src": "39:17/actual_out", + "dst": "39:13", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "41:13", + "dst": "45:9", + "var": "r", + "prov": [ + "ssa" + ] + }, + { + "src": "43:13", + "dst": "43:13/actual_in:0", + "var": "arg0", + "prov": [ + "ssa" + ] + }, + { + "src": "45:9", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "39:13", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "43:13", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "39:13", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "43:13", + "var": "x", + "prov": [ + "ssa" + ] + } + ], + "summary": [ + { + "src": "39:17/actual_in:0", + "dst": "39:17/actual_out" + } + ], + "types": {} + }, + "shadowed(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/shadowed(int)", + "kind": "method", + "signature": "shadowed(int)", + "span": { + "start": [ + 60, + 5 + ], + "end": [ + 67, + 5 + ], + "bytes": [ + 1086, + 1216 + ] + }, + "parameters": [ + { + "name": "x", + "type": "int", + "span": { + "start": [ + 60, + 18 + ], + "end": [ + 60, + 22 + ], + "bytes": [ + 1099, + 1104 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 60, + 25 + ], + "end": [ + 67, + 5 + ], + "bytes": [ + 1106, + 1216 + ] + }, + "declaration": "int shadowed(int x)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [ + { + "name": "y", + "type": "int", + "initializer": "x", + "span": { + "start": [ + 61, + 13 + ], + "end": [ + 61, + 17 + ], + "bytes": [ + 1120, + 1125 + ] + }, + "comments": [] + }, + { + "name": "z", + "type": "int", + "initializer": "y + 1", + "span": { + "start": [ + 63, + 17 + ], + "end": [ + 63, + 25 + ], + "bytes": [ + 1153, + 1162 + ] + }, + "comments": [] + } + ], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "61:9": { + "kind": "statement", + "span": { + "start": [ + 61, + 9 + ], + "end": [ + 61, + 18 + ], + "bytes": [ + 1116, + 1126 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "63:13": { + "kind": "statement", + "span": { + "start": [ + 63, + 13 + ], + "end": [ + 63, + 26 + ], + "bytes": [ + 1149, + 1163 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "64:13": { + "kind": "statement", + "span": { + "start": [ + 64, + 13 + ], + "end": [ + 64, + 18 + ], + "bytes": [ + 1176, + 1182 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "66:9": { + "kind": "return", + "span": { + "start": [ + 66, + 9 + ], + "end": [ + 66, + 17 + ], + "bytes": [ + 1201, + 1210 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "x" + }, + "@formal_out": { + "kind": "formal_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret" + } + }, + "cfg": [ + { + "src": "61:9", + "dst": "63:13", + "kind": "fallthrough" + }, + { + "src": "63:13", + "dst": "64:13", + "kind": "fallthrough" + }, + { + "src": "64:13", + "dst": "66:9", + "kind": "fallthrough" + }, + { + "src": "66:9", + "dst": "@exit", + "kind": "return" + }, + { + "src": "@entry", + "dst": "61:9", + "kind": "fallthrough" + } + ], + "cdg": [], + "ddg": [ + { + "src": "61:9", + "dst": "63:13", + "var": "y", + "prov": [ + "ssa" + ] + }, + { + "src": "63:13", + "dst": "64:13", + "var": "z", + "prov": [ + "ssa" + ] + }, + { + "src": "64:13", + "dst": "66:9", + "var": "y", + "prov": [ + "ssa" + ] + }, + { + "src": "66:9", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "61:9", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "61:9", + "var": "x", + "prov": [ + "ssa" + ] + } + ], + "types": {} + }, + "viaFinally(int)": { + "id": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/viaFinally(int)", + "kind": "method", + "signature": "viaFinally(int)", + "span": { + "start": [ + 52, + 5 + ], + "end": [ + 58, + 5 + ], + "bytes": [ + 958, + 1080 + ] + }, + "parameters": [ + { + "name": "x", + "type": "int", + "span": { + "start": [ + 52, + 20 + ], + "end": [ + 52, + 24 + ], + "bytes": [ + 973, + 978 + ] + }, + "modifiers": [], + "decorators": [], + "is_variadic": false + } + ], + "return_type": "int", + "error_channel": [], + "modifiers": [], + "decorators": [], + "type_parameters": [], + "body_span": { + "start": [ + 52, + 27 + ], + "end": [ + 58, + 5 + ], + "bytes": [ + 980, + 1080 + ] + }, + "declaration": "int viaFinally(int x)", + "is_implicit": false, + "comments": [], + "is_entrypoint": false, + "entrypoint_frameworks": [], + "metrics": { + "cyclomatic": 1 + }, + "refs": { + "types": [], + "fields": [] + }, + "local_variables": [], + "body": { + "@entry": { + "kind": "entry", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@exit": { + "kind": "exit", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "54:20": { + "kind": "call", + "span": { + "start": [ + 54, + 20 + ], + "end": [ + 54, + 27 + ], + "bytes": [ + 1015, + 1023 + ] + }, + "callee": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)", + "arguments": [ + "54:26" + ], + "argument_types": [ + "int" + ], + "argument_expr": [ + "x" + ], + "callee_signature": "parse(int)", + "method_name": "parse", + "return_type": "int", + "accessibility": "package_private", + "is_static_call": false, + "is_constructor_call": false + }, + "56:13": { + "kind": "call", + "span": { + "start": [ + 56, + 13 + ], + "end": [ + 56, + 18 + ], + "bytes": [ + 1057, + 1063 + ] + }, + "callee": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)", + "arguments": [ + "56:17" + ], + "argument_types": [ + "int" + ], + "argument_expr": [ + "x" + ], + "callee_signature": "log(int)", + "method_name": "log", + "return_type": "void", + "accessibility": "package_private", + "is_static_call": false, + "is_constructor_call": false + }, + "54:13": { + "kind": "return", + "span": { + "start": [ + 54, + 13 + ], + "end": [ + 54, + 28 + ], + "bytes": [ + 1008, + 1024 + ] + }, + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false + }, + "@formal_in:0": { + "kind": "formal_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "x" + }, + "@formal_out": { + "kind": "formal_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret" + }, + "54:20/actual_in:0": { + "kind": "actual_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "arg0", + "parent": "54:20" + }, + "54:20/actual_out": { + "kind": "actual_out", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "$ret", + "parent": "54:20" + }, + "56:13/actual_in:0": { + "kind": "actual_in", + "arguments": [], + "argument_types": [], + "argument_expr": [], + "is_constructor_call": false, + "of": "arg0", + "parent": "56:13" + } + }, + "cfg": [ + { + "src": "54:13", + "dst": "56:13", + "kind": "exception" + }, + { + "src": "54:13", + "dst": "56:13", + "kind": "return" + }, + { + "src": "56:13", + "dst": "@exit", + "kind": "fallthrough" + }, + { + "src": "@entry", + "dst": "54:13", + "kind": "fallthrough" + } + ], + "cdg": [], + "ddg": [ + { + "src": "54:13", + "dst": "54:20/actual_in:0", + "var": "arg0", + "prov": [ + "ssa" + ] + }, + { + "src": "54:13", + "dst": "@formal_out", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "54:20/actual_out", + "dst": "54:13", + "var": "$ret", + "prov": [ + "ssa" + ] + }, + { + "src": "56:13", + "dst": "56:13/actual_in:0", + "var": "arg0", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "54:13", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@entry", + "dst": "56:13", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "54:13", + "var": "x", + "prov": [ + "ssa" + ] + }, + { + "src": "@formal_in:0", + "dst": "56:13", + "var": "x", + "prov": [ + "ssa" + ] + } + ], + "summary": [ + { + "src": "54:20/actual_in:0", + "dst": "54:20/actual_out" + } + ], + "types": {} + } + }, + "types": {} + } + }, + "content_hash": "626e2a4b43455f5ec6a0c685108942a1cbfa91fc912dbf25b5c601928b605593" + } + }, + "call_graph": [ + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/compute(int)", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)", + "prov": [ + "declared" + ], + "weight": 1 + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/risky(int)", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)", + "prov": [ + "declared" + ], + "weight": 1 + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/risky(int)", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)", + "prov": [ + "declared" + ], + "weight": 1 + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/viaFinally(int)", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)", + "prov": [ + "declared" + ], + "weight": 1 + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/viaFinally(int)", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)", + "prov": [ + "declared" + ], + "weight": 1 + } + ], + "param_in": [ + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/compute(int)@12:9/actual_in:0", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)@formal_in:0", + "var": "v" + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/risky(int)@39:17/actual_in:0", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)@formal_in:0", + "var": "x" + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/risky(int)@43:13/actual_in:0", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)@formal_in:0", + "var": "v" + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/viaFinally(int)@54:20/actual_in:0", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)@formal_in:0", + "var": "x" + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/viaFinally(int)@56:13/actual_in:0", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/log(int)@formal_in:0", + "var": "v" + } + ], + "param_out": [ + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)@formal_out", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/risky(int)@39:17/actual_out", + "var": "$ret" + }, + { + "src": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/parse(int)@formal_out", + "dst": "can://dataflow-test/java/src/main/java/org/example/Dataflow.java/Dataflow/viaFinally(int)@54:20/actual_out", + "var": "$ret" + } + ], + "artifacts": { + "build.gradle": { + "id": "can://dataflow-test/artifact/build.gradle", + "kind": "artifact", + "path": "build.gradle", + "format": "gradle", + "roles": [ + "dependency-manifest", + "tool-config" + ], + "size_bytes": 269, + "sha256": "8a9d099e77bc4af0d3ee7a7cc6f2907d2f0d7863694230b1cea35d7385851361", + "source": "plugins {\n id 'java'\n}\n\nrepositories {\n mavenCentral()\n}\n\njava {\n sourceCompatibility = JavaVersion.VERSION_11\n targetCompatibility = JavaVersion.VERSION_11\n}\n\nsourceSets {\n main {\n java {\n srcDirs = [\"src/main/java\"]\n }\n }\n}\n", + "text_truncated": false, + "extraction": "full", + "config_keys": [] + }, + "settings.gradle": { + "id": "can://dataflow-test/artifact/settings.gradle", + "kind": "artifact", + "path": "settings.gradle", + "format": "gradle", + "roles": [ + "tool-config" + ], + "size_bytes": 35, + "sha256": "052333f47fab4e5afdb765d9bba86e67142a1b7dfab36b4517bf67a9e9c93ce8", + "source": "rootProject.name = 'dataflow-test'\n", + "text_truncated": false, + "extraction": "none", + "config_keys": [] + } + }, + "entrypoint_report": { + "frameworks_detected": [], + "rulesets": [ + "jakarta", + "struts", + "spring", + "camel", + "jaxrs" + ], + "unresolved": {}, + "errors": [] + } + } +} \ No newline at end of file diff --git a/v2/json/java/analysis.schema.json b/v2/json/java/analysis.schema.json new file mode 100644 index 0000000..93f633a --- /dev/null +++ b/v2/json/java/analysis.schema.json @@ -0,0 +1,704 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://codellm-devkit.github.io/schema/v2/java/analysis.schema.json", + "title": "codeanalyzer-java v2 analysis output", + "description": "What codeanalyzer-java v3.0.1 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction: a field the analyzer starts emitting that nobody recorded here fails validation. Property names are the Gson LOWER_CASE_WITH_UNDERSCORES rendering of the Lombok @Data field names; nulls are never serialized, so absent means 'no fact'.", + "x-cldk": { + "schemaVersion": "2.0.0", + "language": "java", + "source": { + "repo": "codellm-devkit/codeanalyzer-java", + "release": "v3.0.1", + "definedIn": "src/main/java/com/ibm/cldk/schema/" + }, + "canonical": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json", + "extends": [ + "type: type_parameters, enum_constants, record_components, is_entrypoint_class, base_types, interfaces", + "callable: error_channel, type_parameters, body_span, declaration, is_implicit, is_entrypoint, metrics, refs, local_variables", + "body node: rich call-site facts (method_name, receiver_expr, receiver_type, argument_types, argument_expr, callee_signature, accessibility, is_static_call, is_constructor_call, comment)", + "import: is_static, is_wildcard; comment: is_javadoc; parameter: is_variadic; artifact: text_truncated; dependency: group" + ], + "omits": [ + "envelope k_limit (java does not bound access paths in the payload)", + "application config_uses / config_reads / unresolved_imports / repository", + "module functions and fields (java has no module-level callables or bindings)" + ], + "diverges": [ + "body node / parameter `id`: not emitted yet. python and typescript carry the global ordinal id on every body node and the formal-vertex id on every parameter (codeanalyzer-python#176); java's uptake is a child of codellm-devkit/.github#56." + ] + }, + "allOf": [ + { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json" + } + ], + "properties": { + "language": { + "const": "java" + }, + "application": { + "$ref": "#/$defs/JavaApplication" + } + }, + "unevaluatedProperties": false, + "$defs": { + "JavaApplication": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Application", + "properties": { + "symbol_table": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaModule" + } + }, + "external_symbols": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaExternalSymbol" + } + }, + "artifacts": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaArtifact" + } + }, + "dependencies": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDependency" + } + }, + "entrypoint_report": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/EntrypointReport" + } + }, + "unevaluatedProperties": false + }, + "JavaModule": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Module", + "required": [ + "span" + ], + "properties": { + "package": { + "description": "The declared package (the Java field is packageName; `package` is a Java keyword).", + "type": "string" + }, + "imports": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaImport" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaComment" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaType" + } + } + }, + "unevaluatedProperties": false + }, + "JavaType": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Type", + "properties": { + "kind": { + "enum": [ + "class", + "interface", + "enum", + "record", + "annotation" + ] + }, + "base_types": { + "description": "extends - resolved names of the supertypes.", + "type": "array", + "items": { + "type": "string" + } + }, + "interfaces": { + "description": "implements - resolved names of the implemented interfaces.", + "type": "array", + "items": { + "type": "string" + } + }, + "type_parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaTypeParameter" + } + }, + "is_entrypoint_class": { + "type": "boolean" + }, + "enum_constants": { + "description": "Present only on enum types, in declaration order.", + "type": "array", + "items": { + "$ref": "#/$defs/JavaEnumConstant" + } + }, + "record_components": { + "description": "Present only on record types, in declaration order.", + "type": "array", + "items": { + "$ref": "#/$defs/JavaRecordComponent" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDecorator" + } + }, + "fields": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaField" + } + }, + "callables": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaCallable" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaType" + } + }, + "entrypoint_frameworks": { + "description": "Frameworks that route to this declaration, when the entrypoint pass matched one.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "unevaluatedProperties": false + }, + "JavaCallable": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Callable", + "properties": { + "kind": { + "enum": [ + "method", + "constructor", + "initializer" + ] + }, + "error_channel": { + "description": "The `throws` clause, generalized: one field across languages.", + "type": "array", + "items": { + "type": "string" + } + }, + "type_parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaTypeParameter" + } + }, + "body_span": { + "description": "Span of the body block alone; absent when the callable has no body. Slice this for just the method body.", + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Span" + }, + "declaration": { + "description": "Signature-with-parameter-names text, e.g. `public int add(int a, int b)`.", + "type": "string" + }, + "is_implicit": { + "description": "A compiler-generated member the source does not declare (discovered at L2).", + "type": "boolean" + }, + "is_entrypoint": { + "type": "boolean" + }, + "metrics": { + "$ref": "#/$defs/JavaMetrics" + }, + "refs": { + "$ref": "#/$defs/JavaRefs" + }, + "local_variables": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaVariableDeclaration" + } + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaParameter" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDecorator" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaComment" + } + }, + "body": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaBodyNode" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/JavaType" + } + }, + "cdg": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaIdEdge" + } + }, + "summary": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaIdEdge" + } + }, + "entrypoint_frameworks": { + "description": "Frameworks that route to this declaration, when the entrypoint pass matched one.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "unevaluatedProperties": false, + "allOf": [ + { + "description": "A declared callable always carries a span; only an implicit (compiler-generated) member may lack one.", + "if": { + "required": [ + "is_implicit" + ], + "properties": { + "is_implicit": { + "const": true + } + } + }, + "then": true, + "else": { + "required": [ + "span" + ] + } + } + ] + }, + "JavaBodyNode": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/BodyNode", + "properties": { + "kind": { + "description": "What this analyzer actually emits: `call` at L1, the AST regions at L3, and the L3/L4 synthetic vertices.", + "enum": [ + "call", + "statement", + "return", + "branch", + "loop", + "switch", + "entry", + "exit", + "formal_in", + "formal_out", + "actual_in", + "actual_out" + ] + }, + "arguments": { + "description": "call nodes: the local ids of the argument body nodes.", + "type": "array", + "items": { + "type": "string" + } + }, + "method_name": { + "description": "The invoked name, or `` for a constructor call.", + "type": "string" + }, + "receiver_expr": { + "type": "string" + }, + "receiver_type": { + "description": "Resolved receiver type, or the instantiated type of a `new` expression.", + "type": "string" + }, + "argument_types": { + "type": "array", + "items": { + "type": "string" + } + }, + "argument_expr": { + "description": "The argument expressions as written, positionally.", + "type": "array", + "items": { + "type": "string" + } + }, + "callee_signature": { + "description": "Erased signature of the resolved callee; absent when unresolvable.", + "type": "string" + }, + "return_type": { + "type": "string" + }, + "accessibility": { + "description": "Declared accessibility of the callee; absent when the callee does not resolve.", + "enum": [ + "public", + "protected", + "private", + "package_private" + ] + }, + "is_static_call": { + "description": "Absent (not false) when the callee does not resolve - unknown rather than 'not static'.", + "type": "boolean" + }, + "is_constructor_call": { + "type": "boolean" + }, + "comment": { + "description": "Comment attached to the construct containing this call site.", + "$ref": "#/$defs/JavaComment" + } + }, + "unevaluatedProperties": false + }, + "JavaField": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Field", + "properties": { + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDecorator" + } + } + }, + "unevaluatedProperties": false + }, + "JavaParameter": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Parameter", + "properties": { + "modifiers": { + "type": "array", + "items": { + "type": "string" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDecorator" + } + }, + "is_variadic": { + "description": "A varargs parameter; `type` stays the element type.", + "type": "boolean" + } + }, + "unevaluatedProperties": false + }, + "JavaImport": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Import", + "properties": { + "path": { + "description": "The imported name as written (or the package, for a wildcard import).", + "type": "string" + }, + "is_static": { + "type": "boolean" + }, + "is_wildcard": { + "type": "boolean" + } + }, + "unevaluatedProperties": false + }, + "JavaComment": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Comment", + "properties": { + "is_javadoc": { + "type": "boolean" + } + }, + "unevaluatedProperties": false + }, + "JavaDecorator": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Decorator", + "properties": { + "args": { + "description": "Annotation arguments as written. Java's flat form of the canonical decorator arguments.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "unevaluatedProperties": false + }, + "JavaTypeParameter": { + "description": "One declared type parameter. Order is declaration order - a type argument binds by position.", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "bounds": { + "description": "Declared bounds, resolved. An unbounded T yields none - the implicit Object bound is left absent rather than fabricated.", + "type": "array", + "items": { + "type": "string" + } + }, + "span": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Span" + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDecorator" + } + } + }, + "additionalProperties": false + }, + "JavaEnumConstant": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "arguments": { + "type": "array", + "items": { + "type": "string" + } + }, + "span": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Span" + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDecorator" + } + } + }, + "additionalProperties": false + }, + "JavaRecordComponent": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "span": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Span" + }, + "modifiers": { + "type": "array", + "items": { + "type": "string" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaDecorator" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaComment" + } + }, + "is_variadic": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "JavaVariableDeclaration": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "initializer": { + "type": "string" + }, + "span": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Span" + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaComment" + } + } + }, + "additionalProperties": false + }, + "JavaMetrics": { + "type": "object", + "properties": { + "cyclomatic": { + "type": "integer" + } + }, + "additionalProperties": false + }, + "JavaRefs": { + "description": "Cheap cross-references the symbol pass already knows.", + "type": "object", + "properties": { + "types": { + "type": "array", + "items": { + "type": "string" + } + }, + "fields": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "JavaIdEdge": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/IdEdge", + "unevaluatedProperties": false + }, + "JavaExternalSymbol": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ExternalSymbol", + "properties": { + "kind": { + "const": "external" + }, + "signature": { + "description": "Erased signature of the out-of-project callable.", + "type": "string" + }, + "declaring_type": { + "description": "Binary name of the declaring type, e.g. java.util.Map$Entry.", + "type": "string" + } + }, + "unevaluatedProperties": false + }, + "JavaArtifact": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Artifact", + "properties": { + "text_truncated": { + "description": "True when `source` was truncated to fit memory limits.", + "type": "boolean" + }, + "config_keys": { + "type": "array", + "items": { + "$ref": "#/$defs/JavaConfigKey" + } + } + }, + "unevaluatedProperties": false + }, + "JavaConfigKey": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ConfigKey", + "properties": { + "namespace": { + "description": "properties | yaml | xml | env | dockerfile.", + "type": "string" + }, + "value": { + "type": "string" + } + }, + "unevaluatedProperties": false + }, + "JavaDependency": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Dependency", + "properties": { + "group": { + "description": "Maven groupId; with `name` (the artifactId) it forms the coordinate.", + "type": "string" + }, + "ecosystem": { + "const": "maven" + } + }, + "unevaluatedProperties": false + }, + "JavaParamEdge": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ParamEdge", + "unevaluatedProperties": false + } + } +} diff --git a/v2/json/python/analysis.dataflow.sample.json b/v2/json/python/analysis.dataflow.sample.json new file mode 100644 index 0000000..147a520 --- /dev/null +++ b/v2/json/python/analysis.dataflow.sample.json @@ -0,0 +1 @@ +{"schema_version": "2.0.0", "language": "python", "max_level": 4, "k_limit": 3, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.1", "config": {"analysis_level": 4}}, "application": {"symbol_table": {"pipeline.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "module_name": "pipeline", "id": "can://dataflow/python/pipeline.py", "kind": "module", "source": "\"\"\"Interprocedural fixture: call chain, mutual recursion, aliasing, closures.\"\"\"\n\n\ndef chain_a(v):\n return chain_b(v + 1)\n\n\ndef chain_b(v):\n return chain_c(v * 2)\n\n\ndef chain_c(v):\n return v - 3\n\n\ndef even(n):\n if n == 0:\n return True\n return odd(n - 1)\n\n\ndef odd(n):\n if n == 0:\n return False\n return even(n - 1)\n\n\nclass Box:\n def __init__(self, value):\n self.value = value\n\n def get(self):\n return self.value\n\n\ndef alias_flow():\n p = Box(10)\n q = p\n q.value = 42\n return p.get()\n\n\ndef make_adder(base):\n def add(x):\n return x + base\n return add\n\n\ndef use_adder(n):\n add5 = make_adder(5)\n return add5(n)\n\n\ndef mutate(items):\n items.append(1)\n\n\ndef caller_of_mutate():\n xs = []\n mutate(xs)\n return xs\n", "imports": [], "comments": [{"content": "Interprocedural fixture: call chain, mutual recursion, aliasing, closures.", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 80, "is_docstring": true}], "types": {"pipeline.Box": {"name": "Box", "signature": "pipeline.Box", "id": "can://dataflow/python/pipeline.py/Box", "kind": "class", "span": {"start": [28, 0], "end": [33, 25], "bytes": [351, 465]}, "comments": [], "base_classes": [], "decorators": [], "entrypoints": [], "is_entrypoint": false, "callables": {"__init__": {"name": "__init__", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.Box.__init__", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "kind": "function", "span": {"start": [29, 4], "end": [30, 26], "bytes": [366, 419]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "self", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "type": "Box", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 17, "end_column": 21}, {"name": "value", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "type": "int", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 23, "end_column": 28}], "start_line": 29, "end_line": 30, "code_start_line": 30, "accessed_symbols": [{"name": "value", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 30, "col_offset": 21}, {"name": "self", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 30, "col_offset": 8}], "callables": {}, "types": {}, "local_variables": [{"name": "value", "type": "Box", "initializer": "value", "scope": "class", "start_line": 30, "end_line": 30, "start_column": 8, "end_column": 18}], "cyclomatic_complexity": 1, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@entry", "arguments": []}, "30:8": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@30:8", "span": {"start": [30, 8], "end": [30, 26], "bytes": [401, 419]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "of": "self", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "of": "value", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:1", "of": "self", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "30:8", "kind": "fallthrough"}, {"src": "30:8", "dst": "@exit", "kind": "exception"}, {"src": "30:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "30:8"}], "ddg": [{"src": "@entry", "dst": "30:8", "var": "self", "prov": ["ssa"]}, {"src": "@entry", "dst": "30:8", "var": "value", "prov": ["ssa"]}, {"src": "30:8", "dst": "@formal_out:1", "var": "self.value", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "30:8", "var": "self", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "30:8", "var": "value", "prov": ["reaching-defs"]}], "summary": []}, "get": {"name": "get", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.Box.get", "id": "can://dataflow/python/pipeline.py/Box/get(self)", "kind": "function", "span": {"start": [32, 4], "end": [33, 25], "bytes": [425, 465]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "self", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "type": "Box", "decorators": [], "start_line": 32, "end_line": 32, "start_column": 12, "end_column": 16}], "start_line": 32, "end_line": 33, "code_start_line": 33, "accessed_symbols": [{"name": "self", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 33, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/Box/get(self)@entry", "arguments": []}, "33:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/Box/get(self)@33:8", "span": {"start": [33, 8], "end": [33, 25], "bytes": [448, 465]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/Box/get(self)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "of": "self", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "33:8", "kind": "fallthrough"}, {"src": "33:8", "dst": "@exit", "kind": "exception"}, {"src": "33:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "33:8"}], "ddg": [{"src": "@entry", "dst": "33:8", "var": "self.value", "prov": ["ssa"]}, {"src": "33:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "33:8", "var": "self.value", "prov": ["reaching-defs"]}], "summary": []}}, "attributes": {}, "types": {}, "start_line": 28, "end_line": 33}}, "functions": {"chain_a": {"name": "chain_a", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_a", "id": "can://dataflow/python/pipeline.py/chain_a(v)", "kind": "function", "span": {"start": [4, 0], "end": [5, 25], "bytes": [83, 124]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "decorators": [], "start_line": 4, "end_line": 4, "start_column": 12, "end_column": 13}], "start_line": 4, "end_line": 5, "code_start_line": 5, "accessed_symbols": [{"name": "chain_b", "scope": "local", "kind": "function", "type": "chain_b", "qualified_name": "pipeline.chain_b", "is_builtin": false, "lineno": 5, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 5, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"5:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:11", "span": {"start": [5, 11], "end": [5, 25], "bytes": [110, 124]}, "callee": "can://dataflow/python/pipeline.py/chain_b(v)", "parent": "5:4", "method_name": "chain_b", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_a(v)@entry", "arguments": []}, "5:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4", "span": {"start": [5, 4], "end": [5, 25], "bytes": [103, 124]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_a(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:1", "of": ":pipeline::chain_b", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:2", "of": ":pipeline::chain_c", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_out", "of": "", "arguments": []}, "5:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:0", "of": "v", "parent": "5:4", "arguments": []}, "5:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:1", "of": ":pipeline::chain_c", "parent": "5:4", "arguments": []}, "5:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_out", "of": "", "parent": "5:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "5:4", "kind": "fallthrough"}, {"src": "5:4", "dst": "@exit", "kind": "exception"}, {"src": "5:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "5:4"}], "ddg": [{"src": "@entry", "dst": "5:4", "var": "pipeline::chain_b", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "v", "prov": ["ssa"]}, {"src": "5:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "5:4/actual_out", "dst": "5:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "5:4/actual_in:0", "var": "pipeline::chain_b", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "5:4/actual_in:0", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "5:4", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "pipeline::chain_b", "prov": ["reaching-defs"]}], "summary": [{"src": "5:4/actual_in:0", "dst": "5:4/actual_out"}, {"src": "5:4/actual_in:1", "dst": "5:4/actual_out"}]}, "chain_b": {"name": "chain_b", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_b", "id": "can://dataflow/python/pipeline.py/chain_b(v)", "kind": "function", "span": {"start": [8, 0], "end": [9, 25], "bytes": [127, 168]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "type": "int", "decorators": [], "start_line": 8, "end_line": 8, "start_column": 12, "end_column": 13}], "start_line": 8, "end_line": 9, "code_start_line": 9, "accessed_symbols": [{"name": "chain_c", "scope": "local", "kind": "function", "type": "chain_c", "qualified_name": "pipeline.chain_c", "is_builtin": false, "lineno": 9, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 9, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"9:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:11", "span": {"start": [9, 11], "end": [9, 25], "bytes": [154, 168]}, "callee": "can://dataflow/python/pipeline.py/chain_c(v)", "parent": "9:4", "method_name": "chain_c", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp", "inferred_type": "int"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_b(v)@entry", "arguments": []}, "9:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4", "span": {"start": [9, 4], "end": [9, 25], "bytes": [147, 168]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_b(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:1", "of": ":pipeline::chain_c", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_out", "of": "", "arguments": []}, "9:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_in:0", "of": "v", "parent": "9:4", "arguments": []}, "9:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_out", "of": "", "parent": "9:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "9:4", "kind": "fallthrough"}, {"src": "9:4", "dst": "@exit", "kind": "exception"}, {"src": "9:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "9:4"}], "ddg": [{"src": "@entry", "dst": "9:4", "var": "pipeline::chain_c", "prov": ["ssa"]}, {"src": "@entry", "dst": "9:4", "var": "v", "prov": ["ssa"]}, {"src": "9:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "9:4/actual_out", "dst": "9:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "9:4/actual_in:0", "var": "pipeline::chain_c", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "9:4/actual_in:0", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "9:4", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "9:4", "var": "pipeline::chain_c", "prov": ["reaching-defs"]}], "summary": [{"src": "9:4/actual_in:0", "dst": "9:4/actual_out"}]}, "chain_c": {"name": "chain_c", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_c", "id": "can://dataflow/python/pipeline.py/chain_c(v)", "kind": "function", "span": {"start": [12, 0], "end": [13, 16], "bytes": [171, 203]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "type": "int", "decorators": [], "start_line": 12, "end_line": 12, "start_column": 12, "end_column": 13}], "start_line": 12, "end_line": 13, "code_start_line": 13, "accessed_symbols": [{"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 13, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_c(v)@entry", "arguments": []}, "13:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_c(v)@13:4", "span": {"start": [13, 4], "end": [13, 16], "bytes": [191, 203]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_c(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "13:4", "kind": "fallthrough"}, {"src": "13:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "13:4"}], "ddg": [{"src": "@entry", "dst": "13:4", "var": "v", "prov": ["ssa"]}, {"src": "13:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "13:4", "var": "v", "prov": ["reaching-defs"]}], "summary": []}, "even": {"name": "even", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.even", "id": "can://dataflow/python/pipeline.py/even(n)", "kind": "function", "span": {"start": [16, 0], "end": [19, 21], "bytes": [206, 275]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "type": "int", "decorators": [], "start_line": 16, "end_line": 16, "start_column": 9, "end_column": 10}], "start_line": 16, "end_line": 19, "code_start_line": 17, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 17, "col_offset": 7}, {"name": "odd", "scope": "local", "kind": "function", "type": "odd", "qualified_name": "pipeline.odd", "is_builtin": false, "lineno": 19, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 19, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 4, "body": {"19:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/even(n)@19:11", "span": {"start": [19, 11], "end": [19, 21], "bytes": [265, 275]}, "callee": "can://dataflow/python/pipeline.py/odd(n)", "parent": "19:4", "method_name": "odd", "return_type": "bool", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/even(n)@entry", "arguments": []}, "17:7": {"kind": "branch", "id": "can://dataflow/python/pipeline.py/even(n)@17:7", "span": {"start": [17, 7], "end": [17, 13], "bytes": [226, 232]}, "arguments": []}, "18:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/even(n)@18:8", "span": {"start": [18, 8], "end": [18, 19], "bytes": [242, 253]}, "arguments": []}, "19:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/even(n)@19:4", "span": {"start": [19, 4], "end": [19, 21], "bytes": [258, 275]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/even(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:1", "of": ":pipeline::even", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:2", "of": ":pipeline::odd", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/even(n)@formal_out", "of": "", "arguments": []}, "19:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:0", "of": "n", "parent": "19:4", "arguments": []}, "19:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:1", "of": ":pipeline::even", "parent": "19:4", "arguments": []}, "19:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:2", "of": ":pipeline::odd", "parent": "19:4", "arguments": []}, "19:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_out", "of": "", "parent": "19:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "17:7", "kind": "fallthrough"}, {"src": "17:7", "dst": "18:8", "kind": "true"}, {"src": "17:7", "dst": "19:4", "kind": "false"}, {"src": "18:8", "dst": "@exit", "kind": "return"}, {"src": "19:4", "dst": "@exit", "kind": "exception"}, {"src": "19:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "17:7"}, {"src": "17:7", "dst": "18:8"}, {"src": "17:7", "dst": "19:4"}], "ddg": [{"src": "@entry", "dst": "17:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "19:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "19:4", "var": "pipeline::odd", "prov": ["ssa"]}, {"src": "18:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "19:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "19:4/actual_out", "dst": "19:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "19:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "19:4/actual_in:0", "var": "pipeline::odd", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "19:4/actual_in:2", "var": "pipeline::odd", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "17:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "19:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "19:4", "var": "pipeline::odd", "prov": ["reaching-defs"]}], "summary": [{"src": "19:4/actual_in:0", "dst": "19:4/actual_out"}, {"src": "19:4/actual_in:1", "dst": "19:4/actual_out"}]}, "odd": {"name": "odd", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.odd", "id": "can://dataflow/python/pipeline.py/odd(n)", "kind": "function", "span": {"start": [22, 0], "end": [25, 22], "bytes": [278, 348]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "type": "int", "decorators": [], "start_line": 22, "end_line": 22, "start_column": 8, "end_column": 9}], "start_line": 22, "end_line": 25, "code_start_line": 23, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 7}, {"name": "even", "scope": "local", "kind": "function", "type": "even", "qualified_name": "pipeline.even", "is_builtin": false, "lineno": 25, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 25, "col_offset": 16}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 4, "body": {"25:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/odd(n)@25:11", "span": {"start": [25, 11], "end": [25, 22], "bytes": [337, 348]}, "callee": "can://dataflow/python/pipeline.py/even(n)", "parent": "25:4", "method_name": "even", "return_type": "bool", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp", "inferred_type": "int"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/odd(n)@entry", "arguments": []}, "23:7": {"kind": "branch", "id": "can://dataflow/python/pipeline.py/odd(n)@23:7", "span": {"start": [23, 7], "end": [23, 13], "bytes": [297, 303]}, "arguments": []}, "24:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/odd(n)@24:8", "span": {"start": [24, 8], "end": [24, 20], "bytes": [313, 325]}, "arguments": []}, "25:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4", "span": {"start": [25, 4], "end": [25, 22], "bytes": [330, 348]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/odd(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:1", "of": ":pipeline::even", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:2", "of": ":pipeline::odd", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_out", "of": "", "arguments": []}, "25:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:0", "of": "n", "parent": "25:4", "arguments": []}, "25:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:1", "of": ":pipeline::even", "parent": "25:4", "arguments": []}, "25:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:2", "of": ":pipeline::odd", "parent": "25:4", "arguments": []}, "25:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_out", "of": "", "parent": "25:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "23:7", "kind": "fallthrough"}, {"src": "23:7", "dst": "24:8", "kind": "true"}, {"src": "23:7", "dst": "25:4", "kind": "false"}, {"src": "24:8", "dst": "@exit", "kind": "return"}, {"src": "25:4", "dst": "@exit", "kind": "exception"}, {"src": "25:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "23:7"}, {"src": "23:7", "dst": "24:8"}, {"src": "23:7", "dst": "25:4"}], "ddg": [{"src": "@entry", "dst": "23:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "25:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "25:4", "var": "pipeline::even", "prov": ["ssa"]}, {"src": "24:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "25:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "25:4/actual_out", "dst": "25:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "25:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "25:4/actual_in:0", "var": "pipeline::even", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "25:4/actual_in:1", "var": "pipeline::even", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "23:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "25:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "25:4", "var": "pipeline::even", "prov": ["reaching-defs"]}], "summary": [{"src": "25:4/actual_in:0", "dst": "25:4/actual_out"}, {"src": "25:4/actual_in:2", "dst": "25:4/actual_out"}]}, "alias_flow": {"name": "alias_flow", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.alias_flow", "id": "can://dataflow/python/pipeline.py/alias_flow()", "kind": "function", "span": {"start": [36, 0], "end": [40, 18], "bytes": [468, 547]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 36, "end_line": 40, "code_start_line": 37, "accessed_symbols": [{"name": "p", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 38, "col_offset": 8}, {"name": "Box", "scope": "local", "kind": "class", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 37, "col_offset": 8}, {"name": "q", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 39, "col_offset": 4}, {"name": "p", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 40, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "p", "type": "Box", "initializer": "Box(10)", "scope": "function", "start_line": 37, "end_line": 37, "start_column": 4, "end_column": 5}, {"name": "q", "type": "Box", "initializer": "p", "scope": "function", "start_line": 38, "end_line": 38, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"37:8": {"kind": "call", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:8", "span": {"start": [37, 8], "end": [37, 15], "bytes": [494, 501]}, "callee": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "parent": "37:4", "method_name": "Box", "return_type": "Box", "is_constructor_call": true, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "10"}]}, "40:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:11", "span": {"start": [40, 11], "end": [40, 18], "bytes": [540, 547]}, "callee": "can://dataflow/python/pipeline.py/Box/get(self)", "parent": "40:4", "method_name": "get", "receiver_expr": "p", "receiver_type": "Box", "return_type": "int", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/alias_flow()@entry", "arguments": []}, "37:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4", "span": {"start": [37, 4], "end": [37, 15], "bytes": [490, 501]}, "arguments": []}, "38:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@38:4", "span": {"start": [38, 4], "end": [38, 9], "bytes": [506, 511]}, "arguments": []}, "39:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@39:4", "span": {"start": [39, 4], "end": [39, 16], "bytes": [516, 528]}, "arguments": []}, "40:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4", "span": {"start": [40, 4], "end": [40, 18], "bytes": [533, 547]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/alias_flow()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@formal_in:0", "of": ":pipeline::Box", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@formal_out", "of": "", "arguments": []}, "37:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:0", "of": "self", "parent": "37:4", "arguments": []}, "37:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:1", "of": "value", "parent": "37:4", "arguments": []}, "37:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:0", "of": "", "parent": "37:4", "arguments": []}, "37:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:1", "of": "self", "parent": "37:4", "arguments": []}, "40:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_in:0", "of": "self", "parent": "40:4", "arguments": []}, "40:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_out", "of": "", "parent": "40:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "37:4", "kind": "fallthrough"}, {"src": "37:4", "dst": "38:4", "kind": "fallthrough"}, {"src": "37:4", "dst": "@exit", "kind": "exception"}, {"src": "38:4", "dst": "39:4", "kind": "fallthrough"}, {"src": "39:4", "dst": "40:4", "kind": "fallthrough"}, {"src": "39:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "37:4"}, {"src": "37:4", "dst": "38:4"}, {"src": "37:4", "dst": "39:4"}, {"src": "39:4", "dst": "40:4"}], "ddg": [{"src": "@entry", "dst": "37:4", "var": "pipeline::Box", "prov": ["ssa"]}, {"src": "37:4", "dst": "38:4", "var": "p", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4", "var": "p", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4", "var": "p.get", "prov": ["ssa"]}, {"src": "38:4", "dst": "39:4", "var": "q", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4/actual_in:0", "var": "p", "prov": ["reaching-defs"]}, {"src": "37:4", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "37:4/actual_out:0", "dst": "37:4", "var": "", "prov": ["reaching-defs"]}, {"src": "37:4/actual_out:1", "dst": "37:4", "var": "self", "prov": ["reaching-defs"]}, {"src": "38:4", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "39:4", "dst": "40:4/actual_in:0", "var": "p", "prov": ["reaching-defs"]}, {"src": "40:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "40:4/actual_out", "dst": "40:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "37:4/actual_in:1", "var": "pipeline::Box", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "37:4", "var": "pipeline::Box", "prov": ["reaching-defs"]}, {"src": "38:4", "dst": "40:4", "var": "p.get", "prov": ["points-to"]}, {"src": "39:4", "dst": "40:4", "var": "p", "prov": ["points-to"]}, {"src": "@entry", "dst": "40:4", "var": "p.get", "prov": ["points-to"]}], "summary": [{"src": "37:4/actual_in:0", "dst": "37:4/actual_out:1"}, {"src": "37:4/actual_in:1", "dst": "37:4/actual_out:1"}, {"src": "40:4/actual_in:0", "dst": "40:4/actual_out"}]}, "make_adder": {"name": "make_adder", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.make_adder", "id": "can://dataflow/python/pipeline.py/make_adder(base)", "kind": "function", "span": {"start": [43, 0], "end": [46, 14], "bytes": [550, 626]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "base", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "type": "int", "decorators": [], "start_line": 43, "end_line": 43, "start_column": 15, "end_column": 19}], "start_line": 43, "end_line": 46, "code_start_line": 44, "accessed_symbols": [{"name": "add", "scope": "local", "kind": "function", "type": "add", "is_builtin": false, "lineno": 46, "col_offset": 11}, {"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 45, "col_offset": 15}, {"name": "base", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 45, "col_offset": 19}], "callables": {"add": {"name": "add", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.make_adder.add", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "kind": "function", "span": {"start": [44, 4], "end": [45, 23], "bytes": [576, 611]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "decorators": [], "start_line": 44, "end_line": 44, "start_column": 12, "end_column": 13}], "start_line": 44, "end_line": 45, "code_start_line": 45, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 45, "col_offset": 15}, {"name": "base", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 45, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@entry", "arguments": []}, "45:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@45:8", "span": {"start": [45, 8], "end": [45, 23], "bytes": [596, 611]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:1", "of": ":base", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "45:8", "kind": "fallthrough"}, {"src": "45:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "45:8"}], "ddg": [{"src": "@entry", "dst": "45:8", "var": "base", "prov": ["ssa"]}, {"src": "@entry", "dst": "45:8", "var": "x", "prov": ["ssa"]}, {"src": "45:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "45:8", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "45:8", "var": "base", "prov": ["reaching-defs"]}], "summary": []}}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/make_adder(base)@entry", "arguments": []}, "44:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/make_adder(base)@44:4", "span": {"start": [44, 4], "end": [45, 23], "bytes": [576, 611]}, "arguments": []}, "46:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/make_adder(base)@46:4", "span": {"start": [46, 4], "end": [46, 14], "bytes": [616, 626]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/make_adder(base)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "of": "base", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_out", "of": "", "arguments": []}, "44:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)@44:4/actual_in:0", "of": ":base", "parent": "44:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "44:4", "kind": "fallthrough"}, {"src": "44:4", "dst": "46:4", "kind": "fallthrough"}, {"src": "46:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "44:4"}, {"src": "@entry", "dst": "46:4"}], "ddg": [{"src": "@entry", "dst": "44:4", "var": "base", "prov": ["ssa"]}, {"src": "44:4", "dst": "46:4", "var": "add", "prov": ["ssa"]}, {"src": "46:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "44:4/actual_in:0", "var": "base", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "44:4", "var": "base", "prov": ["reaching-defs"]}], "summary": []}, "use_adder": {"name": "use_adder", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.use_adder", "id": "can://dataflow/python/pipeline.py/use_adder(n)", "kind": "function", "span": {"start": [49, 0], "end": [51, 18], "bytes": [629, 690]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:0", "decorators": [], "start_line": 49, "end_line": 49, "start_column": 14, "end_column": 15}], "start_line": 49, "end_line": 51, "code_start_line": 50, "accessed_symbols": [{"name": "make_adder", "scope": "local", "kind": "function", "type": "make_adder", "qualified_name": "pipeline.make_adder", "is_builtin": false, "lineno": 50, "col_offset": 11}, {"name": "add5", "scope": "local", "kind": "function", "type": "add", "is_builtin": false, "lineno": 51, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 51, "col_offset": 16}], "callables": {}, "types": {}, "local_variables": [{"name": "add5", "type": "add", "initializer": "make_adder(5)", "scope": "function", "start_line": 50, "end_line": 50, "start_column": 4, "end_column": 8}], "cyclomatic_complexity": 2, "body": {"50:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:11", "span": {"start": [50, 11], "end": [50, 24], "bytes": [658, 671]}, "callee": "can://dataflow/python/pipeline.py/make_adder(base)", "parent": "50:4", "method_name": "make_adder", "return_type": "add", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "5"}]}, "51:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:11", "span": {"start": [51, 11], "end": [51, 18], "bytes": [683, 690]}, "callee": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "parent": "51:4", "method_name": "add5", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/use_adder(n)@entry", "arguments": []}, "50:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4", "span": {"start": [50, 4], "end": [50, 24], "bytes": [651, 671]}, "arguments": []}, "51:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4", "span": {"start": [51, 4], "end": [51, 18], "bytes": [676, 690]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/use_adder(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:1", "of": ":pipeline::make_adder", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_out:1", "of": "n", "arguments": []}, "50:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_in:0", "of": "base", "parent": "50:4", "arguments": []}, "50:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_out", "of": "", "parent": "50:4", "arguments": []}, "51:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_in:0", "of": "x", "parent": "51:4", "arguments": []}, "51:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_out", "of": "", "parent": "51:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "50:4", "kind": "fallthrough"}, {"src": "50:4", "dst": "51:4", "kind": "fallthrough"}, {"src": "50:4", "dst": "@exit", "kind": "exception"}, {"src": "51:4", "dst": "@exit", "kind": "exception"}, {"src": "51:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "50:4"}, {"src": "50:4", "dst": "51:4"}], "ddg": [{"src": "@entry", "dst": "50:4", "var": "pipeline::make_adder", "prov": ["ssa"]}, {"src": "@entry", "dst": "51:4", "var": "n", "prov": ["ssa"]}, {"src": "50:4", "dst": "51:4", "var": "add5", "prov": ["ssa"]}, {"src": "50:4/actual_out", "dst": "50:4", "var": "", "prov": ["reaching-defs"]}, {"src": "51:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "51:4", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "51:4/actual_out", "dst": "51:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "50:4/actual_in:0", "var": "pipeline::make_adder", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "51:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "51:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "50:4", "var": "pipeline::make_adder", "prov": ["reaching-defs"]}], "summary": [{"src": "50:4/actual_in:0", "dst": "50:4/actual_out"}, {"src": "51:4/actual_in:0", "dst": "51:4/actual_out"}]}, "mutate": {"name": "mutate", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.mutate", "id": "can://dataflow/python/pipeline.py/mutate(items)", "kind": "function", "span": {"start": [54, 0], "end": [55, 19], "bytes": [693, 731]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "items", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "type": "list", "decorators": [], "start_line": 54, "end_line": 54, "start_column": 11, "end_column": 16}], "start_line": 54, "end_line": 55, "code_start_line": 55, "accessed_symbols": [{"name": "items", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": true, "lineno": 55, "col_offset": 4}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 1, "body": {"55:4": {"kind": "call", "id": "can://dataflow/python/pipeline.py/mutate(items)@55:4", "span": {"start": [55, 4], "end": [55, 19], "bytes": [716, 731]}, "callee": "can://dataflow/@external/builtins.list/append", "method_name": "append", "receiver_expr": "items", "receiver_type": "list", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "1"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/mutate(items)@entry", "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/mutate(items)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "of": "items", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:1", "of": "items", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "55:4", "kind": "fallthrough"}, {"src": "55:4", "dst": "@exit", "kind": "exception"}, {"src": "55:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "55:4"}], "ddg": [{"src": "@entry", "dst": "55:4", "var": "items", "prov": ["ssa"]}, {"src": "@entry", "dst": "55:4", "var": "items.append", "prov": ["ssa"]}, {"src": "55:4", "dst": "@formal_out:1", "var": "items.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "55:4", "var": "items", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "55:4", "var": "items.append", "prov": ["reaching-defs"]}], "summary": []}, "caller_of_mutate": {"name": "caller_of_mutate", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.caller_of_mutate", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()", "kind": "function", "span": {"start": [58, 0], "end": [61, 13], "bytes": [734, 798]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 58, "end_line": 61, "code_start_line": 59, "accessed_symbols": [{"name": "xs", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 61, "col_offset": 11}, {"name": "mutate", "scope": "local", "kind": "function", "type": "mutate", "qualified_name": "pipeline.mutate", "is_builtin": false, "lineno": 60, "col_offset": 4}, {"name": "xs", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 60, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "xs", "type": "list", "initializer": "[]", "scope": "function", "start_line": 59, "end_line": 59, "start_column": 4, "end_column": 6}], "cyclomatic_complexity": 2, "body": {"60:4": {"kind": "call", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4", "span": {"start": [60, 4], "end": [60, 14], "bytes": [774, 784]}, "callee": "can://dataflow/python/pipeline.py/mutate(items)", "method_name": "mutate", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "list", "name": "xs"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@entry", "arguments": []}, "59:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@59:4", "span": {"start": [59, 4], "end": [59, 11], "bytes": [762, 769]}, "arguments": []}, "61:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@61:4", "span": {"start": [61, 4], "end": [61, 13], "bytes": [789, 798]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@formal_in:0", "of": ":pipeline::mutate", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@formal_out", "of": "", "arguments": []}, "60:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_in:0", "of": "items", "parent": "60:4", "arguments": []}, "60:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:0", "of": "", "parent": "60:4", "arguments": []}, "60:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:1", "of": "items", "parent": "60:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "59:4", "kind": "fallthrough"}, {"src": "59:4", "dst": "60:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "61:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "@exit", "kind": "exception"}, {"src": "61:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "59:4"}, {"src": "@entry", "dst": "60:4"}, {"src": "60:4", "dst": "61:4"}], "ddg": [{"src": "@entry", "dst": "60:4", "var": "pipeline::mutate", "prov": ["ssa"]}, {"src": "59:4", "dst": "60:4", "var": "xs", "prov": ["ssa"]}, {"src": "59:4", "dst": "61:4", "var": "xs", "prov": ["ssa"]}, {"src": "60:4", "dst": "61:4", "var": "xs", "prov": ["ssa"]}, {"src": "59:4", "dst": "60:4/actual_in:0", "var": "xs", "prov": ["reaching-defs"]}, {"src": "60:4/actual_out:0", "dst": "60:4", "var": "", "prov": ["reaching-defs"]}, {"src": "60:4/actual_out:1", "dst": "60:4", "var": "items", "prov": ["reaching-defs"]}, {"src": "61:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "60:4", "var": "pipeline::mutate", "prov": ["reaching-defs"]}], "summary": [{"src": "60:4/actual_in:0", "dst": "60:4/actual_out:1"}]}}, "variables": [], "content_hash": "9ecfbafa73a36ed35c0625267ef7e5de9b9b949badaf6373171ad5f42acb37f4", "last_modified": 1787161494.129043, "file_size": 799}, "main.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "module_name": "main", "id": "can://dataflow/python/main.py", "kind": "module", "source": "\"\"\"Intraprocedural dataflow constructs with hand-computable graphs.\n\nEvery callable here is referenced by name in the level-3 gate tests\n(test_dataflow_*.py); keep line numbers stable when editing.\n\"\"\"\n\nfrom pipeline import chain_a\nfrom state import bump, read_counter\n\n\ndef branchy(n):\n if n > 0:\n x = n + 1\n else:\n x = -n\n return x\n\n\ndef looped(n):\n total = 0\n i = 0\n while i < n:\n total = total + i\n i = i + 1\n return total\n\n\ndef early_exit(n):\n if n < 0:\n return -1\n y = n * 2\n return y\n\n\ndef risky(n):\n if n < 0:\n raise ValueError(\"negative\")\n return n\n\n\ndef handles(n):\n try:\n v = risky(n)\n ok = 1\n except ValueError:\n v = 0\n ok = 0\n finally:\n done = True\n return v + ok\n\n\ndef with_block(path):\n with open(path) as fh:\n data = fh.read()\n return data\n\n\ndef comprehend(items):\n squares = [i * i for i in items]\n i = \"not-the-loop-var\"\n return squares, i\n\n\ndef gen(n):\n k = 0\n while k < n:\n yield k\n k = k + 1\n\n\nasync def slow(x):\n return x + 1\n\n\nasync def fetch(x):\n y = await slow(x)\n return y\n\n\ndef short_circuit(a, b):\n c = a and b\n d = a or b\n return c, d\n\n\ndef infinite():\n while True:\n pass\n\n\ndef drive(n):\n r = chain_a(n)\n bump(r)\n return read_counter()\n", "imports": [{"module": "pipeline", "name": "chain_a", "start_line": 7, "end_line": 7, "start_column": 0, "end_column": 28}, {"module": "state", "name": "bump", "start_line": 8, "end_line": 8, "start_column": 0, "end_column": 36}, {"module": "state", "name": "read_counter", "start_line": 8, "end_line": 8, "start_column": 0, "end_column": 36}], "comments": [{"content": "Intraprocedural dataflow constructs with hand-computable graphs.\n\nEvery callable here is referenced by name in the level-3 gate tests\n(test_dataflow_*.py); keep line numbers stable when editing.\n", "start_line": 1, "end_line": 5, "start_column": 0, "end_column": 3, "is_docstring": true}], "types": {}, "functions": {"branchy": {"name": "branchy", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.branchy", "id": "can://dataflow/python/main.py/branchy(n)", "kind": "function", "span": {"start": [11, 0], "end": [16, 12], "bytes": [271, 356]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/branchy(n)@formal_in:0", "decorators": [], "start_line": 11, "end_line": 11, "start_column": 12, "end_column": 13}], "start_line": 11, "end_line": 16, "code_start_line": 12, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 16, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 12, "col_offset": 7}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 13, "col_offset": 12}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 15, "col_offset": 13}], "callables": {}, "types": {}, "local_variables": [{"name": "x", "type": "int", "initializer": "n + 1", "scope": "function", "start_line": 13, "end_line": 13, "start_column": 8, "end_column": 9}, {"name": "x", "initializer": "-n", "scope": "function", "start_line": 15, "end_line": 15, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/branchy(n)@entry", "arguments": []}, "12:7": {"kind": "branch", "id": "can://dataflow/python/main.py/branchy(n)@12:7", "span": {"start": [12, 7], "end": [12, 12], "bytes": [294, 299]}, "arguments": []}, "13:8": {"kind": "statement", "id": "can://dataflow/python/main.py/branchy(n)@13:8", "span": {"start": [13, 8], "end": [13, 17], "bytes": [309, 318]}, "arguments": []}, "15:8": {"kind": "statement", "id": "can://dataflow/python/main.py/branchy(n)@15:8", "span": {"start": [15, 8], "end": [15, 14], "bytes": [337, 343]}, "arguments": []}, "16:4": {"kind": "return", "id": "can://dataflow/python/main.py/branchy(n)@16:4", "span": {"start": [16, 4], "end": [16, 12], "bytes": [348, 356]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/branchy(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/branchy(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/branchy(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "12:7", "kind": "fallthrough"}, {"src": "12:7", "dst": "13:8", "kind": "true"}, {"src": "12:7", "dst": "15:8", "kind": "false"}, {"src": "13:8", "dst": "16:4", "kind": "fallthrough"}, {"src": "15:8", "dst": "16:4", "kind": "fallthrough"}, {"src": "16:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "12:7"}, {"src": "@entry", "dst": "16:4"}, {"src": "12:7", "dst": "13:8"}, {"src": "12:7", "dst": "15:8"}], "ddg": [{"src": "@entry", "dst": "12:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "13:8", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "15:8", "var": "n", "prov": ["ssa"]}, {"src": "13:8", "dst": "16:4", "var": "x", "prov": ["ssa"]}, {"src": "15:8", "dst": "16:4", "var": "x", "prov": ["ssa"]}, {"src": "16:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "12:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "13:8", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "15:8", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "looped": {"name": "looped", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.looped", "id": "can://dataflow/python/main.py/looped(n)", "kind": "function", "span": {"start": [19, 0], "end": [25, 16], "bytes": [359, 475]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/looped(n)@formal_in:0", "decorators": [], "start_line": 19, "end_line": 19, "start_column": 11, "end_column": 12}], "start_line": 19, "end_line": 25, "code_start_line": 20, "accessed_symbols": [{"name": "total", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 25, "col_offset": 11}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 22, "col_offset": 10}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 22, "col_offset": 14}, {"name": "total", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 16}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 24}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 24, "col_offset": 12}], "callables": {}, "types": {}, "local_variables": [{"name": "total", "type": "int", "initializer": "0", "scope": "function", "start_line": 20, "end_line": 20, "start_column": 4, "end_column": 9}, {"name": "i", "type": "int", "initializer": "0", "scope": "function", "start_line": 21, "end_line": 21, "start_column": 4, "end_column": 5}, {"name": "total", "type": "int", "initializer": "total + i", "scope": "function", "start_line": 23, "end_line": 23, "start_column": 8, "end_column": 13}, {"name": "i", "type": "int", "initializer": "i + 1", "scope": "function", "start_line": 24, "end_line": 24, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/looped(n)@entry", "arguments": []}, "20:4": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@20:4", "span": {"start": [20, 4], "end": [20, 13], "bytes": [378, 387]}, "arguments": []}, "21:4": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@21:4", "span": {"start": [21, 4], "end": [21, 9], "bytes": [392, 397]}, "arguments": []}, "22:10": {"kind": "loop", "id": "can://dataflow/python/main.py/looped(n)@22:10", "span": {"start": [22, 10], "end": [22, 15], "bytes": [408, 413]}, "arguments": []}, "23:8": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@23:8", "span": {"start": [23, 8], "end": [23, 25], "bytes": [423, 440]}, "arguments": []}, "24:8": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@24:8", "span": {"start": [24, 8], "end": [24, 17], "bytes": [449, 458]}, "arguments": []}, "25:4": {"kind": "return", "id": "can://dataflow/python/main.py/looped(n)@25:4", "span": {"start": [25, 4], "end": [25, 16], "bytes": [463, 475]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/looped(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/looped(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/looped(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "20:4", "kind": "fallthrough"}, {"src": "20:4", "dst": "21:4", "kind": "fallthrough"}, {"src": "21:4", "dst": "22:10", "kind": "fallthrough"}, {"src": "22:10", "dst": "23:8", "kind": "true"}, {"src": "22:10", "dst": "25:4", "kind": "false"}, {"src": "23:8", "dst": "24:8", "kind": "fallthrough"}, {"src": "24:8", "dst": "22:10", "kind": "loop_back"}, {"src": "25:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "20:4"}, {"src": "@entry", "dst": "21:4"}, {"src": "@entry", "dst": "22:10"}, {"src": "@entry", "dst": "25:4"}, {"src": "22:10", "dst": "23:8"}, {"src": "22:10", "dst": "24:8"}], "ddg": [{"src": "@entry", "dst": "22:10", "var": "n", "prov": ["ssa"]}, {"src": "20:4", "dst": "23:8", "var": "total", "prov": ["ssa"]}, {"src": "20:4", "dst": "25:4", "var": "total", "prov": ["ssa"]}, {"src": "21:4", "dst": "22:10", "var": "i", "prov": ["ssa"]}, {"src": "21:4", "dst": "23:8", "var": "i", "prov": ["ssa"]}, {"src": "21:4", "dst": "24:8", "var": "i", "prov": ["ssa"]}, {"src": "23:8", "dst": "23:8", "var": "total", "prov": ["ssa"]}, {"src": "23:8", "dst": "25:4", "var": "total", "prov": ["ssa"]}, {"src": "24:8", "dst": "22:10", "var": "i", "prov": ["ssa"]}, {"src": "24:8", "dst": "23:8", "var": "i", "prov": ["ssa"]}, {"src": "24:8", "dst": "24:8", "var": "i", "prov": ["ssa"]}, {"src": "25:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "22:10", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "early_exit": {"name": "early_exit", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.early_exit", "id": "can://dataflow/python/main.py/early_exit(n)", "kind": "function", "span": {"start": [28, 0], "end": [32, 12], "bytes": [478, 555]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/early_exit(n)@formal_in:0", "decorators": [], "start_line": 28, "end_line": 28, "start_column": 15, "end_column": 16}], "start_line": 28, "end_line": 32, "code_start_line": 29, "accessed_symbols": [{"name": "y", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 32, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 29, "col_offset": 7}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 31, "col_offset": 8}], "callables": {}, "types": {}, "local_variables": [{"name": "y", "type": "int", "initializer": "n * 2", "scope": "function", "start_line": 31, "end_line": 31, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 4, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/early_exit(n)@entry", "arguments": []}, "29:7": {"kind": "branch", "id": "can://dataflow/python/main.py/early_exit(n)@29:7", "span": {"start": [29, 7], "end": [29, 12], "bytes": [504, 509]}, "arguments": []}, "30:8": {"kind": "return", "id": "can://dataflow/python/main.py/early_exit(n)@30:8", "span": {"start": [30, 8], "end": [30, 17], "bytes": [519, 528]}, "arguments": []}, "31:4": {"kind": "statement", "id": "can://dataflow/python/main.py/early_exit(n)@31:4", "span": {"start": [31, 4], "end": [31, 13], "bytes": [533, 542]}, "arguments": []}, "32:4": {"kind": "return", "id": "can://dataflow/python/main.py/early_exit(n)@32:4", "span": {"start": [32, 4], "end": [32, 12], "bytes": [547, 555]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/early_exit(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/early_exit(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/early_exit(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "29:7", "kind": "fallthrough"}, {"src": "29:7", "dst": "30:8", "kind": "true"}, {"src": "29:7", "dst": "31:4", "kind": "false"}, {"src": "30:8", "dst": "@exit", "kind": "return"}, {"src": "31:4", "dst": "32:4", "kind": "fallthrough"}, {"src": "32:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "29:7"}, {"src": "29:7", "dst": "30:8"}, {"src": "29:7", "dst": "31:4"}, {"src": "29:7", "dst": "32:4"}], "ddg": [{"src": "@entry", "dst": "29:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "31:4", "var": "n", "prov": ["ssa"]}, {"src": "31:4", "dst": "32:4", "var": "y", "prov": ["ssa"]}, {"src": "30:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "32:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "29:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "31:4", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "risky": {"name": "risky", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.risky", "id": "can://dataflow/python/main.py/risky(n)", "kind": "function", "span": {"start": [35, 0], "end": [38, 12], "bytes": [558, 635]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/risky(n)@formal_in:0", "decorators": [], "start_line": 35, "end_line": 35, "start_column": 10, "end_column": 11}], "start_line": 35, "end_line": 38, "code_start_line": 36, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 38, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 36, "col_offset": 7}, {"name": "ValueError", "scope": "local", "kind": "class", "type": "ValueError", "qualified_name": "builtins.ValueError", "is_builtin": false, "lineno": 37, "col_offset": 14}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {"37:14": {"kind": "call", "id": "can://dataflow/python/main.py/risky(n)@37:14", "span": {"start": [37, 14], "end": [37, 36], "bytes": [600, 622]}, "callee": "can://dataflow/@external/builtins.ValueError/__init__", "parent": "37:8", "method_name": "ValueError", "return_type": "ValueError", "is_constructor_call": true, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"negative\""}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/risky(n)@entry", "arguments": []}, "36:7": {"kind": "branch", "id": "can://dataflow/python/main.py/risky(n)@36:7", "span": {"start": [36, 7], "end": [36, 12], "bytes": [579, 584]}, "arguments": []}, "37:8": {"kind": "raise", "id": "can://dataflow/python/main.py/risky(n)@37:8", "span": {"start": [37, 8], "end": [37, 36], "bytes": [594, 622]}, "arguments": []}, "38:4": {"kind": "return", "id": "can://dataflow/python/main.py/risky(n)@38:4", "span": {"start": [38, 4], "end": [38, 12], "bytes": [627, 635]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/risky(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/risky(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/risky(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "36:7", "kind": "fallthrough"}, {"src": "36:7", "dst": "37:8", "kind": "true"}, {"src": "36:7", "dst": "38:4", "kind": "false"}, {"src": "37:8", "dst": "@exit", "kind": "exception"}, {"src": "38:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "36:7"}, {"src": "36:7", "dst": "37:8"}, {"src": "36:7", "dst": "38:4"}], "ddg": [{"src": "@entry", "dst": "36:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "37:8", "var": "ValueError", "prov": ["ssa"]}, {"src": "@entry", "dst": "38:4", "var": "n", "prov": ["ssa"]}, {"src": "38:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "36:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "38:4", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "handles": {"name": "handles", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.handles", "id": "can://dataflow/python/main.py/handles(n)", "kind": "function", "span": {"start": [41, 0], "end": [50, 17], "bytes": [638, 801]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/handles(n)@formal_in:0", "decorators": [], "start_line": 41, "end_line": 41, "start_column": 12, "end_column": 13}], "start_line": 41, "end_line": 50, "code_start_line": 42, "accessed_symbols": [{"name": "ValueError", "scope": "local", "kind": "class", "type": "ValueError", "qualified_name": "builtins.ValueError", "is_builtin": false, "lineno": 45, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 50, "col_offset": 11}, {"name": "ok", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 50, "col_offset": 15}, {"name": "risky", "scope": "local", "kind": "function", "type": "risky", "qualified_name": "main.risky", "is_builtin": false, "lineno": 43, "col_offset": 12}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 43, "col_offset": 18}], "callables": {}, "types": {}, "local_variables": [{"name": "v", "initializer": "risky(n)", "scope": "function", "start_line": 43, "end_line": 43, "start_column": 8, "end_column": 9}, {"name": "ok", "type": "int", "initializer": "1", "scope": "function", "start_line": 44, "end_line": 44, "start_column": 8, "end_column": 10}, {"name": "done", "type": "bool", "initializer": "True", "scope": "function", "start_line": 49, "end_line": 49, "start_column": 8, "end_column": 12}, {"name": "v", "type": "int", "initializer": "0", "scope": "function", "start_line": 46, "end_line": 46, "start_column": 8, "end_column": 9}, {"name": "ok", "type": "int", "initializer": "0", "scope": "function", "start_line": 47, "end_line": 47, "start_column": 8, "end_column": 10}], "cyclomatic_complexity": 4, "body": {"43:12": {"kind": "call", "id": "can://dataflow/python/main.py/handles(n)@43:12", "span": {"start": [43, 12], "end": [43, 20], "bytes": [675, 683]}, "callee": "can://dataflow/python/main.py/risky(n)", "parent": "43:8", "method_name": "risky", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/handles(n)@entry", "arguments": []}, "43:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@43:8", "span": {"start": [43, 8], "end": [43, 20], "bytes": [671, 683]}, "arguments": []}, "44:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@44:8", "span": {"start": [44, 8], "end": [44, 14], "bytes": [692, 698]}, "arguments": []}, "45:4": {"kind": "handler", "id": "can://dataflow/python/main.py/handles(n)@45:4", "span": {"start": [45, 4], "end": [45, 21], "bytes": [703, 720]}, "arguments": []}, "46:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@46:8", "span": {"start": [46, 8], "end": [46, 13], "bytes": [730, 735]}, "arguments": []}, "47:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@47:8", "span": {"start": [47, 8], "end": [47, 14], "bytes": [744, 750]}, "arguments": []}, "49:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@49:8", "span": {"start": [49, 8], "end": [49, 19], "bytes": [772, 783]}, "arguments": []}, "50:4": {"kind": "return", "id": "can://dataflow/python/main.py/handles(n)@50:4", "span": {"start": [50, 4], "end": [50, 17], "bytes": [788, 801]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/handles(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/handles(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/handles(n)@formal_in:1", "of": ":main::risky", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/handles(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/handles(n)@formal_out:1", "of": "n", "arguments": []}, "43:8/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/handles(n)@43:8/actual_in:0", "of": "n", "parent": "43:8", "arguments": []}, "43:8/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/handles(n)@43:8/actual_out", "of": "", "parent": "43:8", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "43:8", "kind": "fallthrough"}, {"src": "43:8", "dst": "44:8", "kind": "fallthrough"}, {"src": "43:8", "dst": "45:4", "kind": "exception"}, {"src": "44:8", "dst": "49:8", "kind": "fallthrough"}, {"src": "45:4", "dst": "46:8", "kind": "true"}, {"src": "45:4", "dst": "49:8", "kind": "exception"}, {"src": "45:4", "dst": "@exit", "kind": "exception"}, {"src": "46:8", "dst": "47:8", "kind": "fallthrough"}, {"src": "47:8", "dst": "49:8", "kind": "fallthrough"}, {"src": "49:8", "dst": "50:4", "kind": "fallthrough"}, {"src": "49:8", "dst": "@exit", "kind": "exception"}, {"src": "50:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "43:8"}, {"src": "43:8", "dst": "44:8"}, {"src": "43:8", "dst": "45:4"}, {"src": "43:8", "dst": "49:8"}, {"src": "45:4", "dst": "46:8"}, {"src": "45:4", "dst": "47:8"}, {"src": "45:4", "dst": "49:8"}, {"src": "49:8", "dst": "50:4"}], "ddg": [{"src": "@entry", "dst": "43:8", "var": "main::risky", "prov": ["ssa"]}, {"src": "@entry", "dst": "43:8", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "45:4", "var": "ValueError", "prov": ["ssa"]}, {"src": "43:8", "dst": "50:4", "var": "v", "prov": ["ssa"]}, {"src": "44:8", "dst": "50:4", "var": "ok", "prov": ["ssa"]}, {"src": "46:8", "dst": "50:4", "var": "v", "prov": ["ssa"]}, {"src": "47:8", "dst": "50:4", "var": "ok", "prov": ["ssa"]}, {"src": "43:8", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "43:8/actual_out", "dst": "43:8", "var": "", "prov": ["reaching-defs"]}, {"src": "50:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "43:8/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "43:8", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "43:8", "var": "main::risky", "prov": ["reaching-defs"]}, {"src": "43:8", "dst": "45:4", "var": "ValueError", "prov": ["points-to"]}, {"src": "43:8", "dst": "50:4", "var": "ok", "prov": ["points-to"]}], "summary": [{"src": "43:8/actual_in:0", "dst": "43:8/actual_out"}]}, "with_block": {"name": "with_block", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.with_block", "id": "can://dataflow/python/main.py/with_block(path)", "kind": "function", "span": {"start": [53, 0], "end": [56, 15], "bytes": [804, 893]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "path", "id": "can://dataflow/python/main.py/with_block(path)@formal_in:0", "decorators": [], "start_line": 53, "end_line": 53, "start_column": 15, "end_column": 19}], "start_line": 53, "end_line": 56, "code_start_line": 54, "accessed_symbols": [{"name": "data", "scope": "local", "kind": "variable", "type": "bytes", "qualified_name": "builtins.bytes", "is_builtin": false, "lineno": 56, "col_offset": 11}, {"name": "open", "scope": "local", "kind": "function", "type": "open", "qualified_name": "builtins.open", "is_builtin": false, "lineno": 54, "col_offset": 9}, {"name": "path", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 54, "col_offset": 14}, {"name": "fh", "scope": "local", "kind": "variable", "type": "BufferedRandom", "qualified_name": "io.BufferedRandom", "is_builtin": false, "lineno": 55, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [{"name": "data", "type": "bytes", "initializer": "fh.read()", "scope": "function", "start_line": 55, "end_line": 55, "start_column": 8, "end_column": 12}], "cyclomatic_complexity": 3, "body": {"54:9": {"kind": "call", "id": "can://dataflow/python/main.py/with_block(path)@54:9", "span": {"start": [54, 9], "end": [54, 19], "bytes": [835, 845]}, "callee": "can://dataflow/@external/builtins/open", "parent": "54:4", "method_name": "open", "return_type": "BufferedRandom", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "path"}]}, "55:15": {"kind": "call", "id": "can://dataflow/python/main.py/with_block(path)@55:15", "span": {"start": [55, 15], "end": [55, 24], "bytes": [868, 877]}, "callee": "can://dataflow/@external/builtins._TextIOBase/read", "parent": "55:8", "method_name": "read", "receiver_expr": "fh", "receiver_type": "BufferedRandom", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/with_block(path)@entry", "arguments": []}, "54:4": {"kind": "statement", "id": "can://dataflow/python/main.py/with_block(path)@54:4", "span": {"start": [54, 4], "end": [54, 19], "bytes": [830, 845]}, "arguments": []}, "55:8": {"kind": "statement", "id": "can://dataflow/python/main.py/with_block(path)@55:8", "span": {"start": [55, 8], "end": [55, 24], "bytes": [861, 877]}, "arguments": []}, "56:4": {"kind": "return", "id": "can://dataflow/python/main.py/with_block(path)@56:4", "span": {"start": [56, 4], "end": [56, 15], "bytes": [882, 893]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/with_block(path)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/with_block(path)@formal_in:0", "of": "path", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/with_block(path)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/with_block(path)@formal_out:1", "of": "path", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "54:4", "kind": "fallthrough"}, {"src": "54:4", "dst": "55:8", "kind": "fallthrough"}, {"src": "54:4", "dst": "@exit", "kind": "exception"}, {"src": "55:8", "dst": "56:4", "kind": "fallthrough"}, {"src": "55:8", "dst": "@exit", "kind": "exception"}, {"src": "56:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "54:4"}, {"src": "54:4", "dst": "55:8"}, {"src": "55:8", "dst": "56:4"}], "ddg": [{"src": "@entry", "dst": "54:4", "var": "open", "prov": ["ssa"]}, {"src": "@entry", "dst": "54:4", "var": "path", "prov": ["ssa"]}, {"src": "54:4", "dst": "55:8", "var": "fh", "prov": ["ssa"]}, {"src": "54:4", "dst": "55:8", "var": "fh.read", "prov": ["ssa"]}, {"src": "55:8", "dst": "56:4", "var": "data", "prov": ["ssa"]}, {"src": "54:4", "dst": "@formal_out:1", "var": "path.*", "prov": ["reaching-defs"]}, {"src": "56:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "54:4", "var": "path", "prov": ["reaching-defs"]}, {"src": "54:4", "dst": "56:4", "var": "data", "prov": ["points-to"]}, {"src": "@entry", "dst": "55:8", "var": "fh.read", "prov": ["points-to"]}], "summary": []}, "comprehend": {"name": "comprehend", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.comprehend", "id": "can://dataflow/python/main.py/comprehend(items)", "kind": "function", "span": {"start": [59, 0], "end": [62, 21], "bytes": [896, 1004]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "items", "id": "can://dataflow/python/main.py/comprehend(items)@formal_in:0", "decorators": [], "start_line": 59, "end_line": 59, "start_column": 15, "end_column": 20}], "start_line": 59, "end_line": 62, "code_start_line": 60, "accessed_symbols": [{"name": "squares", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 62, "col_offset": 11}, {"name": "i", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 62, "col_offset": 20}, {"name": "i", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 60, "col_offset": 15}, {"name": "i", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 60, "col_offset": 19}, {"name": "items", "scope": "local", "kind": "variable", "is_builtin": true, "lineno": 60, "col_offset": 30}], "callables": {}, "types": {}, "local_variables": [{"name": "squares", "type": "list", "initializer": "[i * i for i in items]", "scope": "function", "start_line": 60, "end_line": 60, "start_column": 4, "end_column": 11}, {"name": "i", "type": "str", "initializer": "'not-the-loop-var'", "scope": "function", "start_line": 61, "end_line": 61, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/comprehend(items)@entry", "arguments": []}, "60:4": {"kind": "statement", "id": "can://dataflow/python/main.py/comprehend(items)@60:4", "span": {"start": [60, 4], "end": [60, 36], "bytes": [923, 955]}, "arguments": []}, "61:4": {"kind": "statement", "id": "can://dataflow/python/main.py/comprehend(items)@61:4", "span": {"start": [61, 4], "end": [61, 26], "bytes": [960, 982]}, "arguments": []}, "62:4": {"kind": "return", "id": "can://dataflow/python/main.py/comprehend(items)@62:4", "span": {"start": [62, 4], "end": [62, 21], "bytes": [987, 1004]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/comprehend(items)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/comprehend(items)@formal_in:0", "of": "items", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/comprehend(items)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "60:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "61:4", "kind": "fallthrough"}, {"src": "61:4", "dst": "62:4", "kind": "fallthrough"}, {"src": "62:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "60:4"}, {"src": "@entry", "dst": "61:4"}, {"src": "@entry", "dst": "62:4"}], "ddg": [{"src": "@entry", "dst": "60:4", "var": "items", "prov": ["ssa"]}, {"src": "60:4", "dst": "62:4", "var": "squares", "prov": ["ssa"]}, {"src": "61:4", "dst": "62:4", "var": "i", "prov": ["ssa"]}, {"src": "62:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "60:4", "var": "items", "prov": ["reaching-defs"]}], "summary": []}, "gen": {"name": "gen", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.gen", "id": "can://dataflow/python/main.py/gen(n)", "kind": "function", "span": {"start": [65, 0], "end": [69, 17], "bytes": [1007, 1079]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/gen(n)@formal_in:0", "decorators": [], "start_line": 65, "end_line": 65, "start_column": 8, "end_column": 9}], "start_line": 65, "end_line": 69, "code_start_line": 66, "accessed_symbols": [{"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 67, "col_offset": 10}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 67, "col_offset": 14}, {"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 68, "col_offset": 14}, {"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 69, "col_offset": 12}], "callables": {}, "types": {}, "local_variables": [{"name": "k", "type": "int", "initializer": "0", "scope": "function", "start_line": 66, "end_line": 66, "start_column": 4, "end_column": 5}, {"name": "k", "type": "int", "initializer": "k + 1", "scope": "function", "start_line": 69, "end_line": 69, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/gen(n)@entry", "arguments": []}, "66:4": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@66:4", "span": {"start": [66, 4], "end": [66, 9], "bytes": [1023, 1028]}, "arguments": []}, "67:10": {"kind": "loop", "id": "can://dataflow/python/main.py/gen(n)@67:10", "span": {"start": [67, 10], "end": [67, 15], "bytes": [1039, 1044]}, "arguments": []}, "68:8": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@68:8", "span": {"start": [68, 8], "end": [68, 15], "bytes": [1054, 1061]}, "arguments": []}, "69:8": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@69:8", "span": {"start": [69, 8], "end": [69, 17], "bytes": [1070, 1079]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/gen(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/gen(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/gen(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "66:4", "kind": "fallthrough"}, {"src": "66:4", "dst": "67:10", "kind": "fallthrough"}, {"src": "67:10", "dst": "68:8", "kind": "true"}, {"src": "67:10", "dst": "@exit", "kind": "return"}, {"src": "68:8", "dst": "69:8", "kind": "yield"}, {"src": "68:8", "dst": "@exit", "kind": "yield"}, {"src": "69:8", "dst": "67:10", "kind": "loop_back"}], "cdg": [{"src": "@entry", "dst": "66:4"}, {"src": "67:10", "dst": "68:8"}, {"src": "68:8", "dst": "67:10"}, {"src": "68:8", "dst": "69:8"}], "ddg": [{"src": "@entry", "dst": "67:10", "var": "n", "prov": ["ssa"]}, {"src": "66:4", "dst": "67:10", "var": "k", "prov": ["ssa"]}, {"src": "66:4", "dst": "68:8", "var": "k", "prov": ["ssa"]}, {"src": "66:4", "dst": "69:8", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "67:10", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "68:8", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "69:8", "var": "k", "prov": ["ssa"]}, {"src": "@formal_in:0", "dst": "67:10", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "slow": {"name": "slow", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.slow", "id": "can://dataflow/python/main.py/slow(x)", "kind": "function", "span": {"start": [72, 0], "end": [73, 16], "bytes": [1082, 1117]}, "comments": [], "decorators": [], "modifiers": ["async"], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/main.py/slow(x)@formal_in:0", "decorators": [], "start_line": 72, "end_line": 72, "start_column": 15, "end_column": 16}], "start_line": 72, "end_line": 73, "code_start_line": 73, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 73, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/slow(x)@entry", "arguments": []}, "73:4": {"kind": "return", "id": "can://dataflow/python/main.py/slow(x)@73:4", "span": {"start": [73, 4], "end": [73, 16], "bytes": [1105, 1117]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/slow(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/slow(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/slow(x)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "73:4", "kind": "fallthrough"}, {"src": "73:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "73:4"}], "ddg": [{"src": "@entry", "dst": "73:4", "var": "x", "prov": ["ssa"]}, {"src": "73:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "73:4", "var": "x", "prov": ["reaching-defs"]}], "summary": []}, "fetch": {"name": "fetch", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.fetch", "id": "can://dataflow/python/main.py/fetch(x)", "kind": "function", "span": {"start": [76, 0], "end": [78, 12], "bytes": [1120, 1174]}, "comments": [], "decorators": [], "modifiers": ["async"], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:0", "decorators": [], "start_line": 76, "end_line": 76, "start_column": 16, "end_column": 17}], "start_line": 76, "end_line": 78, "code_start_line": 77, "accessed_symbols": [{"name": "y", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 78, "col_offset": 11}, {"name": "slow", "scope": "local", "kind": "function", "type": "slow", "qualified_name": "main.slow", "is_builtin": false, "lineno": 77, "col_offset": 14}, {"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 77, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [{"name": "y", "type": "int", "initializer": "await slow(x)", "scope": "function", "start_line": 77, "end_line": 77, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"77:14": {"kind": "call", "id": "can://dataflow/python/main.py/fetch(x)@77:14", "span": {"start": [77, 14], "end": [77, 21], "bytes": [1154, 1161]}, "callee": "can://dataflow/python/main.py/slow(x)", "parent": "77:4", "method_name": "slow", "return_type": "Coroutine", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "x"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/fetch(x)@entry", "arguments": []}, "77:4": {"kind": "statement", "id": "can://dataflow/python/main.py/fetch(x)@77:4", "span": {"start": [77, 4], "end": [77, 21], "bytes": [1144, 1161]}, "arguments": []}, "78:4": {"kind": "return", "id": "can://dataflow/python/main.py/fetch(x)@78:4", "span": {"start": [78, 4], "end": [78, 12], "bytes": [1166, 1174]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/fetch(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:1", "of": ":main::slow", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/fetch(x)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/fetch(x)@formal_out:1", "of": "x", "arguments": []}, "77:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/fetch(x)@77:4/actual_in:0", "of": "x", "parent": "77:4", "arguments": []}, "77:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/fetch(x)@77:4/actual_out", "of": "", "parent": "77:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "77:4", "kind": "fallthrough"}, {"src": "77:4", "dst": "78:4", "kind": "await_resume"}, {"src": "77:4", "dst": "@exit", "kind": "exception"}, {"src": "78:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "77:4"}, {"src": "77:4", "dst": "78:4"}], "ddg": [{"src": "@entry", "dst": "77:4", "var": "main::slow", "prov": ["ssa"]}, {"src": "@entry", "dst": "77:4", "var": "x", "prov": ["ssa"]}, {"src": "77:4", "dst": "78:4", "var": "y", "prov": ["ssa"]}, {"src": "77:4", "dst": "@formal_out:1", "var": "x.*", "prov": ["reaching-defs"]}, {"src": "77:4/actual_out", "dst": "77:4", "var": "", "prov": ["reaching-defs"]}, {"src": "78:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "77:4/actual_in:0", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "77:4", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "77:4", "var": "main::slow", "prov": ["reaching-defs"]}], "summary": [{"src": "77:4/actual_in:0", "dst": "77:4/actual_out"}]}, "short_circuit": {"name": "short_circuit", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.short_circuit", "id": "can://dataflow/python/main.py/short_circuit(a,b)", "kind": "function", "span": {"start": [81, 0], "end": [84, 15], "bytes": [1177, 1248]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "a", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:0", "decorators": [], "start_line": 81, "end_line": 81, "start_column": 18, "end_column": 19}, {"name": "b", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:1", "decorators": [], "start_line": 81, "end_line": 81, "start_column": 21, "end_column": 22}], "start_line": 81, "end_line": 84, "code_start_line": 82, "accessed_symbols": [{"name": "a", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 82, "col_offset": 8}, {"name": "b", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 82, "col_offset": 14}, {"name": "a", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 83, "col_offset": 8}, {"name": "b", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 83, "col_offset": 13}, {"name": "c", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 84, "col_offset": 11}, {"name": "d", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 84, "col_offset": 14}], "callables": {}, "types": {}, "local_variables": [{"name": "c", "initializer": "a and b", "scope": "function", "start_line": 82, "end_line": 82, "start_column": 4, "end_column": 5}, {"name": "d", "initializer": "a or b", "scope": "function", "start_line": 83, "end_line": 83, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 4, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/short_circuit(a,b)@entry", "arguments": []}, "82:4": {"kind": "statement", "id": "can://dataflow/python/main.py/short_circuit(a,b)@82:4", "span": {"start": [82, 4], "end": [82, 15], "bytes": [1206, 1217]}, "arguments": []}, "83:4": {"kind": "statement", "id": "can://dataflow/python/main.py/short_circuit(a,b)@83:4", "span": {"start": [83, 4], "end": [83, 14], "bytes": [1222, 1232]}, "arguments": []}, "84:4": {"kind": "return", "id": "can://dataflow/python/main.py/short_circuit(a,b)@84:4", "span": {"start": [84, 4], "end": [84, 15], "bytes": [1237, 1248]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/short_circuit(a,b)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:0", "of": "a", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:1", "of": "b", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "82:4", "kind": "fallthrough"}, {"src": "82:4", "dst": "83:4", "kind": "fallthrough"}, {"src": "83:4", "dst": "84:4", "kind": "fallthrough"}, {"src": "84:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "82:4"}, {"src": "@entry", "dst": "83:4"}, {"src": "@entry", "dst": "84:4"}], "ddg": [{"src": "@entry", "dst": "82:4", "var": "a", "prov": ["ssa"]}, {"src": "@entry", "dst": "82:4", "var": "b", "prov": ["ssa"]}, {"src": "@entry", "dst": "83:4", "var": "a", "prov": ["ssa"]}, {"src": "@entry", "dst": "83:4", "var": "b", "prov": ["ssa"]}, {"src": "82:4", "dst": "84:4", "var": "c", "prov": ["ssa"]}, {"src": "83:4", "dst": "84:4", "var": "d", "prov": ["ssa"]}, {"src": "84:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "82:4", "var": "a", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "83:4", "var": "a", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "82:4", "var": "b", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "83:4", "var": "b", "prov": ["reaching-defs"]}], "summary": []}, "infinite": {"name": "infinite", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.infinite", "id": "can://dataflow/python/main.py/infinite()", "kind": "function", "span": {"start": [87, 0], "end": [89, 12], "bytes": [1251, 1295]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 87, "end_line": 89, "code_start_line": 88, "accessed_symbols": [], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/infinite()@entry", "arguments": []}, "88:10": {"kind": "loop", "id": "can://dataflow/python/main.py/infinite()@88:10", "span": {"start": [88, 10], "end": [88, 14], "bytes": [1277, 1281]}, "arguments": []}, "89:8": {"kind": "statement", "id": "can://dataflow/python/main.py/infinite()@89:8", "span": {"start": [89, 8], "end": [89, 12], "bytes": [1291, 1295]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/infinite()@exit", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/infinite()@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "88:10", "kind": "fallthrough"}, {"src": "88:10", "dst": "89:8", "kind": "true"}, {"src": "88:10", "dst": "@exit", "kind": "exception"}, {"src": "89:8", "dst": "88:10", "kind": "loop_back"}], "cdg": [{"src": "@entry", "dst": "88:10"}, {"src": "88:10", "dst": "89:8"}], "ddg": [], "summary": []}, "drive": {"name": "drive", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.drive", "id": "can://dataflow/python/main.py/drive(n)", "kind": "function", "span": {"start": [92, 0], "end": [95, 25], "bytes": [1298, 1368]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/drive(n)@formal_in:0", "decorators": [], "start_line": 92, "end_line": 92, "start_column": 10, "end_column": 11}], "start_line": 92, "end_line": 95, "code_start_line": 93, "accessed_symbols": [{"name": "chain_a", "scope": "local", "kind": "function", "type": "chain_a", "qualified_name": "pipeline.chain_a", "is_builtin": false, "lineno": 93, "col_offset": 8}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 93, "col_offset": 16}, {"name": "bump", "scope": "local", "kind": "function", "type": "bump", "qualified_name": "state.bump", "is_builtin": false, "lineno": 94, "col_offset": 4}, {"name": "r", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 94, "col_offset": 9}, {"name": "read_counter", "scope": "local", "kind": "function", "type": "read_counter", "qualified_name": "state.read_counter", "is_builtin": false, "lineno": 95, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "r", "type": "int", "initializer": "chain_a(n)", "scope": "function", "start_line": 93, "end_line": 93, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"93:8": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@93:8", "span": {"start": [93, 8], "end": [93, 18], "bytes": [1320, 1330]}, "callee": "can://dataflow/python/pipeline.py/chain_a(v)", "parent": "93:4", "method_name": "chain_a", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "94:4": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@94:4", "span": {"start": [94, 4], "end": [94, 11], "bytes": [1335, 1342]}, "callee": "can://dataflow/python/state.py/bump(amount)", "method_name": "bump", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "int", "name": "r"}]}, "95:11": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@95:11", "span": {"start": [95, 11], "end": [95, 25], "bytes": [1354, 1368]}, "callee": "can://dataflow/python/state.py/read_counter()", "parent": "95:4", "method_name": "read_counter", "return_type": "int", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/drive(n)@entry", "arguments": []}, "93:4": {"kind": "statement", "id": "can://dataflow/python/main.py/drive(n)@93:4", "span": {"start": [93, 4], "end": [93, 18], "bytes": [1316, 1330]}, "arguments": []}, "95:4": {"kind": "return", "id": "can://dataflow/python/main.py/drive(n)@95:4", "span": {"start": [95, 4], "end": [95, 25], "bytes": [1347, 1368]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/drive(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:1", "of": ":main::bump", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:2", "of": ":main::chain_a", "arguments": []}, "@formal_in:3": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:3", "of": ":main::read_counter", "arguments": []}, "@formal_in:4": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:4", "of": ":pipeline::chain_b", "arguments": []}, "@formal_in:5": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:5", "of": ":pipeline::chain_c", "arguments": []}, "@formal_in:6": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:6", "of": ":state::counter", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:1", "of": "n", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:2", "of": ":state::counter", "arguments": []}, "93:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:0", "of": "v", "parent": "93:4", "arguments": []}, "93:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:1", "of": ":pipeline::chain_b", "parent": "93:4", "arguments": []}, "93:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:2", "of": ":pipeline::chain_c", "parent": "93:4", "arguments": []}, "93:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_out", "of": "", "parent": "93:4", "arguments": []}, "94:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:0", "of": "amount", "parent": "94:4", "arguments": []}, "94:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:1", "of": ":state::counter", "parent": "94:4", "arguments": []}, "94:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:0", "of": "", "parent": "94:4", "arguments": []}, "94:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:1", "of": ":state::counter", "parent": "94:4", "arguments": []}, "95:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@95:4/actual_in:0", "of": ":state::counter", "parent": "95:4", "arguments": []}, "95:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@95:4/actual_out", "of": "", "parent": "95:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "93:4", "kind": "fallthrough"}, {"src": "93:4", "dst": "94:4", "kind": "fallthrough"}, {"src": "93:4", "dst": "@exit", "kind": "exception"}, {"src": "94:4", "dst": "95:4", "kind": "fallthrough"}, {"src": "94:4", "dst": "@exit", "kind": "exception"}, {"src": "95:4", "dst": "@exit", "kind": "exception"}, {"src": "95:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "93:4"}, {"src": "93:4", "dst": "94:4"}, {"src": "94:4", "dst": "95:4"}], "ddg": [{"src": "@entry", "dst": "93:4", "var": "main::chain_a", "prov": ["ssa"]}, {"src": "@entry", "dst": "93:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "94:4", "var": "main::bump", "prov": ["ssa"]}, {"src": "@entry", "dst": "95:4", "var": "main::read_counter", "prov": ["ssa"]}, {"src": "93:4", "dst": "94:4", "var": "r", "prov": ["ssa"]}, {"src": "93:4", "dst": "94:4/actual_in:0", "var": "r", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "94:4/actual_in:1", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "95:4/actual_in:0", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "93:4/actual_out", "dst": "93:4", "var": "", "prov": ["reaching-defs"]}, {"src": "94:4", "dst": "95:4/actual_in:0", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "94:4", "dst": "@formal_out:2", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "94:4/actual_out:0", "dst": "94:4", "var": "", "prov": ["reaching-defs"]}, {"src": "94:4/actual_out:1", "dst": "94:4", "var": ":state::counter", "prov": ["reaching-defs"]}, {"src": "95:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "95:4/actual_out", "dst": "95:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "93:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "93:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "94:4", "var": "main::bump", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "93:4", "var": "main::chain_a", "prov": ["reaching-defs"]}, {"src": "@formal_in:3", "dst": "95:4", "var": "main::read_counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "94:4", "var": "main::bump", "prov": ["points-to"]}, {"src": "93:4", "dst": "95:4", "var": "main::read_counter", "prov": ["points-to"]}, {"src": "94:4", "dst": "95:4", "var": "main::read_counter", "prov": ["points-to"]}], "summary": [{"src": "93:4/actual_in:0", "dst": "93:4/actual_out"}, {"src": "93:4/actual_in:1", "dst": "93:4/actual_out"}, {"src": "94:4/actual_in:0", "dst": "94:4/actual_out:1"}, {"src": "94:4/actual_in:1", "dst": "94:4/actual_out:1"}, {"src": "95:4/actual_in:0", "dst": "95:4/actual_out"}]}}, "variables": [], "content_hash": "97a98d89de2934a3283e7250fa9f75541406ca4dec26f373cfc6162c1eedb345", "last_modified": 1787161494.1287842, "file_size": 1369}, "state.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "module_name": "state", "id": "can://dataflow/python/state.py", "kind": "module", "source": "\"\"\"Module-global fixture: written in one function, read in another.\"\"\"\n\ncounter = 0\n\n\ndef bump(amount):\n global counter\n counter = counter + amount\n\n\ndef read_counter():\n return counter\n", "imports": [], "comments": [{"content": "Module-global fixture: written in one function, read in another.", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 70, "is_docstring": true}], "types": {}, "functions": {"bump": {"name": "bump", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "signature": "state.bump", "id": "can://dataflow/python/state.py/bump(amount)", "kind": "function", "span": {"start": [6, 0], "end": [8, 30], "bytes": [86, 153]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "amount", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "type": "int", "decorators": [], "start_line": 6, "end_line": 6, "start_column": 9, "end_column": 15}], "start_line": 6, "end_line": 8, "code_start_line": 7, "accessed_symbols": [{"name": "counter", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 8, "col_offset": 14}, {"name": "amount", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 8, "col_offset": 24}], "callables": {}, "types": {}, "local_variables": [{"name": "counter", "type": "int", "initializer": "counter + amount", "scope": "function", "start_line": 8, "end_line": 8, "start_column": 4, "end_column": 11}], "cyclomatic_complexity": 1, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/state.py/bump(amount)@entry", "arguments": []}, "7:4": {"kind": "statement", "id": "can://dataflow/python/state.py/bump(amount)@7:4", "span": {"start": [7, 4], "end": [7, 18], "bytes": [108, 122]}, "arguments": []}, "8:4": {"kind": "statement", "id": "can://dataflow/python/state.py/bump(amount)@8:4", "span": {"start": [8, 4], "end": [8, 30], "bytes": [127, 153]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/state.py/bump(amount)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "of": "amount", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:1", "of": ":state::counter", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/state.py/bump(amount)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/state.py/bump(amount)@formal_out:1", "of": ":state::counter", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "7:4", "kind": "fallthrough"}, {"src": "7:4", "dst": "8:4", "kind": "fallthrough"}, {"src": "8:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "7:4"}, {"src": "@entry", "dst": "8:4"}], "ddg": [{"src": "@entry", "dst": "8:4", "var": "amount", "prov": ["ssa"]}, {"src": "@entry", "dst": "8:4", "var": "state::counter", "prov": ["ssa"]}, {"src": "8:4", "dst": "@formal_out:1", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "8:4", "var": "amount", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "8:4", "var": "state::counter", "prov": ["reaching-defs"]}], "summary": []}, "read_counter": {"name": "read_counter", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "signature": "state.read_counter", "id": "can://dataflow/python/state.py/read_counter()", "kind": "function", "span": {"start": [11, 0], "end": [12, 18], "bytes": [156, 194]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 11, "end_line": 12, "code_start_line": 12, "accessed_symbols": [{"name": "counter", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 12, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/state.py/read_counter()@entry", "arguments": []}, "12:4": {"kind": "return", "id": "can://dataflow/python/state.py/read_counter()@12:4", "span": {"start": [12, 4], "end": [12, 18], "bytes": [180, 194]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/state.py/read_counter()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/state.py/read_counter()@formal_in:0", "of": ":state::counter", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/state.py/read_counter()@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "12:4", "kind": "fallthrough"}, {"src": "12:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "12:4"}], "ddg": [{"src": "@entry", "dst": "12:4", "var": "state::counter", "prov": ["ssa"]}, {"src": "12:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "12:4", "var": "state::counter", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [{"name": "counter", "type": "int", "initializer": "0", "scope": "module", "start_line": 3, "end_line": 3, "start_column": 0, "end_column": 7}], "content_hash": "ed5faf88840cf6524a85cf636eb740c739de3f3ad7af8e2f8e0b7d56cdc16178", "last_modified": 1787161494.1292224, "file_size": 195}}, "id": "can://dataflow", "kind": "application", "call_graph": [{"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/pipeline.py/chain_a(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/state.py/bump(amount)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/state.py/read_counter()", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/fetch(x)", "dst": "can://dataflow/python/main.py/slow(x)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/handles(n)", "dst": "can://dataflow/python/main.py/risky(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/risky(n)", "dst": "can://dataflow/@external/builtins.ValueError/__init__", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/with_block(path)", "dst": "can://dataflow/@external/builtins._TextIOBase/read", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/with_block(path)", "dst": "can://dataflow/@external/builtins/open", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/alias_flow()", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/alias_flow()", "dst": "can://dataflow/python/pipeline.py/Box/get(self)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/caller_of_mutate()", "dst": "can://dataflow/python/pipeline.py/mutate(items)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)", "dst": "can://dataflow/python/pipeline.py/chain_b(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)", "dst": "can://dataflow/python/pipeline.py/chain_c(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/even(n)", "dst": "can://dataflow/python/pipeline.py/odd(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/mutate(items)", "dst": "can://dataflow/@external/builtins.list/append", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/odd(n)", "dst": "can://dataflow/python/pipeline.py/even(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)", "dst": "can://dataflow/python/pipeline.py/make_adder(base)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://dataflow/@external/builtins.ValueError/__init__": {"id": "can://dataflow/@external/builtins.ValueError/__init__", "kind": "external", "name": "__init__", "module": "builtins.ValueError"}, "can://dataflow/@external/builtins._TextIOBase/read": {"id": "can://dataflow/@external/builtins._TextIOBase/read", "kind": "external", "name": "read", "module": "builtins._TextIOBase"}, "can://dataflow/@external/builtins/open": {"id": "can://dataflow/@external/builtins/open", "kind": "external", "name": "open", "module": "builtins"}, "can://dataflow/@external/builtins.list/append": {"id": "can://dataflow/@external/builtins.list/append", "kind": "external", "name": "append", "module": "builtins.list"}}, "artifacts": {}, "dependencies": [], "unresolved_imports": [], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "de9c2bac5ceb369876ab106ae52831b510e445a1", "dirty": false}, "param_in": [{"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:1", "var": ":pipeline::chain_b"}, {"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:2", "var": ":pipeline::chain_c"}, {"src": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:0", "dst": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "var": "amount"}, {"src": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:1", "dst": "can://dataflow/python/state.py/bump(amount)@formal_in:1", "var": ":state::counter"}, {"src": "can://dataflow/python/main.py/drive(n)@95:4/actual_in:0", "dst": "can://dataflow/python/state.py/read_counter()@formal_in:0", "var": ":state::counter"}, {"src": "can://dataflow/python/main.py/fetch(x)@77:4/actual_in:0", "dst": "can://dataflow/python/main.py/slow(x)@formal_in:0", "var": "x"}, {"src": "can://dataflow/python/main.py/handles(n)@43:8/actual_in:0", "dst": "can://dataflow/python/main.py/risky(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "var": "value"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "var": "items"}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:1", "var": ":pipeline::chain_c"}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:1", "var": ":pipeline::even"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:2", "var": ":pipeline::odd"}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)@44:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:1", "var": ":base"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:1", "var": ":pipeline::even"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:2", "var": ":pipeline::odd"}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "var": "base"}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "var": "x"}], "param_out": [{"src": "can://dataflow/python/main.py/risky(n)@formal_out", "dst": "can://dataflow/python/main.py/handles(n)@43:8/actual_out", "var": ""}, {"src": "can://dataflow/python/main.py/slow(x)@formal_out", "dst": "can://dataflow/python/main.py/fetch(x)@77:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:0", "dst": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:1", "dst": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:1", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/Box/get(self)@formal_out", "dst": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@formal_out", "dst": "can://dataflow/python/main.py/drive(n)@93:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)@formal_out", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_c(v)@formal_out", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/even(n)@formal_out", "dst": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)@formal_out", "dst": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_out", "dst": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:0", "dst": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:1", "dst": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:1", "var": "items"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@formal_out", "dst": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_out", "var": ""}, {"src": "can://dataflow/python/state.py/bump(amount)@formal_out:0", "dst": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/state.py/bump(amount)@formal_out:1", "dst": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:1", "var": ":state::counter"}, {"src": "can://dataflow/python/state.py/read_counter()@formal_out", "dst": "can://dataflow/python/main.py/drive(n)@95:4/actual_out", "var": ""}], "config_uses": [], "config_reads_unresolved": []}} \ No newline at end of file diff --git a/v2/json/python/analysis.entrypoints.sample.json b/v2/json/python/analysis.entrypoints.sample.json new file mode 100644 index 0000000..0928a0d --- /dev/null +++ b/v2/json/python/analysis.entrypoints.sample.json @@ -0,0 +1 @@ +{"schema_version": "2.0.0", "language": "python", "max_level": 2, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.1", "config": {"analysis_level": 2}}, "application": {"symbol_table": {"app.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "module_name": "app", "id": "can://entrypoints_local/python/app.py", "kind": "module", "source": "def route(path, methods=None):\n \"\"\"Stands in for a framework's routing decorator.\"\"\"\n def deco(fn):\n return fn\n return deco\n\n\n@route(\"/products\", methods=[\"POST\"])\ndef create_product():\n return helper()\n\n\ndef helper():\n \"\"\"Called only internally - must NOT be flagged.\"\"\"\n return {}\n", "imports": [], "comments": [], "types": {}, "functions": {"route": {"name": "route", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.route", "id": "can://entrypoints_local/python/app.py/route(path,methods)", "kind": "function", "span": {"start": [1, 0], "end": [5, 15], "bytes": [0, 139]}, "comments": [{"content": "Stands in for a framework's routing decorator.", "start_line": 2, "end_line": 2, "start_column": 4, "end_column": 56, "is_docstring": true}], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "path", "id": "can://entrypoints_local/python/app.py/route(path,methods)@formal_in:0", "type": "str", "decorators": [], "start_line": 1, "end_line": 1, "start_column": 10, "end_column": 14}, {"name": "methods", "id": "can://entrypoints_local/python/app.py/route(path,methods)@formal_in:1", "type": "list", "default_value": "None", "decorators": [], "start_line": 1, "end_line": 1, "start_column": 16, "end_column": 23}], "start_line": 1, "end_line": 5, "code_start_line": 2, "accessed_symbols": [{"name": "deco", "scope": "local", "kind": "function", "type": "deco", "is_builtin": false, "lineno": 5, "col_offset": 11}, {"name": "fn", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 4, "col_offset": 15}], "callables": {"deco": {"name": "deco", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.route.deco", "id": "can://entrypoints_local/python/app.py/route(path,methods)/deco(fn)", "kind": "function", "span": {"start": [3, 4], "end": [4, 17], "bytes": [92, 123]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "fn", "id": "can://entrypoints_local/python/app.py/route(path,methods)/deco(fn)@formal_in:0", "decorators": [], "start_line": 3, "end_line": 3, "start_column": 13, "end_column": 15}], "start_line": 3, "end_line": 4, "code_start_line": 4, "accessed_symbols": [{"name": "fn", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 4, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}, "create_product": {"name": "create_product", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.create_product", "id": "can://entrypoints_local/python/app.py/create_product()", "kind": "function", "span": {"start": [9, 0], "end": [10, 19], "bytes": [180, 221]}, "comments": [], "decorators": [{"name": "route", "qualified_name": "app.route", "positional_arguments": ["'/products'"], "keyword_arguments": {"methods": "['POST']"}, "expression": "route('/products', methods=['POST'])", "span": {"start": [8, 1], "end": [8, 37], "bytes": [143, 179]}}], "modifiers": [], "entrypoints": [{"framework": "heuristic", "confidence": "heuristic", "rule": "heuristic.http-route", "ruleset": "shipped", "evidence": "route", "route": "/products", "http_methods": ["POST"]}], "is_entrypoint": true, "parameters": [], "start_line": 9, "end_line": 10, "code_start_line": 10, "accessed_symbols": [{"name": "route", "scope": "local", "kind": "function", "type": "route", "qualified_name": "app.route", "is_builtin": false, "lineno": 8, "col_offset": 1}, {"name": "helper", "scope": "local", "kind": "function", "type": "helper", "qualified_name": "app.helper", "is_builtin": false, "lineno": 10, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"10:11": {"kind": "call", "id": "can://entrypoints_local/python/app.py/create_product()@10:11", "span": {"start": [10, 11], "end": [10, 19], "bytes": [213, 221]}, "callee": "can://entrypoints_local/python/app.py/helper()", "method_name": "helper", "return_type": "dict", "is_constructor_call": false, "arguments": []}}, "cfg": [], "cdg": [], "ddg": [], "summary": []}, "helper": {"name": "helper", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.helper", "id": "can://entrypoints_local/python/app.py/helper()", "kind": "function", "span": {"start": [13, 0], "end": [15, 13], "bytes": [224, 307]}, "comments": [{"content": "Called only internally - must NOT be flagged.", "start_line": 14, "end_line": 14, "start_column": 4, "end_column": 55, "is_docstring": true}], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 13, "end_line": 15, "code_start_line": 14, "accessed_symbols": [], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}}, "variables": [], "content_hash": "c159f10d62c826213045fa2adfff02c30056e1b764fb95af191d1df514157a4a", "last_modified": 1787243054.8256593, "file_size": 308}}, "id": "can://entrypoints_local", "kind": "application", "call_graph": [{"src": "can://entrypoints_local/@external/app", "dst": "can://entrypoints_local/python/app.py/route(path,methods)", "weight": 1, "prov": ["defuse"]}, {"src": "can://entrypoints_local/python/app.py/create_product()", "dst": "can://entrypoints_local/python/app.py/helper()", "weight": 1, "prov": ["jedi"]}, {"src": "can://entrypoints_local/python/app.py/create_product()", "dst": "can://entrypoints_local/python/app.py/route(path,methods)", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://entrypoints_local/@external/app": {"id": "can://entrypoints_local/@external/app", "kind": "external", "name": "app"}}, "artifacts": {"requirements.txt": {"id": "can://entrypoints_local/artifact/requirements.txt", "kind": "artifact", "path": "requirements.txt", "format": "requirements", "roles": ["dependency-manifest"], "size_bytes": 4, "sha256": "8a8f60ecb09b7e64c6d5214a8043865e608507db8c3f61f995eae6d078875901", "source": "app\n", "extraction": "full", "config_keys": []}, "rules.yml": {"id": "can://entrypoints_local/artifact/rules.yml", "kind": "artifact", "path": "rules.yml", "format": "text", "roles": ["unknown"], "size_bytes": 229, "sha256": "a65c2210e66ed1a9851ebe09682493a204e560222bdfcbe45cd790f2ca74e4f1", "source": "version: 1\nframeworks:\n inhouse:\n detect: [app]\n decorators:\n - id: inhouse.route\n match: \"app.route\"\n route: {from: positional, index: 0}\n methods: {from: keyword, name: methods, default: [GET]}\n", "extraction": "none", "config_keys": []}}, "dependencies": [{"name": "app", "ecosystem": "pypi", "spec": "", "kind": "runtime", "extras": [], "declared_in": "can://entrypoints_local/artifact/requirements.txt", "direct": true, "provides_imports": [], "prov": ["declared"]}], "unresolved_imports": [], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "de9c2bac5ceb369876ab106ae52831b510e445a1", "dirty": false}, "param_in": [], "param_out": [], "config_uses": [], "config_reads_unresolved": []}} \ No newline at end of file diff --git a/v2/json/python/analysis.l4.sample.json b/v2/json/python/analysis.l4.sample.json new file mode 100644 index 0000000..0344b36 --- /dev/null +++ b/v2/json/python/analysis.l4.sample.json @@ -0,0 +1 @@ +{"schema_version": "2.0.0", "language": "python", "max_level": 4, "k_limit": 3, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.1", "config": {"analysis_level": 4}}, "application": {"symbol_table": {"setup.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/setup.py", "module_name": "setup", "id": "can://manifests_app/python/setup.py", "kind": "module", "source": "from setuptools import setup\nextra = compute_extras()\nsetup(install_requires=extra)\n", "imports": [{"module": "setuptools", "name": "setup", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 28}], "comments": [], "types": {}, "functions": {}, "variables": [{"name": "extra", "initializer": "compute_extras()", "scope": "module", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 5}], "content_hash": "8523b7707314c71d565a381c02335a85c98e011b056e2e249cde190336510bec", "last_modified": 1787982273.5979042, "file_size": 84}, "pkg/config_reader.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "module_name": "config_reader", "id": "can://manifests_app/python/pkg/config_reader.py", "kind": "module", "source": "\"\"\"Config-use e2e fixture for all six detection shapes (#162 Task 5, #165).\"\"\"\nimport os\n\n\n# Shape 1: Direct literal, reads DATABASE_URL from .env (resolves at -a 2)\ndef get_database_url():\n return os.getenv(\"DATABASE_URL\")\n\n\n# Shape 2: Variable-closing to literal, reads API_KEY from .env\n# Resolves only at -a 3+ (DDG single-literal closure)\ndef get_api_key():\n key_name = \"API_KEY\"\n return os.getenv(key_name)\n\n\n# Shape 3: Param-passed via local helper, reads SECRET_API_TOKEN from .env\n# Resolves only at -a 4 (interprocedural parameter-passing)\ndef _read_config(name):\n return os.getenv(name)\n\n\ndef get_secret_token():\n return _read_config(\"SECRET_API_TOKEN\")\n\n\n# Shape 4: Multi-def unresolved (two different literals on branches)\n# Should stay unresolved at all levels (reason: \"non-literal\")\ndef get_config_multi_def(use_debug):\n if use_debug:\n var = \"DEBUG\"\n else:\n var = \"FLASK_ENV\"\n return os.getenv(var)\n\n\n# Shape 5: Undefined-key read\n# Should appear in config_reads_unresolved with reason: \"undefined-key\"\ndef get_missing_config():\n return os.getenv(\"NOT_DEFINED_ANYWHERE\")\n\n\n# Shape 6: Deployment-env, reads APP_MODE from the Dockerfile ENV directive\n# (#165). Direct literal, resolves at -a 2 like shape 1.\ndef get_app_mode():\n return os.getenv(\"APP_MODE\")\n", "imports": [{"module": "os", "name": "os", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 9}], "comments": [{"content": "Config-use e2e fixture for all six detection shapes (#162 Task 5, #165).", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 78, "is_docstring": true}], "types": {}, "functions": {"get_database_url": {"name": "get_database_url", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_database_url", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()", "kind": "function", "span": {"start": [6, 0], "end": [7, 36], "bytes": [166, 226]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 6, "end_line": 7, "code_start_line": 7, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 7, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"7:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:11", "span": {"start": [7, 11], "end": [7, 36], "bytes": [201, 226]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "7:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"DATABASE_URL\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@entry", "arguments": []}, "7:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:4", "span": {"start": [7, 4], "end": [7, 36], "bytes": [194, 226]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "7:4", "kind": "fallthrough"}, {"src": "7:4", "dst": "@exit", "kind": "exception"}, {"src": "7:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "7:4"}], "ddg": [{"src": "@entry", "dst": "7:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "7:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "7:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "7:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "7:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "7:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_api_key": {"name": "get_api_key", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_api_key", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()", "kind": "function", "span": {"start": [12, 0], "end": [14, 30], "bytes": [347, 421]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 12, "end_line": 14, "code_start_line": 13, "accessed_symbols": [{"name": "key_name", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 14, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 14, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "key_name", "type": "str", "initializer": "'API_KEY'", "scope": "function", "start_line": 13, "end_line": 13, "start_column": 4, "end_column": 12}], "cyclomatic_complexity": 2, "body": {"14:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:11", "span": {"start": [14, 11], "end": [14, 30], "bytes": [402, 421]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "14:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "key_name"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@entry", "arguments": []}, "13:4": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@13:4", "span": {"start": [13, 4], "end": [13, 24], "bytes": [370, 390]}, "arguments": []}, "14:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:4", "span": {"start": [14, 4], "end": [14, 30], "bytes": [395, 421]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "13:4", "kind": "fallthrough"}, {"src": "13:4", "dst": "14:4", "kind": "fallthrough"}, {"src": "14:4", "dst": "@exit", "kind": "exception"}, {"src": "14:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "13:4"}, {"src": "@entry", "dst": "14:4"}], "ddg": [{"src": "@entry", "dst": "14:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "13:4", "dst": "14:4", "var": "key_name", "prov": ["ssa"]}, {"src": "14:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "14:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "14:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}, {"src": "13:4", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}], "summary": []}, "_read_config": {"name": "_read_config", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader._read_config", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "kind": "function", "span": {"start": [19, 0], "end": [20, 26], "bytes": [559, 609]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "name", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "type": "str", "decorators": [], "start_line": 19, "end_line": 19, "start_column": 17, "end_column": 21}], "start_line": 19, "end_line": 20, "code_start_line": 20, "accessed_symbols": [{"name": "name", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 20, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 20, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"20:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:11", "span": {"start": [20, 11], "end": [20, 26], "bytes": [594, 609]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "20:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "name"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@entry", "arguments": []}, "20:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:4", "span": {"start": [20, 4], "end": [20, 26], "bytes": [587, 609]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "of": "name", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:1", "of": "name", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:2", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "20:4", "kind": "fallthrough"}, {"src": "20:4", "dst": "@exit", "kind": "exception"}, {"src": "20:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "20:4"}], "ddg": [{"src": "@entry", "dst": "20:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "20:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "@entry", "dst": "20:4", "var": "name", "prov": ["ssa"]}, {"src": "20:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "20:4", "dst": "@formal_out:1", "var": "name.*", "prov": ["reaching-defs"]}, {"src": "20:4", "dst": "@formal_out:2", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "20:4", "var": "name", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "20:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "20:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_secret_token": {"name": "get_secret_token", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_secret_token", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()", "kind": "function", "span": {"start": [23, 0], "end": [24, 43], "bytes": [612, 679]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 23, "end_line": 24, "code_start_line": 24, "accessed_symbols": [{"name": "_read_config", "scope": "local", "kind": "function", "type": "_read_config", "qualified_name": "pkg.config_reader._read_config", "is_builtin": false, "lineno": 24, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"24:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:11", "span": {"start": [24, 11], "end": [24, 43], "bytes": [647, 679]}, "callee": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "parent": "24:4", "method_name": "_read_config", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"SECRET_API_TOKEN\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@entry", "arguments": []}, "24:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4", "span": {"start": [24, 4], "end": [24, 43], "bytes": [640, 679]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_in:0", "of": ":config_reader::_read_config", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_out:1", "of": ":config_reader::os", "arguments": []}, "24:4/actual_in:0": {"kind": "actual_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:0", "of": "name", "parent": "24:4", "arguments": []}, "24:4/actual_in:1": {"kind": "actual_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:1", "of": ":config_reader::os", "parent": "24:4", "arguments": []}, "24:4/actual_out:0": {"kind": "actual_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:0", "of": "", "parent": "24:4", "arguments": []}, "24:4/actual_out:1": {"kind": "actual_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:1", "of": ":config_reader::os", "parent": "24:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "24:4", "kind": "fallthrough"}, {"src": "24:4", "dst": "@exit", "kind": "exception"}, {"src": "24:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "24:4"}], "ddg": [{"src": "@entry", "dst": "24:4", "var": "config_reader::_read_config", "prov": ["ssa"]}, {"src": "24:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "24:4", "dst": "@formal_out:1", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "24:4/actual_out:0", "dst": "24:4", "var": "", "prov": ["reaching-defs"]}, {"src": "24:4/actual_out:1", "dst": "24:4", "var": ":config_reader::os", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "24:4/actual_in:0", "var": "config_reader::_read_config", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "24:4", "var": "config_reader::_read_config", "prov": ["reaching-defs"]}], "summary": [{"src": "24:4/actual_in:0", "dst": "24:4/actual_out:0"}, {"src": "24:4/actual_in:0", "dst": "24:4/actual_out:1"}, {"src": "24:4/actual_in:1", "dst": "24:4/actual_out:0"}, {"src": "24:4/actual_in:1", "dst": "24:4/actual_out:1"}]}, "get_config_multi_def": {"name": "get_config_multi_def", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_config_multi_def", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)", "kind": "function", "span": {"start": [29, 0], "end": [34, 25], "bytes": [814, 952]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "use_debug", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:0", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 25, "end_column": 34}], "start_line": 29, "end_line": 34, "code_start_line": 30, "accessed_symbols": [{"name": "use_debug", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 30, "col_offset": 7}, {"name": "var", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 34, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 34, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "var", "type": "str", "initializer": "'DEBUG'", "scope": "function", "start_line": 31, "end_line": 31, "start_column": 8, "end_column": 11}, {"name": "var", "type": "str", "initializer": "'FLASK_ENV'", "scope": "function", "start_line": 33, "end_line": 33, "start_column": 8, "end_column": 11}], "cyclomatic_complexity": 3, "body": {"34:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:11", "span": {"start": [34, 11], "end": [34, 25], "bytes": [938, 952]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "34:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "var"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@entry", "arguments": []}, "30:7": {"kind": "branch", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@30:7", "span": {"start": [30, 7], "end": [30, 16], "bytes": [858, 867]}, "arguments": []}, "31:8": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@31:8", "span": {"start": [31, 8], "end": [31, 21], "bytes": [877, 890]}, "arguments": []}, "33:8": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@33:8", "span": {"start": [33, 8], "end": [33, 25], "bytes": [909, 926]}, "arguments": []}, "34:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:4", "span": {"start": [34, 4], "end": [34, 25], "bytes": [931, 952]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:0", "of": "use_debug", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "30:7", "kind": "fallthrough"}, {"src": "30:7", "dst": "31:8", "kind": "true"}, {"src": "30:7", "dst": "33:8", "kind": "false"}, {"src": "31:8", "dst": "34:4", "kind": "fallthrough"}, {"src": "33:8", "dst": "34:4", "kind": "fallthrough"}, {"src": "34:4", "dst": "@exit", "kind": "exception"}, {"src": "34:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "30:7"}, {"src": "@entry", "dst": "34:4"}, {"src": "30:7", "dst": "31:8"}, {"src": "30:7", "dst": "33:8"}], "ddg": [{"src": "@entry", "dst": "30:7", "var": "use_debug", "prov": ["ssa"]}, {"src": "@entry", "dst": "34:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "31:8", "dst": "34:4", "var": "var", "prov": ["ssa"]}, {"src": "33:8", "dst": "34:4", "var": "var", "prov": ["ssa"]}, {"src": "34:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "34:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "30:7", "var": "use_debug", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "34:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}, {"src": "31:8", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}, {"src": "33:8", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}], "summary": []}, "get_missing_config": {"name": "get_missing_config", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_missing_config", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()", "kind": "function", "span": {"start": [39, 0], "end": [40, 44], "bytes": [1057, 1127]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 39, "end_line": 40, "code_start_line": 40, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 40, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"40:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:11", "span": {"start": [40, 11], "end": [40, 44], "bytes": [1094, 1127]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "40:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"NOT_DEFINED_ANYWHERE\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@entry", "arguments": []}, "40:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:4", "span": {"start": [40, 4], "end": [40, 44], "bytes": [1087, 1127]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "40:4", "kind": "fallthrough"}, {"src": "40:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "40:4"}], "ddg": [{"src": "@entry", "dst": "40:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "40:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "40:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "40:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "40:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "40:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_app_mode": {"name": "get_app_mode", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_app_mode", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()", "kind": "function", "span": {"start": [45, 0], "end": [46, 32], "bytes": [1263, 1315]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 45, "end_line": 46, "code_start_line": 46, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 46, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"46:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:11", "span": {"start": [46, 11], "end": [46, 32], "bytes": [1294, 1315]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "46:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"APP_MODE\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@entry", "arguments": []}, "46:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:4", "span": {"start": [46, 4], "end": [46, 32], "bytes": [1287, 1315]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "46:4", "kind": "fallthrough"}, {"src": "46:4", "dst": "@exit", "kind": "exception"}, {"src": "46:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "46:4"}], "ddg": [{"src": "@entry", "dst": "46:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "46:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "46:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "46:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "46:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "46:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [], "content_hash": "5cb9d813337d9ee688d8fd4c8616f1572a926a8af912092818db2840e8173efb", "last_modified": 1788022149.635426, "file_size": 1316}, "pkg/__init__.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/__init__.py", "module_name": "__init__", "id": "can://manifests_app/python/pkg/__init__.py", "kind": "module", "source": "", "imports": [], "comments": [], "types": {}, "functions": {}, "variables": [], "content_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "last_modified": 1787982273.5935364, "file_size": 0}, "pkg/main.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/main.py", "module_name": "main", "id": "can://manifests_app/python/pkg/main.py", "kind": "module", "source": "import requests\nimport colorama # deliberately undeclared\n\ndef fetch(url):\n return requests.get(url)\n", "imports": [{"module": "requests", "name": "requests", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 15}, {"module": "colorama", "name": "colorama", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 15}], "comments": [], "types": {}, "functions": {"fetch": {"name": "fetch", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/main.py", "signature": "pkg.main.fetch", "id": "can://manifests_app/python/pkg/main.py/fetch(url)", "kind": "function", "span": {"start": [4, 0], "end": [5, 28], "bytes": [60, 104]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "url", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:0", "decorators": [], "start_line": 4, "end_line": 4, "start_column": 10, "end_column": 13}], "start_line": 4, "end_line": 5, "code_start_line": 5, "accessed_symbols": [{"name": "url", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 5, "col_offset": 24}, {"name": "requests", "scope": "global", "kind": "module", "type": "requests", "qualified_name": "requests", "is_builtin": false, "lineno": 5, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"5:11": {"kind": "call", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@5:11", "span": {"start": [5, 11], "end": [5, 28], "bytes": [87, 104]}, "callee": "can://manifests_app/@external/requests.api/get", "parent": "5:4", "method_name": "get", "receiver_expr": "requests", "receiver_type": "requests", "return_type": "Response", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "url"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@entry", "arguments": []}, "5:4": {"kind": "return", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@5:4", "span": {"start": [5, 4], "end": [5, 28], "bytes": [80, 104]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:0", "of": "url", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:1", "of": ":main::requests", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:1", "of": "url", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:2", "of": ":main::requests", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "5:4", "kind": "fallthrough"}, {"src": "5:4", "dst": "@exit", "kind": "exception"}, {"src": "5:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "5:4"}], "ddg": [{"src": "@entry", "dst": "5:4", "var": "main::requests", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "main::requests.get", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "url", "prov": ["ssa"]}, {"src": "5:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "5:4", "dst": "@formal_out:1", "var": "url.*", "prov": ["reaching-defs"]}, {"src": "5:4", "dst": "@formal_out:2", "var": "main::requests.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "5:4", "var": "url", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "main::requests", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "main::requests.get", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [], "content_hash": "b79926bf7a944073398bc31fd0342403b5d6ab478bce999a1110ab02835c16f5", "last_modified": 1787982273.5944843, "file_size": 105}}, "id": "can://manifests_app", "kind": "application", "call_graph": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_api_key()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_database_url()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/main.py/fetch(url)", "dst": "can://manifests_app/@external/requests.api/get", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/@external/setup", "dst": "can://manifests_app/@external/setuptools/setup", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://manifests_app/@external/os/getenv": {"id": "can://manifests_app/@external/os/getenv", "kind": "external", "name": "getenv", "module": "os"}, "can://manifests_app/@external/requests.api/get": {"id": "can://manifests_app/@external/requests.api/get", "kind": "external", "name": "get", "module": "requests.api"}, "can://manifests_app/@external/setup": {"id": "can://manifests_app/@external/setup", "kind": "external", "name": "setup"}, "can://manifests_app/@external/setuptools/setup": {"id": "can://manifests_app/@external/setuptools/setup", "kind": "external", "name": "setup", "module": "setuptools"}}, "artifacts": {".env": {"id": "can://manifests_app/artifact/.env", "kind": "artifact", "path": ".env", "format": "text", "roles": ["env"], "size_bytes": 220, "sha256": "cd9177857f014776ad99f62440a101d595ea16d32592a261b92d8ad8db2807aa", "source": "# Application environment configuration\nDEBUG=true\nDATABASE_URL=\"postgresql://localhost/mydb # connection string\"\nAPI_KEY=\"${DATABASE_PASSWORD}\"\nSECRET_API_TOKEN=\"sk-12345abcdef-super-secret\"\nexport FLASK_ENV=production\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/.env@key/API_KEY", "key": "API_KEY", "namespace": "env", "value": "${DATABASE_PASSWORD}", "span": {"start": [4, 0], "end": [4, 30], "bytes": [114, 144]}, "references": ["${DATABASE_PASSWORD}"]}, {"id": "can://manifests_app/artifact/.env@key/DATABASE_URL", "key": "DATABASE_URL", "namespace": "env", "value": "postgresql://localhost/mydb # connection string", "span": {"start": [3, 0], "end": [3, 62], "bytes": [51, 113]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/DEBUG", "key": "DEBUG", "namespace": "env", "value": "true", "span": {"start": [2, 0], "end": [2, 10], "bytes": [40, 50]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/FLASK_ENV", "key": "FLASK_ENV", "namespace": "env", "value": "production", "span": {"start": [6, 0], "end": [6, 27], "bytes": [192, 219]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/SECRET_API_TOKEN", "key": "SECRET_API_TOKEN", "namespace": "env", "value": "sk-12345abcdef-super-secret", "span": {"start": [5, 0], "end": [5, 46], "bytes": [145, 191]}, "references": []}]}, ".github/workflows/ci.yml": {"id": "can://manifests_app/artifact/.github/workflows/ci.yml", "kind": "artifact", "path": ".github/workflows/ci.yml", "format": "yaml", "roles": ["ci"], "size_bytes": 18, "sha256": "1c7b515b077ae3f96d2b4fc9e2be04d69213e4e0e941e382ac85b2bcfa8302af", "source": "on: push\njobs: {}\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/.github/workflows/ci.yml@key/True", "key": "True", "namespace": "yaml", "value": "push", "references": []}]}, "Dockerfile": {"id": "can://manifests_app/artifact/Dockerfile", "kind": "artifact", "path": "Dockerfile", "format": "dockerfile", "roles": ["container-image"], "size_bytes": 61, "sha256": "8355d52cd519c25f476c55bf732311796cfa5b5b152de432b6de4da1b5b2ebc3", "source": "FROM python:3.12-slim\n\nARG BUILD_REV\nENV APP_MODE=production\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/Dockerfile@key/APP_MODE", "key": "APP_MODE", "namespace": "env", "value": "production", "span": {"start": [4, 0], "end": [4, 23], "bytes": [37, 60]}, "references": []}, {"id": "can://manifests_app/artifact/Dockerfile@key/arg.BUILD_REV", "key": "BUILD_REV", "namespace": "dockerfile", "span": {"start": [3, 0], "end": [3, 13], "bytes": [23, 36]}, "references": []}]}, "app.properties": {"id": "can://manifests_app/artifact/app.properties", "kind": "artifact", "path": "app.properties", "format": "properties", "roles": ["tool-config"], "size_bytes": 371, "sha256": "1cbb0081b3aba454de1db62a76fffff6049c303b627826a6838405597eff8438", "source": "# Application properties\napp.name=MyApplication\napp.version=1.0.0\n# Multi-line property with continuation\napp.long.description=This is a very long property value that \\\n continues on the next line with additional configuration details\nserver.port=9000\nserver.ssl=true\n# Property with interpolation reference\ndb.url=%(db.host)s:%(db.port)s\ndb.host=localhost\ndb.port=5432\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/app.properties@key/app.long.description", "key": "app.long.description", "namespace": "properties", "value": "This is a very long property value that continues on the next line with additional configuration details", "span": {"start": [5, 0], "end": [5, 62], "bytes": [106, 168]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/app.name", "key": "app.name", "namespace": "properties", "value": "MyApplication", "span": {"start": [2, 0], "end": [2, 22], "bytes": [25, 47]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/app.version", "key": "app.version", "namespace": "properties", "value": "1.0.0", "span": {"start": [3, 0], "end": [3, 17], "bytes": [48, 65]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.host", "key": "db.host", "namespace": "properties", "value": "localhost", "span": {"start": [11, 0], "end": [11, 17], "bytes": [340, 357]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.port", "key": "db.port", "namespace": "properties", "value": "5432", "span": {"start": [12, 0], "end": [12, 12], "bytes": [358, 370]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.url", "key": "db.url", "namespace": "properties", "value": "%(db.host)s:%(db.port)s", "span": {"start": [10, 0], "end": [10, 30], "bytes": [309, 339]}, "references": ["%(db.host)s", "%(db.port)s"]}, {"id": "can://manifests_app/artifact/app.properties@key/server.port", "key": "server.port", "namespace": "properties", "value": "9000", "span": {"start": [7, 0], "end": [7, 16], "bytes": [236, 252]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/server.ssl", "key": "server.ssl", "namespace": "properties", "value": "true", "span": {"start": [8, 0], "end": [8, 15], "bytes": [253, 268]}, "references": []}]}, "config/settings.yml": {"id": "can://manifests_app/artifact/config/settings.yml", "kind": "artifact", "path": "config/settings.yml", "format": "yaml", "roles": ["tool-config"], "size_bytes": 334, "sha256": "f18107a45e4a162109e551cbca84dc34a28254b7008625f5d5773226ee628c71", "source": "server:\n host: localhost\n port: 8080\n timeouts:\n connect: 30\n read: 60\ndatabase:\n primary:\n url: postgresql://db.example.com/prod\n pool_size: 10\n replicas:\n - url: postgresql://replica1.example.com/prod\n - url: postgresql://replica2.example.com/prod\nlogging:\n level: DEBUG\n handlers:\n - console\n - file\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/config/settings.yml@key/database.primary.pool_size", "key": "database.primary.pool_size", "namespace": "yaml", "value": "10", "span": {"start": [10, 0], "end": [10, 17], "bytes": [143, 160]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.primary.url", "key": "database.primary.url", "namespace": "yaml", "value": "postgresql://db.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.replicas.0.url", "key": "database.replicas.0.url", "namespace": "yaml", "value": "postgresql://replica1.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.replicas.1.url", "key": "database.replicas.1.url", "namespace": "yaml", "value": "postgresql://replica2.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.handlers.0", "key": "logging.handlers.0", "namespace": "yaml", "value": "console", "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.handlers.1", "key": "logging.handlers.1", "namespace": "yaml", "value": "file", "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.level", "key": "logging.level", "namespace": "yaml", "value": "DEBUG", "span": {"start": [15, 0], "end": [15, 14], "bytes": [282, 296]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.host", "key": "server.host", "namespace": "yaml", "value": "localhost", "span": {"start": [2, 0], "end": [2, 17], "bytes": [8, 25]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.port", "key": "server.port", "namespace": "yaml", "value": "8080", "span": {"start": [3, 0], "end": [3, 12], "bytes": [26, 38]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.timeouts.connect", "key": "server.timeouts.connect", "namespace": "yaml", "value": "30", "span": {"start": [5, 0], "end": [5, 15], "bytes": [51, 66]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.timeouts.read", "key": "server.timeouts.read", "namespace": "yaml", "value": "60", "span": {"start": [6, 0], "end": [6, 12], "bytes": [67, 79]}, "references": []}]}, "data.csv": {"id": "can://manifests_app/artifact/data.csv", "kind": "artifact", "path": "data.csv", "format": "text", "roles": ["unknown"], "size_bytes": 26, "sha256": "e7a3929e0913e80f475f937db1615bfa29484299e93ea55d8c87e92770c8078d", "source": "name,value\nalpha,1\nbeta,2\n", "extraction": "none", "config_keys": []}, "docker-compose.yml": {"id": "can://manifests_app/artifact/docker-compose.yml", "kind": "artifact", "path": "docker-compose.yml", "format": "yaml", "roles": ["service-topology"], "size_bytes": 73, "sha256": "7eb1818ce6a2b3acdaabfcb23ad26a9ab5370a376ee60da8a8105824289f8e4f", "source": "services:\n web:\n build: .\n environment:\n COMPOSE_ONLY_KEY: x\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/docker-compose.yml@key/env.COMPOSE_ONLY_KEY", "key": "COMPOSE_ONLY_KEY", "namespace": "env", "value": "x", "span": {"start": [5, 0], "end": [5, 25], "bytes": [47, 72]}, "references": []}, {"id": "can://manifests_app/artifact/docker-compose.yml@key/services.web.build", "key": "services.web.build", "namespace": "yaml", "value": ".", "span": {"start": [3, 0], "end": [3, 12], "bytes": [17, 29]}, "references": []}, {"id": "can://manifests_app/artifact/docker-compose.yml@key/services.web.environment.COMPOSE_ONLY_KEY", "key": "services.web.environment.COMPOSE_ONLY_KEY", "namespace": "yaml", "value": "x", "span": {"start": [5, 0], "end": [5, 25], "bytes": [47, 72]}, "references": []}]}, "environment.yml": {"id": "can://manifests_app/artifact/environment.yml", "kind": "artifact", "path": "environment.yml", "format": "yaml", "roles": ["dependency-manifest"], "size_bytes": 29, "sha256": "6f610dc2806830e92a47759b1152ed97c70abc8705ac318638d9781c500d76db", "source": "dependencies:\n - numpy=1.26\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/environment.yml@key/dependencies.0", "key": "dependencies.0", "namespace": "yaml", "value": "numpy=1.26", "references": []}]}, "logo.png": {"id": "can://manifests_app/artifact/logo.png", "kind": "artifact", "path": "logo.png", "format": "binary", "roles": ["unknown"], "size_bytes": 14, "sha256": "4033735c485f1e032d3414a913c885fc8824e0882c102e2fc78452707739848d", "source": "", "extraction": "none", "config_keys": []}, "pyproject.toml": {"id": "can://manifests_app/artifact/pyproject.toml", "kind": "artifact", "path": "pyproject.toml", "format": "toml", "roles": ["dependency-manifest", "tool-config"], "size_bytes": 67, "sha256": "cd62a9edff50b75a48f60af3c7bb28d8c7249b1b2033d439f7a2b1cbf880d278", "source": "[project]\nname = \"manifests-app\"\ndependencies = [\"requests>=2.31\"]\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/pyproject.toml@key/project.dependencies.0", "key": "project.dependencies.0", "namespace": "toml", "value": "requests>=2.31", "references": []}, {"id": "can://manifests_app/artifact/pyproject.toml@key/project.name", "key": "project.name", "namespace": "toml", "value": "manifests-app", "span": {"start": [2, 0], "end": [2, 22], "bytes": [10, 32]}, "references": []}]}, "requirements-dev.txt": {"id": "can://manifests_app/artifact/requirements-dev.txt", "kind": "artifact", "path": "requirements-dev.txt", "format": "requirements", "roles": ["dependency-manifest"], "size_bytes": 10, "sha256": "e5d9943702bb51c0b13a5891bf396d41a5b0d269f583ad57534e5021a32af50d", "source": "pytest>=8\n", "extraction": "full", "config_keys": []}, "setup.py": {"id": "can://manifests_app/artifact/setup.py", "kind": "artifact", "path": "setup.py", "format": "text", "roles": ["dependency-manifest"], "size_bytes": 84, "sha256": "8523b7707314c71d565a381c02335a85c98e011b056e2e249cde190336510bec", "source": "from setuptools import setup\nextra = compute_extras()\nsetup(install_requires=extra)\n", "extraction": "partial", "config_keys": []}, "uv.lock": {"id": "can://manifests_app/artifact/uv.lock", "kind": "artifact", "path": "uv.lock", "format": "toml", "roles": ["dependency-manifest"], "size_bytes": 49, "sha256": "672f187467ab259fbf4562218f09ef721369748cc077c1dab594aa9067c4fd0c", "source": "[[package]]\nname = \"requests\"\nversion = \"2.32.3\"\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/uv.lock@key/package.0.name", "key": "package.0.name", "namespace": "toml", "value": "requests", "span": {"start": [2, 0], "end": [2, 17], "bytes": [12, 29]}, "references": []}, {"id": "can://manifests_app/artifact/uv.lock@key/package.0.version", "key": "package.0.version", "namespace": "toml", "value": "2.32.3", "span": {"start": [3, 0], "end": [3, 18], "bytes": [30, 48]}, "references": []}]}}, "dependencies": [{"name": "numpy", "ecosystem": "pypi", "spec": "=1.26", "kind": "runtime", "extras": [], "declared_in": "can://manifests_app/artifact/environment.yml", "direct": true, "provides_imports": [], "prov": ["declared"]}, {"name": "pytest", "ecosystem": "pypi", "spec": ">=8", "kind": "dev", "extras": [], "declared_in": "can://manifests_app/artifact/requirements-dev.txt", "direct": true, "provides_imports": [], "prov": ["declared"]}, {"name": "requests", "ecosystem": "pypi", "spec": ">=2.31", "kind": "runtime", "extras": [], "declared_in": "can://manifests_app/artifact/pyproject.toml", "direct": true, "locked_version": "2.32.3", "provides_imports": ["requests"], "prov": ["declared", "lockfile"]}], "unresolved_imports": [{"module": "colorama", "prov": []}, {"module": "setuptools", "prov": []}], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "de9c2bac5ceb369876ab106ae52831b510e445a1", "dirty": false}, "param_in": [{"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:0", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "var": "name"}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:1", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:1", "var": ":config_reader::os"}], "param_out": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:0", "dst": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:0", "var": ""}, {"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:2", "dst": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:1", "var": ":config_reader::os"}], "config_uses": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:11", "dst": "can://manifests_app/artifact/.env@key/SECRET_API_TOKEN", "prov": ["dataflow"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:11", "dst": "can://manifests_app/artifact/.env@key/API_KEY", "prov": ["dataflow"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:11", "dst": "can://manifests_app/artifact/Dockerfile@key/APP_MODE", "prov": ["literal"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:11", "dst": "can://manifests_app/artifact/.env@key/DATABASE_URL", "prov": ["literal"]}], "config_reads_unresolved": [{"site": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:11", "callee": "can://manifests_app/@external/os/getenv", "reason": "non-literal", "prov": ["literal", "dataflow"]}, {"site": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:11", "callee": "can://manifests_app/@external/os/getenv", "key": "NOT_DEFINED_ANYWHERE", "reason": "undefined-key", "prov": ["literal", "dataflow"]}]}} \ No newline at end of file diff --git a/v2/json/python/analysis.schema.json b/v2/json/python/analysis.schema.json new file mode 100644 index 0000000..0de8fe1 --- /dev/null +++ b/v2/json/python/analysis.schema.json @@ -0,0 +1,708 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://codellm-devkit.github.io/schema/v2/python/analysis.schema.json", + "title": "codeanalyzer-python v2 analysis output", + "description": "What codeanalyzer-python (canpy) v1.4.0 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction. Property names are the Pydantic field names; the payload is dumped with exclude_none, so an optional fact is absent rather than null, and the internal `call_sites` list is stripped at emit time.", + "x-cldk": { + "schemaVersion": "2.0.0", + "language": "python", + "source": { + "repo": "codellm-devkit/codeanalyzer-python", + "release": "v1.4.0", + "definedIn": "codeanalyzer/schema/py_schema.py" + }, + "canonical": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json", + "extends": [ + "application: entrypoint_report, repository, config_reads_unresolved", + "module: file_path, module_name, variables, last_modified, file_size", + "type: base_classes (canonical base_types), attributes (canonical fields), entrypoints, is_entrypoint, start_line/end_line", + "callable: name, path, accessed_symbols, local_variables, cyclomatic_complexity, entrypoints, is_entrypoint, start_line/end_line/code_start_line", + "body node: call-site facts (method_name, receiver_expr, receiver_type, return_type, is_constructor_call) and `arguments` as structured call-argument records", + "decorator: positional_arguments, keyword_arguments, expression; comment: is_docstring; import: resolved_module" + ], + "diverges": [ + "class members are `attributes` (not the canonical `fields`) and supertypes are `base_classes` (not `base_types`)", + "module-level bindings are a `variables` list (not the canonical `fields` map)", + "leaf nodes (import, comment, parameter, variable, symbol) carry flat start_line/start_column/end_line/end_column instead of a span", + "span columns are 0-based (ast semantics); lines are 1-based", + "unresolved config reads are `config_reads_unresolved` (typescript calls the same list `config_reads`)" + ] + }, + "allOf": [ + { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json" + } + ], + "properties": { + "language": { + "const": "python" + }, + "application": { + "$ref": "#/$defs/PyApplication" + } + }, + "unevaluatedProperties": false, + "$defs": { + "PyApplication": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Application", + "properties": { + "symbol_table": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyModule" + } + }, + "external_symbols": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyExternalSymbol" + } + }, + "call_graph": { + "type": "array", + "items": { + "$ref": "#/$defs/PyCallEdge" + } + }, + "artifacts": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyArtifact" + } + }, + "dependencies": { + "type": "array", + "items": { + "$ref": "#/$defs/PyDependency" + } + }, + "entrypoint_report": { + "$ref": "#/$defs/PyEntrypointReport" + }, + "repository": { + "$ref": "#/$defs/PyRepositoryInfo" + }, + "config_reads_unresolved": { + "type": "array", + "items": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ConfigRead" + } + } + }, + "unevaluatedProperties": false + }, + "PyModule": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Module", + "required": [ + "file_path", + "module_name" + ], + "properties": { + "file_path": { + "type": "string" + }, + "module_name": { + "description": "Dotted module name.", + "type": "string" + }, + "imports": { + "type": "array", + "items": { + "$ref": "#/$defs/PyImport" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/PyComment" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyClass" + } + }, + "functions": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyCallable" + } + }, + "variables": { + "description": "Module-level bindings. Python's list form of the canonical module `fields` map.", + "type": "array", + "items": { + "$ref": "#/$defs/PyVariableDeclaration" + } + }, + "last_modified": { + "description": "Cache metadata kept on the wire.", + "type": "number" + }, + "file_size": { + "type": "integer" + } + }, + "unevaluatedProperties": false + }, + "PyClass": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Type", + "required": [ + "name", + "signature" + ], + "properties": { + "kind": { + "const": "class" + }, + "base_classes": { + "description": "Python's name for the canonical `base_types`.", + "type": "array", + "items": { + "type": "string" + } + }, + "attributes": { + "description": "Class attributes. Python's name for the canonical `fields` map.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyClassAttribute" + } + }, + "callables": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyCallable" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyClass" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/PyComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/PyDecorator" + } + }, + "entrypoints": { + "type": "array", + "items": { + "$ref": "#/$defs/PyEntrypoint" + } + }, + "is_entrypoint": { + "type": "boolean" + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + } + }, + "unevaluatedProperties": false + }, + "PyCallable": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Callable", + "required": [ + "name", + "path" + ], + "properties": { + "kind": { + "enum": [ + "function", + "method", + "lambda" + ] + }, + "path": { + "description": "File the callable is declared in.", + "type": "string" + }, + "modifiers": { + "description": "Declaration-level modifiers; `async` is the only one Python has today.", + "type": "array", + "items": { + "type": "string" + } + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/PyCallableParameter" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/PyComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/PyDecorator" + } + }, + "entrypoints": { + "type": "array", + "items": { + "$ref": "#/$defs/PyEntrypoint" + } + }, + "is_entrypoint": { + "type": "boolean" + }, + "accessed_symbols": { + "type": "array", + "items": { + "$ref": "#/$defs/PySymbol" + } + }, + "local_variables": { + "type": "array", + "items": { + "$ref": "#/$defs/PyVariableDeclaration" + } + }, + "cyclomatic_complexity": { + "type": "integer" + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "code_start_line": { + "type": "integer" + }, + "body": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyBodyNode" + } + }, + "callables": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyCallable" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PyClass" + } + }, + "cdg": { + "type": "array", + "items": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/IdEdge" + } + }, + "summary": { + "type": "array", + "items": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/IdEdge" + } + } + }, + "unevaluatedProperties": false + }, + "PyBodyNode": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/BodyNode", + "properties": { + "kind": { + "enum": [ + "call", + "statement", + "return", + "raise", + "branch", + "loop", + "handler", + "entry", + "exit", + "formal_in", + "formal_out", + "actual_in", + "actual_out" + ], + "description": "The kinds the CFG builder emits (codeanalyzer/dataflow/cfg.py) plus the L1 `call` node and the L4 synthetic vertices. Python has no `switch` node; `raise` and `handler` are its exception-construct additions." + }, + "method_name": { + "description": "Carried rather than derived from `callee`: about a quarter of call sites never resolve one.", + "type": "string" + }, + "receiver_expr": { + "type": "string" + }, + "receiver_type": { + "type": "string" + }, + "return_type": { + "type": "string" + }, + "is_constructor_call": { + "type": "boolean" + }, + "arguments": { + "description": "call nodes: one record per argument. Python's structured form of the canonical `arguments` list.", + "type": "array", + "items": { + "$ref": "#/$defs/PyCallArgument" + } + }, + "id": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/BodyNode/properties/id" + } + }, + "unevaluatedProperties": false, + "required": [ + "id" + ] + }, + "PyCallArgument": { + "description": "One call-site argument: AST category and inferred type kept apart.", + "type": "object", + "required": [ + "ast_kind" + ], + "properties": { + "ast_kind": { + "type": "string" + }, + "inferred_type": { + "type": "string" + }, + "value": { + "description": "JSON-encoded literal, for an ast.Constant argument of type str/int/float/bool/None. Decode with json.loads.", + "type": "string" + }, + "name": { + "description": "The identifier of a bare ast.Name argument - the dataflow tier's join point back to its definitions.", + "type": "string" + } + }, + "additionalProperties": false + }, + "PyClassAttribute": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Field", + "properties": { + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/PyComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/PyDecorator" + } + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + } + }, + "unevaluatedProperties": false + }, + "PyCallableParameter": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Parameter", + "properties": { + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/PyDecorator" + } + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + }, + "id": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Parameter/properties/id" + } + }, + "unevaluatedProperties": false, + "required": [ + "id" + ] + }, + "PyImport": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Import", + "required": [ + "module" + ], + "properties": { + "resolved_module": { + "description": "The module the import resolved to, when it could be resolved.", + "type": "string" + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + } + }, + "unevaluatedProperties": false + }, + "PyComment": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Comment", + "properties": { + "is_docstring": { + "type": "boolean" + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + } + }, + "unevaluatedProperties": false + }, + "PyDecorator": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Decorator", + "properties": { + "positional_arguments": { + "type": "array", + "items": { + "type": "string" + } + }, + "keyword_arguments": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "expression": { + "description": "The full unparsed source, so nothing is lost for decorators too complex to decompose.", + "type": "string" + } + }, + "unevaluatedProperties": false + }, + "PySymbol": { + "description": "A symbol used or declared inside a callable.", + "type": "object", + "required": [ + "name", + "scope", + "kind" + ], + "properties": { + "name": { + "type": "string" + }, + "scope": { + "enum": [ + "local", + "nonlocal", + "global", + "class", + "module" + ] + }, + "kind": { + "enum": [ + "variable", + "parameter", + "attribute", + "function", + "class", + "module" + ] + }, + "type": { + "type": "string" + }, + "qualified_name": { + "type": "string" + }, + "is_builtin": { + "type": "boolean" + }, + "lineno": { + "type": "integer" + }, + "col_offset": { + "type": "integer" + } + }, + "additionalProperties": false + }, + "PyVariableDeclaration": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "initializer": { + "type": "string" + }, + "value": true, + "scope": { + "enum": [ + "module", + "class", + "function" + ] + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + } + }, + "additionalProperties": false + }, + "PyEntrypoint": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Entrypoint", + "unevaluatedProperties": false + }, + "PyEntrypointReport": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/EntrypointReport", + "unevaluatedProperties": false + }, + "PyRepositoryInfo": { + "description": "Git provenance of the analyzed checkout, captured at analysis time.", + "type": "object", + "required": [ + "revision" + ], + "properties": { + "uri": { + "type": "string" + }, + "revision": { + "type": "string" + }, + "dirty": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "PyCallEdge": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/CallEdge", + "properties": { + "prov": { + "type": "array", + "items": { + "enum": [ + "jedi", + "defuse" + ] + } + } + }, + "unevaluatedProperties": false + }, + "PyExternalSymbol": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ExternalSymbol", + "required": [ + "name" + ], + "properties": { + "kind": { + "const": "external" + }, + "id": { + "description": "can://python//@external//", + "type": "string" + } + }, + "unevaluatedProperties": false + }, + "PyArtifact": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Artifact", + "properties": { + "config_keys": { + "type": "array", + "items": { + "$ref": "#/$defs/PyConfigKey" + } + } + }, + "unevaluatedProperties": false + }, + "PyConfigKey": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ConfigKey", + "properties": { + "namespace": { + "description": "env | yaml | json | toml | ini | properties | dockerfile.", + "type": "string" + }, + "value": { + "description": "Populated only when artifact text capture is on.", + "type": "string" + } + }, + "unevaluatedProperties": false + }, + "PyDependency": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Dependency", + "properties": { + "name": { + "description": "PEP 503 normalized.", + "type": "string" + }, + "ecosystem": { + "const": "pypi" + } + }, + "unevaluatedProperties": false + } + } +} diff --git a/v2/json/typescript/analysis.l4.sample.json b/v2/json/typescript/analysis.l4.sample.json new file mode 100644 index 0000000..c9855ca --- /dev/null +++ b/v2/json/typescript/analysis.l4.sample.json @@ -0,0 +1 @@ +{"schema_version":"2.0.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.5.3"},"application":{"id":"can://sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://sample-app/typescript/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42,"resolved_module":"src/services.ts"}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"types":{"UserController":{"id":"can://sample-app/typescript/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"show":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://sample-app/typescript/src/models.ts/User/describe","method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://sample-app/typescript/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_out"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_in:0"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_out"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"20:5","kind":"fallthrough"},{"src":"20:5","dst":"@exit","kind":"exception"},{"src":"20:5","dst":"21:5","kind":"fallthrough"},{"src":"21:5","dst":"@exit","kind":"exception"},{"src":"21:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:5"},{"src":"20:5","dst":"21:5"}],"ddg":[{"src":"@entry","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"this.service.create","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"20:5/actual_out","dst":"20:5","var":"$ret","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"21:5/actual_out","dst":"21:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"20:5","dst":"20:5","var":"src/services.nextId"},{"src":"20:5/actual_in:0","dst":"20:5/actual_out"}]},"list":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://sample-app/typescript/src/services.ts/UserService/describeAll","method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/list@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"this.service.describeAll","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52,"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"service","id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://sample-app/typescript/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35,"id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@exit"},"@formal_in:0":{"kind":"formal_in","of":"prefix","id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Controller/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[{"src":"5:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Get":{"id":"can://sample-app/typescript/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26,"id":"can://sample-app/typescript/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://sample-app/typescript/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://sample-app/typescript/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://sample-app/typescript/src/controllers.ts/Get@exit"},"@formal_in:0":{"kind":"formal_in","of":"path","id":"can://sample-app/typescript/src/controllers.ts/Get@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Get@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Get/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[{"src":"8:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Param":{"id":"can://sample-app/typescript/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28,"id":"can://sample-app/typescript/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://sample-app/typescript/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://sample-app/typescript/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://sample-app/typescript/src/controllers.ts/Param@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/controllers.ts/Param@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Param@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Param/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[{"src":"11:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"11:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/external-calls.ts":{"id":"can://sample-app/typescript/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3113]},"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"types":{},"functions":{"readsConfig":{"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"15:10":{"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[942,977]},"callee":"can://sample-app/@external/node:fs/readFileSync","method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:10"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@entry"},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,46],"bytes":[935,978]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3"},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@formal_out"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_in:0"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_out"},"15:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"},{"src":"15:3/actual_in:1","dst":"15:3/actual_out"}]},"makesCommand":{"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand","kind":"function","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"27:15":{"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1625,1638]},"callee":"can://sample-app/@external/commander/Command","method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@27:15"},"28:3":{"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1642,1677]},"callee":"can://sample-app/@external/commander/description","method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3"},"28:3/2":{"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1642,1657]},"callee":"can://sample-app/@external/commander/name","method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/2"},"29:3":{"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1681,1710]},"callee":"can://sample-app/@external/commander/parse","method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3"},"@entry":{"kind":"entry","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@entry"},"27:3":{"kind":"statement","span":{"start":[27,3],"end":[27,29],"bytes":[1613,1639]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@27:3"},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,14],"bytes":[1714,1725]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@30:3"},"@exit":{"kind":"exit","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@formal_out"},"28:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"28:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/actual_in:0"},"28:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"28:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/actual_out"},"29:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"29:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3/actual_in:0"},"29:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"29:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"27:3","kind":"fallthrough"},{"src":"27:3","dst":"@exit","kind":"exception"},{"src":"27:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"@exit","kind":"exception"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"27:3"},{"src":"27:3","dst":"28:3"},{"src":"28:3","dst":"29:3"},{"src":"29:3","dst":"30:3"}],"ddg":[{"src":"27:3","dst":"28:3","var":"cmd.name","prov":["reaching-defs"]},{"src":"27:3","dst":"29:3","var":"cmd.parse","prov":["reaching-defs"]},{"src":"27:3","dst":"30:3","var":"cmd","prov":["reaching-defs"]},{"src":"30:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"28:3/actual_in:0","dst":"28:3/actual_out"},{"src":"29:3/actual_in:0","dst":"29:3/actual_out"}]},"makesDriver":{"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver","kind":"function","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"39:10":{"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2058,2090]},"callee":"can://sample-app/@external/neo4j-driver/driver","method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:10"},"@entry":{"kind":"entry","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@entry"},"39:3":{"kind":"statement","span":{"start":[39,3],"end":[39,43],"bytes":[2051,2091]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3"},"@exit":{"kind":"exit","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@formal_out"},"39:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"39:3","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3/actual_in:0"},"39:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"39:3","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"39:3","kind":"fallthrough"},{"src":"39:3","dst":"@exit","kind":"exception"},{"src":"39:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"39:3"}],"ddg":[{"src":"39:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"39:3/actual_in:0","dst":"39:3/actual_out"}]},"makesSession":{"id":"can://sample-app/typescript/src/external-calls.ts/makesSession","kind":"function","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"52:13":{"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2822,2888]},"callee":"can://sample-app/@external/neo4j-driver/driver","method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:13"},"52:46":{"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2855,2887]},"callee":"can://sample-app/@external/neo4j-driver/basic","method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:46"},"53:13":{"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2902,2913]},"callee":"can://sample-app/@external/neo4j-driver-core/session","method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@53:13"},"54:3":{"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2917,2930]},"callee":"can://sample-app/@external/neo4j-driver/rxSession","method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@54:3"},"@entry":{"kind":"entry","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@entry"},"52:3":{"kind":"statement","span":{"start":[52,3],"end":[52,80],"bytes":[2812,2889]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3"},"53:3":{"kind":"statement","span":{"start":[53,3],"end":[53,25],"bytes":[2892,2914]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@53:3"},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[55,12],"bytes":[2934,2943]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@55:3"},"@exit":{"kind":"exit","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@formal_out"},"52:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_in:0"},"52:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_out"},"52:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"52:3","kind":"fallthrough"},{"src":"52:3","dst":"@exit","kind":"exception"},{"src":"52:3","dst":"53:3","kind":"fallthrough"},{"src":"53:3","dst":"@exit","kind":"exception"},{"src":"53:3","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"@exit","kind":"exception"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"52:3"},{"src":"52:3","dst":"53:3"},{"src":"53:3","dst":"54:3"},{"src":"54:3","dst":"55:3"}],"ddg":[{"src":"52:3","dst":"53:3","var":"d.session","prov":["reaching-defs"]},{"src":"52:3","dst":"54:3","var":"d.rxSession","prov":["reaching-defs"]},{"src":"53:3","dst":"55:3","var":"s","prov":["reaching-defs"]},{"src":"55:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"52:3/actual_in:0","dst":"52:3/actual_out"},{"src":"52:3/actual_in:1","dst":"52:3/actual_out"}]},"unsafeEval":{"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval","kind":"function","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39,"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_in:0"}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"60:10":{"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3100,3109]},"callee":"can://sample-app/@external/(builtin)/eval","method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:10"},"@entry":{"kind":"entry","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@entry"},"60:3":{"kind":"statement","span":{"start":[60,3],"end":[60,20],"bytes":[3093,3110]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3"},"@exit":{"kind":"exit","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@exit"},"@formal_in:0":{"kind":"formal_in","of":"raw","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_out"},"60:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"60:3","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3/actual_in:0"},"60:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"60:3","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"60:3","kind":"fallthrough"},{"src":"60:3","dst":"@exit","kind":"exception"},{"src":"60:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"60:3"}],"ddg":[{"src":"@entry","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"60:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"60:3/actual_in:0","dst":"60:3/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"7c9b89100d76783724926bea24ee54872043defa3b9133eab7c34e45cf145700"},"src/external.ts":{"id":"can://sample-app/typescript/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,582]},"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"types":{},"functions":{"fingerprint":{"id":"can://sample-app/typescript/src/external.ts/fingerprint","kind":"function","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41,"id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:14":{"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[342,354]},"callee":"can://sample-app/@external/node:crypto/randomUUID","method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@7:14"},"8:10":{"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[365,427]},"callee":null,"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10"},"8:10/2":{"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[365,408]},"callee":null,"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10/2"},"8:10/3":{"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[365,385]},"callee":"can://sample-app/@external/node:crypto/createHash","method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10/3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,27],"bytes":[331,355]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@7:3"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[10,20],"bytes":[358,428]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_out"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"id","prov":["reaching-defs"]},{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:3/actual_in:0","dst":"8:3/actual_out"}]},"extensionOf":{"id":"can://sample-app/typescript/src/external.ts/extensionOf","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41,"id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"15:10":{"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[560,578]},"callee":"can://sample-app/@external/node:path/extname","method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/extensionOf@15:10"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@entry"},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,29],"bytes":[553,579]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3"},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"file","id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_out"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3","id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3/actual_in:0"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3","id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"049a7393ffc7647fcab8ddeadb0eb82f74c57a385195aec4a4f0700ebf9c88c0"},"src/index.ts":{"id":"can://sample-app/typescript/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,742]},"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://sample-app/typescript/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://sample-app/typescript/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://sample-app/typescript/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/show","method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[503,543]},"callee":"can://sample-app/typescript/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[512,542]},"callee":"can://sample-app/typescript/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[547,574]},"callee":"can://sample-app/typescript/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[556,573]},"callee":"can://sample-app/typescript/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[592,627]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[647,671]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[675,708]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[675,700]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[675,691]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[712,729]},"callee":"can://sample-app/@external/(builtin)/log","method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://sample-app/typescript/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://sample-app/typescript/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://sample-app/typescript/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[579,628]},"id":"can://sample-app/typescript/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[631,672]},"id":"can://sample-app/typescript/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://sample-app/typescript/src/index.ts/main@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/index.ts/main@formal_out"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3","id":"can://sample-app/typescript/src/index.ts/main@11:3/actual_out"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3","id":"can://sample-app/typescript/src/index.ts/main@12:3/actual_out"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3","id":"can://sample-app/typescript/src/index.ts/main@13:3/actual_out"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3","id":"can://sample-app/typescript/src/index.ts/main@7:3/actual_in:0"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_out"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:1"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3","id":"can://sample-app/typescript/src/index.ts/main@11:3/actual_in:0"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3","id":"can://sample-app/typescript/src/index.ts/main@13:3/actual_in:0"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:1"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:2"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3","id":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3","id":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:0"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_out"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:1"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3","id":"can://sample-app/typescript/src/index.ts/main@21:3/actual_in:0"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3","id":"can://sample-app/typescript/src/index.ts/main@22:3/actual_in:0"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3","id":"can://sample-app/typescript/src/index.ts/main@22:3/actual_out"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3","id":"can://sample-app/typescript/src/index.ts/main@7:3/actual_out"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3","id":"can://sample-app/typescript/src/index.ts/main@9:3/actual_out"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3","id":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"12:3","kind":"fallthrough"},{"src":"12:3","dst":"@exit","kind":"exception"},{"src":"12:3","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"exception"},{"src":"16:3","dst":"17:3","kind":"fallthrough"},{"src":"17:3","dst":"@exit","kind":"exception"},{"src":"17:3","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"21:3","kind":"fallthrough"},{"src":"21:3","dst":"@exit","kind":"exception"},{"src":"21:3","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"@exit","kind":"exception"},{"src":"22:3","dst":"@exit","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"11:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"11:3","dst":"12:3"},{"src":"12:3","dst":"13:3"},{"src":"13:3","dst":"16:3"},{"src":"16:3","dst":"17:3"},{"src":"17:3","dst":"19:3"},{"src":"19:3","dst":"20:3"},{"src":"20:3","dst":"21:3"},{"src":"21:3","dst":"22:3"},{"src":"7:3","dst":"8:3"},{"src":"8:3","dst":"9:3"},{"src":"9:3","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"8:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"9:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"11:3","dst":"12:3","var":"controller.list","prov":["reaching-defs"]},{"src":"11:3","dst":"13:3","var":"controller.show","prov":["reaching-defs"]},{"src":"11:3/actual_out","dst":"11:3","var":"$ret","prov":["reaching-defs"]},{"src":"12:3/actual_out","dst":"12:3","var":"$ret","prov":["reaching-defs"]},{"src":"13:3/actual_out","dst":"13:3","var":"$ret","prov":["reaching-defs"]},{"src":"16:3/actual_out","dst":"16:3","var":"$ret","prov":["reaching-defs"]},{"src":"17:3/actual_out","dst":"17:3","var":"$ret","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"19:3/actual_out","dst":"19:3","var":"$ret","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"21:3/actual_out","dst":"21:3","var":"$ret","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3/actual_in:0","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"service.create","prov":["reaching-defs"]},{"src":"7:3","dst":"9:3","var":"service.createGuest","prov":["reaching-defs"]},{"src":"7:3/actual_out","dst":"7:3","var":"$ret","prov":["reaching-defs"]},{"src":"8:3/actual_out","dst":"8:3","var":"$ret","prov":["reaching-defs"]},{"src":"9:3/actual_out","dst":"9:3","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"13:3","dst":"13:3","var":"src/services.nextId"},{"src":"13:3/actual_in:0","dst":"13:3/actual_out"},{"src":"16:3/actual_in:0","dst":"16:3/actual_out"},{"src":"17:3/actual_in:0","dst":"17:3/actual_out"},{"src":"19:3/actual_in:0","dst":"19:3/actual_out"},{"src":"19:3/actual_in:1","dst":"19:3/actual_out"},{"src":"22:3/actual_in:0","dst":"22:3/actual_out"},{"src":"8:3","dst":"8:3","var":"src/services.nextId"},{"src":"8:3/actual_in:0","dst":"8:3/actual_out"},{"src":"8:3/actual_in:1","dst":"8:3/actual_out"},{"src":"9:3","dst":"9:3","var":"src/services.nextId"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://sample-app/typescript/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1237]},"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"types":{"Entity":{"id":"can://sample-app/typescript/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://sample-app/typescript/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37,"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"id":"can://sample-app/typescript/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://sample-app/typescript/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://sample-app/typescript/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://sample-app/typescript/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://sample-app/typescript/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://sample-app/typescript/src/models.ts/User/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"49:5","kind":"fallthrough"},{"src":"49:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"49:5"}],"ddg":[{"src":"@entry","dst":"49:5","var":"this.name","prov":["reaching-defs"]},{"src":"@entry","dst":"49:5","var":"this.role","prov":["reaching-defs"]},{"src":"49:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"recordLogin":{"id":"can://sample-app/typescript/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/recordLogin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"53:5","kind":"fallthrough"},{"src":"53:5","dst":"54:5","kind":"fallthrough"},{"src":"54:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"53:5"},{"src":"@entry","dst":"54:5"}],"ddg":[{"src":"@entry","dst":"53:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"@entry","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"53:5","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"54:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0"},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1"},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://sample-app/typescript/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1"},"@formal_in:2":{"kind":"formal_in","of":"role","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5","id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_out"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5","id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_in:0"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"@exit","kind":"exception"},{"src":"40:5","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"40:5"},{"src":"40:5","dst":"41:5"}],"ddg":[{"src":"@entry","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"40:5/actual_out","dst":"40:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"id":"can://sample-app/typescript/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/isAdmin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"45:5","kind":"fallthrough"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"45:5"}],"ddg":[{"src":"@entry","dst":"45:5","var":"this.role","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{"loginCount":{"id":"can://sample-app/typescript/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://sample-app/typescript/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://sample-app/typescript/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://sample-app/typescript/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://sample-app/typescript/src/models.ts/Entity"],"implements_ids":["can://sample-app/typescript/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://sample-app/typescript/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1099,1236]},"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1202,1230]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Robot/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"62:5","kind":"fallthrough"},{"src":"62:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"62:5"}],"ddg":[{"src":"@entry","dst":"62:5","var":"this.name","prov":["reaching-defs"]},{"src":"62:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34,"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"id":"can://sample-app/typescript/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://sample-app/typescript/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://sample-app/typescript/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"callables":{},"fields":{"id":{"id":"can://sample-app/typescript/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://sample-app/typescript/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://sample-app/typescript/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://sample-app/typescript/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://sample-app/typescript/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://sample-app/typescript/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://sample-app/typescript/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://sample-app/typescript/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://sample-app/typescript/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://sample-app/typescript/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://sample-app/typescript/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://sample-app/typescript/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1240]},"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"types":{"UserService":{"id":"can://sample-app/typescript/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[558,1239]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://sample-app/typescript/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22,"id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0"},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48,"id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[744,784]},"callee":"can://sample-app/typescript/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[803,827]},"callee":"can://sample-app/typescript/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[833,854]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[733,785]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[790,828]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[860,872]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"role","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_out"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_out"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_in:0"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:0"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:1"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:2"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5/actual_in:0"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"25:5","kind":"fallthrough"},{"src":"25:5","dst":"@exit","kind":"exception"},{"src":"25:5","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"27:5","kind":"fallthrough"},{"src":"27:5","dst":"@exit","kind":"exception"},{"src":"27:5","dst":"28:5","kind":"fallthrough"},{"src":"28:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:5"},{"src":"25:5","dst":"26:5"},{"src":"26:5","dst":"27:5"},{"src":"27:5","dst":"28:5"}],"ddg":[{"src":"@entry","dst":"25:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@entry","dst":"27:5","var":"this.users.push","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5/actual_in:1","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5/actual_in:2","var":"role","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"25:5/actual_out","dst":"25:5","var":"$ret","prov":["reaching-defs"]},{"src":"26:5","dst":"27:5","var":"user","prov":["reaching-defs"]},{"src":"26:5","dst":"28:5","var":"user","prov":["reaching-defs"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]},{"src":"28:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"25:5/actual_in:0","dst":"25:5/actual_out"},{"src":"27:5/actual_in:0","dst":"27:5/actual_out"}]},"createGuest":{"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[919,951]},"callee":"can://sample-app/typescript/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[964,993]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[906,952]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[957,994]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@formal_out"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_out"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_out"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_in:0"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:0"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"32:5","kind":"fallthrough"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"32:5","dst":"33:5","kind":"fallthrough"},{"src":"33:5","dst":"@exit","kind":"exception"},{"src":"33:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"32:5"},{"src":"32:5","dst":"33:5"}],"ddg":[{"src":"@entry","dst":"32:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"32:5/actual_in:0","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"this.create","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5","var":"name","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5/actual_in:0","var":"name","prov":["reaching-defs"]},{"src":"32:5/actual_out","dst":"32:5","var":"$ret","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"33:5/actual_out","dst":"33:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"32:5/actual_in:0","dst":"32:5/actual_out"},{"src":"33:5","dst":"33:5","var":"src/services.nextId"},{"src":"33:5/actual_in:0","dst":"33:5/actual_out"},{"src":"33:5/actual_in:1","dst":"33:5/actual_out"}]},"describeAll":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1039,1074]},"callee":"can://sample-app/@external/(builtin)/map","method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1032,1075]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@formal_out"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5/actual_in:0"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5/actual_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1061,1073]},"callee":"can://sample-app/typescript/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@exit"},"@formal_in:0":{"kind":"formal_in","of":"u","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_out"},"37:34/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:34","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"37:34","kind":"fallthrough"},{"src":"37:34","dst":"@exit","kind":"exception"},{"src":"37:34","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:34"}],"ddg":[{"src":"@entry","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"37:34/actual_out","dst":"37:34","var":"$ret","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"37:5","kind":"fallthrough"},{"src":"37:5","dst":"@exit","kind":"exception"},{"src":"37:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:5"}],"ddg":[{"src":"@entry","dst":"37:5","var":"this.users.map","prov":["reaching-defs"]},{"src":"37:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"37:5/actual_in:0","dst":"37:5/actual_out"}]},"loginAll":{"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1193,1208]},"callee":"can://sample-app/typescript/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1123,1137]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1142,1215]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1178,1209]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1220,1233]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@formal_out"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7","id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"43:7","kind":"true"},{"src":"42:5","dst":"45:5","kind":"false"},{"src":"43:7","dst":"@exit","kind":"exception"},{"src":"43:7","dst":"42:5","kind":"loop_back"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"41:5"},{"src":"@entry","dst":"42:5"},{"src":"42:5","dst":"43:7"},{"src":"42:5","dst":"45:5"},{"src":"43:7","dst":"42:5"}],"ddg":[{"src":"@entry","dst":"42:5","var":"this.users","prov":["reaching-defs"]},{"src":"41:5","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"41:5","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"42:5","dst":"43:7","var":"u.recordLogin","prov":["reaching-defs"]},{"src":"43:7","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"43:7","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"43:7/actual_out","dst":"43:7","var":"$ret","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51,"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"startId","id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"id":"can://sample-app/typescript/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[587,614]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://sample-app/typescript/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://sample-app/typescript/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43,"id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[164,187]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@exit"},"@formal_in:0":{"kind":"formal_in","of":"seed","id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"id":"can://sample-app/typescript/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38,"id":"can://sample-app/typescript/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[407,423]},"callee":"can://sample-app/typescript/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://sample-app/typescript/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[400,424]},"id":"can://sample-app/typescript/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://sample-app/typescript/src/services.ts/announce@exit"},"@formal_in:0":{"kind":"formal_in","of":"thing","id":"can://sample-app/typescript/src/services.ts/announce@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/announce@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"id":"can://sample-app/typescript/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[518,555]},"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33,"id":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[550,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@exit"},"@formal_in:0":{"kind":"formal_in","of":"n","id":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/nextId@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"17:46","kind":"fallthrough"},{"src":"17:46","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:46"}],"ddg":[{"src":"@entry","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://sample-app/typescript/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"types":{"StringUtil":{"id":"can://sample-app/typescript/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"types":{"Builder":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@exit"},"@formal_in:0":{"kind":"formal_in","of":"part","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_out"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"14:7","kind":"fallthrough"},{"src":"14:7","dst":"@exit","kind":"exception"},{"src":"14:7","dst":"15:7","kind":"fallthrough"},{"src":"15:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:7"},{"src":"14:7","dst":"15:7"}],"ddg":[{"src":"@entry","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@entry","dst":"14:7","var":"this.parts.push","prov":["reaching-defs"]},{"src":"@entry","dst":"15:7","var":"this","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7/actual_in:0","var":"part","prov":["reaching-defs"]},{"src":"14:7/actual_out","dst":"14:7","var":"$ret","prov":["reaching-defs"]},{"src":"15:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"14:7/actual_in:0","dst":"14:7/actual_out"}]},"build":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://sample-app/@external/(builtin)/join","method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@formal_out"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"18:7","kind":"fallthrough"},{"src":"18:7","dst":"@exit","kind":"exception"},{"src":"18:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"18:7"}],"ddg":[{"src":"@entry","dst":"18:7","var":"this.parts.join","prov":["reaching-defs"]},{"src":"18:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"18:7/actual_in:0","dst":"18:7/actual_out"}]},"constructor":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0"},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://sample-app/@external/(builtin)/repeat","method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"n","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_out"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_in:0"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5/actual_in:0","var":"n","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"4:5/actual_out","dst":"4:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://sample-app/@external/(builtin)/replace","method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://sample-app/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_in:0"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_out"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:5","kind":"fallthrough"},{"src":"8:5","dst":"@exit","kind":"exception"},{"src":"8:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"8:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:5/actual_in:0","dst":"8:5/actual_out"},{"src":"8:5/actual_in:1","dst":"8:5/actual_out"}]}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://sample-app/typescript/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64,"id":"can://sample-app/typescript/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://sample-app/typescript/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://sample-app/typescript/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://sample-app/typescript/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://sample-app/typescript/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://sample-app/typescript/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://sample-app/typescript/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://sample-app/typescript/src/util.ts/classify@exit"},"@formal_in:0":{"kind":"formal_in","of":"items","id":"can://sample-app/typescript/src/util.ts/classify@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/classify@formal_out"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5","id":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_in:0"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5","id":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_out"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5","id":"can://sample-app/typescript/src/util.ts/classify@31:5/actual_in:0"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5","id":"can://sample-app/typescript/src/util.ts/classify@31:5/actual_out"}},"callables":{"keyOf":{"id":"can://sample-app/typescript/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25,"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://sample-app/@external/(builtin)/charAt","method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"item","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_out"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5/actual_in:0"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"26:5/actual_in:0","dst":"26:5/actual_out"}]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"30:5","kind":"true"},{"src":"29:3","dst":"33:3","kind":"false"},{"src":"30:5","dst":"@exit","kind":"exception"},{"src":"30:5","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"29:3","kind":"loop_back"},{"src":"33:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:3"},{"src":"25:3","dst":"28:3"},{"src":"25:3","dst":"29:3"},{"src":"29:3","dst":"30:5"},{"src":"29:3","dst":"33:3"},{"src":"30:5","dst":"31:5"},{"src":"31:5","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"28:3","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"28:3","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5/actual_in:0","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"31:5","var":"item","prov":["reaching-defs"]},{"src":"30:5","dst":"31:5","var":"k","prov":["reaching-defs"]},{"src":"30:5/actual_out","dst":"30:5","var":"$ret","prov":["reaching-defs"]},{"src":"31:5","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"31:5","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"33:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"30:5/actual_in:0","dst":"30:5/actual_out"},{"src":"31:5/actual_in:0","dst":"31:5/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://sample-app/typescript/src/controllers.ts","dst":"can://sample-app/typescript/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts","dst":"can://sample-app/typescript/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/readsConfig","dst":"can://sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesDriver","dst":"can://sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/unsafeEval","dst":"can://sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/fingerprint","dst":"can://sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/fingerprint","dst":"can://sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/extensionOf","dst":"can://sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/models.ts/User/constructor","dst":"can://sample-app/typescript/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/typescript/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/typescript/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest","dst":"can://sample-app/typescript/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll","dst":"can://sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/loginAll","dst":"can://sample-app/typescript/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify","dst":"can://sample-app/typescript/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify/keyOf","dst":"can://sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","dst":"can://sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug","dst":"can://sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug","dst":"can://sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","dst":"can://sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list","dst":"can://sample-app/typescript/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@11:3/actual_in:0","dst":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0","var":"service"},{"src":"can://sample-app/typescript/src/index.ts/main@13:3","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/index.ts/main@13:3/actual_in:0","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/announce@formal_in:0","var":"thing"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:1","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:2","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2","var":"role"},{"src":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/announce@formal_in:0","var":"thing"},{"src":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0","var":"s"},{"src":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:1","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1","var":"n"},{"src":"can://sample-app/typescript/src/index.ts/main@21:3/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0","var":"part"},{"src":"can://sample-app/typescript/src/index.ts/main@7:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0","var":"startId"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:1","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1","var":"role"},{"src":"can://sample-app/typescript/src/index.ts/main@9:3","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0","var":"n"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1","var":"name"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2","var":"role"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0","var":"seed"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1","var":"role"},{"src":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0","var":"item"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0","var":"s"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0","var":"s"}],"param_out":[{"src":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@11:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@12:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@13:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_out","dst":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/describe@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/describe@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/recordLogin@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/announce@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/announce@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/nextId@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@7:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@8:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@9:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_out","dst":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@19:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_out","var":"$ret"}],"artifacts":{"package.json":{"id":"can://sample-app/artifact/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://sample-app/artifact/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[{"module":"commander","prov":[]},{"module":"neo4j-driver","prov":[]}],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":["commander"],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://sample-app/@external/node:fs/readFileSync":{"id":"can://sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://sample-app/@external/commander/Command":{"id":"can://sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://sample-app/@external/commander/description":{"id":"can://sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://sample-app/@external/commander/name":{"id":"can://sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://sample-app/@external/commander/parse":{"id":"can://sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://sample-app/@external/neo4j-driver/driver":{"id":"can://sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://sample-app/@external/neo4j-driver/basic":{"id":"can://sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://sample-app/@external/neo4j-driver-core/session":{"id":"can://sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://sample-app/@external/neo4j-driver/rxSession":{"id":"can://sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://sample-app/@external/(builtin)/eval":{"id":"can://sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://sample-app/@external/node:crypto/randomUUID":{"id":"can://sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://sample-app/@external/node:crypto/createHash":{"id":"can://sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://sample-app/@external/node:path/extname":{"id":"can://sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://sample-app/@external/(builtin)/log":{"id":"can://sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://sample-app/@external/(builtin)/push":{"id":"can://sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://sample-app/@external/(builtin)/map":{"id":"can://sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://sample-app/@external/(builtin)/charAt":{"id":"can://sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://sample-app/@external/(builtin)/repeat":{"id":"can://sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://sample-app/@external/(builtin)/replace":{"id":"can://sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://sample-app/@external/(builtin)/toLowerCase":{"id":"can://sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://sample-app/@external/(builtin)/join":{"id":"can://sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://sample-app/typescript/src/controllers.ts/Controller@5:10":{"id":"can://sample-app/typescript/src/controllers.ts/Controller/","kind":"callable"},"can://sample-app/typescript/src/controllers.ts/Get@8:10":{"id":"can://sample-app/typescript/src/controllers.ts/Get/","kind":"callable"},"can://sample-app/typescript/src/controllers.ts/Param@11:10":{"id":"can://sample-app/typescript/src/controllers.ts/Param/","kind":"callable"},"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:27":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/v2/json/typescript/analysis.schema.json b/v2/json/typescript/analysis.schema.json new file mode 100644 index 0000000..6d90803 --- /dev/null +++ b/v2/json/typescript/analysis.schema.json @@ -0,0 +1,901 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://codellm-devkit.github.io/schema/v2/typescript/analysis.schema.json", + "title": "codeanalyzer-typescript v2 analysis output", + "description": "What codeanalyzer-typescript (cants) v1.2.0 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction. Field names are the snake_case interface members of src/schema/schema.ts; the emitter strips the internal join fields (call_sites, config_accesses, abs_path) and the module cache metadata (last_modified, file_size) from the wire, keeping content_hash.", + "x-cldk": { + "schemaVersion": "2.0.0", + "language": "typescript", + "source": { + "repo": "codellm-devkit/codeanalyzer-typescript", + "release": "v1.2.0", + "definedIn": "src/schema/schema.ts (+ src/schema/homing.ts)" + }, + "canonical": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json", + "extends": [ + "type kinds: interface, enum, type_alias, namespace (a namespace carries the same buckets as a module)", + "callable kinds: getter, setter, arrow, function_expression; plus overload_signatures and the is_* declaration flags", + "type: implements_types, extends_ids/implements_ids (resolved heritage), call_signatures, index_signatures, aliased_type, is_const, type_parameters", + "module: exports, is_tsx, is_declaration_file, fields", + "body node: config_access nodes (root, key) and call facts (argument_types, type_arguments, is_optional_chain)", + "application: synthesized_callables (the anonymous-callable compatibility index), config_reads", + "edges: summary carries an optional `var` (param_in / param_out carry the spine's required `var`)", + "entrypoints: callables and types carry `entrypoints` / `is_entrypoint`, and the application an `entrypoint_report`" + ], + "diverges": [ + "supertypes are `base_classes` (not the canonical `base_types`) - the union of extends + implements, with implements_types the typed split", + "leaf nodes (import, export, comment, parameter, decorator) carry flat start_line/start_column/end_line/end_column instead of a span", + "span.bytes are UTF-16 char offsets into module.source (java and python use UTF-8 byte offsets)", + "an unresolved call node emits `callee: null` rather than omitting the key", + "unresolved config reads are `config_reads` (python calls the same list `config_reads_unresolved`)", + "the L3 syntactic ddg provenance token is `reaching-defs` (java uses `ssa`)" + ] + }, + "allOf": [ + { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json" + } + ], + "properties": { + "language": { + "const": "typescript" + }, + "application": { + "$ref": "#/$defs/TSApplication" + } + }, + "unevaluatedProperties": false, + "$defs": { + "TSApplication": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Application", + "properties": { + "symbol_table": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSModule" + } + }, + "external_symbols": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSExternalNode" + } + }, + "synthesized_callables": { + "description": "L2 compatibility index: an older anonymous-callable id mapped onto the tree id that replaced it. Entries whose key equals their own id are residual fallback nodes for signatures no provider could name.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSSynthesizedNode" + } + }, + "artifacts": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSArtifact" + } + }, + "dependencies": { + "type": "array", + "items": { + "$ref": "#/$defs/TSDependency" + } + }, + "param_in": { + "type": "array", + "items": { + "$ref": "#/$defs/TSParamEdge" + } + }, + "param_out": { + "type": "array", + "items": { + "$ref": "#/$defs/TSParamEdge" + } + }, + "config_reads": { + "type": "array", + "items": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ConfigRead" + } + }, + "entrypoint_report": { + "$ref": "#/$defs/TSEntrypointReport" + } + }, + "unevaluatedProperties": false + }, + "TSModule": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Module", + "required": [ + "span" + ], + "properties": { + "imports": { + "type": "array", + "items": { + "$ref": "#/$defs/TSImport" + } + }, + "exports": { + "type": "array", + "items": { + "$ref": "#/$defs/TSExport" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/TSComment" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSType" + } + }, + "functions": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSCallable" + } + }, + "fields": { + "description": "Module-level const/let/var bindings.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSField" + } + }, + "is_tsx": { + "type": "boolean" + }, + "is_declaration_file": { + "type": "boolean" + } + }, + "unevaluatedProperties": false + }, + "TSType": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Type", + "required": [ + "name", + "signature" + ], + "properties": { + "kind": { + "enum": [ + "class", + "interface", + "enum", + "type_alias", + "namespace" + ] + }, + "base_classes": { + "description": "The spine's supertype list: extends + implements, as signature strings.", + "type": "array", + "items": { + "type": "string" + } + }, + "implements_types": { + "description": "The typed split: just the implemented interfaces.", + "type": "array", + "items": { + "type": "string" + } + }, + "extends_ids": { + "description": "Resolved can:// ids of the extended class/interface(s), stamped by the heritage pass.", + "type": "array", + "items": { + "type": "string" + } + }, + "implements_ids": { + "description": "Resolved can:// ids of implemented interfaces (classes only).", + "type": "array", + "items": { + "type": "string" + } + }, + "callables": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSCallable" + } + }, + "functions": { + "description": "Namespace-level callables (a namespace has a module's buckets).", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSCallable" + } + }, + "fields": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSField" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSType" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/TSComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/TSDecorator" + } + }, + "type_parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/TSTypeParameter" + } + }, + "call_signatures": { + "description": "Raw text of an interface's call/construct signatures.", + "type": "array", + "items": { + "type": "string" + } + }, + "index_signatures": { + "description": "Raw text of `[key: string]: T` members.", + "type": "array", + "items": { + "type": "string" + } + }, + "aliased_type": { + "description": "type_alias only: the right-hand-side type text.", + "type": "string" + }, + "is_const": { + "description": "enum only.", + "type": "boolean" + }, + "is_abstract": { + "type": "boolean" + }, + "is_exported": { + "type": "boolean" + }, + "is_ambient": { + "description": "Declared with `declare`.", + "type": "boolean" + }, + "entrypoints": { + "type": "array", + "items": { + "$ref": "#/$defs/TSEntrypoint" + } + }, + "is_entrypoint": { + "type": "boolean" + } + }, + "unevaluatedProperties": false + }, + "TSCallable": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Callable", + "required": [ + "name" + ], + "properties": { + "kind": { + "enum": [ + "function", + "method", + "constructor", + "getter", + "setter", + "arrow", + "function_expression" + ] + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/TSCallableParameter" + } + }, + "type_parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/TSTypeParameter" + } + }, + "overload_signatures": { + "type": "array", + "items": { + "$ref": "#/$defs/TSOverloadSignature" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/TSComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/TSDecorator" + } + }, + "cyclomatic_complexity": { + "type": "integer" + }, + "accessibility": { + "enum": [ + "public", + "private", + "protected" + ] + }, + "accessor_kind": { + "enum": [ + "getter", + "setter" + ] + }, + "is_static": { + "type": "boolean" + }, + "is_abstract": { + "type": "boolean" + }, + "is_async": { + "type": "boolean" + }, + "is_generator": { + "type": "boolean" + }, + "is_optional": { + "type": "boolean" + }, + "is_readonly": { + "type": "boolean" + }, + "is_exported": { + "type": "boolean" + }, + "is_ambient": { + "type": "boolean" + }, + "is_implicit": { + "description": "A synthesized default constructor.", + "type": "boolean" + }, + "body": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSBodyNode" + } + }, + "callables": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSCallable" + } + }, + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/TSType" + } + }, + "cdg": { + "type": "array", + "items": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/IdEdge" + } + }, + "summary": { + "type": "array", + "items": { + "$ref": "#/$defs/TSSummaryEdge" + } + }, + "entrypoints": { + "type": "array", + "items": { + "$ref": "#/$defs/TSEntrypoint" + } + }, + "is_entrypoint": { + "type": "boolean" + } + }, + "unevaluatedProperties": false + }, + "TSBodyNode": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/BodyNode", + "properties": { + "kind": { + "enum": [ + "call", + "config_access", + "statement", + "entry", + "exit", + "formal_in", + "formal_out", + "actual_in", + "actual_out" + ], + "description": "What this analyzer actually emits: `call` and `config_access` at L1, `statement` plus the synthetic `entry`/`exit` at L3, and the param vertices at L4. Branching and returns are carried by the `cfg` edge kinds, not by distinct body-node kinds (src/schema/graphs.ts GraphNodeKind)." + }, + "method_name": { + "type": "string" + }, + "receiver_expr": { + "type": "string" + }, + "receiver_type": { + "type": "string" + }, + "argument_types": { + "type": "array", + "items": { + "type": "string" + } + }, + "type_arguments": { + "description": "Explicit call type arguments, foo().", + "type": "array", + "items": { + "type": "string" + } + }, + "return_type": { + "type": "string" + }, + "is_constructor_call": { + "type": "boolean" + }, + "is_optional_chain": { + "type": "boolean" + }, + "root": { + "description": "config_access nodes: the read root - process.env | import.meta.env | Bun.env.", + "type": "string" + }, + "key": { + "description": "config_access nodes: the key, when statically known.", + "type": "string" + }, + "id": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/BodyNode/properties/id" + } + }, + "unevaluatedProperties": false, + "required": [ + "id" + ] + }, + "TSField": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Field", + "properties": { + "scope": { + "enum": [ + "module", + "namespace" + ] + }, + "declaration_kind": { + "enum": [ + "const", + "let", + "var", + "using", + "unknown" + ] + }, + "value": { + "description": "enum member: initializer text or computed const value.", + "type": "string" + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/$defs/TSComment" + } + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/TSDecorator" + } + }, + "accessibility": { + "enum": [ + "public", + "private", + "protected" + ] + }, + "is_exported": { + "type": "boolean" + }, + "is_static": { + "type": "boolean" + }, + "is_readonly": { + "type": "boolean" + }, + "is_optional": { + "type": "boolean" + }, + "is_abstract": { + "type": "boolean" + } + }, + "unevaluatedProperties": false + }, + "TSCallableParameter": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Parameter", + "properties": { + "is_optional": { + "type": "boolean" + }, + "is_rest": { + "type": "boolean" + }, + "is_readonly": { + "description": "A parameter property, constructor(readonly x: T).", + "type": "boolean" + }, + "accessibility": { + "description": "Parameter-property visibility (TS shorthand / NestJS DI).", + "enum": [ + "public", + "private", + "protected" + ] + }, + "decorators": { + "type": "array", + "items": { + "$ref": "#/$defs/TSDecorator" + } + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + }, + "id": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Parameter/properties/id" + } + }, + "unevaluatedProperties": false, + "required": [ + "id" + ] + }, + "TSOverloadSignature": { + "description": "One declared overload of an implementation signature.", + "type": "object", + "properties": { + "parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/TSCallableParameter" + } + }, + "return_type": { + "type": "string" + }, + "type_parameters": { + "type": "array", + "items": { + "$ref": "#/$defs/TSTypeParameter" + } + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + } + }, + "additionalProperties": false + }, + "TSTypeParameter": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "constraint": { + "description": "The `extends ...` clause text.", + "type": "string" + }, + "default": { + "description": "The `= ...` clause text.", + "type": "string" + } + }, + "additionalProperties": false + }, + "TSImport": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Import", + "required": [ + "module" + ], + "properties": { + "module": { + "description": "The module specifier, e.g. ./user or @nestjs/common.", + "type": "string" + }, + "name": { + "description": "The imported binding: \"\" for a side-effect import, \"*\" for a namespace import.", + "type": "string" + }, + "is_type_only": { + "type": "boolean" + }, + "import_kind": { + "enum": [ + "named", + "default", + "namespace", + "side_effect" + ] + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + }, + "resolved_module": { + "description": "The module the import resolved to, when it could be resolved.", + "type": "string" + } + }, + "unevaluatedProperties": false + }, + "TSExport": { + "description": "One export declaration.", + "type": "object", + "required": [ + "name" + ], + "properties": { + "module": { + "description": "Re-export source; absent for `export { x }`.", + "type": "string" + }, + "name": { + "description": "The exported name; \"*\" for `export * from`.", + "type": "string" + }, + "alias": { + "type": "string" + }, + "is_type_only": { + "type": "boolean" + }, + "export_kind": { + "enum": [ + "named", + "default", + "namespace", + "re_export" + ] + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + } + }, + "additionalProperties": false + }, + "TSComment": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Comment", + "properties": { + "is_docstring": { + "description": "A JSDoc block attached to a declaration.", + "type": "boolean" + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + } + }, + "unevaluatedProperties": false + }, + "TSDecorator": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Decorator", + "properties": { + "positional_arguments": { + "description": "Raw source fragments.", + "type": "array", + "items": { + "type": "string" + } + }, + "keyword_arguments": { + "description": "Object-literal arguments flattened to key -> source.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "start_line": { + "type": "integer" + }, + "end_line": { + "type": "integer" + }, + "start_column": { + "type": "integer" + }, + "end_column": { + "type": "integer" + } + }, + "unevaluatedProperties": false + }, + "TSParamEdge": { + "description": "A param_in / param_out edge: the spine ParamEdge, `var` required (the bound formal, `$ret`, or a global path).", + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ParamEdge", + "unevaluatedProperties": false + }, + "TSExternalNode": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ExternalSymbol", + "required": [ + "id", + "module", + "name" + ], + "properties": { + "kind": { + "const": "external" + } + }, + "unevaluatedProperties": false + }, + "TSSynthesizedNode": { + "description": "A pointer node in the anonymous-callable compatibility index, or a residual fallback node.", + "type": "object", + "required": [ + "id", + "kind" + ], + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "span": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Span" + } + }, + "additionalProperties": false + }, + "TSArtifact": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Artifact", + "properties": { + "config_keys": { + "type": "array", + "items": { + "$ref": "#/$defs/TSConfigKey" + } + } + }, + "unevaluatedProperties": false + }, + "TSConfigKey": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/ConfigKey", + "properties": { + "namespace": { + "description": "env | json | yaml | toml | ini | properties | dockerfile.", + "type": "string" + }, + "value": { + "type": [ + "string", + "number", + "boolean" + ] + }, + "span": { + "description": "Best-effort: exact for yaml, line-based for env/ini/dockerfile, ABSENT for json/jsonc (JSON.parse discards positions, and a re-derived one would be a lie).", + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Span" + } + }, + "unevaluatedProperties": false + }, + "TSDependency": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Dependency", + "properties": { + "name": { + "description": "npm-native, @scope kept.", + "type": "string" + }, + "kind": { + "enum": [ + "runtime", + "dev", + "optional", + "peer", + "build" + ] + } + }, + "unevaluatedProperties": false + }, + "TSSummaryEdge": { + "description": "A summary edge (callable scope, local endpoints). TypeScript carries the flowed name on it when known.", + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/IdEdge", + "properties": { + "var": { + "type": "string" + } + }, + "unevaluatedProperties": false + }, + "TSEntrypoint": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/Entrypoint", + "unevaluatedProperties": false + }, + "TSEntrypointReport": { + "$ref": "https://codellm-devkit.github.io/schema/v2/analysis.schema.json#/$defs/EntrypointReport", + "unevaluatedProperties": false + } + } +} diff --git a/v2/neo4j/contract.schema.json b/v2/neo4j/contract.schema.json new file mode 100644 index 0000000..f99d4e8 --- /dev/null +++ b/v2/neo4j/contract.schema.json @@ -0,0 +1,484 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://codellm-devkit.github.io/schema/v2/neo4j/contract.schema.json", + "title": "codeanalyzer Neo4j graph contract (v2 line)", + "description": "Meta-schema for the schema.neo4j.json document each codeanalyzer emits with `--emit schema`. The document describes the graph an analyzer writes - node labels, relationship types, and the constraints and indexes the loader creates - so it is a contract about a graph, not a JSON Schema for analysis.json. Its schema_version runs on its own line from the analysis schema version; on the v2 analyzers both happen to read 2.0.0. What changed from the v1 meta-schema: v2 introduces a SHARED, deliberately un-prefixed cross-language layer (Artifact, Package, ConfigKey, and the HAS_ARTIFACT / DEFINES_CONFIG / DECLARES_DEPENDENCY / LOCKS relationships), so that two analyzers scanning one polyglot repository merge onto the same repo-level nodes instead of minting duplicates. Every other label and relationship type still carries its language prefix - J/J_ for Java, Py/PY_ for Python, TS/TS_ for TypeScript - everywhere it appears, including inside the Cypher statements.", + "x-cldk": { + "kind": "neo4j-graph-contract", + "sources": [ + { + "repo": "codellm-devkit/codeanalyzer-java", + "release": "v3.0.1", + "schemaVersion": "2.0.0", + "path": "schema.neo4j.json" + }, + { + "repo": "codellm-devkit/codeanalyzer-python", + "release": "v1.4.0", + "schemaVersion": "2.0.0", + "path": "schema.neo4j.json" + }, + { + "repo": "codellm-devkit/codeanalyzer-typescript", + "release": "v1.2.0", + "schemaVersion": "2.0.0", + "path": "schema.neo4j.json" + } + ], + "note": "The copies under v2/neo4j// are byte-identical to the tagged release, so `diff` against the analyzer repo is the drift check.", + "knownDivergences": [ + "typescript writes its Application and CanNode constraints un-prefixed (:Application, :CanNode) while its node_labels list TSApplication; java and python prefix both (JApplication/JCanNode, PyApplication). The two labels are allowed here for typescript only, so the check stays honest about what ships rather than green on a rule nobody follows.", + "java retired the `_module` node property in v2; python and typescript still index on it." + ], + "validates": [ + "*/schema.neo4j.json" + ] + }, + "type": "object", + "required": [ + "schema_version", + "generator", + "node_labels", + "relationship_types" + ], + "additionalProperties": false, + "properties": { + "schema_version": { + "description": "Version of the graph contract itself, independent of the analysis schema version.", + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "generator": { + "description": "Analyzer that emitted this contract. Closed set — a new analyzer must register its label prefix under $defs/prefixRules before its contract can validate.", + "type": "string", + "enum": [ + "codeanalyzer-java", + "codeanalyzer-python", + "codeanalyzer-typescript" + ] + }, + "marker_labels": { + "description": "Extra labels attached to nodes that satisfy some property (e.g. JEntrypoint), rather than to a node kind.", + "type": "array", + "items": { + "type": "string" + } + }, + "node_labels": { + "type": "array", + "items": { + "$ref": "#/$defs/NodeLabel" + }, + "minItems": 1 + }, + "relationship_types": { + "type": "array", + "items": { + "$ref": "#/$defs/RelationshipType" + }, + "minItems": 1 + }, + "constraints": { + "description": "Cypher CREATE CONSTRAINT statements the loader runs before ingest.", + "type": "array", + "items": { + "type": "string", + "pattern": "^CREATE CONSTRAINT " + } + }, + "indexes": { + "description": "Cypher CREATE INDEX statements the loader runs before ingest.", + "type": "array", + "items": { + "type": "string", + "pattern": "^CREATE (INDEX|FULLTEXT INDEX|VECTOR INDEX) " + } + }, + "x-cldk": { + "description": "Provenance annotation carried by a tracked copy, not something an analyzer emits. Present only on a copy that is not byte-identical to its release, where it records the origin and what was changed.", + "type": "object", + "required": [ + "normalized", + "origin" + ], + "properties": { + "normalized": { + "type": "boolean" + }, + "origin": { + "type": "object", + "required": [ + "repo", + "release" + ], + "properties": { + "repo": { + "type": "string" + }, + "release": { + "type": "string" + }, + "path": { + "type": "string" + }, + "schemaVersion": { + "type": "string" + } + } + }, + "note": { + "type": "string" + } + } + } + }, + "$defs": { + "NodeLabel": { + "type": "object", + "required": [ + "label", + "key", + "properties" + ], + "additionalProperties": false, + "properties": { + "label": { + "description": "Neo4j label written on the node.", + "type": "string", + "pattern": "^[A-Za-z][A-Za-z0-9_]*$" + }, + "merge_label": { + "description": "Label used in the MERGE that upserts the node, when it differs from `label`. Java and Python spell this merge_label; TypeScript spells it mergeLabel. Either is accepted here — the divergence is real in the shipped contracts.", + "type": "string" + }, + "mergeLabel": { + "description": "TypeScript's spelling of merge_label. See the note on merge_label.", + "type": "string" + }, + "key": { + "description": "Property that uniquely identifies a node with this label.", + "type": "string" + }, + "properties": { + "description": "Property name to property type. Values are contract type names, not JSON Schema types.", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PropertyType" + } + } + }, + "anyOf": [ + { + "required": [ + "merge_label" + ] + }, + { + "required": [ + "mergeLabel" + ] + } + ] + }, + "RelationshipType": { + "type": "object", + "required": [ + "type", + "from", + "to" + ], + "additionalProperties": false, + "properties": { + "type": { + "description": "Relationship type written on the edge, e.g. PY_HAS_MODULE.", + "type": "string", + "pattern": "^[A-Z][A-Z0-9_]*$" + }, + "from": { + "description": "Node labels this edge may start at.", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "to": { + "description": "Node labels this edge may end at.", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/PropertyType" + } + } + } + }, + "PropertyType": { + "description": "Contract-level property type. This is the set the three shipped contracts use; extend it when an analyzer starts emitting a new one.", + "type": "string", + "enum": [ + "string", + "integer", + "float", + "boolean", + "string[]", + "integer[]", + "float[]", + "boolean[]" + ] + }, + "prefixRules": { + "description": "Per-language naming rules. Every label an analyzer writes - node label, merge label, marker label, relationship endpoint, and every label referenced from a Cypher constraint or index - carries that language's prefix, EXCEPT the shared cross-language vocabulary (Artifact, Package, ConfigKey and the four repo-level relationship types), which is un-prefixed on purpose so sibling analyzers merge onto one node. Anything else generic is a contract violation: two analyzers loading into one database would collide on it.", + "java": { + "properties": { + "marker_labels": { + "items": { + "type": "string", + "pattern": "^(J[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + }, + "node_labels": { + "items": { + "properties": { + "label": { + "type": "string", + "pattern": "^(J[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + }, + "merge_label": { + "type": "string", + "pattern": "^(J[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + }, + "mergeLabel": { + "type": "string", + "pattern": "^(J[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + } + } + }, + "relationship_types": { + "items": { + "properties": { + "type": { + "type": "string", + "pattern": "^(J_[A-Z][A-Z0-9_]*|HAS_ARTIFACT|DEFINES_CONFIG|DECLARES_DEPENDENCY|LOCKS)$" + }, + "from": { + "items": { + "type": "string", + "pattern": "^(J[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + }, + "to": { + "items": { + "type": "string", + "pattern": "^(J[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + } + } + } + }, + "constraints": { + "items": { + "type": "string", + "not": { + "pattern": "\\([A-Za-z_][A-Za-z0-9_]*:(?!J[A-Z]|(?:Artifact|Package|ConfigKey)\\b)" + } + } + }, + "indexes": { + "items": { + "type": "string", + "not": { + "pattern": "\\([A-Za-z_][A-Za-z0-9_]*:(?!J[A-Z]|(?:Artifact|Package|ConfigKey)\\b)" + } + } + } + } + }, + "python": { + "properties": { + "marker_labels": { + "items": { + "type": "string", + "pattern": "^(Py[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + }, + "node_labels": { + "items": { + "properties": { + "label": { + "type": "string", + "pattern": "^(Py[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + }, + "merge_label": { + "type": "string", + "pattern": "^(Py[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + }, + "mergeLabel": { + "type": "string", + "pattern": "^(Py[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + } + } + }, + "relationship_types": { + "items": { + "properties": { + "type": { + "type": "string", + "pattern": "^(PY_[A-Z][A-Z0-9_]*|HAS_ARTIFACT|DEFINES_CONFIG|DECLARES_DEPENDENCY|LOCKS)$" + }, + "from": { + "items": { + "type": "string", + "pattern": "^(Py[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + }, + "to": { + "items": { + "type": "string", + "pattern": "^(Py[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey)$" + } + } + } + } + }, + "constraints": { + "items": { + "type": "string", + "not": { + "pattern": "\\([A-Za-z_][A-Za-z0-9_]*:(?!Py[A-Z]|(?:Artifact|Package|ConfigKey)\\b)" + } + } + }, + "indexes": { + "items": { + "type": "string", + "not": { + "pattern": "\\([A-Za-z_][A-Za-z0-9_]*:(?!Py[A-Z]|(?:Artifact|Package|ConfigKey)\\b)" + } + } + } + } + }, + "typescript": { + "properties": { + "marker_labels": { + "items": { + "type": "string", + "pattern": "^((TS|JS)[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey|Application|CanNode)$" + } + }, + "node_labels": { + "items": { + "properties": { + "label": { + "type": "string", + "pattern": "^((TS|JS)[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey|Application|CanNode)$" + }, + "merge_label": { + "type": "string", + "pattern": "^((TS|JS)[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey|Application|CanNode)$" + }, + "mergeLabel": { + "type": "string", + "pattern": "^((TS|JS)[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey|Application|CanNode)$" + } + } + } + }, + "relationship_types": { + "items": { + "properties": { + "type": { + "type": "string", + "pattern": "^(TS_[A-Z][A-Z0-9_]*|HAS_ARTIFACT|DEFINES_CONFIG|DECLARES_DEPENDENCY|LOCKS)$" + }, + "from": { + "items": { + "type": "string", + "pattern": "^((TS|JS)[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey|Application|CanNode)$" + } + }, + "to": { + "items": { + "type": "string", + "pattern": "^((TS|JS)[A-Z][A-Za-z0-9_]*|Artifact|Package|ConfigKey|Application|CanNode)$" + } + } + } + } + }, + "constraints": { + "items": { + "type": "string", + "not": { + "pattern": "\\([A-Za-z_][A-Za-z0-9_]*:(?!(?:TS|JS)[A-Z]|(?:Artifact|Package|ConfigKey|Application|CanNode)\\b)" + } + } + }, + "indexes": { + "items": { + "type": "string", + "not": { + "pattern": "\\([A-Za-z_][A-Za-z0-9_]*:(?!(?:TS|JS)[A-Z]|(?:Artifact|Package|ConfigKey|Application|CanNode)\\b)" + } + } + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "generator": { + "const": "codeanalyzer-java" + } + }, + "required": [ + "generator" + ] + }, + "then": { + "$ref": "#/$defs/prefixRules/java" + } + }, + { + "if": { + "properties": { + "generator": { + "const": "codeanalyzer-python" + } + }, + "required": [ + "generator" + ] + }, + "then": { + "$ref": "#/$defs/prefixRules/python" + } + }, + { + "if": { + "properties": { + "generator": { + "const": "codeanalyzer-typescript" + } + }, + "required": [ + "generator" + ] + }, + "then": { + "$ref": "#/$defs/prefixRules/typescript" + } + } + ] +} diff --git a/v2/neo4j/java/schema.neo4j.json b/v2/neo4j/java/schema.neo4j.json new file mode 100644 index 0000000..d062a39 --- /dev/null +++ b/v2/neo4j/java/schema.neo4j.json @@ -0,0 +1,552 @@ +{ + "schema_version": "2.0.0", + "generator": "codeanalyzer-java", + "marker_labels": [ + "JEntrypoint", + "JCanNode" + ], + "node_labels": [ + { + "label": "JApplication", + "merge_label": "JApplication", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "schema_version": "string", + "analyzer_name": "string", + "analyzer_version": "string", + "entrypoint_frameworks": "string[]", + "entrypoint_report_json": "string" + } + }, + { + "label": "JModule", + "merge_label": "JModule", + "key": "id", + "properties": { + "id": "string", + "file_key": "string", + "package": "string", + "content_hash": "string" + } + }, + { + "label": "JType", + "merge_label": "JSymbol", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "kind": "string", + "modifiers": "string[]", + "base_types": "string[]", + "interfaces": "string[]", + "docstring": "string", + "is_entrypoint": "boolean", + "entrypoint_frameworks": "string[]", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "JCallable", + "merge_label": "JSymbol", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "signature": "string", + "kind": "string", + "declaration": "string", + "return_type": "string", + "parameters_json": "string", + "modifiers": "string[]", + "error_channel": "string[]", + "code": "string", + "docstring": "string", + "cyclomatic_complexity": "integer", + "referenced_types": "string[]", + "accessed_fields": "string[]", + "is_implicit": "boolean", + "is_entrypoint": "boolean", + "entrypoint_frameworks": "string[]", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "JExternal", + "merge_label": "JSymbol", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "declaring_type": "string" + } + }, + { + "label": "JField", + "merge_label": "JField", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "type": "string", + "initializer": "string", + "modifiers": "string[]", + "docstring": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "JVariable", + "merge_label": "JVariable", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "type": "string", + "initializer": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "JEnumConstant", + "merge_label": "JEnumConstant", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "arguments": "string[]", + "docstring": "string" + } + }, + { + "label": "JRecordComponent", + "merge_label": "JRecordComponent", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "type": "string", + "modifiers": "string[]", + "is_variadic": "boolean", + "docstring": "string" + } + }, + { + "label": "JBodyNode", + "merge_label": "JBodyNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "method_name": "string", + "receiver_expr": "string", + "receiver_type": "string", + "return_type": "string", + "accessibility": "string", + "is_constructor_call": "boolean", + "is_static_call": "boolean", + "argument_types": "string[]", + "argument_expr": "string[]", + "var": "string", + "call_node": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "JPackage", + "merge_label": "JPackage", + "key": "name", + "properties": { + "name": "string" + } + }, + { + "label": "JAnnotation", + "merge_label": "JAnnotation", + "key": "name", + "properties": { + "name": "string" + } + }, + { + "label": "Artifact", + "merge_label": "Artifact", + "key": "id", + "properties": { + "id": "string", + "path": "string", + "format": "string", + "roles": "string[]", + "size_bytes": "integer", + "sha256": "string", + "source": "string", + "text_truncated": "boolean", + "extraction": "string" + } + }, + { + "label": "Package", + "merge_label": "Package", + "key": "id", + "properties": { + "id": "string", + "ecosystem": "string", + "group": "string", + "name": "string" + } + }, + { + "label": "ConfigKey", + "merge_label": "ConfigKey", + "key": "id", + "properties": { + "id": "string", + "key": "string", + "namespace": "string", + "value": "string", + "references": "string[]", + "start_line": "integer", + "end_line": "integer" + } + } + ], + "relationship_types": [ + { + "type": "J_HAS_MODULE", + "from": [ + "JApplication" + ], + "to": [ + "JModule" + ], + "properties": {} + }, + { + "type": "J_DECLARES", + "from": [ + "JModule", + "JType", + "JCallable" + ], + "to": [ + "JType" + ], + "properties": {} + }, + { + "type": "J_HAS_METHOD", + "from": [ + "JType" + ], + "to": [ + "JCallable" + ], + "properties": {} + }, + { + "type": "J_HAS_FIELD", + "from": [ + "JType" + ], + "to": [ + "JField" + ], + "properties": {} + }, + { + "type": "J_DECLARES_VAR", + "from": [ + "JCallable" + ], + "to": [ + "JVariable" + ], + "properties": {} + }, + { + "type": "J_HAS_ENUM_CONSTANT", + "from": [ + "JType" + ], + "to": [ + "JEnumConstant" + ], + "properties": {} + }, + { + "type": "J_HAS_RECORD_COMPONENT", + "from": [ + "JType" + ], + "to": [ + "JRecordComponent" + ], + "properties": {} + }, + { + "type": "J_HAS_BODY_NODE", + "from": [ + "JCallable" + ], + "to": [ + "JBodyNode" + ], + "properties": {} + }, + { + "type": "J_RESOLVES_TO", + "from": [ + "JBodyNode" + ], + "to": [ + "JCallable", + "JExternal" + ], + "properties": {} + }, + { + "type": "J_CALLS", + "from": [ + "JCallable", + "JExternal" + ], + "to": [ + "JCallable", + "JExternal" + ], + "properties": { + "weight": "integer", + "prov": "string[]" + } + }, + { + "type": "J_EXTENDS", + "from": [ + "JType" + ], + "to": [ + "JType" + ], + "properties": {} + }, + { + "type": "J_IMPLEMENTS", + "from": [ + "JType" + ], + "to": [ + "JType" + ], + "properties": {} + }, + { + "type": "J_IMPORTS", + "from": [ + "JModule" + ], + "to": [ + "JModule", + "JPackage" + ], + "properties": { + "spellings": "string[]", + "is_static": "boolean", + "is_wildcard": "boolean" + } + }, + { + "type": "J_ANNOTATED_BY", + "from": [ + "JType", + "JCallable", + "JField" + ], + "to": [ + "JAnnotation" + ], + "properties": { + "arguments": "string[]" + } + }, + { + "type": "J_CFG_NEXT", + "from": [ + "JBodyNode" + ], + "to": [ + "JBodyNode" + ], + "properties": { + "kind": "string", + "_k": "string" + } + }, + { + "type": "J_CDG", + "from": [ + "JBodyNode" + ], + "to": [ + "JBodyNode" + ], + "properties": {} + }, + { + "type": "J_DDG", + "from": [ + "JBodyNode" + ], + "to": [ + "JBodyNode" + ], + "properties": { + "var": "string", + "prov": "string[]", + "_k": "string" + } + }, + { + "type": "J_PARAM_IN", + "from": [ + "JBodyNode" + ], + "to": [ + "JBodyNode" + ], + "properties": { + "var": "string" + } + }, + { + "type": "J_PARAM_OUT", + "from": [ + "JBodyNode" + ], + "to": [ + "JBodyNode" + ], + "properties": { + "var": "string" + } + }, + { + "type": "J_SUMMARY", + "from": [ + "JBodyNode" + ], + "to": [ + "JBodyNode" + ], + "properties": {} + }, + { + "type": "HAS_ARTIFACT", + "from": [ + "JApplication" + ], + "to": [ + "Artifact" + ], + "properties": {} + }, + { + "type": "DEFINES_CONFIG", + "from": [ + "Artifact" + ], + "to": [ + "ConfigKey" + ], + "properties": {} + }, + { + "type": "DECLARES_DEPENDENCY", + "from": [ + "Artifact" + ], + "to": [ + "Package" + ], + "properties": { + "spec": "string", + "kind": "string", + "extras": "string[]", + "prov": "string[]", + "direct": "boolean", + "_k": "string" + } + }, + { + "type": "LOCKS", + "from": [ + "Artifact" + ], + "to": [ + "Package" + ], + "properties": { + "version": "string" + } + }, + { + "type": "J_USES_CONFIG", + "from": [ + "JBodyNode", + "JCallable", + "JField", + "JType" + ], + "to": [ + "ConfigKey" + ], + "properties": { + "prov": "string[]" + } + }, + { + "type": "J_READS_CONFIG_UNRESOLVED", + "from": [ + "JApplication" + ], + "to": [ + "JExternal" + ], + "properties": { + "key": "string", + "reason": "string", + "prov": "string[]", + "_k": "string" + } + } + ], + "constraints": [ + "CREATE CONSTRAINT japplication_id IF NOT EXISTS FOR (x:JApplication) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jmodule_id IF NOT EXISTS FOR (x:JModule) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jsymbol_id IF NOT EXISTS FOR (x:JSymbol) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jfield_id IF NOT EXISTS FOR (x:JField) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jvariable_id IF NOT EXISTS FOR (x:JVariable) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jenumconstant_id IF NOT EXISTS FOR (x:JEnumConstant) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jrecordcomponent_id IF NOT EXISTS FOR (x:JRecordComponent) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jbodynode_id IF NOT EXISTS FOR (x:JBodyNode) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT jpackage_name IF NOT EXISTS FOR (x:JPackage) REQUIRE x.name IS UNIQUE", + "CREATE CONSTRAINT jannotation_name IF NOT EXISTS FOR (x:JAnnotation) REQUIRE x.name IS UNIQUE", + "CREATE CONSTRAINT artifact_id IF NOT EXISTS FOR (x:Artifact) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT package_id IF NOT EXISTS FOR (x:Package) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT configkey_id IF NOT EXISTS FOR (x:ConfigKey) REQUIRE x.id IS UNIQUE" + ], + "indexes": [ + "CREATE INDEX j_callable_name IF NOT EXISTS FOR (c:JCallable) ON (c.name)", + "CREATE INDEX j_type_name IF NOT EXISTS FOR (t:JType) ON (t.name)", + "CREATE INDEX j_annotation_name_idx IF NOT EXISTS FOR (an:JAnnotation) ON (an.name)", + "CREATE FULLTEXT INDEX j_code_fts IF NOT EXISTS FOR (c:JCallable) ON EACH [c.code, c.docstring]", + "CREATE INDEX j_can_node_id IF NOT EXISTS FOR (n:JCanNode) ON (n.id)" + ] +} diff --git a/v2/neo4j/python/schema.neo4j.json b/v2/neo4j/python/schema.neo4j.json new file mode 100644 index 0000000..d779e77 --- /dev/null +++ b/v2/neo4j/python/schema.neo4j.json @@ -0,0 +1,514 @@ +{ + "schema_version": "2.0.0", + "generator": "codeanalyzer-python", + "marker_labels": [ + "PyCanNode" + ], + "node_labels": [ + { + "label": "PyApplication", + "merge_label": "PyApplication", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "schema_version": "string", + "analyzer_name": "string", + "analyzer_version": "string", + "repo_uri": "string", + "source_revision": "string", + "repo_dirty": "boolean", + "entrypoint_frameworks": "string[]", + "entrypoint_report_json": "string" + } + }, + { + "label": "PyModule", + "merge_label": "PyModule", + "key": "id", + "properties": { + "id": "string", + "file_key": "string", + "module_name": "string", + "content_hash": "string", + "last_modified": "float", + "file_size": "integer" + } + }, + { + "label": "PyClass", + "merge_label": "PySymbol", + "key": "id", + "properties": { + "id": "string", + "signature": "string", + "name": "string", + "code": "string", + "base_classes": "string[]", + "decorators": "string[]", + "docstring": "string", + "start_line": "integer", + "end_line": "integer", + "is_entrypoint": "boolean", + "entrypoint_frameworks": "string[]" + } + }, + { + "label": "PyCallable", + "merge_label": "PySymbol", + "key": "id", + "properties": { + "id": "string", + "signature": "string", + "name": "string", + "path": "string", + "return_type": "string", + "cyclomatic_complexity": "integer", + "code": "string", + "code_start_line": "integer", + "start_line": "integer", + "end_line": "integer", + "docstring": "string", + "decorators": "string[]", + "modifiers": "string[]", + "parameters_json": "string", + "accessed_symbols_json": "string", + "is_entrypoint": "boolean", + "entrypoint_frameworks": "string[]" + } + }, + { + "label": "PyExternal", + "merge_label": "PySymbol", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "module": "string" + } + }, + { + "label": "PyPackage", + "merge_label": "PyPackage", + "key": "name", + "properties": { + "name": "string" + } + }, + { + "label": "PyDecorator", + "merge_label": "PyDecorator", + "key": "name", + "properties": { + "name": "string", + "qualified_name": "string" + } + }, + { + "label": "PyAttribute", + "merge_label": "PyAttribute", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "type": "string", + "initializer": "string", + "docstring": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "PyVariable", + "merge_label": "PyVariable", + "key": "id", + "properties": { + "id": "string", + "name": "string", + "type": "string", + "initializer": "string", + "scope": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "PyBodyNode", + "merge_label": "PyBodyNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "var": "string", + "call_node": "string", + "method_name": "string", + "receiver_expr": "string", + "receiver_type": "string", + "return_type": "string", + "is_constructor_call": "boolean", + "arguments_json": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "Artifact", + "merge_label": "Artifact", + "key": "id", + "properties": { + "id": "string", + "path": "string", + "format": "string", + "roles": "string[]", + "size_bytes": "integer", + "sha256": "string", + "source": "string", + "extraction": "string" + } + }, + { + "label": "Package", + "merge_label": "Package", + "key": "id", + "properties": { + "id": "string", + "ecosystem": "string", + "name": "string" + } + }, + { + "label": "ConfigKey", + "merge_label": "ConfigKey", + "key": "id", + "properties": { + "id": "string", + "key": "string", + "namespace": "string", + "value": "string", + "references": "string[]", + "start_line": "integer", + "end_line": "integer" + } + } + ], + "relationship_types": [ + { + "type": "PY_HAS_MODULE", + "from": [ + "PyApplication" + ], + "to": [ + "PyModule" + ], + "properties": {} + }, + { + "type": "PY_DECLARES", + "from": [ + "PyModule", + "PyClass", + "PyCallable" + ], + "to": [ + "PyClass", + "PyCallable" + ], + "properties": {} + }, + { + "type": "PY_HAS_METHOD", + "from": [ + "PyClass" + ], + "to": [ + "PyCallable" + ], + "properties": {} + }, + { + "type": "PY_HAS_ATTRIBUTE", + "from": [ + "PyClass" + ], + "to": [ + "PyAttribute" + ], + "properties": {} + }, + { + "type": "PY_DECLARES_VAR", + "from": [ + "PyModule", + "PyCallable" + ], + "to": [ + "PyVariable" + ], + "properties": {} + }, + { + "type": "PY_RESOLVES_TO", + "from": [ + "PyBodyNode" + ], + "to": [ + "PyCallable", + "PyExternal" + ], + "properties": {} + }, + { + "type": "PY_CALLS", + "from": [ + "PyCallable", + "PyExternal" + ], + "to": [ + "PyCallable", + "PyExternal" + ], + "properties": { + "weight": "integer", + "prov": "string[]" + } + }, + { + "type": "PY_EXTENDS", + "from": [ + "PyClass" + ], + "to": [ + "PyClass" + ], + "properties": {} + }, + { + "type": "PY_IMPORTS", + "from": [ + "PyModule" + ], + "to": [ + "PyModule", + "PyPackage" + ], + "properties": { + "spellings": "string[]", + "imported_names": "string[]", + "aliases": "string[]" + } + }, + { + "type": "PY_DECORATED_BY", + "from": [ + "PyCallable", + "PyClass" + ], + "to": [ + "PyDecorator" + ], + "properties": { + "expression": "string", + "positional_arguments": "string[]", + "keyword_arguments_json": "string" + } + }, + { + "type": "PY_HAS_BODY_NODE", + "from": [ + "PyCallable" + ], + "to": [ + "PyBodyNode" + ], + "properties": {} + }, + { + "type": "PY_CFG_NEXT", + "from": [ + "PyBodyNode" + ], + "to": [ + "PyBodyNode" + ], + "properties": { + "kind": "string", + "_k": "string" + } + }, + { + "type": "PY_CDG", + "from": [ + "PyBodyNode" + ], + "to": [ + "PyBodyNode" + ], + "properties": {} + }, + { + "type": "PY_DDG", + "from": [ + "PyBodyNode" + ], + "to": [ + "PyBodyNode" + ], + "properties": { + "var": "string", + "prov": "string[]", + "_k": "string" + } + }, + { + "type": "PY_PARAM_IN", + "from": [ + "PyBodyNode" + ], + "to": [ + "PyBodyNode" + ], + "properties": { + "var": "string" + } + }, + { + "type": "PY_PARAM_OUT", + "from": [ + "PyBodyNode" + ], + "to": [ + "PyBodyNode" + ], + "properties": { + "var": "string" + } + }, + { + "type": "PY_SUMMARY", + "from": [ + "PyBodyNode" + ], + "to": [ + "PyBodyNode" + ], + "properties": {} + }, + { + "type": "HAS_ARTIFACT", + "from": [ + "PyApplication" + ], + "to": [ + "Artifact" + ], + "properties": {} + }, + { + "type": "DEFINES_CONFIG", + "from": [ + "Artifact" + ], + "to": [ + "ConfigKey" + ], + "properties": {} + }, + { + "type": "DECLARES_DEPENDENCY", + "from": [ + "Artifact" + ], + "to": [ + "Package" + ], + "properties": { + "spec": "string", + "kind": "string", + "extras": "string[]", + "prov": "string[]", + "direct": "boolean", + "_k": "string" + } + }, + { + "type": "LOCKS", + "from": [ + "Artifact" + ], + "to": [ + "Package" + ], + "properties": { + "version": "string" + } + }, + { + "type": "PY_PROVIDES", + "from": [ + "Package" + ], + "to": [ + "PyExternal" + ], + "properties": {} + }, + { + "type": "PY_UNRESOLVED_IMPORT", + "from": [ + "PyApplication" + ], + "to": [ + "PyExternal" + ], + "properties": { + "prov": "string[]" + } + }, + { + "type": "PY_USES_CONFIG", + "from": [ + "PyBodyNode" + ], + "to": [ + "ConfigKey" + ], + "properties": { + "prov": "string[]" + } + }, + { + "type": "PY_READS_CONFIG_UNRESOLVED", + "from": [ + "PyApplication" + ], + "to": [ + "PyExternal" + ], + "properties": { + "key": "string", + "reason": "string", + "prov": "string[]", + "_k": "string" + } + } + ], + "constraints": [ + "CREATE CONSTRAINT pyapplication_id IF NOT EXISTS FOR (x:PyApplication) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT pymodule_id IF NOT EXISTS FOR (x:PyModule) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT pysymbol_id IF NOT EXISTS FOR (x:PySymbol) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT pypackage_name IF NOT EXISTS FOR (x:PyPackage) REQUIRE x.name IS UNIQUE", + "CREATE CONSTRAINT pydecorator_name IF NOT EXISTS FOR (x:PyDecorator) REQUIRE x.name IS UNIQUE", + "CREATE CONSTRAINT pyattribute_id IF NOT EXISTS FOR (x:PyAttribute) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT pyvariable_id IF NOT EXISTS FOR (x:PyVariable) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT pybodynode_id IF NOT EXISTS FOR (x:PyBodyNode) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT artifact_id IF NOT EXISTS FOR (x:Artifact) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT package_id IF NOT EXISTS FOR (x:Package) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT configkey_id IF NOT EXISTS FOR (x:ConfigKey) REQUIRE x.id IS UNIQUE" + ], + "indexes": [ + "CREATE INDEX py_callable_name IF NOT EXISTS FOR (c:PyCallable) ON (c.name)", + "CREATE INDEX py_class_name IF NOT EXISTS FOR (c:PyClass) ON (c.name)", + "CREATE FULLTEXT INDEX py_code_fts IF NOT EXISTS FOR (c:PyCallable) ON EACH [c.code, c.docstring]", + "CREATE INDEX py_can_node_id IF NOT EXISTS FOR (n:PyCanNode) ON (n.id)" + ] +} diff --git a/v2/neo4j/typescript/schema.neo4j.json b/v2/neo4j/typescript/schema.neo4j.json new file mode 100644 index 0000000..33728d4 --- /dev/null +++ b/v2/neo4j/typescript/schema.neo4j.json @@ -0,0 +1,621 @@ +{ + "schema_version": "2.0.0", + "generator": "codeanalyzer-typescript", + "marker_labels": [ + "TSCanNode", + "JSCanNode" + ], + "node_labels": [ + { + "label": "TSApplication", + "mergeLabel": "Application", + "key": "id", + "properties": { + "id": "string", + "schema_version": "string", + "language": "string", + "max_level": "integer", + "k_limit": "integer", + "analyzer_name": "string", + "analyzer_version": "string", + "entrypoint_frameworks": "string[]", + "entrypoint_report_json": "string" + } + }, + { + "label": "Artifact", + "mergeLabel": "Artifact", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "path": "string", + "format": "string", + "roles": "string[]", + "size_bytes": "integer", + "sha256": "string", + "extraction": "string", + "source": "string" + } + }, + { + "label": "Package", + "mergeLabel": "Package", + "key": "id", + "properties": { + "id": "string", + "ecosystem": "string", + "name": "string" + } + }, + { + "label": "TSDecorator", + "mergeLabel": "TSDecorator", + "key": "name", + "properties": { + "name": "string", + "qualified_name": "string" + } + }, + { + "label": "ConfigKey", + "mergeLabel": "ConfigKey", + "key": "id", + "properties": { + "id": "string", + "key": "string", + "namespace": "string", + "value": "string", + "references": "string[]" + } + }, + { + "label": "TSModule", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "name": "string", + "is_tsx": "boolean", + "is_declaration_file": "boolean", + "content_hash": "string", + "exports_json": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "TSClass", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "name": "string", + "base_classes": "string[]", + "implements_types": "string[]", + "is_abstract": "boolean", + "is_exported": "boolean", + "is_ambient": "boolean", + "code": "string", + "start_line": "integer", + "end_line": "integer", + "is_entrypoint": "boolean", + "entrypoint_frameworks": "string[]" + } + }, + { + "label": "TSInterface", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "name": "string", + "base_classes": "string[]", + "is_exported": "boolean", + "is_ambient": "boolean", + "code": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "TSEnum", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "name": "string", + "is_const": "boolean", + "is_exported": "boolean", + "is_ambient": "boolean", + "code": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "TSTypeAlias", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "name": "string", + "aliased_type": "string", + "is_exported": "boolean", + "is_ambient": "boolean", + "code": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "TSNamespace", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "name": "string", + "is_exported": "boolean", + "is_ambient": "boolean", + "code": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "TSCallable", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "name": "string", + "return_type": "string", + "cyclomatic_complexity": "integer", + "accessibility": "string", + "accessor_kind": "string", + "is_static": "boolean", + "is_abstract": "boolean", + "is_async": "boolean", + "is_generator": "boolean", + "is_exported": "boolean", + "is_ambient": "boolean", + "is_implicit": "boolean", + "code": "string", + "start_line": "integer", + "end_line": "integer", + "is_entrypoint": "boolean", + "entrypoint_frameworks": "string[]", + "parameters_json": "string" + } + }, + { + "label": "TSField", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "name": "string", + "type": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "TSBodyNode", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "of": "string", + "parent": "string", + "callee": "string", + "start_line": "integer", + "end_line": "integer" + } + }, + { + "label": "TSExternal", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "name": "string", + "module": "string" + } + }, + { + "label": "TSAnonymousCallable", + "mergeLabel": "CanNode", + "key": "id", + "properties": { + "id": "string", + "kind": "string", + "signature": "string", + "name": "string", + "return_type": "string", + "cyclomatic_complexity": "integer", + "accessibility": "string", + "accessor_kind": "string", + "is_static": "boolean", + "is_abstract": "boolean", + "is_async": "boolean", + "is_generator": "boolean", + "is_exported": "boolean", + "is_ambient": "boolean", + "is_implicit": "boolean", + "path": "string", + "start_column": "integer", + "start_line": "integer", + "end_line": "integer" + } + } + ], + "relationship_types": [ + { + "type": "TS_HAS_MODULE", + "from": [ + "TSApplication" + ], + "to": [ + "TSModule" + ], + "properties": {} + }, + { + "type": "HAS_ARTIFACT", + "from": [ + "TSApplication" + ], + "to": [ + "Artifact" + ], + "properties": {} + }, + { + "type": "DECLARES_DEPENDENCY", + "from": [ + "Artifact" + ], + "to": [ + "Package" + ], + "properties": { + "spec": "string", + "kind": "string", + "direct": "boolean", + "extras": "string[]", + "prov": "string[]" + } + }, + { + "type": "LOCKS", + "from": [ + "Artifact" + ], + "to": [ + "Package" + ], + "properties": { + "version": "string" + } + }, + { + "type": "TS_PROVIDES", + "from": [ + "Package" + ], + "to": [ + "TSExternal" + ], + "properties": {} + }, + { + "type": "TS_UNRESOLVED_IMPORT", + "from": [ + "TSApplication" + ], + "to": [ + "TSExternal" + ], + "properties": { + "prov": "string[]" + } + }, + { + "type": "DEFINES_CONFIG", + "from": [ + "Artifact" + ], + "to": [ + "ConfigKey" + ], + "properties": {} + }, + { + "type": "TS_USES_CONFIG", + "from": [ + "TSBodyNode" + ], + "to": [ + "ConfigKey" + ], + "properties": { + "prov": "string[]" + } + }, + { + "type": "TS_READS_CONFIG_UNRESOLVED", + "from": [ + "TSApplication" + ], + "to": [ + "TSExternal", + "TSCallable" + ], + "properties": { + "key": "string", + "reason": "string", + "prov": "string[]", + "_k": "string" + } + }, + { + "type": "TS_IMPORTS", + "from": [ + "TSModule" + ], + "to": [ + "TSModule", + "TSExternal" + ], + "properties": { + "spellings": "string[]", + "imported_names": "string[]", + "aliases": "string[]", + "type_only_names": "string[]" + } + }, + { + "type": "TS_RE_EXPORTS", + "from": [ + "TSModule" + ], + "to": [ + "TSModule", + "TSExternal" + ], + "properties": { + "spellings": "string[]", + "exported_names": "string[]", + "aliases": "string[]", + "type_only_names": "string[]" + } + }, + { + "type": "TS_DECLARES", + "from": [ + "TSModule", + "TSNamespace", + "TSCallable" + ], + "to": [ + "TSClass", + "TSInterface", + "TSEnum", + "TSTypeAlias", + "TSNamespace", + "TSCallable" + ], + "properties": {} + }, + { + "type": "TS_HAS_METHOD", + "from": [ + "TSClass", + "TSInterface" + ], + "to": [ + "TSCallable" + ], + "properties": {} + }, + { + "type": "TS_HAS_FIELD", + "from": [ + "TSModule", + "TSClass", + "TSInterface", + "TSEnum", + "TSNamespace" + ], + "to": [ + "TSField" + ], + "properties": {} + }, + { + "type": "TS_DECORATED_BY", + "from": [ + "TSClass", + "TSInterface", + "TSEnum", + "TSNamespace", + "TSCallable", + "TSField" + ], + "to": [ + "TSDecorator" + ], + "properties": { + "positional_arguments": "string[]", + "keyword_arguments_json": "string" + } + }, + { + "type": "TS_HAS_BODY_NODE", + "from": [ + "TSCallable", + "TSAnonymousCallable" + ], + "to": [ + "TSBodyNode" + ], + "properties": {} + }, + { + "type": "TS_RESOLVES_TO", + "from": [ + "TSBodyNode" + ], + "to": [ + "TSCallable", + "TSExternal", + "TSAnonymousCallable" + ], + "properties": {} + }, + { + "type": "TS_CALLS", + "from": [ + "TSCallable", + "TSAnonymousCallable" + ], + "to": [ + "TSCallable", + "TSExternal", + "TSAnonymousCallable" + ], + "properties": { + "weight": "integer", + "prov": "string[]" + } + }, + { + "type": "TS_CFG_NEXT", + "from": [ + "TSBodyNode" + ], + "to": [ + "TSBodyNode" + ], + "properties": { + "kind": "string", + "_k": "string" + } + }, + { + "type": "TS_CDG", + "from": [ + "TSBodyNode" + ], + "to": [ + "TSBodyNode" + ], + "properties": {} + }, + { + "type": "TS_DDG", + "from": [ + "TSBodyNode" + ], + "to": [ + "TSBodyNode" + ], + "properties": { + "var": "string", + "prov": "string[]", + "_k": "string" + } + }, + { + "type": "TS_SUMMARY", + "from": [ + "TSBodyNode" + ], + "to": [ + "TSBodyNode" + ], + "properties": { + "var": "string" + } + }, + { + "type": "TS_PARAM_IN", + "from": [ + "TSBodyNode" + ], + "to": [ + "TSBodyNode" + ], + "properties": { + "var": "string" + } + }, + { + "type": "TS_PARAM_OUT", + "from": [ + "TSBodyNode" + ], + "to": [ + "TSBodyNode" + ], + "properties": { + "var": "string" + } + }, + { + "type": "TS_EXTENDS", + "from": [ + "TSClass", + "TSInterface" + ], + "to": [ + "TSClass", + "TSInterface" + ], + "properties": {} + }, + { + "type": "TS_IMPLEMENTS", + "from": [ + "TSClass" + ], + "to": [ + "TSInterface", + "TSClass" + ], + "properties": {} + } + ], + "constraints": [ + "CREATE CONSTRAINT application_id IF NOT EXISTS FOR (x:Application) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT artifact_id IF NOT EXISTS FOR (x:Artifact) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT package_id IF NOT EXISTS FOR (x:Package) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT tsdecorator_name IF NOT EXISTS FOR (x:TSDecorator) REQUIRE x.name IS UNIQUE", + "CREATE CONSTRAINT configkey_id IF NOT EXISTS FOR (x:ConfigKey) REQUIRE x.id IS UNIQUE", + "CREATE CONSTRAINT cannode_id IF NOT EXISTS FOR (x:CanNode) REQUIRE x.id IS UNIQUE" + ], + "indexes": [ + "CREATE INDEX callable_name IF NOT EXISTS FOR (c:TSCallable) ON (c.name)", + "CREATE FULLTEXT INDEX ts_code_fts IF NOT EXISTS FOR (c:TSCallable) ON EACH [c.code]", + "CREATE INDEX cannode_kind IF NOT EXISTS FOR (n:CanNode) ON (n.kind)", + "CREATE INDEX tscannode_id IF NOT EXISTS FOR (n:TSCanNode) ON (n.id)", + "CREATE INDEX jscannode_id IF NOT EXISTS FOR (n:JSCanNode) ON (n.id)" + ] +} diff --git a/v2/python/.gitkeep b/v2/python/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/v2/typescript/.gitkeep b/v2/typescript/.gitkeep deleted file mode 100644 index e69de29..0000000 From 74c2a26fceaf8f0eef6ab36b32eec2dc68a72ec5 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 23 Sep 2026 09:06:23 -0400 Subject: [PATCH 2/3] Spine: the application root carries an optional `name` Typescript v1.6.3 emits it; java and python follow, and it becomes required once both do. Spec: codellm-devkit/.github docs/design/specs/2026-09-23-application-name-in-analysis-json.md (epic codellm-devkit/.github#93). Signed-off-by: Rahul Krishna --- v2/json/analysis.schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/v2/json/analysis.schema.json b/v2/json/analysis.schema.json index 35cce54..fc57ac5 100644 --- a/v2/json/analysis.schema.json +++ b/v2/json/analysis.schema.json @@ -150,6 +150,11 @@ "description": "can:///", "type": "string" }, + "name": { + "description": "The resolved application name the id is built from: a non-blank --app-name, else the input directory's basename. Optional until codeanalyzer-java and codeanalyzer-python emit it, then required (codellm-devkit/.github#93).", + "type": "string", + "minLength": 1 + }, "kind": { "const": "application" }, From 38408670bfc20747f4fcf279959a0cceb1fa0d98 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 23 Sep 2026 09:06:21 -0400 Subject: [PATCH 3/3] Record codeanalyzer-java v3.3.3, codeanalyzer-python v1.5.4 and codeanalyzer-typescript v1.6.3 schemas Graph contracts are the release assets. Samples are each analyzer run in place on its own fixtures at the release tag. The typescript files are byte-identical to the release workflow's uptake PR #9, which supersedes #7 and #8. Signed-off-by: Rahul Krishna --- v2/json/analysis.schema.json | 6 +- v2/json/java/analysis.enum-record.sample.json | 2 +- v2/json/java/analysis.l4.sample.json | 34 +++++-- v2/json/java/analysis.schema.json | 2 +- v2/json/python/analysis.dataflow.sample.json | 2 +- .../python/analysis.entrypoints.sample.json | 2 +- v2/json/python/analysis.l4.sample.json | 2 +- v2/json/python/analysis.schema.json | 2 +- v2/json/typescript/analysis.l4.sample.json | 2 +- v2/json/typescript/analysis.schema.json | 2 +- v2/neo4j/java/schema.neo4j.json | 91 ++++++++++++++++--- v2/neo4j/python/schema.neo4j.json | 40 +++++++- v2/neo4j/typescript/schema.neo4j.json | 1 + 13 files changed, 152 insertions(+), 36 deletions(-) diff --git a/v2/json/analysis.schema.json b/v2/json/analysis.schema.json index fc57ac5..1e4a06e 100644 --- a/v2/json/analysis.schema.json +++ b/v2/json/analysis.schema.json @@ -9,17 +9,17 @@ "sources": [ { "repo": "codellm-devkit/codeanalyzer-java", - "release": "v3.0.1", + "release": "v3.3.3", "definedIn": "src/main/java/com/ibm/cldk/schema/" }, { "repo": "codellm-devkit/codeanalyzer-python", - "release": "v1.4.0", + "release": "v1.5.4", "definedIn": "codeanalyzer/schema/py_schema.py" }, { "repo": "codellm-devkit/codeanalyzer-typescript", - "release": "v1.2.0", + "release": "v1.6.3", "definedIn": "src/schema/schema.ts" } ], diff --git a/v2/json/java/analysis.enum-record.sample.json b/v2/json/java/analysis.enum-record.sample.json index ece3125..bc1ec78 100644 --- a/v2/json/java/analysis.enum-record.sample.json +++ b/v2/json/java/analysis.enum-record.sample.json @@ -4,7 +4,7 @@ "max_level": 2, "analyzer": { "name": "codeanalyzer-java", - "version": "3.1.2" + "version": "3.3.3" }, "application": { "id": "can://enum-record-bodies-test", diff --git a/v2/json/java/analysis.l4.sample.json b/v2/json/java/analysis.l4.sample.json index 39803a3..f8dd358 100644 --- a/v2/json/java/analysis.l4.sample.json +++ b/v2/json/java/analysis.l4.sample.json @@ -4,7 +4,7 @@ "max_level": 4, "analyzer": { "name": "codeanalyzer-java", - "version": "3.1.2" + "version": "3.3.3" }, "application": { "id": "can://dataflow-test", @@ -311,7 +311,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "r" + ], "is_constructor_call": false }, "@formal_in:0": { @@ -706,7 +708,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "sum" + ], "is_constructor_call": false }, "@formal_in:0": { @@ -1022,7 +1026,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "-1" + ], "is_constructor_call": false }, "33:9": { @@ -1043,7 +1049,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "x" + ], "is_constructor_call": false }, "@formal_in:0": { @@ -1366,7 +1374,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "x" + ], "is_constructor_call": false }, "@formal_in:0": { @@ -1684,7 +1694,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "r" + ], "is_constructor_call": false }, "@formal_in:0": { @@ -2074,7 +2086,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "y" + ], "is_constructor_call": false }, "@formal_in:0": { @@ -2346,7 +2360,9 @@ }, "arguments": [], "argument_types": [], - "argument_expr": [], + "argument_expr": [ + "parse(x)" + ], "is_constructor_call": false }, "@formal_in:0": { diff --git a/v2/json/java/analysis.schema.json b/v2/json/java/analysis.schema.json index 93f633a..1c34067 100644 --- a/v2/json/java/analysis.schema.json +++ b/v2/json/java/analysis.schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://codellm-devkit.github.io/schema/v2/java/analysis.schema.json", "title": "codeanalyzer-java v2 analysis output", - "description": "What codeanalyzer-java v3.0.1 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction: a field the analyzer starts emitting that nobody recorded here fails validation. Property names are the Gson LOWER_CASE_WITH_UNDERSCORES rendering of the Lombok @Data field names; nulls are never serialized, so absent means 'no fact'.", + "description": "What codeanalyzer-java v3.3.3 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction: a field the analyzer starts emitting that nobody recorded here fails validation. Property names are the Gson LOWER_CASE_WITH_UNDERSCORES rendering of the Lombok @Data field names; nulls are never serialized, so absent means 'no fact'.", "x-cldk": { "schemaVersion": "2.0.0", "language": "java", diff --git a/v2/json/python/analysis.dataflow.sample.json b/v2/json/python/analysis.dataflow.sample.json index 147a520..68e5878 100644 --- a/v2/json/python/analysis.dataflow.sample.json +++ b/v2/json/python/analysis.dataflow.sample.json @@ -1 +1 @@ -{"schema_version": "2.0.0", "language": "python", "max_level": 4, "k_limit": 3, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.1", "config": {"analysis_level": 4}}, "application": {"symbol_table": {"pipeline.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "module_name": "pipeline", "id": "can://dataflow/python/pipeline.py", "kind": "module", "source": "\"\"\"Interprocedural fixture: call chain, mutual recursion, aliasing, closures.\"\"\"\n\n\ndef chain_a(v):\n return chain_b(v + 1)\n\n\ndef chain_b(v):\n return chain_c(v * 2)\n\n\ndef chain_c(v):\n return v - 3\n\n\ndef even(n):\n if n == 0:\n return True\n return odd(n - 1)\n\n\ndef odd(n):\n if n == 0:\n return False\n return even(n - 1)\n\n\nclass Box:\n def __init__(self, value):\n self.value = value\n\n def get(self):\n return self.value\n\n\ndef alias_flow():\n p = Box(10)\n q = p\n q.value = 42\n return p.get()\n\n\ndef make_adder(base):\n def add(x):\n return x + base\n return add\n\n\ndef use_adder(n):\n add5 = make_adder(5)\n return add5(n)\n\n\ndef mutate(items):\n items.append(1)\n\n\ndef caller_of_mutate():\n xs = []\n mutate(xs)\n return xs\n", "imports": [], "comments": [{"content": "Interprocedural fixture: call chain, mutual recursion, aliasing, closures.", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 80, "is_docstring": true}], "types": {"pipeline.Box": {"name": "Box", "signature": "pipeline.Box", "id": "can://dataflow/python/pipeline.py/Box", "kind": "class", "span": {"start": [28, 0], "end": [33, 25], "bytes": [351, 465]}, "comments": [], "base_classes": [], "decorators": [], "entrypoints": [], "is_entrypoint": false, "callables": {"__init__": {"name": "__init__", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.Box.__init__", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "kind": "function", "span": {"start": [29, 4], "end": [30, 26], "bytes": [366, 419]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "self", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "type": "Box", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 17, "end_column": 21}, {"name": "value", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "type": "int", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 23, "end_column": 28}], "start_line": 29, "end_line": 30, "code_start_line": 30, "accessed_symbols": [{"name": "value", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 30, "col_offset": 21}, {"name": "self", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 30, "col_offset": 8}], "callables": {}, "types": {}, "local_variables": [{"name": "value", "type": "Box", "initializer": "value", "scope": "class", "start_line": 30, "end_line": 30, "start_column": 8, "end_column": 18}], "cyclomatic_complexity": 1, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@entry", "arguments": []}, "30:8": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@30:8", "span": {"start": [30, 8], "end": [30, 26], "bytes": [401, 419]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "of": "self", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "of": "value", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:1", "of": "self", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "30:8", "kind": "fallthrough"}, {"src": "30:8", "dst": "@exit", "kind": "exception"}, {"src": "30:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "30:8"}], "ddg": [{"src": "@entry", "dst": "30:8", "var": "self", "prov": ["ssa"]}, {"src": "@entry", "dst": "30:8", "var": "value", "prov": ["ssa"]}, {"src": "30:8", "dst": "@formal_out:1", "var": "self.value", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "30:8", "var": "self", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "30:8", "var": "value", "prov": ["reaching-defs"]}], "summary": []}, "get": {"name": "get", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.Box.get", "id": "can://dataflow/python/pipeline.py/Box/get(self)", "kind": "function", "span": {"start": [32, 4], "end": [33, 25], "bytes": [425, 465]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "self", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "type": "Box", "decorators": [], "start_line": 32, "end_line": 32, "start_column": 12, "end_column": 16}], "start_line": 32, "end_line": 33, "code_start_line": 33, "accessed_symbols": [{"name": "self", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 33, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/Box/get(self)@entry", "arguments": []}, "33:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/Box/get(self)@33:8", "span": {"start": [33, 8], "end": [33, 25], "bytes": [448, 465]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/Box/get(self)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "of": "self", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "33:8", "kind": "fallthrough"}, {"src": "33:8", "dst": "@exit", "kind": "exception"}, {"src": "33:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "33:8"}], "ddg": [{"src": "@entry", "dst": "33:8", "var": "self.value", "prov": ["ssa"]}, {"src": "33:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "33:8", "var": "self.value", "prov": ["reaching-defs"]}], "summary": []}}, "attributes": {}, "types": {}, "start_line": 28, "end_line": 33}}, "functions": {"chain_a": {"name": "chain_a", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_a", "id": "can://dataflow/python/pipeline.py/chain_a(v)", "kind": "function", "span": {"start": [4, 0], "end": [5, 25], "bytes": [83, 124]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "decorators": [], "start_line": 4, "end_line": 4, "start_column": 12, "end_column": 13}], "start_line": 4, "end_line": 5, "code_start_line": 5, "accessed_symbols": [{"name": "chain_b", "scope": "local", "kind": "function", "type": "chain_b", "qualified_name": "pipeline.chain_b", "is_builtin": false, "lineno": 5, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 5, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"5:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:11", "span": {"start": [5, 11], "end": [5, 25], "bytes": [110, 124]}, "callee": "can://dataflow/python/pipeline.py/chain_b(v)", "parent": "5:4", "method_name": "chain_b", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_a(v)@entry", "arguments": []}, "5:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4", "span": {"start": [5, 4], "end": [5, 25], "bytes": [103, 124]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_a(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:1", "of": ":pipeline::chain_b", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:2", "of": ":pipeline::chain_c", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_out", "of": "", "arguments": []}, "5:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:0", "of": "v", "parent": "5:4", "arguments": []}, "5:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:1", "of": ":pipeline::chain_c", "parent": "5:4", "arguments": []}, "5:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_out", "of": "", "parent": "5:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "5:4", "kind": "fallthrough"}, {"src": "5:4", "dst": "@exit", "kind": "exception"}, {"src": "5:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "5:4"}], "ddg": [{"src": "@entry", "dst": "5:4", "var": "pipeline::chain_b", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "v", "prov": ["ssa"]}, {"src": "5:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "5:4/actual_out", "dst": "5:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "5:4/actual_in:0", "var": "pipeline::chain_b", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "5:4/actual_in:0", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "5:4", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "pipeline::chain_b", "prov": ["reaching-defs"]}], "summary": [{"src": "5:4/actual_in:0", "dst": "5:4/actual_out"}, {"src": "5:4/actual_in:1", "dst": "5:4/actual_out"}]}, "chain_b": {"name": "chain_b", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_b", "id": "can://dataflow/python/pipeline.py/chain_b(v)", "kind": "function", "span": {"start": [8, 0], "end": [9, 25], "bytes": [127, 168]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "type": "int", "decorators": [], "start_line": 8, "end_line": 8, "start_column": 12, "end_column": 13}], "start_line": 8, "end_line": 9, "code_start_line": 9, "accessed_symbols": [{"name": "chain_c", "scope": "local", "kind": "function", "type": "chain_c", "qualified_name": "pipeline.chain_c", "is_builtin": false, "lineno": 9, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 9, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"9:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:11", "span": {"start": [9, 11], "end": [9, 25], "bytes": [154, 168]}, "callee": "can://dataflow/python/pipeline.py/chain_c(v)", "parent": "9:4", "method_name": "chain_c", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp", "inferred_type": "int"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_b(v)@entry", "arguments": []}, "9:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4", "span": {"start": [9, 4], "end": [9, 25], "bytes": [147, 168]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_b(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:1", "of": ":pipeline::chain_c", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_out", "of": "", "arguments": []}, "9:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_in:0", "of": "v", "parent": "9:4", "arguments": []}, "9:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_out", "of": "", "parent": "9:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "9:4", "kind": "fallthrough"}, {"src": "9:4", "dst": "@exit", "kind": "exception"}, {"src": "9:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "9:4"}], "ddg": [{"src": "@entry", "dst": "9:4", "var": "pipeline::chain_c", "prov": ["ssa"]}, {"src": "@entry", "dst": "9:4", "var": "v", "prov": ["ssa"]}, {"src": "9:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "9:4/actual_out", "dst": "9:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "9:4/actual_in:0", "var": "pipeline::chain_c", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "9:4/actual_in:0", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "9:4", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "9:4", "var": "pipeline::chain_c", "prov": ["reaching-defs"]}], "summary": [{"src": "9:4/actual_in:0", "dst": "9:4/actual_out"}]}, "chain_c": {"name": "chain_c", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_c", "id": "can://dataflow/python/pipeline.py/chain_c(v)", "kind": "function", "span": {"start": [12, 0], "end": [13, 16], "bytes": [171, 203]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "type": "int", "decorators": [], "start_line": 12, "end_line": 12, "start_column": 12, "end_column": 13}], "start_line": 12, "end_line": 13, "code_start_line": 13, "accessed_symbols": [{"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 13, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_c(v)@entry", "arguments": []}, "13:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_c(v)@13:4", "span": {"start": [13, 4], "end": [13, 16], "bytes": [191, 203]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_c(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "13:4", "kind": "fallthrough"}, {"src": "13:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "13:4"}], "ddg": [{"src": "@entry", "dst": "13:4", "var": "v", "prov": ["ssa"]}, {"src": "13:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "13:4", "var": "v", "prov": ["reaching-defs"]}], "summary": []}, "even": {"name": "even", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.even", "id": "can://dataflow/python/pipeline.py/even(n)", "kind": "function", "span": {"start": [16, 0], "end": [19, 21], "bytes": [206, 275]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "type": "int", "decorators": [], "start_line": 16, "end_line": 16, "start_column": 9, "end_column": 10}], "start_line": 16, "end_line": 19, "code_start_line": 17, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 17, "col_offset": 7}, {"name": "odd", "scope": "local", "kind": "function", "type": "odd", "qualified_name": "pipeline.odd", "is_builtin": false, "lineno": 19, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 19, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 4, "body": {"19:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/even(n)@19:11", "span": {"start": [19, 11], "end": [19, 21], "bytes": [265, 275]}, "callee": "can://dataflow/python/pipeline.py/odd(n)", "parent": "19:4", "method_name": "odd", "return_type": "bool", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/even(n)@entry", "arguments": []}, "17:7": {"kind": "branch", "id": "can://dataflow/python/pipeline.py/even(n)@17:7", "span": {"start": [17, 7], "end": [17, 13], "bytes": [226, 232]}, "arguments": []}, "18:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/even(n)@18:8", "span": {"start": [18, 8], "end": [18, 19], "bytes": [242, 253]}, "arguments": []}, "19:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/even(n)@19:4", "span": {"start": [19, 4], "end": [19, 21], "bytes": [258, 275]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/even(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:1", "of": ":pipeline::even", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:2", "of": ":pipeline::odd", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/even(n)@formal_out", "of": "", "arguments": []}, "19:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:0", "of": "n", "parent": "19:4", "arguments": []}, "19:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:1", "of": ":pipeline::even", "parent": "19:4", "arguments": []}, "19:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:2", "of": ":pipeline::odd", "parent": "19:4", "arguments": []}, "19:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_out", "of": "", "parent": "19:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "17:7", "kind": "fallthrough"}, {"src": "17:7", "dst": "18:8", "kind": "true"}, {"src": "17:7", "dst": "19:4", "kind": "false"}, {"src": "18:8", "dst": "@exit", "kind": "return"}, {"src": "19:4", "dst": "@exit", "kind": "exception"}, {"src": "19:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "17:7"}, {"src": "17:7", "dst": "18:8"}, {"src": "17:7", "dst": "19:4"}], "ddg": [{"src": "@entry", "dst": "17:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "19:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "19:4", "var": "pipeline::odd", "prov": ["ssa"]}, {"src": "18:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "19:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "19:4/actual_out", "dst": "19:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "19:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "19:4/actual_in:0", "var": "pipeline::odd", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "19:4/actual_in:2", "var": "pipeline::odd", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "17:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "19:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "19:4", "var": "pipeline::odd", "prov": ["reaching-defs"]}], "summary": [{"src": "19:4/actual_in:0", "dst": "19:4/actual_out"}, {"src": "19:4/actual_in:1", "dst": "19:4/actual_out"}]}, "odd": {"name": "odd", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.odd", "id": "can://dataflow/python/pipeline.py/odd(n)", "kind": "function", "span": {"start": [22, 0], "end": [25, 22], "bytes": [278, 348]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "type": "int", "decorators": [], "start_line": 22, "end_line": 22, "start_column": 8, "end_column": 9}], "start_line": 22, "end_line": 25, "code_start_line": 23, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 7}, {"name": "even", "scope": "local", "kind": "function", "type": "even", "qualified_name": "pipeline.even", "is_builtin": false, "lineno": 25, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 25, "col_offset": 16}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 4, "body": {"25:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/odd(n)@25:11", "span": {"start": [25, 11], "end": [25, 22], "bytes": [337, 348]}, "callee": "can://dataflow/python/pipeline.py/even(n)", "parent": "25:4", "method_name": "even", "return_type": "bool", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp", "inferred_type": "int"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/odd(n)@entry", "arguments": []}, "23:7": {"kind": "branch", "id": "can://dataflow/python/pipeline.py/odd(n)@23:7", "span": {"start": [23, 7], "end": [23, 13], "bytes": [297, 303]}, "arguments": []}, "24:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/odd(n)@24:8", "span": {"start": [24, 8], "end": [24, 20], "bytes": [313, 325]}, "arguments": []}, "25:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4", "span": {"start": [25, 4], "end": [25, 22], "bytes": [330, 348]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/odd(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:1", "of": ":pipeline::even", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:2", "of": ":pipeline::odd", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_out", "of": "", "arguments": []}, "25:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:0", "of": "n", "parent": "25:4", "arguments": []}, "25:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:1", "of": ":pipeline::even", "parent": "25:4", "arguments": []}, "25:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:2", "of": ":pipeline::odd", "parent": "25:4", "arguments": []}, "25:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_out", "of": "", "parent": "25:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "23:7", "kind": "fallthrough"}, {"src": "23:7", "dst": "24:8", "kind": "true"}, {"src": "23:7", "dst": "25:4", "kind": "false"}, {"src": "24:8", "dst": "@exit", "kind": "return"}, {"src": "25:4", "dst": "@exit", "kind": "exception"}, {"src": "25:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "23:7"}, {"src": "23:7", "dst": "24:8"}, {"src": "23:7", "dst": "25:4"}], "ddg": [{"src": "@entry", "dst": "23:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "25:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "25:4", "var": "pipeline::even", "prov": ["ssa"]}, {"src": "24:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "25:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "25:4/actual_out", "dst": "25:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "25:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "25:4/actual_in:0", "var": "pipeline::even", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "25:4/actual_in:1", "var": "pipeline::even", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "23:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "25:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "25:4", "var": "pipeline::even", "prov": ["reaching-defs"]}], "summary": [{"src": "25:4/actual_in:0", "dst": "25:4/actual_out"}, {"src": "25:4/actual_in:2", "dst": "25:4/actual_out"}]}, "alias_flow": {"name": "alias_flow", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.alias_flow", "id": "can://dataflow/python/pipeline.py/alias_flow()", "kind": "function", "span": {"start": [36, 0], "end": [40, 18], "bytes": [468, 547]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 36, "end_line": 40, "code_start_line": 37, "accessed_symbols": [{"name": "p", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 38, "col_offset": 8}, {"name": "Box", "scope": "local", "kind": "class", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 37, "col_offset": 8}, {"name": "q", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 39, "col_offset": 4}, {"name": "p", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 40, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "p", "type": "Box", "initializer": "Box(10)", "scope": "function", "start_line": 37, "end_line": 37, "start_column": 4, "end_column": 5}, {"name": "q", "type": "Box", "initializer": "p", "scope": "function", "start_line": 38, "end_line": 38, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"37:8": {"kind": "call", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:8", "span": {"start": [37, 8], "end": [37, 15], "bytes": [494, 501]}, "callee": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "parent": "37:4", "method_name": "Box", "return_type": "Box", "is_constructor_call": true, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "10"}]}, "40:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:11", "span": {"start": [40, 11], "end": [40, 18], "bytes": [540, 547]}, "callee": "can://dataflow/python/pipeline.py/Box/get(self)", "parent": "40:4", "method_name": "get", "receiver_expr": "p", "receiver_type": "Box", "return_type": "int", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/alias_flow()@entry", "arguments": []}, "37:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4", "span": {"start": [37, 4], "end": [37, 15], "bytes": [490, 501]}, "arguments": []}, "38:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@38:4", "span": {"start": [38, 4], "end": [38, 9], "bytes": [506, 511]}, "arguments": []}, "39:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@39:4", "span": {"start": [39, 4], "end": [39, 16], "bytes": [516, 528]}, "arguments": []}, "40:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4", "span": {"start": [40, 4], "end": [40, 18], "bytes": [533, 547]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/alias_flow()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@formal_in:0", "of": ":pipeline::Box", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@formal_out", "of": "", "arguments": []}, "37:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:0", "of": "self", "parent": "37:4", "arguments": []}, "37:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:1", "of": "value", "parent": "37:4", "arguments": []}, "37:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:0", "of": "", "parent": "37:4", "arguments": []}, "37:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:1", "of": "self", "parent": "37:4", "arguments": []}, "40:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_in:0", "of": "self", "parent": "40:4", "arguments": []}, "40:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_out", "of": "", "parent": "40:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "37:4", "kind": "fallthrough"}, {"src": "37:4", "dst": "38:4", "kind": "fallthrough"}, {"src": "37:4", "dst": "@exit", "kind": "exception"}, {"src": "38:4", "dst": "39:4", "kind": "fallthrough"}, {"src": "39:4", "dst": "40:4", "kind": "fallthrough"}, {"src": "39:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "37:4"}, {"src": "37:4", "dst": "38:4"}, {"src": "37:4", "dst": "39:4"}, {"src": "39:4", "dst": "40:4"}], "ddg": [{"src": "@entry", "dst": "37:4", "var": "pipeline::Box", "prov": ["ssa"]}, {"src": "37:4", "dst": "38:4", "var": "p", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4", "var": "p", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4", "var": "p.get", "prov": ["ssa"]}, {"src": "38:4", "dst": "39:4", "var": "q", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4/actual_in:0", "var": "p", "prov": ["reaching-defs"]}, {"src": "37:4", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "37:4/actual_out:0", "dst": "37:4", "var": "", "prov": ["reaching-defs"]}, {"src": "37:4/actual_out:1", "dst": "37:4", "var": "self", "prov": ["reaching-defs"]}, {"src": "38:4", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "39:4", "dst": "40:4/actual_in:0", "var": "p", "prov": ["reaching-defs"]}, {"src": "40:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "40:4/actual_out", "dst": "40:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "37:4/actual_in:1", "var": "pipeline::Box", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "37:4", "var": "pipeline::Box", "prov": ["reaching-defs"]}, {"src": "38:4", "dst": "40:4", "var": "p.get", "prov": ["points-to"]}, {"src": "39:4", "dst": "40:4", "var": "p", "prov": ["points-to"]}, {"src": "@entry", "dst": "40:4", "var": "p.get", "prov": ["points-to"]}], "summary": [{"src": "37:4/actual_in:0", "dst": "37:4/actual_out:1"}, {"src": "37:4/actual_in:1", "dst": "37:4/actual_out:1"}, {"src": "40:4/actual_in:0", "dst": "40:4/actual_out"}]}, "make_adder": {"name": "make_adder", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.make_adder", "id": "can://dataflow/python/pipeline.py/make_adder(base)", "kind": "function", "span": {"start": [43, 0], "end": [46, 14], "bytes": [550, 626]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "base", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "type": "int", "decorators": [], "start_line": 43, "end_line": 43, "start_column": 15, "end_column": 19}], "start_line": 43, "end_line": 46, "code_start_line": 44, "accessed_symbols": [{"name": "add", "scope": "local", "kind": "function", "type": "add", "is_builtin": false, "lineno": 46, "col_offset": 11}, {"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 45, "col_offset": 15}, {"name": "base", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 45, "col_offset": 19}], "callables": {"add": {"name": "add", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.make_adder.add", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "kind": "function", "span": {"start": [44, 4], "end": [45, 23], "bytes": [576, 611]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "decorators": [], "start_line": 44, "end_line": 44, "start_column": 12, "end_column": 13}], "start_line": 44, "end_line": 45, "code_start_line": 45, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 45, "col_offset": 15}, {"name": "base", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 45, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@entry", "arguments": []}, "45:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@45:8", "span": {"start": [45, 8], "end": [45, 23], "bytes": [596, 611]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:1", "of": ":base", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "45:8", "kind": "fallthrough"}, {"src": "45:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "45:8"}], "ddg": [{"src": "@entry", "dst": "45:8", "var": "base", "prov": ["ssa"]}, {"src": "@entry", "dst": "45:8", "var": "x", "prov": ["ssa"]}, {"src": "45:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "45:8", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "45:8", "var": "base", "prov": ["reaching-defs"]}], "summary": []}}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/make_adder(base)@entry", "arguments": []}, "44:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/make_adder(base)@44:4", "span": {"start": [44, 4], "end": [45, 23], "bytes": [576, 611]}, "arguments": []}, "46:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/make_adder(base)@46:4", "span": {"start": [46, 4], "end": [46, 14], "bytes": [616, 626]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/make_adder(base)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "of": "base", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_out", "of": "", "arguments": []}, "44:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)@44:4/actual_in:0", "of": ":base", "parent": "44:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "44:4", "kind": "fallthrough"}, {"src": "44:4", "dst": "46:4", "kind": "fallthrough"}, {"src": "46:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "44:4"}, {"src": "@entry", "dst": "46:4"}], "ddg": [{"src": "@entry", "dst": "44:4", "var": "base", "prov": ["ssa"]}, {"src": "44:4", "dst": "46:4", "var": "add", "prov": ["ssa"]}, {"src": "46:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "44:4/actual_in:0", "var": "base", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "44:4", "var": "base", "prov": ["reaching-defs"]}], "summary": []}, "use_adder": {"name": "use_adder", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.use_adder", "id": "can://dataflow/python/pipeline.py/use_adder(n)", "kind": "function", "span": {"start": [49, 0], "end": [51, 18], "bytes": [629, 690]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:0", "decorators": [], "start_line": 49, "end_line": 49, "start_column": 14, "end_column": 15}], "start_line": 49, "end_line": 51, "code_start_line": 50, "accessed_symbols": [{"name": "make_adder", "scope": "local", "kind": "function", "type": "make_adder", "qualified_name": "pipeline.make_adder", "is_builtin": false, "lineno": 50, "col_offset": 11}, {"name": "add5", "scope": "local", "kind": "function", "type": "add", "is_builtin": false, "lineno": 51, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 51, "col_offset": 16}], "callables": {}, "types": {}, "local_variables": [{"name": "add5", "type": "add", "initializer": "make_adder(5)", "scope": "function", "start_line": 50, "end_line": 50, "start_column": 4, "end_column": 8}], "cyclomatic_complexity": 2, "body": {"50:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:11", "span": {"start": [50, 11], "end": [50, 24], "bytes": [658, 671]}, "callee": "can://dataflow/python/pipeline.py/make_adder(base)", "parent": "50:4", "method_name": "make_adder", "return_type": "add", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "5"}]}, "51:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:11", "span": {"start": [51, 11], "end": [51, 18], "bytes": [683, 690]}, "callee": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "parent": "51:4", "method_name": "add5", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/use_adder(n)@entry", "arguments": []}, "50:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4", "span": {"start": [50, 4], "end": [50, 24], "bytes": [651, 671]}, "arguments": []}, "51:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4", "span": {"start": [51, 4], "end": [51, 18], "bytes": [676, 690]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/use_adder(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:1", "of": ":pipeline::make_adder", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_out:1", "of": "n", "arguments": []}, "50:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_in:0", "of": "base", "parent": "50:4", "arguments": []}, "50:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_out", "of": "", "parent": "50:4", "arguments": []}, "51:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_in:0", "of": "x", "parent": "51:4", "arguments": []}, "51:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_out", "of": "", "parent": "51:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "50:4", "kind": "fallthrough"}, {"src": "50:4", "dst": "51:4", "kind": "fallthrough"}, {"src": "50:4", "dst": "@exit", "kind": "exception"}, {"src": "51:4", "dst": "@exit", "kind": "exception"}, {"src": "51:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "50:4"}, {"src": "50:4", "dst": "51:4"}], "ddg": [{"src": "@entry", "dst": "50:4", "var": "pipeline::make_adder", "prov": ["ssa"]}, {"src": "@entry", "dst": "51:4", "var": "n", "prov": ["ssa"]}, {"src": "50:4", "dst": "51:4", "var": "add5", "prov": ["ssa"]}, {"src": "50:4/actual_out", "dst": "50:4", "var": "", "prov": ["reaching-defs"]}, {"src": "51:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "51:4", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "51:4/actual_out", "dst": "51:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "50:4/actual_in:0", "var": "pipeline::make_adder", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "51:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "51:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "50:4", "var": "pipeline::make_adder", "prov": ["reaching-defs"]}], "summary": [{"src": "50:4/actual_in:0", "dst": "50:4/actual_out"}, {"src": "51:4/actual_in:0", "dst": "51:4/actual_out"}]}, "mutate": {"name": "mutate", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.mutate", "id": "can://dataflow/python/pipeline.py/mutate(items)", "kind": "function", "span": {"start": [54, 0], "end": [55, 19], "bytes": [693, 731]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "items", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "type": "list", "decorators": [], "start_line": 54, "end_line": 54, "start_column": 11, "end_column": 16}], "start_line": 54, "end_line": 55, "code_start_line": 55, "accessed_symbols": [{"name": "items", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": true, "lineno": 55, "col_offset": 4}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 1, "body": {"55:4": {"kind": "call", "id": "can://dataflow/python/pipeline.py/mutate(items)@55:4", "span": {"start": [55, 4], "end": [55, 19], "bytes": [716, 731]}, "callee": "can://dataflow/@external/builtins.list/append", "method_name": "append", "receiver_expr": "items", "receiver_type": "list", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "1"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/mutate(items)@entry", "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/mutate(items)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "of": "items", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:1", "of": "items", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "55:4", "kind": "fallthrough"}, {"src": "55:4", "dst": "@exit", "kind": "exception"}, {"src": "55:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "55:4"}], "ddg": [{"src": "@entry", "dst": "55:4", "var": "items", "prov": ["ssa"]}, {"src": "@entry", "dst": "55:4", "var": "items.append", "prov": ["ssa"]}, {"src": "55:4", "dst": "@formal_out:1", "var": "items.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "55:4", "var": "items", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "55:4", "var": "items.append", "prov": ["reaching-defs"]}], "summary": []}, "caller_of_mutate": {"name": "caller_of_mutate", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.caller_of_mutate", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()", "kind": "function", "span": {"start": [58, 0], "end": [61, 13], "bytes": [734, 798]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 58, "end_line": 61, "code_start_line": 59, "accessed_symbols": [{"name": "xs", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 61, "col_offset": 11}, {"name": "mutate", "scope": "local", "kind": "function", "type": "mutate", "qualified_name": "pipeline.mutate", "is_builtin": false, "lineno": 60, "col_offset": 4}, {"name": "xs", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 60, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "xs", "type": "list", "initializer": "[]", "scope": "function", "start_line": 59, "end_line": 59, "start_column": 4, "end_column": 6}], "cyclomatic_complexity": 2, "body": {"60:4": {"kind": "call", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4", "span": {"start": [60, 4], "end": [60, 14], "bytes": [774, 784]}, "callee": "can://dataflow/python/pipeline.py/mutate(items)", "method_name": "mutate", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "list", "name": "xs"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@entry", "arguments": []}, "59:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@59:4", "span": {"start": [59, 4], "end": [59, 11], "bytes": [762, 769]}, "arguments": []}, "61:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@61:4", "span": {"start": [61, 4], "end": [61, 13], "bytes": [789, 798]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@formal_in:0", "of": ":pipeline::mutate", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@formal_out", "of": "", "arguments": []}, "60:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_in:0", "of": "items", "parent": "60:4", "arguments": []}, "60:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:0", "of": "", "parent": "60:4", "arguments": []}, "60:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:1", "of": "items", "parent": "60:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "59:4", "kind": "fallthrough"}, {"src": "59:4", "dst": "60:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "61:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "@exit", "kind": "exception"}, {"src": "61:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "59:4"}, {"src": "@entry", "dst": "60:4"}, {"src": "60:4", "dst": "61:4"}], "ddg": [{"src": "@entry", "dst": "60:4", "var": "pipeline::mutate", "prov": ["ssa"]}, {"src": "59:4", "dst": "60:4", "var": "xs", "prov": ["ssa"]}, {"src": "59:4", "dst": "61:4", "var": "xs", "prov": ["ssa"]}, {"src": "60:4", "dst": "61:4", "var": "xs", "prov": ["ssa"]}, {"src": "59:4", "dst": "60:4/actual_in:0", "var": "xs", "prov": ["reaching-defs"]}, {"src": "60:4/actual_out:0", "dst": "60:4", "var": "", "prov": ["reaching-defs"]}, {"src": "60:4/actual_out:1", "dst": "60:4", "var": "items", "prov": ["reaching-defs"]}, {"src": "61:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "60:4", "var": "pipeline::mutate", "prov": ["reaching-defs"]}], "summary": [{"src": "60:4/actual_in:0", "dst": "60:4/actual_out:1"}]}}, "variables": [], "content_hash": "9ecfbafa73a36ed35c0625267ef7e5de9b9b949badaf6373171ad5f42acb37f4", "last_modified": 1787161494.129043, "file_size": 799}, "main.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "module_name": "main", "id": "can://dataflow/python/main.py", "kind": "module", "source": "\"\"\"Intraprocedural dataflow constructs with hand-computable graphs.\n\nEvery callable here is referenced by name in the level-3 gate tests\n(test_dataflow_*.py); keep line numbers stable when editing.\n\"\"\"\n\nfrom pipeline import chain_a\nfrom state import bump, read_counter\n\n\ndef branchy(n):\n if n > 0:\n x = n + 1\n else:\n x = -n\n return x\n\n\ndef looped(n):\n total = 0\n i = 0\n while i < n:\n total = total + i\n i = i + 1\n return total\n\n\ndef early_exit(n):\n if n < 0:\n return -1\n y = n * 2\n return y\n\n\ndef risky(n):\n if n < 0:\n raise ValueError(\"negative\")\n return n\n\n\ndef handles(n):\n try:\n v = risky(n)\n ok = 1\n except ValueError:\n v = 0\n ok = 0\n finally:\n done = True\n return v + ok\n\n\ndef with_block(path):\n with open(path) as fh:\n data = fh.read()\n return data\n\n\ndef comprehend(items):\n squares = [i * i for i in items]\n i = \"not-the-loop-var\"\n return squares, i\n\n\ndef gen(n):\n k = 0\n while k < n:\n yield k\n k = k + 1\n\n\nasync def slow(x):\n return x + 1\n\n\nasync def fetch(x):\n y = await slow(x)\n return y\n\n\ndef short_circuit(a, b):\n c = a and b\n d = a or b\n return c, d\n\n\ndef infinite():\n while True:\n pass\n\n\ndef drive(n):\n r = chain_a(n)\n bump(r)\n return read_counter()\n", "imports": [{"module": "pipeline", "name": "chain_a", "start_line": 7, "end_line": 7, "start_column": 0, "end_column": 28}, {"module": "state", "name": "bump", "start_line": 8, "end_line": 8, "start_column": 0, "end_column": 36}, {"module": "state", "name": "read_counter", "start_line": 8, "end_line": 8, "start_column": 0, "end_column": 36}], "comments": [{"content": "Intraprocedural dataflow constructs with hand-computable graphs.\n\nEvery callable here is referenced by name in the level-3 gate tests\n(test_dataflow_*.py); keep line numbers stable when editing.\n", "start_line": 1, "end_line": 5, "start_column": 0, "end_column": 3, "is_docstring": true}], "types": {}, "functions": {"branchy": {"name": "branchy", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.branchy", "id": "can://dataflow/python/main.py/branchy(n)", "kind": "function", "span": {"start": [11, 0], "end": [16, 12], "bytes": [271, 356]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/branchy(n)@formal_in:0", "decorators": [], "start_line": 11, "end_line": 11, "start_column": 12, "end_column": 13}], "start_line": 11, "end_line": 16, "code_start_line": 12, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 16, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 12, "col_offset": 7}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 13, "col_offset": 12}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 15, "col_offset": 13}], "callables": {}, "types": {}, "local_variables": [{"name": "x", "type": "int", "initializer": "n + 1", "scope": "function", "start_line": 13, "end_line": 13, "start_column": 8, "end_column": 9}, {"name": "x", "initializer": "-n", "scope": "function", "start_line": 15, "end_line": 15, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/branchy(n)@entry", "arguments": []}, "12:7": {"kind": "branch", "id": "can://dataflow/python/main.py/branchy(n)@12:7", "span": {"start": [12, 7], "end": [12, 12], "bytes": [294, 299]}, "arguments": []}, "13:8": {"kind": "statement", "id": "can://dataflow/python/main.py/branchy(n)@13:8", "span": {"start": [13, 8], "end": [13, 17], "bytes": [309, 318]}, "arguments": []}, "15:8": {"kind": "statement", "id": "can://dataflow/python/main.py/branchy(n)@15:8", "span": {"start": [15, 8], "end": [15, 14], "bytes": [337, 343]}, "arguments": []}, "16:4": {"kind": "return", "id": "can://dataflow/python/main.py/branchy(n)@16:4", "span": {"start": [16, 4], "end": [16, 12], "bytes": [348, 356]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/branchy(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/branchy(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/branchy(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "12:7", "kind": "fallthrough"}, {"src": "12:7", "dst": "13:8", "kind": "true"}, {"src": "12:7", "dst": "15:8", "kind": "false"}, {"src": "13:8", "dst": "16:4", "kind": "fallthrough"}, {"src": "15:8", "dst": "16:4", "kind": "fallthrough"}, {"src": "16:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "12:7"}, {"src": "@entry", "dst": "16:4"}, {"src": "12:7", "dst": "13:8"}, {"src": "12:7", "dst": "15:8"}], "ddg": [{"src": "@entry", "dst": "12:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "13:8", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "15:8", "var": "n", "prov": ["ssa"]}, {"src": "13:8", "dst": "16:4", "var": "x", "prov": ["ssa"]}, {"src": "15:8", "dst": "16:4", "var": "x", "prov": ["ssa"]}, {"src": "16:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "12:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "13:8", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "15:8", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "looped": {"name": "looped", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.looped", "id": "can://dataflow/python/main.py/looped(n)", "kind": "function", "span": {"start": [19, 0], "end": [25, 16], "bytes": [359, 475]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/looped(n)@formal_in:0", "decorators": [], "start_line": 19, "end_line": 19, "start_column": 11, "end_column": 12}], "start_line": 19, "end_line": 25, "code_start_line": 20, "accessed_symbols": [{"name": "total", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 25, "col_offset": 11}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 22, "col_offset": 10}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 22, "col_offset": 14}, {"name": "total", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 16}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 24}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 24, "col_offset": 12}], "callables": {}, "types": {}, "local_variables": [{"name": "total", "type": "int", "initializer": "0", "scope": "function", "start_line": 20, "end_line": 20, "start_column": 4, "end_column": 9}, {"name": "i", "type": "int", "initializer": "0", "scope": "function", "start_line": 21, "end_line": 21, "start_column": 4, "end_column": 5}, {"name": "total", "type": "int", "initializer": "total + i", "scope": "function", "start_line": 23, "end_line": 23, "start_column": 8, "end_column": 13}, {"name": "i", "type": "int", "initializer": "i + 1", "scope": "function", "start_line": 24, "end_line": 24, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/looped(n)@entry", "arguments": []}, "20:4": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@20:4", "span": {"start": [20, 4], "end": [20, 13], "bytes": [378, 387]}, "arguments": []}, "21:4": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@21:4", "span": {"start": [21, 4], "end": [21, 9], "bytes": [392, 397]}, "arguments": []}, "22:10": {"kind": "loop", "id": "can://dataflow/python/main.py/looped(n)@22:10", "span": {"start": [22, 10], "end": [22, 15], "bytes": [408, 413]}, "arguments": []}, "23:8": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@23:8", "span": {"start": [23, 8], "end": [23, 25], "bytes": [423, 440]}, "arguments": []}, "24:8": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@24:8", "span": {"start": [24, 8], "end": [24, 17], "bytes": [449, 458]}, "arguments": []}, "25:4": {"kind": "return", "id": "can://dataflow/python/main.py/looped(n)@25:4", "span": {"start": [25, 4], "end": [25, 16], "bytes": [463, 475]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/looped(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/looped(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/looped(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "20:4", "kind": "fallthrough"}, {"src": "20:4", "dst": "21:4", "kind": "fallthrough"}, {"src": "21:4", "dst": "22:10", "kind": "fallthrough"}, {"src": "22:10", "dst": "23:8", "kind": "true"}, {"src": "22:10", "dst": "25:4", "kind": "false"}, {"src": "23:8", "dst": "24:8", "kind": "fallthrough"}, {"src": "24:8", "dst": "22:10", "kind": "loop_back"}, {"src": "25:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "20:4"}, {"src": "@entry", "dst": "21:4"}, {"src": "@entry", "dst": "22:10"}, {"src": "@entry", "dst": "25:4"}, {"src": "22:10", "dst": "23:8"}, {"src": "22:10", "dst": "24:8"}], "ddg": [{"src": "@entry", "dst": "22:10", "var": "n", "prov": ["ssa"]}, {"src": "20:4", "dst": "23:8", "var": "total", "prov": ["ssa"]}, {"src": "20:4", "dst": "25:4", "var": "total", "prov": ["ssa"]}, {"src": "21:4", "dst": "22:10", "var": "i", "prov": ["ssa"]}, {"src": "21:4", "dst": "23:8", "var": "i", "prov": ["ssa"]}, {"src": "21:4", "dst": "24:8", "var": "i", "prov": ["ssa"]}, {"src": "23:8", "dst": "23:8", "var": "total", "prov": ["ssa"]}, {"src": "23:8", "dst": "25:4", "var": "total", "prov": ["ssa"]}, {"src": "24:8", "dst": "22:10", "var": "i", "prov": ["ssa"]}, {"src": "24:8", "dst": "23:8", "var": "i", "prov": ["ssa"]}, {"src": "24:8", "dst": "24:8", "var": "i", "prov": ["ssa"]}, {"src": "25:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "22:10", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "early_exit": {"name": "early_exit", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.early_exit", "id": "can://dataflow/python/main.py/early_exit(n)", "kind": "function", "span": {"start": [28, 0], "end": [32, 12], "bytes": [478, 555]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/early_exit(n)@formal_in:0", "decorators": [], "start_line": 28, "end_line": 28, "start_column": 15, "end_column": 16}], "start_line": 28, "end_line": 32, "code_start_line": 29, "accessed_symbols": [{"name": "y", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 32, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 29, "col_offset": 7}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 31, "col_offset": 8}], "callables": {}, "types": {}, "local_variables": [{"name": "y", "type": "int", "initializer": "n * 2", "scope": "function", "start_line": 31, "end_line": 31, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 4, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/early_exit(n)@entry", "arguments": []}, "29:7": {"kind": "branch", "id": "can://dataflow/python/main.py/early_exit(n)@29:7", "span": {"start": [29, 7], "end": [29, 12], "bytes": [504, 509]}, "arguments": []}, "30:8": {"kind": "return", "id": "can://dataflow/python/main.py/early_exit(n)@30:8", "span": {"start": [30, 8], "end": [30, 17], "bytes": [519, 528]}, "arguments": []}, "31:4": {"kind": "statement", "id": "can://dataflow/python/main.py/early_exit(n)@31:4", "span": {"start": [31, 4], "end": [31, 13], "bytes": [533, 542]}, "arguments": []}, "32:4": {"kind": "return", "id": "can://dataflow/python/main.py/early_exit(n)@32:4", "span": {"start": [32, 4], "end": [32, 12], "bytes": [547, 555]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/early_exit(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/early_exit(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/early_exit(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "29:7", "kind": "fallthrough"}, {"src": "29:7", "dst": "30:8", "kind": "true"}, {"src": "29:7", "dst": "31:4", "kind": "false"}, {"src": "30:8", "dst": "@exit", "kind": "return"}, {"src": "31:4", "dst": "32:4", "kind": "fallthrough"}, {"src": "32:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "29:7"}, {"src": "29:7", "dst": "30:8"}, {"src": "29:7", "dst": "31:4"}, {"src": "29:7", "dst": "32:4"}], "ddg": [{"src": "@entry", "dst": "29:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "31:4", "var": "n", "prov": ["ssa"]}, {"src": "31:4", "dst": "32:4", "var": "y", "prov": ["ssa"]}, {"src": "30:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "32:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "29:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "31:4", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "risky": {"name": "risky", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.risky", "id": "can://dataflow/python/main.py/risky(n)", "kind": "function", "span": {"start": [35, 0], "end": [38, 12], "bytes": [558, 635]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/risky(n)@formal_in:0", "decorators": [], "start_line": 35, "end_line": 35, "start_column": 10, "end_column": 11}], "start_line": 35, "end_line": 38, "code_start_line": 36, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 38, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 36, "col_offset": 7}, {"name": "ValueError", "scope": "local", "kind": "class", "type": "ValueError", "qualified_name": "builtins.ValueError", "is_builtin": false, "lineno": 37, "col_offset": 14}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {"37:14": {"kind": "call", "id": "can://dataflow/python/main.py/risky(n)@37:14", "span": {"start": [37, 14], "end": [37, 36], "bytes": [600, 622]}, "callee": "can://dataflow/@external/builtins.ValueError/__init__", "parent": "37:8", "method_name": "ValueError", "return_type": "ValueError", "is_constructor_call": true, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"negative\""}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/risky(n)@entry", "arguments": []}, "36:7": {"kind": "branch", "id": "can://dataflow/python/main.py/risky(n)@36:7", "span": {"start": [36, 7], "end": [36, 12], "bytes": [579, 584]}, "arguments": []}, "37:8": {"kind": "raise", "id": "can://dataflow/python/main.py/risky(n)@37:8", "span": {"start": [37, 8], "end": [37, 36], "bytes": [594, 622]}, "arguments": []}, "38:4": {"kind": "return", "id": "can://dataflow/python/main.py/risky(n)@38:4", "span": {"start": [38, 4], "end": [38, 12], "bytes": [627, 635]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/risky(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/risky(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/risky(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "36:7", "kind": "fallthrough"}, {"src": "36:7", "dst": "37:8", "kind": "true"}, {"src": "36:7", "dst": "38:4", "kind": "false"}, {"src": "37:8", "dst": "@exit", "kind": "exception"}, {"src": "38:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "36:7"}, {"src": "36:7", "dst": "37:8"}, {"src": "36:7", "dst": "38:4"}], "ddg": [{"src": "@entry", "dst": "36:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "37:8", "var": "ValueError", "prov": ["ssa"]}, {"src": "@entry", "dst": "38:4", "var": "n", "prov": ["ssa"]}, {"src": "38:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "36:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "38:4", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "handles": {"name": "handles", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.handles", "id": "can://dataflow/python/main.py/handles(n)", "kind": "function", "span": {"start": [41, 0], "end": [50, 17], "bytes": [638, 801]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/handles(n)@formal_in:0", "decorators": [], "start_line": 41, "end_line": 41, "start_column": 12, "end_column": 13}], "start_line": 41, "end_line": 50, "code_start_line": 42, "accessed_symbols": [{"name": "ValueError", "scope": "local", "kind": "class", "type": "ValueError", "qualified_name": "builtins.ValueError", "is_builtin": false, "lineno": 45, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 50, "col_offset": 11}, {"name": "ok", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 50, "col_offset": 15}, {"name": "risky", "scope": "local", "kind": "function", "type": "risky", "qualified_name": "main.risky", "is_builtin": false, "lineno": 43, "col_offset": 12}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 43, "col_offset": 18}], "callables": {}, "types": {}, "local_variables": [{"name": "v", "initializer": "risky(n)", "scope": "function", "start_line": 43, "end_line": 43, "start_column": 8, "end_column": 9}, {"name": "ok", "type": "int", "initializer": "1", "scope": "function", "start_line": 44, "end_line": 44, "start_column": 8, "end_column": 10}, {"name": "done", "type": "bool", "initializer": "True", "scope": "function", "start_line": 49, "end_line": 49, "start_column": 8, "end_column": 12}, {"name": "v", "type": "int", "initializer": "0", "scope": "function", "start_line": 46, "end_line": 46, "start_column": 8, "end_column": 9}, {"name": "ok", "type": "int", "initializer": "0", "scope": "function", "start_line": 47, "end_line": 47, "start_column": 8, "end_column": 10}], "cyclomatic_complexity": 4, "body": {"43:12": {"kind": "call", "id": "can://dataflow/python/main.py/handles(n)@43:12", "span": {"start": [43, 12], "end": [43, 20], "bytes": [675, 683]}, "callee": "can://dataflow/python/main.py/risky(n)", "parent": "43:8", "method_name": "risky", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/handles(n)@entry", "arguments": []}, "43:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@43:8", "span": {"start": [43, 8], "end": [43, 20], "bytes": [671, 683]}, "arguments": []}, "44:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@44:8", "span": {"start": [44, 8], "end": [44, 14], "bytes": [692, 698]}, "arguments": []}, "45:4": {"kind": "handler", "id": "can://dataflow/python/main.py/handles(n)@45:4", "span": {"start": [45, 4], "end": [45, 21], "bytes": [703, 720]}, "arguments": []}, "46:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@46:8", "span": {"start": [46, 8], "end": [46, 13], "bytes": [730, 735]}, "arguments": []}, "47:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@47:8", "span": {"start": [47, 8], "end": [47, 14], "bytes": [744, 750]}, "arguments": []}, "49:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@49:8", "span": {"start": [49, 8], "end": [49, 19], "bytes": [772, 783]}, "arguments": []}, "50:4": {"kind": "return", "id": "can://dataflow/python/main.py/handles(n)@50:4", "span": {"start": [50, 4], "end": [50, 17], "bytes": [788, 801]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/handles(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/handles(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/handles(n)@formal_in:1", "of": ":main::risky", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/handles(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/handles(n)@formal_out:1", "of": "n", "arguments": []}, "43:8/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/handles(n)@43:8/actual_in:0", "of": "n", "parent": "43:8", "arguments": []}, "43:8/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/handles(n)@43:8/actual_out", "of": "", "parent": "43:8", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "43:8", "kind": "fallthrough"}, {"src": "43:8", "dst": "44:8", "kind": "fallthrough"}, {"src": "43:8", "dst": "45:4", "kind": "exception"}, {"src": "44:8", "dst": "49:8", "kind": "fallthrough"}, {"src": "45:4", "dst": "46:8", "kind": "true"}, {"src": "45:4", "dst": "49:8", "kind": "exception"}, {"src": "45:4", "dst": "@exit", "kind": "exception"}, {"src": "46:8", "dst": "47:8", "kind": "fallthrough"}, {"src": "47:8", "dst": "49:8", "kind": "fallthrough"}, {"src": "49:8", "dst": "50:4", "kind": "fallthrough"}, {"src": "49:8", "dst": "@exit", "kind": "exception"}, {"src": "50:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "43:8"}, {"src": "43:8", "dst": "44:8"}, {"src": "43:8", "dst": "45:4"}, {"src": "43:8", "dst": "49:8"}, {"src": "45:4", "dst": "46:8"}, {"src": "45:4", "dst": "47:8"}, {"src": "45:4", "dst": "49:8"}, {"src": "49:8", "dst": "50:4"}], "ddg": [{"src": "@entry", "dst": "43:8", "var": "main::risky", "prov": ["ssa"]}, {"src": "@entry", "dst": "43:8", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "45:4", "var": "ValueError", "prov": ["ssa"]}, {"src": "43:8", "dst": "50:4", "var": "v", "prov": ["ssa"]}, {"src": "44:8", "dst": "50:4", "var": "ok", "prov": ["ssa"]}, {"src": "46:8", "dst": "50:4", "var": "v", "prov": ["ssa"]}, {"src": "47:8", "dst": "50:4", "var": "ok", "prov": ["ssa"]}, {"src": "43:8", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "43:8/actual_out", "dst": "43:8", "var": "", "prov": ["reaching-defs"]}, {"src": "50:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "43:8/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "43:8", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "43:8", "var": "main::risky", "prov": ["reaching-defs"]}, {"src": "43:8", "dst": "45:4", "var": "ValueError", "prov": ["points-to"]}, {"src": "43:8", "dst": "50:4", "var": "ok", "prov": ["points-to"]}], "summary": [{"src": "43:8/actual_in:0", "dst": "43:8/actual_out"}]}, "with_block": {"name": "with_block", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.with_block", "id": "can://dataflow/python/main.py/with_block(path)", "kind": "function", "span": {"start": [53, 0], "end": [56, 15], "bytes": [804, 893]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "path", "id": "can://dataflow/python/main.py/with_block(path)@formal_in:0", "decorators": [], "start_line": 53, "end_line": 53, "start_column": 15, "end_column": 19}], "start_line": 53, "end_line": 56, "code_start_line": 54, "accessed_symbols": [{"name": "data", "scope": "local", "kind": "variable", "type": "bytes", "qualified_name": "builtins.bytes", "is_builtin": false, "lineno": 56, "col_offset": 11}, {"name": "open", "scope": "local", "kind": "function", "type": "open", "qualified_name": "builtins.open", "is_builtin": false, "lineno": 54, "col_offset": 9}, {"name": "path", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 54, "col_offset": 14}, {"name": "fh", "scope": "local", "kind": "variable", "type": "BufferedRandom", "qualified_name": "io.BufferedRandom", "is_builtin": false, "lineno": 55, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [{"name": "data", "type": "bytes", "initializer": "fh.read()", "scope": "function", "start_line": 55, "end_line": 55, "start_column": 8, "end_column": 12}], "cyclomatic_complexity": 3, "body": {"54:9": {"kind": "call", "id": "can://dataflow/python/main.py/with_block(path)@54:9", "span": {"start": [54, 9], "end": [54, 19], "bytes": [835, 845]}, "callee": "can://dataflow/@external/builtins/open", "parent": "54:4", "method_name": "open", "return_type": "BufferedRandom", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "path"}]}, "55:15": {"kind": "call", "id": "can://dataflow/python/main.py/with_block(path)@55:15", "span": {"start": [55, 15], "end": [55, 24], "bytes": [868, 877]}, "callee": "can://dataflow/@external/builtins._TextIOBase/read", "parent": "55:8", "method_name": "read", "receiver_expr": "fh", "receiver_type": "BufferedRandom", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/with_block(path)@entry", "arguments": []}, "54:4": {"kind": "statement", "id": "can://dataflow/python/main.py/with_block(path)@54:4", "span": {"start": [54, 4], "end": [54, 19], "bytes": [830, 845]}, "arguments": []}, "55:8": {"kind": "statement", "id": "can://dataflow/python/main.py/with_block(path)@55:8", "span": {"start": [55, 8], "end": [55, 24], "bytes": [861, 877]}, "arguments": []}, "56:4": {"kind": "return", "id": "can://dataflow/python/main.py/with_block(path)@56:4", "span": {"start": [56, 4], "end": [56, 15], "bytes": [882, 893]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/with_block(path)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/with_block(path)@formal_in:0", "of": "path", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/with_block(path)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/with_block(path)@formal_out:1", "of": "path", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "54:4", "kind": "fallthrough"}, {"src": "54:4", "dst": "55:8", "kind": "fallthrough"}, {"src": "54:4", "dst": "@exit", "kind": "exception"}, {"src": "55:8", "dst": "56:4", "kind": "fallthrough"}, {"src": "55:8", "dst": "@exit", "kind": "exception"}, {"src": "56:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "54:4"}, {"src": "54:4", "dst": "55:8"}, {"src": "55:8", "dst": "56:4"}], "ddg": [{"src": "@entry", "dst": "54:4", "var": "open", "prov": ["ssa"]}, {"src": "@entry", "dst": "54:4", "var": "path", "prov": ["ssa"]}, {"src": "54:4", "dst": "55:8", "var": "fh", "prov": ["ssa"]}, {"src": "54:4", "dst": "55:8", "var": "fh.read", "prov": ["ssa"]}, {"src": "55:8", "dst": "56:4", "var": "data", "prov": ["ssa"]}, {"src": "54:4", "dst": "@formal_out:1", "var": "path.*", "prov": ["reaching-defs"]}, {"src": "56:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "54:4", "var": "path", "prov": ["reaching-defs"]}, {"src": "54:4", "dst": "56:4", "var": "data", "prov": ["points-to"]}, {"src": "@entry", "dst": "55:8", "var": "fh.read", "prov": ["points-to"]}], "summary": []}, "comprehend": {"name": "comprehend", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.comprehend", "id": "can://dataflow/python/main.py/comprehend(items)", "kind": "function", "span": {"start": [59, 0], "end": [62, 21], "bytes": [896, 1004]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "items", "id": "can://dataflow/python/main.py/comprehend(items)@formal_in:0", "decorators": [], "start_line": 59, "end_line": 59, "start_column": 15, "end_column": 20}], "start_line": 59, "end_line": 62, "code_start_line": 60, "accessed_symbols": [{"name": "squares", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 62, "col_offset": 11}, {"name": "i", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 62, "col_offset": 20}, {"name": "i", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 60, "col_offset": 15}, {"name": "i", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 60, "col_offset": 19}, {"name": "items", "scope": "local", "kind": "variable", "is_builtin": true, "lineno": 60, "col_offset": 30}], "callables": {}, "types": {}, "local_variables": [{"name": "squares", "type": "list", "initializer": "[i * i for i in items]", "scope": "function", "start_line": 60, "end_line": 60, "start_column": 4, "end_column": 11}, {"name": "i", "type": "str", "initializer": "'not-the-loop-var'", "scope": "function", "start_line": 61, "end_line": 61, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/comprehend(items)@entry", "arguments": []}, "60:4": {"kind": "statement", "id": "can://dataflow/python/main.py/comprehend(items)@60:4", "span": {"start": [60, 4], "end": [60, 36], "bytes": [923, 955]}, "arguments": []}, "61:4": {"kind": "statement", "id": "can://dataflow/python/main.py/comprehend(items)@61:4", "span": {"start": [61, 4], "end": [61, 26], "bytes": [960, 982]}, "arguments": []}, "62:4": {"kind": "return", "id": "can://dataflow/python/main.py/comprehend(items)@62:4", "span": {"start": [62, 4], "end": [62, 21], "bytes": [987, 1004]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/comprehend(items)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/comprehend(items)@formal_in:0", "of": "items", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/comprehend(items)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "60:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "61:4", "kind": "fallthrough"}, {"src": "61:4", "dst": "62:4", "kind": "fallthrough"}, {"src": "62:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "60:4"}, {"src": "@entry", "dst": "61:4"}, {"src": "@entry", "dst": "62:4"}], "ddg": [{"src": "@entry", "dst": "60:4", "var": "items", "prov": ["ssa"]}, {"src": "60:4", "dst": "62:4", "var": "squares", "prov": ["ssa"]}, {"src": "61:4", "dst": "62:4", "var": "i", "prov": ["ssa"]}, {"src": "62:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "60:4", "var": "items", "prov": ["reaching-defs"]}], "summary": []}, "gen": {"name": "gen", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.gen", "id": "can://dataflow/python/main.py/gen(n)", "kind": "function", "span": {"start": [65, 0], "end": [69, 17], "bytes": [1007, 1079]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/gen(n)@formal_in:0", "decorators": [], "start_line": 65, "end_line": 65, "start_column": 8, "end_column": 9}], "start_line": 65, "end_line": 69, "code_start_line": 66, "accessed_symbols": [{"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 67, "col_offset": 10}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 67, "col_offset": 14}, {"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 68, "col_offset": 14}, {"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 69, "col_offset": 12}], "callables": {}, "types": {}, "local_variables": [{"name": "k", "type": "int", "initializer": "0", "scope": "function", "start_line": 66, "end_line": 66, "start_column": 4, "end_column": 5}, {"name": "k", "type": "int", "initializer": "k + 1", "scope": "function", "start_line": 69, "end_line": 69, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/gen(n)@entry", "arguments": []}, "66:4": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@66:4", "span": {"start": [66, 4], "end": [66, 9], "bytes": [1023, 1028]}, "arguments": []}, "67:10": {"kind": "loop", "id": "can://dataflow/python/main.py/gen(n)@67:10", "span": {"start": [67, 10], "end": [67, 15], "bytes": [1039, 1044]}, "arguments": []}, "68:8": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@68:8", "span": {"start": [68, 8], "end": [68, 15], "bytes": [1054, 1061]}, "arguments": []}, "69:8": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@69:8", "span": {"start": [69, 8], "end": [69, 17], "bytes": [1070, 1079]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/gen(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/gen(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/gen(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "66:4", "kind": "fallthrough"}, {"src": "66:4", "dst": "67:10", "kind": "fallthrough"}, {"src": "67:10", "dst": "68:8", "kind": "true"}, {"src": "67:10", "dst": "@exit", "kind": "return"}, {"src": "68:8", "dst": "69:8", "kind": "yield"}, {"src": "68:8", "dst": "@exit", "kind": "yield"}, {"src": "69:8", "dst": "67:10", "kind": "loop_back"}], "cdg": [{"src": "@entry", "dst": "66:4"}, {"src": "67:10", "dst": "68:8"}, {"src": "68:8", "dst": "67:10"}, {"src": "68:8", "dst": "69:8"}], "ddg": [{"src": "@entry", "dst": "67:10", "var": "n", "prov": ["ssa"]}, {"src": "66:4", "dst": "67:10", "var": "k", "prov": ["ssa"]}, {"src": "66:4", "dst": "68:8", "var": "k", "prov": ["ssa"]}, {"src": "66:4", "dst": "69:8", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "67:10", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "68:8", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "69:8", "var": "k", "prov": ["ssa"]}, {"src": "@formal_in:0", "dst": "67:10", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "slow": {"name": "slow", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.slow", "id": "can://dataflow/python/main.py/slow(x)", "kind": "function", "span": {"start": [72, 0], "end": [73, 16], "bytes": [1082, 1117]}, "comments": [], "decorators": [], "modifiers": ["async"], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/main.py/slow(x)@formal_in:0", "decorators": [], "start_line": 72, "end_line": 72, "start_column": 15, "end_column": 16}], "start_line": 72, "end_line": 73, "code_start_line": 73, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 73, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/slow(x)@entry", "arguments": []}, "73:4": {"kind": "return", "id": "can://dataflow/python/main.py/slow(x)@73:4", "span": {"start": [73, 4], "end": [73, 16], "bytes": [1105, 1117]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/slow(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/slow(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/slow(x)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "73:4", "kind": "fallthrough"}, {"src": "73:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "73:4"}], "ddg": [{"src": "@entry", "dst": "73:4", "var": "x", "prov": ["ssa"]}, {"src": "73:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "73:4", "var": "x", "prov": ["reaching-defs"]}], "summary": []}, "fetch": {"name": "fetch", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.fetch", "id": "can://dataflow/python/main.py/fetch(x)", "kind": "function", "span": {"start": [76, 0], "end": [78, 12], "bytes": [1120, 1174]}, "comments": [], "decorators": [], "modifiers": ["async"], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:0", "decorators": [], "start_line": 76, "end_line": 76, "start_column": 16, "end_column": 17}], "start_line": 76, "end_line": 78, "code_start_line": 77, "accessed_symbols": [{"name": "y", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 78, "col_offset": 11}, {"name": "slow", "scope": "local", "kind": "function", "type": "slow", "qualified_name": "main.slow", "is_builtin": false, "lineno": 77, "col_offset": 14}, {"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 77, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [{"name": "y", "type": "int", "initializer": "await slow(x)", "scope": "function", "start_line": 77, "end_line": 77, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"77:14": {"kind": "call", "id": "can://dataflow/python/main.py/fetch(x)@77:14", "span": {"start": [77, 14], "end": [77, 21], "bytes": [1154, 1161]}, "callee": "can://dataflow/python/main.py/slow(x)", "parent": "77:4", "method_name": "slow", "return_type": "Coroutine", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "x"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/fetch(x)@entry", "arguments": []}, "77:4": {"kind": "statement", "id": "can://dataflow/python/main.py/fetch(x)@77:4", "span": {"start": [77, 4], "end": [77, 21], "bytes": [1144, 1161]}, "arguments": []}, "78:4": {"kind": "return", "id": "can://dataflow/python/main.py/fetch(x)@78:4", "span": {"start": [78, 4], "end": [78, 12], "bytes": [1166, 1174]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/fetch(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:1", "of": ":main::slow", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/fetch(x)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/fetch(x)@formal_out:1", "of": "x", "arguments": []}, "77:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/fetch(x)@77:4/actual_in:0", "of": "x", "parent": "77:4", "arguments": []}, "77:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/fetch(x)@77:4/actual_out", "of": "", "parent": "77:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "77:4", "kind": "fallthrough"}, {"src": "77:4", "dst": "78:4", "kind": "await_resume"}, {"src": "77:4", "dst": "@exit", "kind": "exception"}, {"src": "78:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "77:4"}, {"src": "77:4", "dst": "78:4"}], "ddg": [{"src": "@entry", "dst": "77:4", "var": "main::slow", "prov": ["ssa"]}, {"src": "@entry", "dst": "77:4", "var": "x", "prov": ["ssa"]}, {"src": "77:4", "dst": "78:4", "var": "y", "prov": ["ssa"]}, {"src": "77:4", "dst": "@formal_out:1", "var": "x.*", "prov": ["reaching-defs"]}, {"src": "77:4/actual_out", "dst": "77:4", "var": "", "prov": ["reaching-defs"]}, {"src": "78:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "77:4/actual_in:0", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "77:4", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "77:4", "var": "main::slow", "prov": ["reaching-defs"]}], "summary": [{"src": "77:4/actual_in:0", "dst": "77:4/actual_out"}]}, "short_circuit": {"name": "short_circuit", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.short_circuit", "id": "can://dataflow/python/main.py/short_circuit(a,b)", "kind": "function", "span": {"start": [81, 0], "end": [84, 15], "bytes": [1177, 1248]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "a", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:0", "decorators": [], "start_line": 81, "end_line": 81, "start_column": 18, "end_column": 19}, {"name": "b", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:1", "decorators": [], "start_line": 81, "end_line": 81, "start_column": 21, "end_column": 22}], "start_line": 81, "end_line": 84, "code_start_line": 82, "accessed_symbols": [{"name": "a", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 82, "col_offset": 8}, {"name": "b", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 82, "col_offset": 14}, {"name": "a", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 83, "col_offset": 8}, {"name": "b", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 83, "col_offset": 13}, {"name": "c", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 84, "col_offset": 11}, {"name": "d", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 84, "col_offset": 14}], "callables": {}, "types": {}, "local_variables": [{"name": "c", "initializer": "a and b", "scope": "function", "start_line": 82, "end_line": 82, "start_column": 4, "end_column": 5}, {"name": "d", "initializer": "a or b", "scope": "function", "start_line": 83, "end_line": 83, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 4, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/short_circuit(a,b)@entry", "arguments": []}, "82:4": {"kind": "statement", "id": "can://dataflow/python/main.py/short_circuit(a,b)@82:4", "span": {"start": [82, 4], "end": [82, 15], "bytes": [1206, 1217]}, "arguments": []}, "83:4": {"kind": "statement", "id": "can://dataflow/python/main.py/short_circuit(a,b)@83:4", "span": {"start": [83, 4], "end": [83, 14], "bytes": [1222, 1232]}, "arguments": []}, "84:4": {"kind": "return", "id": "can://dataflow/python/main.py/short_circuit(a,b)@84:4", "span": {"start": [84, 4], "end": [84, 15], "bytes": [1237, 1248]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/short_circuit(a,b)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:0", "of": "a", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:1", "of": "b", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "82:4", "kind": "fallthrough"}, {"src": "82:4", "dst": "83:4", "kind": "fallthrough"}, {"src": "83:4", "dst": "84:4", "kind": "fallthrough"}, {"src": "84:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "82:4"}, {"src": "@entry", "dst": "83:4"}, {"src": "@entry", "dst": "84:4"}], "ddg": [{"src": "@entry", "dst": "82:4", "var": "a", "prov": ["ssa"]}, {"src": "@entry", "dst": "82:4", "var": "b", "prov": ["ssa"]}, {"src": "@entry", "dst": "83:4", "var": "a", "prov": ["ssa"]}, {"src": "@entry", "dst": "83:4", "var": "b", "prov": ["ssa"]}, {"src": "82:4", "dst": "84:4", "var": "c", "prov": ["ssa"]}, {"src": "83:4", "dst": "84:4", "var": "d", "prov": ["ssa"]}, {"src": "84:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "82:4", "var": "a", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "83:4", "var": "a", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "82:4", "var": "b", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "83:4", "var": "b", "prov": ["reaching-defs"]}], "summary": []}, "infinite": {"name": "infinite", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.infinite", "id": "can://dataflow/python/main.py/infinite()", "kind": "function", "span": {"start": [87, 0], "end": [89, 12], "bytes": [1251, 1295]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 87, "end_line": 89, "code_start_line": 88, "accessed_symbols": [], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/infinite()@entry", "arguments": []}, "88:10": {"kind": "loop", "id": "can://dataflow/python/main.py/infinite()@88:10", "span": {"start": [88, 10], "end": [88, 14], "bytes": [1277, 1281]}, "arguments": []}, "89:8": {"kind": "statement", "id": "can://dataflow/python/main.py/infinite()@89:8", "span": {"start": [89, 8], "end": [89, 12], "bytes": [1291, 1295]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/infinite()@exit", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/infinite()@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "88:10", "kind": "fallthrough"}, {"src": "88:10", "dst": "89:8", "kind": "true"}, {"src": "88:10", "dst": "@exit", "kind": "exception"}, {"src": "89:8", "dst": "88:10", "kind": "loop_back"}], "cdg": [{"src": "@entry", "dst": "88:10"}, {"src": "88:10", "dst": "89:8"}], "ddg": [], "summary": []}, "drive": {"name": "drive", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.drive", "id": "can://dataflow/python/main.py/drive(n)", "kind": "function", "span": {"start": [92, 0], "end": [95, 25], "bytes": [1298, 1368]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/drive(n)@formal_in:0", "decorators": [], "start_line": 92, "end_line": 92, "start_column": 10, "end_column": 11}], "start_line": 92, "end_line": 95, "code_start_line": 93, "accessed_symbols": [{"name": "chain_a", "scope": "local", "kind": "function", "type": "chain_a", "qualified_name": "pipeline.chain_a", "is_builtin": false, "lineno": 93, "col_offset": 8}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 93, "col_offset": 16}, {"name": "bump", "scope": "local", "kind": "function", "type": "bump", "qualified_name": "state.bump", "is_builtin": false, "lineno": 94, "col_offset": 4}, {"name": "r", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 94, "col_offset": 9}, {"name": "read_counter", "scope": "local", "kind": "function", "type": "read_counter", "qualified_name": "state.read_counter", "is_builtin": false, "lineno": 95, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "r", "type": "int", "initializer": "chain_a(n)", "scope": "function", "start_line": 93, "end_line": 93, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"93:8": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@93:8", "span": {"start": [93, 8], "end": [93, 18], "bytes": [1320, 1330]}, "callee": "can://dataflow/python/pipeline.py/chain_a(v)", "parent": "93:4", "method_name": "chain_a", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "94:4": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@94:4", "span": {"start": [94, 4], "end": [94, 11], "bytes": [1335, 1342]}, "callee": "can://dataflow/python/state.py/bump(amount)", "method_name": "bump", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "int", "name": "r"}]}, "95:11": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@95:11", "span": {"start": [95, 11], "end": [95, 25], "bytes": [1354, 1368]}, "callee": "can://dataflow/python/state.py/read_counter()", "parent": "95:4", "method_name": "read_counter", "return_type": "int", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/drive(n)@entry", "arguments": []}, "93:4": {"kind": "statement", "id": "can://dataflow/python/main.py/drive(n)@93:4", "span": {"start": [93, 4], "end": [93, 18], "bytes": [1316, 1330]}, "arguments": []}, "95:4": {"kind": "return", "id": "can://dataflow/python/main.py/drive(n)@95:4", "span": {"start": [95, 4], "end": [95, 25], "bytes": [1347, 1368]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/drive(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:1", "of": ":main::bump", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:2", "of": ":main::chain_a", "arguments": []}, "@formal_in:3": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:3", "of": ":main::read_counter", "arguments": []}, "@formal_in:4": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:4", "of": ":pipeline::chain_b", "arguments": []}, "@formal_in:5": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:5", "of": ":pipeline::chain_c", "arguments": []}, "@formal_in:6": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:6", "of": ":state::counter", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:1", "of": "n", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:2", "of": ":state::counter", "arguments": []}, "93:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:0", "of": "v", "parent": "93:4", "arguments": []}, "93:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:1", "of": ":pipeline::chain_b", "parent": "93:4", "arguments": []}, "93:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:2", "of": ":pipeline::chain_c", "parent": "93:4", "arguments": []}, "93:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_out", "of": "", "parent": "93:4", "arguments": []}, "94:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:0", "of": "amount", "parent": "94:4", "arguments": []}, "94:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:1", "of": ":state::counter", "parent": "94:4", "arguments": []}, "94:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:0", "of": "", "parent": "94:4", "arguments": []}, "94:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:1", "of": ":state::counter", "parent": "94:4", "arguments": []}, "95:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@95:4/actual_in:0", "of": ":state::counter", "parent": "95:4", "arguments": []}, "95:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@95:4/actual_out", "of": "", "parent": "95:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "93:4", "kind": "fallthrough"}, {"src": "93:4", "dst": "94:4", "kind": "fallthrough"}, {"src": "93:4", "dst": "@exit", "kind": "exception"}, {"src": "94:4", "dst": "95:4", "kind": "fallthrough"}, {"src": "94:4", "dst": "@exit", "kind": "exception"}, {"src": "95:4", "dst": "@exit", "kind": "exception"}, {"src": "95:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "93:4"}, {"src": "93:4", "dst": "94:4"}, {"src": "94:4", "dst": "95:4"}], "ddg": [{"src": "@entry", "dst": "93:4", "var": "main::chain_a", "prov": ["ssa"]}, {"src": "@entry", "dst": "93:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "94:4", "var": "main::bump", "prov": ["ssa"]}, {"src": "@entry", "dst": "95:4", "var": "main::read_counter", "prov": ["ssa"]}, {"src": "93:4", "dst": "94:4", "var": "r", "prov": ["ssa"]}, {"src": "93:4", "dst": "94:4/actual_in:0", "var": "r", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "94:4/actual_in:1", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "95:4/actual_in:0", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "93:4/actual_out", "dst": "93:4", "var": "", "prov": ["reaching-defs"]}, {"src": "94:4", "dst": "95:4/actual_in:0", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "94:4", "dst": "@formal_out:2", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "94:4/actual_out:0", "dst": "94:4", "var": "", "prov": ["reaching-defs"]}, {"src": "94:4/actual_out:1", "dst": "94:4", "var": ":state::counter", "prov": ["reaching-defs"]}, {"src": "95:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "95:4/actual_out", "dst": "95:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "93:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "93:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "94:4", "var": "main::bump", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "93:4", "var": "main::chain_a", "prov": ["reaching-defs"]}, {"src": "@formal_in:3", "dst": "95:4", "var": "main::read_counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "94:4", "var": "main::bump", "prov": ["points-to"]}, {"src": "93:4", "dst": "95:4", "var": "main::read_counter", "prov": ["points-to"]}, {"src": "94:4", "dst": "95:4", "var": "main::read_counter", "prov": ["points-to"]}], "summary": [{"src": "93:4/actual_in:0", "dst": "93:4/actual_out"}, {"src": "93:4/actual_in:1", "dst": "93:4/actual_out"}, {"src": "94:4/actual_in:0", "dst": "94:4/actual_out:1"}, {"src": "94:4/actual_in:1", "dst": "94:4/actual_out:1"}, {"src": "95:4/actual_in:0", "dst": "95:4/actual_out"}]}}, "variables": [], "content_hash": "97a98d89de2934a3283e7250fa9f75541406ca4dec26f373cfc6162c1eedb345", "last_modified": 1787161494.1287842, "file_size": 1369}, "state.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "module_name": "state", "id": "can://dataflow/python/state.py", "kind": "module", "source": "\"\"\"Module-global fixture: written in one function, read in another.\"\"\"\n\ncounter = 0\n\n\ndef bump(amount):\n global counter\n counter = counter + amount\n\n\ndef read_counter():\n return counter\n", "imports": [], "comments": [{"content": "Module-global fixture: written in one function, read in another.", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 70, "is_docstring": true}], "types": {}, "functions": {"bump": {"name": "bump", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "signature": "state.bump", "id": "can://dataflow/python/state.py/bump(amount)", "kind": "function", "span": {"start": [6, 0], "end": [8, 30], "bytes": [86, 153]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "amount", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "type": "int", "decorators": [], "start_line": 6, "end_line": 6, "start_column": 9, "end_column": 15}], "start_line": 6, "end_line": 8, "code_start_line": 7, "accessed_symbols": [{"name": "counter", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 8, "col_offset": 14}, {"name": "amount", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 8, "col_offset": 24}], "callables": {}, "types": {}, "local_variables": [{"name": "counter", "type": "int", "initializer": "counter + amount", "scope": "function", "start_line": 8, "end_line": 8, "start_column": 4, "end_column": 11}], "cyclomatic_complexity": 1, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/state.py/bump(amount)@entry", "arguments": []}, "7:4": {"kind": "statement", "id": "can://dataflow/python/state.py/bump(amount)@7:4", "span": {"start": [7, 4], "end": [7, 18], "bytes": [108, 122]}, "arguments": []}, "8:4": {"kind": "statement", "id": "can://dataflow/python/state.py/bump(amount)@8:4", "span": {"start": [8, 4], "end": [8, 30], "bytes": [127, 153]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/state.py/bump(amount)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "of": "amount", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:1", "of": ":state::counter", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/state.py/bump(amount)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/state.py/bump(amount)@formal_out:1", "of": ":state::counter", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "7:4", "kind": "fallthrough"}, {"src": "7:4", "dst": "8:4", "kind": "fallthrough"}, {"src": "8:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "7:4"}, {"src": "@entry", "dst": "8:4"}], "ddg": [{"src": "@entry", "dst": "8:4", "var": "amount", "prov": ["ssa"]}, {"src": "@entry", "dst": "8:4", "var": "state::counter", "prov": ["ssa"]}, {"src": "8:4", "dst": "@formal_out:1", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "8:4", "var": "amount", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "8:4", "var": "state::counter", "prov": ["reaching-defs"]}], "summary": []}, "read_counter": {"name": "read_counter", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "signature": "state.read_counter", "id": "can://dataflow/python/state.py/read_counter()", "kind": "function", "span": {"start": [11, 0], "end": [12, 18], "bytes": [156, 194]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 11, "end_line": 12, "code_start_line": 12, "accessed_symbols": [{"name": "counter", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 12, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/state.py/read_counter()@entry", "arguments": []}, "12:4": {"kind": "return", "id": "can://dataflow/python/state.py/read_counter()@12:4", "span": {"start": [12, 4], "end": [12, 18], "bytes": [180, 194]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/state.py/read_counter()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/state.py/read_counter()@formal_in:0", "of": ":state::counter", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/state.py/read_counter()@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "12:4", "kind": "fallthrough"}, {"src": "12:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "12:4"}], "ddg": [{"src": "@entry", "dst": "12:4", "var": "state::counter", "prov": ["ssa"]}, {"src": "12:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "12:4", "var": "state::counter", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [{"name": "counter", "type": "int", "initializer": "0", "scope": "module", "start_line": 3, "end_line": 3, "start_column": 0, "end_column": 7}], "content_hash": "ed5faf88840cf6524a85cf636eb740c739de3f3ad7af8e2f8e0b7d56cdc16178", "last_modified": 1787161494.1292224, "file_size": 195}}, "id": "can://dataflow", "kind": "application", "call_graph": [{"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/pipeline.py/chain_a(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/state.py/bump(amount)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/state.py/read_counter()", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/fetch(x)", "dst": "can://dataflow/python/main.py/slow(x)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/handles(n)", "dst": "can://dataflow/python/main.py/risky(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/risky(n)", "dst": "can://dataflow/@external/builtins.ValueError/__init__", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/with_block(path)", "dst": "can://dataflow/@external/builtins._TextIOBase/read", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/with_block(path)", "dst": "can://dataflow/@external/builtins/open", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/alias_flow()", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/alias_flow()", "dst": "can://dataflow/python/pipeline.py/Box/get(self)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/caller_of_mutate()", "dst": "can://dataflow/python/pipeline.py/mutate(items)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)", "dst": "can://dataflow/python/pipeline.py/chain_b(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)", "dst": "can://dataflow/python/pipeline.py/chain_c(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/even(n)", "dst": "can://dataflow/python/pipeline.py/odd(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/mutate(items)", "dst": "can://dataflow/@external/builtins.list/append", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/odd(n)", "dst": "can://dataflow/python/pipeline.py/even(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)", "dst": "can://dataflow/python/pipeline.py/make_adder(base)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://dataflow/@external/builtins.ValueError/__init__": {"id": "can://dataflow/@external/builtins.ValueError/__init__", "kind": "external", "name": "__init__", "module": "builtins.ValueError"}, "can://dataflow/@external/builtins._TextIOBase/read": {"id": "can://dataflow/@external/builtins._TextIOBase/read", "kind": "external", "name": "read", "module": "builtins._TextIOBase"}, "can://dataflow/@external/builtins/open": {"id": "can://dataflow/@external/builtins/open", "kind": "external", "name": "open", "module": "builtins"}, "can://dataflow/@external/builtins.list/append": {"id": "can://dataflow/@external/builtins.list/append", "kind": "external", "name": "append", "module": "builtins.list"}}, "artifacts": {}, "dependencies": [], "unresolved_imports": [], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "de9c2bac5ceb369876ab106ae52831b510e445a1", "dirty": false}, "param_in": [{"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:1", "var": ":pipeline::chain_b"}, {"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:2", "var": ":pipeline::chain_c"}, {"src": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:0", "dst": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "var": "amount"}, {"src": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:1", "dst": "can://dataflow/python/state.py/bump(amount)@formal_in:1", "var": ":state::counter"}, {"src": "can://dataflow/python/main.py/drive(n)@95:4/actual_in:0", "dst": "can://dataflow/python/state.py/read_counter()@formal_in:0", "var": ":state::counter"}, {"src": "can://dataflow/python/main.py/fetch(x)@77:4/actual_in:0", "dst": "can://dataflow/python/main.py/slow(x)@formal_in:0", "var": "x"}, {"src": "can://dataflow/python/main.py/handles(n)@43:8/actual_in:0", "dst": "can://dataflow/python/main.py/risky(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "var": "value"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "var": "items"}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:1", "var": ":pipeline::chain_c"}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:1", "var": ":pipeline::even"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:2", "var": ":pipeline::odd"}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)@44:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:1", "var": ":base"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:1", "var": ":pipeline::even"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:2", "var": ":pipeline::odd"}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "var": "base"}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "var": "x"}], "param_out": [{"src": "can://dataflow/python/main.py/risky(n)@formal_out", "dst": "can://dataflow/python/main.py/handles(n)@43:8/actual_out", "var": ""}, {"src": "can://dataflow/python/main.py/slow(x)@formal_out", "dst": "can://dataflow/python/main.py/fetch(x)@77:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:0", "dst": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:1", "dst": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:1", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/Box/get(self)@formal_out", "dst": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@formal_out", "dst": "can://dataflow/python/main.py/drive(n)@93:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)@formal_out", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_c(v)@formal_out", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/even(n)@formal_out", "dst": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)@formal_out", "dst": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_out", "dst": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:0", "dst": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:1", "dst": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:1", "var": "items"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@formal_out", "dst": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_out", "var": ""}, {"src": "can://dataflow/python/state.py/bump(amount)@formal_out:0", "dst": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/state.py/bump(amount)@formal_out:1", "dst": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:1", "var": ":state::counter"}, {"src": "can://dataflow/python/state.py/read_counter()@formal_out", "dst": "can://dataflow/python/main.py/drive(n)@95:4/actual_out", "var": ""}], "config_uses": [], "config_reads_unresolved": []}} \ No newline at end of file +{"schema_version": "2.0.0", "language": "python", "max_level": 4, "k_limit": 3, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.4", "config": {"analysis_level": 4}}, "application": {"symbol_table": {"pipeline.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "module_name": "pipeline", "id": "can://dataflow/python/pipeline.py", "kind": "module", "source": "\"\"\"Interprocedural fixture: call chain, mutual recursion, aliasing, closures.\"\"\"\n\n\ndef chain_a(v):\n return chain_b(v + 1)\n\n\ndef chain_b(v):\n return chain_c(v * 2)\n\n\ndef chain_c(v):\n return v - 3\n\n\ndef even(n):\n if n == 0:\n return True\n return odd(n - 1)\n\n\ndef odd(n):\n if n == 0:\n return False\n return even(n - 1)\n\n\nclass Box:\n def __init__(self, value):\n self.value = value\n\n def get(self):\n return self.value\n\n\ndef alias_flow():\n p = Box(10)\n q = p\n q.value = 42\n return p.get()\n\n\ndef make_adder(base):\n def add(x):\n return x + base\n return add\n\n\ndef use_adder(n):\n add5 = make_adder(5)\n return add5(n)\n\n\ndef mutate(items):\n items.append(1)\n\n\ndef caller_of_mutate():\n xs = []\n mutate(xs)\n return xs\n", "imports": [], "comments": [{"content": "Interprocedural fixture: call chain, mutual recursion, aliasing, closures.", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 80, "is_docstring": true}], "types": {"pipeline.Box": {"name": "Box", "signature": "pipeline.Box", "id": "can://dataflow/python/pipeline.py/Box", "kind": "class", "span": {"start": [28, 0], "end": [33, 25], "bytes": [351, 465]}, "comments": [], "base_classes": [], "decorators": [], "entrypoints": [], "is_entrypoint": false, "callables": {"__init__": {"name": "__init__", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.Box.__init__", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "kind": "function", "span": {"start": [29, 4], "end": [30, 26], "bytes": [366, 419]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "self", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "type": "Box", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 17, "end_column": 21}, {"name": "value", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "type": "int", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 23, "end_column": 28}], "start_line": 29, "end_line": 30, "code_start_line": 30, "accessed_symbols": [{"name": "value", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 30, "col_offset": 21}, {"name": "self", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 30, "col_offset": 8}], "callables": {}, "types": {}, "local_variables": [{"name": "value", "type": "Box", "initializer": "value", "scope": "class", "start_line": 30, "end_line": 30, "start_column": 8, "end_column": 18}], "cyclomatic_complexity": 1, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@entry", "arguments": []}, "30:8": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@30:8", "span": {"start": [30, 8], "end": [30, 26], "bytes": [401, 419]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "of": "self", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "of": "value", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:1", "of": "self", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "30:8", "kind": "fallthrough"}, {"src": "30:8", "dst": "@exit", "kind": "exception"}, {"src": "30:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "30:8"}], "ddg": [{"src": "@entry", "dst": "30:8", "var": "self", "prov": ["ssa"]}, {"src": "@entry", "dst": "30:8", "var": "value", "prov": ["ssa"]}, {"src": "30:8", "dst": "@formal_out:1", "var": "self.value", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "30:8", "var": "self", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "30:8", "var": "value", "prov": ["reaching-defs"]}], "summary": []}, "get": {"name": "get", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.Box.get", "id": "can://dataflow/python/pipeline.py/Box/get(self)", "kind": "function", "span": {"start": [32, 4], "end": [33, 25], "bytes": [425, 465]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "self", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "type": "Box", "decorators": [], "start_line": 32, "end_line": 32, "start_column": 12, "end_column": 16}], "start_line": 32, "end_line": 33, "code_start_line": 33, "accessed_symbols": [{"name": "self", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 33, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/Box/get(self)@entry", "arguments": []}, "33:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/Box/get(self)@33:8", "span": {"start": [33, 8], "end": [33, 25], "bytes": [448, 465]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/Box/get(self)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "of": "self", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/Box/get(self)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "33:8", "kind": "fallthrough"}, {"src": "33:8", "dst": "@exit", "kind": "exception"}, {"src": "33:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "33:8"}], "ddg": [{"src": "@entry", "dst": "33:8", "var": "self.value", "prov": ["ssa"]}, {"src": "33:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "33:8", "var": "self.value", "prov": ["reaching-defs"]}], "summary": []}}, "attributes": {}, "types": {}, "start_line": 28, "end_line": 33}}, "functions": {"chain_a": {"name": "chain_a", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_a", "id": "can://dataflow/python/pipeline.py/chain_a(v)", "kind": "function", "span": {"start": [4, 0], "end": [5, 25], "bytes": [83, 124]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "decorators": [], "start_line": 4, "end_line": 4, "start_column": 12, "end_column": 13}], "start_line": 4, "end_line": 5, "code_start_line": 5, "accessed_symbols": [{"name": "chain_b", "scope": "local", "kind": "function", "type": "chain_b", "qualified_name": "pipeline.chain_b", "is_builtin": false, "lineno": 5, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 5, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"5:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:11", "span": {"start": [5, 11], "end": [5, 25], "bytes": [110, 124]}, "callee": "can://dataflow/python/pipeline.py/chain_b(v)", "parent": "5:4", "method_name": "chain_b", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_a(v)@entry", "arguments": []}, "5:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4", "span": {"start": [5, 4], "end": [5, 25], "bytes": [103, 124]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_a(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:1", "of": ":pipeline::chain_b", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:2", "of": ":pipeline::chain_c", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_a(v)@formal_out", "of": "", "arguments": []}, "5:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:0", "of": "v", "parent": "5:4", "arguments": []}, "5:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:1", "of": ":pipeline::chain_c", "parent": "5:4", "arguments": []}, "5:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_out", "of": "", "parent": "5:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "5:4", "kind": "fallthrough"}, {"src": "5:4", "dst": "@exit", "kind": "exception"}, {"src": "5:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "5:4"}], "ddg": [{"src": "@entry", "dst": "5:4", "var": "pipeline::chain_b", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "v", "prov": ["ssa"]}, {"src": "5:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "5:4/actual_out", "dst": "5:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "5:4", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "5:4/actual_in:0", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "pipeline::chain_b", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4/actual_in:0", "var": "pipeline::chain_b", "prov": ["reaching-defs"]}], "summary": [{"src": "5:4/actual_in:0", "dst": "5:4/actual_out"}, {"src": "5:4/actual_in:1", "dst": "5:4/actual_out"}]}, "chain_b": {"name": "chain_b", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_b", "id": "can://dataflow/python/pipeline.py/chain_b(v)", "kind": "function", "span": {"start": [8, 0], "end": [9, 25], "bytes": [127, 168]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "type": "int", "decorators": [], "start_line": 8, "end_line": 8, "start_column": 12, "end_column": 13}], "start_line": 8, "end_line": 9, "code_start_line": 9, "accessed_symbols": [{"name": "chain_c", "scope": "local", "kind": "function", "type": "chain_c", "qualified_name": "pipeline.chain_c", "is_builtin": false, "lineno": 9, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 9, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"9:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:11", "span": {"start": [9, 11], "end": [9, 25], "bytes": [154, 168]}, "callee": "can://dataflow/python/pipeline.py/chain_c(v)", "parent": "9:4", "method_name": "chain_c", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp", "inferred_type": "int"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_b(v)@entry", "arguments": []}, "9:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4", "span": {"start": [9, 4], "end": [9, 25], "bytes": [147, 168]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_b(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:1", "of": ":pipeline::chain_c", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_b(v)@formal_out", "of": "", "arguments": []}, "9:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_in:0", "of": "v", "parent": "9:4", "arguments": []}, "9:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_out", "of": "", "parent": "9:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "9:4", "kind": "fallthrough"}, {"src": "9:4", "dst": "@exit", "kind": "exception"}, {"src": "9:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "9:4"}], "ddg": [{"src": "@entry", "dst": "9:4", "var": "pipeline::chain_c", "prov": ["ssa"]}, {"src": "@entry", "dst": "9:4", "var": "v", "prov": ["ssa"]}, {"src": "9:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "9:4/actual_out", "dst": "9:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "9:4", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "9:4/actual_in:0", "var": "v", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "9:4", "var": "pipeline::chain_c", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "9:4/actual_in:0", "var": "pipeline::chain_c", "prov": ["reaching-defs"]}], "summary": [{"src": "9:4/actual_in:0", "dst": "9:4/actual_out"}]}, "chain_c": {"name": "chain_c", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.chain_c", "id": "can://dataflow/python/pipeline.py/chain_c(v)", "kind": "function", "span": {"start": [12, 0], "end": [13, 16], "bytes": [171, 203]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "v", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "type": "int", "decorators": [], "start_line": 12, "end_line": 12, "start_column": 12, "end_column": 13}], "start_line": 12, "end_line": 13, "code_start_line": 13, "accessed_symbols": [{"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 13, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/chain_c(v)@entry", "arguments": []}, "13:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/chain_c(v)@13:4", "span": {"start": [13, 4], "end": [13, 16], "bytes": [191, 203]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/chain_c(v)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "of": "v", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/chain_c(v)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "13:4", "kind": "fallthrough"}, {"src": "13:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "13:4"}], "ddg": [{"src": "@entry", "dst": "13:4", "var": "v", "prov": ["ssa"]}, {"src": "13:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "13:4", "var": "v", "prov": ["reaching-defs"]}], "summary": []}, "even": {"name": "even", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.even", "id": "can://dataflow/python/pipeline.py/even(n)", "kind": "function", "span": {"start": [16, 0], "end": [19, 21], "bytes": [206, 275]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "type": "int", "decorators": [], "start_line": 16, "end_line": 16, "start_column": 9, "end_column": 10}], "start_line": 16, "end_line": 19, "code_start_line": 17, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 17, "col_offset": 7}, {"name": "odd", "scope": "local", "kind": "function", "type": "odd", "qualified_name": "pipeline.odd", "is_builtin": false, "lineno": 19, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 19, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 4, "body": {"19:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/even(n)@19:11", "span": {"start": [19, 11], "end": [19, 21], "bytes": [265, 275]}, "callee": "can://dataflow/python/pipeline.py/odd(n)", "parent": "19:4", "method_name": "odd", "return_type": "bool", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/even(n)@entry", "arguments": []}, "17:7": {"kind": "branch", "id": "can://dataflow/python/pipeline.py/even(n)@17:7", "span": {"start": [17, 7], "end": [17, 13], "bytes": [226, 232]}, "arguments": []}, "18:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/even(n)@18:8", "span": {"start": [18, 8], "end": [18, 19], "bytes": [242, 253]}, "arguments": []}, "19:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/even(n)@19:4", "span": {"start": [19, 4], "end": [19, 21], "bytes": [258, 275]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/even(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:1", "of": ":pipeline::even", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/even(n)@formal_in:2", "of": ":pipeline::odd", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/even(n)@formal_out", "of": "", "arguments": []}, "19:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:0", "of": "n", "parent": "19:4", "arguments": []}, "19:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:1", "of": ":pipeline::even", "parent": "19:4", "arguments": []}, "19:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:2", "of": ":pipeline::odd", "parent": "19:4", "arguments": []}, "19:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_out", "of": "", "parent": "19:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "17:7", "kind": "fallthrough"}, {"src": "17:7", "dst": "18:8", "kind": "true"}, {"src": "17:7", "dst": "19:4", "kind": "false"}, {"src": "18:8", "dst": "@exit", "kind": "return"}, {"src": "19:4", "dst": "@exit", "kind": "exception"}, {"src": "19:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "17:7"}, {"src": "17:7", "dst": "18:8"}, {"src": "17:7", "dst": "19:4"}], "ddg": [{"src": "@entry", "dst": "17:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "19:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "19:4", "var": "pipeline::odd", "prov": ["ssa"]}, {"src": "18:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "19:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "19:4/actual_out", "dst": "19:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "17:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "19:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "19:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "19:4", "var": "pipeline::odd", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "19:4/actual_in:0", "var": "pipeline::odd", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "19:4/actual_in:2", "var": "pipeline::odd", "prov": ["reaching-defs"]}], "summary": [{"src": "19:4/actual_in:0", "dst": "19:4/actual_out"}, {"src": "19:4/actual_in:1", "dst": "19:4/actual_out"}]}, "odd": {"name": "odd", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.odd", "id": "can://dataflow/python/pipeline.py/odd(n)", "kind": "function", "span": {"start": [22, 0], "end": [25, 22], "bytes": [278, 348]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "type": "int", "decorators": [], "start_line": 22, "end_line": 22, "start_column": 8, "end_column": 9}], "start_line": 22, "end_line": 25, "code_start_line": 23, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 7}, {"name": "even", "scope": "local", "kind": "function", "type": "even", "qualified_name": "pipeline.even", "is_builtin": false, "lineno": 25, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 25, "col_offset": 16}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 4, "body": {"25:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/odd(n)@25:11", "span": {"start": [25, 11], "end": [25, 22], "bytes": [337, 348]}, "callee": "can://dataflow/python/pipeline.py/even(n)", "parent": "25:4", "method_name": "even", "return_type": "bool", "is_constructor_call": false, "arguments": [{"ast_kind": "BinOp", "inferred_type": "int"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/odd(n)@entry", "arguments": []}, "23:7": {"kind": "branch", "id": "can://dataflow/python/pipeline.py/odd(n)@23:7", "span": {"start": [23, 7], "end": [23, 13], "bytes": [297, 303]}, "arguments": []}, "24:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/odd(n)@24:8", "span": {"start": [24, 8], "end": [24, 20], "bytes": [313, 325]}, "arguments": []}, "25:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4", "span": {"start": [25, 4], "end": [25, 22], "bytes": [330, 348]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/odd(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:1", "of": ":pipeline::even", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_in:2", "of": ":pipeline::odd", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/odd(n)@formal_out", "of": "", "arguments": []}, "25:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:0", "of": "n", "parent": "25:4", "arguments": []}, "25:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:1", "of": ":pipeline::even", "parent": "25:4", "arguments": []}, "25:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:2", "of": ":pipeline::odd", "parent": "25:4", "arguments": []}, "25:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_out", "of": "", "parent": "25:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "23:7", "kind": "fallthrough"}, {"src": "23:7", "dst": "24:8", "kind": "true"}, {"src": "23:7", "dst": "25:4", "kind": "false"}, {"src": "24:8", "dst": "@exit", "kind": "return"}, {"src": "25:4", "dst": "@exit", "kind": "exception"}, {"src": "25:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "23:7"}, {"src": "23:7", "dst": "24:8"}, {"src": "23:7", "dst": "25:4"}], "ddg": [{"src": "@entry", "dst": "23:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "25:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "25:4", "var": "pipeline::even", "prov": ["ssa"]}, {"src": "24:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "25:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "25:4/actual_out", "dst": "25:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "23:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "25:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "25:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "25:4", "var": "pipeline::even", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "25:4/actual_in:0", "var": "pipeline::even", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "25:4/actual_in:1", "var": "pipeline::even", "prov": ["reaching-defs"]}], "summary": [{"src": "25:4/actual_in:0", "dst": "25:4/actual_out"}, {"src": "25:4/actual_in:2", "dst": "25:4/actual_out"}]}, "alias_flow": {"name": "alias_flow", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.alias_flow", "id": "can://dataflow/python/pipeline.py/alias_flow()", "kind": "function", "span": {"start": [36, 0], "end": [40, 18], "bytes": [468, 547]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 36, "end_line": 40, "code_start_line": 37, "accessed_symbols": [{"name": "p", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 38, "col_offset": 8}, {"name": "Box", "scope": "local", "kind": "class", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 37, "col_offset": 8}, {"name": "q", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 39, "col_offset": 4}, {"name": "p", "scope": "local", "kind": "variable", "type": "Box", "qualified_name": "pipeline.Box", "is_builtin": false, "lineno": 40, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "p", "type": "Box", "initializer": "Box(10)", "scope": "function", "start_line": 37, "end_line": 37, "start_column": 4, "end_column": 5}, {"name": "q", "type": "Box", "initializer": "p", "scope": "function", "start_line": 38, "end_line": 38, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"37:8": {"kind": "call", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:8", "span": {"start": [37, 8], "end": [37, 15], "bytes": [494, 501]}, "callee": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "parent": "37:4", "method_name": "Box", "return_type": "Box", "is_constructor_call": true, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "10"}]}, "40:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:11", "span": {"start": [40, 11], "end": [40, 18], "bytes": [540, 547]}, "callee": "can://dataflow/python/pipeline.py/Box/get(self)", "parent": "40:4", "method_name": "get", "receiver_expr": "p", "receiver_type": "Box", "return_type": "int", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/alias_flow()@entry", "arguments": []}, "37:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4", "span": {"start": [37, 4], "end": [37, 15], "bytes": [490, 501]}, "arguments": []}, "38:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@38:4", "span": {"start": [38, 4], "end": [38, 9], "bytes": [506, 511]}, "arguments": []}, "39:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/alias_flow()@39:4", "span": {"start": [39, 4], "end": [39, 16], "bytes": [516, 528]}, "arguments": []}, "40:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4", "span": {"start": [40, 4], "end": [40, 18], "bytes": [533, 547]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/alias_flow()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@formal_in:0", "of": ":pipeline::Box", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@formal_out", "of": "", "arguments": []}, "37:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:0", "of": "self", "parent": "37:4", "arguments": []}, "37:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:1", "of": "value", "parent": "37:4", "arguments": []}, "37:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:0", "of": "", "parent": "37:4", "arguments": []}, "37:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:1", "of": "self", "parent": "37:4", "arguments": []}, "40:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_in:0", "of": "self", "parent": "40:4", "arguments": []}, "40:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_out", "of": "", "parent": "40:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "37:4", "kind": "fallthrough"}, {"src": "37:4", "dst": "38:4", "kind": "fallthrough"}, {"src": "37:4", "dst": "@exit", "kind": "exception"}, {"src": "38:4", "dst": "39:4", "kind": "fallthrough"}, {"src": "39:4", "dst": "40:4", "kind": "fallthrough"}, {"src": "39:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "37:4"}, {"src": "37:4", "dst": "38:4"}, {"src": "37:4", "dst": "39:4"}, {"src": "39:4", "dst": "40:4"}], "ddg": [{"src": "@entry", "dst": "37:4", "var": "pipeline::Box", "prov": ["ssa"]}, {"src": "37:4", "dst": "38:4", "var": "p", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4", "var": "p", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4", "var": "p.get", "prov": ["ssa"]}, {"src": "38:4", "dst": "39:4", "var": "q", "prov": ["ssa"]}, {"src": "37:4", "dst": "40:4/actual_in:0", "var": "p", "prov": ["reaching-defs"]}, {"src": "37:4", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "37:4/actual_out:0", "dst": "37:4", "var": "", "prov": ["reaching-defs"]}, {"src": "37:4/actual_out:1", "dst": "37:4", "var": "self", "prov": ["reaching-defs"]}, {"src": "38:4", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "39:4", "dst": "40:4/actual_in:0", "var": "p", "prov": ["reaching-defs"]}, {"src": "40:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "40:4/actual_out", "dst": "40:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "40:4/actual_in:0", "var": "p.get", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "37:4", "var": "pipeline::Box", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "37:4/actual_in:1", "var": "pipeline::Box", "prov": ["reaching-defs"]}, {"src": "38:4", "dst": "40:4", "var": "p.get", "prov": ["points-to"]}, {"src": "39:4", "dst": "40:4", "var": "p", "prov": ["points-to"]}, {"src": "@entry", "dst": "40:4", "var": "p.get", "prov": ["points-to"]}], "summary": [{"src": "37:4/actual_in:0", "dst": "37:4/actual_out:1"}, {"src": "37:4/actual_in:1", "dst": "37:4/actual_out:1"}, {"src": "40:4/actual_in:0", "dst": "40:4/actual_out"}]}, "make_adder": {"name": "make_adder", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.make_adder", "id": "can://dataflow/python/pipeline.py/make_adder(base)", "kind": "function", "span": {"start": [43, 0], "end": [46, 14], "bytes": [550, 626]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "base", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "type": "int", "decorators": [], "start_line": 43, "end_line": 43, "start_column": 15, "end_column": 19}], "start_line": 43, "end_line": 46, "code_start_line": 44, "accessed_symbols": [{"name": "add", "scope": "local", "kind": "function", "type": "add", "is_builtin": false, "lineno": 46, "col_offset": 11}, {"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 45, "col_offset": 15}, {"name": "base", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 45, "col_offset": 19}], "callables": {"add": {"name": "add", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.make_adder.add", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "kind": "function", "span": {"start": [44, 4], "end": [45, 23], "bytes": [576, 611]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "decorators": [], "start_line": 44, "end_line": 44, "start_column": 12, "end_column": 13}], "start_line": 44, "end_line": 45, "code_start_line": 45, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 45, "col_offset": 15}, {"name": "base", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 45, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@entry", "arguments": []}, "45:8": {"kind": "return", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@45:8", "span": {"start": [45, 8], "end": [45, 23], "bytes": [596, 611]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:1", "of": ":base", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "45:8", "kind": "fallthrough"}, {"src": "45:8", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "45:8"}], "ddg": [{"src": "@entry", "dst": "45:8", "var": "base", "prov": ["ssa"]}, {"src": "@entry", "dst": "45:8", "var": "x", "prov": ["ssa"]}, {"src": "45:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "45:8", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "45:8", "var": "base", "prov": ["reaching-defs"]}], "summary": []}}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/make_adder(base)@entry", "arguments": []}, "44:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/make_adder(base)@44:4", "span": {"start": [44, 4], "end": [45, 23], "bytes": [576, 611]}, "arguments": []}, "46:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/make_adder(base)@46:4", "span": {"start": [46, 4], "end": [46, 14], "bytes": [616, 626]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/make_adder(base)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "of": "base", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/make_adder(base)@formal_out", "of": "", "arguments": []}, "44:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/make_adder(base)@44:4/actual_in:0", "of": ":base", "parent": "44:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "44:4", "kind": "fallthrough"}, {"src": "44:4", "dst": "46:4", "kind": "fallthrough"}, {"src": "46:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "44:4"}, {"src": "@entry", "dst": "46:4"}], "ddg": [{"src": "@entry", "dst": "44:4", "var": "base", "prov": ["ssa"]}, {"src": "44:4", "dst": "46:4", "var": "add", "prov": ["ssa"]}, {"src": "46:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "44:4/actual_in:0", "var": "base", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "44:4", "var": "base", "prov": ["reaching-defs"]}], "summary": []}, "use_adder": {"name": "use_adder", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.use_adder", "id": "can://dataflow/python/pipeline.py/use_adder(n)", "kind": "function", "span": {"start": [49, 0], "end": [51, 18], "bytes": [629, 690]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:0", "decorators": [], "start_line": 49, "end_line": 49, "start_column": 14, "end_column": 15}], "start_line": 49, "end_line": 51, "code_start_line": 50, "accessed_symbols": [{"name": "make_adder", "scope": "local", "kind": "function", "type": "make_adder", "qualified_name": "pipeline.make_adder", "is_builtin": false, "lineno": 50, "col_offset": 11}, {"name": "add5", "scope": "local", "kind": "function", "type": "add", "is_builtin": false, "lineno": 51, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 51, "col_offset": 16}], "callables": {}, "types": {}, "local_variables": [{"name": "add5", "type": "add", "initializer": "make_adder(5)", "scope": "function", "start_line": 50, "end_line": 50, "start_column": 4, "end_column": 8}], "cyclomatic_complexity": 2, "body": {"50:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:11", "span": {"start": [50, 11], "end": [50, 24], "bytes": [658, 671]}, "callee": "can://dataflow/python/pipeline.py/make_adder(base)", "parent": "50:4", "method_name": "make_adder", "return_type": "add", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "5"}]}, "51:11": {"kind": "call", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:11", "span": {"start": [51, 11], "end": [51, 18], "bytes": [683, 690]}, "callee": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "parent": "51:4", "method_name": "add5", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/use_adder(n)@entry", "arguments": []}, "50:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4", "span": {"start": [50, 4], "end": [50, 24], "bytes": [651, 671]}, "arguments": []}, "51:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4", "span": {"start": [51, 4], "end": [51, 18], "bytes": [676, 690]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/use_adder(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_in:1", "of": ":pipeline::make_adder", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@formal_out:1", "of": "n", "arguments": []}, "50:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_in:0", "of": "base", "parent": "50:4", "arguments": []}, "50:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_out", "of": "", "parent": "50:4", "arguments": []}, "51:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_in:0", "of": "x", "parent": "51:4", "arguments": []}, "51:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_out", "of": "", "parent": "51:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "50:4", "kind": "fallthrough"}, {"src": "50:4", "dst": "51:4", "kind": "fallthrough"}, {"src": "50:4", "dst": "@exit", "kind": "exception"}, {"src": "51:4", "dst": "@exit", "kind": "exception"}, {"src": "51:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "50:4"}, {"src": "50:4", "dst": "51:4"}], "ddg": [{"src": "@entry", "dst": "50:4", "var": "pipeline::make_adder", "prov": ["ssa"]}, {"src": "@entry", "dst": "51:4", "var": "n", "prov": ["ssa"]}, {"src": "50:4", "dst": "51:4", "var": "add5", "prov": ["ssa"]}, {"src": "50:4/actual_out", "dst": "50:4", "var": "", "prov": ["reaching-defs"]}, {"src": "51:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "51:4", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "51:4/actual_out", "dst": "51:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "51:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "51:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "50:4", "var": "pipeline::make_adder", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "50:4/actual_in:0", "var": "pipeline::make_adder", "prov": ["reaching-defs"]}], "summary": [{"src": "50:4/actual_in:0", "dst": "50:4/actual_out"}, {"src": "51:4/actual_in:0", "dst": "51:4/actual_out"}]}, "mutate": {"name": "mutate", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.mutate", "id": "can://dataflow/python/pipeline.py/mutate(items)", "kind": "function", "span": {"start": [54, 0], "end": [55, 19], "bytes": [693, 731]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "items", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "type": "list", "decorators": [], "start_line": 54, "end_line": 54, "start_column": 11, "end_column": 16}], "start_line": 54, "end_line": 55, "code_start_line": 55, "accessed_symbols": [{"name": "items", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": true, "lineno": 55, "col_offset": 4}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 1, "body": {"55:4": {"kind": "call", "id": "can://dataflow/python/pipeline.py/mutate(items)@55:4", "span": {"start": [55, 4], "end": [55, 19], "bytes": [716, 731]}, "callee": "can://dataflow/@external/builtins.list/append", "method_name": "append", "receiver_expr": "items", "receiver_type": "list", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "int", "value": "1"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/mutate(items)@entry", "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/mutate(items)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "of": "items", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:1", "of": "items", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "55:4", "kind": "fallthrough"}, {"src": "55:4", "dst": "@exit", "kind": "exception"}, {"src": "55:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "55:4"}], "ddg": [{"src": "@entry", "dst": "55:4", "var": "items", "prov": ["ssa"]}, {"src": "@entry", "dst": "55:4", "var": "items.append", "prov": ["ssa"]}, {"src": "55:4", "dst": "@formal_out:1", "var": "items.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "55:4", "var": "items", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "55:4", "var": "items.append", "prov": ["reaching-defs"]}], "summary": []}, "caller_of_mutate": {"name": "caller_of_mutate", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/pipeline.py", "signature": "pipeline.caller_of_mutate", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()", "kind": "function", "span": {"start": [58, 0], "end": [61, 13], "bytes": [734, 798]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 58, "end_line": 61, "code_start_line": 59, "accessed_symbols": [{"name": "xs", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 61, "col_offset": 11}, {"name": "mutate", "scope": "local", "kind": "function", "type": "mutate", "qualified_name": "pipeline.mutate", "is_builtin": false, "lineno": 60, "col_offset": 4}, {"name": "xs", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 60, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "xs", "type": "list", "initializer": "[]", "scope": "function", "start_line": 59, "end_line": 59, "start_column": 4, "end_column": 6}], "cyclomatic_complexity": 2, "body": {"60:4": {"kind": "call", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4", "span": {"start": [60, 4], "end": [60, 14], "bytes": [774, 784]}, "callee": "can://dataflow/python/pipeline.py/mutate(items)", "method_name": "mutate", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "list", "name": "xs"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@entry", "arguments": []}, "59:4": {"kind": "statement", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@59:4", "span": {"start": [59, 4], "end": [59, 11], "bytes": [762, 769]}, "arguments": []}, "61:4": {"kind": "return", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@61:4", "span": {"start": [61, 4], "end": [61, 13], "bytes": [789, 798]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@formal_in:0", "of": ":pipeline::mutate", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@formal_out", "of": "", "arguments": []}, "60:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_in:0", "of": "items", "parent": "60:4", "arguments": []}, "60:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:0", "of": "", "parent": "60:4", "arguments": []}, "60:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:1", "of": "items", "parent": "60:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "59:4", "kind": "fallthrough"}, {"src": "59:4", "dst": "60:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "61:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "@exit", "kind": "exception"}, {"src": "61:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "59:4"}, {"src": "@entry", "dst": "60:4"}, {"src": "60:4", "dst": "61:4"}], "ddg": [{"src": "@entry", "dst": "60:4", "var": "pipeline::mutate", "prov": ["ssa"]}, {"src": "59:4", "dst": "60:4", "var": "xs", "prov": ["ssa"]}, {"src": "59:4", "dst": "61:4", "var": "xs", "prov": ["ssa"]}, {"src": "60:4", "dst": "61:4", "var": "xs", "prov": ["ssa"]}, {"src": "59:4", "dst": "60:4/actual_in:0", "var": "xs", "prov": ["reaching-defs"]}, {"src": "60:4/actual_out:0", "dst": "60:4", "var": "", "prov": ["reaching-defs"]}, {"src": "60:4/actual_out:1", "dst": "60:4", "var": "items", "prov": ["reaching-defs"]}, {"src": "61:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "60:4", "var": "pipeline::mutate", "prov": ["reaching-defs"]}], "summary": [{"src": "60:4/actual_in:0", "dst": "60:4/actual_out:1"}]}}, "variables": [], "content_hash": "9ecfbafa73a36ed35c0625267ef7e5de9b9b949badaf6373171ad5f42acb37f4", "last_modified": 1787161494.129043, "file_size": 799}, "main.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "module_name": "main", "id": "can://dataflow/python/main.py", "kind": "module", "source": "\"\"\"Intraprocedural dataflow constructs with hand-computable graphs.\n\nEvery callable here is referenced by name in the level-3 gate tests\n(test_dataflow_*.py); keep line numbers stable when editing.\n\"\"\"\n\nfrom pipeline import chain_a\nfrom state import bump, read_counter\n\n\ndef branchy(n):\n if n > 0:\n x = n + 1\n else:\n x = -n\n return x\n\n\ndef looped(n):\n total = 0\n i = 0\n while i < n:\n total = total + i\n i = i + 1\n return total\n\n\ndef early_exit(n):\n if n < 0:\n return -1\n y = n * 2\n return y\n\n\ndef risky(n):\n if n < 0:\n raise ValueError(\"negative\")\n return n\n\n\ndef handles(n):\n try:\n v = risky(n)\n ok = 1\n except ValueError:\n v = 0\n ok = 0\n finally:\n done = True\n return v + ok\n\n\ndef with_block(path):\n with open(path) as fh:\n data = fh.read()\n return data\n\n\ndef comprehend(items):\n squares = [i * i for i in items]\n i = \"not-the-loop-var\"\n return squares, i\n\n\ndef gen(n):\n k = 0\n while k < n:\n yield k\n k = k + 1\n\n\nasync def slow(x):\n return x + 1\n\n\nasync def fetch(x):\n y = await slow(x)\n return y\n\n\ndef short_circuit(a, b):\n c = a and b\n d = a or b\n return c, d\n\n\ndef infinite():\n while True:\n pass\n\n\ndef drive(n):\n r = chain_a(n)\n bump(r)\n return read_counter()\n", "imports": [{"module": "pipeline", "name": "chain_a", "start_line": 7, "end_line": 7, "start_column": 0, "end_column": 28}, {"module": "state", "name": "bump", "start_line": 8, "end_line": 8, "start_column": 0, "end_column": 36}, {"module": "state", "name": "read_counter", "start_line": 8, "end_line": 8, "start_column": 0, "end_column": 36}], "comments": [{"content": "Intraprocedural dataflow constructs with hand-computable graphs.\n\nEvery callable here is referenced by name in the level-3 gate tests\n(test_dataflow_*.py); keep line numbers stable when editing.\n", "start_line": 1, "end_line": 5, "start_column": 0, "end_column": 3, "is_docstring": true}], "types": {}, "functions": {"branchy": {"name": "branchy", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.branchy", "id": "can://dataflow/python/main.py/branchy(n)", "kind": "function", "span": {"start": [11, 0], "end": [16, 12], "bytes": [271, 356]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/branchy(n)@formal_in:0", "decorators": [], "start_line": 11, "end_line": 11, "start_column": 12, "end_column": 13}], "start_line": 11, "end_line": 16, "code_start_line": 12, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 16, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 12, "col_offset": 7}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 13, "col_offset": 12}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 15, "col_offset": 13}], "callables": {}, "types": {}, "local_variables": [{"name": "x", "type": "int", "initializer": "n + 1", "scope": "function", "start_line": 13, "end_line": 13, "start_column": 8, "end_column": 9}, {"name": "x", "initializer": "-n", "scope": "function", "start_line": 15, "end_line": 15, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/branchy(n)@entry", "arguments": []}, "12:7": {"kind": "branch", "id": "can://dataflow/python/main.py/branchy(n)@12:7", "span": {"start": [12, 7], "end": [12, 12], "bytes": [294, 299]}, "arguments": []}, "13:8": {"kind": "statement", "id": "can://dataflow/python/main.py/branchy(n)@13:8", "span": {"start": [13, 8], "end": [13, 17], "bytes": [309, 318]}, "arguments": []}, "15:8": {"kind": "statement", "id": "can://dataflow/python/main.py/branchy(n)@15:8", "span": {"start": [15, 8], "end": [15, 14], "bytes": [337, 343]}, "arguments": []}, "16:4": {"kind": "return", "id": "can://dataflow/python/main.py/branchy(n)@16:4", "span": {"start": [16, 4], "end": [16, 12], "bytes": [348, 356]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/branchy(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/branchy(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/branchy(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "12:7", "kind": "fallthrough"}, {"src": "12:7", "dst": "13:8", "kind": "true"}, {"src": "12:7", "dst": "15:8", "kind": "false"}, {"src": "13:8", "dst": "16:4", "kind": "fallthrough"}, {"src": "15:8", "dst": "16:4", "kind": "fallthrough"}, {"src": "16:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "12:7"}, {"src": "@entry", "dst": "16:4"}, {"src": "12:7", "dst": "13:8"}, {"src": "12:7", "dst": "15:8"}], "ddg": [{"src": "@entry", "dst": "12:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "13:8", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "15:8", "var": "n", "prov": ["ssa"]}, {"src": "13:8", "dst": "16:4", "var": "x", "prov": ["ssa"]}, {"src": "15:8", "dst": "16:4", "var": "x", "prov": ["ssa"]}, {"src": "16:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "12:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "13:8", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "15:8", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "looped": {"name": "looped", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.looped", "id": "can://dataflow/python/main.py/looped(n)", "kind": "function", "span": {"start": [19, 0], "end": [25, 16], "bytes": [359, 475]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/looped(n)@formal_in:0", "decorators": [], "start_line": 19, "end_line": 19, "start_column": 11, "end_column": 12}], "start_line": 19, "end_line": 25, "code_start_line": 20, "accessed_symbols": [{"name": "total", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 25, "col_offset": 11}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 22, "col_offset": 10}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 22, "col_offset": 14}, {"name": "total", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 16}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 23, "col_offset": 24}, {"name": "i", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 24, "col_offset": 12}], "callables": {}, "types": {}, "local_variables": [{"name": "total", "type": "int", "initializer": "0", "scope": "function", "start_line": 20, "end_line": 20, "start_column": 4, "end_column": 9}, {"name": "i", "type": "int", "initializer": "0", "scope": "function", "start_line": 21, "end_line": 21, "start_column": 4, "end_column": 5}, {"name": "total", "type": "int", "initializer": "total + i", "scope": "function", "start_line": 23, "end_line": 23, "start_column": 8, "end_column": 13}, {"name": "i", "type": "int", "initializer": "i + 1", "scope": "function", "start_line": 24, "end_line": 24, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/looped(n)@entry", "arguments": []}, "20:4": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@20:4", "span": {"start": [20, 4], "end": [20, 13], "bytes": [378, 387]}, "arguments": []}, "21:4": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@21:4", "span": {"start": [21, 4], "end": [21, 9], "bytes": [392, 397]}, "arguments": []}, "22:10": {"kind": "loop", "id": "can://dataflow/python/main.py/looped(n)@22:10", "span": {"start": [22, 10], "end": [22, 15], "bytes": [408, 413]}, "arguments": []}, "23:8": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@23:8", "span": {"start": [23, 8], "end": [23, 25], "bytes": [423, 440]}, "arguments": []}, "24:8": {"kind": "statement", "id": "can://dataflow/python/main.py/looped(n)@24:8", "span": {"start": [24, 8], "end": [24, 17], "bytes": [449, 458]}, "arguments": []}, "25:4": {"kind": "return", "id": "can://dataflow/python/main.py/looped(n)@25:4", "span": {"start": [25, 4], "end": [25, 16], "bytes": [463, 475]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/looped(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/looped(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/looped(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "20:4", "kind": "fallthrough"}, {"src": "20:4", "dst": "21:4", "kind": "fallthrough"}, {"src": "21:4", "dst": "22:10", "kind": "fallthrough"}, {"src": "22:10", "dst": "23:8", "kind": "true"}, {"src": "22:10", "dst": "25:4", "kind": "false"}, {"src": "23:8", "dst": "24:8", "kind": "fallthrough"}, {"src": "24:8", "dst": "22:10", "kind": "loop_back"}, {"src": "25:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "20:4"}, {"src": "@entry", "dst": "21:4"}, {"src": "@entry", "dst": "22:10"}, {"src": "@entry", "dst": "25:4"}, {"src": "22:10", "dst": "23:8"}, {"src": "22:10", "dst": "24:8"}], "ddg": [{"src": "@entry", "dst": "22:10", "var": "n", "prov": ["ssa"]}, {"src": "20:4", "dst": "23:8", "var": "total", "prov": ["ssa"]}, {"src": "20:4", "dst": "25:4", "var": "total", "prov": ["ssa"]}, {"src": "21:4", "dst": "22:10", "var": "i", "prov": ["ssa"]}, {"src": "21:4", "dst": "23:8", "var": "i", "prov": ["ssa"]}, {"src": "21:4", "dst": "24:8", "var": "i", "prov": ["ssa"]}, {"src": "23:8", "dst": "23:8", "var": "total", "prov": ["ssa"]}, {"src": "23:8", "dst": "25:4", "var": "total", "prov": ["ssa"]}, {"src": "24:8", "dst": "22:10", "var": "i", "prov": ["ssa"]}, {"src": "24:8", "dst": "23:8", "var": "i", "prov": ["ssa"]}, {"src": "24:8", "dst": "24:8", "var": "i", "prov": ["ssa"]}, {"src": "25:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "22:10", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "early_exit": {"name": "early_exit", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.early_exit", "id": "can://dataflow/python/main.py/early_exit(n)", "kind": "function", "span": {"start": [28, 0], "end": [32, 12], "bytes": [478, 555]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/early_exit(n)@formal_in:0", "decorators": [], "start_line": 28, "end_line": 28, "start_column": 15, "end_column": 16}], "start_line": 28, "end_line": 32, "code_start_line": 29, "accessed_symbols": [{"name": "y", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 32, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 29, "col_offset": 7}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 31, "col_offset": 8}], "callables": {}, "types": {}, "local_variables": [{"name": "y", "type": "int", "initializer": "n * 2", "scope": "function", "start_line": 31, "end_line": 31, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 4, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/early_exit(n)@entry", "arguments": []}, "29:7": {"kind": "branch", "id": "can://dataflow/python/main.py/early_exit(n)@29:7", "span": {"start": [29, 7], "end": [29, 12], "bytes": [504, 509]}, "arguments": []}, "30:8": {"kind": "return", "id": "can://dataflow/python/main.py/early_exit(n)@30:8", "span": {"start": [30, 8], "end": [30, 17], "bytes": [519, 528]}, "arguments": []}, "31:4": {"kind": "statement", "id": "can://dataflow/python/main.py/early_exit(n)@31:4", "span": {"start": [31, 4], "end": [31, 13], "bytes": [533, 542]}, "arguments": []}, "32:4": {"kind": "return", "id": "can://dataflow/python/main.py/early_exit(n)@32:4", "span": {"start": [32, 4], "end": [32, 12], "bytes": [547, 555]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/early_exit(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/early_exit(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/early_exit(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "29:7", "kind": "fallthrough"}, {"src": "29:7", "dst": "30:8", "kind": "true"}, {"src": "29:7", "dst": "31:4", "kind": "false"}, {"src": "30:8", "dst": "@exit", "kind": "return"}, {"src": "31:4", "dst": "32:4", "kind": "fallthrough"}, {"src": "32:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "29:7"}, {"src": "29:7", "dst": "30:8"}, {"src": "29:7", "dst": "31:4"}, {"src": "29:7", "dst": "32:4"}], "ddg": [{"src": "@entry", "dst": "29:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "31:4", "var": "n", "prov": ["ssa"]}, {"src": "31:4", "dst": "32:4", "var": "y", "prov": ["ssa"]}, {"src": "30:8", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "32:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "29:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "31:4", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "risky": {"name": "risky", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.risky", "id": "can://dataflow/python/main.py/risky(n)", "kind": "function", "span": {"start": [35, 0], "end": [38, 12], "bytes": [558, 635]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/risky(n)@formal_in:0", "decorators": [], "start_line": 35, "end_line": 35, "start_column": 10, "end_column": 11}], "start_line": 35, "end_line": 38, "code_start_line": 36, "accessed_symbols": [{"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 38, "col_offset": 11}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 36, "col_offset": 7}, {"name": "ValueError", "scope": "local", "kind": "class", "type": "ValueError", "qualified_name": "builtins.ValueError", "is_builtin": false, "lineno": 37, "col_offset": 14}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {"37:14": {"kind": "call", "id": "can://dataflow/python/main.py/risky(n)@37:14", "span": {"start": [37, 14], "end": [37, 36], "bytes": [600, 622]}, "callee": "can://dataflow/@external/builtins.ValueError/__init__", "parent": "37:8", "method_name": "ValueError", "return_type": "ValueError", "is_constructor_call": true, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"negative\""}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/risky(n)@entry", "arguments": []}, "36:7": {"kind": "branch", "id": "can://dataflow/python/main.py/risky(n)@36:7", "span": {"start": [36, 7], "end": [36, 12], "bytes": [579, 584]}, "arguments": []}, "37:8": {"kind": "raise", "id": "can://dataflow/python/main.py/risky(n)@37:8", "span": {"start": [37, 8], "end": [37, 36], "bytes": [594, 622]}, "arguments": []}, "38:4": {"kind": "return", "id": "can://dataflow/python/main.py/risky(n)@38:4", "span": {"start": [38, 4], "end": [38, 12], "bytes": [627, 635]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/risky(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/risky(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/risky(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "36:7", "kind": "fallthrough"}, {"src": "36:7", "dst": "37:8", "kind": "true"}, {"src": "36:7", "dst": "38:4", "kind": "false"}, {"src": "37:8", "dst": "@exit", "kind": "exception"}, {"src": "38:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "36:7"}, {"src": "36:7", "dst": "37:8"}, {"src": "36:7", "dst": "38:4"}], "ddg": [{"src": "@entry", "dst": "36:7", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "37:8", "var": "ValueError", "prov": ["ssa"]}, {"src": "@entry", "dst": "38:4", "var": "n", "prov": ["ssa"]}, {"src": "38:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "36:7", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "38:4", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "handles": {"name": "handles", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.handles", "id": "can://dataflow/python/main.py/handles(n)", "kind": "function", "span": {"start": [41, 0], "end": [50, 17], "bytes": [638, 801]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/handles(n)@formal_in:0", "decorators": [], "start_line": 41, "end_line": 41, "start_column": 12, "end_column": 13}], "start_line": 41, "end_line": 50, "code_start_line": 42, "accessed_symbols": [{"name": "ValueError", "scope": "local", "kind": "class", "type": "ValueError", "qualified_name": "builtins.ValueError", "is_builtin": false, "lineno": 45, "col_offset": 11}, {"name": "v", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 50, "col_offset": 11}, {"name": "ok", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 50, "col_offset": 15}, {"name": "risky", "scope": "local", "kind": "function", "type": "risky", "qualified_name": "main.risky", "is_builtin": false, "lineno": 43, "col_offset": 12}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 43, "col_offset": 18}], "callables": {}, "types": {}, "local_variables": [{"name": "v", "initializer": "risky(n)", "scope": "function", "start_line": 43, "end_line": 43, "start_column": 8, "end_column": 9}, {"name": "ok", "type": "int", "initializer": "1", "scope": "function", "start_line": 44, "end_line": 44, "start_column": 8, "end_column": 10}, {"name": "done", "type": "bool", "initializer": "True", "scope": "function", "start_line": 49, "end_line": 49, "start_column": 8, "end_column": 12}, {"name": "v", "type": "int", "initializer": "0", "scope": "function", "start_line": 46, "end_line": 46, "start_column": 8, "end_column": 9}, {"name": "ok", "type": "int", "initializer": "0", "scope": "function", "start_line": 47, "end_line": 47, "start_column": 8, "end_column": 10}], "cyclomatic_complexity": 4, "body": {"43:12": {"kind": "call", "id": "can://dataflow/python/main.py/handles(n)@43:12", "span": {"start": [43, 12], "end": [43, 20], "bytes": [675, 683]}, "callee": "can://dataflow/python/main.py/risky(n)", "parent": "43:8", "method_name": "risky", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/handles(n)@entry", "arguments": []}, "43:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@43:8", "span": {"start": [43, 8], "end": [43, 20], "bytes": [671, 683]}, "arguments": []}, "44:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@44:8", "span": {"start": [44, 8], "end": [44, 14], "bytes": [692, 698]}, "arguments": []}, "45:4": {"kind": "handler", "id": "can://dataflow/python/main.py/handles(n)@45:4", "span": {"start": [45, 4], "end": [45, 21], "bytes": [703, 720]}, "arguments": []}, "46:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@46:8", "span": {"start": [46, 8], "end": [46, 13], "bytes": [730, 735]}, "arguments": []}, "47:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@47:8", "span": {"start": [47, 8], "end": [47, 14], "bytes": [744, 750]}, "arguments": []}, "49:8": {"kind": "statement", "id": "can://dataflow/python/main.py/handles(n)@49:8", "span": {"start": [49, 8], "end": [49, 19], "bytes": [772, 783]}, "arguments": []}, "50:4": {"kind": "return", "id": "can://dataflow/python/main.py/handles(n)@50:4", "span": {"start": [50, 4], "end": [50, 17], "bytes": [788, 801]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/handles(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/handles(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/handles(n)@formal_in:1", "of": ":main::risky", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/handles(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/handles(n)@formal_out:1", "of": "n", "arguments": []}, "43:8/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/handles(n)@43:8/actual_in:0", "of": "n", "parent": "43:8", "arguments": []}, "43:8/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/handles(n)@43:8/actual_out", "of": "", "parent": "43:8", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "43:8", "kind": "fallthrough"}, {"src": "43:8", "dst": "44:8", "kind": "fallthrough"}, {"src": "43:8", "dst": "45:4", "kind": "exception"}, {"src": "44:8", "dst": "49:8", "kind": "fallthrough"}, {"src": "45:4", "dst": "46:8", "kind": "true"}, {"src": "45:4", "dst": "49:8", "kind": "exception"}, {"src": "45:4", "dst": "@exit", "kind": "exception"}, {"src": "46:8", "dst": "47:8", "kind": "fallthrough"}, {"src": "47:8", "dst": "49:8", "kind": "fallthrough"}, {"src": "49:8", "dst": "50:4", "kind": "fallthrough"}, {"src": "49:8", "dst": "@exit", "kind": "exception"}, {"src": "50:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "43:8"}, {"src": "43:8", "dst": "44:8"}, {"src": "43:8", "dst": "45:4"}, {"src": "43:8", "dst": "49:8"}, {"src": "45:4", "dst": "46:8"}, {"src": "45:4", "dst": "47:8"}, {"src": "45:4", "dst": "49:8"}, {"src": "49:8", "dst": "50:4"}], "ddg": [{"src": "@entry", "dst": "43:8", "var": "main::risky", "prov": ["ssa"]}, {"src": "@entry", "dst": "43:8", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "45:4", "var": "ValueError", "prov": ["ssa"]}, {"src": "43:8", "dst": "50:4", "var": "v", "prov": ["ssa"]}, {"src": "44:8", "dst": "50:4", "var": "ok", "prov": ["ssa"]}, {"src": "46:8", "dst": "50:4", "var": "v", "prov": ["ssa"]}, {"src": "47:8", "dst": "50:4", "var": "ok", "prov": ["ssa"]}, {"src": "43:8", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "43:8/actual_out", "dst": "43:8", "var": "", "prov": ["reaching-defs"]}, {"src": "50:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "43:8", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "43:8/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "43:8", "var": "main::risky", "prov": ["reaching-defs"]}, {"src": "43:8", "dst": "45:4", "var": "ValueError", "prov": ["points-to"]}, {"src": "43:8", "dst": "50:4", "var": "ok", "prov": ["points-to"]}], "summary": [{"src": "43:8/actual_in:0", "dst": "43:8/actual_out"}]}, "with_block": {"name": "with_block", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.with_block", "id": "can://dataflow/python/main.py/with_block(path)", "kind": "function", "span": {"start": [53, 0], "end": [56, 15], "bytes": [804, 893]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "path", "id": "can://dataflow/python/main.py/with_block(path)@formal_in:0", "decorators": [], "start_line": 53, "end_line": 53, "start_column": 15, "end_column": 19}], "start_line": 53, "end_line": 56, "code_start_line": 54, "accessed_symbols": [{"name": "data", "scope": "local", "kind": "variable", "type": "bytes", "qualified_name": "builtins.bytes", "is_builtin": false, "lineno": 56, "col_offset": 11}, {"name": "open", "scope": "local", "kind": "function", "type": "open", "qualified_name": "builtins.open", "is_builtin": false, "lineno": 54, "col_offset": 9}, {"name": "path", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 54, "col_offset": 14}, {"name": "fh", "scope": "local", "kind": "variable", "type": "BufferedRandom", "qualified_name": "io.BufferedRandom", "is_builtin": false, "lineno": 55, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [{"name": "data", "type": "bytes", "initializer": "fh.read()", "scope": "function", "start_line": 55, "end_line": 55, "start_column": 8, "end_column": 12}], "cyclomatic_complexity": 3, "body": {"54:9": {"kind": "call", "id": "can://dataflow/python/main.py/with_block(path)@54:9", "span": {"start": [54, 9], "end": [54, 19], "bytes": [835, 845]}, "callee": "can://dataflow/@external/builtins/open", "parent": "54:4", "method_name": "open", "return_type": "BufferedRandom", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "path"}]}, "55:15": {"kind": "call", "id": "can://dataflow/python/main.py/with_block(path)@55:15", "span": {"start": [55, 15], "end": [55, 24], "bytes": [868, 877]}, "callee": "can://dataflow/@external/builtins._BufferedIOBase/read", "parent": "55:8", "method_name": "read", "receiver_expr": "fh", "receiver_type": "BufferedRandom", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/with_block(path)@entry", "arguments": []}, "54:4": {"kind": "statement", "id": "can://dataflow/python/main.py/with_block(path)@54:4", "span": {"start": [54, 4], "end": [54, 19], "bytes": [830, 845]}, "arguments": []}, "55:8": {"kind": "statement", "id": "can://dataflow/python/main.py/with_block(path)@55:8", "span": {"start": [55, 8], "end": [55, 24], "bytes": [861, 877]}, "arguments": []}, "56:4": {"kind": "return", "id": "can://dataflow/python/main.py/with_block(path)@56:4", "span": {"start": [56, 4], "end": [56, 15], "bytes": [882, 893]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/with_block(path)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/with_block(path)@formal_in:0", "of": "path", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/with_block(path)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/with_block(path)@formal_out:1", "of": "path", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "54:4", "kind": "fallthrough"}, {"src": "54:4", "dst": "55:8", "kind": "fallthrough"}, {"src": "54:4", "dst": "@exit", "kind": "exception"}, {"src": "55:8", "dst": "56:4", "kind": "fallthrough"}, {"src": "55:8", "dst": "@exit", "kind": "exception"}, {"src": "56:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "54:4"}, {"src": "54:4", "dst": "55:8"}, {"src": "55:8", "dst": "56:4"}], "ddg": [{"src": "@entry", "dst": "54:4", "var": "open", "prov": ["ssa"]}, {"src": "@entry", "dst": "54:4", "var": "path", "prov": ["ssa"]}, {"src": "54:4", "dst": "55:8", "var": "fh", "prov": ["ssa"]}, {"src": "54:4", "dst": "55:8", "var": "fh.read", "prov": ["ssa"]}, {"src": "55:8", "dst": "56:4", "var": "data", "prov": ["ssa"]}, {"src": "54:4", "dst": "@formal_out:1", "var": "path.*", "prov": ["reaching-defs"]}, {"src": "56:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "54:4", "var": "path", "prov": ["reaching-defs"]}, {"src": "54:4", "dst": "56:4", "var": "data", "prov": ["points-to"]}, {"src": "@entry", "dst": "55:8", "var": "fh.read", "prov": ["points-to"]}], "summary": []}, "comprehend": {"name": "comprehend", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.comprehend", "id": "can://dataflow/python/main.py/comprehend(items)", "kind": "function", "span": {"start": [59, 0], "end": [62, 21], "bytes": [896, 1004]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "items", "id": "can://dataflow/python/main.py/comprehend(items)@formal_in:0", "decorators": [], "start_line": 59, "end_line": 59, "start_column": 15, "end_column": 20}], "start_line": 59, "end_line": 62, "code_start_line": 60, "accessed_symbols": [{"name": "squares", "scope": "local", "kind": "variable", "type": "list", "qualified_name": "builtins.list", "is_builtin": false, "lineno": 62, "col_offset": 11}, {"name": "i", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 62, "col_offset": 20}, {"name": "i", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 60, "col_offset": 15}, {"name": "i", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 60, "col_offset": 19}, {"name": "items", "scope": "local", "kind": "variable", "is_builtin": true, "lineno": 60, "col_offset": 30}], "callables": {}, "types": {}, "local_variables": [{"name": "squares", "type": "list", "initializer": "[i * i for i in items]", "scope": "function", "start_line": 60, "end_line": 60, "start_column": 4, "end_column": 11}, {"name": "i", "type": "str", "initializer": "'not-the-loop-var'", "scope": "function", "start_line": 61, "end_line": 61, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/comprehend(items)@entry", "arguments": []}, "60:4": {"kind": "statement", "id": "can://dataflow/python/main.py/comprehend(items)@60:4", "span": {"start": [60, 4], "end": [60, 36], "bytes": [923, 955]}, "arguments": []}, "61:4": {"kind": "statement", "id": "can://dataflow/python/main.py/comprehend(items)@61:4", "span": {"start": [61, 4], "end": [61, 26], "bytes": [960, 982]}, "arguments": []}, "62:4": {"kind": "return", "id": "can://dataflow/python/main.py/comprehend(items)@62:4", "span": {"start": [62, 4], "end": [62, 21], "bytes": [987, 1004]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/comprehend(items)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/comprehend(items)@formal_in:0", "of": "items", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/comprehend(items)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "60:4", "kind": "fallthrough"}, {"src": "60:4", "dst": "61:4", "kind": "fallthrough"}, {"src": "61:4", "dst": "62:4", "kind": "fallthrough"}, {"src": "62:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "60:4"}, {"src": "@entry", "dst": "61:4"}, {"src": "@entry", "dst": "62:4"}], "ddg": [{"src": "@entry", "dst": "60:4", "var": "items", "prov": ["ssa"]}, {"src": "60:4", "dst": "62:4", "var": "squares", "prov": ["ssa"]}, {"src": "61:4", "dst": "62:4", "var": "i", "prov": ["ssa"]}, {"src": "62:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "60:4", "var": "items", "prov": ["reaching-defs"]}], "summary": []}, "gen": {"name": "gen", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.gen", "id": "can://dataflow/python/main.py/gen(n)", "kind": "function", "span": {"start": [65, 0], "end": [69, 17], "bytes": [1007, 1079]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/gen(n)@formal_in:0", "decorators": [], "start_line": 65, "end_line": 65, "start_column": 8, "end_column": 9}], "start_line": 65, "end_line": 69, "code_start_line": 66, "accessed_symbols": [{"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 67, "col_offset": 10}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 67, "col_offset": 14}, {"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 68, "col_offset": 14}, {"name": "k", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 69, "col_offset": 12}], "callables": {}, "types": {}, "local_variables": [{"name": "k", "type": "int", "initializer": "0", "scope": "function", "start_line": 66, "end_line": 66, "start_column": 4, "end_column": 5}, {"name": "k", "type": "int", "initializer": "k + 1", "scope": "function", "start_line": 69, "end_line": 69, "start_column": 8, "end_column": 9}], "cyclomatic_complexity": 3, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/gen(n)@entry", "arguments": []}, "66:4": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@66:4", "span": {"start": [66, 4], "end": [66, 9], "bytes": [1023, 1028]}, "arguments": []}, "67:10": {"kind": "loop", "id": "can://dataflow/python/main.py/gen(n)@67:10", "span": {"start": [67, 10], "end": [67, 15], "bytes": [1039, 1044]}, "arguments": []}, "68:8": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@68:8", "span": {"start": [68, 8], "end": [68, 15], "bytes": [1054, 1061]}, "arguments": []}, "69:8": {"kind": "statement", "id": "can://dataflow/python/main.py/gen(n)@69:8", "span": {"start": [69, 8], "end": [69, 17], "bytes": [1070, 1079]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/gen(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/gen(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/gen(n)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "66:4", "kind": "fallthrough"}, {"src": "66:4", "dst": "67:10", "kind": "fallthrough"}, {"src": "67:10", "dst": "68:8", "kind": "true"}, {"src": "67:10", "dst": "@exit", "kind": "return"}, {"src": "68:8", "dst": "69:8", "kind": "yield"}, {"src": "68:8", "dst": "@exit", "kind": "yield"}, {"src": "69:8", "dst": "67:10", "kind": "loop_back"}], "cdg": [{"src": "@entry", "dst": "66:4"}, {"src": "67:10", "dst": "68:8"}, {"src": "68:8", "dst": "67:10"}, {"src": "68:8", "dst": "69:8"}], "ddg": [{"src": "@entry", "dst": "67:10", "var": "n", "prov": ["ssa"]}, {"src": "66:4", "dst": "67:10", "var": "k", "prov": ["ssa"]}, {"src": "66:4", "dst": "68:8", "var": "k", "prov": ["ssa"]}, {"src": "66:4", "dst": "69:8", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "67:10", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "68:8", "var": "k", "prov": ["ssa"]}, {"src": "69:8", "dst": "69:8", "var": "k", "prov": ["ssa"]}, {"src": "@formal_in:0", "dst": "67:10", "var": "n", "prov": ["reaching-defs"]}], "summary": []}, "slow": {"name": "slow", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.slow", "id": "can://dataflow/python/main.py/slow(x)", "kind": "function", "span": {"start": [72, 0], "end": [73, 16], "bytes": [1082, 1117]}, "comments": [], "decorators": [], "modifiers": ["async"], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/main.py/slow(x)@formal_in:0", "decorators": [], "start_line": 72, "end_line": 72, "start_column": 15, "end_column": 16}], "start_line": 72, "end_line": 73, "code_start_line": 73, "accessed_symbols": [{"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 73, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/slow(x)@entry", "arguments": []}, "73:4": {"kind": "return", "id": "can://dataflow/python/main.py/slow(x)@73:4", "span": {"start": [73, 4], "end": [73, 16], "bytes": [1105, 1117]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/slow(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/slow(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/slow(x)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "73:4", "kind": "fallthrough"}, {"src": "73:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "73:4"}], "ddg": [{"src": "@entry", "dst": "73:4", "var": "x", "prov": ["ssa"]}, {"src": "73:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "73:4", "var": "x", "prov": ["reaching-defs"]}], "summary": []}, "fetch": {"name": "fetch", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.fetch", "id": "can://dataflow/python/main.py/fetch(x)", "kind": "function", "span": {"start": [76, 0], "end": [78, 12], "bytes": [1120, 1174]}, "comments": [], "decorators": [], "modifiers": ["async"], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "x", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:0", "decorators": [], "start_line": 76, "end_line": 76, "start_column": 16, "end_column": 17}], "start_line": 76, "end_line": 78, "code_start_line": 77, "accessed_symbols": [{"name": "y", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 78, "col_offset": 11}, {"name": "slow", "scope": "local", "kind": "function", "type": "slow", "qualified_name": "main.slow", "is_builtin": false, "lineno": 77, "col_offset": 14}, {"name": "x", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 77, "col_offset": 19}], "callables": {}, "types": {}, "local_variables": [{"name": "y", "type": "int", "initializer": "await slow(x)", "scope": "function", "start_line": 77, "end_line": 77, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"77:14": {"kind": "call", "id": "can://dataflow/python/main.py/fetch(x)@77:14", "span": {"start": [77, 14], "end": [77, 21], "bytes": [1154, 1161]}, "callee": "can://dataflow/python/main.py/slow(x)", "parent": "77:4", "method_name": "slow", "return_type": "Coroutine", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "x"}]}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/fetch(x)@entry", "arguments": []}, "77:4": {"kind": "statement", "id": "can://dataflow/python/main.py/fetch(x)@77:4", "span": {"start": [77, 4], "end": [77, 21], "bytes": [1144, 1161]}, "arguments": []}, "78:4": {"kind": "return", "id": "can://dataflow/python/main.py/fetch(x)@78:4", "span": {"start": [78, 4], "end": [78, 12], "bytes": [1166, 1174]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/fetch(x)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:0", "of": "x", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/fetch(x)@formal_in:1", "of": ":main::slow", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/fetch(x)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/fetch(x)@formal_out:1", "of": "x", "arguments": []}, "77:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/fetch(x)@77:4/actual_in:0", "of": "x", "parent": "77:4", "arguments": []}, "77:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/fetch(x)@77:4/actual_out", "of": "", "parent": "77:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "77:4", "kind": "fallthrough"}, {"src": "77:4", "dst": "78:4", "kind": "await_resume"}, {"src": "77:4", "dst": "@exit", "kind": "exception"}, {"src": "78:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "77:4"}, {"src": "77:4", "dst": "78:4"}], "ddg": [{"src": "@entry", "dst": "77:4", "var": "main::slow", "prov": ["ssa"]}, {"src": "@entry", "dst": "77:4", "var": "x", "prov": ["ssa"]}, {"src": "77:4", "dst": "78:4", "var": "y", "prov": ["ssa"]}, {"src": "77:4", "dst": "@formal_out:1", "var": "x.*", "prov": ["reaching-defs"]}, {"src": "77:4/actual_out", "dst": "77:4", "var": "", "prov": ["reaching-defs"]}, {"src": "78:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "77:4", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "77:4/actual_in:0", "var": "x", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "77:4", "var": "main::slow", "prov": ["reaching-defs"]}], "summary": [{"src": "77:4/actual_in:0", "dst": "77:4/actual_out"}]}, "short_circuit": {"name": "short_circuit", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.short_circuit", "id": "can://dataflow/python/main.py/short_circuit(a,b)", "kind": "function", "span": {"start": [81, 0], "end": [84, 15], "bytes": [1177, 1248]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "a", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:0", "decorators": [], "start_line": 81, "end_line": 81, "start_column": 18, "end_column": 19}, {"name": "b", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:1", "decorators": [], "start_line": 81, "end_line": 81, "start_column": 21, "end_column": 22}], "start_line": 81, "end_line": 84, "code_start_line": 82, "accessed_symbols": [{"name": "a", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 82, "col_offset": 8}, {"name": "b", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 82, "col_offset": 14}, {"name": "a", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 83, "col_offset": 8}, {"name": "b", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 83, "col_offset": 13}, {"name": "c", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 84, "col_offset": 11}, {"name": "d", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 84, "col_offset": 14}], "callables": {}, "types": {}, "local_variables": [{"name": "c", "initializer": "a and b", "scope": "function", "start_line": 82, "end_line": 82, "start_column": 4, "end_column": 5}, {"name": "d", "initializer": "a or b", "scope": "function", "start_line": 83, "end_line": 83, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 4, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/short_circuit(a,b)@entry", "arguments": []}, "82:4": {"kind": "statement", "id": "can://dataflow/python/main.py/short_circuit(a,b)@82:4", "span": {"start": [82, 4], "end": [82, 15], "bytes": [1206, 1217]}, "arguments": []}, "83:4": {"kind": "statement", "id": "can://dataflow/python/main.py/short_circuit(a,b)@83:4", "span": {"start": [83, 4], "end": [83, 14], "bytes": [1222, 1232]}, "arguments": []}, "84:4": {"kind": "return", "id": "can://dataflow/python/main.py/short_circuit(a,b)@84:4", "span": {"start": [84, 4], "end": [84, 15], "bytes": [1237, 1248]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/short_circuit(a,b)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:0", "of": "a", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_in:1", "of": "b", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/short_circuit(a,b)@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "82:4", "kind": "fallthrough"}, {"src": "82:4", "dst": "83:4", "kind": "fallthrough"}, {"src": "83:4", "dst": "84:4", "kind": "fallthrough"}, {"src": "84:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "82:4"}, {"src": "@entry", "dst": "83:4"}, {"src": "@entry", "dst": "84:4"}], "ddg": [{"src": "@entry", "dst": "82:4", "var": "a", "prov": ["ssa"]}, {"src": "@entry", "dst": "82:4", "var": "b", "prov": ["ssa"]}, {"src": "@entry", "dst": "83:4", "var": "a", "prov": ["ssa"]}, {"src": "@entry", "dst": "83:4", "var": "b", "prov": ["ssa"]}, {"src": "82:4", "dst": "84:4", "var": "c", "prov": ["ssa"]}, {"src": "83:4", "dst": "84:4", "var": "d", "prov": ["ssa"]}, {"src": "84:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "82:4", "var": "a", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "83:4", "var": "a", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "82:4", "var": "b", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "83:4", "var": "b", "prov": ["reaching-defs"]}], "summary": []}, "infinite": {"name": "infinite", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.infinite", "id": "can://dataflow/python/main.py/infinite()", "kind": "function", "span": {"start": [87, 0], "end": [89, 12], "bytes": [1251, 1295]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 87, "end_line": 89, "code_start_line": 88, "accessed_symbols": [], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/infinite()@entry", "arguments": []}, "88:10": {"kind": "loop", "id": "can://dataflow/python/main.py/infinite()@88:10", "span": {"start": [88, 10], "end": [88, 14], "bytes": [1277, 1281]}, "arguments": []}, "89:8": {"kind": "statement", "id": "can://dataflow/python/main.py/infinite()@89:8", "span": {"start": [89, 8], "end": [89, 12], "bytes": [1291, 1295]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/infinite()@exit", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/main.py/infinite()@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "88:10", "kind": "fallthrough"}, {"src": "88:10", "dst": "89:8", "kind": "true"}, {"src": "88:10", "dst": "@exit", "kind": "exception"}, {"src": "89:8", "dst": "88:10", "kind": "loop_back"}], "cdg": [{"src": "@entry", "dst": "88:10"}, {"src": "88:10", "dst": "89:8"}], "ddg": [], "summary": []}, "drive": {"name": "drive", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/main.py", "signature": "main.drive", "id": "can://dataflow/python/main.py/drive(n)", "kind": "function", "span": {"start": [92, 0], "end": [95, 25], "bytes": [1298, 1368]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "n", "id": "can://dataflow/python/main.py/drive(n)@formal_in:0", "decorators": [], "start_line": 92, "end_line": 92, "start_column": 10, "end_column": 11}], "start_line": 92, "end_line": 95, "code_start_line": 93, "accessed_symbols": [{"name": "chain_a", "scope": "local", "kind": "function", "type": "chain_a", "qualified_name": "pipeline.chain_a", "is_builtin": false, "lineno": 93, "col_offset": 8}, {"name": "n", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 93, "col_offset": 16}, {"name": "bump", "scope": "local", "kind": "function", "type": "bump", "qualified_name": "state.bump", "is_builtin": false, "lineno": 94, "col_offset": 4}, {"name": "r", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 94, "col_offset": 9}, {"name": "read_counter", "scope": "local", "kind": "function", "type": "read_counter", "qualified_name": "state.read_counter", "is_builtin": false, "lineno": 95, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "r", "type": "int", "initializer": "chain_a(n)", "scope": "function", "start_line": 93, "end_line": 93, "start_column": 4, "end_column": 5}], "cyclomatic_complexity": 2, "body": {"93:8": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@93:8", "span": {"start": [93, 8], "end": [93, 18], "bytes": [1320, 1330]}, "callee": "can://dataflow/python/pipeline.py/chain_a(v)", "parent": "93:4", "method_name": "chain_a", "return_type": "int", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "n"}]}, "94:4": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@94:4", "span": {"start": [94, 4], "end": [94, 11], "bytes": [1335, 1342]}, "callee": "can://dataflow/python/state.py/bump(amount)", "method_name": "bump", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "int", "name": "r"}]}, "95:11": {"kind": "call", "id": "can://dataflow/python/main.py/drive(n)@95:11", "span": {"start": [95, 11], "end": [95, 25], "bytes": [1354, 1368]}, "callee": "can://dataflow/python/state.py/read_counter()", "parent": "95:4", "method_name": "read_counter", "return_type": "int", "is_constructor_call": false, "arguments": []}, "@entry": {"kind": "entry", "id": "can://dataflow/python/main.py/drive(n)@entry", "arguments": []}, "93:4": {"kind": "statement", "id": "can://dataflow/python/main.py/drive(n)@93:4", "span": {"start": [93, 4], "end": [93, 18], "bytes": [1316, 1330]}, "arguments": []}, "95:4": {"kind": "return", "id": "can://dataflow/python/main.py/drive(n)@95:4", "span": {"start": [95, 4], "end": [95, 25], "bytes": [1347, 1368]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/main.py/drive(n)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:0", "of": "n", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:1", "of": ":main::bump", "arguments": []}, "@formal_in:2": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:2", "of": ":main::chain_a", "arguments": []}, "@formal_in:3": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:3", "of": ":main::read_counter", "arguments": []}, "@formal_in:4": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:4", "of": ":pipeline::chain_b", "arguments": []}, "@formal_in:5": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:5", "of": ":pipeline::chain_c", "arguments": []}, "@formal_in:6": {"kind": "formal_in", "id": "can://dataflow/python/main.py/drive(n)@formal_in:6", "of": ":state::counter", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:1", "of": "n", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://dataflow/python/main.py/drive(n)@formal_out:2", "of": ":state::counter", "arguments": []}, "93:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:0", "of": "v", "parent": "93:4", "arguments": []}, "93:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:1", "of": ":pipeline::chain_b", "parent": "93:4", "arguments": []}, "93:4/actual_in:2": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:2", "of": ":pipeline::chain_c", "parent": "93:4", "arguments": []}, "93:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@93:4/actual_out", "of": "", "parent": "93:4", "arguments": []}, "94:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:0", "of": "amount", "parent": "94:4", "arguments": []}, "94:4/actual_in:1": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:1", "of": ":state::counter", "parent": "94:4", "arguments": []}, "94:4/actual_out:0": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:0", "of": "", "parent": "94:4", "arguments": []}, "94:4/actual_out:1": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:1", "of": ":state::counter", "parent": "94:4", "arguments": []}, "95:4/actual_in:0": {"kind": "actual_in", "id": "can://dataflow/python/main.py/drive(n)@95:4/actual_in:0", "of": ":state::counter", "parent": "95:4", "arguments": []}, "95:4/actual_out": {"kind": "actual_out", "id": "can://dataflow/python/main.py/drive(n)@95:4/actual_out", "of": "", "parent": "95:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "93:4", "kind": "fallthrough"}, {"src": "93:4", "dst": "94:4", "kind": "fallthrough"}, {"src": "93:4", "dst": "@exit", "kind": "exception"}, {"src": "94:4", "dst": "95:4", "kind": "fallthrough"}, {"src": "94:4", "dst": "@exit", "kind": "exception"}, {"src": "95:4", "dst": "@exit", "kind": "exception"}, {"src": "95:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "93:4"}, {"src": "93:4", "dst": "94:4"}, {"src": "94:4", "dst": "95:4"}], "ddg": [{"src": "@entry", "dst": "93:4", "var": "main::chain_a", "prov": ["ssa"]}, {"src": "@entry", "dst": "93:4", "var": "n", "prov": ["ssa"]}, {"src": "@entry", "dst": "94:4", "var": "main::bump", "prov": ["ssa"]}, {"src": "@entry", "dst": "95:4", "var": "main::read_counter", "prov": ["ssa"]}, {"src": "93:4", "dst": "94:4", "var": "r", "prov": ["ssa"]}, {"src": "93:4", "dst": "94:4/actual_in:0", "var": "r", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "94:4/actual_in:1", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "95:4/actual_in:0", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "@formal_out:1", "var": "n.*", "prov": ["reaching-defs"]}, {"src": "93:4/actual_out", "dst": "93:4", "var": "", "prov": ["reaching-defs"]}, {"src": "94:4", "dst": "95:4/actual_in:0", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "94:4", "dst": "@formal_out:2", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "94:4/actual_out:0", "dst": "94:4", "var": "", "prov": ["reaching-defs"]}, {"src": "94:4/actual_out:1", "dst": "94:4", "var": ":state::counter", "prov": ["reaching-defs"]}, {"src": "95:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "95:4/actual_out", "dst": "95:4", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "93:4", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "93:4/actual_in:0", "var": "n", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "94:4", "var": "main::bump", "prov": ["reaching-defs"]}, {"src": "@formal_in:2", "dst": "93:4", "var": "main::chain_a", "prov": ["reaching-defs"]}, {"src": "@formal_in:3", "dst": "95:4", "var": "main::read_counter", "prov": ["reaching-defs"]}, {"src": "93:4", "dst": "94:4", "var": "main::bump", "prov": ["points-to"]}, {"src": "93:4", "dst": "95:4", "var": "main::read_counter", "prov": ["points-to"]}, {"src": "94:4", "dst": "95:4", "var": "main::read_counter", "prov": ["points-to"]}], "summary": [{"src": "93:4/actual_in:0", "dst": "93:4/actual_out"}, {"src": "93:4/actual_in:1", "dst": "93:4/actual_out"}, {"src": "94:4/actual_in:0", "dst": "94:4/actual_out:1"}, {"src": "94:4/actual_in:1", "dst": "94:4/actual_out:1"}, {"src": "95:4/actual_in:0", "dst": "95:4/actual_out"}]}}, "variables": [], "content_hash": "97a98d89de2934a3283e7250fa9f75541406ca4dec26f373cfc6162c1eedb345", "last_modified": 1787161494.1287842, "file_size": 1369}, "state.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "module_name": "state", "id": "can://dataflow/python/state.py", "kind": "module", "source": "\"\"\"Module-global fixture: written in one function, read in another.\"\"\"\n\ncounter = 0\n\n\ndef bump(amount):\n global counter\n counter = counter + amount\n\n\ndef read_counter():\n return counter\n", "imports": [], "comments": [{"content": "Module-global fixture: written in one function, read in another.", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 70, "is_docstring": true}], "types": {}, "functions": {"bump": {"name": "bump", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "signature": "state.bump", "id": "can://dataflow/python/state.py/bump(amount)", "kind": "function", "span": {"start": [6, 0], "end": [8, 30], "bytes": [86, 153]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "amount", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "type": "int", "decorators": [], "start_line": 6, "end_line": 6, "start_column": 9, "end_column": 15}], "start_line": 6, "end_line": 8, "code_start_line": 7, "accessed_symbols": [{"name": "counter", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 8, "col_offset": 14}, {"name": "amount", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 8, "col_offset": 24}], "callables": {}, "types": {}, "local_variables": [{"name": "counter", "type": "int", "initializer": "counter + amount", "scope": "function", "start_line": 8, "end_line": 8, "start_column": 4, "end_column": 11}], "cyclomatic_complexity": 1, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/state.py/bump(amount)@entry", "arguments": []}, "7:4": {"kind": "statement", "id": "can://dataflow/python/state.py/bump(amount)@7:4", "span": {"start": [7, 4], "end": [7, 18], "bytes": [108, 122]}, "arguments": []}, "8:4": {"kind": "statement", "id": "can://dataflow/python/state.py/bump(amount)@8:4", "span": {"start": [8, 4], "end": [8, 30], "bytes": [127, 153]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/state.py/bump(amount)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "of": "amount", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://dataflow/python/state.py/bump(amount)@formal_in:1", "of": ":state::counter", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://dataflow/python/state.py/bump(amount)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://dataflow/python/state.py/bump(amount)@formal_out:1", "of": ":state::counter", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "7:4", "kind": "fallthrough"}, {"src": "7:4", "dst": "8:4", "kind": "fallthrough"}, {"src": "8:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "7:4"}, {"src": "@entry", "dst": "8:4"}], "ddg": [{"src": "@entry", "dst": "8:4", "var": "amount", "prov": ["ssa"]}, {"src": "@entry", "dst": "8:4", "var": "state::counter", "prov": ["ssa"]}, {"src": "8:4", "dst": "@formal_out:1", "var": "state::counter", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "8:4", "var": "amount", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "8:4", "var": "state::counter", "prov": ["reaching-defs"]}], "summary": []}, "read_counter": {"name": "read_counter", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/dataflow/state.py", "signature": "state.read_counter", "id": "can://dataflow/python/state.py/read_counter()", "kind": "function", "span": {"start": [11, 0], "end": [12, 18], "bytes": [156, 194]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 11, "end_line": 12, "code_start_line": 12, "accessed_symbols": [{"name": "counter", "scope": "local", "kind": "variable", "type": "int", "qualified_name": "builtins.int", "is_builtin": false, "lineno": 12, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"@entry": {"kind": "entry", "id": "can://dataflow/python/state.py/read_counter()@entry", "arguments": []}, "12:4": {"kind": "return", "id": "can://dataflow/python/state.py/read_counter()@12:4", "span": {"start": [12, 4], "end": [12, 18], "bytes": [180, 194]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://dataflow/python/state.py/read_counter()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://dataflow/python/state.py/read_counter()@formal_in:0", "of": ":state::counter", "arguments": []}, "@formal_out": {"kind": "formal_out", "id": "can://dataflow/python/state.py/read_counter()@formal_out", "of": "", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "12:4", "kind": "fallthrough"}, {"src": "12:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "12:4"}], "ddg": [{"src": "@entry", "dst": "12:4", "var": "state::counter", "prov": ["ssa"]}, {"src": "12:4", "dst": "@formal_out", "var": "", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "12:4", "var": "state::counter", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [{"name": "counter", "type": "int", "initializer": "0", "scope": "module", "start_line": 3, "end_line": 3, "start_column": 0, "end_column": 7}], "content_hash": "ed5faf88840cf6524a85cf636eb740c739de3f3ad7af8e2f8e0b7d56cdc16178", "last_modified": 1787161494.1292224, "file_size": 195}}, "id": "can://dataflow", "kind": "application", "call_graph": [{"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/pipeline.py/chain_a(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/state.py/bump(amount)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/drive(n)", "dst": "can://dataflow/python/state.py/read_counter()", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/fetch(x)", "dst": "can://dataflow/python/main.py/slow(x)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/handles(n)", "dst": "can://dataflow/python/main.py/risky(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/risky(n)", "dst": "can://dataflow/@external/builtins.ValueError/__init__", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/with_block(path)", "dst": "can://dataflow/@external/builtins._BufferedIOBase/read", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/main.py/with_block(path)", "dst": "can://dataflow/@external/builtins/open", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/alias_flow()", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/alias_flow()", "dst": "can://dataflow/python/pipeline.py/Box/get(self)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/caller_of_mutate()", "dst": "can://dataflow/python/pipeline.py/mutate(items)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)", "dst": "can://dataflow/python/pipeline.py/chain_b(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)", "dst": "can://dataflow/python/pipeline.py/chain_c(v)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/even(n)", "dst": "can://dataflow/python/pipeline.py/odd(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/mutate(items)", "dst": "can://dataflow/@external/builtins.list/append", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/odd(n)", "dst": "can://dataflow/python/pipeline.py/even(n)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)", "dst": "can://dataflow/python/pipeline.py/make_adder(base)", "weight": 1, "prov": ["jedi"]}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://dataflow/@external/builtins.ValueError/__init__": {"id": "can://dataflow/@external/builtins.ValueError/__init__", "kind": "external", "name": "__init__", "module": "builtins.ValueError"}, "can://dataflow/@external/builtins._BufferedIOBase/read": {"id": "can://dataflow/@external/builtins._BufferedIOBase/read", "kind": "external", "name": "read", "module": "builtins._BufferedIOBase"}, "can://dataflow/@external/builtins/open": {"id": "can://dataflow/@external/builtins/open", "kind": "external", "name": "open", "module": "builtins"}, "can://dataflow/@external/builtins.list/append": {"id": "can://dataflow/@external/builtins.list/append", "kind": "external", "name": "append", "module": "builtins.list"}}, "artifacts": {}, "dependencies": [], "unresolved_imports": [], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "90cb3de61ccbaa7d01cd46044350e99a45b55aa8", "dirty": false}, "param_in": [{"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:1", "var": ":pipeline::chain_b"}, {"src": "can://dataflow/python/main.py/drive(n)@93:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@formal_in:2", "var": ":pipeline::chain_c"}, {"src": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:0", "dst": "can://dataflow/python/state.py/bump(amount)@formal_in:0", "var": "amount"}, {"src": "can://dataflow/python/main.py/drive(n)@94:4/actual_in:1", "dst": "can://dataflow/python/state.py/bump(amount)@formal_in:1", "var": ":state::counter"}, {"src": "can://dataflow/python/main.py/drive(n)@95:4/actual_in:0", "dst": "can://dataflow/python/state.py/read_counter()@formal_in:0", "var": ":state::counter"}, {"src": "can://dataflow/python/main.py/fetch(x)@77:4/actual_in:0", "dst": "can://dataflow/python/main.py/slow(x)@formal_in:0", "var": "x"}, {"src": "can://dataflow/python/main.py/handles(n)@43:8/actual_in:0", "dst": "can://dataflow/python/main.py/risky(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:0", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_in:1", "var": "value"}, {"src": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/Box/get(self)@formal_in:0", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/mutate(items)@formal_in:0", "var": "items"}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@formal_in:1", "var": ":pipeline::chain_c"}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/chain_c(v)@formal_in:0", "var": "v"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:1", "var": ":pipeline::even"}, {"src": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/odd(n)@formal_in:2", "var": ":pipeline::odd"}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)@44:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:1", "var": ":base"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:0", "var": "n"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:1", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:1", "var": ":pipeline::even"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_in:2", "dst": "can://dataflow/python/pipeline.py/even(n)@formal_in:2", "var": ":pipeline::odd"}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)@formal_in:0", "var": "base"}, {"src": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_in:0", "dst": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_in:0", "var": "x"}], "param_out": [{"src": "can://dataflow/python/main.py/risky(n)@formal_out", "dst": "can://dataflow/python/main.py/handles(n)@43:8/actual_out", "var": ""}, {"src": "can://dataflow/python/main.py/slow(x)@formal_out", "dst": "can://dataflow/python/main.py/fetch(x)@77:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:0", "dst": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/pipeline.py/Box/__init__(self,value)@formal_out:1", "dst": "can://dataflow/python/pipeline.py/alias_flow()@37:4/actual_out:1", "var": "self"}, {"src": "can://dataflow/python/pipeline.py/Box/get(self)@formal_out", "dst": "can://dataflow/python/pipeline.py/alias_flow()@40:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_a(v)@formal_out", "dst": "can://dataflow/python/main.py/drive(n)@93:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_b(v)@formal_out", "dst": "can://dataflow/python/pipeline.py/chain_a(v)@5:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/chain_c(v)@formal_out", "dst": "can://dataflow/python/pipeline.py/chain_b(v)@9:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/even(n)@formal_out", "dst": "can://dataflow/python/pipeline.py/odd(n)@25:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)@formal_out", "dst": "can://dataflow/python/pipeline.py/use_adder(n)@50:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/make_adder(base)/add(x)@formal_out", "dst": "can://dataflow/python/pipeline.py/use_adder(n)@51:4/actual_out", "var": ""}, {"src": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:0", "dst": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/pipeline.py/mutate(items)@formal_out:1", "dst": "can://dataflow/python/pipeline.py/caller_of_mutate()@60:4/actual_out:1", "var": "items"}, {"src": "can://dataflow/python/pipeline.py/odd(n)@formal_out", "dst": "can://dataflow/python/pipeline.py/even(n)@19:4/actual_out", "var": ""}, {"src": "can://dataflow/python/state.py/bump(amount)@formal_out:0", "dst": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:0", "var": ""}, {"src": "can://dataflow/python/state.py/bump(amount)@formal_out:1", "dst": "can://dataflow/python/main.py/drive(n)@94:4/actual_out:1", "var": ":state::counter"}, {"src": "can://dataflow/python/state.py/read_counter()@formal_out", "dst": "can://dataflow/python/main.py/drive(n)@95:4/actual_out", "var": ""}], "config_uses": [], "config_reads_unresolved": []}} \ No newline at end of file diff --git a/v2/json/python/analysis.entrypoints.sample.json b/v2/json/python/analysis.entrypoints.sample.json index 0928a0d..0f9c8c0 100644 --- a/v2/json/python/analysis.entrypoints.sample.json +++ b/v2/json/python/analysis.entrypoints.sample.json @@ -1 +1 @@ -{"schema_version": "2.0.0", "language": "python", "max_level": 2, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.1", "config": {"analysis_level": 2}}, "application": {"symbol_table": {"app.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "module_name": "app", "id": "can://entrypoints_local/python/app.py", "kind": "module", "source": "def route(path, methods=None):\n \"\"\"Stands in for a framework's routing decorator.\"\"\"\n def deco(fn):\n return fn\n return deco\n\n\n@route(\"/products\", methods=[\"POST\"])\ndef create_product():\n return helper()\n\n\ndef helper():\n \"\"\"Called only internally - must NOT be flagged.\"\"\"\n return {}\n", "imports": [], "comments": [], "types": {}, "functions": {"route": {"name": "route", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.route", "id": "can://entrypoints_local/python/app.py/route(path,methods)", "kind": "function", "span": {"start": [1, 0], "end": [5, 15], "bytes": [0, 139]}, "comments": [{"content": "Stands in for a framework's routing decorator.", "start_line": 2, "end_line": 2, "start_column": 4, "end_column": 56, "is_docstring": true}], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "path", "id": "can://entrypoints_local/python/app.py/route(path,methods)@formal_in:0", "type": "str", "decorators": [], "start_line": 1, "end_line": 1, "start_column": 10, "end_column": 14}, {"name": "methods", "id": "can://entrypoints_local/python/app.py/route(path,methods)@formal_in:1", "type": "list", "default_value": "None", "decorators": [], "start_line": 1, "end_line": 1, "start_column": 16, "end_column": 23}], "start_line": 1, "end_line": 5, "code_start_line": 2, "accessed_symbols": [{"name": "deco", "scope": "local", "kind": "function", "type": "deco", "is_builtin": false, "lineno": 5, "col_offset": 11}, {"name": "fn", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 4, "col_offset": 15}], "callables": {"deco": {"name": "deco", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.route.deco", "id": "can://entrypoints_local/python/app.py/route(path,methods)/deco(fn)", "kind": "function", "span": {"start": [3, 4], "end": [4, 17], "bytes": [92, 123]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "fn", "id": "can://entrypoints_local/python/app.py/route(path,methods)/deco(fn)@formal_in:0", "decorators": [], "start_line": 3, "end_line": 3, "start_column": 13, "end_column": 15}], "start_line": 3, "end_line": 4, "code_start_line": 4, "accessed_symbols": [{"name": "fn", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 4, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}, "create_product": {"name": "create_product", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.create_product", "id": "can://entrypoints_local/python/app.py/create_product()", "kind": "function", "span": {"start": [9, 0], "end": [10, 19], "bytes": [180, 221]}, "comments": [], "decorators": [{"name": "route", "qualified_name": "app.route", "positional_arguments": ["'/products'"], "keyword_arguments": {"methods": "['POST']"}, "expression": "route('/products', methods=['POST'])", "span": {"start": [8, 1], "end": [8, 37], "bytes": [143, 179]}}], "modifiers": [], "entrypoints": [{"framework": "heuristic", "confidence": "heuristic", "rule": "heuristic.http-route", "ruleset": "shipped", "evidence": "route", "route": "/products", "http_methods": ["POST"]}], "is_entrypoint": true, "parameters": [], "start_line": 9, "end_line": 10, "code_start_line": 10, "accessed_symbols": [{"name": "route", "scope": "local", "kind": "function", "type": "route", "qualified_name": "app.route", "is_builtin": false, "lineno": 8, "col_offset": 1}, {"name": "helper", "scope": "local", "kind": "function", "type": "helper", "qualified_name": "app.helper", "is_builtin": false, "lineno": 10, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"10:11": {"kind": "call", "id": "can://entrypoints_local/python/app.py/create_product()@10:11", "span": {"start": [10, 11], "end": [10, 19], "bytes": [213, 221]}, "callee": "can://entrypoints_local/python/app.py/helper()", "method_name": "helper", "return_type": "dict", "is_constructor_call": false, "arguments": []}}, "cfg": [], "cdg": [], "ddg": [], "summary": []}, "helper": {"name": "helper", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.helper", "id": "can://entrypoints_local/python/app.py/helper()", "kind": "function", "span": {"start": [13, 0], "end": [15, 13], "bytes": [224, 307]}, "comments": [{"content": "Called only internally - must NOT be flagged.", "start_line": 14, "end_line": 14, "start_column": 4, "end_column": 55, "is_docstring": true}], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 13, "end_line": 15, "code_start_line": 14, "accessed_symbols": [], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}}, "variables": [], "content_hash": "c159f10d62c826213045fa2adfff02c30056e1b764fb95af191d1df514157a4a", "last_modified": 1787243054.8256593, "file_size": 308}}, "id": "can://entrypoints_local", "kind": "application", "call_graph": [{"src": "can://entrypoints_local/@external/app", "dst": "can://entrypoints_local/python/app.py/route(path,methods)", "weight": 1, "prov": ["defuse"]}, {"src": "can://entrypoints_local/python/app.py/create_product()", "dst": "can://entrypoints_local/python/app.py/helper()", "weight": 1, "prov": ["jedi"]}, {"src": "can://entrypoints_local/python/app.py/create_product()", "dst": "can://entrypoints_local/python/app.py/route(path,methods)", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://entrypoints_local/@external/app": {"id": "can://entrypoints_local/@external/app", "kind": "external", "name": "app"}}, "artifacts": {"requirements.txt": {"id": "can://entrypoints_local/artifact/requirements.txt", "kind": "artifact", "path": "requirements.txt", "format": "requirements", "roles": ["dependency-manifest"], "size_bytes": 4, "sha256": "8a8f60ecb09b7e64c6d5214a8043865e608507db8c3f61f995eae6d078875901", "source": "app\n", "extraction": "full", "config_keys": []}, "rules.yml": {"id": "can://entrypoints_local/artifact/rules.yml", "kind": "artifact", "path": "rules.yml", "format": "text", "roles": ["unknown"], "size_bytes": 229, "sha256": "a65c2210e66ed1a9851ebe09682493a204e560222bdfcbe45cd790f2ca74e4f1", "source": "version: 1\nframeworks:\n inhouse:\n detect: [app]\n decorators:\n - id: inhouse.route\n match: \"app.route\"\n route: {from: positional, index: 0}\n methods: {from: keyword, name: methods, default: [GET]}\n", "extraction": "none", "config_keys": []}}, "dependencies": [{"name": "app", "ecosystem": "pypi", "spec": "", "kind": "runtime", "extras": [], "declared_in": "can://entrypoints_local/artifact/requirements.txt", "direct": true, "provides_imports": [], "prov": ["declared"]}], "unresolved_imports": [], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "de9c2bac5ceb369876ab106ae52831b510e445a1", "dirty": false}, "param_in": [], "param_out": [], "config_uses": [], "config_reads_unresolved": []}} \ No newline at end of file +{"schema_version": "2.0.0", "language": "python", "max_level": 2, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.4", "config": {"analysis_level": 2}}, "application": {"symbol_table": {"app.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "module_name": "app", "id": "can://entrypoints_local/python/app.py", "kind": "module", "source": "def route(path, methods=None):\n \"\"\"Stands in for a framework's routing decorator.\"\"\"\n def deco(fn):\n return fn\n return deco\n\n\n@route(\"/products\", methods=[\"POST\"])\ndef create_product():\n return helper()\n\n\ndef helper():\n \"\"\"Called only internally - must NOT be flagged.\"\"\"\n return {}\n", "imports": [], "comments": [], "types": {}, "functions": {"route": {"name": "route", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.route", "id": "can://entrypoints_local/python/app.py/route(path,methods)", "kind": "function", "span": {"start": [1, 0], "end": [5, 15], "bytes": [0, 139]}, "comments": [{"content": "Stands in for a framework's routing decorator.", "start_line": 2, "end_line": 2, "start_column": 4, "end_column": 56, "is_docstring": true}], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "path", "id": "can://entrypoints_local/python/app.py/route(path,methods)@formal_in:0", "type": "str", "decorators": [], "start_line": 1, "end_line": 1, "start_column": 10, "end_column": 14}, {"name": "methods", "id": "can://entrypoints_local/python/app.py/route(path,methods)@formal_in:1", "type": "list", "default_value": "None", "decorators": [], "start_line": 1, "end_line": 1, "start_column": 16, "end_column": 23}], "start_line": 1, "end_line": 5, "code_start_line": 2, "accessed_symbols": [{"name": "deco", "scope": "local", "kind": "function", "type": "deco", "is_builtin": false, "lineno": 5, "col_offset": 11}, {"name": "fn", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 4, "col_offset": 15}], "callables": {"deco": {"name": "deco", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.route.deco", "id": "can://entrypoints_local/python/app.py/route(path,methods)/deco(fn)", "kind": "function", "span": {"start": [3, 4], "end": [4, 17], "bytes": [92, 123]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "fn", "id": "can://entrypoints_local/python/app.py/route(path,methods)/deco(fn)@formal_in:0", "decorators": [], "start_line": 3, "end_line": 3, "start_column": 13, "end_column": 15}], "start_line": 3, "end_line": 4, "code_start_line": 4, "accessed_symbols": [{"name": "fn", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 4, "col_offset": 15}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}}, "types": {}, "local_variables": [], "cyclomatic_complexity": 3, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}, "create_product": {"name": "create_product", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.create_product", "id": "can://entrypoints_local/python/app.py/create_product()", "kind": "function", "span": {"start": [9, 0], "end": [10, 19], "bytes": [180, 221]}, "comments": [], "decorators": [{"name": "route", "qualified_name": "app.route", "positional_arguments": ["'/products'"], "keyword_arguments": {"methods": "['POST']"}, "expression": "route('/products', methods=['POST'])", "span": {"start": [8, 1], "end": [8, 37], "bytes": [143, 179]}}], "modifiers": [], "entrypoints": [{"framework": "heuristic", "confidence": "heuristic", "rule": "heuristic.http-route", "ruleset": "shipped", "evidence": "route", "route": "/products", "http_methods": ["POST"]}], "is_entrypoint": true, "parameters": [], "start_line": 9, "end_line": 10, "code_start_line": 10, "accessed_symbols": [{"name": "route", "scope": "local", "kind": "function", "type": "route", "qualified_name": "app.route", "is_builtin": false, "lineno": 8, "col_offset": 1}, {"name": "helper", "scope": "local", "kind": "function", "type": "helper", "qualified_name": "app.helper", "is_builtin": false, "lineno": 10, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"10:11": {"kind": "call", "id": "can://entrypoints_local/python/app.py/create_product()@10:11", "span": {"start": [10, 11], "end": [10, 19], "bytes": [213, 221]}, "callee": "can://entrypoints_local/python/app.py/helper()", "method_name": "helper", "return_type": "dict", "is_constructor_call": false, "arguments": []}}, "cfg": [], "cdg": [], "ddg": [], "summary": []}, "helper": {"name": "helper", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/single_functionalities/entrypoints_local/app.py", "signature": "app.helper", "id": "can://entrypoints_local/python/app.py/helper()", "kind": "function", "span": {"start": [13, 0], "end": [15, 13], "bytes": [224, 307]}, "comments": [{"content": "Called only internally - must NOT be flagged.", "start_line": 14, "end_line": 14, "start_column": 4, "end_column": 55, "is_docstring": true}], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 13, "end_line": 15, "code_start_line": 14, "accessed_symbols": [], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {}, "cfg": [], "cdg": [], "ddg": [], "summary": []}}, "variables": [], "content_hash": "c159f10d62c826213045fa2adfff02c30056e1b764fb95af191d1df514157a4a", "last_modified": 1787243054.8256593, "file_size": 308}}, "id": "can://entrypoints_local", "kind": "application", "call_graph": [{"src": "can://entrypoints_local/@external/app", "dst": "can://entrypoints_local/python/app.py/route(path,methods)", "weight": 1, "prov": ["defuse"]}, {"src": "can://entrypoints_local/python/app.py/create_product()", "dst": "can://entrypoints_local/python/app.py/helper()", "weight": 1, "prov": ["jedi"]}, {"src": "can://entrypoints_local/python/app.py/create_product()", "dst": "can://entrypoints_local/python/app.py/route(path,methods)", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://entrypoints_local/@external/app": {"id": "can://entrypoints_local/@external/app", "kind": "external", "name": "app"}}, "artifacts": {"requirements.txt": {"id": "can://entrypoints_local/artifact/requirements.txt", "kind": "artifact", "path": "requirements.txt", "format": "requirements", "roles": ["dependency-manifest"], "size_bytes": 4, "sha256": "8a8f60ecb09b7e64c6d5214a8043865e608507db8c3f61f995eae6d078875901", "source": "app\n", "extraction": "full", "config_keys": []}, "rules.yml": {"id": "can://entrypoints_local/artifact/rules.yml", "kind": "artifact", "path": "rules.yml", "format": "text", "roles": ["unknown"], "size_bytes": 229, "sha256": "a65c2210e66ed1a9851ebe09682493a204e560222bdfcbe45cd790f2ca74e4f1", "source": "version: 1\nframeworks:\n inhouse:\n detect: [app]\n decorators:\n - id: inhouse.route\n match: \"app.route\"\n route: {from: positional, index: 0}\n methods: {from: keyword, name: methods, default: [GET]}\n", "extraction": "none", "config_keys": []}}, "dependencies": [{"name": "app", "ecosystem": "pypi", "spec": "", "kind": "runtime", "extras": [], "declared_in": "can://entrypoints_local/artifact/requirements.txt", "direct": true, "provides_imports": [], "prov": ["declared"]}], "unresolved_imports": [], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "90cb3de61ccbaa7d01cd46044350e99a45b55aa8", "dirty": false}, "param_in": [], "param_out": [], "config_uses": [], "config_reads_unresolved": []}} \ No newline at end of file diff --git a/v2/json/python/analysis.l4.sample.json b/v2/json/python/analysis.l4.sample.json index 0344b36..18ed259 100644 --- a/v2/json/python/analysis.l4.sample.json +++ b/v2/json/python/analysis.l4.sample.json @@ -1 +1 @@ -{"schema_version": "2.0.0", "language": "python", "max_level": 4, "k_limit": 3, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.1", "config": {"analysis_level": 4}}, "application": {"symbol_table": {"setup.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/setup.py", "module_name": "setup", "id": "can://manifests_app/python/setup.py", "kind": "module", "source": "from setuptools import setup\nextra = compute_extras()\nsetup(install_requires=extra)\n", "imports": [{"module": "setuptools", "name": "setup", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 28}], "comments": [], "types": {}, "functions": {}, "variables": [{"name": "extra", "initializer": "compute_extras()", "scope": "module", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 5}], "content_hash": "8523b7707314c71d565a381c02335a85c98e011b056e2e249cde190336510bec", "last_modified": 1787982273.5979042, "file_size": 84}, "pkg/config_reader.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "module_name": "config_reader", "id": "can://manifests_app/python/pkg/config_reader.py", "kind": "module", "source": "\"\"\"Config-use e2e fixture for all six detection shapes (#162 Task 5, #165).\"\"\"\nimport os\n\n\n# Shape 1: Direct literal, reads DATABASE_URL from .env (resolves at -a 2)\ndef get_database_url():\n return os.getenv(\"DATABASE_URL\")\n\n\n# Shape 2: Variable-closing to literal, reads API_KEY from .env\n# Resolves only at -a 3+ (DDG single-literal closure)\ndef get_api_key():\n key_name = \"API_KEY\"\n return os.getenv(key_name)\n\n\n# Shape 3: Param-passed via local helper, reads SECRET_API_TOKEN from .env\n# Resolves only at -a 4 (interprocedural parameter-passing)\ndef _read_config(name):\n return os.getenv(name)\n\n\ndef get_secret_token():\n return _read_config(\"SECRET_API_TOKEN\")\n\n\n# Shape 4: Multi-def unresolved (two different literals on branches)\n# Should stay unresolved at all levels (reason: \"non-literal\")\ndef get_config_multi_def(use_debug):\n if use_debug:\n var = \"DEBUG\"\n else:\n var = \"FLASK_ENV\"\n return os.getenv(var)\n\n\n# Shape 5: Undefined-key read\n# Should appear in config_reads_unresolved with reason: \"undefined-key\"\ndef get_missing_config():\n return os.getenv(\"NOT_DEFINED_ANYWHERE\")\n\n\n# Shape 6: Deployment-env, reads APP_MODE from the Dockerfile ENV directive\n# (#165). Direct literal, resolves at -a 2 like shape 1.\ndef get_app_mode():\n return os.getenv(\"APP_MODE\")\n", "imports": [{"module": "os", "name": "os", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 9}], "comments": [{"content": "Config-use e2e fixture for all six detection shapes (#162 Task 5, #165).", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 78, "is_docstring": true}], "types": {}, "functions": {"get_database_url": {"name": "get_database_url", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_database_url", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()", "kind": "function", "span": {"start": [6, 0], "end": [7, 36], "bytes": [166, 226]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 6, "end_line": 7, "code_start_line": 7, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 7, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"7:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:11", "span": {"start": [7, 11], "end": [7, 36], "bytes": [201, 226]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "7:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"DATABASE_URL\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@entry", "arguments": []}, "7:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:4", "span": {"start": [7, 4], "end": [7, 36], "bytes": [194, 226]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "7:4", "kind": "fallthrough"}, {"src": "7:4", "dst": "@exit", "kind": "exception"}, {"src": "7:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "7:4"}], "ddg": [{"src": "@entry", "dst": "7:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "7:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "7:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "7:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "7:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "7:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_api_key": {"name": "get_api_key", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_api_key", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()", "kind": "function", "span": {"start": [12, 0], "end": [14, 30], "bytes": [347, 421]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 12, "end_line": 14, "code_start_line": 13, "accessed_symbols": [{"name": "key_name", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 14, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 14, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "key_name", "type": "str", "initializer": "'API_KEY'", "scope": "function", "start_line": 13, "end_line": 13, "start_column": 4, "end_column": 12}], "cyclomatic_complexity": 2, "body": {"14:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:11", "span": {"start": [14, 11], "end": [14, 30], "bytes": [402, 421]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "14:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "key_name"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@entry", "arguments": []}, "13:4": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@13:4", "span": {"start": [13, 4], "end": [13, 24], "bytes": [370, 390]}, "arguments": []}, "14:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:4", "span": {"start": [14, 4], "end": [14, 30], "bytes": [395, 421]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "13:4", "kind": "fallthrough"}, {"src": "13:4", "dst": "14:4", "kind": "fallthrough"}, {"src": "14:4", "dst": "@exit", "kind": "exception"}, {"src": "14:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "13:4"}, {"src": "@entry", "dst": "14:4"}], "ddg": [{"src": "@entry", "dst": "14:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "13:4", "dst": "14:4", "var": "key_name", "prov": ["ssa"]}, {"src": "14:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "14:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "14:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}, {"src": "13:4", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}], "summary": []}, "_read_config": {"name": "_read_config", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader._read_config", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "kind": "function", "span": {"start": [19, 0], "end": [20, 26], "bytes": [559, 609]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "name", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "type": "str", "decorators": [], "start_line": 19, "end_line": 19, "start_column": 17, "end_column": 21}], "start_line": 19, "end_line": 20, "code_start_line": 20, "accessed_symbols": [{"name": "name", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 20, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 20, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"20:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:11", "span": {"start": [20, 11], "end": [20, 26], "bytes": [594, 609]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "20:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "name"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@entry", "arguments": []}, "20:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:4", "span": {"start": [20, 4], "end": [20, 26], "bytes": [587, 609]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "of": "name", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:1", "of": "name", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:2", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "20:4", "kind": "fallthrough"}, {"src": "20:4", "dst": "@exit", "kind": "exception"}, {"src": "20:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "20:4"}], "ddg": [{"src": "@entry", "dst": "20:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "20:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "@entry", "dst": "20:4", "var": "name", "prov": ["ssa"]}, {"src": "20:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "20:4", "dst": "@formal_out:1", "var": "name.*", "prov": ["reaching-defs"]}, {"src": "20:4", "dst": "@formal_out:2", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "20:4", "var": "name", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "20:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "20:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_secret_token": {"name": "get_secret_token", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_secret_token", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()", "kind": "function", "span": {"start": [23, 0], "end": [24, 43], "bytes": [612, 679]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 23, "end_line": 24, "code_start_line": 24, "accessed_symbols": [{"name": "_read_config", "scope": "local", "kind": "function", "type": "_read_config", "qualified_name": "pkg.config_reader._read_config", "is_builtin": false, "lineno": 24, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"24:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:11", "span": {"start": [24, 11], "end": [24, 43], "bytes": [647, 679]}, "callee": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "parent": "24:4", "method_name": "_read_config", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"SECRET_API_TOKEN\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@entry", "arguments": []}, "24:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4", "span": {"start": [24, 4], "end": [24, 43], "bytes": [640, 679]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_in:0", "of": ":config_reader::_read_config", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_out:1", "of": ":config_reader::os", "arguments": []}, "24:4/actual_in:0": {"kind": "actual_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:0", "of": "name", "parent": "24:4", "arguments": []}, "24:4/actual_in:1": {"kind": "actual_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:1", "of": ":config_reader::os", "parent": "24:4", "arguments": []}, "24:4/actual_out:0": {"kind": "actual_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:0", "of": "", "parent": "24:4", "arguments": []}, "24:4/actual_out:1": {"kind": "actual_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:1", "of": ":config_reader::os", "parent": "24:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "24:4", "kind": "fallthrough"}, {"src": "24:4", "dst": "@exit", "kind": "exception"}, {"src": "24:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "24:4"}], "ddg": [{"src": "@entry", "dst": "24:4", "var": "config_reader::_read_config", "prov": ["ssa"]}, {"src": "24:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "24:4", "dst": "@formal_out:1", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "24:4/actual_out:0", "dst": "24:4", "var": "", "prov": ["reaching-defs"]}, {"src": "24:4/actual_out:1", "dst": "24:4", "var": ":config_reader::os", "prov": ["reaching-defs"]}, {"src": "@entry", "dst": "24:4/actual_in:0", "var": "config_reader::_read_config", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "24:4", "var": "config_reader::_read_config", "prov": ["reaching-defs"]}], "summary": [{"src": "24:4/actual_in:0", "dst": "24:4/actual_out:0"}, {"src": "24:4/actual_in:0", "dst": "24:4/actual_out:1"}, {"src": "24:4/actual_in:1", "dst": "24:4/actual_out:0"}, {"src": "24:4/actual_in:1", "dst": "24:4/actual_out:1"}]}, "get_config_multi_def": {"name": "get_config_multi_def", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_config_multi_def", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)", "kind": "function", "span": {"start": [29, 0], "end": [34, 25], "bytes": [814, 952]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "use_debug", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:0", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 25, "end_column": 34}], "start_line": 29, "end_line": 34, "code_start_line": 30, "accessed_symbols": [{"name": "use_debug", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 30, "col_offset": 7}, {"name": "var", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 34, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 34, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "var", "type": "str", "initializer": "'DEBUG'", "scope": "function", "start_line": 31, "end_line": 31, "start_column": 8, "end_column": 11}, {"name": "var", "type": "str", "initializer": "'FLASK_ENV'", "scope": "function", "start_line": 33, "end_line": 33, "start_column": 8, "end_column": 11}], "cyclomatic_complexity": 3, "body": {"34:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:11", "span": {"start": [34, 11], "end": [34, 25], "bytes": [938, 952]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "34:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "var"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@entry", "arguments": []}, "30:7": {"kind": "branch", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@30:7", "span": {"start": [30, 7], "end": [30, 16], "bytes": [858, 867]}, "arguments": []}, "31:8": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@31:8", "span": {"start": [31, 8], "end": [31, 21], "bytes": [877, 890]}, "arguments": []}, "33:8": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@33:8", "span": {"start": [33, 8], "end": [33, 25], "bytes": [909, 926]}, "arguments": []}, "34:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:4", "span": {"start": [34, 4], "end": [34, 25], "bytes": [931, 952]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:0", "of": "use_debug", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "30:7", "kind": "fallthrough"}, {"src": "30:7", "dst": "31:8", "kind": "true"}, {"src": "30:7", "dst": "33:8", "kind": "false"}, {"src": "31:8", "dst": "34:4", "kind": "fallthrough"}, {"src": "33:8", "dst": "34:4", "kind": "fallthrough"}, {"src": "34:4", "dst": "@exit", "kind": "exception"}, {"src": "34:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "30:7"}, {"src": "@entry", "dst": "34:4"}, {"src": "30:7", "dst": "31:8"}, {"src": "30:7", "dst": "33:8"}], "ddg": [{"src": "@entry", "dst": "30:7", "var": "use_debug", "prov": ["ssa"]}, {"src": "@entry", "dst": "34:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "31:8", "dst": "34:4", "var": "var", "prov": ["ssa"]}, {"src": "33:8", "dst": "34:4", "var": "var", "prov": ["ssa"]}, {"src": "34:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "34:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "30:7", "var": "use_debug", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "34:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}, {"src": "31:8", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}, {"src": "33:8", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}], "summary": []}, "get_missing_config": {"name": "get_missing_config", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_missing_config", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()", "kind": "function", "span": {"start": [39, 0], "end": [40, 44], "bytes": [1057, 1127]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 39, "end_line": 40, "code_start_line": 40, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 40, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"40:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:11", "span": {"start": [40, 11], "end": [40, 44], "bytes": [1094, 1127]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "40:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"NOT_DEFINED_ANYWHERE\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@entry", "arguments": []}, "40:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:4", "span": {"start": [40, 4], "end": [40, 44], "bytes": [1087, 1127]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "40:4", "kind": "fallthrough"}, {"src": "40:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "40:4"}], "ddg": [{"src": "@entry", "dst": "40:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "40:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "40:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "40:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "40:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "40:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_app_mode": {"name": "get_app_mode", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_app_mode", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()", "kind": "function", "span": {"start": [45, 0], "end": [46, 32], "bytes": [1263, 1315]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 45, "end_line": 46, "code_start_line": 46, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 46, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"46:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:11", "span": {"start": [46, 11], "end": [46, 32], "bytes": [1294, 1315]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "46:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"APP_MODE\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@entry", "arguments": []}, "46:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:4", "span": {"start": [46, 4], "end": [46, 32], "bytes": [1287, 1315]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "46:4", "kind": "fallthrough"}, {"src": "46:4", "dst": "@exit", "kind": "exception"}, {"src": "46:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "46:4"}], "ddg": [{"src": "@entry", "dst": "46:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "46:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "46:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "46:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "46:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "46:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [], "content_hash": "5cb9d813337d9ee688d8fd4c8616f1572a926a8af912092818db2840e8173efb", "last_modified": 1788022149.635426, "file_size": 1316}, "pkg/__init__.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/__init__.py", "module_name": "__init__", "id": "can://manifests_app/python/pkg/__init__.py", "kind": "module", "source": "", "imports": [], "comments": [], "types": {}, "functions": {}, "variables": [], "content_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "last_modified": 1787982273.5935364, "file_size": 0}, "pkg/main.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/main.py", "module_name": "main", "id": "can://manifests_app/python/pkg/main.py", "kind": "module", "source": "import requests\nimport colorama # deliberately undeclared\n\ndef fetch(url):\n return requests.get(url)\n", "imports": [{"module": "requests", "name": "requests", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 15}, {"module": "colorama", "name": "colorama", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 15}], "comments": [], "types": {}, "functions": {"fetch": {"name": "fetch", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/main.py", "signature": "pkg.main.fetch", "id": "can://manifests_app/python/pkg/main.py/fetch(url)", "kind": "function", "span": {"start": [4, 0], "end": [5, 28], "bytes": [60, 104]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "url", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:0", "decorators": [], "start_line": 4, "end_line": 4, "start_column": 10, "end_column": 13}], "start_line": 4, "end_line": 5, "code_start_line": 5, "accessed_symbols": [{"name": "url", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 5, "col_offset": 24}, {"name": "requests", "scope": "global", "kind": "module", "type": "requests", "qualified_name": "requests", "is_builtin": false, "lineno": 5, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"5:11": {"kind": "call", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@5:11", "span": {"start": [5, 11], "end": [5, 28], "bytes": [87, 104]}, "callee": "can://manifests_app/@external/requests.api/get", "parent": "5:4", "method_name": "get", "receiver_expr": "requests", "receiver_type": "requests", "return_type": "Response", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "url"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@entry", "arguments": []}, "5:4": {"kind": "return", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@5:4", "span": {"start": [5, 4], "end": [5, 28], "bytes": [80, 104]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:0", "of": "url", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:1", "of": ":main::requests", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:1", "of": "url", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:2", "of": ":main::requests", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "5:4", "kind": "fallthrough"}, {"src": "5:4", "dst": "@exit", "kind": "exception"}, {"src": "5:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "5:4"}], "ddg": [{"src": "@entry", "dst": "5:4", "var": "main::requests", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "main::requests.get", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "url", "prov": ["ssa"]}, {"src": "5:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "5:4", "dst": "@formal_out:1", "var": "url.*", "prov": ["reaching-defs"]}, {"src": "5:4", "dst": "@formal_out:2", "var": "main::requests.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "5:4", "var": "url", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "main::requests", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "main::requests.get", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [], "content_hash": "b79926bf7a944073398bc31fd0342403b5d6ab478bce999a1110ab02835c16f5", "last_modified": 1787982273.5944843, "file_size": 105}}, "id": "can://manifests_app", "kind": "application", "call_graph": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_api_key()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_database_url()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/main.py/fetch(url)", "dst": "can://manifests_app/@external/requests.api/get", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/@external/setup", "dst": "can://manifests_app/@external/setuptools/setup", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://manifests_app/@external/os/getenv": {"id": "can://manifests_app/@external/os/getenv", "kind": "external", "name": "getenv", "module": "os"}, "can://manifests_app/@external/requests.api/get": {"id": "can://manifests_app/@external/requests.api/get", "kind": "external", "name": "get", "module": "requests.api"}, "can://manifests_app/@external/setup": {"id": "can://manifests_app/@external/setup", "kind": "external", "name": "setup"}, "can://manifests_app/@external/setuptools/setup": {"id": "can://manifests_app/@external/setuptools/setup", "kind": "external", "name": "setup", "module": "setuptools"}}, "artifacts": {".env": {"id": "can://manifests_app/artifact/.env", "kind": "artifact", "path": ".env", "format": "text", "roles": ["env"], "size_bytes": 220, "sha256": "cd9177857f014776ad99f62440a101d595ea16d32592a261b92d8ad8db2807aa", "source": "# Application environment configuration\nDEBUG=true\nDATABASE_URL=\"postgresql://localhost/mydb # connection string\"\nAPI_KEY=\"${DATABASE_PASSWORD}\"\nSECRET_API_TOKEN=\"sk-12345abcdef-super-secret\"\nexport FLASK_ENV=production\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/.env@key/API_KEY", "key": "API_KEY", "namespace": "env", "value": "${DATABASE_PASSWORD}", "span": {"start": [4, 0], "end": [4, 30], "bytes": [114, 144]}, "references": ["${DATABASE_PASSWORD}"]}, {"id": "can://manifests_app/artifact/.env@key/DATABASE_URL", "key": "DATABASE_URL", "namespace": "env", "value": "postgresql://localhost/mydb # connection string", "span": {"start": [3, 0], "end": [3, 62], "bytes": [51, 113]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/DEBUG", "key": "DEBUG", "namespace": "env", "value": "true", "span": {"start": [2, 0], "end": [2, 10], "bytes": [40, 50]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/FLASK_ENV", "key": "FLASK_ENV", "namespace": "env", "value": "production", "span": {"start": [6, 0], "end": [6, 27], "bytes": [192, 219]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/SECRET_API_TOKEN", "key": "SECRET_API_TOKEN", "namespace": "env", "value": "sk-12345abcdef-super-secret", "span": {"start": [5, 0], "end": [5, 46], "bytes": [145, 191]}, "references": []}]}, ".github/workflows/ci.yml": {"id": "can://manifests_app/artifact/.github/workflows/ci.yml", "kind": "artifact", "path": ".github/workflows/ci.yml", "format": "yaml", "roles": ["ci"], "size_bytes": 18, "sha256": "1c7b515b077ae3f96d2b4fc9e2be04d69213e4e0e941e382ac85b2bcfa8302af", "source": "on: push\njobs: {}\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/.github/workflows/ci.yml@key/True", "key": "True", "namespace": "yaml", "value": "push", "references": []}]}, "Dockerfile": {"id": "can://manifests_app/artifact/Dockerfile", "kind": "artifact", "path": "Dockerfile", "format": "dockerfile", "roles": ["container-image"], "size_bytes": 61, "sha256": "8355d52cd519c25f476c55bf732311796cfa5b5b152de432b6de4da1b5b2ebc3", "source": "FROM python:3.12-slim\n\nARG BUILD_REV\nENV APP_MODE=production\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/Dockerfile@key/APP_MODE", "key": "APP_MODE", "namespace": "env", "value": "production", "span": {"start": [4, 0], "end": [4, 23], "bytes": [37, 60]}, "references": []}, {"id": "can://manifests_app/artifact/Dockerfile@key/arg.BUILD_REV", "key": "BUILD_REV", "namespace": "dockerfile", "span": {"start": [3, 0], "end": [3, 13], "bytes": [23, 36]}, "references": []}]}, "app.properties": {"id": "can://manifests_app/artifact/app.properties", "kind": "artifact", "path": "app.properties", "format": "properties", "roles": ["tool-config"], "size_bytes": 371, "sha256": "1cbb0081b3aba454de1db62a76fffff6049c303b627826a6838405597eff8438", "source": "# Application properties\napp.name=MyApplication\napp.version=1.0.0\n# Multi-line property with continuation\napp.long.description=This is a very long property value that \\\n continues on the next line with additional configuration details\nserver.port=9000\nserver.ssl=true\n# Property with interpolation reference\ndb.url=%(db.host)s:%(db.port)s\ndb.host=localhost\ndb.port=5432\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/app.properties@key/app.long.description", "key": "app.long.description", "namespace": "properties", "value": "This is a very long property value that continues on the next line with additional configuration details", "span": {"start": [5, 0], "end": [5, 62], "bytes": [106, 168]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/app.name", "key": "app.name", "namespace": "properties", "value": "MyApplication", "span": {"start": [2, 0], "end": [2, 22], "bytes": [25, 47]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/app.version", "key": "app.version", "namespace": "properties", "value": "1.0.0", "span": {"start": [3, 0], "end": [3, 17], "bytes": [48, 65]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.host", "key": "db.host", "namespace": "properties", "value": "localhost", "span": {"start": [11, 0], "end": [11, 17], "bytes": [340, 357]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.port", "key": "db.port", "namespace": "properties", "value": "5432", "span": {"start": [12, 0], "end": [12, 12], "bytes": [358, 370]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.url", "key": "db.url", "namespace": "properties", "value": "%(db.host)s:%(db.port)s", "span": {"start": [10, 0], "end": [10, 30], "bytes": [309, 339]}, "references": ["%(db.host)s", "%(db.port)s"]}, {"id": "can://manifests_app/artifact/app.properties@key/server.port", "key": "server.port", "namespace": "properties", "value": "9000", "span": {"start": [7, 0], "end": [7, 16], "bytes": [236, 252]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/server.ssl", "key": "server.ssl", "namespace": "properties", "value": "true", "span": {"start": [8, 0], "end": [8, 15], "bytes": [253, 268]}, "references": []}]}, "config/settings.yml": {"id": "can://manifests_app/artifact/config/settings.yml", "kind": "artifact", "path": "config/settings.yml", "format": "yaml", "roles": ["tool-config"], "size_bytes": 334, "sha256": "f18107a45e4a162109e551cbca84dc34a28254b7008625f5d5773226ee628c71", "source": "server:\n host: localhost\n port: 8080\n timeouts:\n connect: 30\n read: 60\ndatabase:\n primary:\n url: postgresql://db.example.com/prod\n pool_size: 10\n replicas:\n - url: postgresql://replica1.example.com/prod\n - url: postgresql://replica2.example.com/prod\nlogging:\n level: DEBUG\n handlers:\n - console\n - file\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/config/settings.yml@key/database.primary.pool_size", "key": "database.primary.pool_size", "namespace": "yaml", "value": "10", "span": {"start": [10, 0], "end": [10, 17], "bytes": [143, 160]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.primary.url", "key": "database.primary.url", "namespace": "yaml", "value": "postgresql://db.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.replicas.0.url", "key": "database.replicas.0.url", "namespace": "yaml", "value": "postgresql://replica1.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.replicas.1.url", "key": "database.replicas.1.url", "namespace": "yaml", "value": "postgresql://replica2.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.handlers.0", "key": "logging.handlers.0", "namespace": "yaml", "value": "console", "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.handlers.1", "key": "logging.handlers.1", "namespace": "yaml", "value": "file", "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.level", "key": "logging.level", "namespace": "yaml", "value": "DEBUG", "span": {"start": [15, 0], "end": [15, 14], "bytes": [282, 296]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.host", "key": "server.host", "namespace": "yaml", "value": "localhost", "span": {"start": [2, 0], "end": [2, 17], "bytes": [8, 25]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.port", "key": "server.port", "namespace": "yaml", "value": "8080", "span": {"start": [3, 0], "end": [3, 12], "bytes": [26, 38]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.timeouts.connect", "key": "server.timeouts.connect", "namespace": "yaml", "value": "30", "span": {"start": [5, 0], "end": [5, 15], "bytes": [51, 66]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.timeouts.read", "key": "server.timeouts.read", "namespace": "yaml", "value": "60", "span": {"start": [6, 0], "end": [6, 12], "bytes": [67, 79]}, "references": []}]}, "data.csv": {"id": "can://manifests_app/artifact/data.csv", "kind": "artifact", "path": "data.csv", "format": "text", "roles": ["unknown"], "size_bytes": 26, "sha256": "e7a3929e0913e80f475f937db1615bfa29484299e93ea55d8c87e92770c8078d", "source": "name,value\nalpha,1\nbeta,2\n", "extraction": "none", "config_keys": []}, "docker-compose.yml": {"id": "can://manifests_app/artifact/docker-compose.yml", "kind": "artifact", "path": "docker-compose.yml", "format": "yaml", "roles": ["service-topology"], "size_bytes": 73, "sha256": "7eb1818ce6a2b3acdaabfcb23ad26a9ab5370a376ee60da8a8105824289f8e4f", "source": "services:\n web:\n build: .\n environment:\n COMPOSE_ONLY_KEY: x\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/docker-compose.yml@key/env.COMPOSE_ONLY_KEY", "key": "COMPOSE_ONLY_KEY", "namespace": "env", "value": "x", "span": {"start": [5, 0], "end": [5, 25], "bytes": [47, 72]}, "references": []}, {"id": "can://manifests_app/artifact/docker-compose.yml@key/services.web.build", "key": "services.web.build", "namespace": "yaml", "value": ".", "span": {"start": [3, 0], "end": [3, 12], "bytes": [17, 29]}, "references": []}, {"id": "can://manifests_app/artifact/docker-compose.yml@key/services.web.environment.COMPOSE_ONLY_KEY", "key": "services.web.environment.COMPOSE_ONLY_KEY", "namespace": "yaml", "value": "x", "span": {"start": [5, 0], "end": [5, 25], "bytes": [47, 72]}, "references": []}]}, "environment.yml": {"id": "can://manifests_app/artifact/environment.yml", "kind": "artifact", "path": "environment.yml", "format": "yaml", "roles": ["dependency-manifest"], "size_bytes": 29, "sha256": "6f610dc2806830e92a47759b1152ed97c70abc8705ac318638d9781c500d76db", "source": "dependencies:\n - numpy=1.26\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/environment.yml@key/dependencies.0", "key": "dependencies.0", "namespace": "yaml", "value": "numpy=1.26", "references": []}]}, "logo.png": {"id": "can://manifests_app/artifact/logo.png", "kind": "artifact", "path": "logo.png", "format": "binary", "roles": ["unknown"], "size_bytes": 14, "sha256": "4033735c485f1e032d3414a913c885fc8824e0882c102e2fc78452707739848d", "source": "", "extraction": "none", "config_keys": []}, "pyproject.toml": {"id": "can://manifests_app/artifact/pyproject.toml", "kind": "artifact", "path": "pyproject.toml", "format": "toml", "roles": ["dependency-manifest", "tool-config"], "size_bytes": 67, "sha256": "cd62a9edff50b75a48f60af3c7bb28d8c7249b1b2033d439f7a2b1cbf880d278", "source": "[project]\nname = \"manifests-app\"\ndependencies = [\"requests>=2.31\"]\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/pyproject.toml@key/project.dependencies.0", "key": "project.dependencies.0", "namespace": "toml", "value": "requests>=2.31", "references": []}, {"id": "can://manifests_app/artifact/pyproject.toml@key/project.name", "key": "project.name", "namespace": "toml", "value": "manifests-app", "span": {"start": [2, 0], "end": [2, 22], "bytes": [10, 32]}, "references": []}]}, "requirements-dev.txt": {"id": "can://manifests_app/artifact/requirements-dev.txt", "kind": "artifact", "path": "requirements-dev.txt", "format": "requirements", "roles": ["dependency-manifest"], "size_bytes": 10, "sha256": "e5d9943702bb51c0b13a5891bf396d41a5b0d269f583ad57534e5021a32af50d", "source": "pytest>=8\n", "extraction": "full", "config_keys": []}, "setup.py": {"id": "can://manifests_app/artifact/setup.py", "kind": "artifact", "path": "setup.py", "format": "text", "roles": ["dependency-manifest"], "size_bytes": 84, "sha256": "8523b7707314c71d565a381c02335a85c98e011b056e2e249cde190336510bec", "source": "from setuptools import setup\nextra = compute_extras()\nsetup(install_requires=extra)\n", "extraction": "partial", "config_keys": []}, "uv.lock": {"id": "can://manifests_app/artifact/uv.lock", "kind": "artifact", "path": "uv.lock", "format": "toml", "roles": ["dependency-manifest"], "size_bytes": 49, "sha256": "672f187467ab259fbf4562218f09ef721369748cc077c1dab594aa9067c4fd0c", "source": "[[package]]\nname = \"requests\"\nversion = \"2.32.3\"\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/uv.lock@key/package.0.name", "key": "package.0.name", "namespace": "toml", "value": "requests", "span": {"start": [2, 0], "end": [2, 17], "bytes": [12, 29]}, "references": []}, {"id": "can://manifests_app/artifact/uv.lock@key/package.0.version", "key": "package.0.version", "namespace": "toml", "value": "2.32.3", "span": {"start": [3, 0], "end": [3, 18], "bytes": [30, 48]}, "references": []}]}}, "dependencies": [{"name": "numpy", "ecosystem": "pypi", "spec": "=1.26", "kind": "runtime", "extras": [], "declared_in": "can://manifests_app/artifact/environment.yml", "direct": true, "provides_imports": [], "prov": ["declared"]}, {"name": "pytest", "ecosystem": "pypi", "spec": ">=8", "kind": "dev", "extras": [], "declared_in": "can://manifests_app/artifact/requirements-dev.txt", "direct": true, "provides_imports": [], "prov": ["declared"]}, {"name": "requests", "ecosystem": "pypi", "spec": ">=2.31", "kind": "runtime", "extras": [], "declared_in": "can://manifests_app/artifact/pyproject.toml", "direct": true, "locked_version": "2.32.3", "provides_imports": ["requests"], "prov": ["declared", "lockfile"]}], "unresolved_imports": [{"module": "colorama", "prov": []}, {"module": "setuptools", "prov": []}], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "de9c2bac5ceb369876ab106ae52831b510e445a1", "dirty": false}, "param_in": [{"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:0", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "var": "name"}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:1", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:1", "var": ":config_reader::os"}], "param_out": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:0", "dst": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:0", "var": ""}, {"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:2", "dst": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:1", "var": ":config_reader::os"}], "config_uses": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:11", "dst": "can://manifests_app/artifact/.env@key/SECRET_API_TOKEN", "prov": ["dataflow"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:11", "dst": "can://manifests_app/artifact/.env@key/API_KEY", "prov": ["dataflow"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:11", "dst": "can://manifests_app/artifact/Dockerfile@key/APP_MODE", "prov": ["literal"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:11", "dst": "can://manifests_app/artifact/.env@key/DATABASE_URL", "prov": ["literal"]}], "config_reads_unresolved": [{"site": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:11", "callee": "can://manifests_app/@external/os/getenv", "reason": "non-literal", "prov": ["literal", "dataflow"]}, {"site": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:11", "callee": "can://manifests_app/@external/os/getenv", "key": "NOT_DEFINED_ANYWHERE", "reason": "undefined-key", "prov": ["literal", "dataflow"]}]}} \ No newline at end of file +{"schema_version": "2.0.0", "language": "python", "max_level": 4, "k_limit": 3, "analyzer": {"name": "codeanalyzer-python", "version": "1.5.4", "config": {"analysis_level": 4}}, "application": {"symbol_table": {"setup.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/setup.py", "module_name": "setup", "id": "can://manifests_app/python/setup.py", "kind": "module", "source": "from setuptools import setup\nextra = compute_extras()\nsetup(install_requires=extra)\n", "imports": [{"module": "setuptools", "name": "setup", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 28}], "comments": [], "types": {}, "functions": {}, "variables": [{"name": "extra", "initializer": "compute_extras()", "scope": "module", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 5}], "content_hash": "8523b7707314c71d565a381c02335a85c98e011b056e2e249cde190336510bec", "last_modified": 1787982273.5979042, "file_size": 84}, "pkg/config_reader.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "module_name": "config_reader", "id": "can://manifests_app/python/pkg/config_reader.py", "kind": "module", "source": "\"\"\"Config-use e2e fixture for all six detection shapes (#162 Task 5, #165).\"\"\"\nimport os\n\n\n# Shape 1: Direct literal, reads DATABASE_URL from .env (resolves at -a 2)\ndef get_database_url():\n return os.getenv(\"DATABASE_URL\")\n\n\n# Shape 2: Variable-closing to literal, reads API_KEY from .env\n# Resolves only at -a 3+ (DDG single-literal closure)\ndef get_api_key():\n key_name = \"API_KEY\"\n return os.getenv(key_name)\n\n\n# Shape 3: Param-passed via local helper, reads SECRET_API_TOKEN from .env\n# Resolves only at -a 4 (interprocedural parameter-passing)\ndef _read_config(name):\n return os.getenv(name)\n\n\ndef get_secret_token():\n return _read_config(\"SECRET_API_TOKEN\")\n\n\n# Shape 4: Multi-def unresolved (two different literals on branches)\n# Should stay unresolved at all levels (reason: \"non-literal\")\ndef get_config_multi_def(use_debug):\n if use_debug:\n var = \"DEBUG\"\n else:\n var = \"FLASK_ENV\"\n return os.getenv(var)\n\n\n# Shape 5: Undefined-key read\n# Should appear in config_reads_unresolved with reason: \"undefined-key\"\ndef get_missing_config():\n return os.getenv(\"NOT_DEFINED_ANYWHERE\")\n\n\n# Shape 6: Deployment-env, reads APP_MODE from the Dockerfile ENV directive\n# (#165). Direct literal, resolves at -a 2 like shape 1.\ndef get_app_mode():\n return os.getenv(\"APP_MODE\")\n", "imports": [{"module": "os", "name": "os", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 9}], "comments": [{"content": "Config-use e2e fixture for all six detection shapes (#162 Task 5, #165).", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 78, "is_docstring": true}], "types": {}, "functions": {"get_database_url": {"name": "get_database_url", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_database_url", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()", "kind": "function", "span": {"start": [6, 0], "end": [7, 36], "bytes": [166, 226]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 6, "end_line": 7, "code_start_line": 7, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 7, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"7:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:11", "span": {"start": [7, 11], "end": [7, 36], "bytes": [201, 226]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "7:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"DATABASE_URL\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@entry", "arguments": []}, "7:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:4", "span": {"start": [7, 4], "end": [7, 36], "bytes": [194, 226]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "7:4", "kind": "fallthrough"}, {"src": "7:4", "dst": "@exit", "kind": "exception"}, {"src": "7:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "7:4"}], "ddg": [{"src": "@entry", "dst": "7:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "7:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "7:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "7:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "7:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "7:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_api_key": {"name": "get_api_key", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_api_key", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()", "kind": "function", "span": {"start": [12, 0], "end": [14, 30], "bytes": [347, 421]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 12, "end_line": 14, "code_start_line": 13, "accessed_symbols": [{"name": "key_name", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 14, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 14, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "key_name", "type": "str", "initializer": "'API_KEY'", "scope": "function", "start_line": 13, "end_line": 13, "start_column": 4, "end_column": 12}], "cyclomatic_complexity": 2, "body": {"14:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:11", "span": {"start": [14, 11], "end": [14, 30], "bytes": [402, 421]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "14:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "key_name"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@entry", "arguments": []}, "13:4": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@13:4", "span": {"start": [13, 4], "end": [13, 24], "bytes": [370, 390]}, "arguments": []}, "14:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:4", "span": {"start": [14, 4], "end": [14, 30], "bytes": [395, 421]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "13:4", "kind": "fallthrough"}, {"src": "13:4", "dst": "14:4", "kind": "fallthrough"}, {"src": "14:4", "dst": "@exit", "kind": "exception"}, {"src": "14:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "13:4"}, {"src": "@entry", "dst": "14:4"}], "ddg": [{"src": "@entry", "dst": "14:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "13:4", "dst": "14:4", "var": "key_name", "prov": ["ssa"]}, {"src": "14:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "14:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "14:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}, {"src": "13:4", "dst": "14:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}], "summary": []}, "_read_config": {"name": "_read_config", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader._read_config", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "kind": "function", "span": {"start": [19, 0], "end": [20, 26], "bytes": [559, 609]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "name", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "type": "str", "decorators": [], "start_line": 19, "end_line": 19, "start_column": 17, "end_column": 21}], "start_line": 19, "end_line": 20, "code_start_line": 20, "accessed_symbols": [{"name": "name", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 20, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 20, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"20:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:11", "span": {"start": [20, 11], "end": [20, 26], "bytes": [594, 609]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "20:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "name"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@entry", "arguments": []}, "20:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:4", "span": {"start": [20, 4], "end": [20, 26], "bytes": [587, 609]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "of": "name", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:1", "of": "name", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:2", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "20:4", "kind": "fallthrough"}, {"src": "20:4", "dst": "@exit", "kind": "exception"}, {"src": "20:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "20:4"}], "ddg": [{"src": "@entry", "dst": "20:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "20:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "@entry", "dst": "20:4", "var": "name", "prov": ["ssa"]}, {"src": "20:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "20:4", "dst": "@formal_out:1", "var": "name.*", "prov": ["reaching-defs"]}, {"src": "20:4", "dst": "@formal_out:2", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "20:4", "var": "name", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "20:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "20:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_secret_token": {"name": "get_secret_token", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_secret_token", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()", "kind": "function", "span": {"start": [23, 0], "end": [24, 43], "bytes": [612, 679]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 23, "end_line": 24, "code_start_line": 24, "accessed_symbols": [{"name": "_read_config", "scope": "local", "kind": "function", "type": "_read_config", "qualified_name": "pkg.config_reader._read_config", "is_builtin": false, "lineno": 24, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"24:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:11", "span": {"start": [24, 11], "end": [24, 43], "bytes": [647, 679]}, "callee": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "parent": "24:4", "method_name": "_read_config", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"SECRET_API_TOKEN\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@entry", "arguments": []}, "24:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4", "span": {"start": [24, 4], "end": [24, 43], "bytes": [640, 679]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_in:0", "of": ":config_reader::_read_config", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@formal_out:1", "of": ":config_reader::os", "arguments": []}, "24:4/actual_in:0": {"kind": "actual_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:0", "of": "name", "parent": "24:4", "arguments": []}, "24:4/actual_in:1": {"kind": "actual_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:1", "of": ":config_reader::os", "parent": "24:4", "arguments": []}, "24:4/actual_out:0": {"kind": "actual_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:0", "of": "", "parent": "24:4", "arguments": []}, "24:4/actual_out:1": {"kind": "actual_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:1", "of": ":config_reader::os", "parent": "24:4", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "24:4", "kind": "fallthrough"}, {"src": "24:4", "dst": "@exit", "kind": "exception"}, {"src": "24:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "24:4"}], "ddg": [{"src": "@entry", "dst": "24:4", "var": "config_reader::_read_config", "prov": ["ssa"]}, {"src": "24:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "24:4", "dst": "@formal_out:1", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "24:4/actual_out:0", "dst": "24:4", "var": "", "prov": ["reaching-defs"]}, {"src": "24:4/actual_out:1", "dst": "24:4", "var": ":config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "24:4", "var": "config_reader::_read_config", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "24:4/actual_in:0", "var": "config_reader::_read_config", "prov": ["reaching-defs"]}], "summary": [{"src": "24:4/actual_in:0", "dst": "24:4/actual_out:0"}, {"src": "24:4/actual_in:0", "dst": "24:4/actual_out:1"}, {"src": "24:4/actual_in:1", "dst": "24:4/actual_out:0"}, {"src": "24:4/actual_in:1", "dst": "24:4/actual_out:1"}]}, "get_config_multi_def": {"name": "get_config_multi_def", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_config_multi_def", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)", "kind": "function", "span": {"start": [29, 0], "end": [34, 25], "bytes": [814, 952]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "use_debug", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:0", "decorators": [], "start_line": 29, "end_line": 29, "start_column": 25, "end_column": 34}], "start_line": 29, "end_line": 34, "code_start_line": 30, "accessed_symbols": [{"name": "use_debug", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 30, "col_offset": 7}, {"name": "var", "scope": "local", "kind": "variable", "type": "str", "qualified_name": "builtins.str", "is_builtin": false, "lineno": 34, "col_offset": 21}, {"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 34, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [{"name": "var", "type": "str", "initializer": "'DEBUG'", "scope": "function", "start_line": 31, "end_line": 31, "start_column": 8, "end_column": 11}, {"name": "var", "type": "str", "initializer": "'FLASK_ENV'", "scope": "function", "start_line": 33, "end_line": 33, "start_column": 8, "end_column": 11}], "cyclomatic_complexity": 3, "body": {"34:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:11", "span": {"start": [34, 11], "end": [34, 25], "bytes": [938, 952]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "34:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "inferred_type": "str", "name": "var"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@entry", "arguments": []}, "30:7": {"kind": "branch", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@30:7", "span": {"start": [30, 7], "end": [30, 16], "bytes": [858, 867]}, "arguments": []}, "31:8": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@31:8", "span": {"start": [31, 8], "end": [31, 21], "bytes": [877, 890]}, "arguments": []}, "33:8": {"kind": "statement", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@33:8", "span": {"start": [33, 8], "end": [33, 25], "bytes": [909, 926]}, "arguments": []}, "34:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:4", "span": {"start": [34, 4], "end": [34, 25], "bytes": [931, 952]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:0", "of": "use_debug", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_in:1", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "30:7", "kind": "fallthrough"}, {"src": "30:7", "dst": "31:8", "kind": "true"}, {"src": "30:7", "dst": "33:8", "kind": "false"}, {"src": "31:8", "dst": "34:4", "kind": "fallthrough"}, {"src": "33:8", "dst": "34:4", "kind": "fallthrough"}, {"src": "34:4", "dst": "@exit", "kind": "exception"}, {"src": "34:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "30:7"}, {"src": "@entry", "dst": "34:4"}, {"src": "30:7", "dst": "31:8"}, {"src": "30:7", "dst": "33:8"}], "ddg": [{"src": "@entry", "dst": "30:7", "var": "use_debug", "prov": ["ssa"]}, {"src": "@entry", "dst": "34:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "31:8", "dst": "34:4", "var": "var", "prov": ["ssa"]}, {"src": "33:8", "dst": "34:4", "var": "var", "prov": ["ssa"]}, {"src": "34:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "34:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "30:7", "var": "use_debug", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "34:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}, {"src": "31:8", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}, {"src": "33:8", "dst": "34:4", "var": "config_reader::os.getenv", "prov": ["points-to"]}], "summary": []}, "get_missing_config": {"name": "get_missing_config", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_missing_config", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()", "kind": "function", "span": {"start": [39, 0], "end": [40, 44], "bytes": [1057, 1127]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 39, "end_line": 40, "code_start_line": 40, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 40, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"40:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:11", "span": {"start": [40, 11], "end": [40, 44], "bytes": [1094, 1127]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "40:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"NOT_DEFINED_ANYWHERE\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@entry", "arguments": []}, "40:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:4", "span": {"start": [40, 4], "end": [40, 44], "bytes": [1087, 1127]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "40:4", "kind": "fallthrough"}, {"src": "40:4", "dst": "@exit", "kind": "exception"}, {"src": "40:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "40:4"}], "ddg": [{"src": "@entry", "dst": "40:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "40:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "40:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "40:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "40:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "40:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}, "get_app_mode": {"name": "get_app_mode", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/config_reader.py", "signature": "pkg.config_reader.get_app_mode", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()", "kind": "function", "span": {"start": [45, 0], "end": [46, 32], "bytes": [1263, 1315]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [], "start_line": 45, "end_line": 46, "code_start_line": 46, "accessed_symbols": [{"name": "os", "scope": "global", "kind": "module", "type": "os", "qualified_name": "os", "is_builtin": false, "lineno": 46, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"46:11": {"kind": "call", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:11", "span": {"start": [46, 11], "end": [46, 32], "bytes": [1294, 1315]}, "callee": "can://manifests_app/@external/os/getenv", "parent": "46:4", "method_name": "getenv", "receiver_expr": "os", "receiver_type": "os", "return_type": "str", "is_constructor_call": false, "arguments": [{"ast_kind": "Constant", "inferred_type": "str", "value": "\"APP_MODE\""}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@entry", "arguments": []}, "46:4": {"kind": "return", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:4", "span": {"start": [46, 4], "end": [46, 32], "bytes": [1287, 1315]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_in:0", "of": ":config_reader::os", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@formal_out:1", "of": ":config_reader::os", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "46:4", "kind": "fallthrough"}, {"src": "46:4", "dst": "@exit", "kind": "exception"}, {"src": "46:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "46:4"}], "ddg": [{"src": "@entry", "dst": "46:4", "var": "config_reader::os", "prov": ["ssa"]}, {"src": "@entry", "dst": "46:4", "var": "config_reader::os.getenv", "prov": ["ssa"]}, {"src": "46:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "46:4", "dst": "@formal_out:1", "var": "config_reader::os.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "46:4", "var": "config_reader::os", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "46:4", "var": "config_reader::os.getenv", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [], "content_hash": "5cb9d813337d9ee688d8fd4c8616f1572a926a8af912092818db2840e8173efb", "last_modified": 1788022149.635426, "file_size": 1316}, "pkg/__init__.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/__init__.py", "module_name": "__init__", "id": "can://manifests_app/python/pkg/__init__.py", "kind": "module", "source": "", "imports": [], "comments": [], "types": {}, "functions": {}, "variables": [], "content_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "last_modified": 1787982273.5935364, "file_size": 0}, "pkg/main.py": {"file_path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/main.py", "module_name": "main", "id": "can://manifests_app/python/pkg/main.py", "kind": "module", "source": "import requests\nimport colorama # deliberately undeclared\n\ndef fetch(url):\n return requests.get(url)\n", "imports": [{"module": "requests", "name": "requests", "start_line": 1, "end_line": 1, "start_column": 0, "end_column": 15}, {"module": "colorama", "name": "colorama", "start_line": 2, "end_line": 2, "start_column": 0, "end_column": 15}], "comments": [], "types": {}, "functions": {"fetch": {"name": "fetch", "path": "/Users/rkrsn/workspace/codellm-devkit/codeanalyzer-python/test/fixtures/whole_applications/manifests_app/pkg/main.py", "signature": "pkg.main.fetch", "id": "can://manifests_app/python/pkg/main.py/fetch(url)", "kind": "function", "span": {"start": [4, 0], "end": [5, 28], "bytes": [60, 104]}, "comments": [], "decorators": [], "modifiers": [], "entrypoints": [], "is_entrypoint": false, "parameters": [{"name": "url", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:0", "decorators": [], "start_line": 4, "end_line": 4, "start_column": 10, "end_column": 13}], "start_line": 4, "end_line": 5, "code_start_line": 5, "accessed_symbols": [{"name": "url", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 5, "col_offset": 24}, {"name": "requests", "scope": "local", "kind": "variable", "is_builtin": false, "lineno": 5, "col_offset": 11}], "callables": {}, "types": {}, "local_variables": [], "cyclomatic_complexity": 2, "body": {"5:11": {"kind": "call", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@5:11", "span": {"start": [5, 11], "end": [5, 28], "bytes": [87, 104]}, "callee": "can://manifests_app/@external/requests/get", "parent": "5:4", "method_name": "get", "receiver_expr": "requests", "is_constructor_call": false, "arguments": [{"ast_kind": "Name", "name": "url"}]}, "@entry": {"kind": "entry", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@entry", "arguments": []}, "5:4": {"kind": "return", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@5:4", "span": {"start": [5, 4], "end": [5, 28], "bytes": [80, 104]}, "arguments": []}, "@exit": {"kind": "exit", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@exit", "arguments": []}, "@formal_in:0": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:0", "of": "url", "arguments": []}, "@formal_in:1": {"kind": "formal_in", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_in:1", "of": ":main::requests", "arguments": []}, "@formal_out:0": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:0", "of": "", "arguments": []}, "@formal_out:1": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:1", "of": "url", "arguments": []}, "@formal_out:2": {"kind": "formal_out", "id": "can://manifests_app/python/pkg/main.py/fetch(url)@formal_out:2", "of": ":main::requests", "arguments": []}}, "cfg": [{"src": "@entry", "dst": "5:4", "kind": "fallthrough"}, {"src": "5:4", "dst": "@exit", "kind": "exception"}, {"src": "5:4", "dst": "@exit", "kind": "return"}], "cdg": [{"src": "@entry", "dst": "5:4"}], "ddg": [{"src": "@entry", "dst": "5:4", "var": "main::requests", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "main::requests.get", "prov": ["ssa"]}, {"src": "@entry", "dst": "5:4", "var": "url", "prov": ["ssa"]}, {"src": "5:4", "dst": "@formal_out:0", "var": "", "prov": ["reaching-defs"]}, {"src": "5:4", "dst": "@formal_out:1", "var": "url.*", "prov": ["reaching-defs"]}, {"src": "5:4", "dst": "@formal_out:2", "var": "main::requests.*", "prov": ["reaching-defs"]}, {"src": "@formal_in:0", "dst": "5:4", "var": "url", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "main::requests", "prov": ["reaching-defs"]}, {"src": "@formal_in:1", "dst": "5:4", "var": "main::requests.get", "prov": ["reaching-defs"]}], "summary": []}}, "variables": [], "content_hash": "b79926bf7a944073398bc31fd0342403b5d6ab478bce999a1110ab02835c16f5", "last_modified": 1787982273.5944843, "file_size": 105}}, "id": "can://manifests_app", "kind": "application", "call_graph": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_api_key()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_database_url()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()", "dst": "can://manifests_app/@external/os/getenv", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)", "weight": 1, "prov": ["jedi"]}, {"src": "can://manifests_app/python/pkg/main.py/fetch(url)", "dst": "can://manifests_app/@external/requests/get", "weight": 1, "prov": ["defuse"]}, {"src": "can://manifests_app/@external/setup", "dst": "can://manifests_app/@external/setuptools/setup", "weight": 1, "prov": ["defuse"]}], "external_symbols": {"can://manifests_app/@external/os/getenv": {"id": "can://manifests_app/@external/os/getenv", "kind": "external", "name": "getenv", "module": "os"}, "can://manifests_app/@external/requests/get": {"id": "can://manifests_app/@external/requests/get", "kind": "external", "name": "get", "module": "requests"}, "can://manifests_app/@external/setup": {"id": "can://manifests_app/@external/setup", "kind": "external", "name": "setup"}, "can://manifests_app/@external/setuptools/setup": {"id": "can://manifests_app/@external/setuptools/setup", "kind": "external", "name": "setup", "module": "setuptools"}}, "artifacts": {".env": {"id": "can://manifests_app/artifact/.env", "kind": "artifact", "path": ".env", "format": "text", "roles": ["env"], "size_bytes": 220, "sha256": "cd9177857f014776ad99f62440a101d595ea16d32592a261b92d8ad8db2807aa", "source": "# Application environment configuration\nDEBUG=true\nDATABASE_URL=\"postgresql://localhost/mydb # connection string\"\nAPI_KEY=\"${DATABASE_PASSWORD}\"\nSECRET_API_TOKEN=\"sk-12345abcdef-super-secret\"\nexport FLASK_ENV=production\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/.env@key/API_KEY", "key": "API_KEY", "namespace": "env", "value": "${DATABASE_PASSWORD}", "span": {"start": [4, 0], "end": [4, 30], "bytes": [114, 144]}, "references": ["${DATABASE_PASSWORD}"]}, {"id": "can://manifests_app/artifact/.env@key/DATABASE_URL", "key": "DATABASE_URL", "namespace": "env", "value": "postgresql://localhost/mydb # connection string", "span": {"start": [3, 0], "end": [3, 62], "bytes": [51, 113]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/DEBUG", "key": "DEBUG", "namespace": "env", "value": "true", "span": {"start": [2, 0], "end": [2, 10], "bytes": [40, 50]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/FLASK_ENV", "key": "FLASK_ENV", "namespace": "env", "value": "production", "span": {"start": [6, 0], "end": [6, 27], "bytes": [192, 219]}, "references": []}, {"id": "can://manifests_app/artifact/.env@key/SECRET_API_TOKEN", "key": "SECRET_API_TOKEN", "namespace": "env", "value": "sk-12345abcdef-super-secret", "span": {"start": [5, 0], "end": [5, 46], "bytes": [145, 191]}, "references": []}]}, ".github/workflows/ci.yml": {"id": "can://manifests_app/artifact/.github/workflows/ci.yml", "kind": "artifact", "path": ".github/workflows/ci.yml", "format": "yaml", "roles": ["ci"], "size_bytes": 18, "sha256": "1c7b515b077ae3f96d2b4fc9e2be04d69213e4e0e941e382ac85b2bcfa8302af", "source": "on: push\njobs: {}\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/.github/workflows/ci.yml@key/True", "key": "True", "namespace": "yaml", "value": "push", "references": []}]}, "Dockerfile": {"id": "can://manifests_app/artifact/Dockerfile", "kind": "artifact", "path": "Dockerfile", "format": "dockerfile", "roles": ["container-image"], "size_bytes": 61, "sha256": "8355d52cd519c25f476c55bf732311796cfa5b5b152de432b6de4da1b5b2ebc3", "source": "FROM python:3.12-slim\n\nARG BUILD_REV\nENV APP_MODE=production\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/Dockerfile@key/APP_MODE", "key": "APP_MODE", "namespace": "env", "value": "production", "span": {"start": [4, 0], "end": [4, 23], "bytes": [37, 60]}, "references": []}, {"id": "can://manifests_app/artifact/Dockerfile@key/arg.BUILD_REV", "key": "BUILD_REV", "namespace": "dockerfile", "span": {"start": [3, 0], "end": [3, 13], "bytes": [23, 36]}, "references": []}]}, "app.properties": {"id": "can://manifests_app/artifact/app.properties", "kind": "artifact", "path": "app.properties", "format": "properties", "roles": ["tool-config"], "size_bytes": 371, "sha256": "1cbb0081b3aba454de1db62a76fffff6049c303b627826a6838405597eff8438", "source": "# Application properties\napp.name=MyApplication\napp.version=1.0.0\n# Multi-line property with continuation\napp.long.description=This is a very long property value that \\\n continues on the next line with additional configuration details\nserver.port=9000\nserver.ssl=true\n# Property with interpolation reference\ndb.url=%(db.host)s:%(db.port)s\ndb.host=localhost\ndb.port=5432\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/app.properties@key/app.long.description", "key": "app.long.description", "namespace": "properties", "value": "This is a very long property value that continues on the next line with additional configuration details", "span": {"start": [5, 0], "end": [5, 62], "bytes": [106, 168]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/app.name", "key": "app.name", "namespace": "properties", "value": "MyApplication", "span": {"start": [2, 0], "end": [2, 22], "bytes": [25, 47]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/app.version", "key": "app.version", "namespace": "properties", "value": "1.0.0", "span": {"start": [3, 0], "end": [3, 17], "bytes": [48, 65]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.host", "key": "db.host", "namespace": "properties", "value": "localhost", "span": {"start": [11, 0], "end": [11, 17], "bytes": [340, 357]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.port", "key": "db.port", "namespace": "properties", "value": "5432", "span": {"start": [12, 0], "end": [12, 12], "bytes": [358, 370]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/db.url", "key": "db.url", "namespace": "properties", "value": "%(db.host)s:%(db.port)s", "span": {"start": [10, 0], "end": [10, 30], "bytes": [309, 339]}, "references": ["%(db.host)s", "%(db.port)s"]}, {"id": "can://manifests_app/artifact/app.properties@key/server.port", "key": "server.port", "namespace": "properties", "value": "9000", "span": {"start": [7, 0], "end": [7, 16], "bytes": [236, 252]}, "references": []}, {"id": "can://manifests_app/artifact/app.properties@key/server.ssl", "key": "server.ssl", "namespace": "properties", "value": "true", "span": {"start": [8, 0], "end": [8, 15], "bytes": [253, 268]}, "references": []}]}, "config/settings.yml": {"id": "can://manifests_app/artifact/config/settings.yml", "kind": "artifact", "path": "config/settings.yml", "format": "yaml", "roles": ["tool-config"], "size_bytes": 334, "sha256": "f18107a45e4a162109e551cbca84dc34a28254b7008625f5d5773226ee628c71", "source": "server:\n host: localhost\n port: 8080\n timeouts:\n connect: 30\n read: 60\ndatabase:\n primary:\n url: postgresql://db.example.com/prod\n pool_size: 10\n replicas:\n - url: postgresql://replica1.example.com/prod\n - url: postgresql://replica2.example.com/prod\nlogging:\n level: DEBUG\n handlers:\n - console\n - file\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/config/settings.yml@key/database.primary.pool_size", "key": "database.primary.pool_size", "namespace": "yaml", "value": "10", "span": {"start": [10, 0], "end": [10, 17], "bytes": [143, 160]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.primary.url", "key": "database.primary.url", "namespace": "yaml", "value": "postgresql://db.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.replicas.0.url", "key": "database.replicas.0.url", "namespace": "yaml", "value": "postgresql://replica1.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/database.replicas.1.url", "key": "database.replicas.1.url", "namespace": "yaml", "value": "postgresql://replica2.example.com/prod", "span": {"start": [9, 0], "end": [9, 41], "bytes": [101, 142]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.handlers.0", "key": "logging.handlers.0", "namespace": "yaml", "value": "console", "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.handlers.1", "key": "logging.handlers.1", "namespace": "yaml", "value": "file", "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/logging.level", "key": "logging.level", "namespace": "yaml", "value": "DEBUG", "span": {"start": [15, 0], "end": [15, 14], "bytes": [282, 296]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.host", "key": "server.host", "namespace": "yaml", "value": "localhost", "span": {"start": [2, 0], "end": [2, 17], "bytes": [8, 25]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.port", "key": "server.port", "namespace": "yaml", "value": "8080", "span": {"start": [3, 0], "end": [3, 12], "bytes": [26, 38]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.timeouts.connect", "key": "server.timeouts.connect", "namespace": "yaml", "value": "30", "span": {"start": [5, 0], "end": [5, 15], "bytes": [51, 66]}, "references": []}, {"id": "can://manifests_app/artifact/config/settings.yml@key/server.timeouts.read", "key": "server.timeouts.read", "namespace": "yaml", "value": "60", "span": {"start": [6, 0], "end": [6, 12], "bytes": [67, 79]}, "references": []}]}, "data.csv": {"id": "can://manifests_app/artifact/data.csv", "kind": "artifact", "path": "data.csv", "format": "text", "roles": ["unknown"], "size_bytes": 26, "sha256": "e7a3929e0913e80f475f937db1615bfa29484299e93ea55d8c87e92770c8078d", "source": "name,value\nalpha,1\nbeta,2\n", "extraction": "none", "config_keys": []}, "docker-compose.yml": {"id": "can://manifests_app/artifact/docker-compose.yml", "kind": "artifact", "path": "docker-compose.yml", "format": "yaml", "roles": ["service-topology"], "size_bytes": 73, "sha256": "7eb1818ce6a2b3acdaabfcb23ad26a9ab5370a376ee60da8a8105824289f8e4f", "source": "services:\n web:\n build: .\n environment:\n COMPOSE_ONLY_KEY: x\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/docker-compose.yml@key/env.COMPOSE_ONLY_KEY", "key": "COMPOSE_ONLY_KEY", "namespace": "env", "value": "x", "span": {"start": [5, 0], "end": [5, 25], "bytes": [47, 72]}, "references": []}, {"id": "can://manifests_app/artifact/docker-compose.yml@key/services.web.build", "key": "services.web.build", "namespace": "yaml", "value": ".", "span": {"start": [3, 0], "end": [3, 12], "bytes": [17, 29]}, "references": []}, {"id": "can://manifests_app/artifact/docker-compose.yml@key/services.web.environment.COMPOSE_ONLY_KEY", "key": "services.web.environment.COMPOSE_ONLY_KEY", "namespace": "yaml", "value": "x", "span": {"start": [5, 0], "end": [5, 25], "bytes": [47, 72]}, "references": []}]}, "environment.yml": {"id": "can://manifests_app/artifact/environment.yml", "kind": "artifact", "path": "environment.yml", "format": "yaml", "roles": ["dependency-manifest"], "size_bytes": 29, "sha256": "6f610dc2806830e92a47759b1152ed97c70abc8705ac318638d9781c500d76db", "source": "dependencies:\n - numpy=1.26\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/environment.yml@key/dependencies.0", "key": "dependencies.0", "namespace": "yaml", "value": "numpy=1.26", "references": []}]}, "logo.png": {"id": "can://manifests_app/artifact/logo.png", "kind": "artifact", "path": "logo.png", "format": "binary", "roles": ["unknown"], "size_bytes": 14, "sha256": "4033735c485f1e032d3414a913c885fc8824e0882c102e2fc78452707739848d", "source": "", "extraction": "none", "config_keys": []}, "pyproject.toml": {"id": "can://manifests_app/artifact/pyproject.toml", "kind": "artifact", "path": "pyproject.toml", "format": "toml", "roles": ["dependency-manifest", "tool-config"], "size_bytes": 67, "sha256": "cd62a9edff50b75a48f60af3c7bb28d8c7249b1b2033d439f7a2b1cbf880d278", "source": "[project]\nname = \"manifests-app\"\ndependencies = [\"requests>=2.31\"]\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/pyproject.toml@key/project.dependencies.0", "key": "project.dependencies.0", "namespace": "toml", "value": "requests>=2.31", "references": []}, {"id": "can://manifests_app/artifact/pyproject.toml@key/project.name", "key": "project.name", "namespace": "toml", "value": "manifests-app", "span": {"start": [2, 0], "end": [2, 22], "bytes": [10, 32]}, "references": []}]}, "requirements-dev.txt": {"id": "can://manifests_app/artifact/requirements-dev.txt", "kind": "artifact", "path": "requirements-dev.txt", "format": "requirements", "roles": ["dependency-manifest"], "size_bytes": 10, "sha256": "e5d9943702bb51c0b13a5891bf396d41a5b0d269f583ad57534e5021a32af50d", "source": "pytest>=8\n", "extraction": "full", "config_keys": []}, "setup.py": {"id": "can://manifests_app/artifact/setup.py", "kind": "artifact", "path": "setup.py", "format": "text", "roles": ["dependency-manifest"], "size_bytes": 84, "sha256": "8523b7707314c71d565a381c02335a85c98e011b056e2e249cde190336510bec", "source": "from setuptools import setup\nextra = compute_extras()\nsetup(install_requires=extra)\n", "extraction": "partial", "config_keys": []}, "uv.lock": {"id": "can://manifests_app/artifact/uv.lock", "kind": "artifact", "path": "uv.lock", "format": "toml", "roles": ["dependency-manifest"], "size_bytes": 49, "sha256": "672f187467ab259fbf4562218f09ef721369748cc077c1dab594aa9067c4fd0c", "source": "[[package]]\nname = \"requests\"\nversion = \"2.32.3\"\n", "extraction": "full", "config_keys": [{"id": "can://manifests_app/artifact/uv.lock@key/package.0.name", "key": "package.0.name", "namespace": "toml", "value": "requests", "span": {"start": [2, 0], "end": [2, 17], "bytes": [12, 29]}, "references": []}, {"id": "can://manifests_app/artifact/uv.lock@key/package.0.version", "key": "package.0.version", "namespace": "toml", "value": "2.32.3", "span": {"start": [3, 0], "end": [3, 18], "bytes": [30, 48]}, "references": []}]}}, "dependencies": [{"name": "numpy", "ecosystem": "pypi", "spec": "=1.26", "kind": "runtime", "extras": [], "declared_in": "can://manifests_app/artifact/environment.yml", "direct": true, "provides_imports": [], "prov": ["declared"]}, {"name": "pytest", "ecosystem": "pypi", "spec": ">=8", "kind": "dev", "extras": [], "declared_in": "can://manifests_app/artifact/requirements-dev.txt", "direct": true, "provides_imports": [], "prov": ["declared"]}, {"name": "requests", "ecosystem": "pypi", "spec": ">=2.31", "kind": "runtime", "extras": [], "declared_in": "can://manifests_app/artifact/pyproject.toml", "direct": true, "locked_version": "2.32.3", "provides_imports": ["requests"], "prov": ["declared", "lockfile"]}], "unresolved_imports": [{"module": "colorama", "prov": []}, {"module": "setuptools", "prov": []}], "entrypoint_report": {"frameworks_detected": [], "rulesets": ["shipped"], "unresolved": {}, "errors": []}, "repository": {"uri": "git@github.com:codellm-devkit/codeanalyzer-python.git", "revision": "90cb3de61ccbaa7d01cd46044350e99a45b55aa8", "dirty": false}, "param_in": [{"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:0", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:0", "var": "name"}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_in:1", "dst": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_in:1", "var": ":config_reader::os"}], "param_out": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:0", "dst": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:0", "var": ""}, {"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@formal_out:2", "dst": "can://manifests_app/python/pkg/config_reader.py/get_secret_token()@24:4/actual_out:1", "var": ":config_reader::os"}], "config_uses": [{"src": "can://manifests_app/python/pkg/config_reader.py/_read_config(name)@20:11", "dst": "can://manifests_app/artifact/.env@key/SECRET_API_TOKEN", "prov": ["dataflow"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_api_key()@14:11", "dst": "can://manifests_app/artifact/.env@key/API_KEY", "prov": ["dataflow"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_app_mode()@46:11", "dst": "can://manifests_app/artifact/Dockerfile@key/APP_MODE", "prov": ["literal"]}, {"src": "can://manifests_app/python/pkg/config_reader.py/get_database_url()@7:11", "dst": "can://manifests_app/artifact/.env@key/DATABASE_URL", "prov": ["literal"]}], "config_reads_unresolved": [{"site": "can://manifests_app/python/pkg/config_reader.py/get_config_multi_def(use_debug)@34:11", "callee": "can://manifests_app/@external/os/getenv", "reason": "non-literal", "prov": ["literal", "dataflow"]}, {"site": "can://manifests_app/python/pkg/config_reader.py/get_missing_config()@40:11", "callee": "can://manifests_app/@external/os/getenv", "key": "NOT_DEFINED_ANYWHERE", "reason": "undefined-key", "prov": ["literal", "dataflow"]}]}} \ No newline at end of file diff --git a/v2/json/python/analysis.schema.json b/v2/json/python/analysis.schema.json index 0de8fe1..0b185b1 100644 --- a/v2/json/python/analysis.schema.json +++ b/v2/json/python/analysis.schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://codellm-devkit.github.io/schema/v2/python/analysis.schema.json", "title": "codeanalyzer-python v2 analysis output", - "description": "What codeanalyzer-python (canpy) v1.4.0 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction. Property names are the Pydantic field names; the payload is dumped with exclude_none, so an optional fact is absent rather than null, and the internal `call_sites` list is stripped at emit time.", + "description": "What codeanalyzer-python (canpy) v1.5.4 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction. Property names are the Pydantic field names; the payload is dumped with exclude_none, so an optional fact is absent rather than null, and the internal `call_sites` list is stripped at emit time.", "x-cldk": { "schemaVersion": "2.0.0", "language": "python", diff --git a/v2/json/typescript/analysis.l4.sample.json b/v2/json/typescript/analysis.l4.sample.json index 7fc3b53..83458a1 100644 --- a/v2/json/typescript/analysis.l4.sample.json +++ b/v2/json/typescript/analysis.l4.sample.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.6.0"},"application":{"id":"can://sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://sample-app/typescript/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42,"resolved_module":"src/services.ts"}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"types":{"UserController":{"id":"can://sample-app/typescript/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"show":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://sample-app/typescript/src/models.ts/User/describe","method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://sample-app/typescript/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_out"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_in:0"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_out"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"20:5","kind":"fallthrough"},{"src":"20:5","dst":"@exit","kind":"exception"},{"src":"20:5","dst":"21:5","kind":"fallthrough"},{"src":"21:5","dst":"@exit","kind":"exception"},{"src":"21:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:5"},{"src":"20:5","dst":"21:5"}],"ddg":[{"src":"@entry","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"this.service.create","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"20:5/actual_out","dst":"20:5","var":"$ret","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"21:5/actual_out","dst":"21:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"20:5","dst":"20:5","var":"src/services.nextId"},{"src":"20:5/actual_in:0","dst":"20:5/actual_out"}]},"list":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://sample-app/typescript/src/services.ts/UserService/describeAll","method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/list@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"this.service.describeAll","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52,"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"service","id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://sample-app/typescript/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35,"id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@exit"},"@formal_in:0":{"kind":"formal_in","of":"prefix","id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Controller/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[{"src":"5:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Get":{"id":"can://sample-app/typescript/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26,"id":"can://sample-app/typescript/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://sample-app/typescript/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://sample-app/typescript/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://sample-app/typescript/src/controllers.ts/Get@exit"},"@formal_in:0":{"kind":"formal_in","of":"path","id":"can://sample-app/typescript/src/controllers.ts/Get@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Get@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Get/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[{"src":"8:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Param":{"id":"can://sample-app/typescript/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28,"id":"can://sample-app/typescript/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://sample-app/typescript/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://sample-app/typescript/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://sample-app/typescript/src/controllers.ts/Param@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/controllers.ts/Param@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Param@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Param/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[{"src":"11:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"11:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/external-calls.ts":{"id":"can://sample-app/typescript/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3113]},"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"types":{},"functions":{"readsConfig":{"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"15:10":{"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[942,977]},"callee":"can://sample-app/@external/node:fs/readFileSync","method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:10"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@entry"},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,46],"bytes":[935,978]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3"},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@formal_out"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_in:0"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_out"},"15:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"},{"src":"15:3/actual_in:1","dst":"15:3/actual_out"}]},"makesCommand":{"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand","kind":"function","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"27:15":{"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1625,1638]},"callee":"can://sample-app/@external/commander/Command","method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@27:15"},"28:3":{"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1642,1677]},"callee":"can://sample-app/@external/commander/description","method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3"},"28:3/2":{"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1642,1657]},"callee":"can://sample-app/@external/commander/name","method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/2"},"29:3":{"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1681,1710]},"callee":"can://sample-app/@external/commander/parse","method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3"},"@entry":{"kind":"entry","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@entry"},"27:3":{"kind":"statement","span":{"start":[27,3],"end":[27,29],"bytes":[1613,1639]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@27:3"},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,14],"bytes":[1714,1725]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@30:3"},"@exit":{"kind":"exit","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@formal_out"},"28:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"28:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/actual_in:0"},"28:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"28:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/actual_out"},"29:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"29:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3/actual_in:0"},"29:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"29:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"27:3","kind":"fallthrough"},{"src":"27:3","dst":"@exit","kind":"exception"},{"src":"27:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"@exit","kind":"exception"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"27:3"},{"src":"27:3","dst":"28:3"},{"src":"28:3","dst":"29:3"},{"src":"29:3","dst":"30:3"}],"ddg":[{"src":"27:3","dst":"28:3","var":"cmd.name","prov":["reaching-defs"]},{"src":"27:3","dst":"29:3","var":"cmd.parse","prov":["reaching-defs"]},{"src":"27:3","dst":"30:3","var":"cmd","prov":["reaching-defs"]},{"src":"30:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"28:3/actual_in:0","dst":"28:3/actual_out"},{"src":"29:3/actual_in:0","dst":"29:3/actual_out"}]},"makesDriver":{"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver","kind":"function","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"39:10":{"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2058,2090]},"callee":"can://sample-app/@external/neo4j-driver/driver","method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:10"},"@entry":{"kind":"entry","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@entry"},"39:3":{"kind":"statement","span":{"start":[39,3],"end":[39,43],"bytes":[2051,2091]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3"},"@exit":{"kind":"exit","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@formal_out"},"39:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"39:3","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3/actual_in:0"},"39:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"39:3","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"39:3","kind":"fallthrough"},{"src":"39:3","dst":"@exit","kind":"exception"},{"src":"39:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"39:3"}],"ddg":[{"src":"39:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"39:3/actual_in:0","dst":"39:3/actual_out"}]},"makesSession":{"id":"can://sample-app/typescript/src/external-calls.ts/makesSession","kind":"function","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"52:13":{"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2822,2888]},"callee":"can://sample-app/@external/neo4j-driver/driver","method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:13"},"52:46":{"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2855,2887]},"callee":"can://sample-app/@external/neo4j-driver/basic","method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:46"},"53:13":{"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2902,2913]},"callee":"can://sample-app/@external/neo4j-driver-core/session","method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@53:13"},"54:3":{"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2917,2930]},"callee":"can://sample-app/@external/neo4j-driver/rxSession","method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@54:3"},"@entry":{"kind":"entry","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@entry"},"52:3":{"kind":"statement","span":{"start":[52,3],"end":[52,80],"bytes":[2812,2889]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3"},"53:3":{"kind":"statement","span":{"start":[53,3],"end":[53,25],"bytes":[2892,2914]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@53:3"},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[55,12],"bytes":[2934,2943]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@55:3"},"@exit":{"kind":"exit","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@formal_out"},"52:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_in:0"},"52:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_out"},"52:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"52:3","kind":"fallthrough"},{"src":"52:3","dst":"@exit","kind":"exception"},{"src":"52:3","dst":"53:3","kind":"fallthrough"},{"src":"53:3","dst":"@exit","kind":"exception"},{"src":"53:3","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"@exit","kind":"exception"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"52:3"},{"src":"52:3","dst":"53:3"},{"src":"53:3","dst":"54:3"},{"src":"54:3","dst":"55:3"}],"ddg":[{"src":"52:3","dst":"53:3","var":"d.session","prov":["reaching-defs"]},{"src":"52:3","dst":"54:3","var":"d.rxSession","prov":["reaching-defs"]},{"src":"53:3","dst":"55:3","var":"s","prov":["reaching-defs"]},{"src":"55:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"52:3/actual_in:0","dst":"52:3/actual_out"},{"src":"52:3/actual_in:1","dst":"52:3/actual_out"}]},"unsafeEval":{"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval","kind":"function","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39,"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_in:0"}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"60:10":{"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3100,3109]},"callee":"can://sample-app/@external/(builtin)/eval","method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:10"},"@entry":{"kind":"entry","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@entry"},"60:3":{"kind":"statement","span":{"start":[60,3],"end":[60,20],"bytes":[3093,3110]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3"},"@exit":{"kind":"exit","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@exit"},"@formal_in:0":{"kind":"formal_in","of":"raw","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_out"},"60:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"60:3","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3/actual_in:0"},"60:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"60:3","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"60:3","kind":"fallthrough"},{"src":"60:3","dst":"@exit","kind":"exception"},{"src":"60:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"60:3"}],"ddg":[{"src":"@entry","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"60:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"60:3/actual_in:0","dst":"60:3/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"7c9b89100d76783724926bea24ee54872043defa3b9133eab7c34e45cf145700"},"src/external.ts":{"id":"can://sample-app/typescript/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,582]},"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"types":{},"functions":{"fingerprint":{"id":"can://sample-app/typescript/src/external.ts/fingerprint","kind":"function","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41,"id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:14":{"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[342,354]},"callee":"can://sample-app/@external/node:crypto/randomUUID","method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@7:14"},"8:10":{"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[365,427]},"callee":null,"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10"},"8:10/2":{"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[365,408]},"callee":null,"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10/2"},"8:10/3":{"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[365,385]},"callee":"can://sample-app/@external/node:crypto/createHash","method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10/3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,27],"bytes":[331,355]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@7:3"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[10,20],"bytes":[358,428]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_out"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"id","prov":["reaching-defs"]},{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:3/actual_in:0","dst":"8:3/actual_out"}]},"extensionOf":{"id":"can://sample-app/typescript/src/external.ts/extensionOf","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41,"id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"15:10":{"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[560,578]},"callee":"can://sample-app/@external/node:path/extname","method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/extensionOf@15:10"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@entry"},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,29],"bytes":[553,579]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3"},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"file","id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_out"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3","id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3/actual_in:0"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3","id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"049a7393ffc7647fcab8ddeadb0eb82f74c57a385195aec4a4f0700ebf9c88c0"},"src/index.ts":{"id":"can://sample-app/typescript/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,742]},"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://sample-app/typescript/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://sample-app/typescript/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://sample-app/typescript/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/show","method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[503,543]},"callee":"can://sample-app/typescript/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[512,542]},"callee":"can://sample-app/typescript/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[547,574]},"callee":"can://sample-app/typescript/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[556,573]},"callee":"can://sample-app/typescript/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[592,627]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[647,671]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[675,708]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[675,700]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[675,691]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[712,729]},"callee":"can://sample-app/@external/(builtin)/log","method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://sample-app/typescript/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://sample-app/typescript/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://sample-app/typescript/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[579,628]},"id":"can://sample-app/typescript/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[631,672]},"id":"can://sample-app/typescript/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://sample-app/typescript/src/index.ts/main@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/index.ts/main@formal_out"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3","id":"can://sample-app/typescript/src/index.ts/main@11:3/actual_out"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3","id":"can://sample-app/typescript/src/index.ts/main@12:3/actual_out"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3","id":"can://sample-app/typescript/src/index.ts/main@13:3/actual_out"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3","id":"can://sample-app/typescript/src/index.ts/main@7:3/actual_in:0"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_out"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:1"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3","id":"can://sample-app/typescript/src/index.ts/main@11:3/actual_in:0"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3","id":"can://sample-app/typescript/src/index.ts/main@13:3/actual_in:0"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:1"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:2"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3","id":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3","id":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:0"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_out"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:1"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3","id":"can://sample-app/typescript/src/index.ts/main@21:3/actual_in:0"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3","id":"can://sample-app/typescript/src/index.ts/main@22:3/actual_in:0"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3","id":"can://sample-app/typescript/src/index.ts/main@22:3/actual_out"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3","id":"can://sample-app/typescript/src/index.ts/main@7:3/actual_out"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3","id":"can://sample-app/typescript/src/index.ts/main@9:3/actual_out"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3","id":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"12:3","kind":"fallthrough"},{"src":"12:3","dst":"@exit","kind":"exception"},{"src":"12:3","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"exception"},{"src":"16:3","dst":"17:3","kind":"fallthrough"},{"src":"17:3","dst":"@exit","kind":"exception"},{"src":"17:3","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"21:3","kind":"fallthrough"},{"src":"21:3","dst":"@exit","kind":"exception"},{"src":"21:3","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"@exit","kind":"exception"},{"src":"22:3","dst":"@exit","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"11:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"11:3","dst":"12:3"},{"src":"12:3","dst":"13:3"},{"src":"13:3","dst":"16:3"},{"src":"16:3","dst":"17:3"},{"src":"17:3","dst":"19:3"},{"src":"19:3","dst":"20:3"},{"src":"20:3","dst":"21:3"},{"src":"21:3","dst":"22:3"},{"src":"7:3","dst":"8:3"},{"src":"8:3","dst":"9:3"},{"src":"9:3","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"8:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"9:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"11:3","dst":"12:3","var":"controller.list","prov":["reaching-defs"]},{"src":"11:3","dst":"13:3","var":"controller.show","prov":["reaching-defs"]},{"src":"11:3/actual_out","dst":"11:3","var":"$ret","prov":["reaching-defs"]},{"src":"12:3/actual_out","dst":"12:3","var":"$ret","prov":["reaching-defs"]},{"src":"13:3/actual_out","dst":"13:3","var":"$ret","prov":["reaching-defs"]},{"src":"16:3/actual_out","dst":"16:3","var":"$ret","prov":["reaching-defs"]},{"src":"17:3/actual_out","dst":"17:3","var":"$ret","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"19:3/actual_out","dst":"19:3","var":"$ret","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"21:3/actual_out","dst":"21:3","var":"$ret","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3/actual_in:0","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"service.create","prov":["reaching-defs"]},{"src":"7:3","dst":"9:3","var":"service.createGuest","prov":["reaching-defs"]},{"src":"7:3/actual_out","dst":"7:3","var":"$ret","prov":["reaching-defs"]},{"src":"8:3/actual_out","dst":"8:3","var":"$ret","prov":["reaching-defs"]},{"src":"9:3/actual_out","dst":"9:3","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"13:3","dst":"13:3","var":"src/services.nextId"},{"src":"13:3/actual_in:0","dst":"13:3/actual_out"},{"src":"16:3/actual_in:0","dst":"16:3/actual_out"},{"src":"17:3/actual_in:0","dst":"17:3/actual_out"},{"src":"19:3/actual_in:0","dst":"19:3/actual_out"},{"src":"19:3/actual_in:1","dst":"19:3/actual_out"},{"src":"22:3/actual_in:0","dst":"22:3/actual_out"},{"src":"8:3","dst":"8:3","var":"src/services.nextId"},{"src":"8:3/actual_in:0","dst":"8:3/actual_out"},{"src":"8:3/actual_in:1","dst":"8:3/actual_out"},{"src":"9:3","dst":"9:3","var":"src/services.nextId"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://sample-app/typescript/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1237]},"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"types":{"Entity":{"id":"can://sample-app/typescript/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://sample-app/typescript/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37,"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"id":"can://sample-app/typescript/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://sample-app/typescript/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://sample-app/typescript/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://sample-app/typescript/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://sample-app/typescript/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://sample-app/typescript/src/models.ts/User/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"49:5","kind":"fallthrough"},{"src":"49:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"49:5"}],"ddg":[{"src":"@entry","dst":"49:5","var":"this.name","prov":["reaching-defs"]},{"src":"@entry","dst":"49:5","var":"this.role","prov":["reaching-defs"]},{"src":"49:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"recordLogin":{"id":"can://sample-app/typescript/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/recordLogin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"53:5","kind":"fallthrough"},{"src":"53:5","dst":"54:5","kind":"fallthrough"},{"src":"54:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"53:5"},{"src":"@entry","dst":"54:5"}],"ddg":[{"src":"@entry","dst":"53:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"@entry","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"53:5","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"54:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0"},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1"},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://sample-app/typescript/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1"},"@formal_in:2":{"kind":"formal_in","of":"role","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5","id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_out"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5","id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_in:0"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"@exit","kind":"exception"},{"src":"40:5","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"40:5"},{"src":"40:5","dst":"41:5"}],"ddg":[{"src":"@entry","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"40:5/actual_out","dst":"40:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"id":"can://sample-app/typescript/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/isAdmin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"45:5","kind":"fallthrough"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"45:5"}],"ddg":[{"src":"@entry","dst":"45:5","var":"this.role","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{"loginCount":{"id":"can://sample-app/typescript/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://sample-app/typescript/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://sample-app/typescript/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://sample-app/typescript/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://sample-app/typescript/src/models.ts/Entity"],"implements_ids":["can://sample-app/typescript/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://sample-app/typescript/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1099,1236]},"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1202,1230]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Robot/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"62:5","kind":"fallthrough"},{"src":"62:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"62:5"}],"ddg":[{"src":"@entry","dst":"62:5","var":"this.name","prov":["reaching-defs"]},{"src":"62:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34,"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"id":"can://sample-app/typescript/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://sample-app/typescript/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://sample-app/typescript/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"callables":{},"fields":{"id":{"id":"can://sample-app/typescript/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://sample-app/typescript/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://sample-app/typescript/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://sample-app/typescript/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://sample-app/typescript/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://sample-app/typescript/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://sample-app/typescript/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://sample-app/typescript/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://sample-app/typescript/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://sample-app/typescript/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://sample-app/typescript/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://sample-app/typescript/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1240]},"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"types":{"UserService":{"id":"can://sample-app/typescript/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[558,1239]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://sample-app/typescript/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22,"id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0"},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48,"id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[744,784]},"callee":"can://sample-app/typescript/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[803,827]},"callee":"can://sample-app/typescript/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[833,854]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[733,785]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[790,828]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[860,872]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"role","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_out"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_out"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_in:0"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:0"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:1"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:2"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5/actual_in:0"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"25:5","kind":"fallthrough"},{"src":"25:5","dst":"@exit","kind":"exception"},{"src":"25:5","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"27:5","kind":"fallthrough"},{"src":"27:5","dst":"@exit","kind":"exception"},{"src":"27:5","dst":"28:5","kind":"fallthrough"},{"src":"28:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:5"},{"src":"25:5","dst":"26:5"},{"src":"26:5","dst":"27:5"},{"src":"27:5","dst":"28:5"}],"ddg":[{"src":"@entry","dst":"25:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@entry","dst":"27:5","var":"this.users.push","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5/actual_in:1","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5/actual_in:2","var":"role","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"25:5/actual_out","dst":"25:5","var":"$ret","prov":["reaching-defs"]},{"src":"26:5","dst":"27:5","var":"user","prov":["reaching-defs"]},{"src":"26:5","dst":"28:5","var":"user","prov":["reaching-defs"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]},{"src":"28:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"25:5/actual_in:0","dst":"25:5/actual_out"},{"src":"27:5/actual_in:0","dst":"27:5/actual_out"}]},"createGuest":{"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[919,951]},"callee":"can://sample-app/typescript/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[964,993]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[906,952]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[957,994]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@formal_out"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_out"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_out"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_in:0"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:0"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"32:5","kind":"fallthrough"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"32:5","dst":"33:5","kind":"fallthrough"},{"src":"33:5","dst":"@exit","kind":"exception"},{"src":"33:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"32:5"},{"src":"32:5","dst":"33:5"}],"ddg":[{"src":"@entry","dst":"32:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"32:5/actual_in:0","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"this.create","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5","var":"name","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5/actual_in:0","var":"name","prov":["reaching-defs"]},{"src":"32:5/actual_out","dst":"32:5","var":"$ret","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"33:5/actual_out","dst":"33:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"32:5/actual_in:0","dst":"32:5/actual_out"},{"src":"33:5","dst":"33:5","var":"src/services.nextId"},{"src":"33:5/actual_in:0","dst":"33:5/actual_out"},{"src":"33:5/actual_in:1","dst":"33:5/actual_out"}]},"describeAll":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1039,1074]},"callee":"can://sample-app/@external/(builtin)/map","method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1032,1075]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@formal_out"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5/actual_in:0"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5/actual_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1061,1073]},"callee":"can://sample-app/typescript/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@exit"},"@formal_in:0":{"kind":"formal_in","of":"u","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_out"},"37:34/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:34","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"37:34","kind":"fallthrough"},{"src":"37:34","dst":"@exit","kind":"exception"},{"src":"37:34","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:34"}],"ddg":[{"src":"@entry","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"37:34/actual_out","dst":"37:34","var":"$ret","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"37:5","kind":"fallthrough"},{"src":"37:5","dst":"@exit","kind":"exception"},{"src":"37:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:5"}],"ddg":[{"src":"@entry","dst":"37:5","var":"this.users.map","prov":["reaching-defs"]},{"src":"37:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"37:5/actual_in:0","dst":"37:5/actual_out"}]},"loginAll":{"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1193,1208]},"callee":"can://sample-app/typescript/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1123,1137]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1142,1215]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1178,1209]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1220,1233]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@formal_out"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7","id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"43:7","kind":"true"},{"src":"42:5","dst":"45:5","kind":"false"},{"src":"43:7","dst":"@exit","kind":"exception"},{"src":"43:7","dst":"42:5","kind":"loop_back"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"41:5"},{"src":"@entry","dst":"42:5"},{"src":"42:5","dst":"43:7"},{"src":"42:5","dst":"45:5"},{"src":"43:7","dst":"42:5"}],"ddg":[{"src":"@entry","dst":"42:5","var":"this.users","prov":["reaching-defs"]},{"src":"41:5","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"41:5","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"42:5","dst":"43:7","var":"u.recordLogin","prov":["reaching-defs"]},{"src":"43:7","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"43:7","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"43:7/actual_out","dst":"43:7","var":"$ret","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51,"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"startId","id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"id":"can://sample-app/typescript/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[587,614]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://sample-app/typescript/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://sample-app/typescript/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43,"id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[164,187]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@exit"},"@formal_in:0":{"kind":"formal_in","of":"seed","id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"id":"can://sample-app/typescript/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38,"id":"can://sample-app/typescript/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[407,423]},"callee":"can://sample-app/typescript/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://sample-app/typescript/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[400,424]},"id":"can://sample-app/typescript/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://sample-app/typescript/src/services.ts/announce@exit"},"@formal_in:0":{"kind":"formal_in","of":"thing","id":"can://sample-app/typescript/src/services.ts/announce@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/announce@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"id":"can://sample-app/typescript/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[518,555]},"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33,"id":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[550,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@exit"},"@formal_in:0":{"kind":"formal_in","of":"n","id":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/nextId@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"17:46","kind":"fallthrough"},{"src":"17:46","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:46"}],"ddg":[{"src":"@entry","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://sample-app/typescript/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"types":{"StringUtil":{"id":"can://sample-app/typescript/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"types":{"Builder":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@exit"},"@formal_in:0":{"kind":"formal_in","of":"part","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_out"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"14:7","kind":"fallthrough"},{"src":"14:7","dst":"@exit","kind":"exception"},{"src":"14:7","dst":"15:7","kind":"fallthrough"},{"src":"15:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:7"},{"src":"14:7","dst":"15:7"}],"ddg":[{"src":"@entry","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@entry","dst":"14:7","var":"this.parts.push","prov":["reaching-defs"]},{"src":"@entry","dst":"15:7","var":"this","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7/actual_in:0","var":"part","prov":["reaching-defs"]},{"src":"14:7/actual_out","dst":"14:7","var":"$ret","prov":["reaching-defs"]},{"src":"15:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"14:7/actual_in:0","dst":"14:7/actual_out"}]},"build":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://sample-app/@external/(builtin)/join","method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@formal_out"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"18:7","kind":"fallthrough"},{"src":"18:7","dst":"@exit","kind":"exception"},{"src":"18:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"18:7"}],"ddg":[{"src":"@entry","dst":"18:7","var":"this.parts.join","prov":["reaching-defs"]},{"src":"18:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"18:7/actual_in:0","dst":"18:7/actual_out"}]},"constructor":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0"},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://sample-app/@external/(builtin)/repeat","method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"n","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_out"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_in:0"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5/actual_in:0","var":"n","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"4:5/actual_out","dst":"4:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://sample-app/@external/(builtin)/replace","method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://sample-app/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_in:0"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_out"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:5","kind":"fallthrough"},{"src":"8:5","dst":"@exit","kind":"exception"},{"src":"8:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"8:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:5/actual_in:0","dst":"8:5/actual_out"},{"src":"8:5/actual_in:1","dst":"8:5/actual_out"}]}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://sample-app/typescript/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64,"id":"can://sample-app/typescript/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://sample-app/typescript/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://sample-app/typescript/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://sample-app/typescript/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://sample-app/typescript/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://sample-app/typescript/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://sample-app/typescript/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://sample-app/typescript/src/util.ts/classify@exit"},"@formal_in:0":{"kind":"formal_in","of":"items","id":"can://sample-app/typescript/src/util.ts/classify@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/classify@formal_out"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5","id":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_in:0"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5","id":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_out"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5","id":"can://sample-app/typescript/src/util.ts/classify@31:5/actual_in:0"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5","id":"can://sample-app/typescript/src/util.ts/classify@31:5/actual_out"}},"callables":{"keyOf":{"id":"can://sample-app/typescript/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25,"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://sample-app/@external/(builtin)/charAt","method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"item","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_out"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5/actual_in:0"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"26:5/actual_in:0","dst":"26:5/actual_out"}]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"30:5","kind":"true"},{"src":"29:3","dst":"33:3","kind":"false"},{"src":"30:5","dst":"@exit","kind":"exception"},{"src":"30:5","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"29:3","kind":"loop_back"},{"src":"33:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:3"},{"src":"25:3","dst":"28:3"},{"src":"25:3","dst":"29:3"},{"src":"29:3","dst":"30:5"},{"src":"29:3","dst":"33:3"},{"src":"30:5","dst":"31:5"},{"src":"31:5","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"28:3","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"28:3","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5/actual_in:0","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"31:5","var":"item","prov":["reaching-defs"]},{"src":"30:5","dst":"31:5","var":"k","prov":["reaching-defs"]},{"src":"30:5/actual_out","dst":"30:5","var":"$ret","prov":["reaching-defs"]},{"src":"31:5","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"31:5","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"33:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"30:5/actual_in:0","dst":"30:5/actual_out"},{"src":"31:5/actual_in:0","dst":"31:5/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://sample-app/typescript/src/controllers.ts","dst":"can://sample-app/typescript/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts","dst":"can://sample-app/typescript/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/readsConfig","dst":"can://sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesDriver","dst":"can://sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/unsafeEval","dst":"can://sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/fingerprint","dst":"can://sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/fingerprint","dst":"can://sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/extensionOf","dst":"can://sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/models.ts/User/constructor","dst":"can://sample-app/typescript/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/typescript/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/typescript/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest","dst":"can://sample-app/typescript/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll","dst":"can://sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/loginAll","dst":"can://sample-app/typescript/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify","dst":"can://sample-app/typescript/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify/keyOf","dst":"can://sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","dst":"can://sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug","dst":"can://sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug","dst":"can://sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","dst":"can://sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list","dst":"can://sample-app/typescript/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@11:3/actual_in:0","dst":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0","var":"service"},{"src":"can://sample-app/typescript/src/index.ts/main@13:3","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/index.ts/main@13:3/actual_in:0","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/announce@formal_in:0","var":"thing"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:1","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:2","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2","var":"role"},{"src":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/announce@formal_in:0","var":"thing"},{"src":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0","var":"s"},{"src":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:1","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1","var":"n"},{"src":"can://sample-app/typescript/src/index.ts/main@21:3/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0","var":"part"},{"src":"can://sample-app/typescript/src/index.ts/main@7:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0","var":"startId"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:1","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1","var":"role"},{"src":"can://sample-app/typescript/src/index.ts/main@9:3","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0","var":"n"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1","var":"name"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2","var":"role"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0","var":"seed"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1","var":"role"},{"src":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0","var":"item"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0","var":"s"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0","var":"s"}],"param_out":[{"src":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@11:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@12:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@13:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_out","dst":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/describe@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/describe@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/recordLogin@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/announce@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/announce@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/nextId@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@7:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@8:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@9:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_out","dst":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@19:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_out","var":"$ret"}],"artifacts":{"package.json":{"id":"can://sample-app/artifact/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://sample-app/artifact/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[{"module":"commander","prov":[]},{"module":"neo4j-driver","prov":[]}],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":["commander"],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://sample-app/@external/node:fs/readFileSync":{"id":"can://sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://sample-app/@external/commander/Command":{"id":"can://sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://sample-app/@external/commander/description":{"id":"can://sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://sample-app/@external/commander/name":{"id":"can://sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://sample-app/@external/commander/parse":{"id":"can://sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://sample-app/@external/neo4j-driver/driver":{"id":"can://sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://sample-app/@external/neo4j-driver/basic":{"id":"can://sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://sample-app/@external/neo4j-driver-core/session":{"id":"can://sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://sample-app/@external/neo4j-driver/rxSession":{"id":"can://sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://sample-app/@external/(builtin)/eval":{"id":"can://sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://sample-app/@external/node:crypto/randomUUID":{"id":"can://sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://sample-app/@external/node:crypto/createHash":{"id":"can://sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://sample-app/@external/node:path/extname":{"id":"can://sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://sample-app/@external/(builtin)/log":{"id":"can://sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://sample-app/@external/(builtin)/push":{"id":"can://sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://sample-app/@external/(builtin)/map":{"id":"can://sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://sample-app/@external/(builtin)/charAt":{"id":"can://sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://sample-app/@external/(builtin)/repeat":{"id":"can://sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://sample-app/@external/(builtin)/replace":{"id":"can://sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://sample-app/@external/(builtin)/toLowerCase":{"id":"can://sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://sample-app/@external/(builtin)/join":{"id":"can://sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://sample-app/typescript/src/controllers.ts/Controller@5:10":{"id":"can://sample-app/typescript/src/controllers.ts/Controller/","kind":"callable"},"can://sample-app/typescript/src/controllers.ts/Get@8:10":{"id":"can://sample-app/typescript/src/controllers.ts/Get/","kind":"callable"},"can://sample-app/typescript/src/controllers.ts/Param@11:10":{"id":"can://sample-app/typescript/src/controllers.ts/Param/","kind":"callable"},"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:27":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.6.3"},"application":{"id":"can://sample-app","name":"sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://sample-app/typescript/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42,"resolved_module":"src/services.ts"}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"types":{"UserController":{"id":"can://sample-app/typescript/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"show":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://sample-app/typescript/src/models.ts/User/describe","method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://sample-app/typescript/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/show@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_out"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_in:0"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_out"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"20:5","kind":"fallthrough"},{"src":"20:5","dst":"@exit","kind":"exception"},{"src":"20:5","dst":"21:5","kind":"fallthrough"},{"src":"21:5","dst":"@exit","kind":"exception"},{"src":"21:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:5"},{"src":"20:5","dst":"21:5"}],"ddg":[{"src":"@entry","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"this.service.create","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"20:5/actual_out","dst":"20:5","var":"$ret","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"21:5/actual_out","dst":"21:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"20:5","dst":"20:5","var":"src/services.nextId"},{"src":"20:5/actual_in:0","dst":"20:5/actual_out"}]},"list":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://sample-app/typescript/src/services.ts/UserService/describeAll","method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/list@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/list@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"this.service.describeAll","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52,"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"service","id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"id":"can://sample-app/typescript/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://sample-app/typescript/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35,"id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://sample-app/typescript/src/controllers.ts/Controller@exit"},"@formal_in:0":{"kind":"formal_in","of":"prefix","id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Controller@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://sample-app/typescript/src/controllers.ts/Controller/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Controller/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[{"src":"5:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Get":{"id":"can://sample-app/typescript/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26,"id":"can://sample-app/typescript/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://sample-app/typescript/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://sample-app/typescript/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://sample-app/typescript/src/controllers.ts/Get@exit"},"@formal_in:0":{"kind":"formal_in","of":"path","id":"can://sample-app/typescript/src/controllers.ts/Get@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Get@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://sample-app/typescript/src/controllers.ts/Get/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Get/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[{"src":"8:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Param":{"id":"can://sample-app/typescript/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28,"id":"can://sample-app/typescript/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://sample-app/typescript/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://sample-app/typescript/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://sample-app/typescript/src/controllers.ts/Param@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/controllers.ts/Param@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Param@formal_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://sample-app/typescript/src/controllers.ts/Param/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/controllers.ts/Param/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[{"src":"11:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"11:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/external-calls.ts":{"id":"can://sample-app/typescript/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3113]},"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"types":{},"functions":{"readsConfig":{"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"15:10":{"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[942,977]},"callee":"can://sample-app/@external/node:fs/readFileSync","method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:10"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@entry"},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,46],"bytes":[935,978]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3"},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[893,980]},"id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@formal_out"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_in:0"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_out"},"15:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"15:3","id":"can://sample-app/typescript/src/external-calls.ts/readsConfig@15:3/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"},{"src":"15:3/actual_in:1","dst":"15:3/actual_out"}]},"makesCommand":{"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand","kind":"function","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"27:15":{"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1625,1638]},"callee":"can://sample-app/@external/commander/Command","method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@27:15"},"28:3":{"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1642,1677]},"callee":"can://sample-app/@external/commander/description","method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3"},"28:3/2":{"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1642,1657]},"callee":"can://sample-app/@external/commander/name","method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/2"},"29:3":{"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1681,1710]},"callee":"can://sample-app/@external/commander/parse","method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3"},"@entry":{"kind":"entry","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@entry"},"27:3":{"kind":"statement","span":{"start":[27,3],"end":[27,29],"bytes":[1613,1639]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@27:3"},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,14],"bytes":[1714,1725]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@30:3"},"@exit":{"kind":"exit","span":{"start":[26,1],"end":[31,2],"bytes":[1569,1727]},"id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@formal_out"},"28:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"28:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/actual_in:0"},"28:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"28:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@28:3/actual_out"},"29:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"29:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3/actual_in:0"},"29:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"29:3","id":"can://sample-app/typescript/src/external-calls.ts/makesCommand@29:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"27:3","kind":"fallthrough"},{"src":"27:3","dst":"@exit","kind":"exception"},{"src":"27:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"@exit","kind":"exception"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"27:3"},{"src":"27:3","dst":"28:3"},{"src":"28:3","dst":"29:3"},{"src":"29:3","dst":"30:3"}],"ddg":[{"src":"27:3","dst":"28:3","var":"cmd.name","prov":["reaching-defs"]},{"src":"27:3","dst":"29:3","var":"cmd.parse","prov":["reaching-defs"]},{"src":"27:3","dst":"30:3","var":"cmd","prov":["reaching-defs"]},{"src":"30:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"28:3/actual_in:0","dst":"28:3/actual_out"},{"src":"29:3/actual_in:0","dst":"29:3/actual_out"}]},"makesDriver":{"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver","kind":"function","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"39:10":{"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2058,2090]},"callee":"can://sample-app/@external/neo4j-driver/driver","method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:10"},"@entry":{"kind":"entry","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@entry"},"39:3":{"kind":"statement","span":{"start":[39,3],"end":[39,43],"bytes":[2051,2091]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3"},"@exit":{"kind":"exit","span":{"start":[38,1],"end":[40,2],"bytes":[2008,2093]},"id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@formal_out"},"39:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"39:3","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3/actual_in:0"},"39:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"39:3","id":"can://sample-app/typescript/src/external-calls.ts/makesDriver@39:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"39:3","kind":"fallthrough"},{"src":"39:3","dst":"@exit","kind":"exception"},{"src":"39:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"39:3"}],"ddg":[{"src":"39:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"39:3/actual_in:0","dst":"39:3/actual_out"}]},"makesSession":{"id":"can://sample-app/typescript/src/external-calls.ts/makesSession","kind":"function","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"52:13":{"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2822,2888]},"callee":"can://sample-app/@external/neo4j-driver/driver","method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:13"},"52:46":{"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2855,2887]},"callee":"can://sample-app/@external/neo4j-driver/basic","method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:46"},"53:13":{"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2902,2913]},"callee":"can://sample-app/@external/neo4j-driver-core/session","method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@53:13"},"54:3":{"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2917,2930]},"callee":"can://sample-app/@external/neo4j-driver/rxSession","method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@54:3"},"@entry":{"kind":"entry","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@entry"},"52:3":{"kind":"statement","span":{"start":[52,3],"end":[52,80],"bytes":[2812,2889]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3"},"53:3":{"kind":"statement","span":{"start":[53,3],"end":[53,25],"bytes":[2892,2914]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@53:3"},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[55,12],"bytes":[2934,2943]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@55:3"},"@exit":{"kind":"exit","span":{"start":[51,1],"end":[56,2],"bytes":[2768,2945]},"id":"can://sample-app/typescript/src/external-calls.ts/makesSession@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@formal_out"},"52:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_in:0"},"52:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_out"},"52:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"52:3","id":"can://sample-app/typescript/src/external-calls.ts/makesSession@52:3/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"52:3","kind":"fallthrough"},{"src":"52:3","dst":"@exit","kind":"exception"},{"src":"52:3","dst":"53:3","kind":"fallthrough"},{"src":"53:3","dst":"@exit","kind":"exception"},{"src":"53:3","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"@exit","kind":"exception"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"52:3"},{"src":"52:3","dst":"53:3"},{"src":"53:3","dst":"54:3"},{"src":"54:3","dst":"55:3"}],"ddg":[{"src":"52:3","dst":"53:3","var":"d.session","prov":["reaching-defs"]},{"src":"52:3","dst":"54:3","var":"d.rxSession","prov":["reaching-defs"]},{"src":"53:3","dst":"55:3","var":"s","prov":["reaching-defs"]},{"src":"55:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"52:3/actual_in:0","dst":"52:3/actual_out"},{"src":"52:3/actual_in:1","dst":"52:3/actual_out"}]},"unsafeEval":{"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval","kind":"function","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39,"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_in:0"}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"60:10":{"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3100,3109]},"callee":"can://sample-app/@external/(builtin)/eval","method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:10"},"@entry":{"kind":"entry","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@entry"},"60:3":{"kind":"statement","span":{"start":[60,3],"end":[60,20],"bytes":[3093,3110]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3"},"@exit":{"kind":"exit","span":{"start":[59,1],"end":[61,2],"bytes":[3040,3112]},"id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@exit"},"@formal_in:0":{"kind":"formal_in","of":"raw","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@formal_out"},"60:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"60:3","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3/actual_in:0"},"60:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"60:3","id":"can://sample-app/typescript/src/external-calls.ts/unsafeEval@60:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"60:3","kind":"fallthrough"},{"src":"60:3","dst":"@exit","kind":"exception"},{"src":"60:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"60:3"}],"ddg":[{"src":"@entry","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"60:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"60:3/actual_in:0","dst":"60:3/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"7c9b89100d76783724926bea24ee54872043defa3b9133eab7c34e45cf145700"},"src/external.ts":{"id":"can://sample-app/typescript/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,582]},"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"types":{},"functions":{"fingerprint":{"id":"can://sample-app/typescript/src/external.ts/fingerprint","kind":"function","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41,"id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:14":{"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[342,354]},"callee":"can://sample-app/@external/node:crypto/randomUUID","method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@7:14"},"8:10":{"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[365,427]},"callee":null,"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10"},"8:10/2":{"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[365,408]},"callee":null,"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10/2"},"8:10/3":{"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[365,385]},"callee":"can://sample-app/@external/node:crypto/createHash","method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:10/3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,27],"bytes":[331,355]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@7:3"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[10,20],"bytes":[358,428]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[11,2],"bytes":[277,430]},"id":"can://sample-app/typescript/src/external.ts/fingerprint@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external.ts/fingerprint@formal_out"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://sample-app/typescript/src/external.ts/fingerprint@8:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"id","prov":["reaching-defs"]},{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:3/actual_in:0","dst":"8:3/actual_out"}]},"extensionOf":{"id":"can://sample-app/typescript/src/external.ts/extensionOf","kind":"function","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41,"id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"15:10":{"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[560,578]},"callee":"can://sample-app/@external/node:path/extname","method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/external.ts/extensionOf@15:10"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@entry"},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,29],"bytes":[553,579]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3"},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[499,581]},"id":"can://sample-app/typescript/src/external.ts/extensionOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"file","id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/external.ts/extensionOf@formal_out"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3","id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3/actual_in:0"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3","id":"can://sample-app/typescript/src/external.ts/extensionOf@15:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"049a7393ffc7647fcab8ddeadb0eb82f74c57a385195aec4a4f0700ebf9c88c0"},"src/index.ts":{"id":"can://sample-app/typescript/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,742]},"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://sample-app/typescript/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://sample-app/typescript/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://sample-app/typescript/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://sample-app/typescript/src/controllers.ts/UserController/show","method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[503,543]},"callee":"can://sample-app/typescript/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[512,542]},"callee":"can://sample-app/typescript/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[547,574]},"callee":"can://sample-app/typescript/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[556,573]},"callee":"can://sample-app/typescript/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[592,627]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[647,671]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[675,708]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[675,700]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[675,691]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[712,729]},"callee":"can://sample-app/@external/(builtin)/log","method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://sample-app/typescript/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://sample-app/typescript/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://sample-app/typescript/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[579,628]},"id":"can://sample-app/typescript/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[631,672]},"id":"can://sample-app/typescript/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://sample-app/typescript/src/index.ts/main@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/index.ts/main@formal_out"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3","id":"can://sample-app/typescript/src/index.ts/main@11:3/actual_out"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3","id":"can://sample-app/typescript/src/index.ts/main@12:3/actual_out"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3","id":"can://sample-app/typescript/src/index.ts/main@13:3/actual_out"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3","id":"can://sample-app/typescript/src/index.ts/main@7:3/actual_in:0"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_out"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3","id":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:1"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3","id":"can://sample-app/typescript/src/index.ts/main@11:3/actual_in:0"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3","id":"can://sample-app/typescript/src/index.ts/main@13:3/actual_in:0"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:1"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3","id":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:2"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3","id":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3","id":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:0"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_out"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3","id":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:1"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3","id":"can://sample-app/typescript/src/index.ts/main@21:3/actual_in:0"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3","id":"can://sample-app/typescript/src/index.ts/main@22:3/actual_in:0"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3","id":"can://sample-app/typescript/src/index.ts/main@22:3/actual_out"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3","id":"can://sample-app/typescript/src/index.ts/main@7:3/actual_out"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3","id":"can://sample-app/typescript/src/index.ts/main@9:3/actual_out"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3","id":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"12:3","kind":"fallthrough"},{"src":"12:3","dst":"@exit","kind":"exception"},{"src":"12:3","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"exception"},{"src":"16:3","dst":"17:3","kind":"fallthrough"},{"src":"17:3","dst":"@exit","kind":"exception"},{"src":"17:3","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"21:3","kind":"fallthrough"},{"src":"21:3","dst":"@exit","kind":"exception"},{"src":"21:3","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"@exit","kind":"exception"},{"src":"22:3","dst":"@exit","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"11:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"11:3","dst":"12:3"},{"src":"12:3","dst":"13:3"},{"src":"13:3","dst":"16:3"},{"src":"16:3","dst":"17:3"},{"src":"17:3","dst":"19:3"},{"src":"19:3","dst":"20:3"},{"src":"20:3","dst":"21:3"},{"src":"21:3","dst":"22:3"},{"src":"7:3","dst":"8:3"},{"src":"8:3","dst":"9:3"},{"src":"9:3","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"8:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"9:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"11:3","dst":"12:3","var":"controller.list","prov":["reaching-defs"]},{"src":"11:3","dst":"13:3","var":"controller.show","prov":["reaching-defs"]},{"src":"11:3/actual_out","dst":"11:3","var":"$ret","prov":["reaching-defs"]},{"src":"12:3/actual_out","dst":"12:3","var":"$ret","prov":["reaching-defs"]},{"src":"13:3/actual_out","dst":"13:3","var":"$ret","prov":["reaching-defs"]},{"src":"16:3/actual_out","dst":"16:3","var":"$ret","prov":["reaching-defs"]},{"src":"17:3/actual_out","dst":"17:3","var":"$ret","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"19:3/actual_out","dst":"19:3","var":"$ret","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"21:3/actual_out","dst":"21:3","var":"$ret","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3/actual_in:0","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"service.create","prov":["reaching-defs"]},{"src":"7:3","dst":"9:3","var":"service.createGuest","prov":["reaching-defs"]},{"src":"7:3/actual_out","dst":"7:3","var":"$ret","prov":["reaching-defs"]},{"src":"8:3/actual_out","dst":"8:3","var":"$ret","prov":["reaching-defs"]},{"src":"9:3/actual_out","dst":"9:3","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"13:3","dst":"13:3","var":"src/services.nextId"},{"src":"13:3/actual_in:0","dst":"13:3/actual_out"},{"src":"16:3/actual_in:0","dst":"16:3/actual_out"},{"src":"17:3/actual_in:0","dst":"17:3/actual_out"},{"src":"19:3/actual_in:0","dst":"19:3/actual_out"},{"src":"19:3/actual_in:1","dst":"19:3/actual_out"},{"src":"22:3/actual_in:0","dst":"22:3/actual_out"},{"src":"8:3","dst":"8:3","var":"src/services.nextId"},{"src":"8:3/actual_in:0","dst":"8:3/actual_out"},{"src":"8:3/actual_in:1","dst":"8:3/actual_out"},{"src":"9:3","dst":"9:3","var":"src/services.nextId"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://sample-app/typescript/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1237]},"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"types":{"Entity":{"id":"can://sample-app/typescript/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://sample-app/typescript/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37,"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://sample-app/typescript/src/models.ts/Entity/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"id":"can://sample-app/typescript/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://sample-app/typescript/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://sample-app/typescript/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://sample-app/typescript/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://sample-app/typescript/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://sample-app/typescript/src/models.ts/User/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"49:5","kind":"fallthrough"},{"src":"49:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"49:5"}],"ddg":[{"src":"@entry","dst":"49:5","var":"this.name","prov":["reaching-defs"]},{"src":"@entry","dst":"49:5","var":"this.role","prov":["reaching-defs"]},{"src":"49:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"recordLogin":{"id":"can://sample-app/typescript/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://sample-app/typescript/src/models.ts/User/recordLogin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/recordLogin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"53:5","kind":"fallthrough"},{"src":"53:5","dst":"54:5","kind":"fallthrough"},{"src":"54:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"53:5"},{"src":"@entry","dst":"54:5"}],"ddg":[{"src":"@entry","dst":"53:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"@entry","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"53:5","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"54:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0"},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1"},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37,"id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://sample-app/typescript/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://sample-app/typescript/src/models.ts/User/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1"},"@formal_in:2":{"kind":"formal_in","of":"role","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5","id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_out"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5","id":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_in:0"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"@exit","kind":"exception"},{"src":"40:5","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"40:5"},{"src":"40:5","dst":"41:5"}],"ddg":[{"src":"@entry","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"40:5/actual_out","dst":"40:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"id":"can://sample-app/typescript/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://sample-app/typescript/src/models.ts/User/isAdmin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/User/isAdmin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"45:5","kind":"fallthrough"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"45:5"}],"ddg":[{"src":"@entry","dst":"45:5","var":"this.role","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{"loginCount":{"id":"can://sample-app/typescript/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://sample-app/typescript/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://sample-app/typescript/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://sample-app/typescript/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://sample-app/typescript/src/models.ts/Entity"],"implements_ids":["can://sample-app/typescript/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://sample-app/typescript/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1099,1236]},"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1202,1230]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://sample-app/typescript/src/models.ts/Robot/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Robot/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"62:5","kind":"fallthrough"},{"src":"62:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"62:5"}],"ddg":[{"src":"@entry","dst":"62:5","var":"this.name","prov":["reaching-defs"]},{"src":"62:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34,"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://sample-app/typescript/src/models.ts/Robot/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"id":"can://sample-app/typescript/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://sample-app/typescript/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://sample-app/typescript/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"callables":{},"fields":{"id":{"id":"can://sample-app/typescript/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://sample-app/typescript/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://sample-app/typescript/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://sample-app/typescript/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://sample-app/typescript/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://sample-app/typescript/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://sample-app/typescript/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://sample-app/typescript/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://sample-app/typescript/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://sample-app/typescript/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://sample-app/typescript/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://sample-app/typescript/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://sample-app/typescript/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1240]},"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"types":{"UserService":{"id":"can://sample-app/typescript/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[558,1239]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://sample-app/typescript/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22,"id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0"},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48,"id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[744,784]},"callee":"can://sample-app/typescript/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[803,827]},"callee":"can://sample-app/typescript/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[833,854]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[733,785]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[790,828]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[860,872]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://sample-app/typescript/src/services.ts/UserService/create@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"role","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_out"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_out"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_in:0"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:0"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:1"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:2"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5/actual_in:0"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5","id":"can://sample-app/typescript/src/services.ts/UserService/create@27:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"25:5","kind":"fallthrough"},{"src":"25:5","dst":"@exit","kind":"exception"},{"src":"25:5","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"27:5","kind":"fallthrough"},{"src":"27:5","dst":"@exit","kind":"exception"},{"src":"27:5","dst":"28:5","kind":"fallthrough"},{"src":"28:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:5"},{"src":"25:5","dst":"26:5"},{"src":"26:5","dst":"27:5"},{"src":"27:5","dst":"28:5"}],"ddg":[{"src":"@entry","dst":"25:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@entry","dst":"27:5","var":"this.users.push","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5/actual_in:1","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5/actual_in:2","var":"role","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"25:5/actual_out","dst":"25:5","var":"$ret","prov":["reaching-defs"]},{"src":"26:5","dst":"27:5","var":"user","prov":["reaching-defs"]},{"src":"26:5","dst":"28:5","var":"user","prov":["reaching-defs"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]},{"src":"28:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"25:5/actual_in:0","dst":"25:5/actual_out"},{"src":"27:5/actual_in:0","dst":"27:5/actual_out"}]},"createGuest":{"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[919,951]},"callee":"can://sample-app/typescript/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[964,993]},"callee":"can://sample-app/typescript/src/services.ts/UserService/create","method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[906,952]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[957,994]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@formal_out"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_out"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_out"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_in:0"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:0"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5","id":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"32:5","kind":"fallthrough"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"32:5","dst":"33:5","kind":"fallthrough"},{"src":"33:5","dst":"@exit","kind":"exception"},{"src":"33:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"32:5"},{"src":"32:5","dst":"33:5"}],"ddg":[{"src":"@entry","dst":"32:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"32:5/actual_in:0","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"this.create","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5","var":"name","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5/actual_in:0","var":"name","prov":["reaching-defs"]},{"src":"32:5/actual_out","dst":"32:5","var":"$ret","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"33:5/actual_out","dst":"33:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"32:5/actual_in:0","dst":"32:5/actual_out"},{"src":"33:5","dst":"33:5","var":"src/services.nextId"},{"src":"33:5/actual_in:0","dst":"33:5/actual_out"},{"src":"33:5/actual_in:1","dst":"33:5/actual_out"}]},"describeAll":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1039,1074]},"callee":"can://sample-app/@external/(builtin)/map","method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1032,1075]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@formal_out"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5/actual_in:0"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:5/actual_out"}},"callables":{"":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1061,1073]},"callee":"can://sample-app/typescript/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@exit"},"@formal_in:0":{"kind":"formal_in","of":"u","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@formal_out"},"37:34/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:34","id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"37:34","kind":"fallthrough"},{"src":"37:34","dst":"@exit","kind":"exception"},{"src":"37:34","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:34"}],"ddg":[{"src":"@entry","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"37:34/actual_out","dst":"37:34","var":"$ret","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"37:5","kind":"fallthrough"},{"src":"37:5","dst":"@exit","kind":"exception"},{"src":"37:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:5"}],"ddg":[{"src":"@entry","dst":"37:5","var":"this.users.map","prov":["reaching-defs"]},{"src":"37:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"37:5/actual_in:0","dst":"37:5/actual_out"}]},"loginAll":{"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1193,1208]},"callee":"can://sample-app/typescript/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1123,1137]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1142,1215]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1178,1209]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1220,1233]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@formal_out"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7","id":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"43:7","kind":"true"},{"src":"42:5","dst":"45:5","kind":"false"},{"src":"43:7","dst":"@exit","kind":"exception"},{"src":"43:7","dst":"42:5","kind":"loop_back"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"41:5"},{"src":"@entry","dst":"42:5"},{"src":"42:5","dst":"43:7"},{"src":"42:5","dst":"45:5"},{"src":"43:7","dst":"42:5"}],"ddg":[{"src":"@entry","dst":"42:5","var":"this.users","prov":["reaching-defs"]},{"src":"41:5","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"41:5","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"42:5","dst":"43:7","var":"u.recordLogin","prov":["reaching-defs"]},{"src":"43:7","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"43:7","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"43:7/actual_out","dst":"43:7","var":"$ret","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://sample-app/typescript/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51,"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://sample-app/typescript/src/services.ts/UserService/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"startId","id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"id":"can://sample-app/typescript/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[587,614]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://sample-app/typescript/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://sample-app/typescript/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43,"id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[164,187]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://sample-app/typescript/src/services.ts/makeGuestName@exit"},"@formal_in:0":{"kind":"formal_in","of":"seed","id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"id":"can://sample-app/typescript/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38,"id":"can://sample-app/typescript/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[407,423]},"callee":"can://sample-app/typescript/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://sample-app/typescript/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[400,424]},"id":"can://sample-app/typescript/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://sample-app/typescript/src/services.ts/announce@exit"},"@formal_in:0":{"kind":"formal_in","of":"thing","id":"can://sample-app/typescript/src/services.ts/announce@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/announce@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"id":"can://sample-app/typescript/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[518,555]},"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33,"id":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[550,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://sample-app/typescript/src/services.ts/nextId@exit"},"@formal_in:0":{"kind":"formal_in","of":"n","id":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/services.ts/nextId@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"17:46","kind":"fallthrough"},{"src":"17:46","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:46"}],"ddg":[{"src":"@entry","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://sample-app/typescript/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"types":{"StringUtil":{"id":"can://sample-app/typescript/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"types":{"Builder":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@exit"},"@formal_in:0":{"kind":"formal_in","of":"part","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_out"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"14:7","kind":"fallthrough"},{"src":"14:7","dst":"@exit","kind":"exception"},{"src":"14:7","dst":"15:7","kind":"fallthrough"},{"src":"15:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:7"},{"src":"14:7","dst":"15:7"}],"ddg":[{"src":"@entry","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@entry","dst":"14:7","var":"this.parts.push","prov":["reaching-defs"]},{"src":"@entry","dst":"15:7","var":"this","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7/actual_in:0","var":"part","prov":["reaching-defs"]},{"src":"14:7/actual_out","dst":"14:7","var":"$ret","prov":["reaching-defs"]},{"src":"15:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"14:7/actual_in:0","dst":"14:7/actual_out"}]},"build":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://sample-app/@external/(builtin)/join","method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@formal_out"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7","id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@18:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"18:7","kind":"fallthrough"},{"src":"18:7","dst":"@exit","kind":"exception"},{"src":"18:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"18:7"}],"ddg":[{"src":"@entry","dst":"18:7","var":"this.parts.join","prov":["reaching-defs"]},{"src":"18:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"18:7/actual_in:0","dst":"18:7/actual_out"}]},"constructor":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0"},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://sample-app/@external/(builtin)/repeat","method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://sample-app/typescript/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"n","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_out"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_in:0"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5/actual_in:0","var":"n","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"4:5/actual_out","dst":"4:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://sample-app/@external/(builtin)/replace","method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://sample-app/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_in:0"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_out"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5","id":"can://sample-app/typescript/src/util.ts/StringUtil/slug@8:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:5","kind":"fallthrough"},{"src":"8:5","dst":"@exit","kind":"exception"},{"src":"8:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"8:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:5/actual_in:0","dst":"8:5/actual_out"},{"src":"8:5/actual_in:1","dst":"8:5/actual_out"}]}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://sample-app/typescript/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64,"id":"can://sample-app/typescript/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://sample-app/typescript/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://sample-app/@external/(builtin)/push","method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://sample-app/typescript/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://sample-app/typescript/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://sample-app/typescript/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://sample-app/typescript/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://sample-app/typescript/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://sample-app/typescript/src/util.ts/classify@exit"},"@formal_in:0":{"kind":"formal_in","of":"items","id":"can://sample-app/typescript/src/util.ts/classify@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/classify@formal_out"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5","id":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_in:0"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5","id":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_out"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5","id":"can://sample-app/typescript/src/util.ts/classify@31:5/actual_in:0"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5","id":"can://sample-app/typescript/src/util.ts/classify@31:5/actual_out"}},"callables":{"keyOf":{"id":"can://sample-app/typescript/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25,"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://sample-app/@external/(builtin)/charAt","method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://sample-app/typescript/src/util.ts/classify/keyOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"item","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_out"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5/actual_in:0"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://sample-app/typescript/src/util.ts/classify/keyOf@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"26:5/actual_in:0","dst":"26:5/actual_out"}]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"30:5","kind":"true"},{"src":"29:3","dst":"33:3","kind":"false"},{"src":"30:5","dst":"@exit","kind":"exception"},{"src":"30:5","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"29:3","kind":"loop_back"},{"src":"33:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:3"},{"src":"25:3","dst":"28:3"},{"src":"25:3","dst":"29:3"},{"src":"29:3","dst":"30:5"},{"src":"29:3","dst":"33:3"},{"src":"30:5","dst":"31:5"},{"src":"31:5","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"28:3","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"28:3","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5/actual_in:0","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"31:5","var":"item","prov":["reaching-defs"]},{"src":"30:5","dst":"31:5","var":"k","prov":["reaching-defs"]},{"src":"30:5/actual_out","dst":"30:5","var":"$ret","prov":["reaching-defs"]},{"src":"31:5","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"31:5","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"33:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"30:5/actual_in:0","dst":"30:5/actual_out"},{"src":"31:5/actual_in:0","dst":"31:5/actual_out"}]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://sample-app/typescript/src/controllers.ts","dst":"can://sample-app/typescript/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts","dst":"can://sample-app/typescript/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/readsConfig","dst":"can://sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesCommand","dst":"can://sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesDriver","dst":"can://sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/makesSession","dst":"can://sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external-calls.ts/unsafeEval","dst":"can://sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/fingerprint","dst":"can://sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/fingerprint","dst":"can://sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/external.ts/extensionOf","dst":"can://sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://sample-app/typescript/src/index.ts/main","dst":"can://sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/models.ts/User/constructor","dst":"can://sample-app/typescript/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/announce","dst":"can://sample-app/typescript/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/typescript/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/typescript/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/create","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest","dst":"can://sample-app/typescript/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest","dst":"can://sample-app/typescript/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll","dst":"can://sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","dst":"can://sample-app/typescript/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/loginAll","dst":"can://sample-app/typescript/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify","dst":"can://sample-app/typescript/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/classify/keyOf","dst":"can://sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","dst":"can://sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug","dst":"can://sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug","dst":"can://sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","dst":"can://sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build","dst":"can://sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list","dst":"can://sample-app/typescript/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show","dst":"can://sample-app/typescript/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@11:3/actual_in:0","dst":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_in:0","var":"service"},{"src":"can://sample-app/typescript/src/index.ts/main@13:3","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/index.ts/main@13:3/actual_in:0","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/announce@formal_in:0","var":"thing"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:1","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@16:3/actual_in:2","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2","var":"role"},{"src":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@17:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/announce@formal_in:0","var":"thing"},{"src":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:0","var":"s"},{"src":"can://sample-app/typescript/src/index.ts/main@19:3/actual_in:1","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_in:1","var":"n"},{"src":"can://sample-app/typescript/src/index.ts/main@21:3/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_in:0","var":"part"},{"src":"can://sample-app/typescript/src/index.ts/main@7:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_in:0","var":"startId"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/index.ts/main@8:3/actual_in:1","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1","var":"role"},{"src":"can://sample-app/typescript/src/index.ts/main@9:3","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/nextId@formal_in:0","var":"n"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:0","var":"id"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:1","var":"name"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://sample-app/typescript/src/models.ts/User/constructor@formal_in:2","var":"role"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_in:0","var":"seed"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5","dst":"can://sample-app/typescript/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:0","var":"name"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://sample-app/typescript/src/services.ts/UserService/create@formal_in:1","var":"role"},{"src":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_in:0","var":"item"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0","var":"s"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_in:0","var":"s"}],"param_out":[{"src":"can://sample-app/typescript/src/controllers.ts/UserController/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@11:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/list@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@12:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/controllers.ts/UserController/show@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@13:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/Entity/constructor@formal_out","dst":"can://sample-app/typescript/src/models.ts/User/constructor@40:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/Robot/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/constructor@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/create@26:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/describe@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@21:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/describe@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/describeAll/@37:34/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/models.ts/User/recordLogin@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/loginAll@43:7/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/announce@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@16:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/announce@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@17:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/makeGuestName@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@32:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/nextId@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/create@25:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/constructor@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@7:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/show@20:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@8:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/create@formal_out","dst":"can://sample-app/typescript/src/services.ts/UserService/createGuest@33:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/createGuest@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@9:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/services.ts/UserService/describeAll@formal_out","dst":"can://sample-app/typescript/src/controllers.ts/UserController/list@26:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/classify/keyOf@formal_out","dst":"can://sample-app/typescript/src/util.ts/classify@30:5/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@21:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@formal_out","dst":"can://sample-app/typescript/src/index.ts/main@19:3/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out","dst":"can://sample-app/typescript/src/util.ts/StringUtil/Builder/add@14:7/actual_out","var":"$ret"},{"src":"can://sample-app/typescript/src/util.ts/StringUtil/slug@formal_out","dst":"can://sample-app/typescript/src/util.ts/StringUtil/repeat@4:5/actual_out","var":"$ret"}],"artifacts":{"package.json":{"id":"can://sample-app/artifact/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://sample-app/artifact/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://sample-app/artifact/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[{"module":"commander","prov":[]},{"module":"neo4j-driver","prov":[]}],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":["commander"],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://sample-app/@external/node:fs/readFileSync":{"id":"can://sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://sample-app/@external/commander/Command":{"id":"can://sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://sample-app/@external/commander/description":{"id":"can://sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://sample-app/@external/commander/name":{"id":"can://sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://sample-app/@external/commander/parse":{"id":"can://sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://sample-app/@external/neo4j-driver/driver":{"id":"can://sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://sample-app/@external/neo4j-driver/basic":{"id":"can://sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://sample-app/@external/neo4j-driver-core/session":{"id":"can://sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://sample-app/@external/neo4j-driver/rxSession":{"id":"can://sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://sample-app/@external/(builtin)/eval":{"id":"can://sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://sample-app/@external/node:crypto/randomUUID":{"id":"can://sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://sample-app/@external/node:crypto/createHash":{"id":"can://sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://sample-app/@external/node:path/extname":{"id":"can://sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://sample-app/@external/(builtin)/log":{"id":"can://sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://sample-app/@external/(builtin)/push":{"id":"can://sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://sample-app/@external/(builtin)/map":{"id":"can://sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://sample-app/@external/(builtin)/charAt":{"id":"can://sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://sample-app/@external/(builtin)/repeat":{"id":"can://sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://sample-app/@external/(builtin)/replace":{"id":"can://sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://sample-app/@external/(builtin)/toLowerCase":{"id":"can://sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://sample-app/@external/(builtin)/join":{"id":"can://sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://sample-app/typescript/src/controllers.ts/Controller@5:10":{"id":"can://sample-app/typescript/src/controllers.ts/Controller/","kind":"callable"},"can://sample-app/typescript/src/controllers.ts/Get@8:10":{"id":"can://sample-app/typescript/src/controllers.ts/Get/","kind":"callable"},"can://sample-app/typescript/src/controllers.ts/Param@11:10":{"id":"can://sample-app/typescript/src/controllers.ts/Param/","kind":"callable"},"can://sample-app/typescript/src/services.ts/UserService/describeAll@37:27":{"id":"can://sample-app/typescript/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/v2/json/typescript/analysis.schema.json b/v2/json/typescript/analysis.schema.json index 6d90803..f20a1bf 100644 --- a/v2/json/typescript/analysis.schema.json +++ b/v2/json/typescript/analysis.schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://codellm-devkit.github.io/schema/v2/typescript/analysis.schema.json", "title": "codeanalyzer-typescript v2 analysis output", - "description": "What codeanalyzer-typescript (cants) v1.2.0 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction. Field names are the snake_case interface members of src/schema/schema.ts; the emitter strips the internal join fields (call_sites, config_accesses, abs_path) and the module cache metadata (last_modified, file_size) from the wire, keeping content_hash.", + "description": "What codeanalyzer-typescript (cants) v1.6.3 emits for `--emit json`. Every node $refs the canonical v2 spine and closes with `unevaluatedProperties: false`, so this file is exhaustive by construction. Field names are the snake_case interface members of src/schema/schema.ts; the emitter strips the internal join fields (call_sites, config_accesses, abs_path) and the module cache metadata (last_modified, file_size) from the wire, keeping content_hash.", "x-cldk": { "schemaVersion": "2.0.0", "language": "typescript", diff --git a/v2/neo4j/java/schema.neo4j.json b/v2/neo4j/java/schema.neo4j.json index d062a39..54a5897 100644 --- a/v2/neo4j/java/schema.neo4j.json +++ b/v2/neo4j/java/schema.neo4j.json @@ -28,7 +28,8 @@ "id": "string", "file_key": "string", "package": "string", - "content_hash": "string" + "content_hash": "string", + "source": "string" } }, { @@ -43,10 +44,15 @@ "base_types": "string[]", "interfaces": "string[]", "docstring": "string", + "type_parameters_json": "string", "is_entrypoint": "boolean", "entrypoint_frameworks": "string[]", "start_line": "integer", - "end_line": "integer" + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -71,8 +77,19 @@ "is_implicit": "boolean", "is_entrypoint": "boolean", "entrypoint_frameworks": "string[]", + "type_parameters_json": "string", "start_line": "integer", - "end_line": "integer" + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer", + "body_start_line": "integer", + "body_start_column": "integer", + "body_end_line": "integer", + "body_end_column": "integer", + "body_start_byte": "integer", + "body_end_byte": "integer" } }, { @@ -98,7 +115,11 @@ "modifiers": "string[]", "docstring": "string", "start_line": "integer", - "end_line": "integer" + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -111,7 +132,11 @@ "type": "string", "initializer": "string", "start_line": "integer", - "end_line": "integer" + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -122,7 +147,13 @@ "id": "string", "name": "string", "arguments": "string[]", - "docstring": "string" + "docstring": "string", + "start_line": "integer", + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -135,7 +166,13 @@ "type": "string", "modifiers": "string[]", "is_variadic": "boolean", - "docstring": "string" + "docstring": "string", + "start_line": "integer", + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -154,10 +191,16 @@ "is_static_call": "boolean", "argument_types": "string[]", "argument_expr": "string[]", + "callee_signature": "string", + "arguments": "string[]", "var": "string", "call_node": "string", "start_line": "integer", - "end_line": "integer" + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -214,7 +257,11 @@ "value": "string", "references": "string[]", "start_line": "integer", - "end_line": "integer" + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } } ], @@ -367,13 +414,22 @@ "from": [ "JType", "JCallable", - "JField" + "JField", + "JEnumConstant", + "JRecordComponent" ], "to": [ "JAnnotation" ], "properties": { - "arguments": "string[]" + "arguments": "string[]", + "_k": "string", + "start_line": "integer", + "start_column": "integer", + "end_line": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -525,6 +581,19 @@ "prov": "string[]", "_k": "string" } + }, + { + "type": "J_DISPATCHES_TO", + "from": [ + "JBodyNode" + ], + "to": [ + "Artifact" + ], + "properties": { + "via": "string", + "prov": "string[]" + } } ], "constraints": [ diff --git a/v2/neo4j/python/schema.neo4j.json b/v2/neo4j/python/schema.neo4j.json index d779e77..7a91e07 100644 --- a/v2/neo4j/python/schema.neo4j.json +++ b/v2/neo4j/python/schema.neo4j.json @@ -30,6 +30,7 @@ "id": "string", "file_key": "string", "module_name": "string", + "source": "string", "content_hash": "string", "last_modified": "float", "file_size": "integer" @@ -49,6 +50,10 @@ "docstring": "string", "start_line": "integer", "end_line": "integer", + "start_column": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer", "is_entrypoint": "boolean", "entrypoint_frameworks": "string[]" } @@ -68,6 +73,10 @@ "code_start_line": "integer", "start_line": "integer", "end_line": "integer", + "start_column": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer", "docstring": "string", "decorators": "string[]", "modifiers": "string[]", @@ -127,9 +136,14 @@ "name": "string", "type": "string", "initializer": "string", + "value_json": "string", "scope": "string", "start_line": "integer", - "end_line": "integer" + "end_line": "integer", + "start_column": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -147,8 +161,13 @@ "return_type": "string", "is_constructor_call": "boolean", "arguments_json": "string", + "callee_signature": "string", "start_line": "integer", - "end_line": "integer" + "end_line": "integer", + "start_column": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { @@ -187,7 +206,11 @@ "value": "string", "references": "string[]", "start_line": "integer", - "end_line": "integer" + "end_line": "integer", + "start_column": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } } ], @@ -294,7 +317,8 @@ "properties": { "spellings": "string[]", "imported_names": "string[]", - "aliases": "string[]" + "aliases": "string[]", + "positions_json": "string" } }, { @@ -309,7 +333,13 @@ "properties": { "expression": "string", "positional_arguments": "string[]", - "keyword_arguments_json": "string" + "keyword_arguments_json": "string", + "start_line": "integer", + "end_line": "integer", + "start_column": "integer", + "end_column": "integer", + "start_byte": "integer", + "end_byte": "integer" } }, { diff --git a/v2/neo4j/typescript/schema.neo4j.json b/v2/neo4j/typescript/schema.neo4j.json index 2b5fe80..f7dbd7c 100644 --- a/v2/neo4j/typescript/schema.neo4j.json +++ b/v2/neo4j/typescript/schema.neo4j.json @@ -12,6 +12,7 @@ "key": "id", "properties": { "id": "string", + "name": "string", "schema_version": "string", "language": "string", "max_level": "integer",