cg-code-graph 0.10.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cg_code_graph-0.10.1.dist-info/METADATA +678 -0
- cg_code_graph-0.10.1.dist-info/RECORD +174 -0
- cg_code_graph-0.10.1.dist-info/WHEEL +5 -0
- cg_code_graph-0.10.1.dist-info/entry_points.txt +3 -0
- cg_code_graph-0.10.1.dist-info/licenses/LICENSE +21 -0
- cg_code_graph-0.10.1.dist-info/top_level.txt +1 -0
- codegraph/__init__.py +2 -0
- codegraph/aitools.py +129 -0
- codegraph/apps.py +76 -0
- codegraph/blindspots.py +428 -0
- codegraph/bridges.py +1701 -0
- codegraph/cli.py +725 -0
- codegraph/concepts.py +362 -0
- codegraph/config.py +559 -0
- codegraph/core/__init__.py +0 -0
- codegraph/core/cache.py +375 -0
- codegraph/core/detect.py +80 -0
- codegraph/core/extractors.py +187 -0
- codegraph/core/fsutil.py +61 -0
- codegraph/core/generated.py +575 -0
- codegraph/core/model.py +174 -0
- codegraph/core/paths.py +175 -0
- codegraph/core/plugin.py +160 -0
- codegraph/core/store.py +80 -0
- codegraph/core/syntax_errors.py +132 -0
- codegraph/coverage.py +928 -0
- codegraph/doctor.py +453 -0
- codegraph/external.py +613 -0
- codegraph/indexer.py +336 -0
- codegraph/link.py +434 -0
- codegraph/lint_async.py +524 -0
- codegraph/mcp_server.py +1303 -0
- codegraph/parity.py +473 -0
- codegraph/parity_structure.py +307 -0
- codegraph/payload.py +321 -0
- codegraph/plans.py +1285 -0
- codegraph/platform_scan.py +643 -0
- codegraph/platforms.py +1369 -0
- codegraph/plugins/__init__.py +0 -0
- codegraph/plugins/cfamily/__init__.py +0 -0
- codegraph/plugins/cfamily/plugin.py +930 -0
- codegraph/plugins/cfamily/syntax.py +881 -0
- codegraph/plugins/dart/__init__.py +0 -0
- codegraph/plugins/dart/bridges.py +345 -0
- codegraph/plugins/dart/extractor/bin/extract.dart +717 -0
- codegraph/plugins/dart/extractor/pubspec.lock +149 -0
- codegraph/plugins/dart/extractor/pubspec.yaml +7 -0
- codegraph/plugins/dart/http.py +904 -0
- codegraph/plugins/dart/models.py +308 -0
- codegraph/plugins/dart/plugin.py +625 -0
- codegraph/plugins/dart/program.py +907 -0
- codegraph/plugins/django/__init__.py +0 -0
- codegraph/plugins/django/extras.py +378 -0
- codegraph/plugins/django/models.py +508 -0
- codegraph/plugins/django/plugin.py +728 -0
- codegraph/plugins/django/schemas.py +339 -0
- codegraph/plugins/django/shapes.py +216 -0
- codegraph/plugins/django/urls.py +603 -0
- codegraph/plugins/express/__init__.py +0 -0
- codegraph/plugins/express/plugin.py +428 -0
- codegraph/plugins/flutter/__init__.py +0 -0
- codegraph/plugins/flutter/plugin.py +538 -0
- codegraph/plugins/kotlin/__init__.py +0 -0
- codegraph/plugins/kotlin/exact.py +457 -0
- codegraph/plugins/kotlin/plugin.py +1961 -0
- codegraph/plugins/kotlin/reparse.py +234 -0
- codegraph/plugins/laravel/__init__.py +0 -0
- codegraph/plugins/laravel/broadcast.py +351 -0
- codegraph/plugins/laravel/plugin.py +863 -0
- codegraph/plugins/laravel/tests.py +262 -0
- codegraph/plugins/laravel/values.py +728 -0
- codegraph/plugins/native/__init__.py +0 -0
- codegraph/plugins/native/gates.py +286 -0
- codegraph/plugins/native/runner.py +183 -0
- codegraph/plugins/native/scipread.py +194 -0
- codegraph/plugins/native/ts.py +54 -0
- codegraph/plugins/nest/__init__.py +0 -0
- codegraph/plugins/nest/plugin.py +654 -0
- codegraph/plugins/nextjs/__init__.py +0 -0
- codegraph/plugins/nextjs/plugin.py +336 -0
- codegraph/plugins/nuxt/__init__.py +0 -0
- codegraph/plugins/nuxt/plugin.py +308 -0
- codegraph/plugins/php/__init__.py +0 -0
- codegraph/plugins/php/extractor/composer.json +5 -0
- codegraph/plugins/php/extractor/composer.lock +76 -0
- codegraph/plugins/php/extractor/extract.php +743 -0
- codegraph/plugins/php/gating.py +573 -0
- codegraph/plugins/php/plugin.py +668 -0
- codegraph/plugins/php/strings.py +197 -0
- codegraph/plugins/python/__init__.py +0 -0
- codegraph/plugins/python/aitools.py +664 -0
- codegraph/plugins/python/external.py +245 -0
- codegraph/plugins/python/fields.py +107 -0
- codegraph/plugins/python/plugin.py +1733 -0
- codegraph/plugins/python/refs.py +485 -0
- codegraph/plugins/python/roots.py +412 -0
- codegraph/plugins/python/socketio.py +210 -0
- codegraph/plugins/python/subproc.py +864 -0
- codegraph/plugins/python/tests.py +1040 -0
- codegraph/plugins/python/values.py +179 -0
- codegraph/plugins/pyweb/__init__.py +0 -0
- codegraph/plugins/pyweb/plugin.py +1334 -0
- codegraph/plugins/pyweb/values.py +68 -0
- codegraph/plugins/rust/__init__.py +0 -0
- codegraph/plugins/rust/cargo.py +226 -0
- codegraph/plugins/rust/plugin.py +980 -0
- codegraph/plugins/rust/syntax.py +678 -0
- codegraph/plugins/scip/__init__.py +0 -0
- codegraph/plugins/scip/importer.py +129 -0
- codegraph/plugins/scip/scip.proto +962 -0
- codegraph/plugins/scip/scip_pb2.py +97 -0
- codegraph/plugins/stubs/__init__.py +0 -0
- codegraph/plugins/stubs/plugins.py +38 -0
- codegraph/plugins/swift/__init__.py +0 -0
- codegraph/plugins/swift/baseurl.py +109 -0
- codegraph/plugins/swift/exact.py +415 -0
- codegraph/plugins/swift/indexstore.py +209 -0
- codegraph/plugins/swift/packages.py +174 -0
- codegraph/plugins/swift/plugin.py +2890 -0
- codegraph/plugins/ts/__init__.py +0 -0
- codegraph/plugins/ts/baseurl.py +185 -0
- codegraph/plugins/ts/extractor/extract.mjs +2652 -0
- codegraph/plugins/ts/extractor/fw.mjs +685 -0
- codegraph/plugins/ts/extractor/package-lock.json +205 -0
- codegraph/plugins/ts/extractor/package.json +9 -0
- codegraph/plugins/ts/plugin.py +480 -0
- codegraph/plugins/tsweb/__init__.py +0 -0
- codegraph/plugins/tsweb/common.py +290 -0
- codegraph/plugins/tsweb/data.py +276 -0
- codegraph/presets/__init__.py +146 -0
- codegraph/presets/c_cpp.yaml +9 -0
- codegraph/presets/common.yaml +66 -0
- codegraph/presets/dart.yaml +9 -0
- codegraph/presets/django-ninja.yaml +15 -0
- codegraph/presets/django.yaml +25 -0
- codegraph/presets/djangorestframework.yaml +17 -0
- codegraph/presets/express.yaml +17 -0
- codegraph/presets/kotlin.yaml +11 -0
- codegraph/presets/laravel.yaml +40 -0
- codegraph/presets/nest.yaml +11 -0
- codegraph/presets/nextjs.yaml +15 -0
- codegraph/presets/nuxt.yaml +9 -0
- codegraph/presets/php.yaml +5 -0
- codegraph/presets/python.yaml +10 -0
- codegraph/presets/rust.yaml +5 -0
- codegraph/presets/swift.yaml +10 -0
- codegraph/presets/typescript.yaml +13 -0
- codegraph/process_runs.py +328 -0
- codegraph/protocols/__init__.py +299 -0
- codegraph/protocols/builtin.py +67 -0
- codegraph/protocols/matchers.py +144 -0
- codegraph/protocols/view.py +334 -0
- codegraph/query.py +2089 -0
- codegraph/realtime.py +260 -0
- codegraph/roundtrip.py +346 -0
- codegraph/routes.py +442 -0
- codegraph/starters.py +218 -0
- codegraph/tests_index.py +117 -0
- codegraph/viz/__init__.py +0 -0
- codegraph/viz/graph.py +369 -0
- codegraph/viz/server.py +198 -0
- codegraph/viz/static/app.css +148 -0
- codegraph/viz/static/app.js +1082 -0
- codegraph/viz/static/index.html +81 -0
- codegraph/viz/static/layered.js +237 -0
- codegraph/viz/static/vendor/VERSIONS.txt +4 -0
- codegraph/viz/static/vendor/cose-base.js +3214 -0
- codegraph/viz/static/vendor/cytoscape-fcose.js +1549 -0
- codegraph/viz/static/vendor/cytoscape.min.js +31 -0
- codegraph/viz/static/vendor/layout-base.js +5230 -0
- codegraph/viz/tools/package-lock.json +303 -0
- codegraph/viz/tools/package.json +7 -0
- codegraph/viz/tools/shoot.mjs +165 -0
- codegraph/xcode.py +251 -0
|
File without changes
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""SCIP import path: any SCIP-producing indexer (scip-php, scip-typescript, scip-clang,
|
|
2
|
+
rust-analyzer scip, scip-go, scip-python, scip-java) can feed the same graph.
|
|
3
|
+
|
|
4
|
+
Mapping
|
|
5
|
+
definition occurrence -> node (kind from the SCIP descriptor suffix: '#' type, '().' method,
|
|
6
|
+
'.' term, '/' namespace); id uses the same FQN scheme as native
|
|
7
|
+
plugins when the separator is known, so native + SCIP data merge.
|
|
8
|
+
reference occurrence -> edge from the innermost enclosing definition in the same document
|
|
9
|
+
(enclosing_range when the indexer provides it, else the nearest
|
|
10
|
+
preceding definition; confidence 'resolved' resp. 'heuristic').
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import re
|
|
15
|
+
import sys
|
|
16
|
+
from collections import defaultdict
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
sys.path.insert(0, str(Path(__file__).parent))
|
|
20
|
+
import scip_pb2 # noqa: E402 (generated from scip.proto with grpc_tools.protoc)
|
|
21
|
+
|
|
22
|
+
from ...core.model import HEURISTIC, RESOLVED # noqa: E402
|
|
23
|
+
from ...core.plugin import GraphBuilder # noqa: E402
|
|
24
|
+
from ..native.scipread import has_position, health_warning, occ_enclosing, occ_range # noqa: E402
|
|
25
|
+
|
|
26
|
+
NS_SEP = {"php": "\\", "go": "/", "rust": "::", "c_cpp": "::", "typescript": "/", "python": ".", "java": "."}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def parse_symbol(sym: str):
|
|
30
|
+
"""'scheme manager pkg ver descriptors' -> (descriptor string, kind, fqn parts)."""
|
|
31
|
+
if sym.startswith("local "):
|
|
32
|
+
return None
|
|
33
|
+
parts = sym.split(" ", 4)
|
|
34
|
+
if len(parts) < 5:
|
|
35
|
+
return None
|
|
36
|
+
desc = parts[4]
|
|
37
|
+
toks = re.findall(r"(`[^`]*`|[^/#.()\[\]:!]+)([/#.:!]|\(\)\.|\([^)]*\)\.|\[[^\]]*\])", desc)
|
|
38
|
+
if not toks:
|
|
39
|
+
return None
|
|
40
|
+
names = [(t[0].strip("`"), t[1]) for t in toks]
|
|
41
|
+
last_name, last_suf = names[-1]
|
|
42
|
+
if last_suf.startswith("("):
|
|
43
|
+
kind = "method"
|
|
44
|
+
elif last_suf == "#":
|
|
45
|
+
kind = "class"
|
|
46
|
+
elif last_suf == "/":
|
|
47
|
+
kind = "namespace"
|
|
48
|
+
elif last_suf in (".", ":"):
|
|
49
|
+
kind = "term"
|
|
50
|
+
else:
|
|
51
|
+
kind = "other"
|
|
52
|
+
return desc, kind, names
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def to_node(sym: str, lang: str):
|
|
56
|
+
p = parse_symbol(sym)
|
|
57
|
+
if not p:
|
|
58
|
+
return None
|
|
59
|
+
desc, kind, names = p
|
|
60
|
+
sep = NS_SEP.get(lang, "/")
|
|
61
|
+
ns = [n for n, s in names if s == "/"]
|
|
62
|
+
types = [n for n, s in names if s == "#"]
|
|
63
|
+
cls = sep.join(ns + types[:1]) if types else None
|
|
64
|
+
if kind == "class":
|
|
65
|
+
return "class", sep.join(ns + types), names[-1][0]
|
|
66
|
+
if kind == "method":
|
|
67
|
+
owner = sep.join(ns + types) if types else sep.join(ns)
|
|
68
|
+
return "method", f"{owner}::{names[-1][0]}" if types else f"{owner}{sep}{names[-1][0]}", names[-1][0]
|
|
69
|
+
if kind == "term" and types:
|
|
70
|
+
n = names[-1][0]
|
|
71
|
+
if n.startswith("$"):
|
|
72
|
+
return "property", f"{sep.join(ns + types)}::{n}", n
|
|
73
|
+
return "const", f"{sep.join(ns + types)}::{n}", n
|
|
74
|
+
return None
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def import_scip(path: str | Path, builder: GraphBuilder, lang: str = "php", skip_prefixes=("tests/",)) -> dict:
|
|
78
|
+
idx = scip_pb2.Index()
|
|
79
|
+
idx.ParseFromString(Path(path).read_bytes())
|
|
80
|
+
stats = defaultdict(int)
|
|
81
|
+
for doc in idx.documents:
|
|
82
|
+
rel = doc.relative_path
|
|
83
|
+
if rel.startswith(skip_prefixes):
|
|
84
|
+
stats["docs_skipped"] += 1
|
|
85
|
+
continue
|
|
86
|
+
stats["docs"] += 1
|
|
87
|
+
defs = [] # (start_line, end_line or None, node_id)
|
|
88
|
+
for o in doc.occurrences:
|
|
89
|
+
if o.symbol and not o.symbol.startswith("local "):
|
|
90
|
+
stats["occurrences"] += 1
|
|
91
|
+
stats["positioned"] += has_position(o)
|
|
92
|
+
if o.symbol_roles & scip_pb2.SymbolRole.Definition:
|
|
93
|
+
n = to_node(o.symbol, lang)
|
|
94
|
+
if not n:
|
|
95
|
+
continue
|
|
96
|
+
kind, key, name = n
|
|
97
|
+
start = occ_range(o)[0]
|
|
98
|
+
nid = builder.add_node(kind, key, name=name, fqn=key, file=rel, line=start + 1, lang=lang,
|
|
99
|
+
attrs={"scip_symbol": o.symbol})
|
|
100
|
+
er = occ_enclosing(o)
|
|
101
|
+
defs.append((start, er[2] if er else None, nid, kind))
|
|
102
|
+
stats["definitions"] += 1
|
|
103
|
+
defs.sort(key=lambda d: (d[0], -1 if d[1] is None else d[1], d[2]))
|
|
104
|
+
callables = [d for d in defs if d[3] in ("method",)]
|
|
105
|
+
for o in doc.occurrences:
|
|
106
|
+
if o.symbol_roles & scip_pb2.SymbolRole.Definition:
|
|
107
|
+
continue
|
|
108
|
+
n = to_node(o.symbol, lang)
|
|
109
|
+
if not n:
|
|
110
|
+
continue
|
|
111
|
+
kind, key, _ = n
|
|
112
|
+
line = occ_range(o)[0]
|
|
113
|
+
src, conf = None, HEURISTIC
|
|
114
|
+
for (sl, el, nid, k) in callables:
|
|
115
|
+
if sl <= line and (el is None or line <= el):
|
|
116
|
+
src = nid
|
|
117
|
+
conf = RESOLVED if el is not None else HEURISTIC
|
|
118
|
+
if src is None:
|
|
119
|
+
stats["refs_without_enclosing"] += 1
|
|
120
|
+
continue
|
|
121
|
+
dst = f"{kind}:{key}"
|
|
122
|
+
builder.add_edge(src, dst, "CALLS" if kind == "method" else "REFERENCES", rel, line + 1, conf, source="scip")
|
|
123
|
+
stats["references"] += 1
|
|
124
|
+
out = dict(stats)
|
|
125
|
+
w = health_warning(Path(path).name, out.get("occurrences", 0), out.get("positioned", 0),
|
|
126
|
+
out.get("definitions", 0))
|
|
127
|
+
if w:
|
|
128
|
+
out["warning"] = w
|
|
129
|
+
return out
|