@@ -13,6 +13,7 @@ import (
1313 "time"
1414
1515 "github.com/arduino/arduino-cli/executils"
16+ rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/settings/v1"
1617 "github.com/arduino/arduino-language-server/sourcemapper"
1718 "github.com/arduino/arduino-language-server/streams"
1819 "github.com/arduino/go-paths-helper"
@@ -22,6 +23,7 @@ import (
2223 "go.bug.st/lsp"
2324 "go.bug.st/lsp/jsonrpc"
2425 "go.bug.st/lsp/textedits"
26+ "google.golang.org/grpc"
2527)
2628
2729// INOLanguageServer is a JSON-RPC handler that delegates messages to clangd.
@@ -1019,36 +1021,58 @@ func (ls *INOLanguageServer) CleanUp() {
10191021}
10201022
10211023func (ls * INOLanguageServer ) extractDataFolderFromArduinoCLI (logger jsonrpc.FunctionLogger ) (* paths.Path , error ) {
1022- // XXX: do this from IDE or via gRPC
1023- args := []string {ls .config .CliPath .String (),
1024- "--config-file" , ls .config .CliConfigPath .String (),
1025- "config" ,
1026- "dump" ,
1027- "--format" , "json" ,
1028- }
1029- cmd , err := executils .NewProcess (args ... )
1030- if err != nil {
1031- return nil , errors .Errorf ("running %s: %s" , strings .Join (args , " " ), err )
1032- }
1033- cmdOutput := & bytes.Buffer {}
1034- cmd .RedirectStdoutTo (cmdOutput )
1035- logger .Logf ("running: %s" , strings .Join (args , " " ))
1036- if err := cmd .Run (); err != nil {
1037- return nil , errors .Errorf ("running %s: %s" , strings .Join (args , " " ), err )
1038- }
1024+ if ls .config .CliPath == nil {
1025+ // Establish a connection with the arduino-cli gRPC server
1026+ conn , err := grpc .Dial (ls .config .CliDaemonAddress , grpc .WithInsecure (), grpc .WithBlock ())
1027+ if err != nil {
1028+ return nil , fmt .Errorf ("error connecting to arduino-cli rpc server: %w" , err )
1029+ }
1030+ defer conn .Close ()
1031+ client := rpc .NewSettingsServiceClient (conn )
10391032
1040- type cmdRes struct {
1041- Directories struct {
1042- Data string `json:"data"`
1043- } `json:"directories"`
1044- }
1045- var res cmdRes
1046- if err := json .Unmarshal (cmdOutput .Bytes (), & res ); err != nil {
1047- return nil , errors .Errorf ("parsing arduino-cli output: %s" , err )
1033+ resp , err := client .GetValue (context .Background (), & rpc.GetValueRequest {
1034+ Key : "directories.data" ,
1035+ })
1036+ if err != nil {
1037+ return nil , fmt .Errorf ("error getting arduino data dir: %w" , err )
1038+ }
1039+ var dataDir string
1040+ if err := json .Unmarshal ([]byte (resp .JsonData ), & dataDir ); err != nil {
1041+ return nil , fmt .Errorf ("error getting arduino data dir: %w" , err )
1042+ }
1043+ logger .Logf ("Arduino Data Dir -> %s" , dataDir )
1044+ return paths .New (dataDir ), nil
1045+ } else {
1046+ args := []string {ls .config .CliPath .String (),
1047+ "--config-file" , ls .config .CliConfigPath .String (),
1048+ "config" ,
1049+ "dump" ,
1050+ "--format" , "json" ,
1051+ }
1052+ cmd , err := executils .NewProcess (args ... )
1053+ if err != nil {
1054+ return nil , errors .Errorf ("running %s: %s" , strings .Join (args , " " ), err )
1055+ }
1056+ cmdOutput := & bytes.Buffer {}
1057+ cmd .RedirectStdoutTo (cmdOutput )
1058+ logger .Logf ("running: %s" , strings .Join (args , " " ))
1059+ if err := cmd .Run (); err != nil {
1060+ return nil , errors .Errorf ("running %s: %s" , strings .Join (args , " " ), err )
1061+ }
1062+
1063+ type cmdRes struct {
1064+ Directories struct {
1065+ Data string `json:"data"`
1066+ } `json:"directories"`
1067+ }
1068+ var res cmdRes
1069+ if err := json .Unmarshal (cmdOutput .Bytes (), & res ); err != nil {
1070+ return nil , errors .Errorf ("parsing arduino-cli output: %s" , err )
1071+ }
1072+ // Return only the build path
1073+ logger .Logf ("Arduino Data Dir -> %s" , res .Directories .Data )
1074+ return paths .New (res .Directories .Data ), nil
10481075 }
1049- // Return only the build path
1050- logger .Logf ("Arduino Data Dir -> %s" , res .Directories .Data )
1051- return paths .New (res .Directories .Data ), nil
10521076}
10531077
10541078func (ls * INOLanguageServer ) didClose (logger jsonrpc.FunctionLogger , inoDidClose * lsp.DidCloseTextDocumentParams ) (* lsp.DidCloseTextDocumentParams , error ) {
0 commit comments