77 TextDocumentSyncKind ,
88 DidChangeConfigurationNotification ,
99 Diagnostic ,
10+ Connection ,
11+ WorkspaceFolder ,
1012} from 'vscode-languageserver/node.js' ;
1113
1214import { TextDocument } from 'vscode-languageserver-textdocument' ;
@@ -15,6 +17,9 @@ import { WorkspaceSettingsManager } from './settings.js';
1517import { IAnalyzer } from './analyzer.js' ;
1618import { ILspClient } from './lsp-client.js' ;
1719import { BitloopsAnalyzer } from './parser/index.js' ;
20+ import * as fs from 'fs' ;
21+ import * as path from 'path' ;
22+
1823// Create a connection for the server, using Node's IPC as a transport.
1924// Also include all preview / proposed LSP features.
2025
@@ -32,6 +37,7 @@ export class BitloopsServer {
3237 private hasConfigurationCapability = false ;
3338 private hasWorkspaceFolderCapability = false ;
3439 private hasDiagnosticRelatedInformationCapability = false ;
40+ private workspaceFolders : WorkspaceFolder [ ] = [ ] ;
3541
3642 constructor ( lspClient : ILspClient , connection : _Connection ) {
3743 // Create a simple text document manager.
@@ -50,6 +56,8 @@ export class BitloopsServer {
5056 // }
5157
5258 public onInitialize ( params : InitializeParams ) : InitializeResult {
59+ this . workspaceFolders = params . workspaceFolders ;
60+
5361 const capabilities = params . capabilities ;
5462 this . hasConfigurationCapability = ! ! (
5563 capabilities . workspace && ! ! capabilities . workspace . configuration
@@ -75,6 +83,7 @@ export class BitloopsServer {
7583 } ,
7684 } ;
7785 }
86+
7887 return result ;
7988 }
8089
@@ -83,6 +92,7 @@ export class BitloopsServer {
8392 // Register for all configuration changes.
8493 this . connection . client . register ( DidChangeConfigurationNotification . type , undefined ) ;
8594 }
95+ this . validateWorkspace ( this . workspaceFolders ) ;
8696 if ( this . hasWorkspaceFolderCapability ) {
8797 this . connection . workspace . onDidChangeWorkspaceFolders ( ( _event ) => {
8898 this . connection . console . log ( 'Workspace folder change event received.' ) ;
@@ -110,4 +120,31 @@ export class BitloopsServer {
110120 this . lspClient . publishDiagnostics ( { uri : uri , diagnostics : diagnostic } ) ;
111121 }
112122 }
123+
124+ private async validateWorkspace ( workspaceFolders : WorkspaceFolder [ ] ) {
125+ for ( const workspaceFolder of workspaceFolders ) {
126+ const workspaceRoot = path . resolve ( workspaceFolder . uri . replace ( 'file://' , '' ) ) ;
127+ const files = fs . readdirSync ( workspaceRoot ) ;
128+ await this . validateBitloopsFiles ( workspaceRoot ) ;
129+ }
130+ }
131+
132+ private async validateBitloopsFiles ( startPath ) {
133+ var files = fs . readdirSync ( startPath ) ;
134+ for ( var i = 0 ; i < files . length ; i ++ ) {
135+ var filename = path . join ( startPath , files [ i ] ) ;
136+ var stat = fs . lstatSync ( filename ) ;
137+ if ( stat . isDirectory ( ) ) {
138+ this . validateBitloopsFiles ( filename ) ;
139+ } else if ( filename . endsWith ( '.bl' ) ) {
140+ const textDocument = TextDocument . create (
141+ 'file://' + filename ,
142+ 'bitloops' ,
143+ 1 ,
144+ fs . readFileSync ( filename , 'utf8' ) ,
145+ ) ;
146+ await this . createDiagnostics ( textDocument ) ;
147+ }
148+ }
149+ }
113150}
0 commit comments