diff --git a/go.mod b/go.mod index 1fd0efe..0b86182 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,14 @@ module github.com/arduino/arduino-language-server go 1.18 require ( - github.com/arduino/arduino-cli v0.0.0-20220614161710-813cfe73a466 + github.com/arduino/arduino-cli v0.0.0-20220711135540-a5466d017f77 github.com/arduino/go-paths-helper v1.7.0 github.com/fatih/color v1.13.0 github.com/mattn/go-isatty v0.0.14 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.7.0 go.bug.st/json v1.15.6 - go.bug.st/lsp v0.0.0-20220608135618-8a2f8eb9ad1b + go.bug.st/lsp v0.0.0-20220701124835-c1977441be8c google.golang.org/grpc v1.42.0 ) @@ -19,6 +19,8 @@ require ( github.com/arduino/go-win32-utils v0.0.0-20180330194947-ed041402e83b // indirect github.com/codeclysm/extract/v3 v3.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/djherbis/buffer v1.1.0 // indirect + github.com/djherbis/nio/v3 v3.0.1 // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/h2non/filetype v1.0.8 // indirect diff --git a/go.sum b/go.sum index 79eb4de..cd65354 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/arduino/arduino-cli v0.0.0-20220614161710-813cfe73a466 h1:YWiioO3yTEEaat8ynHb9OiL3/VQkNV1N0PBAUrogpzM= -github.com/arduino/arduino-cli v0.0.0-20220614161710-813cfe73a466/go.mod h1:lKz95Yubl2TUVHzRlbL08gVUH6gtZ4g2f/WlFTZAKVQ= +github.com/arduino/arduino-cli v0.0.0-20220711135540-a5466d017f77 h1:FEq5nyTsXVfxv2/3OScDms8JY40HATSoY/ZETbm6UvQ= +github.com/arduino/arduino-cli v0.0.0-20220711135540-a5466d017f77/go.mod h1:fmDzZyIZDYjR/FTdI1dKts/FW9LBoCestPKPP5k4YMI= github.com/arduino/go-paths-helper v1.0.1/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= github.com/arduino/go-paths-helper v1.2.0/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck= github.com/arduino/go-paths-helper v1.6.1/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU= @@ -77,6 +77,10 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/djherbis/buffer v1.1.0 h1:uGQ+DZDAMlfC2z3khbBtLcAHC0wyoNrX9lpOml3g3fg= +github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o= +github.com/djherbis/nio/v3 v3.0.1 h1:6wxhnuppteMa6RHA4L81Dq7ThkZH8SwnDzXDYy95vB4= +github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -300,8 +304,8 @@ go.bug.st/downloader/v2 v2.1.1 h1:nyqbUizo3E2IxCCm4YFac4FtSqqFpqWP+Aae5GCMuw4= go.bug.st/downloader/v2 v2.1.1/go.mod h1:VZW2V1iGKV8rJL2ZEGIDzzBeKowYv34AedJz13RzVII= go.bug.st/json v1.15.6 h1:pvSpotu6f5JoCbx1TnKn6asVH7o9Tg2/GKsZSVzBOsc= go.bug.st/json v1.15.6/go.mod h1:bh58F9adz5ePlNqtvbuXuXcf9k6IrDLKH6lJUsHP3TI= -go.bug.st/lsp v0.0.0-20220608135618-8a2f8eb9ad1b h1:JkRunYlYDXFIgMf3BfgFrQyvHCsqkUuCGL9CUYhY3zc= -go.bug.st/lsp v0.0.0-20220608135618-8a2f8eb9ad1b/go.mod h1:oYTh1uf5hI1teV5crrWut41Pk8vD/NqIjs4zD+No5FE= +go.bug.st/lsp v0.0.0-20220701124835-c1977441be8c h1:rdebuzKpFl6eLKoqOiKV7C0frI4LlpQbJ+48caNvchA= +go.bug.st/lsp v0.0.0-20220701124835-c1977441be8c/go.mod h1:oYTh1uf5hI1teV5crrWut41Pk8vD/NqIjs4zD+No5FE= go.bug.st/relaxed-semver v0.9.0 h1:qt0T8W70VCurvsbxRK25fQwiTOFjkzwC/fDOpyPnchQ= go.bug.st/relaxed-semver v0.9.0/go.mod h1:ug0/W/RPYUjliE70Ghxg77RDHmPxqpo7SHV16ijss7Q= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= diff --git a/ls/builder.go b/ls/builder.go index 66d5233..6b0bea7 100644 --- a/ls/builder.go +++ b/ls/builder.go @@ -92,7 +92,7 @@ func (r *SketchRebuilder) rebuilderLoop() { r.cancel = cancel r.mutex.Unlock() - if err := r.doRebuild(ctx, logger); err != nil { + if err := r.doRebuildArduinoPreprocessedSketch(ctx, logger); err != nil { logger.Logf("Error: %s", err) } @@ -104,10 +104,9 @@ func (r *SketchRebuilder) rebuilderLoop() { } } -func (r *SketchRebuilder) doRebuild(ctx context.Context, logger jsonrpc.FunctionLogger) error { +func (r *SketchRebuilder) doRebuildArduinoPreprocessedSketch(ctx context.Context, logger jsonrpc.FunctionLogger) error { ls := r.ls - - if success, err := ls.generateBuildEnvironment(ctx, logger); err != nil { + if success, err := ls.generateBuildEnvironment(ctx, !r.ls.config.SkipLibrariesDiscoveryOnRebuild, logger); err != nil { return err } else if !success { return fmt.Errorf("build failed") @@ -123,14 +122,10 @@ func (r *SketchRebuilder) doRebuild(ctx context.Context, logger jsonrpc.Function default: } - if err := ls.buildPath.Join("compile_commands.json").CopyTo(ls.compileCommandsDir.Join("compile_commands.json")); err != nil { - logger.Logf("ERROR: updating compile_commands: %s", err) - } - if cppContent, err := ls.buildSketchCpp.ReadFile(); err == nil { - oldVesrion := ls.sketchMapper.CppText.Version + oldVersion := ls.sketchMapper.CppText.Version ls.sketchMapper = sourcemapper.CreateInoMapper(cppContent) - ls.sketchMapper.CppText.Version = oldVesrion + 1 + ls.sketchMapper.CppText.Version = oldVersion + 1 ls.sketchMapper.DebugLogAll() } else { return errors.WithMessage(err, "reading generated cpp file from sketch") @@ -143,7 +138,7 @@ func (r *SketchRebuilder) doRebuild(ctx context.Context, logger jsonrpc.Function TextDocument: lsp.TextDocumentIdentifier{URI: cppURI}, } if err := ls.Clangd.conn.TextDocumentDidSave(didSaveParams); err != nil { - logger.Logf("error reinitilizing clangd:", err) + logger.Logf("error reinitializing clangd:", err) return err } @@ -159,18 +154,24 @@ func (r *SketchRebuilder) doRebuild(ctx context.Context, logger jsonrpc.Function }, } if err := ls.Clangd.conn.TextDocumentDidChange(didChangeParams); err != nil { - logger.Logf("error reinitilizing clangd:", err) + logger.Logf("error reinitializing clangd:", err) return err } return nil } -func (ls *INOLanguageServer) generateBuildEnvironment(ctx context.Context, logger jsonrpc.FunctionLogger) (bool, error) { +func (ls *INOLanguageServer) generateBuildEnvironment(ctx context.Context, fullBuild bool, logger jsonrpc.FunctionLogger) (bool, error) { + var buildPath *paths.Path + if fullBuild { + buildPath = ls.fullBuildPath + } else { + buildPath = ls.buildPath + } + // Extract all build information from language server status ls.readLock(logger, false) sketchRoot := ls.sketchRoot - buildPath := ls.buildPath config := ls.config type overridesFile struct { Overrides map[string]string `json:"overrides"` @@ -204,6 +205,7 @@ func (ls *INOLanguageServer) generateBuildEnvironment(ctx context.Context, logge BuildPath: buildPath.String(), CreateCompilationDatabaseOnly: true, Verbose: true, + SkipLibrariesDiscovery: !fullBuild, } compileReqJson, _ := json.MarshalIndent(compileReq, "", " ") logger.Logf("Running build with: %s", string(compileReqJson)) @@ -264,9 +266,12 @@ func (ls *INOLanguageServer) generateBuildEnvironment(ctx context.Context, logge "--source-override", overridesJSON.String(), "--build-path", buildPath.String(), "--format", "json", - //"--clean", - sketchRoot.String(), } + if !fullBuild { + args = append(args, "--skip-libraries-discovery") + } + args = append(args, sketchRoot.String()) + cmd, err := executils.NewProcess(nil, args...) if err != nil { return false, errors.Errorf("running %s: %s", strings.Join(args, " "), err) @@ -298,6 +303,11 @@ func (ls *INOLanguageServer) generateBuildEnvironment(ctx context.Context, logge success = res.Success } + if fullBuild { + ls.CopyFullBuildResults(logger, buildPath) + return ls.generateBuildEnvironment(ctx, false, logger) + } + // TODO: do canonicalization directly in `arduino-cli` canonicalizeCompileCommandsJSON(buildPath.Join("compile_commands.json")) diff --git a/ls/ls.go b/ls/ls.go index 3776d9d..5db27fa 100644 --- a/ls/ls.go +++ b/ls/ls.go @@ -36,10 +36,10 @@ type INOLanguageServer struct { closing chan bool clangdStarted *sync.Cond dataMux sync.RWMutex - compileCommandsDir *paths.Path buildPath *paths.Path buildSketchRoot *paths.Path buildSketchCpp *paths.Path + fullBuildPath *paths.Path sketchRoot *paths.Path sketchName string sketchMapper *sourcemapper.SketchMapper @@ -51,14 +51,15 @@ type INOLanguageServer struct { // Config describes the language server configuration. type Config struct { - Fqbn string - CliPath *paths.Path - CliConfigPath *paths.Path - ClangdPath *paths.Path - CliDaemonAddress string - CliInstanceNumber int - FormatterConf *paths.Path - EnableLogging bool + Fqbn string + CliPath *paths.Path + CliConfigPath *paths.Path + ClangdPath *paths.Path + CliDaemonAddress string + CliInstanceNumber int + FormatterConf *paths.Path + EnableLogging bool + SkipLibrariesDiscoveryOnRebuild bool } var yellow = color.New(color.FgHiYellow) @@ -126,20 +127,20 @@ func NewINOLanguageServer(stdin io.Reader, stdout io.Writer, config *Config) *IN if tmp, err := paths.MkTempDir("", "arduino-language-server"); err != nil { log.Fatalf("Could not create temp folder: %s", err) } else { - ls.compileCommandsDir = tmp.Canonical() + ls.buildPath = tmp.Canonical() + ls.buildSketchRoot = ls.buildPath.Join("sketch") } if tmp, err := paths.MkTempDir("", "arduino-language-server"); err != nil { log.Fatalf("Could not create temp folder: %s", err) } else { - ls.buildPath = tmp.Canonical() - ls.buildSketchRoot = ls.buildPath.Join("sketch") + ls.fullBuildPath = tmp.Canonical() } logger.Logf("Initial board configuration: %s", ls.config.Fqbn) logger.Logf("Language server build path: %s", ls.buildPath) logger.Logf("Language server build sketch root: %s", ls.buildSketchRoot) - logger.Logf("Language server compile-commands: %s", ls.compileCommandsDir.Join("compile_commands.json")) + logger.Logf("Language server FULL build path: %s", ls.fullBuildPath) ls.IDE = NewIDELSPServer(logger, stdin, stdout, ls) ls.progressHandler = NewProgressProxy(ls.IDE.conn) @@ -154,19 +155,22 @@ func NewINOLanguageServer(stdin io.Reader, stdout io.Writer, config *Config) *IN } func (ls *INOLanguageServer) InitializeReqFromIDE(ctx context.Context, logger jsonrpc.FunctionLogger, ideParams *lsp.InitializeParams) (*lsp.InitializeResult, *jsonrpc.ResponseError) { + ls.writeLock(logger, false) + ls.sketchRoot = ideParams.RootURI.AsPath() + ls.sketchName = ls.sketchRoot.Base() + ls.buildSketchCpp = ls.buildSketchRoot.Join(ls.sketchName + ".ino.cpp") + ls.writeUnlock(logger) + go func() { defer streams.CatchAndLogPanic() - // Unlock goroutines waiting for clangd + + // Unlock goroutines waiting for clangd at the end of the initialization. defer ls.clangdStarted.Broadcast() logger := NewLSPFunctionLogger(color.HiCyanString, "INIT --- ") logger.Logf("initializing workbench: %s", ideParams.RootURI) - ls.sketchRoot = ideParams.RootURI.AsPath() - ls.sketchName = ls.sketchRoot.Base() - ls.buildSketchCpp = ls.buildSketchRoot.Join(ls.sketchName + ".ino.cpp") - - if success, err := ls.generateBuildEnvironment(context.Background(), logger); err != nil { + if success, err := ls.generateBuildEnvironment(context.Background(), true, logger); err != nil { logger.Logf("error starting clang: %s", err) return } else if !success { @@ -174,10 +178,6 @@ func (ls *INOLanguageServer) InitializeReqFromIDE(ctx context.Context, logger js return } - if err := ls.buildPath.Join("compile_commands.json").CopyTo(ls.compileCommandsDir.Join("compile_commands.json")); err != nil { - logger.Logf("ERROR: updating compile_commands: %s", err) - } - if inoCppContent, err := ls.buildSketchCpp.ReadFile(); err == nil { ls.sketchMapper = sourcemapper.CreateInoMapper(inoCppContent) ls.sketchMapper.CppText.Version = 1 @@ -209,10 +209,10 @@ func (ls *INOLanguageServer) InitializeReqFromIDE(ctx context.Context, logger js clangInitializeParams.RootPath = ls.buildSketchRoot.String() clangInitializeParams.RootURI = lsp.NewDocumentURIFromPath(ls.buildSketchRoot) if clangInitializeResult, clangErr, err := ls.Clangd.conn.Initialize(ctx, &clangInitializeParams); err != nil { - logger.Logf("error initilizing clangd: %v", err) + logger.Logf("error initializing clangd: %v", err) return } else if clangErr != nil { - logger.Logf("error initilizing clangd: %v", clangErr.AsError()) + logger.Logf("error initializing clangd: %v", clangErr.AsError()) return } else { logger.Logf("clangd successfully started: %s", string(lsp.EncodeMessage(clangInitializeResult))) @@ -347,7 +347,7 @@ func (ls *INOLanguageServer) InitializeReqFromIDE(ctx context.Context, logger js // TokenModifiers: []string{}, // }, // Range: false, - // Full: &lsp.SemantiTokenFullOptions{ + // Full: &lsp.SemanticTokenFullOptions{ // Delta: true, // }, // }, @@ -437,7 +437,7 @@ func (ls *INOLanguageServer) TextDocumentCompletionReqFromIDE(ctx context.Contex if clangItem.Command != nil { c := ls.clang2IdeCommand(logger, *clangItem.Command) if c == nil { - continue // Skit item with unsupported command convertion + continue // Skit item with unsupported command conversion } ideCommand = c } @@ -595,7 +595,7 @@ func (ls *INOLanguageServer) TextDocumentDefinitionReqFromIDE(ctx context.Contex func (ls *INOLanguageServer) TextDocumentTypeDefinitionReqFromIDE(ctx context.Context, logger jsonrpc.FunctionLogger, ideParams *lsp.TypeDefinitionParams) ([]lsp.Location, []lsp.LocationLink, *jsonrpc.ResponseError) { // XXX: This capability is not advertised in the initialization message (clangd - // does not advetise it either, so maybe we should just not implement it) + // does not advertise it either, so maybe we should just not implement it) ls.readLock(logger, true) defer ls.readUnlock(logger) @@ -1172,6 +1172,24 @@ func (ls *INOLanguageServer) TextDocumentDidCloseNotifFromIDE(logger jsonrpc.Fun } } +func (ls *INOLanguageServer) FullBuildCompletedFromIDE(logger jsonrpc.FunctionLogger, params *DidCompleteBuildParams) { + ls.writeLock(logger, true) + defer ls.writeUnlock(logger) + + ls.CopyFullBuildResults(logger, params.BuildOutputUri.AsPath()) + ls.triggerRebuild() +} + +func (ls *INOLanguageServer) CopyFullBuildResults(logger jsonrpc.FunctionLogger, buildPath *paths.Path) { + fromCache := buildPath.Join("libraries.cache") + toCache := ls.buildPath.Join("libraries.cache") + if err := fromCache.CopyTo(toCache); err != nil { + logger.Logf("ERROR: updating libraries.cache: %s", err) + } else { + logger.Logf("Updated 'libraries.cache'. Copied: %v to %v", fromCache, toCache) + } +} + func (ls *INOLanguageServer) PublishDiagnosticsNotifFromClangd(logger jsonrpc.FunctionLogger, clangParams *lsp.PublishDiagnosticsParams) { ls.readLock(logger, false) defer ls.readUnlock(logger) @@ -1196,7 +1214,7 @@ func (ls *INOLanguageServer) PublishDiagnosticsNotifFromClangd(logger jsonrpc.Fu ls.ideInoDocsWithDiagnostics[ideInoURI] = true } - // .. and cleanup all previouse diagnostics that are no longer valid... + // .. and cleanup all previous diagnostics that are no longer valid... for ideInoURI := range ls.ideInoDocsWithDiagnostics { if _, ok := allIdeParams[ideInoURI]; ok { continue @@ -1218,7 +1236,7 @@ func (ls *INOLanguageServer) PublishDiagnosticsNotifFromClangd(logger jsonrpc.Fu _ = json.Unmarshal(ideDiag.Code, &code) switch code { case "": - // Filter unkown non-string codes + // Filter unknown non-string codes case "drv_unknown_argument_with_suggestion": // Skip errors like: "Unknown argument '-mlongcalls'; did you mean '-mlong-calls'?" case "drv_unknown_argument": @@ -1296,7 +1314,7 @@ func (ls *INOLanguageServer) ideURIIsPartOfTheSketch(ideURI lsp.DocumentURI) boo func (ls *INOLanguageServer) ProgressNotifFromClangd(logger jsonrpc.FunctionLogger, progress *lsp.ProgressParams) { var token string if err := json.Unmarshal(progress.Token, &token); err != nil { - logger.Logf("error decoding progess token: %s", err) + logger.Logf("error decoding progress token: %s", err) return } switch value := progress.TryToDecodeWellKnownValues().(type) { @@ -1342,9 +1360,6 @@ func (ls *INOLanguageServer) Close() { if ls.buildPath != nil { ls.buildPath.RemoveAll() } - if ls.compileCommandsDir != nil { - ls.compileCommandsDir.RemoveAll() - } } // CloseNotify returns a channel that is closed when the InoHandler is closed @@ -1358,6 +1373,10 @@ func (ls *INOLanguageServer) CleanUp() { ls.buildPath.RemoveAll() ls.buildPath = nil } + if ls.fullBuildPath != nil { + ls.fullBuildPath.RemoveAll() + ls.fullBuildPath = nil + } } func (ls *INOLanguageServer) extractDataFolderFromArduinoCLI(logger jsonrpc.FunctionLogger) (*paths.Path, error) { @@ -1470,7 +1489,7 @@ func (ls *INOLanguageServer) clang2IdeCommand(logger jsonrpc.FunctionLogger, cla converted, err := json.Marshal(v) if err != nil { - panic("Internal Error: json conversion of codeAcion command arguments") + panic("Internal Error: json conversion of codeAction command arguments") } ideCommand.Arguments[i] = converted } @@ -1496,7 +1515,7 @@ func (ls *INOLanguageServer) cpp2inoWorkspaceEdit(logger jsonrpc.FunctionLogger, continue } - // ...otherwise convert edits to the sketch.ino.cpp into multilpe .ino edits + // ...otherwise convert edits to the sketch.ino.cpp into multiple .ino edits for _, edit := range edits { inoURI, inoRange, inPreprocessed, err := ls.clang2IdeRangeAndDocumentURI(logger, editURI, edit.Range) if err != nil { diff --git a/ls/lsp_server_ide.go b/ls/lsp_server_ide.go index c43cef7..b1fd386 100644 --- a/ls/lsp_server_ide.go +++ b/ls/lsp_server_ide.go @@ -20,6 +20,7 @@ func NewIDELSPServer(logger jsonrpc.FunctionLogger, in io.Reader, out io.Writer, ls: ls, } server.conn = lsp.NewServer(in, out, server) + server.conn.RegisterCustomNotification("ino/didCompleteBuild", server.ArduinoBuildCompleted) server.conn.SetLogger(&LSPLogger{ IncomingPrefix: "IDE --> LS", OutgoingPrefix: "IDE <-- LS", @@ -274,3 +275,21 @@ func (server *IDELSPServer) TextDocumentDidSave(logger jsonrpc.FunctionLogger, p func (server *IDELSPServer) TextDocumentDidClose(logger jsonrpc.FunctionLogger, params *lsp.DidCloseTextDocumentParams) { server.ls.TextDocumentDidCloseNotifFromIDE(logger, params) } + +// DidCompleteBuildParams is a custom notification from the Arduino IDE, sent +type DidCompleteBuildParams struct { + BuildOutputUri *lsp.DocumentURI `json:"buildOutputUri"` +} + +func (server *IDELSPServer) ArduinoBuildCompleted(logger jsonrpc.FunctionLogger, raw json.RawMessage) { + if !server.ls.config.SkipLibrariesDiscoveryOnRebuild { + return + } + + var params DidCompleteBuildParams + if err := json.Unmarshal(raw, ¶ms); err != nil { + logger.Logf("ERROR decoding DidCompleteBuildParams: %s", err) + } else { + server.ls.FullBuildCompletedFromIDE(logger, ¶ms) + } +} diff --git a/main.go b/main.go index d07fc69..5c10e6d 100644 --- a/main.go +++ b/main.go @@ -50,6 +50,9 @@ func main() { cliDaemonInstanceNumber := flag.Int( "cli-daemon-instance", -1, "Instance number of the Arduino CLI daemon") + skipLibrariesDiscoveryOnRebuild := flag.Bool( + "skip-libraries-discovery-on-rebuild", false, + "Skip libraries discovery on rebuild, it will make rebuilds faster but it will fail if the used libraries changes.") flag.Parse() if *loggingBasePath != "" { @@ -111,14 +114,15 @@ func main() { } config := &ls.Config{ - Fqbn: *fqbn, - ClangdPath: paths.New(*clangdPath), - EnableLogging: *enableLogging, - CliPath: paths.New(*cliPath), - CliConfigPath: paths.New(*cliConfigPath), - FormatterConf: paths.New(*formatFilePath), - CliDaemonAddress: *cliDaemonAddress, - CliInstanceNumber: *cliDaemonInstanceNumber, + Fqbn: *fqbn, + ClangdPath: paths.New(*clangdPath), + EnableLogging: *enableLogging, + CliPath: paths.New(*cliPath), + CliConfigPath: paths.New(*cliConfigPath), + FormatterConf: paths.New(*formatFilePath), + CliDaemonAddress: *cliDaemonAddress, + CliInstanceNumber: *cliDaemonInstanceNumber, + SkipLibrariesDiscoveryOnRebuild: *skipLibrariesDiscoveryOnRebuild, } stdio := streams.NewReadWriteCloser(os.Stdin, os.Stdout)