tree-sitter / node-tree-sitter

Node.js bindings for tree-sitter
https://www.npmjs.com/package/tree-sitter
MIT License
663 stars 118 forks source link

[question] How to query out all the properties and methods from a class? #223

Open liaodalin19903 opened 3 months ago

liaodalin19903 commented 3 months ago

How to query out all the properties and methods from a class?

I tried to match a class for getting all the properties and methods:

const Parser = require("tree-sitter")
const TypeScript = require("tree-sitter-typescript").typescript

const { Query } = Parser 

const parser = new Parser()
parser.setLanguage(TypeScript)

/*
const query = new Query(
  TypeScript,
  `
    (class_declaration 
      name: (identifier) @class-name
      (class_heritage (extends_clause value: (identifier)))
      )
  `
);
*/

//(class_declaration name: (identifier) @class-name)
const query = new Query(
  TypeScript,
  `
    (class_declaration 
      name: (type_identifier) @class-name
      body: (class_body
        (method_definition
          name: (property_identifier) @the-method-name)))
  `
);

const tree = parser.parse(`
class AnimalBase {
  readonly skeleton: number
  readonly blood: 'red' | 'blue' | 'transparent'
}

abstract class Animal extends AnimalBase {

  readonly age: number = 0
  abstract shout (): void  

}

class Cat extends Animal {
  shout() {
      console.log('mew mew')
  }
}

class Dog extends Animal {
  shout() {
      console.log('bark bark')
  }
  shout2() {
      console.log('bark bark')
  }
}
    `);

const matches = query.matches(tree.rootNode);

//console.log(matches[1].captures[0].node.text)  // Dog 

console.log(matches[1].captures)

but I only get one class and one method:

[
  {
    name: 'class-name',
    node: TypeIdentifierNode {
      type: type_identifier,
      startPosition: {row: 19, column: 6},
      endPosition: {row: 19, column: 9},
      childCount: 0,
    }
  },
  {
    name: 'the-method-name',
    node: PropertyIdentifierNode {
      type: property_identifier,
      startPosition: {row: 20, column: 2},
      endPosition: {row: 20, column: 7},
      childCount: 0,
    }
  }
]

How to get the class Dog's all properties and methods?