@untangle-code/parser-registry 0.0.0-stage → 0.1.0
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.
- package/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +352 -2
- package/THIRD_PARTY_LICENSES.md +91 -0
- package/dist/boundaries/expression.d.ts +10 -0
- package/dist/boundaries/expression.d.ts.map +1 -0
- package/dist/boundaries/expression.js +95 -0
- package/dist/boundaries/expression.js.map +1 -0
- package/dist/boundaries/extract.d.ts +12 -0
- package/dist/boundaries/extract.d.ts.map +1 -0
- package/dist/boundaries/extract.js +259 -0
- package/dist/boundaries/extract.js.map +1 -0
- package/dist/boundaries/python.d.ts +6 -0
- package/dist/boundaries/python.d.ts.map +1 -0
- package/dist/boundaries/python.js +154 -0
- package/dist/boundaries/python.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/astgrep-backend/adapter.d.ts +101 -0
- package/dist/languages/astgrep-backend/adapter.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/adapter.js +130 -0
- package/dist/languages/astgrep-backend/adapter.js.map +1 -0
- package/dist/languages/astgrep-backend/index.d.ts +29 -0
- package/dist/languages/astgrep-backend/index.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/index.js +28 -0
- package/dist/languages/astgrep-backend/index.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/bash.d.ts +38 -0
- package/dist/languages/astgrep-backend/lang/bash.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/bash.js +42 -0
- package/dist/languages/astgrep-backend/lang/bash.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/c.d.ts +33 -0
- package/dist/languages/astgrep-backend/lang/c.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/c.js +85 -0
- package/dist/languages/astgrep-backend/lang/c.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/cpp.d.ts +27 -0
- package/dist/languages/astgrep-backend/lang/cpp.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/cpp.js +38 -0
- package/dist/languages/astgrep-backend/lang/cpp.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/csharp.d.ts +24 -0
- package/dist/languages/astgrep-backend/lang/csharp.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/csharp.js +102 -0
- package/dist/languages/astgrep-backend/lang/csharp.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/index.d.ts +29 -0
- package/dist/languages/astgrep-backend/lang/index.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/index.js +22 -0
- package/dist/languages/astgrep-backend/lang/index.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/java.d.ts +26 -0
- package/dist/languages/astgrep-backend/lang/java.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/java.js +89 -0
- package/dist/languages/astgrep-backend/lang/java.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/kotlin.d.ts +44 -0
- package/dist/languages/astgrep-backend/lang/kotlin.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/kotlin.js +94 -0
- package/dist/languages/astgrep-backend/lang/kotlin.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/php.d.ts +23 -0
- package/dist/languages/astgrep-backend/lang/php.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/php.js +80 -0
- package/dist/languages/astgrep-backend/lang/php.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/ruby.d.ts +37 -0
- package/dist/languages/astgrep-backend/lang/ruby.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/ruby.js +70 -0
- package/dist/languages/astgrep-backend/lang/ruby.js.map +1 -0
- package/dist/languages/astgrep-backend/lang/swift.d.ts +34 -0
- package/dist/languages/astgrep-backend/lang/swift.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/lang/swift.js +86 -0
- package/dist/languages/astgrep-backend/lang/swift.js.map +1 -0
- package/dist/languages/astgrep-backend/languages.d.ts +55 -0
- package/dist/languages/astgrep-backend/languages.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/languages.js +214 -0
- package/dist/languages/astgrep-backend/languages.js.map +1 -0
- package/dist/languages/astgrep-backend/napi.d.ts +71 -0
- package/dist/languages/astgrep-backend/napi.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/napi.js +176 -0
- package/dist/languages/astgrep-backend/napi.js.map +1 -0
- package/dist/languages/astgrep-backend/syntax.d.ts +88 -0
- package/dist/languages/astgrep-backend/syntax.d.ts.map +1 -0
- package/dist/languages/astgrep-backend/syntax.js +180 -0
- package/dist/languages/astgrep-backend/syntax.js.map +1 -0
- package/dist/languages/index.d.ts +14 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +37 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/javascript/index.d.ts +4 -0
- package/dist/languages/javascript/index.d.ts.map +1 -0
- package/dist/languages/javascript/index.js +7 -0
- package/dist/languages/javascript/index.js.map +1 -0
- package/dist/languages/jsx/index.d.ts +4 -0
- package/dist/languages/jsx/index.d.ts.map +1 -0
- package/dist/languages/jsx/index.js +7 -0
- package/dist/languages/jsx/index.js.map +1 -0
- package/dist/languages/prose/index.d.ts +53 -0
- package/dist/languages/prose/index.d.ts.map +1 -0
- package/dist/languages/prose/index.js +172 -0
- package/dist/languages/prose/index.js.map +1 -0
- package/dist/languages/prose/line-bytes.d.ts +31 -0
- package/dist/languages/prose/line-bytes.d.ts.map +1 -0
- package/dist/languages/prose/line-bytes.js +39 -0
- package/dist/languages/prose/line-bytes.js.map +1 -0
- package/dist/languages/python/create-adapter.d.ts +20 -0
- package/dist/languages/python/create-adapter.d.ts.map +1 -0
- package/dist/languages/python/create-adapter.js +9 -0
- package/dist/languages/python/create-adapter.js.map +1 -0
- package/dist/languages/python/index.d.ts +4 -0
- package/dist/languages/python/index.d.ts.map +1 -0
- package/dist/languages/python/index.js +6 -0
- package/dist/languages/python/index.js.map +1 -0
- package/dist/languages/python/profile.d.ts +36 -0
- package/dist/languages/python/profile.d.ts.map +1 -0
- package/dist/languages/python/profile.js +282 -0
- package/dist/languages/python/profile.js.map +1 -0
- package/dist/languages/python/signature.d.ts +53 -0
- package/dist/languages/python/signature.d.ts.map +1 -0
- package/dist/languages/python/signature.js +188 -0
- package/dist/languages/python/signature.js.map +1 -0
- package/dist/languages/python/table.d.ts +46 -0
- package/dist/languages/python/table.d.ts.map +1 -0
- package/dist/languages/python/table.js +88 -0
- package/dist/languages/python/table.js.map +1 -0
- package/dist/languages/shared/call-detection.d.ts +17 -0
- package/dist/languages/shared/call-detection.d.ts.map +1 -0
- package/dist/languages/shared/call-detection.js +86 -0
- package/dist/languages/shared/call-detection.js.map +1 -0
- package/dist/languages/shared/chunks.d.ts +28 -0
- package/dist/languages/shared/chunks.d.ts.map +1 -0
- package/dist/languages/shared/chunks.js +181 -0
- package/dist/languages/shared/chunks.js.map +1 -0
- package/dist/languages/shared/create-adapter.d.ts +11 -0
- package/dist/languages/shared/create-adapter.d.ts.map +1 -0
- package/dist/languages/shared/create-adapter.js +90 -0
- package/dist/languages/shared/create-adapter.js.map +1 -0
- package/dist/languages/shared/decisions.d.ts +45 -0
- package/dist/languages/shared/decisions.d.ts.map +1 -0
- package/dist/languages/shared/decisions.js +141 -0
- package/dist/languages/shared/decisions.js.map +1 -0
- package/dist/languages/shared/dialect.d.ts +18 -0
- package/dist/languages/shared/dialect.d.ts.map +1 -0
- package/dist/languages/shared/dialect.js +37 -0
- package/dist/languages/shared/dialect.js.map +1 -0
- package/dist/languages/shared/doc-binding.d.ts +26 -0
- package/dist/languages/shared/doc-binding.d.ts.map +1 -0
- package/dist/languages/shared/doc-binding.js +50 -0
- package/dist/languages/shared/doc-binding.js.map +1 -0
- package/dist/languages/shared/engine.d.ts +49 -0
- package/dist/languages/shared/engine.d.ts.map +1 -0
- package/dist/languages/shared/engine.js +317 -0
- package/dist/languages/shared/engine.js.map +1 -0
- package/dist/languages/shared/extract-symbols.d.ts +5 -0
- package/dist/languages/shared/extract-symbols.d.ts.map +1 -0
- package/dist/languages/shared/extract-symbols.js +31 -0
- package/dist/languages/shared/extract-symbols.js.map +1 -0
- package/dist/languages/shared/fingerprint.d.ts +7 -0
- package/dist/languages/shared/fingerprint.d.ts.map +1 -0
- package/dist/languages/shared/fingerprint.js +95 -0
- package/dist/languages/shared/fingerprint.js.map +1 -0
- package/dist/languages/shared/grammar-loader.d.ts +15 -0
- package/dist/languages/shared/grammar-loader.d.ts.map +1 -0
- package/dist/languages/shared/grammar-loader.js +48 -0
- package/dist/languages/shared/grammar-loader.js.map +1 -0
- package/dist/languages/shared/import-detection.d.ts +24 -0
- package/dist/languages/shared/import-detection.d.ts.map +1 -0
- package/dist/languages/shared/import-detection.js +138 -0
- package/dist/languages/shared/import-detection.js.map +1 -0
- package/dist/languages/shared/js-family-profile.d.ts +5 -0
- package/dist/languages/shared/js-family-profile.d.ts.map +1 -0
- package/dist/languages/shared/js-family-profile.js +179 -0
- package/dist/languages/shared/js-family-profile.js.map +1 -0
- package/dist/languages/shared/node-kinds.d.ts +78 -0
- package/dist/languages/shared/node-kinds.d.ts.map +1 -0
- package/dist/languages/shared/node-kinds.js +141 -0
- package/dist/languages/shared/node-kinds.js.map +1 -0
- package/dist/languages/shared/node-utils.d.ts +31 -0
- package/dist/languages/shared/node-utils.d.ts.map +1 -0
- package/dist/languages/shared/node-utils.js +89 -0
- package/dist/languages/shared/node-utils.js.map +1 -0
- package/dist/languages/shared/parse-diagnostics.d.ts +44 -0
- package/dist/languages/shared/parse-diagnostics.d.ts.map +1 -0
- package/dist/languages/shared/parse-diagnostics.js +64 -0
- package/dist/languages/shared/parse-diagnostics.js.map +1 -0
- package/dist/languages/shared/parse-limits.d.ts +24 -0
- package/dist/languages/shared/parse-limits.d.ts.map +1 -0
- package/dist/languages/shared/parse-limits.js +134 -0
- package/dist/languages/shared/parse-limits.js.map +1 -0
- package/dist/languages/shared/profile.d.ts +149 -0
- package/dist/languages/shared/profile.d.ts.map +1 -0
- package/dist/languages/shared/profile.js +9 -0
- package/dist/languages/shared/profile.js.map +1 -0
- package/dist/languages/shared/scope-model.d.ts +32 -0
- package/dist/languages/shared/scope-model.d.ts.map +1 -0
- package/dist/languages/shared/scope-model.js +2 -0
- package/dist/languages/shared/scope-model.js.map +1 -0
- package/dist/languages/shared/scope-naming.d.ts +20 -0
- package/dist/languages/shared/scope-naming.d.ts.map +1 -0
- package/dist/languages/shared/scope-naming.js +118 -0
- package/dist/languages/shared/scope-naming.js.map +1 -0
- package/dist/languages/shared/scope-signature.d.ts +14 -0
- package/dist/languages/shared/scope-signature.d.ts.map +1 -0
- package/dist/languages/shared/scope-signature.js +82 -0
- package/dist/languages/shared/scope-signature.js.map +1 -0
- package/dist/languages/shared/signature.d.ts +55 -0
- package/dist/languages/shared/signature.d.ts.map +1 -0
- package/dist/languages/shared/signature.js +147 -0
- package/dist/languages/shared/signature.js.map +1 -0
- package/dist/languages/shared/syntax.d.ts +115 -0
- package/dist/languages/shared/syntax.d.ts.map +1 -0
- package/dist/languages/shared/syntax.js +2 -0
- package/dist/languages/shared/syntax.js.map +1 -0
- package/dist/languages/shared/table-profile-decisions.d.ts +54 -0
- package/dist/languages/shared/table-profile-decisions.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-decisions.js +245 -0
- package/dist/languages/shared/table-profile-decisions.js.map +1 -0
- package/dist/languages/shared/table-profile-module-facts.d.ts +29 -0
- package/dist/languages/shared/table-profile-module-facts.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-module-facts.js +139 -0
- package/dist/languages/shared/table-profile-module-facts.js.map +1 -0
- package/dist/languages/shared/table-profile-queries.d.ts +27 -0
- package/dist/languages/shared/table-profile-queries.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-queries.js +70 -0
- package/dist/languages/shared/table-profile-queries.js.map +1 -0
- package/dist/languages/shared/table-profile-scopes.d.ts +46 -0
- package/dist/languages/shared/table-profile-scopes.d.ts.map +1 -0
- package/dist/languages/shared/table-profile-scopes.js +180 -0
- package/dist/languages/shared/table-profile-scopes.js.map +1 -0
- package/dist/languages/shared/table-profile.d.ts +302 -0
- package/dist/languages/shared/table-profile.d.ts.map +1 -0
- package/dist/languages/shared/table-profile.js +125 -0
- package/dist/languages/shared/table-profile.js.map +1 -0
- package/dist/languages/shared/tree-sitter-types.d.ts +44 -0
- package/dist/languages/shared/tree-sitter-types.d.ts.map +1 -0
- package/dist/languages/shared/tree-sitter-types.js +2 -0
- package/dist/languages/shared/tree-sitter-types.js.map +1 -0
- package/dist/languages/structured-text/index.d.ts +48 -0
- package/dist/languages/structured-text/index.d.ts.map +1 -0
- package/dist/languages/structured-text/index.js +120 -0
- package/dist/languages/structured-text/index.js.map +1 -0
- package/dist/languages/tsx/index.d.ts +4 -0
- package/dist/languages/tsx/index.d.ts.map +1 -0
- package/dist/languages/tsx/index.js +7 -0
- package/dist/languages/tsx/index.js.map +1 -0
- package/dist/languages/typescript/index.d.ts +4 -0
- package/dist/languages/typescript/index.d.ts.map +1 -0
- package/dist/languages/typescript/index.js +7 -0
- package/dist/languages/typescript/index.js.map +1 -0
- package/dist/languages/vue/index.d.ts +21 -0
- package/dist/languages/vue/index.d.ts.map +1 -0
- package/dist/languages/vue/index.js +234 -0
- package/dist/languages/vue/index.js.map +1 -0
- package/dist/languages/vue/mapping.d.ts +11 -0
- package/dist/languages/vue/mapping.d.ts.map +1 -0
- package/dist/languages/vue/mapping.js +77 -0
- package/dist/languages/vue/mapping.js.map +1 -0
- package/dist/registry.d.ts +24 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +42 -0
- package/dist/registry.js.map +1 -0
- package/dist/text/byte-offset-table.d.ts +27 -0
- package/dist/text/byte-offset-table.d.ts.map +1 -0
- package/dist/text/byte-offset-table.js +39 -0
- package/dist/text/byte-offset-table.js.map +1 -0
- package/package.json +125 -3
- package/src/boundaries/expression.ts +95 -0
- package/src/boundaries/extract.ts +307 -0
- package/src/boundaries/python.ts +181 -0
- package/src/index.ts +51 -0
- package/src/languages/__golden__/javascript-basic.json +32 -0
- package/src/languages/__golden__/tsx-basic.json +19 -0
- package/src/languages/__golden__/typescript-basic.json +37 -0
- package/src/languages/astgrep-backend/GRAMMARS.md +86 -0
- package/src/languages/astgrep-backend/README.md +112 -0
- package/src/languages/astgrep-backend/__golden__/bash-basic.sh +53 -0
- package/src/languages/astgrep-backend/__golden__/c-basic.c +64 -0
- package/src/languages/astgrep-backend/__golden__/cpp-basic.cpp +65 -0
- package/src/languages/astgrep-backend/__golden__/csharp-basic.cs +73 -0
- package/src/languages/astgrep-backend/__golden__/go-basic.go +93 -0
- package/src/languages/astgrep-backend/__golden__/java-basic.java +62 -0
- package/src/languages/astgrep-backend/__golden__/kotlin-basic.kt +58 -0
- package/src/languages/astgrep-backend/__golden__/php-basic.php +72 -0
- package/src/languages/astgrep-backend/__golden__/ruby-basic.rb +62 -0
- package/src/languages/astgrep-backend/__golden__/rust-basic.rs +82 -0
- package/src/languages/astgrep-backend/__golden__/swift-basic.swift +73 -0
- package/src/languages/astgrep-backend/adapter.ts +240 -0
- package/src/languages/astgrep-backend/index.ts +44 -0
- package/src/languages/astgrep-backend/lang/README.md +115 -0
- package/src/languages/astgrep-backend/lang/bash.ts +78 -0
- package/src/languages/astgrep-backend/lang/c.ts +119 -0
- package/src/languages/astgrep-backend/lang/cpp.ts +65 -0
- package/src/languages/astgrep-backend/lang/csharp.ts +125 -0
- package/src/languages/astgrep-backend/lang/index.ts +61 -0
- package/src/languages/astgrep-backend/lang/java.ts +115 -0
- package/src/languages/astgrep-backend/lang/kotlin.ts +136 -0
- package/src/languages/astgrep-backend/lang/php.ts +105 -0
- package/src/languages/astgrep-backend/lang/ruby.ts +105 -0
- package/src/languages/astgrep-backend/lang/swift.ts +118 -0
- package/src/languages/astgrep-backend/languages.ts +238 -0
- package/src/languages/astgrep-backend/napi.ts +261 -0
- package/src/languages/astgrep-backend/syntax.ts +242 -0
- package/src/languages/index.ts +53 -0
- package/src/languages/javascript/index.ts +9 -0
- package/src/languages/jsx/index.ts +9 -0
- package/src/languages/prose/index.ts +270 -0
- package/src/languages/prose/line-bytes.ts +52 -0
- package/src/languages/python/README.md +246 -0
- package/src/languages/python/__golden__/python-basic.json +44 -0
- package/src/languages/python/create-adapter.ts +29 -0
- package/src/languages/python/index.ts +8 -0
- package/src/languages/python/profile.ts +341 -0
- package/src/languages/python/signature.ts +183 -0
- package/src/languages/python/table.ts +135 -0
- package/src/languages/shared/__fixtures__/large-over-32kib.ts.txt +1207 -0
- package/src/languages/shared/call-detection.ts +112 -0
- package/src/languages/shared/chunks.ts +255 -0
- package/src/languages/shared/create-adapter.ts +136 -0
- package/src/languages/shared/decisions.ts +204 -0
- package/src/languages/shared/dialect.ts +55 -0
- package/src/languages/shared/doc-binding.ts +78 -0
- package/src/languages/shared/engine.ts +461 -0
- package/src/languages/shared/extract-symbols.ts +35 -0
- package/src/languages/shared/fingerprint.ts +99 -0
- package/src/languages/shared/grammar-loader.ts +67 -0
- package/src/languages/shared/import-detection.ts +154 -0
- package/src/languages/shared/js-family-profile.ts +246 -0
- package/src/languages/shared/node-kinds.ts +153 -0
- package/src/languages/shared/node-utils.ts +120 -0
- package/src/languages/shared/parse-diagnostics.ts +125 -0
- package/src/languages/shared/parse-limits.ts +147 -0
- package/src/languages/shared/profile.ts +184 -0
- package/src/languages/shared/scope-model.ts +43 -0
- package/src/languages/shared/scope-naming.ts +124 -0
- package/src/languages/shared/scope-signature.ts +108 -0
- package/src/languages/shared/signature.ts +149 -0
- package/src/languages/shared/syntax.ts +116 -0
- package/src/languages/shared/table-profile-decisions.ts +251 -0
- package/src/languages/shared/table-profile-module-facts.ts +177 -0
- package/src/languages/shared/table-profile-queries.ts +85 -0
- package/src/languages/shared/table-profile-scopes.ts +198 -0
- package/src/languages/shared/table-profile.ts +427 -0
- package/src/languages/shared/tree-sitter-types.ts +46 -0
- package/src/languages/structured-text/index.ts +192 -0
- package/src/languages/tsx/index.ts +9 -0
- package/src/languages/typescript/index.ts +9 -0
- package/src/languages/vue/index.ts +312 -0
- package/src/languages/vue/mapping.ts +93 -0
- package/src/registry.ts +61 -0
- package/src/text/byte-offset-table.ts +63 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
<a id="python-adapter-wp-09"></a>
|
|
2
|
+
|
|
3
|
+
# Python adapter (WP-09)
|
|
4
|
+
|
|
5
|
+
Python `LanguageAdapter` (`@untangle-code/domain`), support level `deep` (spec.md §7.1–§7.3).
|
|
6
|
+
Assigned write scope: `packages/parser-registry/src/languages/python/**`, plus the single
|
|
7
|
+
registration line reserved for WP-09 in `../index.ts` (`registry.register(createPythonAdapter());`).
|
|
8
|
+
|
|
9
|
+
Normative sources: spec.md §7.1–§7.3, §16.2–§16.8; architecture.md §6.5, §15.1. Every type
|
|
10
|
+
(`LanguageAdapter`, `ParsedAst`, `ExtractedSymbol`, `RawImport`, `RawCall`, `ComplexityFacts`,
|
|
11
|
+
`HalsteadTokens`, `AstRegion`, etc.) comes unchanged from domain; this module defines no competing types.
|
|
12
|
+
|
|
13
|
+
<a id="grammatik-wahl"></a>
|
|
14
|
+
|
|
15
|
+
## Grammar choice
|
|
16
|
+
|
|
17
|
+
**No `tree-sitter-python`.** WP-09's write scope is exclusively `languages/python/**`; adding a
|
|
18
|
+
native grammar requires editing `package.json`, outside that scope and prohibited by the task.
|
|
19
|
+
WP-06's package README explicitly allows either native tree-sitter bindings (recommended, same
|
|
20
|
+
pattern) or another approach; the registry is grammar-agnostic.
|
|
21
|
+
|
|
22
|
+
The chosen approach is a **handwritten indentation-based tokenizer and recursive-descent parser**
|
|
23
|
+
with its own explicit AST (`ast.ts`, discriminated unions, no generic tree-sitter-shaped node).
|
|
24
|
+
`languages/shared/*` (decisions, node kinds, calls/imports, signatures, fingerprints, chunks) is
|
|
25
|
+
bound to JS/TS grammar vocabulary (`if_statement`, `catch_clause`, `binary_expression`, `<`/`>` as
|
|
26
|
+
generic brackets, no `elif`/`except`/`match`/`with`/walrus). It is insufficiently generic for Python
|
|
27
|
+
without distortion. This module supplies small corresponding `engine.ts`, `signature.ts`,
|
|
28
|
+
`fingerprint.ts`, `chunks.ts`, `extract-symbols.ts` implementations satisfying the same domain contracts.
|
|
29
|
+
|
|
30
|
+
**File-to-module mapping:**
|
|
31
|
+
|
|
32
|
+
| File | Role |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `tokenizer.ts` | INDENT/DEDENT/NEWLINE lexer, r/b/f and triple-quoted string prefixes, bracket depth for implicit line joining, backslash continuation |
|
|
35
|
+
| `ast.ts` | Own AST node types (`Stmt`/`Expr` unions) |
|
|
36
|
+
| `parser.ts` | Recursive-descent parser with panic-mode recovery |
|
|
37
|
+
| `engine.ts` | ONE unified traversal: scope tree, `ComplexityFacts`, imports, calls |
|
|
38
|
+
| `signature.ts` | Signature normalization (spec.md §5.5), Python-specific rules |
|
|
39
|
+
| `fingerprint.ts` | `astHash`/`tokenFingerprint` from the custom AST |
|
|
40
|
+
| `chunks.ts` | `AstRegion` tree from scope tree |
|
|
41
|
+
| `extract-symbols.ts` | Scope tree → `ExtractedSymbol[]` |
|
|
42
|
+
| `create-adapter.ts` | `LanguageAdapter` composition, parse-quality classification |
|
|
43
|
+
| `index.ts` | `createPythonAdapter()`, the subdirectory's only public export |
|
|
44
|
+
|
|
45
|
+
<a id="eine-einzige-analyse-pro-datei"></a>
|
|
46
|
+
|
|
47
|
+
## One analysis per file
|
|
48
|
+
|
|
49
|
+
As in WP-06, every adapter method is a thin projection over ONE `AnalysisResult`, calculated by
|
|
50
|
+
`engine.ts#analyzeModule` in one recursive traversal of the `Module` AST and cached per `ParsedAst`
|
|
51
|
+
through a `WeakMap` in `create-adapter.ts`. A `SymbolScopeFact.symbolScopeId` therefore equals a
|
|
52
|
+
`RawCall.callerScopeId` for calls within that scope.
|
|
53
|
+
|
|
54
|
+
<a id="python-besonderheiten--wie-sie-behandelt-werden"></a>
|
|
55
|
+
|
|
56
|
+
## Python-specific handling
|
|
57
|
+
|
|
58
|
+
- **Indentation as block structure:** `tokenizer.ts` measures columns, expanding tabs to multiples
|
|
59
|
+
of 8 only for comparison without changing byte/character offsets, and emits INDENT/DEDENT;
|
|
60
|
+
`parser.ts#parseSuite` consumes them.
|
|
61
|
+
- **`elif` is continuation, not new nesting** (spec.md §16.4, like `else if`). `parseIf` builds
|
|
62
|
+
nested `If` chains (`orelse: [If]`), as CPython's `ast` does, marking nested nodes
|
|
63
|
+
`isElifContinuation: true`. The engine emits `DecisionKind: "else_if"` PLUS `NestingFact` with
|
|
64
|
+
`continuation: true` contained within the outer `if`, not a sibling span. This is precisely
|
|
65
|
+
what `@untangle-code/complexity#buildSymbolIR` expects for avoiding a full nesting increment.
|
|
66
|
+
- **`with` / `async with`:** neither decisions nor nesting boundaries (absent from the spec's
|
|
67
|
+
decision list); transparent blocks like plain `{}` in TS/JS.
|
|
68
|
+
- **Multiple-clause comprehensions:** every `for` is `DecisionKind: "loop"` plus
|
|
69
|
+
`NestingFact("loop")` (spec.md §16.2 for-each), every filter `if` is `DecisionKind: "if"` plus
|
|
70
|
+
`NestingFact("if")`. Each range spans its keyword through the comprehension's end, correctly
|
|
71
|
+
containing later clauses and matching the containment stack. Two `for` and one `if` therefore
|
|
72
|
+
produce `["loop", "loop", "if"]`.
|
|
73
|
+
- **`try`/`except`/`else`/`finally`:** only each `except` is a `DecisionKind: "catch"`, like JS/TS
|
|
74
|
+
`catch_clause`; the other bodies are transparent.
|
|
75
|
+
- **`match`/`case`:** `match` itself is ONLY `NestingFact("switch")`, not a decision, like
|
|
76
|
+
`switch_statement`. Every arm is `DecisionKind: "case"`. Patterns are NOT parsed fully
|
|
77
|
+
structurally (decision 3); each `|` alternative beyond the first emits
|
|
78
|
+
`DecisionKind: "pattern_alternative"` (spec.md §16.3, extended cyclomatic,
|
|
79
|
+
`countsForClassic: false`).
|
|
80
|
+
- **Decorators:** no separate `ChunkKind` (`CHUNK_KINDS` has no `"decorator"`). A decorated
|
|
81
|
+
`def`/`class` region starts at its FIRST decorator: `openScope` receives `node.pos` already
|
|
82
|
+
expanded by the parser, preventing decorator lines from falling into gaps (spec.md §8.4), like
|
|
83
|
+
WP-06's export-wrapper-inclusive symbol regions. Decorator EXPRESSIONS are traversed in the
|
|
84
|
+
OUTER scope where definition-time evaluation occurs, attributing `@app.route("/x")`, for
|
|
85
|
+
example, to the enclosing function.
|
|
86
|
+
- **Nested functions/lambdas:** as in TS/JS, `FunctionDef`/`Lambda` within an executable scope
|
|
87
|
+
adds `NestingFact("lambda")` to the OUTER scope in addition to creating its own scope, following
|
|
88
|
+
spec.md §16.4's documented local-function/lambda nesting context.
|
|
89
|
+
- **Walrus (`:=`):** `NamedExpr`; not a decision, but operator token `:=` plus a `declaration`
|
|
90
|
+
identifier fact for its target.
|
|
91
|
+
- **`global`/`nonlocal`:** separate statement nodes with `reference` identifier facts for names.
|
|
92
|
+
Scope resolution is for a later symbol resolver, not this adapter.
|
|
93
|
+
- **`async def`/`await`/`async for`/`async with`:** fully recognized: `isAsync` on
|
|
94
|
+
`FunctionDef`/`For`/`With`, separate `Await` expression nodes and `"await"` operator tokens.
|
|
95
|
+
|
|
96
|
+
<a id="signaturnormalisierung-specmd-55--signaturets"></a>
|
|
97
|
+
|
|
98
|
+
## Signature normalization (spec.md §5.5) — `signature.ts`
|
|
99
|
+
|
|
100
|
+
1. **Whitespace** collapses to one space; spacing around `,`/`:` is canonicalized.
|
|
101
|
+
2. **Default values** (`= <expr>`) are removed from parameter lists, as in TS/JS: defaults are
|
|
102
|
+
calling convenience, not another overload.
|
|
103
|
+
3. **Type annotations** (`: <type>`) remain literal apart from whitespace normalization.
|
|
104
|
+
4. **`*args`/`**kwargs`/bare `*`/`/` markers:** `*`/`**`/`/` characters remain exact.
|
|
105
|
+
5. **Return types** (`-> <type>`) remain literal, with exactly one space around `->`.
|
|
106
|
+
|
|
107
|
+
**Documented TS/JS asymmetry:** TypeScript retains optional `?` independently of defaults because
|
|
108
|
+
it has dedicated syntax. Python has NO equivalent; default presence is unrecoverable after
|
|
109
|
+
normalization, just like TS/JS parameters without `?`. No informational asymmetry is invented;
|
|
110
|
+
there is simply nothing to retain.
|
|
111
|
+
|
|
112
|
+
<a id="entscheidungen"></a>
|
|
113
|
+
|
|
114
|
+
## Decisions
|
|
115
|
+
|
|
116
|
+
1. **No `tree-sitter-python`** (see Grammar choice): handwritten tokenizer/parser/traversal and
|
|
117
|
+
own AST. Support remains `deep`: spec.md §7.1 requires complete chunking/symbol/call/import/
|
|
118
|
+
complexity support, not a particular parser technology.
|
|
119
|
+
2. **`PyScopeNode.kind` has NO `"property"` member**, unlike WP-06's `ScopeNode`. Python class
|
|
120
|
+
attributes are ordinary `Assign`/`AnnAssign` statements, not a separate grammar category with
|
|
121
|
+
signature/visibility like TS fields. They produce no `ExtractedSymbol` or dedicated chunk;
|
|
122
|
+
their text remains in the class body, covered as gaps or by `class_overview`. Named field
|
|
123
|
+
symbols can be added when needed by a consumer.
|
|
124
|
+
3. **Patterns are NOT fully structurally parsed** (`parser.ts#scanPatternAlternatives`). A
|
|
125
|
+
bracket-depth-aware scan finds `|` alternatives and simple name captures rather than validated
|
|
126
|
+
capture/literal/class/sequence/mapping AST nodes. This supports `pattern_alternative` decisions
|
|
127
|
+
and capture identifier facts; full pattern grammar remains additively implementable if needed.
|
|
128
|
+
4. **`__init__.py` re-export convention:** Python lacks explicit JS-style `export { x } from "y"`.
|
|
129
|
+
Module-level imports in `__init__.py`/`__init__.pyi` conventionally form public package APIs, so
|
|
130
|
+
EVERY top-level import/from-import, such as `from .mod import X` or `import X`, receives
|
|
131
|
+
`importKind: "re_export"` rather than `"import"`. Nested imports remain `"import"`.
|
|
132
|
+
This is a documented heuristic, not a normative spec/architecture rule.
|
|
133
|
+
5. **Visibility by naming** (`engine.ts#visibilityOf`): leading `__` without trailing `__` means
|
|
134
|
+
`"private"` (name mangling); one leading `_` means `"protected"`; dunder methods (`__init__`,
|
|
135
|
+
`__repr__`, …) receive `undefined` because they are public protocol, NOT private despite `_`.
|
|
136
|
+
No normative value was prescribed; this directly follows common PEP 8 convention.
|
|
137
|
+
6. **`exportedNames` from `__all__` or underscore convention:** module `__all__ = [...]` is the
|
|
138
|
+
final list when present; otherwise top-level names not starting `_` count as exported (PEP 8).
|
|
139
|
+
Only top-level functions/classes receive non-empty `exportedNames`; nested methods/functions
|
|
140
|
+
always receive `[]`, following WP-06's module-export semantics.
|
|
141
|
+
7. **Guard heuristic matches WP-06:** an `if` without `elif`/`else`, whose sole body statement is
|
|
142
|
+
`return`/`raise`/`break`/`continue`, becomes `DecisionKind: "guard"`, not `"if"` (spec.md §16.2).
|
|
143
|
+
8. **Halstead classification:** brackets, commas, colons and dots are structural, not operators.
|
|
144
|
+
Control/expression keywords (`if`, `for`, `and`, `or`, `not`, `await`, `yield`, `:=`, augmented
|
|
145
|
+
assignment, comparisons `in`/`is`/`is not`/`not in`, etc.) are operators; identifiers/literals,
|
|
146
|
+
including f-string text as `"template"`, are operands, deliberately matching WP-06 decision 9.
|
|
147
|
+
9. **f-strings:** the tokenizer reads ONE `STRING` with `isFString` and raw body.
|
|
148
|
+
`parseFStringExpressions` extracts brace-depth/string-aware `{…}` segments, strips
|
|
149
|
+
`!conversion`/`:format_spec` and self-documenting `{x=}`, then parses each through a second
|
|
150
|
+
position-adjusted tokenizer/parser pass into real `Expr` nodes (`JoinedStr.values`). Calls and
|
|
151
|
+
conditions INSIDE f-strings (`f"{compute(a, b)}"`, `f"{x if y else z}"`) therefore remain visible.
|
|
152
|
+
Replacement fields INSIDE format specifications (`f"{v:>{width}}"`) are also evaluated, through
|
|
153
|
+
an explicit worklist rather than recursion. Results are sorted by source position so ordering
|
|
154
|
+
depends only on source. For Halstead, the ENTIRE f-string still counts as one `"template"`
|
|
155
|
+
operand, avoiding repeated tokenization of text outside `{}`: a documented simplification.
|
|
156
|
+
|
|
157
|
+
**E4 (WP-115):** subparsing discards nothing silently. Unparseable expressions, depth aborts,
|
|
158
|
+
unclosed `{`, lone `}`, expressionless fields, unconsumed field text and every subparse lexer/
|
|
159
|
+
parser finding become diagnostics on the MAIN parser. `classifyParseQuality` can no longer
|
|
160
|
+
call lost f-string content `"complete"`. Depth aborts use a separate
|
|
161
|
+
`ParseDepthExceededError`, preventing speculative rollback (`tryParseMatch`) from treating
|
|
162
|
+
them as an ordinary "not a `match` after all".
|
|
163
|
+
10. **Parameter defaults/annotations are traversed in the function's own scope**, not the outer
|
|
164
|
+
scope where definition-time evaluation occurs. This documented simplification affects none
|
|
165
|
+
of spec.md §16's required metrics because parameter lists contain no control flow.
|
|
166
|
+
11. **Parse-quality thresholds use lines, not nodes** (`create-adapter.ts#classifyParseQuality`).
|
|
167
|
+
The parser has no ERROR/MISSING nodes; panic-mode diagnostics may skip arbitrarily large
|
|
168
|
+
broken regions. Diagnostic/non-empty-line ratios are used instead: ≥30% means `failed`, as
|
|
169
|
+
does an empty module with non-empty source; otherwise `partial`. This is an independently
|
|
170
|
+
documented threshold, analogous to WP-06's 50% node threshold.
|
|
171
|
+
12. **Error fallback ALWAYS consumes a token**, including INDENT/DEDENT/NEWLINE/ENDMARKER in
|
|
172
|
+
`parser.ts#parseAtom`. Not consuming structural tokens to improve broken-block recovery was
|
|
173
|
+
empirically rejected after infinite loops/OOM in paths whose surrounding loops lacked
|
|
174
|
+
progress guards. Never crashing/hanging (spec.md §7.3) takes priority over maximum syntax
|
|
175
|
+
recovery. Severely broken files become `parseQuality: "failed"` with `ast: null` anyway, so
|
|
176
|
+
the resulting partial AST is never consumed.
|
|
177
|
+
13. **`for`/comprehension/`with as` targets do NOT use full expression grammar**
|
|
178
|
+
(`parser.ts#parseTargetList`/`parseTargetAtom`). Full grammar reaches `parseComparison`, which
|
|
179
|
+
interprets `in` as comparison: in `for x in a:`, it greedily expands `x` into `x in a` before
|
|
180
|
+
the loop can consume its expected `in`, discovered by `parser.test.ts`. Targets therefore use
|
|
181
|
+
restricted `atom_trailer` grammar—name/attribute/subscript/star/tuple/list—matching valid
|
|
182
|
+
Python target forms.
|
|
183
|
+
14. **Calls without nameable targets are not reported as calls** (`engine.ts#detectCall`). Only
|
|
184
|
+
`name(...)` and `obj.attr(...)` provide `calleeName`; `f()()`, `d["k"]()`, `(lambda: g)()` and
|
|
185
|
+
similar forms have no source name for a resolver. No placeholder is invented. This is a
|
|
186
|
+
**known limit**, not silent E4 loss: the complete `Call` and arguments remain in AST and
|
|
187
|
+
complexity facts; only the call EDGE is absent. Runtime visibility requires an adapter
|
|
188
|
+
`SkipLedgerV1` channel alongside `RawCall[]`; until then the limit is documented here.
|
|
189
|
+
|
|
190
|
+
## Tests
|
|
191
|
+
|
|
192
|
+
`npx vitest run`, co-located `*.test.ts` in this directory:
|
|
193
|
+
|
|
194
|
+
- `tokenizer.test.ts`: INDENT/DEDENT, implicit bracket line joining, backslash continuation,
|
|
195
|
+
prefixes/triple quoting, numeric forms and no throws for malformed strings/brackets.
|
|
196
|
+
- `parser.test.ts`: functions, `elif` containment/`isElifContinuation`, multiple `elif`, two-`for`/
|
|
197
|
+
one-`if` comprehensions, filtered dict comprehensions, `async def`/`await`, `async for`/
|
|
198
|
+
`async with`, walrus, `global`/`nonlocal`, decorators, `try`/`except`/`else`/`finally`,
|
|
199
|
+
`match`/`case` (or patterns, guards, wildcard, class/sequence patterns), distinguishing `match`
|
|
200
|
+
identifiers, relative/star imports, parameter markers, syntax recovery, docstrings, f-string
|
|
201
|
+
extraction and a dedicated never-hang/throw stress test of garbage/unbalanced brackets and
|
|
202
|
+
deeply nested garbage input.
|
|
203
|
+
- `parse-honesty.test.ts`: WP-76, parse aborts from stack depth or unexpected internal errors must
|
|
204
|
+
never appear as `parseQuality: "complete"` with empty results.
|
|
205
|
+
- `fstring-honesty.test.ts`: WP-115, the same rule for f-string subparsing. Fourteen loss cases
|
|
206
|
+
(expression/format depth aborts, broken expressions, open `{`, lone `}`, empty fields, leftover
|
|
207
|
+
text, unknown characters) enforce never complete after discarded subparsing; twenty-eight
|
|
208
|
+
valid forms control false positives. Tests prove nested-format calls and whitespace-padded
|
|
209
|
+
fields reach the AST and `case`-guard depth aborts survive speculative `match` parsing.
|
|
210
|
+
- `adapters.test.ts`: partial/failed quality without crashes; nonoverlapping method chunk regions;
|
|
211
|
+
decorators inside symbol regions; `function`/`class`/`method`/`constructor` classification;
|
|
212
|
+
visibility, `exportedNames` with/without `__all__`, docstrings, regular/from/relative/star/
|
|
213
|
+
`__init__.py` imports, calls, formatting-stable signatures, stable `astHash`/`tokenFingerprint`,
|
|
214
|
+
guards, continuation `elif`, comprehension/catch/case/pattern-alternative decisions, grouped
|
|
215
|
+
boolean chains, scope-ID consistency across decisions/calls, nested-function/lambda nesting.
|
|
216
|
+
- `golden.test.ts` and `__golden__/python-basic.json`: symbols, imports, calls, decision kinds,
|
|
217
|
+
scope-ID consistency and AST depth, matching WP-06's golden format.
|
|
218
|
+
|
|
219
|
+
<a id="verifikation"></a>
|
|
220
|
+
|
|
221
|
+
## Verification
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
npx tsc --noEmit -p tsconfig.typecheck.json # 0 errors (entire package, including TS/JS/TSX/JSX)
|
|
225
|
+
npx tsc -p tsconfig.json # Build, 0 errors
|
|
226
|
+
npx vitest run # Entire package passes except 2 documented,
|
|
227
|
+
# pre-existing tests outside this directory
|
|
228
|
+
# (see openIssues in the WP-09 completion report)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
A standalone script in the WP-09 completion report additionally proves the real
|
|
232
|
+
parser-registry → chunker → complexity seam on realistic Python: a class with
|
|
233
|
+
`__init__`/methods/`async def`/`try`/`except`/`else`/`finally`, plus a module function with list
|
|
234
|
+
comprehension and `match`/`case`. Multiple symbols have cognitive values >0 and chunks have
|
|
235
|
+
non-empty `symbolId`, the same seam demonstrated for TypeScript by `scripts/e2e-smoke.mjs`.
|
|
236
|
+
|
|
237
|
+
<a id="bekannte-grenzen-openissues-siehe-abschlussbericht"></a>
|
|
238
|
+
|
|
239
|
+
## Known limits (openIssues in the completion report)
|
|
240
|
+
|
|
241
|
+
- `createPythonAdapter` is NOT re-exported by package-public `src/index.ts`, outside
|
|
242
|
+
`languages/python/**`. Likewise `src/index.test.ts` (four registered languages/Python not yet
|
|
243
|
+
supported) is now stale after authorized registration in `../index.ts`. Both edits lie outside
|
|
244
|
+
the assigned scope and are documented rather than performed, following the task's open-issues rule.
|
|
245
|
+
- Pattern grammar deliberately lacks full structural parsing (decision 3).
|
|
246
|
+
- Class attributes produce no dedicated `ExtractedSymbol` (decision 2).
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"path": "basic.py",
|
|
3
|
+
"source": "import os\nfrom .util import helper\n\n\nclass Greeter:\n \"\"\"Greets people.\"\"\"\n\n def __init__(self, name):\n self.name = name\n\n def greet(self, loud=False):\n if loud or self.name == \"\":\n return helper(self.name.upper())\n return helper(self.name)\n\n\ndef make_greeter(name):\n return Greeter(name)\n",
|
|
4
|
+
"expectedSymbols": [
|
|
5
|
+
{
|
|
6
|
+
"name": "Greeter",
|
|
7
|
+
"kind": "class",
|
|
8
|
+
"qualifiedName": "Greeter",
|
|
9
|
+
"exportedNames": ["Greeter"],
|
|
10
|
+
"hasDocRange": true
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "__init__",
|
|
14
|
+
"kind": "constructor",
|
|
15
|
+
"qualifiedName": "Greeter.__init__",
|
|
16
|
+
"normalizedSignature": "__init__(self, name)",
|
|
17
|
+
"exportedNames": []
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "greet",
|
|
21
|
+
"kind": "method",
|
|
22
|
+
"qualifiedName": "Greeter.greet",
|
|
23
|
+
"normalizedSignature": "greet(self, loud)",
|
|
24
|
+
"exportedNames": []
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "make_greeter",
|
|
28
|
+
"kind": "function",
|
|
29
|
+
"qualifiedName": "make_greeter",
|
|
30
|
+
"normalizedSignature": "make_greeter(name)",
|
|
31
|
+
"exportedNames": ["make_greeter"]
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"expectedImports": [
|
|
35
|
+
{ "specifier": "os", "importKind": "import" },
|
|
36
|
+
{ "specifier": ".util", "importKind": "import", "importedNames": ["helper"] }
|
|
37
|
+
],
|
|
38
|
+
"expectedCalls": [
|
|
39
|
+
{ "calleeName": "upper" },
|
|
40
|
+
{ "calleeName": "helper" },
|
|
41
|
+
{ "calleeName": "Greeter" }
|
|
42
|
+
],
|
|
43
|
+
"expectedDecisionKinds": ["guard", "logical_or"]
|
|
44
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Der Python-`LanguageAdapter`: die Tabelle aus `table.ts` und die
|
|
3
|
+
* Verfeinerung aus `profile.ts` durch das gemeinsame ast-grep-Backend.
|
|
4
|
+
*
|
|
5
|
+
* WAS HIER FRUEHER STAND (WP-239): dieselbe Datei verdrahtete einen eigenen
|
|
6
|
+
* Tokenizer, einen eigenen rekursiven Abstiegsparser, einen eigenen AST und
|
|
7
|
+
* einen eigenen Motor — 5.604 Zeilen, die es nur gab, weil eine Auftragsgrenze
|
|
8
|
+
* das Aufnehmen einer Grammatik verbot. Sie sind ersatzlos entfallen; was
|
|
9
|
+
* bleibt, ist `signature.ts` (reine Textnormalisierung, ohne AST) und die
|
|
10
|
+
* Tabelle daneben.
|
|
11
|
+
*
|
|
12
|
+
* DIE PARSERVERSION HAT SICH GEAENDERT, und das steht in domain
|
|
13
|
+
* `versions.ts`: Python laeuft ab jetzt unter `ASTGREP_PARSER_VERSION`. Ohne
|
|
14
|
+
* diesen Wechsel lieferten die inhaltsadressierten Caches aus WP-100 nach dem
|
|
15
|
+
* Backendwechsel stillschweigend Chunk-IDs und Fingerabdruecke der alten
|
|
16
|
+
* AST-Form (E4).
|
|
17
|
+
*/
|
|
18
|
+
import type { LanguageAdapter } from "@untangle-code/domain";
|
|
19
|
+
|
|
20
|
+
import { createAstGrepAdapter } from "../astgrep-backend/index.js";
|
|
21
|
+
|
|
22
|
+
import { createPythonProfile } from "./profile.js";
|
|
23
|
+
import { PYTHON_SOURCE, PYTHON_TABLE } from "./table.js";
|
|
24
|
+
|
|
25
|
+
export function createPythonAdapter(): LanguageAdapter {
|
|
26
|
+
return createAstGrepAdapter(PYTHON_TABLE, PYTHON_SOURCE, {
|
|
27
|
+
profileForFile: createPythonProfile,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LanguageAdapter } from "@untangle-code/domain";
|
|
2
|
+
|
|
3
|
+
import { createPythonAdapter as createPythonAdapterImpl } from "./create-adapter.js";
|
|
4
|
+
|
|
5
|
+
/** Python `LanguageAdapter` (`.py`, `.pyi`), support level "deep" (spec.md §7.2, WP-09). */
|
|
6
|
+
export function createPythonAdapter(): LanguageAdapter {
|
|
7
|
+
return createPythonAdapterImpl();
|
|
8
|
+
}
|