Răsfoiți Sursa

feat: Add Kotlin support in list_code_definition_names

kohii 11 luni în urmă
părinte
comite
1cd90a655b

+ 1 - 0
esbuild.js

@@ -52,6 +52,7 @@ const copyWasmFiles = {
 				"java",
 				"java",
 				"php",
 				"php",
 				"swift",
 				"swift",
+				"kotlin",
 			]
 			]
 
 
 			languages.forEach((lang) => {
 			languages.forEach((lang) => {

+ 6 - 0
src/services/tree-sitter/__tests__/index.test.ts

@@ -169,6 +169,8 @@ describe("Tree-sitter Service", () => {
 				"/test/path/main.rs",
 				"/test/path/main.rs",
 				"/test/path/program.cpp",
 				"/test/path/program.cpp",
 				"/test/path/code.go",
 				"/test/path/code.go",
+				"/test/path/app.kt",
+				"/test/path/script.kts",
 			]
 			]
 
 
 			;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()])
 			;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()])
@@ -197,6 +199,8 @@ describe("Tree-sitter Service", () => {
 				rs: { parser: mockParser, query: mockQuery },
 				rs: { parser: mockParser, query: mockQuery },
 				cpp: { parser: mockParser, query: mockQuery },
 				cpp: { parser: mockParser, query: mockQuery },
 				go: { parser: mockParser, query: mockQuery },
 				go: { parser: mockParser, query: mockQuery },
+				kt: { parser: mockParser, query: mockQuery },
+				kts: { parser: mockParser, query: mockQuery },
 			})
 			})
 			;(fs.readFile as jest.Mock).mockResolvedValue("function test() {}")
 			;(fs.readFile as jest.Mock).mockResolvedValue("function test() {}")
 
 
@@ -207,6 +211,8 @@ describe("Tree-sitter Service", () => {
 			expect(result).toContain("main.rs")
 			expect(result).toContain("main.rs")
 			expect(result).toContain("program.cpp")
 			expect(result).toContain("program.cpp")
 			expect(result).toContain("code.go")
 			expect(result).toContain("code.go")
+			expect(result).toContain("app.kt")
+			expect(result).toContain("script.kts")
 		})
 		})
 
 
 		it("should normalize paths in output", async () => {
 		it("should normalize paths in output", async () => {

+ 11 - 0
src/services/tree-sitter/__tests__/languageParser.test.ts

@@ -92,6 +92,17 @@ describe("Language Parser", () => {
 			expect(parsers.hpp).toBeDefined()
 			expect(parsers.hpp).toBeDefined()
 		})
 		})
 
 
+		it("should handle Kotlin files correctly", async () => {
+			const files = ["test.kt", "test.kts"]
+			const parsers = await loadRequiredLanguageParsers(files)
+
+			expect(ParserMock.Language.load).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-kotlin.wasm"))
+			expect(parsers.kt).toBeDefined()
+			expect(parsers.kts).toBeDefined()
+			expect(parsers.kt.query).toBeDefined()
+			expect(parsers.kts.query).toBeDefined()
+		})
+
 		it("should throw error for unsupported file extensions", async () => {
 		it("should throw error for unsupported file extensions", async () => {
 			const files = ["test.unsupported"]
 			const files = ["test.unsupported"]
 
 

+ 3 - 0
src/services/tree-sitter/index.ts

@@ -73,6 +73,9 @@ function separateFiles(allFiles: string[]): { filesToParse: string[]; remainingF
 		"java",
 		"java",
 		"php",
 		"php",
 		"swift",
 		"swift",
+		// Kotlin
+		"kt",
+		"kts",
 	].map((e) => `.${e}`)
 	].map((e) => `.${e}`)
 	const filesToParse = allFiles.filter((file) => extensions.includes(path.extname(file))).slice(0, 50) // 50 files max
 	const filesToParse = allFiles.filter((file) => extensions.includes(path.extname(file))).slice(0, 50) // 50 files max
 	const remainingFiles = allFiles.filter((file) => !filesToParse.includes(file))
 	const remainingFiles = allFiles.filter((file) => !filesToParse.includes(file))

+ 6 - 0
src/services/tree-sitter/languageParser.ts

@@ -13,6 +13,7 @@ import {
 	javaQuery,
 	javaQuery,
 	phpQuery,
 	phpQuery,
 	swiftQuery,
 	swiftQuery,
+	kotlinQuery,
 } from "./queries"
 } from "./queries"
 
 
 export interface LanguageParser {
 export interface LanguageParser {
@@ -120,6 +121,11 @@ export async function loadRequiredLanguageParsers(filesToParse: string[]): Promi
 				language = await loadLanguage("swift")
 				language = await loadLanguage("swift")
 				query = language.query(swiftQuery)
 				query = language.query(swiftQuery)
 				break
 				break
+			case "kt":
+			case "kts":
+				language = await loadLanguage("kotlin")
+				query = language.query(kotlinQuery)
+				break
 			default:
 			default:
 				throw new Error(`Unsupported language: ${ext}`)
 				throw new Error(`Unsupported language: ${ext}`)
 		}
 		}

+ 1 - 0
src/services/tree-sitter/queries/index.ts

@@ -10,3 +10,4 @@ export { default as cQuery } from "./c"
 export { default as csharpQuery } from "./c-sharp"
 export { default as csharpQuery } from "./c-sharp"
 export { default as goQuery } from "./go"
 export { default as goQuery } from "./go"
 export { default as swiftQuery } from "./swift"
 export { default as swiftQuery } from "./swift"
+export { default as kotlinQuery } from "./kotlin"

+ 28 - 0
src/services/tree-sitter/queries/kotlin.ts

@@ -0,0 +1,28 @@
+/*
+- class declarations (including interfaces)
+- function declarations
+- object declarations
+- property declarations
+- type alias declarations
+*/
+export default `
+(class_declaration
+  (type_identifier) @name.definition.class
+) @definition.class
+
+(function_declaration
+  (simple_identifier) @name.definition.function
+) @definition.function
+
+(object_declaration
+  (type_identifier) @name.definition.object
+) @definition.object
+
+(property_declaration
+  (simple_identifier) @name.definition.property
+) @definition.property
+
+(type_alias
+  (type_identifier) @name.definition.type
+) @definition.type
+`