@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,172 @@
|
|
|
1
|
+
import { classifyLinkTarget, findMarkdownLinks, outlineMarkdown, sha256Hex, textFormatExtensions, } from "@untangle-code/domain";
|
|
2
|
+
import { buildLineByteIndex, rangeForLines } from "./line-bytes.js";
|
|
3
|
+
/** Sprachkennung dieses Adapters; identisch mit der Scanner-Klassifikation fuer `.md`. */
|
|
4
|
+
export const PROSE_LANGUAGE_ID = "markdown";
|
|
5
|
+
/** Symbolart eines Prosa-Abschnitts. Ein Abschnitt ist keine Funktion und heisst auch nicht so. */
|
|
6
|
+
export const PROSE_SYMBOL_KIND = "section";
|
|
7
|
+
/** Name des Abschnitts vor der ersten Ueberschrift. */
|
|
8
|
+
const PREAMBLE_NAME = "(Vorspann)";
|
|
9
|
+
/**
|
|
10
|
+
* Physische Zeilen ohne Zeilenende. Ein abschliessendes `\r` faellt weg,
|
|
11
|
+
* damit die Ueberschriften- und Verweiserkennung nicht daran scheitert.
|
|
12
|
+
*/
|
|
13
|
+
function splitLines(content) {
|
|
14
|
+
return content.split("\n").map((line) => (line.endsWith("\r") ? line.slice(0, -1) : line));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Zwei Abschnitte koennen denselben Breadcrumb tragen (zweimal dieselbe
|
|
18
|
+
* Ueberschrift unter demselben Elternteil). Der Chunker schluesselt Symbole
|
|
19
|
+
* ueber `qualifiedName` in einer `Map`; ohne Vereindeutigung wuerde der
|
|
20
|
+
* zweite Abschnitt den ersten ueberschreiben und beide dieselbe `symbolId`
|
|
21
|
+
* bekommen. Angehaengt wird deshalb eine laufende Nummer — sichtbar, nicht
|
|
22
|
+
* still.
|
|
23
|
+
*/
|
|
24
|
+
function uniqueName(breadcrumb, seen) {
|
|
25
|
+
const base = breadcrumb === "" ? PREAMBLE_NAME : breadcrumb;
|
|
26
|
+
const count = (seen.get(base) ?? 0) + 1;
|
|
27
|
+
seen.set(base, count);
|
|
28
|
+
return count === 1 ? base : `${base} (${String(count)})`;
|
|
29
|
+
}
|
|
30
|
+
function buildSections(lines, index) {
|
|
31
|
+
const seen = new Map();
|
|
32
|
+
return outlineMarkdown(lines).map((section) => ({
|
|
33
|
+
...section,
|
|
34
|
+
qualifiedName: uniqueName(section.breadcrumb, seen),
|
|
35
|
+
range: rangeForLines(index, section.startLine, section.endLine),
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
function rootOf(ast) {
|
|
39
|
+
return ast.root;
|
|
40
|
+
}
|
|
41
|
+
function sectionContent(root, section) {
|
|
42
|
+
return root.lines.slice(section.startLine - 1, section.endLine).join("\n");
|
|
43
|
+
}
|
|
44
|
+
function headingTextOf(section) {
|
|
45
|
+
return section.level === 0 ? PREAMBLE_NAME : `${"#".repeat(section.level)} ${section.title}`;
|
|
46
|
+
}
|
|
47
|
+
function symbolOf(root, section) {
|
|
48
|
+
return {
|
|
49
|
+
name: section.level === 0 ? PREAMBLE_NAME : section.title,
|
|
50
|
+
qualifiedName: section.qualifiedName,
|
|
51
|
+
kind: PROSE_SYMBOL_KIND,
|
|
52
|
+
signature: headingTextOf(section),
|
|
53
|
+
// Die "Signatur" eines Abschnitts ist seine Ueberschriftenebene plus
|
|
54
|
+
// Pfad: was ihn im Dokument identifiziert, unabhaengig von seiner Zeile.
|
|
55
|
+
normalizedSignature: `h${String(section.level)} ${section.qualifiedName}`,
|
|
56
|
+
range: section.range,
|
|
57
|
+
exportedNames: [],
|
|
58
|
+
// Formhash: Ebene und Pfad — aendert sich, wenn der Abschnitt umbenannt
|
|
59
|
+
// oder verschoben wird, nicht wenn sein Text sich aendert.
|
|
60
|
+
astHash: sha256Hex(`prose-section ${String(section.level)} ${section.qualifiedName}`),
|
|
61
|
+
// Inhaltshash: der Rohtext des Abschnitts.
|
|
62
|
+
tokenFingerprint: sha256Hex(sectionContent(root, section)),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function createProseAdapter() {
|
|
66
|
+
return {
|
|
67
|
+
languageId: PROSE_LANGUAGE_ID,
|
|
68
|
+
extensions: textFormatExtensions("prose"),
|
|
69
|
+
supportLevel: "text",
|
|
70
|
+
parse(source) {
|
|
71
|
+
const lines = splitLines(source.content);
|
|
72
|
+
const index = buildLineByteIndex(source.content);
|
|
73
|
+
const root = {
|
|
74
|
+
fileId: source.fileId,
|
|
75
|
+
lines,
|
|
76
|
+
index,
|
|
77
|
+
sections: buildSections(lines, index),
|
|
78
|
+
};
|
|
79
|
+
const ast = {
|
|
80
|
+
languageId: PROSE_LANGUAGE_ID,
|
|
81
|
+
parseQuality: "complete",
|
|
82
|
+
root,
|
|
83
|
+
diagnostics: [],
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
parseQuality: "complete",
|
|
87
|
+
ast,
|
|
88
|
+
diagnostics: [],
|
|
89
|
+
errorNodeCount: 0,
|
|
90
|
+
missingNodeCount: 0,
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
extractChunks(ast) {
|
|
94
|
+
const root = rootOf(ast);
|
|
95
|
+
const children = root.sections.map((section) => ({
|
|
96
|
+
// Der Vorspann vor der ersten Ueberschrift ist genau das, was
|
|
97
|
+
// `file_preamble` beschreibt; alles Weitere ist ein Prosa-Abschnitt.
|
|
98
|
+
chunkKind: section.level === 0 ? "file_preamble" : "prose_section",
|
|
99
|
+
range: section.range,
|
|
100
|
+
scopeId: `${root.fileId}#${section.qualifiedName}`,
|
|
101
|
+
symbolFqn: section.qualifiedName,
|
|
102
|
+
headerText: section.level === 0
|
|
103
|
+
? PREAMBLE_NAME
|
|
104
|
+
: `${"#".repeat(section.level)} ${section.breadcrumb}`,
|
|
105
|
+
// Ein Abschnitt hat keine feineren AST-Grenzen; ist er zu gross,
|
|
106
|
+
// teilt der Chunker ihn an Tokengrenzen in `symbol_fragment`s, die
|
|
107
|
+
// seine `symbolId` erben (spec.md §8.5).
|
|
108
|
+
splittable: false,
|
|
109
|
+
}));
|
|
110
|
+
return [
|
|
111
|
+
{
|
|
112
|
+
chunkKind: "module",
|
|
113
|
+
range: {
|
|
114
|
+
startLine: 1,
|
|
115
|
+
endLine: root.index.lineCount,
|
|
116
|
+
startByte: 0,
|
|
117
|
+
endByte: root.index.totalBytes,
|
|
118
|
+
},
|
|
119
|
+
scopeId: root.fileId,
|
|
120
|
+
splittable: children.length > 0,
|
|
121
|
+
...(children.length > 0 ? { children } : {}),
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
},
|
|
125
|
+
extractSymbols(ast) {
|
|
126
|
+
const root = rootOf(ast);
|
|
127
|
+
return root.sections.map((section) => symbolOf(root, section));
|
|
128
|
+
},
|
|
129
|
+
extractImports(ast) {
|
|
130
|
+
const root = rootOf(ast);
|
|
131
|
+
const imports = [];
|
|
132
|
+
for (const link of findMarkdownLinks(root.lines)) {
|
|
133
|
+
if (classifyLinkTarget(link.target) !== "relative_file")
|
|
134
|
+
continue;
|
|
135
|
+
imports.push({
|
|
136
|
+
specifier: link.target,
|
|
137
|
+
importKind: "import",
|
|
138
|
+
range: rangeForLines(root.index, link.line, link.line),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return imports;
|
|
142
|
+
},
|
|
143
|
+
extractCalls(_ast) {
|
|
144
|
+
// Prosa hat keine Aufrufe. Eine leere Liste ist hier die vollstaendige
|
|
145
|
+
// Antwort, keine Abstufung.
|
|
146
|
+
return [];
|
|
147
|
+
},
|
|
148
|
+
computeComplexity(ast) {
|
|
149
|
+
// KEINE `symbolScopes` und KEINE `decisions` — siehe Kopfkommentar.
|
|
150
|
+
// Stuende hier je Abschnitt ein Scope, rechnete jede
|
|
151
|
+
// Code-Metrik-Pipeline anschliessend `cyclomatic = 1` je Ueberschrift
|
|
152
|
+
// und addierte das zur Summe des Repositories. Genau das verhindert
|
|
153
|
+
// diese leere Antwort.
|
|
154
|
+
return {
|
|
155
|
+
symbolScopes: [],
|
|
156
|
+
decisions: [],
|
|
157
|
+
nestingEvents: [],
|
|
158
|
+
operators: [],
|
|
159
|
+
operands: [],
|
|
160
|
+
nodeKinds: [],
|
|
161
|
+
comments: [],
|
|
162
|
+
identifiers: [],
|
|
163
|
+
literals: [],
|
|
164
|
+
parseDiagnostics: ast.diagnostics,
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
tokenizeForHalstead(_ast) {
|
|
168
|
+
return { operators: [], operands: [] };
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/languages/prose/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zeilenanfaenge als UTF-8-Byte-Versaetze.
|
|
3
|
+
*
|
|
4
|
+
* `SourceRange` (domain `types/common.ts`) ist auf BYTES normativ; die
|
|
5
|
+
* Prosa-Gliederung arbeitet in ZEILEN. Diese Tabelle ist die Uebersetzung.
|
|
6
|
+
* Geschnitten wird ausschliesslich unmittelbar nach `\n` (0x0A) — ein
|
|
7
|
+
* Einzelbyte, nie ein UTF-8-Folgebyte —, damit jede erzeugte Grenze eine
|
|
8
|
+
* gueltige Zeichengrenze ist.
|
|
9
|
+
*/
|
|
10
|
+
export interface LineByteIndex {
|
|
11
|
+
/** Byte-Versatz jedes Zeilenanfangs, plus ein Schlusswaechter = Dateigroesse. */
|
|
12
|
+
readonly lineStarts: readonly number[];
|
|
13
|
+
/** Anzahl physischer Zeilen. */
|
|
14
|
+
readonly lineCount: number;
|
|
15
|
+
readonly totalBytes: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildLineByteIndex(content: string): LineByteIndex;
|
|
18
|
+
/** Byte-Versatz des Anfangs der 1-basierten Zeile `line`, geklemmt. */
|
|
19
|
+
export declare function lineStartByte(index: LineByteIndex, line: number): number;
|
|
20
|
+
/**
|
|
21
|
+
* `SourceRange` fuer die 1-basierte inklusive Zeilenspanne. `endByte` ist der
|
|
22
|
+
* Anfang der Zeile NACH `endLine`, also sind zwei benachbarte Spannen
|
|
23
|
+
* lueckenlos und ueberlappungsfrei.
|
|
24
|
+
*/
|
|
25
|
+
export declare function rangeForLines(index: LineByteIndex, startLine: number, endLine: number): {
|
|
26
|
+
startLine: number;
|
|
27
|
+
endLine: number;
|
|
28
|
+
startByte: number;
|
|
29
|
+
endByte: number;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=line-bytes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-bytes.d.ts","sourceRoot":"","sources":["../../../src/languages/prose/line-bytes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CASjE;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAO5E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zeilenanfaenge als UTF-8-Byte-Versaetze.
|
|
3
|
+
*
|
|
4
|
+
* `SourceRange` (domain `types/common.ts`) ist auf BYTES normativ; die
|
|
5
|
+
* Prosa-Gliederung arbeitet in ZEILEN. Diese Tabelle ist die Uebersetzung.
|
|
6
|
+
* Geschnitten wird ausschliesslich unmittelbar nach `\n` (0x0A) — ein
|
|
7
|
+
* Einzelbyte, nie ein UTF-8-Folgebyte —, damit jede erzeugte Grenze eine
|
|
8
|
+
* gueltige Zeichengrenze ist.
|
|
9
|
+
*/
|
|
10
|
+
export function buildLineByteIndex(content) {
|
|
11
|
+
const buffer = Buffer.from(content, "utf8");
|
|
12
|
+
const lineStarts = [0];
|
|
13
|
+
for (let i = 0; i < buffer.length; i += 1) {
|
|
14
|
+
if (buffer[i] === 0x0a)
|
|
15
|
+
lineStarts.push(i + 1);
|
|
16
|
+
}
|
|
17
|
+
const lineCount = lineStarts.length;
|
|
18
|
+
lineStarts.push(buffer.length);
|
|
19
|
+
return { lineStarts, lineCount, totalBytes: buffer.length };
|
|
20
|
+
}
|
|
21
|
+
/** Byte-Versatz des Anfangs der 1-basierten Zeile `line`, geklemmt. */
|
|
22
|
+
export function lineStartByte(index, line) {
|
|
23
|
+
const clamped = Math.min(Math.max(line, 1), index.lineStarts.length);
|
|
24
|
+
return index.lineStarts[clamped - 1] ?? index.totalBytes;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* `SourceRange` fuer die 1-basierte inklusive Zeilenspanne. `endByte` ist der
|
|
28
|
+
* Anfang der Zeile NACH `endLine`, also sind zwei benachbarte Spannen
|
|
29
|
+
* lueckenlos und ueberlappungsfrei.
|
|
30
|
+
*/
|
|
31
|
+
export function rangeForLines(index, startLine, endLine) {
|
|
32
|
+
return {
|
|
33
|
+
startLine,
|
|
34
|
+
endLine,
|
|
35
|
+
startByte: lineStartByte(index, startLine),
|
|
36
|
+
endByte: lineStartByte(index, endLine + 1),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=line-bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-bytes.js","sourceRoot":"","sources":["../../../src/languages/prose/line-bytes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAa,CAAC,CAAC,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;IACpC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC9D,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,KAAoB,EAAE,IAAY;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrE,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAoB,EACpB,SAAiB,EACjB,OAAe;IAEf,OAAO;QACL,SAAS;QACT,OAAO;QACP,SAAS,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1C,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
export declare function createPythonAdapter(): LanguageAdapter;
|
|
20
|
+
//# sourceMappingURL=create-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-adapter.d.ts","sourceRoot":"","sources":["../../../src/languages/python/create-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D,wBAAgB,mBAAmB,IAAI,eAAe,CAIrD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createAstGrepAdapter } from "../astgrep-backend/index.js";
|
|
2
|
+
import { createPythonProfile } from "./profile.js";
|
|
3
|
+
import { PYTHON_SOURCE, PYTHON_TABLE } from "./table.js";
|
|
4
|
+
export function createPythonAdapter() {
|
|
5
|
+
return createAstGrepAdapter(PYTHON_TABLE, PYTHON_SOURCE, {
|
|
6
|
+
profileForFile: createPythonProfile,
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=create-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-adapter.js","sourceRoot":"","sources":["../../../src/languages/python/create-adapter.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,UAAU,mBAAmB;IACjC,OAAO,oBAAoB,CAAC,YAAY,EAAE,aAAa,EAAE;QACvD,cAAc,EAAE,mBAAmB;KACpC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/languages/python/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,4FAA4F;AAC5F,wBAAgB,mBAAmB,IAAI,eAAe,CAErD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createPythonAdapter as createPythonAdapterImpl } from "./create-adapter.js";
|
|
2
|
+
/** Python `LanguageAdapter` (`.py`, `.pyi`), support level "deep" (spec.md §7.2, WP-09). */
|
|
3
|
+
export function createPythonAdapter() {
|
|
4
|
+
return createPythonAdapterImpl();
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/languages/python/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,IAAI,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAErF,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB;IACjC,OAAO,uBAAuB,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die Python-Regeln, die KEINE Tabelle ausdrueckt.
|
|
3
|
+
*
|
|
4
|
+
* Alles Uebrige — Entscheidungen, Nesting, Kommentare, Halstead-Token,
|
|
5
|
+
* Aufrufe, Scopes — kommt aus `table.ts` durch den gemeinsamen Motor
|
|
6
|
+
* (`shared/table-profile.ts`, `shared/engine.ts`). Hier steht nur, was
|
|
7
|
+
* Python anders macht als jede andere Sprache dieses Projekts:
|
|
8
|
+
*
|
|
9
|
+
* 1. DOCSTRINGS. Python bindet die Beschreibung nicht an einen Kommentar VOR
|
|
10
|
+
* der Definition, sondern an die erste Anweisung IM Rumpf.
|
|
11
|
+
* 2. SICHTBARKEIT. Es gibt keinen Modifikator; sie steht in der
|
|
12
|
+
* Namenskonvention (`_x` geschuetzt, `__x` privat, `__x__` oeffentlich).
|
|
13
|
+
* 3. `__all__`. Was eine Datei exportiert, steht in einer Zuweisung auf
|
|
14
|
+
* Modulebene — also je DATEI, nicht je Knoten. Deshalb wird dieses Profil
|
|
15
|
+
* je Parse gebaut (`AstGrepAdapterHooks.profileForFile`) und nicht einmal
|
|
16
|
+
* je Adapter.
|
|
17
|
+
* 4. METHODE ODER FUNKTION. `def` ist beides; welches, sagt erst der
|
|
18
|
+
* umgebende Knoten. Eine Tabelle bildet Knotenart auf Scope-Art ab und
|
|
19
|
+
* kann das nicht.
|
|
20
|
+
* 5. IMPORTE. Eine Anweisung fuehrt mehrere Ziele mit je eigenem Alias
|
|
21
|
+
* (`from a import b as c, d`) — `ImportRules` kennt genau eines.
|
|
22
|
+
* 6. SIGNATUREN. Die Normalform folgt `signature.ts` (Vorgabewerte fallen
|
|
23
|
+
* weg, Annotationen bleiben) und nicht der Rohtextregel der Tabelle.
|
|
24
|
+
* 7. ZEICHENKETTEN. Ein `string` ist hier KEIN geschlossener Container
|
|
25
|
+
* (siehe `table.ts`); seine Textblaetter muessen deshalb ausdruecklich
|
|
26
|
+
* als Zeichenkettenliterale gelten.
|
|
27
|
+
*/
|
|
28
|
+
import type { SourceFile } from "@untangle-code/domain";
|
|
29
|
+
import type { LanguageProfile } from "../shared/profile.js";
|
|
30
|
+
import type { SyntaxNode } from "../shared/syntax.js";
|
|
31
|
+
/**
|
|
32
|
+
* Baut das Python-Profil ueber dem Tabellenprofil — EINMAL JE DATEI, weil
|
|
33
|
+
* `__all__` und `__init__.py` Dateieigenschaften sind.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createPythonProfile(base: LanguageProfile, root: SyntaxNode, file: SourceFile): LanguageProfile;
|
|
36
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/languages/python/profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAA0B,UAAU,EAAe,MAAM,uBAAuB,CAAC;AAK7F,OAAO,KAAK,EAAE,eAAe,EAAkC,MAAM,sBAAsB,CAAC;AAE5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAyOtD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,GACf,eAAe,CAiEjB"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { rangeOf } from "../shared/node-utils.js";
|
|
2
|
+
import { normalizeHeaderText, normalizeParameterList, normalizeReturnType } from "./signature.js";
|
|
3
|
+
import { PYTHON_STRING_LEAF_KINDS } from "./table.js";
|
|
4
|
+
const INIT_FILE_RE = /(^|\/)__init__\.pyi?$/;
|
|
5
|
+
const STRING_LEAF_KINDS = new Set(PYTHON_STRING_LEAF_KINDS);
|
|
6
|
+
/** Knotenarten, die einen eigenen Namensraum aufmachen — die Grenze fuer "steht in einer Klasse". */
|
|
7
|
+
const SCOPE_OPENING_KINDS = new Set([
|
|
8
|
+
"function_definition",
|
|
9
|
+
"class_definition",
|
|
10
|
+
"lambda",
|
|
11
|
+
]);
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// 2. Sichtbarkeit aus der Namenskonvention (PEP 8)
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* `__x__` ist das oeffentliche Protokoll (`__init__`, `__len__`) und bekommt
|
|
17
|
+
* deshalb GAR KEINE Angabe — nicht "public": das Feld ist optional, und
|
|
18
|
+
* "keine Angabe" ist die ehrliche Aussage ueber eine Sprache ohne
|
|
19
|
+
* Sichtbarkeitsmodifikatoren.
|
|
20
|
+
*/
|
|
21
|
+
function pythonVisibility(name) {
|
|
22
|
+
if (name.startsWith("__") && name.endsWith("__") && name.length > 4)
|
|
23
|
+
return undefined;
|
|
24
|
+
if (name.startsWith("__"))
|
|
25
|
+
return "private";
|
|
26
|
+
if (name.startsWith("_"))
|
|
27
|
+
return "protected";
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// 1. Docstrings
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/** Der Text eines Zeichenkettenknotens ohne Anfuehrungszeichen (auch dreifache). */
|
|
34
|
+
function stringLiteralText(node) {
|
|
35
|
+
if (node.type !== "string")
|
|
36
|
+
return null;
|
|
37
|
+
for (const child of node.children) {
|
|
38
|
+
if (child.type === "string_content")
|
|
39
|
+
return child.text;
|
|
40
|
+
}
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Der Docstring eines Scopes: die erste Anweisung des Rumpfes, wenn sie aus
|
|
45
|
+
* nichts als einem Zeichenkettenliteral besteht. Alles andere ist Code, und
|
|
46
|
+
* ein Stueck Code als Beschreibung auszugeben waere eine Erfindung.
|
|
47
|
+
*/
|
|
48
|
+
function docstringRange(node, ctx, bodyField) {
|
|
49
|
+
const body = node.childForFieldName(bodyField);
|
|
50
|
+
if (body === null)
|
|
51
|
+
return undefined;
|
|
52
|
+
const first = body.namedChild(0);
|
|
53
|
+
if (first === null || first.type !== "expression_statement")
|
|
54
|
+
return undefined;
|
|
55
|
+
const expression = first.namedChild(0);
|
|
56
|
+
if (expression === null || stringLiteralText(expression) === null)
|
|
57
|
+
return undefined;
|
|
58
|
+
return rangeOf(expression, ctx);
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// 3. `__all__`
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* Die Namen aus `__all__ = [...]` auf Modulebene, oder `null`, wenn die Datei
|
|
65
|
+
* keines hat. `null` und nicht "leere Menge": ohne `__all__` gilt die
|
|
66
|
+
* Unterstrich-Konvention, mit leerem `__all__` exportiert die Datei nichts.
|
|
67
|
+
* Die beiden Faelle zu vermengen hiesse, jede Datei ohne `__all__` fuer
|
|
68
|
+
* exportlos zu erklaeren.
|
|
69
|
+
*/
|
|
70
|
+
function findDunderAll(root) {
|
|
71
|
+
for (const statement of root.children) {
|
|
72
|
+
if (statement.type !== "expression_statement")
|
|
73
|
+
continue;
|
|
74
|
+
const assignment = statement.namedChild(0);
|
|
75
|
+
if (assignment === null || assignment.type !== "assignment")
|
|
76
|
+
continue;
|
|
77
|
+
const left = assignment.childForFieldName("left");
|
|
78
|
+
if (left === null || left.type !== "identifier" || left.text !== "__all__")
|
|
79
|
+
continue;
|
|
80
|
+
const right = assignment.childForFieldName("right");
|
|
81
|
+
if (right === null ||
|
|
82
|
+
(right.type !== "list" && right.type !== "tuple" && right.type !== "set")) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const names = new Set();
|
|
86
|
+
for (const element of right.children) {
|
|
87
|
+
const text = stringLiteralText(element);
|
|
88
|
+
if (text !== null)
|
|
89
|
+
names.add(text);
|
|
90
|
+
}
|
|
91
|
+
return names;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/** Steht dieser Knoten unmittelbar auf Modulebene (auch unter einem Dekorator)? */
|
|
96
|
+
function isTopLevel(node) {
|
|
97
|
+
const parent = node.parent;
|
|
98
|
+
if (parent === null)
|
|
99
|
+
return false;
|
|
100
|
+
if (parent.type === "module")
|
|
101
|
+
return true;
|
|
102
|
+
return parent.type === "decorated_definition" && parent.parent?.type === "module";
|
|
103
|
+
}
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// 4. Methode oder Funktion
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
/** Der naechste umschliessende Knoten, der selbst einen Namensraum oeffnet. */
|
|
108
|
+
function enclosingScopeKind(node) {
|
|
109
|
+
let current = node.parent;
|
|
110
|
+
while (current !== null) {
|
|
111
|
+
if (SCOPE_OPENING_KINDS.has(current.type))
|
|
112
|
+
return current.type;
|
|
113
|
+
current = current.parent;
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// 5. Importe
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/** Ziel und Alias eines einzelnen Importeintrags (`os.path as osp`, `helper`). */
|
|
121
|
+
function importEntryOf(node) {
|
|
122
|
+
if (node.type === "dotted_name")
|
|
123
|
+
return { path: node.text };
|
|
124
|
+
if (node.type !== "aliased_import")
|
|
125
|
+
return null;
|
|
126
|
+
const path = node.childForFieldName("name");
|
|
127
|
+
const alias = node.childForFieldName("alias");
|
|
128
|
+
if (path === null)
|
|
129
|
+
return null;
|
|
130
|
+
return { path: path.text, ...(alias === null ? {} : { alias: alias.text }) };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* `import a, b as c` — jedes Ziel ist ein eigener Import mit eigenem Pfad.
|
|
134
|
+
* `from m import a, b as c` — EIN Pfad (`m`) mit mehreren gebundenen Namen.
|
|
135
|
+
* Zwei Formen, deshalb zwei Zweige und keine gemeinsame Schleife, die beide
|
|
136
|
+
* halb falsch bedient.
|
|
137
|
+
*/
|
|
138
|
+
function collectPythonImports(node, ctx, sink, isInitFile) {
|
|
139
|
+
const range = rangeOf(node, ctx);
|
|
140
|
+
// spec.md §6.2: was ein Paketkopf (`__init__.py`) auf oberster Ebene
|
|
141
|
+
// hereinholt, reicht er weiter — das ist ein Re-Export, kein Verbrauch.
|
|
142
|
+
const importKind = isInitFile && isTopLevel(node) ? "re_export" : "import";
|
|
143
|
+
if (node.type === "import_statement") {
|
|
144
|
+
for (const child of node.children) {
|
|
145
|
+
const entry = importEntryOf(child);
|
|
146
|
+
if (entry === null)
|
|
147
|
+
continue;
|
|
148
|
+
sink.imports.push({
|
|
149
|
+
specifier: entry.path,
|
|
150
|
+
importKind,
|
|
151
|
+
range,
|
|
152
|
+
...(entry.alias === undefined ? {} : { importedNames: [entry.alias] }),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const moduleNode = node.childForFieldName("module_name");
|
|
158
|
+
if (moduleNode === null)
|
|
159
|
+
return;
|
|
160
|
+
const importedNames = [];
|
|
161
|
+
// Die gebundenen Namen stehen NACH dem Schluesselwort `import`; davor steht
|
|
162
|
+
// der Modulpfad, der genauso aussieht. Ohne diese Schranke stuende
|
|
163
|
+
// `collections` bei `from collections import x` als importierter Name da.
|
|
164
|
+
let afterKeyword = false;
|
|
165
|
+
for (const child of node.children) {
|
|
166
|
+
if (child.type === "import") {
|
|
167
|
+
afterKeyword = true;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (!afterKeyword)
|
|
171
|
+
continue;
|
|
172
|
+
// `from m import *` bindet unbekannt viele Namen. KEINEN zu nennen ist
|
|
173
|
+
// die einzige ehrliche Antwort (domain `analysis.ts`: ein fehlendes Feld
|
|
174
|
+
// heisst "unbekannt").
|
|
175
|
+
const entry = importEntryOf(child);
|
|
176
|
+
if (entry !== null)
|
|
177
|
+
importedNames.push(entry.alias ?? entry.path);
|
|
178
|
+
}
|
|
179
|
+
sink.imports.push({
|
|
180
|
+
specifier: moduleNode.text,
|
|
181
|
+
importKind,
|
|
182
|
+
range,
|
|
183
|
+
...(importedNames.length > 0 ? { importedNames } : {}),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// 6. Signaturen
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
function headerBeforeBody(node, bodyField) {
|
|
190
|
+
const body = node.childForFieldName(bodyField);
|
|
191
|
+
if (body === null)
|
|
192
|
+
return node.text.split("\n")[0]?.trim() ?? node.text;
|
|
193
|
+
return node.text.slice(0, Math.max(0, body.startIndex - node.startIndex)).trimEnd();
|
|
194
|
+
}
|
|
195
|
+
function pythonSignature(node, name, bodyField) {
|
|
196
|
+
if (node.type === "class_definition") {
|
|
197
|
+
const raw = headerBeforeBody(node, bodyField);
|
|
198
|
+
return { raw, normalized: normalizeHeaderText(raw) };
|
|
199
|
+
}
|
|
200
|
+
const parameters = node.childForFieldName("parameters");
|
|
201
|
+
// `lambda_parameters` traegt KEINE Klammern; `parameters` traegt sie. Beide
|
|
202
|
+
// muessen als `(...)` in die Normalform, sonst zerfaellt die Aufteilung.
|
|
203
|
+
const parametersText = parameters === null
|
|
204
|
+
? "()"
|
|
205
|
+
: parameters.text.trim().startsWith("(")
|
|
206
|
+
? parameters.text
|
|
207
|
+
: `(${parameters.text})`;
|
|
208
|
+
const returnType = node.childForFieldName("return_type");
|
|
209
|
+
// `async` ist ein anonymes Kind, kein Feld — und es gehoert zur
|
|
210
|
+
// Aufrufschnittstelle: eine Koroutine ist nicht dasselbe wie eine Funktion.
|
|
211
|
+
const isAsync = node.children.some((child) => child.type === "async");
|
|
212
|
+
const head = `${isAsync ? "async " : ""}${name}`;
|
|
213
|
+
const raw = `${head}${parametersText}${returnType === null ? "" : ` -> ${returnType.text}`}`;
|
|
214
|
+
const normalized = `${head}${normalizeParameterList(parametersText)}${normalizeReturnType(returnType?.text)}`;
|
|
215
|
+
return { raw, normalized };
|
|
216
|
+
}
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
/**
|
|
219
|
+
* Baut das Python-Profil ueber dem Tabellenprofil — EINMAL JE DATEI, weil
|
|
220
|
+
* `__all__` und `__init__.py` Dateieigenschaften sind.
|
|
221
|
+
*/
|
|
222
|
+
export function createPythonProfile(base, root, file) {
|
|
223
|
+
const dunderAll = findDunderAll(root);
|
|
224
|
+
const isInitFile = INIT_FILE_RE.test(file.path.replace(/\\/g, "/"));
|
|
225
|
+
const bodyField = "body";
|
|
226
|
+
return {
|
|
227
|
+
...base,
|
|
228
|
+
// 7. Zeichenkettenblaetter (siehe `table.ts`: `string` ist kein Container).
|
|
229
|
+
simpleLiteralLeafKinds: new Set([...base.simpleLiteralLeafKinds, ...STRING_LEAF_KINDS]),
|
|
230
|
+
simpleLiteralKind(kind) {
|
|
231
|
+
return STRING_LEAF_KINDS.has(kind) ? "string" : base.simpleLiteralKind(kind);
|
|
232
|
+
},
|
|
233
|
+
// Der Dekorator gehoert zum Symbol: `@app.route(...)` steht ueber der
|
|
234
|
+
// Funktion und beschreibt sie. `chunks.ts` weitet den Bereich darauf aus.
|
|
235
|
+
exportWrapperKinds: new Set(["decorated_definition"]),
|
|
236
|
+
// 4. `def` ist Funktion, Methode oder Konstruktor.
|
|
237
|
+
scopeKindOf(node) {
|
|
238
|
+
const kind = base.scopeKindOf(node);
|
|
239
|
+
if (kind !== "function" || node.type !== "function_definition")
|
|
240
|
+
return kind;
|
|
241
|
+
if (enclosingScopeKind(node) !== "class_definition")
|
|
242
|
+
return "function";
|
|
243
|
+
return base.scopeName(node) === "__init__" ? "constructor" : "method";
|
|
244
|
+
},
|
|
245
|
+
scopeSignature(node, _kind, name) {
|
|
246
|
+
return pythonSignature(node, name, bodyField);
|
|
247
|
+
},
|
|
248
|
+
docRange: (node, ctx) => docstringRange(node, ctx, bodyField),
|
|
249
|
+
visibility: (_node, name) => pythonVisibility(name),
|
|
250
|
+
// 3. `__all__` schlaegt die Unterstrich-Konvention. Beides gilt nur fuer
|
|
251
|
+
// Namen auf Modulebene: eine Methode wird nicht aus der Datei exportiert.
|
|
252
|
+
exportedNames(node, name) {
|
|
253
|
+
if (!isTopLevel(node))
|
|
254
|
+
return [];
|
|
255
|
+
if (dunderAll !== null)
|
|
256
|
+
return dunderAll.has(name) ? [name] : [];
|
|
257
|
+
return name.startsWith("_") ? [] : [name];
|
|
258
|
+
},
|
|
259
|
+
detectDecisionAndNesting(node) {
|
|
260
|
+
const detected = base.detectDecisionAndNesting(node);
|
|
261
|
+
// `union_pattern` ist FLACH: `case 1 | 2 | 3` ist EIN Knoten mit drei
|
|
262
|
+
// Zweigen, waehrend Rusts `or_pattern` fuer dasselbe zwei verschachtelte
|
|
263
|
+
// Knoten baut. Ohne diese Zahl kostete `1 | 2 | 3` so viel wie `1 | 2`.
|
|
264
|
+
if (node.type !== "union_pattern" || detected.decision === undefined)
|
|
265
|
+
return detected;
|
|
266
|
+
const alternatives = node.namedChildCount;
|
|
267
|
+
if (alternatives <= 1)
|
|
268
|
+
return detected;
|
|
269
|
+
return { ...detected, decision: { ...detected.decision, repeat: alternatives - 1 } };
|
|
270
|
+
},
|
|
271
|
+
collectModuleFacts(node, kind, callerScopeId, ctx, sink) {
|
|
272
|
+
if (kind === "import_statement" ||
|
|
273
|
+
kind === "import_from_statement" ||
|
|
274
|
+
kind === "future_import_statement") {
|
|
275
|
+
collectPythonImports(node, ctx, sink, isInitFile);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
base.collectModuleFacts(node, kind, callerScopeId, ctx, sink);
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=profile.js.map
|