gitnexus 1.4.7 → 1.4.9
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/README.md +29 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +1 -1
- package/dist/cli/analyze.d.ts +2 -0
- package/dist/cli/analyze.js +54 -21
- package/dist/cli/index-repo.d.ts +15 -0
- package/dist/cli/index-repo.js +115 -0
- package/dist/cli/index.js +13 -3
- package/dist/cli/setup.js +90 -10
- package/dist/cli/wiki.d.ts +4 -0
- package/dist/cli/wiki.js +174 -53
- package/dist/config/supported-languages.d.ts +33 -1
- package/dist/config/supported-languages.js +32 -0
- package/dist/core/embeddings/embedder.d.ts +6 -1
- package/dist/core/embeddings/embedder.js +65 -5
- package/dist/core/embeddings/embedding-pipeline.js +11 -9
- package/dist/core/embeddings/http-client.d.ts +31 -0
- package/dist/core/embeddings/http-client.js +179 -0
- package/dist/core/embeddings/index.d.ts +1 -0
- package/dist/core/embeddings/index.js +1 -0
- package/dist/core/embeddings/types.d.ts +1 -1
- package/dist/core/graph/graph.js +9 -1
- package/dist/core/graph/types.d.ts +11 -2
- package/dist/core/ingestion/call-processor.d.ts +66 -2
- package/dist/core/ingestion/call-processor.js +650 -30
- package/dist/core/ingestion/call-routing.d.ts +9 -18
- package/dist/core/ingestion/call-routing.js +0 -19
- package/dist/core/ingestion/cobol/cobol-copy-expander.d.ts +57 -0
- package/dist/core/ingestion/cobol/cobol-copy-expander.js +385 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.d.ts +210 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1509 -0
- package/dist/core/ingestion/cobol/jcl-parser.d.ts +68 -0
- package/dist/core/ingestion/cobol/jcl-parser.js +217 -0
- package/dist/core/ingestion/cobol/jcl-processor.d.ts +33 -0
- package/dist/core/ingestion/cobol/jcl-processor.js +229 -0
- package/dist/core/ingestion/cobol-processor.d.ts +54 -0
- package/dist/core/ingestion/cobol-processor.js +1186 -0
- package/dist/core/ingestion/entry-point-scoring.d.ts +17 -0
- package/dist/core/ingestion/entry-point-scoring.js +52 -28
- package/dist/core/ingestion/export-detection.d.ts +47 -8
- package/dist/core/ingestion/export-detection.js +29 -50
- package/dist/core/ingestion/field-extractor.d.ts +29 -0
- package/dist/core/ingestion/field-extractor.js +25 -0
- package/dist/core/ingestion/field-extractors/configs/c-cpp.d.ts +3 -0
- package/dist/core/ingestion/field-extractors/configs/c-cpp.js +108 -0
- package/dist/core/ingestion/field-extractors/configs/csharp.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/csharp.js +73 -0
- package/dist/core/ingestion/field-extractors/configs/dart.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/dart.js +76 -0
- package/dist/core/ingestion/field-extractors/configs/go.d.ts +11 -0
- package/dist/core/ingestion/field-extractors/configs/go.js +64 -0
- package/dist/core/ingestion/field-extractors/configs/helpers.d.ts +44 -0
- package/dist/core/ingestion/field-extractors/configs/helpers.js +134 -0
- package/dist/core/ingestion/field-extractors/configs/jvm.d.ts +3 -0
- package/dist/core/ingestion/field-extractors/configs/jvm.js +118 -0
- package/dist/core/ingestion/field-extractors/configs/php.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/php.js +67 -0
- package/dist/core/ingestion/field-extractors/configs/python.d.ts +12 -0
- package/dist/core/ingestion/field-extractors/configs/python.js +91 -0
- package/dist/core/ingestion/field-extractors/configs/ruby.d.ts +16 -0
- package/dist/core/ingestion/field-extractors/configs/ruby.js +75 -0
- package/dist/core/ingestion/field-extractors/configs/rust.d.ts +9 -0
- package/dist/core/ingestion/field-extractors/configs/rust.js +55 -0
- package/dist/core/ingestion/field-extractors/configs/swift.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/swift.js +63 -0
- package/dist/core/ingestion/field-extractors/configs/typescript-javascript.d.ts +3 -0
- package/dist/core/ingestion/field-extractors/configs/typescript-javascript.js +60 -0
- package/dist/core/ingestion/field-extractors/generic.d.ts +46 -0
- package/dist/core/ingestion/field-extractors/generic.js +111 -0
- package/dist/core/ingestion/field-extractors/typescript.d.ts +77 -0
- package/dist/core/ingestion/field-extractors/typescript.js +291 -0
- package/dist/core/ingestion/field-types.d.ts +59 -0
- package/dist/core/ingestion/field-types.js +2 -0
- package/dist/core/ingestion/framework-detection.d.ts +97 -2
- package/dist/core/ingestion/framework-detection.js +114 -14
- package/dist/core/ingestion/heritage-processor.js +62 -66
- package/dist/core/ingestion/import-processor.d.ts +9 -10
- package/dist/core/ingestion/import-processor.js +150 -196
- package/dist/core/ingestion/{resolvers → import-resolvers}/csharp.d.ts +6 -9
- package/dist/core/ingestion/{resolvers → import-resolvers}/csharp.js +20 -2
- package/dist/core/ingestion/import-resolvers/dart.d.ts +7 -0
- package/dist/core/ingestion/import-resolvers/dart.js +44 -0
- package/dist/core/ingestion/{resolvers → import-resolvers}/go.d.ts +4 -5
- package/dist/core/ingestion/{resolvers → import-resolvers}/go.js +17 -0
- package/dist/core/ingestion/{resolvers → import-resolvers}/jvm.d.ts +10 -1
- package/dist/core/ingestion/import-resolvers/jvm.js +159 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +25 -0
- package/dist/core/ingestion/import-resolvers/php.js +80 -0
- package/dist/core/ingestion/{resolvers → import-resolvers}/python.d.ts +9 -3
- package/dist/core/ingestion/{resolvers → import-resolvers}/python.js +35 -3
- package/dist/core/ingestion/{resolvers → import-resolvers}/ruby.d.ts +5 -2
- package/dist/core/ingestion/{resolvers → import-resolvers}/ruby.js +7 -2
- package/dist/core/ingestion/{resolvers → import-resolvers}/rust.d.ts +5 -2
- package/dist/core/ingestion/{resolvers → import-resolvers}/rust.js +41 -2
- package/dist/core/ingestion/{resolvers → import-resolvers}/standard.d.ts +15 -7
- package/dist/core/ingestion/{resolvers → import-resolvers}/standard.js +22 -3
- package/dist/core/ingestion/import-resolvers/swift.d.ts +7 -0
- package/dist/core/ingestion/import-resolvers/swift.js +23 -0
- package/dist/core/ingestion/import-resolvers/types.d.ts +44 -0
- package/dist/core/ingestion/import-resolvers/types.js +6 -0
- package/dist/core/ingestion/{resolvers → import-resolvers}/utils.d.ts +2 -0
- package/dist/core/ingestion/{resolvers → import-resolvers}/utils.js +7 -0
- package/dist/core/ingestion/language-config.d.ts +6 -0
- package/dist/core/ingestion/language-config.js +13 -0
- package/dist/core/ingestion/language-provider.d.ts +121 -0
- package/dist/core/ingestion/language-provider.js +24 -0
- package/dist/core/ingestion/languages/c-cpp.d.ts +12 -0
- package/dist/core/ingestion/languages/c-cpp.js +71 -0
- package/dist/core/ingestion/languages/cobol.d.ts +1 -0
- package/dist/core/ingestion/languages/cobol.js +26 -0
- package/dist/core/ingestion/languages/csharp.d.ts +8 -0
- package/dist/core/ingestion/languages/csharp.js +49 -0
- package/dist/core/ingestion/languages/dart.d.ts +12 -0
- package/dist/core/ingestion/languages/dart.js +58 -0
- package/dist/core/ingestion/languages/go.d.ts +11 -0
- package/dist/core/ingestion/languages/go.js +28 -0
- package/dist/core/ingestion/languages/index.d.ts +38 -0
- package/dist/core/ingestion/languages/index.js +63 -0
- package/dist/core/ingestion/languages/java.d.ts +9 -0
- package/dist/core/ingestion/languages/java.js +29 -0
- package/dist/core/ingestion/languages/kotlin.d.ts +9 -0
- package/dist/core/ingestion/languages/kotlin.js +53 -0
- package/dist/core/ingestion/languages/php.d.ts +8 -0
- package/dist/core/ingestion/languages/php.js +145 -0
- package/dist/core/ingestion/languages/python.d.ts +12 -0
- package/dist/core/ingestion/languages/python.js +39 -0
- package/dist/core/ingestion/languages/ruby.d.ts +9 -0
- package/dist/core/ingestion/languages/ruby.js +44 -0
- package/dist/core/ingestion/languages/rust.d.ts +12 -0
- package/dist/core/ingestion/languages/rust.js +44 -0
- package/dist/core/ingestion/languages/swift.d.ts +12 -0
- package/dist/core/ingestion/languages/swift.js +133 -0
- package/dist/core/ingestion/languages/typescript.d.ts +10 -0
- package/dist/core/ingestion/languages/typescript.js +60 -0
- package/dist/core/ingestion/markdown-processor.d.ts +17 -0
- package/dist/core/ingestion/markdown-processor.js +124 -0
- package/dist/core/ingestion/mro-processor.js +22 -18
- package/dist/core/ingestion/named-binding-processor.d.ts +18 -0
- package/dist/core/ingestion/named-binding-processor.js +42 -0
- package/dist/core/ingestion/named-bindings/csharp.d.ts +3 -0
- package/dist/core/ingestion/named-bindings/csharp.js +37 -0
- package/dist/core/ingestion/named-bindings/java.d.ts +3 -0
- package/dist/core/ingestion/named-bindings/java.js +29 -0
- package/dist/core/ingestion/named-bindings/kotlin.d.ts +3 -0
- package/dist/core/ingestion/named-bindings/kotlin.js +36 -0
- package/dist/core/ingestion/named-bindings/php.d.ts +3 -0
- package/dist/core/ingestion/named-bindings/php.js +61 -0
- package/dist/core/ingestion/named-bindings/python.d.ts +3 -0
- package/dist/core/ingestion/named-bindings/python.js +49 -0
- package/dist/core/ingestion/named-bindings/rust.d.ts +3 -0
- package/dist/core/ingestion/named-bindings/rust.js +64 -0
- package/dist/core/ingestion/named-bindings/types.d.ts +16 -0
- package/dist/core/ingestion/named-bindings/types.js +6 -0
- package/dist/core/ingestion/named-bindings/typescript.d.ts +3 -0
- package/dist/core/ingestion/named-bindings/typescript.js +58 -0
- package/dist/core/ingestion/parsing-processor.d.ts +6 -2
- package/dist/core/ingestion/parsing-processor.js +125 -85
- package/dist/core/ingestion/pipeline.d.ts +10 -0
- package/dist/core/ingestion/pipeline.js +1235 -317
- package/dist/core/ingestion/resolution-context.d.ts +5 -0
- package/dist/core/ingestion/resolution-context.js +8 -5
- package/dist/core/ingestion/route-extractors/expo.d.ts +1 -0
- package/dist/core/ingestion/route-extractors/expo.js +36 -0
- package/dist/core/ingestion/route-extractors/middleware.d.ts +47 -0
- package/dist/core/ingestion/route-extractors/middleware.js +143 -0
- package/dist/core/ingestion/route-extractors/nextjs.d.ts +3 -0
- package/dist/core/ingestion/route-extractors/nextjs.js +76 -0
- package/dist/core/ingestion/route-extractors/php.d.ts +7 -0
- package/dist/core/ingestion/route-extractors/php.js +21 -0
- package/dist/core/ingestion/route-extractors/response-shapes.d.ts +20 -0
- package/dist/core/ingestion/route-extractors/response-shapes.js +290 -0
- package/dist/core/ingestion/symbol-table.d.ts +16 -0
- package/dist/core/ingestion/symbol-table.js +20 -6
- package/dist/core/ingestion/tree-sitter-queries.d.ts +10 -9
- package/dist/core/ingestion/tree-sitter-queries.js +274 -11
- package/dist/core/ingestion/type-env.d.ts +42 -18
- package/dist/core/ingestion/type-env.js +481 -106
- package/dist/core/ingestion/type-extractors/c-cpp.d.ts +5 -0
- package/dist/core/ingestion/type-extractors/c-cpp.js +119 -0
- package/dist/core/ingestion/type-extractors/csharp.js +149 -16
- package/dist/core/ingestion/type-extractors/dart.d.ts +15 -0
- package/dist/core/ingestion/type-extractors/dart.js +371 -0
- package/dist/core/ingestion/type-extractors/jvm.js +169 -66
- package/dist/core/ingestion/type-extractors/rust.js +35 -1
- package/dist/core/ingestion/type-extractors/shared.d.ts +1 -15
- package/dist/core/ingestion/type-extractors/shared.js +14 -112
- package/dist/core/ingestion/type-extractors/swift.js +338 -7
- package/dist/core/ingestion/type-extractors/types.d.ts +40 -8
- package/dist/core/ingestion/type-extractors/typescript.js +141 -9
- package/dist/core/ingestion/utils/ast-helpers.d.ts +83 -0
- package/dist/core/ingestion/utils/ast-helpers.js +817 -0
- package/dist/core/ingestion/utils/call-analysis.d.ts +73 -0
- package/dist/core/ingestion/utils/call-analysis.js +527 -0
- package/dist/core/ingestion/utils/event-loop.d.ts +5 -0
- package/dist/core/ingestion/utils/event-loop.js +5 -0
- package/dist/core/ingestion/utils/language-detection.d.ts +9 -0
- package/dist/core/ingestion/utils/language-detection.js +70 -0
- package/dist/core/ingestion/utils/verbose.d.ts +1 -0
- package/dist/core/ingestion/utils/verbose.js +7 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +55 -5
- package/dist/core/ingestion/workers/parse-worker.js +415 -225
- package/dist/core/lbug/csv-generator.js +51 -1
- package/dist/core/lbug/lbug-adapter.d.ts +10 -0
- package/dist/core/lbug/lbug-adapter.js +75 -4
- package/dist/core/lbug/schema.d.ts +8 -4
- package/dist/core/lbug/schema.js +65 -4
- package/dist/core/tree-sitter/parser-loader.js +7 -1
- package/dist/core/wiki/cursor-client.d.ts +31 -0
- package/dist/core/wiki/cursor-client.js +127 -0
- package/dist/core/wiki/generator.d.ts +28 -9
- package/dist/core/wiki/generator.js +115 -18
- package/dist/core/wiki/graph-queries.d.ts +4 -0
- package/dist/core/wiki/graph-queries.js +7 -1
- package/dist/core/wiki/llm-client.d.ts +2 -0
- package/dist/core/wiki/llm-client.js +8 -4
- package/dist/core/wiki/prompts.d.ts +3 -3
- package/dist/core/wiki/prompts.js +6 -0
- package/dist/mcp/core/embedder.js +11 -3
- package/dist/mcp/core/lbug-adapter.d.ts +5 -0
- package/dist/mcp/core/lbug-adapter.js +23 -2
- package/dist/mcp/local/local-backend.d.ts +38 -5
- package/dist/mcp/local/local-backend.js +804 -63
- package/dist/mcp/resources.js +2 -0
- package/dist/mcp/tools.js +73 -4
- package/dist/server/api.d.ts +19 -1
- package/dist/server/api.js +66 -6
- package/dist/storage/git.d.ts +12 -0
- package/dist/storage/git.js +21 -0
- package/dist/storage/repo-manager.d.ts +3 -0
- package/package.json +25 -16
- package/dist/core/ingestion/named-binding-extraction.d.ts +0 -61
- package/dist/core/ingestion/named-binding-extraction.js +0 -363
- package/dist/core/ingestion/resolvers/index.d.ts +0 -18
- package/dist/core/ingestion/resolvers/index.js +0 -13
- package/dist/core/ingestion/resolvers/jvm.js +0 -87
- package/dist/core/ingestion/resolvers/php.d.ts +0 -15
- package/dist/core/ingestion/resolvers/php.js +0 -35
- package/dist/core/ingestion/type-extractors/index.d.ts +0 -22
- package/dist/core/ingestion/type-extractors/index.js +0 -31
- package/dist/core/ingestion/utils.d.ts +0 -138
- package/dist/core/ingestion/utils.js +0 -1290
- package/scripts/patch-tree-sitter-swift.cjs +0 -74
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Provider Registry — compile-time exhaustive provider table.
|
|
3
|
+
*
|
|
4
|
+
* To add a new language:
|
|
5
|
+
* 1. Add enum member to SupportedLanguages
|
|
6
|
+
* 2. Create `languages/<lang>.ts` exporting a LanguageProvider
|
|
7
|
+
* 3. Add one line to the `providers` table below
|
|
8
|
+
* 4. Run `tsc --noEmit` to verify
|
|
9
|
+
*/
|
|
10
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
11
|
+
import { typescriptProvider, javascriptProvider } from './typescript.js';
|
|
12
|
+
import { pythonProvider } from './python.js';
|
|
13
|
+
import { javaProvider } from './java.js';
|
|
14
|
+
import { kotlinProvider } from './kotlin.js';
|
|
15
|
+
import { goProvider } from './go.js';
|
|
16
|
+
import { rustProvider } from './rust.js';
|
|
17
|
+
import { csharpProvider } from './csharp.js';
|
|
18
|
+
import { cProvider, cppProvider } from './c-cpp.js';
|
|
19
|
+
import { phpProvider } from './php.js';
|
|
20
|
+
import { rubyProvider } from './ruby.js';
|
|
21
|
+
import { swiftProvider } from './swift.js';
|
|
22
|
+
import { dartProvider } from './dart.js';
|
|
23
|
+
import { cobolProvider } from './cobol.js';
|
|
24
|
+
export const providers = {
|
|
25
|
+
[SupportedLanguages.JavaScript]: javascriptProvider,
|
|
26
|
+
[SupportedLanguages.TypeScript]: typescriptProvider,
|
|
27
|
+
[SupportedLanguages.Python]: pythonProvider,
|
|
28
|
+
[SupportedLanguages.Java]: javaProvider,
|
|
29
|
+
[SupportedLanguages.Kotlin]: kotlinProvider,
|
|
30
|
+
[SupportedLanguages.Go]: goProvider,
|
|
31
|
+
[SupportedLanguages.Rust]: rustProvider,
|
|
32
|
+
[SupportedLanguages.CSharp]: csharpProvider,
|
|
33
|
+
[SupportedLanguages.C]: cProvider,
|
|
34
|
+
[SupportedLanguages.CPlusPlus]: cppProvider,
|
|
35
|
+
[SupportedLanguages.PHP]: phpProvider,
|
|
36
|
+
[SupportedLanguages.Ruby]: rubyProvider,
|
|
37
|
+
[SupportedLanguages.Swift]: swiftProvider,
|
|
38
|
+
[SupportedLanguages.Dart]: dartProvider,
|
|
39
|
+
[SupportedLanguages.Cobol]: cobolProvider,
|
|
40
|
+
};
|
|
41
|
+
/** Get provider by language enum (always succeeds for SupportedLanguages). */
|
|
42
|
+
export function getProvider(language) {
|
|
43
|
+
return providers[language];
|
|
44
|
+
}
|
|
45
|
+
/** Pre-built extension → provider lookup (built once at module load). */
|
|
46
|
+
const extensionMap = new Map();
|
|
47
|
+
for (const provider of Object.values(providers)) {
|
|
48
|
+
for (const ext of provider.extensions) {
|
|
49
|
+
extensionMap.set(ext, provider);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Look up a language provider from a file path by extension.
|
|
53
|
+
* Returns null if the file extension is not recognized. */
|
|
54
|
+
export function getProviderForFile(filePath) {
|
|
55
|
+
const lastDot = filePath.lastIndexOf('.');
|
|
56
|
+
const ext = lastDot >= 0 ? filePath.slice(lastDot).toLowerCase() : '';
|
|
57
|
+
const basename = filePath.slice(filePath.lastIndexOf('/') + 1);
|
|
58
|
+
return extensionMap.get(ext) ?? extensionMap.get(basename) ?? null;
|
|
59
|
+
}
|
|
60
|
+
/** Pre-computed list of providers that have implicit import wiring (e.g., Swift).
|
|
61
|
+
* Built once at module load — avoids iterating all 13 providers per call. */
|
|
62
|
+
export const providersWithImplicitWiring = Object.values(providers)
|
|
63
|
+
.filter((p) => p.implicitImportWirer != null);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java language provider.
|
|
3
|
+
*
|
|
4
|
+
* Java uses named imports, JVM wildcard/member import resolution,
|
|
5
|
+
* and a 'public' modifier-based export checker. Heritage uses
|
|
6
|
+
* EXTENDS by default with implements-split MRO for multiple
|
|
7
|
+
* interface implementation.
|
|
8
|
+
*/
|
|
9
|
+
export declare const javaProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java language provider.
|
|
3
|
+
*
|
|
4
|
+
* Java uses named imports, JVM wildcard/member import resolution,
|
|
5
|
+
* and a 'public' modifier-based export checker. Heritage uses
|
|
6
|
+
* EXTENDS by default with implements-split MRO for multiple
|
|
7
|
+
* interface implementation.
|
|
8
|
+
*/
|
|
9
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
10
|
+
import { defineLanguage } from '../language-provider.js';
|
|
11
|
+
import { javaTypeConfig } from '../type-extractors/jvm.js';
|
|
12
|
+
import { javaExportChecker } from '../export-detection.js';
|
|
13
|
+
import { resolveJavaImport } from '../import-resolvers/jvm.js';
|
|
14
|
+
import { extractJavaNamedBindings } from '../named-bindings/java.js';
|
|
15
|
+
import { JAVA_QUERIES } from '../tree-sitter-queries.js';
|
|
16
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
17
|
+
import { javaConfig } from '../field-extractors/configs/jvm.js';
|
|
18
|
+
export const javaProvider = defineLanguage({
|
|
19
|
+
id: SupportedLanguages.Java,
|
|
20
|
+
extensions: ['.java'],
|
|
21
|
+
treeSitterQueries: JAVA_QUERIES,
|
|
22
|
+
typeConfig: javaTypeConfig,
|
|
23
|
+
exportChecker: javaExportChecker,
|
|
24
|
+
importResolver: resolveJavaImport,
|
|
25
|
+
namedBindingExtractor: extractJavaNamedBindings,
|
|
26
|
+
interfaceNamePattern: /^I[A-Z]/,
|
|
27
|
+
mroStrategy: 'implements-split',
|
|
28
|
+
fieldExtractor: createFieldExtractor(javaConfig),
|
|
29
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kotlin language provider.
|
|
3
|
+
*
|
|
4
|
+
* Kotlin uses named imports with JVM wildcard/member resolution and
|
|
5
|
+
* Java-interop fallback. Default visibility is public (no modifier needed).
|
|
6
|
+
* Heritage uses EXTENDS by default with implements-split MRO for
|
|
7
|
+
* multiple interface implementation.
|
|
8
|
+
*/
|
|
9
|
+
export declare const kotlinProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kotlin language provider.
|
|
3
|
+
*
|
|
4
|
+
* Kotlin uses named imports with JVM wildcard/member resolution and
|
|
5
|
+
* Java-interop fallback. Default visibility is public (no modifier needed).
|
|
6
|
+
* Heritage uses EXTENDS by default with implements-split MRO for
|
|
7
|
+
* multiple interface implementation.
|
|
8
|
+
*/
|
|
9
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
10
|
+
import { defineLanguage } from '../language-provider.js';
|
|
11
|
+
import { kotlinTypeConfig } from '../type-extractors/jvm.js';
|
|
12
|
+
import { kotlinExportChecker } from '../export-detection.js';
|
|
13
|
+
import { resolveKotlinImport } from '../import-resolvers/jvm.js';
|
|
14
|
+
import { extractKotlinNamedBindings } from '../named-bindings/kotlin.js';
|
|
15
|
+
import { appendKotlinWildcard } from '../import-resolvers/jvm.js';
|
|
16
|
+
import { KOTLIN_QUERIES } from '../tree-sitter-queries.js';
|
|
17
|
+
import { isKotlinClassMethod } from '../utils/ast-helpers.js';
|
|
18
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
19
|
+
import { kotlinConfig } from '../field-extractors/configs/jvm.js';
|
|
20
|
+
const BUILT_INS = new Set([
|
|
21
|
+
'println', 'print', 'readLine', 'require', 'requireNotNull', 'check', 'assert', 'lazy', 'error',
|
|
22
|
+
'listOf', 'mapOf', 'setOf', 'mutableListOf', 'mutableMapOf', 'mutableSetOf',
|
|
23
|
+
'arrayOf', 'sequenceOf', 'also', 'apply', 'run', 'with', 'takeIf', 'takeUnless',
|
|
24
|
+
'TODO', 'buildString', 'buildList', 'buildMap', 'buildSet',
|
|
25
|
+
'repeat', 'synchronized',
|
|
26
|
+
'launch', 'async', 'runBlocking', 'withContext', 'coroutineScope',
|
|
27
|
+
'supervisorScope', 'delay',
|
|
28
|
+
'flow', 'flowOf', 'collect', 'emit', 'onEach', 'catch',
|
|
29
|
+
'buffer', 'conflate', 'distinctUntilChanged',
|
|
30
|
+
'flatMapLatest', 'flatMapMerge', 'combine',
|
|
31
|
+
'stateIn', 'shareIn', 'launchIn',
|
|
32
|
+
'to', 'until', 'downTo', 'step',
|
|
33
|
+
]);
|
|
34
|
+
export const kotlinProvider = defineLanguage({
|
|
35
|
+
id: SupportedLanguages.Kotlin,
|
|
36
|
+
extensions: ['.kt', '.kts'],
|
|
37
|
+
treeSitterQueries: KOTLIN_QUERIES,
|
|
38
|
+
typeConfig: kotlinTypeConfig,
|
|
39
|
+
exportChecker: kotlinExportChecker,
|
|
40
|
+
importResolver: resolveKotlinImport,
|
|
41
|
+
namedBindingExtractor: extractKotlinNamedBindings,
|
|
42
|
+
importPathPreprocessor: appendKotlinWildcard,
|
|
43
|
+
mroStrategy: 'implements-split',
|
|
44
|
+
fieldExtractor: createFieldExtractor(kotlinConfig),
|
|
45
|
+
builtInNames: BUILT_INS,
|
|
46
|
+
labelOverride: (functionNode, defaultLabel) => {
|
|
47
|
+
if (defaultLabel !== 'Function')
|
|
48
|
+
return defaultLabel;
|
|
49
|
+
if (isKotlinClassMethod(functionNode))
|
|
50
|
+
return 'Method';
|
|
51
|
+
return defaultLabel;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PHP language provider.
|
|
3
|
+
*
|
|
4
|
+
* PHP uses named imports (use statements for classes/functions/constants),
|
|
5
|
+
* and standard export/import resolution. PHP files can use a variety of
|
|
6
|
+
* extensions from legacy versions through modern PHP 8.
|
|
7
|
+
*/
|
|
8
|
+
export declare const phpProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PHP language provider.
|
|
3
|
+
*
|
|
4
|
+
* PHP uses named imports (use statements for classes/functions/constants),
|
|
5
|
+
* and standard export/import resolution. PHP files can use a variety of
|
|
6
|
+
* extensions from legacy versions through modern PHP 8.
|
|
7
|
+
*/
|
|
8
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
9
|
+
import { defineLanguage } from '../language-provider.js';
|
|
10
|
+
import { typeConfig as phpConfig } from '../type-extractors/php.js';
|
|
11
|
+
import { phpExportChecker } from '../export-detection.js';
|
|
12
|
+
import { resolvePhpImport } from '../import-resolvers/php.js';
|
|
13
|
+
import { extractPhpNamedBindings } from '../named-bindings/php.js';
|
|
14
|
+
import { PHP_QUERIES } from '../tree-sitter-queries.js';
|
|
15
|
+
import { findDescendant, extractStringContent } from '../utils/ast-helpers.js';
|
|
16
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
17
|
+
import { phpConfig as phpFieldConfig } from '../field-extractors/configs/php.js';
|
|
18
|
+
const BUILT_INS = new Set([
|
|
19
|
+
'echo', 'isset', 'empty', 'unset', 'list', 'array', 'compact', 'extract',
|
|
20
|
+
'count', 'strlen', 'strpos', 'strrpos', 'substr', 'strtolower', 'strtoupper', 'trim',
|
|
21
|
+
'ltrim', 'rtrim', 'str_replace', 'str_contains', 'str_starts_with', 'str_ends_with',
|
|
22
|
+
'sprintf', 'vsprintf', 'printf', 'number_format',
|
|
23
|
+
'array_map', 'array_filter', 'array_reduce', 'array_push', 'array_pop', 'array_shift',
|
|
24
|
+
'array_unshift', 'array_slice', 'array_splice', 'array_merge', 'array_keys', 'array_values',
|
|
25
|
+
'array_key_exists', 'in_array', 'array_search', 'array_unique', 'usort', 'rsort',
|
|
26
|
+
'json_encode', 'json_decode', 'serialize', 'unserialize',
|
|
27
|
+
'intval', 'floatval', 'strval', 'boolval', 'is_null', 'is_string', 'is_int', 'is_array',
|
|
28
|
+
'is_object', 'is_numeric', 'is_bool', 'is_float',
|
|
29
|
+
'var_dump', 'print_r', 'var_export',
|
|
30
|
+
'date', 'time', 'strtotime', 'mktime', 'microtime',
|
|
31
|
+
'file_exists', 'file_get_contents', 'file_put_contents', 'is_file', 'is_dir',
|
|
32
|
+
'preg_match', 'preg_match_all', 'preg_replace', 'preg_split',
|
|
33
|
+
'header', 'session_start', 'session_destroy', 'ob_start', 'ob_end_clean', 'ob_get_clean',
|
|
34
|
+
'dd', 'dump',
|
|
35
|
+
]);
|
|
36
|
+
/** Eloquent model properties whose array values are worth indexing. */
|
|
37
|
+
const ELOQUENT_ARRAY_PROPS = new Set(['fillable', 'casts', 'hidden', 'guarded', 'with', 'appends']);
|
|
38
|
+
/** Eloquent relationship method names. */
|
|
39
|
+
const ELOQUENT_RELATIONS = new Set([
|
|
40
|
+
'hasMany', 'hasOne', 'belongsTo', 'belongsToMany',
|
|
41
|
+
'morphTo', 'morphMany', 'morphOne', 'morphToMany', 'morphedByMany',
|
|
42
|
+
'hasManyThrough', 'hasOneThrough',
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* For a PHP property_declaration node, extract array values as a description string.
|
|
46
|
+
* Returns null if not an Eloquent model property or no array values found.
|
|
47
|
+
*/
|
|
48
|
+
function extractPhpPropertyDescription(propName, propDeclNode) {
|
|
49
|
+
if (!ELOQUENT_ARRAY_PROPS.has(propName))
|
|
50
|
+
return null;
|
|
51
|
+
const arrayNode = findDescendant(propDeclNode, 'array_creation_expression');
|
|
52
|
+
if (!arrayNode)
|
|
53
|
+
return null;
|
|
54
|
+
const items = [];
|
|
55
|
+
for (const child of (arrayNode.children ?? [])) {
|
|
56
|
+
if (child.type !== 'array_element_initializer')
|
|
57
|
+
continue;
|
|
58
|
+
const children = child.children ?? [];
|
|
59
|
+
const arrowIdx = children.findIndex((c) => c.type === '=>');
|
|
60
|
+
if (arrowIdx !== -1) {
|
|
61
|
+
const key = extractStringContent(children[arrowIdx - 1]);
|
|
62
|
+
const val = extractStringContent(children[arrowIdx + 1]);
|
|
63
|
+
if (key && val)
|
|
64
|
+
items.push(`${key}:${val}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const val = extractStringContent(children[0]);
|
|
68
|
+
if (val)
|
|
69
|
+
items.push(val);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return items.length > 0 ? items.join(', ') : null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* For a PHP method_declaration node, detect if it defines an Eloquent relationship.
|
|
76
|
+
* Returns description like "hasMany(Post)" or null.
|
|
77
|
+
*/
|
|
78
|
+
function extractEloquentRelationDescription(methodNode) {
|
|
79
|
+
function findRelationCall(node) {
|
|
80
|
+
if (node.type === 'member_call_expression') {
|
|
81
|
+
const children = node.children ?? [];
|
|
82
|
+
const objectNode = children.find((c) => c.type === 'variable_name' && c.text === '$this');
|
|
83
|
+
const nameNode = children.find((c) => c.type === 'name');
|
|
84
|
+
if (objectNode && nameNode && ELOQUENT_RELATIONS.has(nameNode.text))
|
|
85
|
+
return node;
|
|
86
|
+
}
|
|
87
|
+
for (const child of (node.children ?? [])) {
|
|
88
|
+
const found = findRelationCall(child);
|
|
89
|
+
if (found)
|
|
90
|
+
return found;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const callNode = findRelationCall(methodNode);
|
|
95
|
+
if (!callNode)
|
|
96
|
+
return null;
|
|
97
|
+
const relType = callNode.children?.find((c) => c.type === 'name')?.text;
|
|
98
|
+
const argsNode = callNode.children?.find((c) => c.type === 'arguments');
|
|
99
|
+
let targetModel = null;
|
|
100
|
+
if (argsNode) {
|
|
101
|
+
const firstArg = argsNode.children?.find((c) => c.type === 'argument');
|
|
102
|
+
if (firstArg) {
|
|
103
|
+
const classConstant = firstArg.children?.find((c) => c.type === 'class_constant_access_expression');
|
|
104
|
+
if (classConstant) {
|
|
105
|
+
targetModel = classConstant.children?.find((c) => c.type === 'name')?.text ?? null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (relType && targetModel)
|
|
110
|
+
return `${relType}(${targetModel})`;
|
|
111
|
+
if (relType)
|
|
112
|
+
return relType;
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* LanguageProvider.descriptionExtractor implementation for PHP.
|
|
117
|
+
* Extracts Eloquent model property metadata and relationship descriptions.
|
|
118
|
+
*/
|
|
119
|
+
function phpDescriptionExtractor(nodeLabel, nodeName, captureMap) {
|
|
120
|
+
if (nodeLabel === 'Property' && captureMap['definition.property']) {
|
|
121
|
+
return extractPhpPropertyDescription(nodeName, captureMap['definition.property']) ?? undefined;
|
|
122
|
+
}
|
|
123
|
+
if (nodeLabel === 'Method' && captureMap['definition.method']) {
|
|
124
|
+
return extractEloquentRelationDescription(captureMap['definition.method']) ?? undefined;
|
|
125
|
+
}
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
/** Detect Laravel route files by path convention. */
|
|
129
|
+
function isPhpRouteFile(filePath) {
|
|
130
|
+
return filePath.endsWith('.php') &&
|
|
131
|
+
(filePath.includes('/routes/') || filePath.startsWith('routes/'));
|
|
132
|
+
}
|
|
133
|
+
export const phpProvider = defineLanguage({
|
|
134
|
+
id: SupportedLanguages.PHP,
|
|
135
|
+
extensions: ['.php', '.phtml', '.php3', '.php4', '.php5', '.php8'],
|
|
136
|
+
treeSitterQueries: PHP_QUERIES,
|
|
137
|
+
typeConfig: phpConfig,
|
|
138
|
+
exportChecker: phpExportChecker,
|
|
139
|
+
importResolver: resolvePhpImport,
|
|
140
|
+
namedBindingExtractor: extractPhpNamedBindings,
|
|
141
|
+
fieldExtractor: createFieldExtractor(phpFieldConfig),
|
|
142
|
+
descriptionExtractor: phpDescriptionExtractor,
|
|
143
|
+
isRouteFile: isPhpRouteFile,
|
|
144
|
+
builtInNames: BUILT_INS,
|
|
145
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Language Provider
|
|
3
|
+
*
|
|
4
|
+
* Assembles all Python-specific ingestion capabilities into a single
|
|
5
|
+
* LanguageProvider, following the Strategy pattern used by the pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Key Python traits:
|
|
8
|
+
* - importSemantics: 'namespace' (Python uses namespace imports, not wildcard)
|
|
9
|
+
* - mroStrategy: 'c3' (Python C3 linearization for multiple inheritance)
|
|
10
|
+
* - namedBindingExtractor: present (from X import Y)
|
|
11
|
+
*/
|
|
12
|
+
export declare const pythonProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Language Provider
|
|
3
|
+
*
|
|
4
|
+
* Assembles all Python-specific ingestion capabilities into a single
|
|
5
|
+
* LanguageProvider, following the Strategy pattern used by the pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Key Python traits:
|
|
8
|
+
* - importSemantics: 'namespace' (Python uses namespace imports, not wildcard)
|
|
9
|
+
* - mroStrategy: 'c3' (Python C3 linearization for multiple inheritance)
|
|
10
|
+
* - namedBindingExtractor: present (from X import Y)
|
|
11
|
+
*/
|
|
12
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
13
|
+
import { defineLanguage } from '../language-provider.js';
|
|
14
|
+
import { typeConfig as pythonConfig } from '../type-extractors/python.js';
|
|
15
|
+
import { pythonExportChecker } from '../export-detection.js';
|
|
16
|
+
import { resolvePythonImport } from '../import-resolvers/python.js';
|
|
17
|
+
import { extractPythonNamedBindings } from '../named-bindings/python.js';
|
|
18
|
+
import { PYTHON_QUERIES } from '../tree-sitter-queries.js';
|
|
19
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
20
|
+
import { pythonConfig as pythonFieldConfig } from '../field-extractors/configs/python.js';
|
|
21
|
+
const BUILT_INS = new Set([
|
|
22
|
+
'print', 'len', 'range', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple',
|
|
23
|
+
'append', 'extend', 'update',
|
|
24
|
+
'type', 'isinstance', 'issubclass', 'getattr', 'setattr', 'hasattr',
|
|
25
|
+
'enumerate', 'zip', 'sorted', 'reversed', 'min', 'max', 'sum', 'abs',
|
|
26
|
+
]);
|
|
27
|
+
export const pythonProvider = defineLanguage({
|
|
28
|
+
id: SupportedLanguages.Python,
|
|
29
|
+
extensions: ['.py'],
|
|
30
|
+
treeSitterQueries: PYTHON_QUERIES,
|
|
31
|
+
typeConfig: pythonConfig,
|
|
32
|
+
exportChecker: pythonExportChecker,
|
|
33
|
+
importResolver: resolvePythonImport,
|
|
34
|
+
namedBindingExtractor: extractPythonNamedBindings,
|
|
35
|
+
importSemantics: 'namespace',
|
|
36
|
+
mroStrategy: 'c3',
|
|
37
|
+
fieldExtractor: createFieldExtractor(pythonFieldConfig),
|
|
38
|
+
builtInNames: BUILT_INS,
|
|
39
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ruby language provider.
|
|
3
|
+
*
|
|
4
|
+
* Ruby uses wildcard import semantics (require/require_relative bring
|
|
5
|
+
* everything into scope). Ruby has SPECIAL call routing via routeRubyCall
|
|
6
|
+
* to handle require, include/extend (heritage), and attr_accessor/
|
|
7
|
+
* attr_reader/attr_writer (property definitions) as call expressions.
|
|
8
|
+
*/
|
|
9
|
+
export declare const rubyProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ruby language provider.
|
|
3
|
+
*
|
|
4
|
+
* Ruby uses wildcard import semantics (require/require_relative bring
|
|
5
|
+
* everything into scope). Ruby has SPECIAL call routing via routeRubyCall
|
|
6
|
+
* to handle require, include/extend (heritage), and attr_accessor/
|
|
7
|
+
* attr_reader/attr_writer (property definitions) as call expressions.
|
|
8
|
+
*/
|
|
9
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
10
|
+
import { defineLanguage } from '../language-provider.js';
|
|
11
|
+
import { typeConfig as rubyConfig } from '../type-extractors/ruby.js';
|
|
12
|
+
import { routeRubyCall } from '../call-routing.js';
|
|
13
|
+
import { rubyExportChecker } from '../export-detection.js';
|
|
14
|
+
import { resolveRubyImport } from '../import-resolvers/ruby.js';
|
|
15
|
+
import { RUBY_QUERIES } from '../tree-sitter-queries.js';
|
|
16
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
17
|
+
import { rubyConfig as rubyFieldConfig } from '../field-extractors/configs/ruby.js';
|
|
18
|
+
const BUILT_INS = new Set([
|
|
19
|
+
'puts', 'p', 'pp', 'raise', 'fail',
|
|
20
|
+
'require', 'require_relative', 'load', 'autoload',
|
|
21
|
+
'include', 'extend', 'prepend',
|
|
22
|
+
'attr_accessor', 'attr_reader', 'attr_writer',
|
|
23
|
+
'public', 'private', 'protected', 'module_function',
|
|
24
|
+
'lambda', 'proc', 'block_given?',
|
|
25
|
+
'nil?', 'is_a?', 'kind_of?', 'instance_of?', 'respond_to?',
|
|
26
|
+
'freeze', 'frozen?', 'dup', 'tap', 'yield_self',
|
|
27
|
+
'each', 'select', 'reject', 'detect', 'collect',
|
|
28
|
+
'inject', 'flat_map', 'each_with_object', 'each_with_index',
|
|
29
|
+
'any?', 'all?', 'none?', 'count', 'first', 'last',
|
|
30
|
+
'sort_by', 'min_by', 'max_by',
|
|
31
|
+
'group_by', 'partition', 'compact', 'flatten', 'uniq',
|
|
32
|
+
]);
|
|
33
|
+
export const rubyProvider = defineLanguage({
|
|
34
|
+
id: SupportedLanguages.Ruby,
|
|
35
|
+
extensions: ['.rb', '.rake', '.gemspec'],
|
|
36
|
+
treeSitterQueries: RUBY_QUERIES,
|
|
37
|
+
typeConfig: rubyConfig,
|
|
38
|
+
exportChecker: rubyExportChecker,
|
|
39
|
+
importResolver: resolveRubyImport,
|
|
40
|
+
callRouter: routeRubyCall,
|
|
41
|
+
importSemantics: 'wildcard',
|
|
42
|
+
fieldExtractor: createFieldExtractor(rubyFieldConfig),
|
|
43
|
+
builtInNames: BUILT_INS,
|
|
44
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust Language Provider
|
|
3
|
+
*
|
|
4
|
+
* Assembles all Rust-specific ingestion capabilities into a single
|
|
5
|
+
* LanguageProvider, following the Strategy pattern used by the pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Key Rust traits:
|
|
8
|
+
* - importSemantics: 'named' (Rust has use X::{a, b})
|
|
9
|
+
* - mroStrategy: 'qualified-syntax' (Rust uses trait qualification, not MRO)
|
|
10
|
+
* - namedBindingExtractor: present (use X::{a, b} extracts named bindings)
|
|
11
|
+
*/
|
|
12
|
+
export declare const rustProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust Language Provider
|
|
3
|
+
*
|
|
4
|
+
* Assembles all Rust-specific ingestion capabilities into a single
|
|
5
|
+
* LanguageProvider, following the Strategy pattern used by the pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Key Rust traits:
|
|
8
|
+
* - importSemantics: 'named' (Rust has use X::{a, b})
|
|
9
|
+
* - mroStrategy: 'qualified-syntax' (Rust uses trait qualification, not MRO)
|
|
10
|
+
* - namedBindingExtractor: present (use X::{a, b} extracts named bindings)
|
|
11
|
+
*/
|
|
12
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
13
|
+
import { defineLanguage } from '../language-provider.js';
|
|
14
|
+
import { typeConfig as rustConfig } from '../type-extractors/rust.js';
|
|
15
|
+
import { rustExportChecker } from '../export-detection.js';
|
|
16
|
+
import { resolveRustImport } from '../import-resolvers/rust.js';
|
|
17
|
+
import { extractRustNamedBindings } from '../named-bindings/rust.js';
|
|
18
|
+
import { RUST_QUERIES } from '../tree-sitter-queries.js';
|
|
19
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
20
|
+
import { rustConfig as rustFieldConfig } from '../field-extractors/configs/rust.js';
|
|
21
|
+
const BUILT_INS = new Set([
|
|
22
|
+
'unwrap', 'expect', 'unwrap_or', 'unwrap_or_else', 'unwrap_or_default',
|
|
23
|
+
'ok', 'err', 'is_ok', 'is_err', 'map', 'map_err', 'and_then', 'or_else',
|
|
24
|
+
'clone', 'to_string', 'to_owned', 'into', 'from', 'as_ref', 'as_mut',
|
|
25
|
+
'iter', 'into_iter', 'collect', 'filter', 'fold', 'for_each',
|
|
26
|
+
'len', 'is_empty', 'push', 'pop', 'insert', 'remove', 'contains',
|
|
27
|
+
'format', 'write', 'writeln', 'panic', 'unreachable', 'todo', 'unimplemented',
|
|
28
|
+
'vec', 'println', 'eprintln', 'dbg',
|
|
29
|
+
'lock', 'read', 'try_lock',
|
|
30
|
+
'spawn', 'join', 'sleep',
|
|
31
|
+
'Some', 'None', 'Ok', 'Err',
|
|
32
|
+
]);
|
|
33
|
+
export const rustProvider = defineLanguage({
|
|
34
|
+
id: SupportedLanguages.Rust,
|
|
35
|
+
extensions: ['.rs'],
|
|
36
|
+
treeSitterQueries: RUST_QUERIES,
|
|
37
|
+
typeConfig: rustConfig,
|
|
38
|
+
exportChecker: rustExportChecker,
|
|
39
|
+
importResolver: resolveRustImport,
|
|
40
|
+
namedBindingExtractor: extractRustNamedBindings,
|
|
41
|
+
mroStrategy: 'qualified-syntax',
|
|
42
|
+
fieldExtractor: createFieldExtractor(rustFieldConfig),
|
|
43
|
+
builtInNames: BUILT_INS,
|
|
44
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swift Language Provider
|
|
3
|
+
*
|
|
4
|
+
* Assembles all Swift-specific ingestion capabilities into a single
|
|
5
|
+
* LanguageProvider, following the Strategy pattern used by the pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Key Swift traits:
|
|
8
|
+
* - importSemantics: 'wildcard' (Swift imports entire modules)
|
|
9
|
+
* - heritageDefaultEdge: 'IMPLEMENTS' (protocols are more common than class inheritance)
|
|
10
|
+
* - implicitImportWirer: all files in the same SPM target see each other
|
|
11
|
+
*/
|
|
12
|
+
export declare const swiftProvider: import("../language-provider.js").LanguageProvider;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swift Language Provider
|
|
3
|
+
*
|
|
4
|
+
* Assembles all Swift-specific ingestion capabilities into a single
|
|
5
|
+
* LanguageProvider, following the Strategy pattern used by the pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Key Swift traits:
|
|
8
|
+
* - importSemantics: 'wildcard' (Swift imports entire modules)
|
|
9
|
+
* - heritageDefaultEdge: 'IMPLEMENTS' (protocols are more common than class inheritance)
|
|
10
|
+
* - implicitImportWirer: all files in the same SPM target see each other
|
|
11
|
+
*/
|
|
12
|
+
import { SupportedLanguages } from '../../../config/supported-languages.js';
|
|
13
|
+
import { defineLanguage } from '../language-provider.js';
|
|
14
|
+
import { typeConfig as swiftConfig } from '../type-extractors/swift.js';
|
|
15
|
+
import { swiftExportChecker } from '../export-detection.js';
|
|
16
|
+
import { resolveSwiftImport } from '../import-resolvers/swift.js';
|
|
17
|
+
import { SWIFT_QUERIES } from '../tree-sitter-queries.js';
|
|
18
|
+
import { createFieldExtractor } from '../field-extractors/generic.js';
|
|
19
|
+
import { swiftConfig as swiftFieldConfig } from '../field-extractors/configs/swift.js';
|
|
20
|
+
/**
|
|
21
|
+
* Group Swift files by SPM target for implicit module visibility.
|
|
22
|
+
* If SwiftPackageConfig is available, use target -> directory mappings.
|
|
23
|
+
* Otherwise, group all Swift files under a single "default" target
|
|
24
|
+
* (assumes a single-module Xcode project).
|
|
25
|
+
*/
|
|
26
|
+
function groupSwiftFilesByTarget(swiftFiles, swiftPackageConfig) {
|
|
27
|
+
// No SPM config -> single target (common for Xcode projects)
|
|
28
|
+
if (!swiftPackageConfig || swiftPackageConfig.targets.size === 0) {
|
|
29
|
+
return new Map([['__default__', swiftFiles]]);
|
|
30
|
+
}
|
|
31
|
+
// Pre-convert target dirs to normalized prefix format once
|
|
32
|
+
const targets = [...swiftPackageConfig.targets.entries()].map(([name, dir]) => ({ name, prefix: dir.replace(/\\/g, '/') + '/' }));
|
|
33
|
+
const groups = new Map();
|
|
34
|
+
const defaultGroup = [];
|
|
35
|
+
for (const file of swiftFiles) {
|
|
36
|
+
const normalized = file.includes('\\') ? file.replace(/\\/g, '/') : file;
|
|
37
|
+
let assigned = false;
|
|
38
|
+
for (const { name, prefix } of targets) {
|
|
39
|
+
const idx = normalized.indexOf(prefix);
|
|
40
|
+
if (idx === 0 || (idx > 0 && normalized[idx - 1] === '/')) {
|
|
41
|
+
let group = groups.get(name);
|
|
42
|
+
if (!group) {
|
|
43
|
+
group = [];
|
|
44
|
+
groups.set(name, group);
|
|
45
|
+
}
|
|
46
|
+
group.push(file);
|
|
47
|
+
assigned = true;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (!assigned)
|
|
52
|
+
defaultGroup.push(file);
|
|
53
|
+
}
|
|
54
|
+
if (defaultGroup.length > 0)
|
|
55
|
+
groups.set('__default__', defaultGroup);
|
|
56
|
+
return groups;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Wire implicit inter-file imports for Swift.
|
|
60
|
+
* All files in the same SPM target see each other (full module visibility).
|
|
61
|
+
* Two fast paths avoid unnecessary work:
|
|
62
|
+
* 1. No existing imports for src -> emit all (m-1) edges without Set.has checks
|
|
63
|
+
* 2. Existing imports present -> skip already-connected pairs
|
|
64
|
+
*/
|
|
65
|
+
function wireSwiftImplicitImports(swiftFiles, importMap, addImportEdge, projectConfig) {
|
|
66
|
+
const configs = projectConfig;
|
|
67
|
+
const targetGroups = groupSwiftFilesByTarget(swiftFiles, configs?.swiftPackageConfig ?? null);
|
|
68
|
+
for (const group of targetGroups.values()) {
|
|
69
|
+
const m = group.length;
|
|
70
|
+
if (m <= 1)
|
|
71
|
+
continue;
|
|
72
|
+
// All-pairs implicit edges: O(m²) is inherent for full module visibility.
|
|
73
|
+
for (let i = 0; i < m; i++) {
|
|
74
|
+
const src = group[i];
|
|
75
|
+
const existing = importMap.get(src);
|
|
76
|
+
if (!existing || existing.size === 0) {
|
|
77
|
+
// Fast path: no prior imports — emit all peers unconditionally
|
|
78
|
+
for (let j = 0; j < m; j++) {
|
|
79
|
+
if (i !== j)
|
|
80
|
+
addImportEdge(src, group[j]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Dedup path: skip already-connected pairs
|
|
85
|
+
for (let j = 0; j < m; j++) {
|
|
86
|
+
if (i !== j && !existing.has(group[j])) {
|
|
87
|
+
addImportEdge(src, group[j]);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const BUILT_INS = new Set([
|
|
95
|
+
'print', 'debugPrint', 'dump', 'fatalError', 'precondition', 'preconditionFailure',
|
|
96
|
+
'assert', 'assertionFailure', 'NSLog',
|
|
97
|
+
'abs', 'min', 'max', 'zip', 'stride', 'sequence', 'repeatElement',
|
|
98
|
+
'swap', 'withUnsafePointer', 'withUnsafeMutablePointer', 'withUnsafeBytes',
|
|
99
|
+
'autoreleasepool', 'unsafeBitCast', 'unsafeDowncast', 'numericCast',
|
|
100
|
+
'type', 'MemoryLayout',
|
|
101
|
+
'map', 'flatMap', 'compactMap', 'filter', 'reduce', 'forEach', 'contains',
|
|
102
|
+
'first', 'last', 'prefix', 'suffix', 'dropFirst', 'dropLast',
|
|
103
|
+
'sorted', 'reversed', 'enumerated', 'joined', 'split',
|
|
104
|
+
'append', 'insert', 'remove', 'removeAll', 'removeFirst', 'removeLast',
|
|
105
|
+
'isEmpty', 'count', 'index', 'startIndex', 'endIndex',
|
|
106
|
+
'addSubview', 'removeFromSuperview', 'layoutSubviews', 'setNeedsLayout',
|
|
107
|
+
'layoutIfNeeded', 'setNeedsDisplay', 'invalidateIntrinsicContentSize',
|
|
108
|
+
'addTarget', 'removeTarget', 'addGestureRecognizer',
|
|
109
|
+
'addConstraint', 'addConstraints', 'removeConstraint', 'removeConstraints',
|
|
110
|
+
'NSLocalizedString', 'Bundle',
|
|
111
|
+
'reloadData', 'reloadSections', 'reloadRows', 'performBatchUpdates',
|
|
112
|
+
'register', 'dequeueReusableCell', 'dequeueReusableSupplementaryView',
|
|
113
|
+
'beginUpdates', 'endUpdates', 'insertRows', 'deleteRows', 'insertSections', 'deleteSections',
|
|
114
|
+
'present', 'dismiss', 'pushViewController', 'popViewController', 'popToRootViewController',
|
|
115
|
+
'performSegue', 'prepare',
|
|
116
|
+
'DispatchQueue', 'async', 'sync', 'asyncAfter',
|
|
117
|
+
'Task', 'withCheckedContinuation', 'withCheckedThrowingContinuation',
|
|
118
|
+
'sink', 'store', 'assign', 'receive', 'subscribe',
|
|
119
|
+
'addObserver', 'removeObserver', 'post', 'NotificationCenter',
|
|
120
|
+
]);
|
|
121
|
+
export const swiftProvider = defineLanguage({
|
|
122
|
+
id: SupportedLanguages.Swift,
|
|
123
|
+
extensions: ['.swift'],
|
|
124
|
+
treeSitterQueries: SWIFT_QUERIES,
|
|
125
|
+
typeConfig: swiftConfig,
|
|
126
|
+
exportChecker: swiftExportChecker,
|
|
127
|
+
importResolver: resolveSwiftImport,
|
|
128
|
+
importSemantics: 'wildcard',
|
|
129
|
+
heritageDefaultEdge: 'IMPLEMENTS',
|
|
130
|
+
fieldExtractor: createFieldExtractor(swiftFieldConfig),
|
|
131
|
+
implicitImportWirer: wireSwiftImplicitImports,
|
|
132
|
+
builtInNames: BUILT_INS,
|
|
133
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript and JavaScript language providers.
|
|
3
|
+
*
|
|
4
|
+
* Both languages share the same type extraction config (typescriptConfig),
|
|
5
|
+
* export checker (tsExportChecker), and named binding extractor
|
|
6
|
+
* (extractTsNamedBindings). They differ in file extensions, tree-sitter
|
|
7
|
+
* queries (TypeScript grammar has interface/type nodes), and language ID.
|
|
8
|
+
*/
|
|
9
|
+
export declare const typescriptProvider: import("../language-provider.js").LanguageProvider;
|
|
10
|
+
export declare const javascriptProvider: import("../language-provider.js").LanguageProvider;
|