@@ -13,6 +13,7 @@ import (
13
13
"time"
14
14
15
15
"github.com/arduino/arduino-cli/executils"
16
+ rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/settings/v1"
16
17
"github.com/arduino/arduino-language-server/sourcemapper"
17
18
"github.com/arduino/arduino-language-server/streams"
18
19
"github.com/arduino/go-paths-helper"
@@ -22,6 +23,7 @@ import (
22
23
"go.bug.st/lsp"
23
24
"go.bug.st/lsp/jsonrpc"
24
25
"go.bug.st/lsp/textedits"
26
+ "google.golang.org/grpc"
25
27
)
26
28
27
29
// INOLanguageServer is a JSON-RPC handler that delegates messages to clangd.
@@ -1019,36 +1021,58 @@ func (ls *INOLanguageServer) CleanUp() {
1019
1021
}
1020
1022
1021
1023
func (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 )
1039
1032
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
1048
1075
}
1049
- // Return only the build path
1050
- logger .Logf ("Arduino Data Dir -> %s" , res .Directories .Data )
1051
- return paths .New (res .Directories .Data ), nil
1052
1076
}
1053
1077
1054
1078
func (ls * INOLanguageServer ) didClose (logger jsonrpc.FunctionLogger , inoDidClose * lsp.DidCloseTextDocumentParams ) (* lsp.DidCloseTextDocumentParams , error ) {
0 commit comments