Skip to content

Some tweaks on how sketch is rebuild during editing #118

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jul 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
)

Expand All @@ -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
Expand Down
12 changes: 8 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down Expand Up @@ -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=
Expand Down Expand Up @@ -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=
Expand Down
42 changes: 26 additions & 16 deletions ls/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand All @@ -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")
Expand All @@ -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")
Expand All @@ -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
}

Expand All @@ -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"`
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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"))

Expand Down
Loading