diff --git a/src/extraction/grammars.ts b/src/extraction/grammars.ts index 1b15996c0..13cc7dc89 100644 --- a/src/extraction/grammars.ts +++ b/src/extraction/grammars.ts @@ -34,6 +34,7 @@ const WASM_GRAMMAR_FILES: Record = { kotlin: 'tree-sitter-kotlin.wasm', dart: 'tree-sitter-dart.wasm', pascal: 'tree-sitter-pascal.wasm', + mql5: 'tree-sitter-mql5.wasm', scala: 'tree-sitter-scala.wasm', lua: 'tree-sitter-lua.wasm', r: 'tree-sitter-r.wasm', @@ -102,6 +103,9 @@ export const EXTENSION_MAP: Record = { '.lpr': 'pascal', '.dfm': 'pascal', '.fmx': 'pascal', + '.mq5': 'mql5', + '.mqh': 'mql5', + '.mql5': 'mql5', '.scala': 'scala', '.sc': 'scala', '.lua': 'lua', @@ -221,7 +225,7 @@ export async function loadGrammarsForLanguages(languages: Language[]): Promise> = { typescript: typescriptExtractor, @@ -51,4 +52,5 @@ export const EXTRACTORS: Partial> = { r: rExtractor, luau: luauExtractor, objc: objcExtractor, + mql5: mql5Extractor, }; diff --git a/src/extraction/languages/mql5.ts b/src/extraction/languages/mql5.ts new file mode 100644 index 000000000..30b62fa4e --- /dev/null +++ b/src/extraction/languages/mql5.ts @@ -0,0 +1,61 @@ +import type { Node as SyntaxNode } from 'web-tree-sitter'; +import { getNodeText, getChildByField } from '../tree-sitter-helpers'; +import type { LanguageExtractor } from '../tree-sitter-types'; + +export const mql5Extractor: LanguageExtractor = { + functionTypes: ['declProc'], + classTypes: ['declClass'], + methodTypes: ['declProc'], + interfaceTypes: ['declIntf'], + structTypes: [], + enumTypes: ['declEnum'], + typeAliasTypes: ['declType'], + importTypes: ['declUses'], + callTypes: ['exprCall'], + variableTypes: ['declField', 'declConst'], + nameField: 'name', + bodyField: 'body', + paramsField: 'args', + returnField: 'type', + getSignature: (node, source) => { + const args = getChildByField(node, 'args'); + const returnType = node.namedChildren.find( + (c: SyntaxNode) => c.type === 'typeref' + ); + if (!args && !returnType) return undefined; + let sig = ''; + if (args) sig = getNodeText(args, source); + if (returnType) { + sig += ': ' + getNodeText(returnType, source); + } + return sig || undefined; + }, + getVisibility: (node) => { + let current = node.parent; + while (current) { + if (current.type === 'declSection') { + for (let i = 0; i < current.childCount; i++) { + const child = current.child(i); + if (child?.type === 'kPublic' || child?.type === 'kPublished') + return 'public'; + if (child?.type === 'kPrivate') return 'private'; + if (child?.type === 'kProtected') return 'protected'; + } + } + current = current.parent; + } + return undefined; + }, + isExported: (_node, _source) => { + return false; + }, + isStatic: (node) => { + for (let i = 0; i < node.childCount; i++) { + if (node.child(i)?.type === 'kClass') return true; + } + return false; + }, + isConst: (node) => { + return node.type === 'declConst'; + }, +}; diff --git a/src/extraction/wasm/tree-sitter-mql5.wasm b/src/extraction/wasm/tree-sitter-mql5.wasm new file mode 100644 index 000000000..14442f53a Binary files /dev/null and b/src/extraction/wasm/tree-sitter-mql5.wasm differ diff --git a/src/types.ts b/src/types.ts index 656bb1090..ddb8c7115 100644 --- a/src/types.ts +++ b/src/types.ts @@ -86,6 +86,7 @@ export const LANGUAGES = [ 'astro', 'liquid', 'pascal', + 'mql5', 'scala', 'lua', 'luau',