1- import { Range , TextDocument } from "@cursorless/common" ;
1+ import {
2+ Disposable ,
3+ FileSystem ,
4+ Notifier ,
5+ Range ,
6+ TextDocument ,
7+ getCursorlessRepoRoot ,
8+ } from "@cursorless/common" ;
9+ import { join } from "path" ;
210import { SyntaxNode } from "web-tree-sitter" ;
311import { TreeSitter } from ".." ;
12+ import { ide } from "../singletons/ide.singleton" ;
413import { LanguageDefinition } from "./LanguageDefinition" ;
514
615/**
@@ -14,6 +23,8 @@ const LANGUAGE_UNDEFINED = Symbol("LANGUAGE_UNDEFINED");
1423 * constructing them as necessary
1524 */
1625export class LanguageDefinitions {
26+ private notifier : Notifier = new Notifier ( ) ;
27+
1728 /**
1829 * Maps from language id to {@link LanguageDefinition} or
1930 * {@link LANGUAGE_UNDEFINED} if language doesn't have new-style definitions.
@@ -28,8 +39,31 @@ export class LanguageDefinitions {
2839 string ,
2940 LanguageDefinition | typeof LANGUAGE_UNDEFINED
3041 > = new Map ( ) ;
42+ private queryDir : string ;
43+ private disposables : Disposable [ ] = [ ] ;
44+
45+ constructor (
46+ fileSystem : FileSystem ,
47+ private treeSitter : TreeSitter ,
48+ ) {
49+ // Use the repo root as the root for development mode, so that we can
50+ // we can make hot-reloading work for the queries
51+ this . queryDir = join (
52+ ide ( ) . runMode === "development"
53+ ? getCursorlessRepoRoot ( )
54+ : ide ( ) . assetsRoot ,
55+ "queries" ,
56+ ) ;
3157
32- constructor ( private treeSitter : TreeSitter ) { }
58+ if ( ide ( ) . runMode === "development" ) {
59+ this . disposables . push (
60+ fileSystem . watchDir ( this . queryDir , ( ) => {
61+ this . languageDefinitions . clear ( ) ;
62+ this . notifier . notifyListeners ( ) ;
63+ } ) ,
64+ ) ;
65+ }
66+ }
3367
3468 /**
3569 * Get a language definition for the given language id, if the language
@@ -44,7 +78,7 @@ export class LanguageDefinitions {
4478
4579 if ( definition == null ) {
4680 definition =
47- LanguageDefinition . create ( this . treeSitter , languageId ) ??
81+ LanguageDefinition . create ( this . treeSitter , this . queryDir , languageId ) ??
4882 LANGUAGE_UNDEFINED ;
4983
5084 this . languageDefinitions . set ( languageId , definition ) ;
@@ -59,4 +93,10 @@ export class LanguageDefinitions {
5993 public getNodeAtLocation ( document : TextDocument , range : Range ) : SyntaxNode {
6094 return this . treeSitter . getNodeAtLocation ( document , range ) ;
6195 }
96+
97+ onDidChangeDefinition = this . notifier . registerListener ;
98+
99+ dispose ( ) {
100+ this . disposables . forEach ( ( disposable ) => disposable . dispose ( ) ) ;
101+ }
62102}
0 commit comments