Path: blob/main/extensions/copilot/src/platform/parser/node/treeSitterQueries.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import type { SyntaxNode } from 'web-tree-sitter';6import { WASMLanguage } from './treeSitterLanguages';78/**9* IF YOU WANT LINTING FOR YOUR TREE-SITTER QUERIES:10*11* Annotating a query template string with `treeSitterQuery.<WASMLanguage>` (see example below)12* will allow the vscode-tree-sitter-query extension to provide linting (diagnostics) for this query.13*14* @example15* ```ts16* treeSitterQuery.typescript`(function_declaration) @function`17* ```18*19* @remark don't forget to install the `vscode-tree-sitter-query` extension (and activate it, e.g., by opening a .scm file)20*/21const treeSitterQuery =22(() => {23/** default template string behavior */24function defaultBehavior(query: TemplateStringsArray, ...values: any[]) {25return query.length === 1 // no interpolations26? query[0]27: query.reduce((result, string, i) => `${result}${string}${values[i] || ''}`, '');28}29return {30typescript: defaultBehavior,31javascript: defaultBehavior,32python: defaultBehavior,33go: defaultBehavior,34ruby: defaultBehavior,35csharp: defaultBehavior,36cpp: defaultBehavior,37java: defaultBehavior,38rust: defaultBehavior,39};40})();414243function forLanguages<Lang extends WASMLanguage, T>(languages: readonly Lang[], query: T) {44return Object.fromEntries(languages.map(language => [language, query])) as { [k in Lang]: T };45}4647type LanguageQueryMap = { [wasmLanguage in WASMLanguage]: string[]; };4849export const allKnownQueries: LanguageQueryMap = {50[WASMLanguage.JavaScript]: [],51[WASMLanguage.TypeScript]: [],52[WASMLanguage.TypeScriptTsx]: [],53[WASMLanguage.Python]: [],54[WASMLanguage.Csharp]: [],55[WASMLanguage.Go]: [],56[WASMLanguage.Java]: [],57[WASMLanguage.Ruby]: [],58[WASMLanguage.Cpp]: [],59[WASMLanguage.Rust]: [],60};61/**62* register queries63*/64function q<T extends Partial<LanguageQueryMap>>(queryMap: T): T {65for (const key in queryMap) {66const queries = queryMap[key as WASMLanguage]!;67allKnownQueries[key as WASMLanguage].push(...queries);68}69return queryMap;70}7172export const callExpressionQuery: LanguageQueryMap = q({73...forLanguages([WASMLanguage.JavaScript, WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [74`[75(call_expression76function: (identifier) @identifier)77(call_expression78function: (member_expression79(property_identifier) @identifier))80] @call_expression`81]),82[WASMLanguage.Python]: [83`[84(call85function: (identifier) @identifier)86(call87function: (attribute88attribute: (identifier) @identifier))89] @call_expression`90],91[WASMLanguage.Csharp]: [92`[93(invocation_expression94function: (identifier) @identifier)95(invocation_expression96function: (member_access_expression97name: (identifier) @identifier))98] @call_expression`99],100[WASMLanguage.Go]: [101`[102(call_expression103((selector_expression104(field_identifier) @identifier)))105(call_expression106(identifier) @identifier)107] @call_expression`108],109[WASMLanguage.Java]: [110`[111(method_invocation112name: (identifier) @identifier)113] @call_expression`114],115[WASMLanguage.Ruby]: [116/**117* TODO@joyceerhl figure out how to support matching118* direct method calls i.e.119* ```120* def say_hello121* puts "Hello, world!"122* end123* say_hello124* ```125* which is matchable only by the `identifier` syntax node126* and could have performance implications127*/128`[129(call (identifier) @identifier130(#not-match? @identifier "new|send|public_send|method"))131(call132receiver: (identifier)133method: (identifier) @method134(#match? @method "^(send|public_send|method)")135arguments: (argument_list136(simple_symbol) @symbol))137] @call_expression`138],139[WASMLanguage.Cpp]: [140`[141(function_declarator142(identifier) @identifier)143(function_declarator144(field_identifier) @identifier)145(call_expression (identifier) @identifier)146(call_expression147(field_expression148field: (field_identifier) @identifier))149(call_expression150(call_expression151(primitive_type)152(argument_list153(pointer_expression154(identifier) @identifier))))155] @call_expression`156],157[WASMLanguage.Rust]: [158`[159(call_expression (identifier) @identifier)160(call_expression (field_expression (identifier) (field_identifier) @identifier))161(call_expression (scoped_identifier (identifier) (identifier) @identifier (#not-match? @identifier "new")))162] @call_expression`163]164});165166export const classDeclarationQuery: LanguageQueryMap = q({167...forLanguages([WASMLanguage.JavaScript, WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [168`(class_declaration) @class_declaration`169]),170[WASMLanguage.Java]: [171`(class_declaration) @class_declaration`172],173[WASMLanguage.Csharp]: [174`(class_declaration) @class_declaration`175],176[WASMLanguage.Python]: [177`(class_definition) @class_declaration`178],179[WASMLanguage.Cpp]: [180`(class_specifier) @class_declaration`181],182[WASMLanguage.Ruby]: [183`(class) @class_declaration`184],185[WASMLanguage.Go]: [186`(type_declaration187(type_spec188(type_identifier) @type_identifier)) @class_declaration`189],190[WASMLanguage.Rust]: [191`(impl_item (type_identifier) @type_identifier) @class_declaration`192]193});194195export const typeDeclarationQuery: { [language: string]: string[] } = q({196// No types in JavaScript197[WASMLanguage.TypeScript]: [198`[199(interface_declaration)200(type_alias_declaration)201] @type_declaration`202],203[WASMLanguage.Csharp]: [204`(interface_declaration205(identifier) @type_identifier) @type_declaration`206],207[WASMLanguage.Cpp]: [208`[209(struct_specifier210(type_identifier) @type_identifier)211(union_specifier212(type_identifier) @type_identifier)213(enum_specifier214(type_identifier) @type_identifier)215] @type_declaration`216],217[WASMLanguage.Java]: [218`(interface_declaration219(identifier) @type_identifier) @type_declaration`220],221[WASMLanguage.Go]: [222`(type_declaration223(type_spec224(type_identifier) @type_identifier)) @type_declaration`225],226[WASMLanguage.Ruby]: [227`((constant) @type_identifier) @type_declaration`228],229[WASMLanguage.Python]: [230`(class_definition231(identifier) @type_identifier) @type_declaration`232],233});234235export const typeReferenceQuery: { [language: string]: string[] } = q({236// No types in JavaScript237[WASMLanguage.TypeScript]: [238`(type_identifier) @type_identifier`239],240[WASMLanguage.Go]: [241`(type_identifier) @type_identifier`242],243[WASMLanguage.Ruby]: [244`(constant) @type_identifier`245],246[WASMLanguage.Csharp]: [247`[248(base_list249(identifier) @type_identifier)250(variable_declaration251(identifier) @type_identifier)252]`253],254[WASMLanguage.Cpp]: [255`(type_identifier) @type_identifier`256],257[WASMLanguage.Java]: [258`(type_identifier) @type_identifier`259],260[WASMLanguage.Python]: [261`[262(type (identifier) @type_identifier)263(argument_list264(identifier) @type_identifier)265]`266]267});268269export const classReferenceQuery: LanguageQueryMap = q({270...forLanguages([WASMLanguage.JavaScript, WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [271`(new_expression272constructor: (identifier) @new_expression)`273]),274[WASMLanguage.Python]: [275`(call276function: (identifier) @new_expression)`277],278[WASMLanguage.Csharp]: [279`(object_creation_expression280(identifier) @new_expression)`281],282[WASMLanguage.Java]: [283`(object_creation_expression284(type_identifier) @new_expression)`285],286[WASMLanguage.Cpp]: [287`[288(declaration289(type_identifier) @new_expression)290(class_specifier291(type_identifier) @new_expression)292]`293],294[WASMLanguage.Go]: [295`(composite_literal (type_identifier) @new_expression)`296],297[WASMLanguage.Ruby]: [298`((call299receiver: ((constant) @new_expression)300method: (identifier) @method)301(#eq? @method "new"))`302],303[WASMLanguage.Rust]: [304`(call_expression305(scoped_identifier306(identifier) @new_expression307(identifier) @identifier308(#eq? @identifier "new")))`309],310});311312export const functionQuery: LanguageQueryMap = q({313python: [314// `(function_definition)` is defined in python grammar:315// https://github.com/tree-sitter/tree-sitter-python/blob/c4282ba411d990d313c5f8e7850bcaaf46fbf7da/grammar.js#L325-L338316// docstring is represented in grammar as an optional `(initial expression_statement (string))`317// at the start of the body block318`[319(function_definition320name: (identifier) @identifier321body: (block322(expression_statement (string))? @docstring) @body)323(assignment324left: (identifier) @identifier325right: (lambda) @body)326] @function`,327328// handle malformed defs - no trailing semicolon or no body329`(ERROR ("def" (identifier) (parameters))) @function`,330],331...forLanguages([WASMLanguage.JavaScript, WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [332// function patterns defined in javascript grammar which is shared by ts333// https://github.com/tree-sitter/tree-sitter-javascript/blob/3d9fe9786ee74fa5067577f138e1a7129f80fb41/grammar.js#L595-L629334// include `arrow_function` as well335`[336(function_expression337name: (identifier)? @identifier338body: (statement_block) @body)339(function_declaration340name: (identifier)? @identifier341body: (statement_block) @body)342(generator_function343name: (identifier)? @identifier344body: (statement_block) @body)345(generator_function_declaration346name: (identifier)? @identifier347body: (statement_block) @body)348(method_definition349name: (property_identifier)? @identifier350body: (statement_block) @body)351(arrow_function352body: (statement_block) @body)353] @function`,354]),355go: [356// function patterns defined in go grammar:357// https://github.com/tree-sitter/tree-sitter-go/blob/b0c78230146705e867034e49a5ece20245b33490/grammar.js#L194-L209358`[359(function_declaration360name: (identifier) @identifier361body: (block) @body)362(method_declaration363name: (field_identifier) @identifier364body: (block) @body)365] @function`,366],367ruby: [368// function patterns defined in ruby grammar:369// https://github.com/tree-sitter/tree-sitter-ruby/blob/master/grammar.js370// NOTE: Use a @params label for optional parameters to avoid capturing as371// part of @body if parameters are present.372`[373(method374name: (_) @identifier375parameters: (method_parameters)? @params376[(_)+ "end"] @body)377(singleton_method378name: (_) @identifier379parameters: (method_parameters)? @params380[(_)+ "end"] @body)381] @function`,382],383csharp: [384// function patterns defined in csharp grammar:385// https://github.com/tree-sitter/tree-sitter-c-sharp/blob/master/grammar.js386`[387(constructor_declaration388(identifier) @identifier389(block) @body)390(destructor_declaration391(identifier) @identifier392(block) @body)393(operator_declaration394(block) @body)395(method_declaration396(identifier) @identifier397(block) @body)398(local_function_statement399(identifier) @identifier400(block) @body)401] @function`,402],403cpp: [404// function patterns defined in cpp grammar:405// https://github.com/tree-sitter/tree-sitter-cpp/blob/master/grammar.js406`[407(function_definition408(_409(identifier) @identifier)410(compound_statement) @body)411(function_definition412(function_declarator413(qualified_identifier414(identifier) @identifier))415(compound_statement) @body)416] @function`,417],418java: [419`[420(constructor_declaration421name: (identifier) @identifier422body: (constructor_body) @body)423(method_declaration424name: (_) @identifier425body: (block) @body)426(lambda_expression427body: (block) @body)428] @function`429],430rust: [431`[432(function_item (identifier) @identifier)433(let_declaration (identifier) @identifier)434] @function`435]436});437438export const docCommentQueries: LanguageQueryMap = q({439[WASMLanguage.JavaScript]: [440treeSitterQuery.javascript`((comment) @comment441(#match? @comment "^\\\\/\\\\*\\\\*")) @docComment`442],443...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [444treeSitterQuery.typescript`((comment) @comment445(#match? @comment "^\\\\/\\\\*\\\\*")) @docComment`446]),447[WASMLanguage.Java]: [448treeSitterQuery.java`((block_comment) @block_comment449(#match? @block_comment "^\\\\/\\\\*\\\\*")) @docComment`450],451[WASMLanguage.Cpp]: [452treeSitterQuery.cpp`((comment) @comment453(#match? @comment "^\\\\/\\\\*\\\\*")) @docComment`454],455[WASMLanguage.Csharp]: [456treeSitterQuery.csharp`(457((comment) @c458(#match? @c "^\\\\/\\\\/\\\\/"))+459) @docComment`460],461[WASMLanguage.Rust]: [462treeSitterQuery.rust`((line_comment) @comment463(#match? @comment "^\/\/\/|^\/\/!"))+ @docComment`464],465// note: golang & ruby have same prefix for a doc comment and line comment466[WASMLanguage.Go]: [467treeSitterQuery.go`((comment)+) @docComment`468],469[WASMLanguage.Ruby]: [470treeSitterQuery.ruby`((comment)+) @docComment`471],472473// NOT yet supported:474475// we don't support python with this yet because of its placement of a docstring (under signature)476[WASMLanguage.Python]: [477`(expression_statement478(string) @docComment)`479],480});481482export const testableNodeQueries: LanguageQueryMap = q({483[WASMLanguage.JavaScript]: [484treeSitterQuery.javascript`[485(function_declaration486(identifier) @function.identifier487) @function488489(generator_function_declaration490name: (identifier) @generator_function.identifier491) @generator_function492493(class_declaration494name: (identifier) @class.identifier ;; note: (type_identifier) in typescript495body: (class_body496(method_definition497name: (property_identifier) @method.identifier498) @method499)500) @class501]`502],503...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx],504[treeSitterQuery.typescript`[505(function_declaration506(identifier) @function.identifier507) @function508509(generator_function_declaration510name: (identifier) @generator_function.identifier511) @generator_function512513(class_declaration514name: (type_identifier) @class.identifier515body: (class_body516(method_definition517(accessibility_modifier)? @method.accessibility_modifier518name: (property_identifier) @method.identifier519(#not-eq? @method.accessibility_modifier "private")520) @method521)522) @class523]`]524),525[WASMLanguage.Python]: [526treeSitterQuery.python`[527(function_definition528name: (identifier) @function.identifier529) @function530]`531],532[WASMLanguage.Go]: [533treeSitterQuery.go`[534(function_declaration535name: (identifier) @function.identifier536) @function537538(method_declaration539name: (field_identifier) @method.identifier540) @method541]`542],543[WASMLanguage.Ruby]: [544treeSitterQuery.ruby`[545(method546name: (identifier) @method.identifier547) @method548549(singleton_method550name: (_) @singleton_method.identifier551) @singleton_method552]`553],554[WASMLanguage.Csharp]: [555treeSitterQuery.csharp`[556(constructor_declaration557(identifier) @constructor.identifier558) @constructor559560(destructor_declaration561(identifier) @destructor.identifier562) @destructor563564(method_declaration565(identifier) @method.identifier566) @method567568(local_function_statement569(identifier) @local_function.identifier570) @local_function571]`572],573[WASMLanguage.Cpp]: [ // FIXME@ulugbekna: #7769 enrich with class/methods574treeSitterQuery.cpp`[575(function_definition576(_577(identifier) @identifier)578) @function579]`580],581[WASMLanguage.Java]: [582treeSitterQuery.java`(class_declaration583name: (_) @class.identifier584body: (_585[586(constructor_declaration587(modifiers)? @constructor.modifiers588(#not-eq? @constructor.modifiers "private")589name: (identifier) @constructor.identifier590) @constructor591592(method_declaration593(modifiers)? @method.modifiers594(#not-eq? @method.modifiers "private")595name: (identifier) @method.identifier596) @method597]598)599) @class`600],601[WASMLanguage.Rust]: [602treeSitterQuery.rust`[603(function_item604(identifier) @function.identifier605) @function606]`607]608});609610export const symbolQueries: LanguageQueryMap = q({611[WASMLanguage.JavaScript]: [612treeSitterQuery.javascript`[613(identifier) @symbol614(property_identifier) @symbol615(private_property_identifier) @symbol616]`617],618...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [619treeSitterQuery.typescript`[620(identifier) @symbol621(type_identifier) @symbol622(property_identifier) @symbol623(private_property_identifier) @symbol624]`625]),626[WASMLanguage.Cpp]: [627treeSitterQuery.cpp`[628(identifier) @symbol629(type_identifier) @symbol630]`631],632[WASMLanguage.Csharp]: [633treeSitterQuery.csharp`[634(identifier) @symbol635]`636],637[WASMLanguage.Go]: [638treeSitterQuery.go`[639(identifier) @symbol640]`641],642[WASMLanguage.Java]: [643treeSitterQuery.java`[644(identifier) @symbol645]`646],647[WASMLanguage.Python]: [648treeSitterQuery.python`[649(identifier) @symbol650]`651],652[WASMLanguage.Ruby]: [653treeSitterQuery.ruby`[654(identifier) @symbol655]`656],657[WASMLanguage.Rust]: [658treeSitterQuery.rust`[659(identifier) @symbol660]`661],662});663664export const syntacticallyValidAtoms: LanguageQueryMap = q({665[WASMLanguage.TypeScript]: [666treeSitterQuery.typescript`667[668(comment) @comment ;; split into multiple comment kinds?669670(declaration) @declaration671672;; class declaration related673(public_field_definition) @public_field_definition674(method_definition) @method_definition675(class_declaration (_ (method_signature) @method_signature))676(abstract_method_signature) @abstract_method_signature677678;; enum declaration related679(enum_assignment) @enum_assignment680681;; interface declaration related682(interface_declaration (_ (method_signature) @method_signature))683(interface_declaration (_ (property_signature) @property_signature))684685;; statements686687(import_statement) @import_statement688(export_statement) @export_statement689690(expression_statement) @expression_statement691692(for_in_statement) @for_in_statement693;; exclude any children found in the for loop condition694(for_statement condition: (_) @for_statement.exclude_captures ) @for_statement695(break_statement) @break_statement696(continue_statement) @continue_statement697(do_statement) @do_statement698(if_statement) @if_statement699(if_statement700consequence: [701(expression_statement)702(if_statement)703] @if_statement.exclude_captures)704(else_clause705[706(expression_statement)707(if_statement) ; for if-else chains708] @else_clause.exclude_captures)709(switch_statement) @switch_statement710(switch_case) @switch_case711(try_statement) @try_statement712(throw_statement) @throw_statement713(debugger_statement) @debugger_statement714(return_statement) @return_statement715]716`717],718[WASMLanguage.TypeScriptTsx]: [719treeSitterQuery.typescript`720[721(comment) @comment ;; split into multiple comment kinds?722723(declaration) @declaration724725;; class declaration related726(public_field_definition) @public_field_definition727(method_definition) @method_definition728(class_declaration (_ (method_signature) @method_signature))729(abstract_method_signature) @abstract_method_signature730731;; enum declaration related732(enum_assignment) @enum_assignment733734;; interface declaration related735(interface_declaration (_ (method_signature) @method_signature))736(interface_declaration (_ (property_signature) @property_signature))737738;; statements739740(import_statement) @import_statement741(export_statement) @export_statement742743(expression_statement) @expression_statement744745(for_in_statement) @for_in_statement746;; exclude any children found in the for loop condition747(for_statement condition: (_) @for_statement.exclude_captures ) @for_statement748(break_statement) @break_statement749(continue_statement) @continue_statement750(do_statement) @do_statement751(if_statement) @if_statement752(if_statement753consequence: [754(expression_statement)755(if_statement)756] @if_statement.exclude_captures)757(else_clause758[759(expression_statement)760(if_statement) ; for if-else chains761] @else_clause.exclude_captures)762(switch_statement) @switch_statement763(switch_case) @switch_case764(try_statement) @try_statement765(throw_statement) @throw_statement766(debugger_statement) @debugger_statement767(return_statement) @return_statement768769;; jsx770(jsx_element) @jsx_element771(jsx_element (_ (jsx_expression) @jsx_expression))772]773`774],775[WASMLanguage.Python]: [776treeSitterQuery.python`777[778(comment) @comment779780;; simple statements781(assert_statement) @assert_statement782(break_statement) @break_statement783(continue_statement) @continue_statement784(delete_statement) @delete_statement785(exec_statement) @exec_statement786(expression_statement) @expression_statement787(future_import_statement) @future_import_statement788(global_statement) @global_statement789(import_from_statement) @import_from_statement790(import_statement) @import_statement791(nonlocal_statement) @nonlocal_statement792(pass_statement) @pass_statement793(print_statement) @print_statement794(raise_statement) @raise_statement795(return_statement) @return_statement796(type_alias_statement) @type_alias_statement797798799;; compound statements800801(class_definition) @class_definition802(decorated_definition) @decorated_definition803(for_statement) @for_statement804(function_definition) @function_definition805(if_statement) @if_statement806(try_statement) @try_statement807(while_statement) @while_statement808(with_statement) @with_statement809810811;; expressions812813(expression_list) @expression_list814(expression_statement) @expression_statement815]816`817],818[WASMLanguage.JavaScript]: [819treeSitterQuery.javascript`820[821(comment) @comment ;; split into multiple comment kinds?822823(declaration) @declaration824825;; class declaration related826827(field_definition) @field_definition828(method_definition) @method_definition829830;; statements831832(import_statement) @import_statement833(export_statement) @export_statement834835(expression_statement) @expression_statement836837(for_in_statement) @for_in_statement838;; exclude any children found in the for loop condition839(for_statement condition: (_) @for_statement.exclude_captures ) @for_statement840(break_statement) @break_statement841(continue_statement) @continue_statement842(do_statement) @do_statement843(if_statement) @if_statement844(switch_statement) @switch_statement845(switch_case) @switch_case846(try_statement) @try_statement847(throw_statement) @throw_statement848(debugger_statement) @debugger_statement849(return_statement) @return_statement850]`851],852[WASMLanguage.Go]: [853treeSitterQuery.go`854[855(_statement) @statement856(function_declaration) @function_declaration857(import_declaration) @import_declaration858(method_declaration) @method_declaration859(package_clause) @package_clause860861(if_statement862initializer: (_) @for_statement.exclude_captures) @for_statement863864(expression_case) @expression_case ;; e.g., case 0:865]866`867],868[WASMLanguage.Ruby]: [869treeSitterQuery.ruby`870[871(comment) @comment872873(assignment) @assignment874875(if) @if876877(call) @call878879(case) @case880881(when) @when882883(while) @while884885(for) @for886887(method) @method888889(class) @class890891(module) @module892893(begin) @begin894]895`896],897[WASMLanguage.Csharp]: [898treeSitterQuery.csharp`899[900(comment) @comment901902(class_declaration) @class_declaration903(constructor_declaration) @constructor_declaration904(method_declaration) @method_declaration905(delegate_declaration) @delegate_declaration906(enum_declaration) @enum_declaration907(extern_alias_directive) @extern_alias_directive908(file_scoped_namespace_declaration) @file_scoped_namespace_declaration909(global_attribute) @global_attribute910(global_statement) @global_statement911(interface_declaration) @interface_declaration912(namespace_declaration) @namespace_declaration913(record_declaration) @record_declaration914(struct_declaration) @struct_declaration915(using_directive) @using_directive916917(local_declaration_statement) @local_declaration_statement918(expression_statement) @expression_statement919(for_statement) @for_statement920(foreach_statement) @foreach_statement921(continue_statement) @continue_statement922(break_statement) @break_statement923(throw_statement) @throw_statement924(return_statement) @return_statement925(try_statement) @try_statement926]927`928],929[WASMLanguage.Cpp]: [930treeSitterQuery.cpp`931[932(preproc_ifdef) @preproc_ifdef933(preproc_call) @preproc_call934(preproc_def) @preproc_def935(type_definition) @type_definition936(type_definition937type:(_) @type_definition.exclude_captures) @type_definition938939(declaration) @declaration940941(expression_statement) @expression_statement942943(comment) @comment944945(preproc_include) @preproc_include946947(namespace_definition) @namespace_definition948949(enum_specifier) @enum_specifier950951(struct_specifier) @struct_specifier952953(template_declaration) @template_declaration954955(function_definition) @function_definition956957(return_statement) @return_statement958959(class_specifier) @class_specifier960961(try_statement) @try_statement962963(throw_statement) @throw_statement964965(for_statement) @for_statement966(for_statement967initializer:(_) @for_statement.exclude_captures) @for_statement968969(for_range_loop) @for_range_loop970971(while_statement) @while_statement972(do_statement) @do_statement973(if_statement) @if_statement974975(labeled_statement) @labeled_statement976(goto_statement) @goto_statement977978(break_statement) @break_statement979]980`981],982[WASMLanguage.Java]: [983treeSitterQuery.java`984[985(statement) @statement ;; @ulugbekna: this includes (declaration); but somehow it can't capture inner classes986987(line_comment) @line_comment988(block_comment) @block_comment989990(for_statement991init: (_) @for_statement.exclude_captures)992993(block) @block.exclude_captures994995(class_declaration) @class_declaration996997(constructor_declaration) @constructor_declaration998999(field_declaration) @field_declaration10001001(method_declaration) @method_declaration1002]1003`1004],1005[WASMLanguage.Rust]: [1006// treeSitterQuery.rust`1007// [1008// (line_comment) @line_comment10091010// (let_declaration) @let_declaration1011// (extern_crate_declaration) @extern_crate_declaration1012// (use_declaration) @use_declaration10131014// (attribute_item) @attribute_item1015// (const_item) @const_item1016// (enum_item) @enum_item1017// (foreign_mod_item) @foreign_mod_item1018// (function_item) @function_item1019// (function_signature_item) @function_signature_item1020// (impl_item) @impl_item1021// (inner_attribute_item) @inner_attribute_item1022// (mod_item) @mod_item1023// (static_item) @static_item1024// (struct_item) @struct_item1025// (trait_item) @trait_item1026// (type_item) @type_item1027// (union_item) @union_item10281029// (macro_definition) @macro_definition10301031// (empty_statement) @empty_statement10321033// (compound_assignment_expr) @compound_assignment_expr1034// (generic_function) @generic_function1035// (metavariable) @metavariable10361037// (match_arm) @match_arm10381039// (async_block) @async_block1040// (const_block) @const_block1041// (unsafe_block) @unsafe_block10421043// (block) @block.exclude_captures1044// ]1045// `1046]1047});10481049export const coarseScopeTypes: { [wasmLanguage in WASMLanguage]: string[] } = {1050...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [1051'program',1052'interface_declaration',1053'class_declaration',1054'function_declaration',1055'function_expression',1056'type_alias_declaration',1057'method_definition',1058]),1059[WASMLanguage.JavaScript]: [1060'program',1061'class_declaration',1062'function_declaration',1063'function_expression',1064'method_definition',1065],1066[WASMLanguage.Java]: [1067'program',1068'class_declaration',1069'interface_declaration',1070'method_declaration',1071],1072[WASMLanguage.Cpp]: [1073'translation_unit',1074'class_specifier',1075'function_definition',1076],1077[WASMLanguage.Csharp]: [1078'compilation_unit',1079'class_declaration',1080'interface_declaration',1081'method_declaration',1082],1083[WASMLanguage.Python]: [1084'module',1085'class_definition',1086'function_definition',1087],1088[WASMLanguage.Go]: [1089'source_file',1090'type_declaration',1091'function_declaration',1092'method_declaration',1093],1094[WASMLanguage.Ruby]: [1095'program',1096'method',1097'class',1098'method',1099],1100[WASMLanguage.Rust]: [1101'source_file',1102'function_item',1103'impl_item',1104'let_declaration',1105],1106};11071108export const coarseScopesQuery: LanguageQueryMap = q({1109[WASMLanguage.TypeScript]: [1110coarseScopesQueryForLanguage(WASMLanguage.TypeScript)1111],1112[WASMLanguage.TypeScriptTsx]: [1113coarseScopesQueryForLanguage(WASMLanguage.TypeScriptTsx)1114],1115[WASMLanguage.JavaScript]: [1116coarseScopesQueryForLanguage(WASMLanguage.JavaScript)1117],1118[WASMLanguage.Java]: [1119coarseScopesQueryForLanguage(WASMLanguage.Java)1120],1121[WASMLanguage.Cpp]: [1122coarseScopesQueryForLanguage(WASMLanguage.Cpp)1123],1124[WASMLanguage.Csharp]: [1125coarseScopesQueryForLanguage(WASMLanguage.Csharp)1126],1127[WASMLanguage.Python]: [1128coarseScopesQueryForLanguage(WASMLanguage.Python)1129],1130[WASMLanguage.Go]: [1131coarseScopesQueryForLanguage(WASMLanguage.Go)1132],1133[WASMLanguage.Ruby]: [1134coarseScopesQueryForLanguage(WASMLanguage.Ruby)1135],1136[WASMLanguage.Rust]: [1137coarseScopesQueryForLanguage(WASMLanguage.Rust)1138],1139});11401141export const fineScopeTypes: { [wasmLanguage in WASMLanguage]: string[] } = {1142...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx, WASMLanguage.JavaScript], [1143'for_in_statement',1144'for_statement',1145'if_statement',1146'while_statement',1147'do_statement',1148'try_statement',1149'switch_statement'1150]),1151[WASMLanguage.Java]: [1152'for_statement',1153'enhanced_for_statement',1154'if_statement',1155'while_statement',1156'do_statement',1157'try_statement',1158'switch_expression'1159],1160[WASMLanguage.Cpp]: [1161'for_statement',1162'for_range_loop',1163'if_statement',1164'while_statement',1165'do_statement',1166'try_statement',1167'switch_statement'1168],1169[WASMLanguage.Csharp]: [1170'for_statement',1171'for_each_statement',1172'if_statement',1173'while_statement',1174'do_statement',1175'try_statement',1176'switch_expression'1177],1178[WASMLanguage.Python]: [1179'for_statement',1180'if_statement',1181'while_statement',1182'try_statement'1183],1184[WASMLanguage.Go]: [1185'for_statement',1186'if_statement',1187'type_switch_statement'1188],1189[WASMLanguage.Ruby]: [1190'while',1191'for',1192'if',1193'case'1194],1195[WASMLanguage.Rust]: [1196'for_statement',1197'if_statement',1198'while_statement',1199'loop_statement',1200'match_expression',1201],1202};12031204export const statementTypes: { [wasmLanguage in WASMLanguage]: string[] } = {1205...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [1206'lexical_declaration',1207'expression_statement',1208'public_field_definition',1209]),1210[WASMLanguage.JavaScript]: [1211'call_expression',1212'expression_statement',1213'variable_declaration',1214'public_field_definition'1215],1216[WASMLanguage.Java]: [1217'expression_statement',1218'local_variable_declaration',1219'field_declaration'1220],1221[WASMLanguage.Cpp]: [1222'field_declaration',1223'expression_statement',1224'declaration'1225],1226[WASMLanguage.Csharp]: [1227'field_declaration',1228'expression_statement'1229],1230[WASMLanguage.Python]: [1231'expression_statement'1232],1233[WASMLanguage.Go]: [1234'short_var_declaration',1235'call_expression'1236],1237[WASMLanguage.Ruby]: [1238'call',1239'assignment'1240],1241[WASMLanguage.Rust]: [1242'expression_statement',1243'let_declaration',1244'use_declaration',1245'assignment_expression',1246'macro_definition',1247'extern_crate_declaration'1248],1249};12501251const semanticChunkTargetTypes: { [wasmLanguage in WASMLanguage]: string[] } = {1252...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [1253'class_declaration',1254'function_declaration',1255'generator_function_declaration',1256'interface_declaration',1257'internal_module',1258'method_definition',1259'abstract_class_declaration',1260'abstract_method_signature',1261'enum_declaration'1262]),1263[WASMLanguage.JavaScript]: [1264'class_declaration',1265'function_declaration',1266'generator_function_declaration',1267'method_definition',1268],1269[WASMLanguage.Java]: [1270'class_declaration',1271'constructor_declaration',1272'enum_declaration',1273'interface_declaration',1274'method_declaration',1275'module_declaration',1276],1277[WASMLanguage.Cpp]: [1278'class_specifier',1279'function_definition',1280'namespace_definition',1281'struct_specifier'1282],1283[WASMLanguage.Csharp]: [1284'class_declaration',1285'constructor_declaration',1286'destructor_declaration',1287'enum_declaration',1288'interface_declaration',1289'method_declaration',1290'namespace_declaration',1291'struct_declaration',1292],1293[WASMLanguage.Python]: [1294'function_definition',1295'class_definition',1296],1297[WASMLanguage.Go]: [1298'function_declaration',1299'method_declaration'1300],1301[WASMLanguage.Ruby]: [1302'class',1303'method',1304'module'1305],1306[WASMLanguage.Rust]: [1307'function_item',1308'impl_item',1309'mod_item',1310'struct_item',1311'trait_item',1312'union_item',1313],1314};13151316export const semanticChunkingTargetQuery: LanguageQueryMap = q({1317[WASMLanguage.TypeScript]: [1318semanticChunkingTargetQueryForLanguage(WASMLanguage.TypeScript)1319],1320[WASMLanguage.TypeScriptTsx]: [1321semanticChunkingTargetQueryForLanguage(WASMLanguage.TypeScriptTsx)1322],1323[WASMLanguage.JavaScript]: [1324semanticChunkingTargetQueryForLanguage(WASMLanguage.JavaScript)1325],1326[WASMLanguage.Java]: [1327semanticChunkingTargetQueryForLanguage(WASMLanguage.Java)1328],1329[WASMLanguage.Cpp]: [1330semanticChunkingTargetQueryForLanguage(WASMLanguage.Cpp)1331],1332[WASMLanguage.Csharp]: [1333semanticChunkingTargetQueryForLanguage(WASMLanguage.Csharp)1334],1335[WASMLanguage.Python]: [1336semanticChunkingTargetQueryForLanguage(WASMLanguage.Python)1337],1338[WASMLanguage.Go]: [1339semanticChunkingTargetQueryForLanguage(WASMLanguage.Go)1340],1341[WASMLanguage.Rust]: [1342semanticChunkingTargetQueryForLanguage(WASMLanguage.Rust)1343],1344[WASMLanguage.Ruby]: [1345semanticChunkingTargetQueryForLanguage(WASMLanguage.Ruby)1346]1347});134813491350function coarseScopesQueryForLanguage(language: WASMLanguage): string {1351return coarseScopeTypes[language].map((scope) => `(${scope}) @scope`).join('\n');1352}13531354function semanticChunkingTargetQueryForLanguage(language: WASMLanguage): string {1355const blocks = semanticChunkTargetTypes[language].map((blockType) => `(${blockType})`).join('\n');1356return `[1357${blocks}1358] @definition`;1359}13601361export function _isScope(language: WASMLanguage, node: SyntaxNode): boolean {1362return coarseScopeTypes[language].includes(node.type) || fineScopeTypes[language].includes(node.type);1363}13641365export function _isFineScope(language: WASMLanguage, node: SyntaxNode): boolean {1366return fineScopeTypes[language].includes(node.type);1367}13681369export function _isStatement(language: WASMLanguage, node: SyntaxNode): boolean {1370return statementTypes[language].includes(node.type);1371}13721373export const testInSuiteQueries: { [wasmLanguage in WASMLanguage]: string[] } = {1374...forLanguages([WASMLanguage.TypeScript, WASMLanguage.TypeScriptTsx], [1375treeSitterQuery.typescript`[1376(expression_statement1377(call_expression1378function: (identifier) @fn1379(#any-of? @fn "test" "it")1380)1381) @test1382]`1383]),1384[WASMLanguage.JavaScript]: [1385// same as typescript, but we want different tree-sitter query linting to prevent breakages in future1386treeSitterQuery.javascript`[1387(call_expression1388function: (identifier) @fn1389(#any-of? @fn "test" "it")1390) @test1391]`1392],1393[WASMLanguage.Python]: [1394treeSitterQuery.python`[1395(function_definition1396name: (identifier) @fn1397(#match? @fn "^test_")1398) @test1399]`1400],1401[WASMLanguage.Java]: [1402treeSitterQuery.java`[1403(method_declaration1404name: (identifier) @fn1405(#match? @fn "^test")1406) @test1407]`1408],1409[WASMLanguage.Go]: [1410treeSitterQuery.go`[1411(function_declaration1412name: (identifier) @fn1413(#match? @fn "^Test")1414) @test1415]`1416],1417[WASMLanguage.Ruby]: [],1418[WASMLanguage.Csharp]: [],1419[WASMLanguage.Cpp]: [],1420[WASMLanguage.Rust]: []1421};142214231424