Path: blob/main/extensions/copilot/src/platform/parser/node/util.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* Extracts the identifier for the given node (is based on heuristics, so not 100% accurate for all languages)10*/11export function extractIdentifier(node: SyntaxNode, languageId: string): string | undefined {12switch (languageId) {13case 'python':14case 'csharp':15return node.children.find(c => c.type.match(/identifier/))?.text;16case 'go': {17const identifierChild = node.children.find(c => c.type.match(/identifier/));18if (identifierChild) { return identifierChild.text; }19const specChild = node.children.find(c => c.type.match(/spec/));20return specChild?.children.find(c => c.type.match(/identifier/))?.text;21}22case 'javascript':23case 'javascriptreact':24case 'typescript':25case 'typescriptreact':26case 'cpp': {27const declarator = node.children.find(c => c.type.match(/declarator/));28if (declarator) { return declarator.children.find(c => c.type.match(/identifier/))?.text; }29const identifierChild = node.children.find(c => c.type.match(/identifier/));30return identifierChild?.text;31}32case 'java': {33/*34handles35```java36// class identifier37class Fo<<>>o { }3839class Foo {40// method identifier41public void ba<<>>r() { }42}4344// enum identifier45enum F<<>>oo {46// enum constant identifier47BA<<>>Z48}4950// interface identifier51interface Fo<<>>o { }52```53*/54const identifierChild = node.children.find(c => c.type === 'identifier');55return identifierChild?.text;56}57case 'ruby':58return node.children.find(c => c.type.match(/constant|identifier/))?.text;59default:60return node.children.find(c => c.type.match(/identifier/))?.text;61}62}636465export function isDocumentableNode(node: SyntaxNode, language: WASMLanguage) {66switch (language) {67case WASMLanguage.TypeScript:68case WASMLanguage.TypeScriptTsx:69case WASMLanguage.JavaScript:70return node.type.match(/definition|declaration|declarator|export_statement/);71case WASMLanguage.Go:72return node.type.match(/definition|declaration|declarator|var_spec/);73case WASMLanguage.Cpp:74return node.type.match(/definition|declaration|class_specifier/);75case WASMLanguage.Ruby:76return node.type.match(/module|class|method|assignment/);77default:78return node.type.match(/definition|declaration|declarator/);79}80}818283