From 3cad689f9e8fa8e2fd37bda262027de2f2cfe942 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 8 Dec 2015 18:05:07 +0100 Subject: [PATCH 1/6] Simplify CTag structure Signed-off-by: Cristian Maglie --- src/arduino.cc/builder/ctags_parser.go | 13 +++++++------ .../builder/test/ctags_parser_test.go | 17 +++++++++-------- src/arduino.cc/builder/types/types.go | 2 -- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/arduino.cc/builder/ctags_parser.go b/src/arduino.cc/builder/ctags_parser.go index 09a01d51..25fd9755 100644 --- a/src/arduino.cc/builder/ctags_parser.go +++ b/src/arduino.cc/builder/ctags_parser.go @@ -87,7 +87,7 @@ func addPrototypes(tags []*types.CTag) { } func addPrototype(tag *types.CTag) { - if strings.Index(tag.Returntype, TEMPLATE) == 0 || strings.Index(tag.Code, TEMPLATE) == 0 { + if strings.Index(tag.Prototype, TEMPLATE) == 0 || strings.Index(tag.Code, TEMPLATE) == 0 { code := tag.Code if strings.Contains(code, "{") { code = code[:strings.Index(code, "{")] @@ -98,8 +98,6 @@ func addPrototype(tag *types.CTag) { return } - tag.Prototype = tag.Returntype + " " + tag.FunctionName + tag.Signature + ";" - tag.PrototypeModifiers = "" if strings.Index(tag.Code, STATIC+" ") != -1 { tag.PrototypeModifiers = tag.PrototypeModifiers + " " + STATIC @@ -152,7 +150,7 @@ func skipTagsWhere(tags []*types.CTag, skipFunc skipFuncType, context map[string } func signatureContainsDefaultArg(tag *types.CTag) bool { - return strings.Contains(tag.Signature, "=") + return strings.Contains(tag.Prototype, "=") } func prototypeAndCodeDontMatch(tag *types.CTag) bool { @@ -207,6 +205,8 @@ func parseTag(row string) *types.CTag { parts = parts[2:] + signature := "" + returntype := "" for _, part := range parts { if strings.Contains(part, ":") { colon := strings.Index(part, ":") @@ -222,9 +222,9 @@ func parseTag(row string) *types.CTag { case "typeref": tag.Typeref = value case "signature": - tag.Signature = value + signature = value case "returntype": - tag.Returntype = value + returntype = value case "class": tag.Class = value case "struct": @@ -234,6 +234,7 @@ func parseTag(row string) *types.CTag { } } } + tag.Prototype = returntype + " " + tag.FunctionName + signature + ";" if strings.Contains(row, "/^") && strings.Contains(row, "$/;") { tag.Code = row[strings.Index(row, "/^")+2 : strings.Index(row, "$/;")] diff --git a/src/arduino.cc/builder/test/ctags_parser_test.go b/src/arduino.cc/builder/test/ctags_parser_test.go index cb6353dc..9ab3bab3 100644 --- a/src/arduino.cc/builder/test/ctags_parser_test.go +++ b/src/arduino.cc/builder/test/ctags_parser_test.go @@ -104,13 +104,15 @@ func TestCTagsParserShouldListTemplates(t *testing.T) { idx := 0 require.Equal(t, "minimum", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "(T a, T b)", ctags[idx].Signature) + require.Equal(t, "template T minimum (T a, T b);", ctags[idx].Prototype) idx++ require.Equal(t, "setup", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "void setup();", ctags[idx].Prototype) idx++ require.Equal(t, "loop", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "void loop();", ctags[idx].Prototype) } func TestCTagsParserShouldListTemplates2(t *testing.T) { @@ -136,11 +138,11 @@ func TestCTagsParserShouldListTemplates2(t *testing.T) { idx++ require.Equal(t, "SRAM_writeAnything", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "(int ee, const T& value)", ctags[idx].Signature) + require.Equal(t, "template int SRAM_writeAnything(int ee, const T& value);", ctags[idx].Prototype) idx++ require.Equal(t, "SRAM_readAnything", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "(int ee, T& value)", ctags[idx].Signature) + require.Equal(t, "template int SRAM_readAnything(int ee, T& value);", ctags[idx].Prototype) } func TestCTagsParserShouldDealWithClasses(t *testing.T) { @@ -355,7 +357,7 @@ func TestCTagsParserDefaultArguments(t *testing.T) { idx := 0 require.Equal(t, "test", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "(int x = 1)", ctags[idx].Signature) + require.Equal(t, "void test(int x = 1);", ctags[idx].Prototype) idx++ require.Equal(t, "setup", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) @@ -469,10 +471,9 @@ func TestCTagsParserFunctionPointers(t *testing.T) { idx++ require.Equal(t, "funcArr", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "()", ctags[idx].Signature) + require.Equal(t, "int funcArr();", ctags[idx].Prototype) idx++ require.Equal(t, "funcCombo", ctags[idx].FunctionName) require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "(void (*(&in)[5])(int))", ctags[idx].Signature) - -} + require.Equal(t, "void funcCombo(void (*(&in)[5])(int));", ctags[idx].Prototype) +} \ No newline at end of file diff --git a/src/arduino.cc/builder/types/types.go b/src/arduino.cc/builder/types/types.go index 57da8897..5965f37a 100644 --- a/src/arduino.cc/builder/types/types.go +++ b/src/arduino.cc/builder/types/types.go @@ -180,8 +180,6 @@ type CTag struct { FunctionName string Kind string Line int - Signature string - Returntype string Code string Class string Struct string From 11efa531e70d90a7b5da833458dddcca4bf64f0c Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sun, 20 Dec 2015 20:18:43 +0100 Subject: [PATCH 2/6] Skip empty prototype generation Signed-off-by: Cristian Maglie --- src/arduino.cc/builder/ctags_to_prototypes.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/arduino.cc/builder/ctags_to_prototypes.go b/src/arduino.cc/builder/ctags_to_prototypes.go index d8cde83b..fbefa1c5 100644 --- a/src/arduino.cc/builder/ctags_to_prototypes.go +++ b/src/arduino.cc/builder/ctags_to_prototypes.go @@ -108,6 +108,9 @@ func firstFunctionAtLine(tags []*types.CTag) int { func toPrototypes(tags []*types.CTag) []*types.Prototype { prototypes := []*types.Prototype{} for _, tag := range tags { + if strings.TrimSpace(tag.Prototype) == "" { + continue + } if !tag.SkipMe { prototype := &types.Prototype{ FunctionName: tag.FunctionName, From 583aab145ef3bfcfa803bd0eae345eb70c11f66c Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 12 Dec 2015 20:48:35 +0100 Subject: [PATCH 3/6] Moving ctags modules into their own package The following files ctags_parser.go ctags_runner.go ctags_to_prototypes.go have been moved into "ctags" package. Signed-off-by: Cristian Maglie --- .../collect_ctags_from_sketch_files.go | 4 +- .../builder/container_add_prototypes.go | 7 +- .../builder/{ => ctags}/ctags_parser.go | 2 +- .../builder/{ => ctags}/ctags_runner.go | 2 +- .../{ => ctags}/ctags_to_prototypes.go | 2 +- .../builder/test/ctags_parser_test.go | 390 +++++++++--------- .../builder/test/ctags_runner_test.go | 9 +- .../builder/test/ctags_to_prototypes_test.go | 58 +-- 8 files changed, 238 insertions(+), 236 deletions(-) rename src/arduino.cc/builder/{ => ctags}/ctags_parser.go (99%) rename src/arduino.cc/builder/{ => ctags}/ctags_runner.go (99%) rename src/arduino.cc/builder/{ => ctags}/ctags_to_prototypes.go (99%) diff --git a/src/arduino.cc/builder/collect_ctags_from_sketch_files.go b/src/arduino.cc/builder/collect_ctags_from_sketch_files.go index a836c4d3..471f3411 100644 --- a/src/arduino.cc/builder/collect_ctags_from_sketch_files.go +++ b/src/arduino.cc/builder/collect_ctags_from_sketch_files.go @@ -42,9 +42,9 @@ func (s *CollectCTagsFromSketchFiles) Run(context map[string]interface{}) error sketch := context[constants.CTX_SKETCH].(*types.Sketch) sketchFileNames := collectSketchFileNamesFrom(sketch) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + allCtags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) ctagsOfSketch := []*types.CTag{} - for _, ctag := range ctags { + for _, ctag := range allCtags { if utils.SliceContains(sketchFileNames, strings.Replace(ctag.Filename, "\\\\", "\\", -1)) { ctagsOfSketch = append(ctagsOfSketch, ctag) } diff --git a/src/arduino.cc/builder/container_add_prototypes.go b/src/arduino.cc/builder/container_add_prototypes.go index 427a3056..6c337af9 100644 --- a/src/arduino.cc/builder/container_add_prototypes.go +++ b/src/arduino.cc/builder/container_add_prototypes.go @@ -31,6 +31,7 @@ package builder import ( "arduino.cc/builder/constants" + "arduino.cc/builder/ctags" "arduino.cc/builder/types" "arduino.cc/builder/utils" ) @@ -42,10 +43,10 @@ func (s *ContainerAddPrototypes) Run(context map[string]interface{}) error { &GCCPreprocRunner{TargetFileName: constants.FILE_CTAGS_TARGET_FOR_GCC_MINUS_E}, &ReadFileAndStoreInContext{TargetField: constants.CTX_GCC_MINUS_E_SOURCE}, &CTagsTargetFileSaver{SourceField: constants.CTX_GCC_MINUS_E_SOURCE, TargetFileName: constants.FILE_CTAGS_TARGET_FOR_GCC_MINUS_E}, - &CTagsRunner{}, - &CTagsParser{}, + &ctags.CTagsRunner{}, + &ctags.CTagsParser{}, &CollectCTagsFromSketchFiles{}, - &CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, &PrototypesAdder{}, &SketchSaver{}, } diff --git a/src/arduino.cc/builder/ctags_parser.go b/src/arduino.cc/builder/ctags/ctags_parser.go similarity index 99% rename from src/arduino.cc/builder/ctags_parser.go rename to src/arduino.cc/builder/ctags/ctags_parser.go index 25fd9755..c3fdba5d 100644 --- a/src/arduino.cc/builder/ctags_parser.go +++ b/src/arduino.cc/builder/ctags/ctags_parser.go @@ -27,7 +27,7 @@ * Copyright 2015 Arduino LLC (http://www.arduino.cc/) */ -package builder +package ctags import ( "arduino.cc/builder/constants" diff --git a/src/arduino.cc/builder/ctags_runner.go b/src/arduino.cc/builder/ctags/ctags_runner.go similarity index 99% rename from src/arduino.cc/builder/ctags_runner.go rename to src/arduino.cc/builder/ctags/ctags_runner.go index 20c9eb7c..71d5ba4f 100644 --- a/src/arduino.cc/builder/ctags_runner.go +++ b/src/arduino.cc/builder/ctags/ctags_runner.go @@ -27,7 +27,7 @@ * Copyright 2015 Arduino LLC (http://www.arduino.cc/) */ -package builder +package ctags import ( "arduino.cc/builder/constants" diff --git a/src/arduino.cc/builder/ctags_to_prototypes.go b/src/arduino.cc/builder/ctags/ctags_to_prototypes.go similarity index 99% rename from src/arduino.cc/builder/ctags_to_prototypes.go rename to src/arduino.cc/builder/ctags/ctags_to_prototypes.go index fbefa1c5..73e05482 100644 --- a/src/arduino.cc/builder/ctags_to_prototypes.go +++ b/src/arduino.cc/builder/ctags/ctags_to_prototypes.go @@ -27,7 +27,7 @@ * Copyright 2015 Arduino LLC (http://www.arduino.cc/) */ -package builder +package ctags import ( "arduino.cc/builder/constants" diff --git a/src/arduino.cc/builder/test/ctags_parser_test.go b/src/arduino.cc/builder/test/ctags_parser_test.go index 9ab3bab3..9f671308 100644 --- a/src/arduino.cc/builder/test/ctags_parser_test.go +++ b/src/arduino.cc/builder/test/ctags_parser_test.go @@ -30,8 +30,8 @@ package test import ( - "arduino.cc/builder" "arduino.cc/builder/constants" + "arduino.cc/builder/ctags" "arduino.cc/builder/types" "github.com/stretchr/testify/require" "io/ioutil" @@ -47,44 +47,44 @@ func TestCTagsParserShouldListPrototypes(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 8, len(ctags)) + require.Equal(t, 8, len(tags)) idx := 0 - require.Equal(t, "server", ctags[idx].FunctionName) - require.Equal(t, "variable", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "server", tags[idx].FunctionName) + require.Equal(t, "variable", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) idx++ - require.Equal(t, "process", ctags[idx].FunctionName) - require.Equal(t, "prototype", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "process", tags[idx].FunctionName) + require.Equal(t, "prototype", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) idx++ - require.Equal(t, "process", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "process", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) idx++ - require.Equal(t, "digitalCommand", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "digitalCommand", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) idx++ - require.Equal(t, "analogCommand", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "analogCommand", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) idx++ - require.Equal(t, "modeCommand", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "/tmp/sketch7210316334309249705.cpp", ctags[idx].Filename) + require.Equal(t, "modeCommand", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "/tmp/sketch7210316334309249705.cpp", tags[idx].Filename) } func TestCTagsParserShouldListTemplates(t *testing.T) { @@ -95,24 +95,24 @@ func TestCTagsParserShouldListTemplates(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 3, len(ctags)) + require.Equal(t, 3, len(tags)) idx := 0 - require.Equal(t, "minimum", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "template T minimum (T a, T b);", ctags[idx].Prototype) + require.Equal(t, "minimum", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "template T minimum (T a, T b);", tags[idx].Prototype) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "void setup();", ctags[idx].Prototype) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "void setup();", tags[idx].Prototype) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "void loop();", ctags[idx].Prototype) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "void loop();", tags[idx].Prototype) } func TestCTagsParserShouldListTemplates2(t *testing.T) { @@ -123,26 +123,26 @@ func TestCTagsParserShouldListTemplates2(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 4, len(ctags)) + require.Equal(t, 4, len(tags)) idx := 0 - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "SRAM_writeAnything", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "template int SRAM_writeAnything(int ee, const T& value);", ctags[idx].Prototype) + require.Equal(t, "SRAM_writeAnything", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "template int SRAM_writeAnything(int ee, const T& value);", tags[idx].Prototype) idx++ - require.Equal(t, "SRAM_readAnything", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "template int SRAM_readAnything(int ee, T& value);", ctags[idx].Prototype) + require.Equal(t, "SRAM_readAnything", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "template int SRAM_readAnything(int ee, T& value);", tags[idx].Prototype) } func TestCTagsParserShouldDealWithClasses(t *testing.T) { @@ -153,18 +153,18 @@ func TestCTagsParserShouldDealWithClasses(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 2, len(ctags)) + require.Equal(t, 2, len(tags)) idx := 0 - require.Equal(t, "SleepCycle", ctags[idx].FunctionName) - require.Equal(t, "prototype", ctags[idx].Kind) + require.Equal(t, "SleepCycle", tags[idx].FunctionName) + require.Equal(t, "prototype", tags[idx].Kind) idx++ - require.Equal(t, "SleepCycle", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "SleepCycle", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserShouldDealWithStructs(t *testing.T) { @@ -175,28 +175,28 @@ func TestCTagsParserShouldDealWithStructs(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 5, len(ctags)) + require.Equal(t, 5, len(tags)) idx := 0 - require.Equal(t, "A_NEW_TYPE", ctags[idx].FunctionName) - require.Equal(t, "struct", ctags[idx].Kind) + require.Equal(t, "A_NEW_TYPE", tags[idx].FunctionName) + require.Equal(t, "struct", tags[idx].Kind) idx++ - require.Equal(t, "foo", ctags[idx].FunctionName) - require.Equal(t, "variable", ctags[idx].Kind) - require.Equal(t, "struct:A_NEW_TYPE", ctags[idx].Typeref) + require.Equal(t, "foo", tags[idx].FunctionName) + require.Equal(t, "variable", tags[idx].Kind) + require.Equal(t, "struct:A_NEW_TYPE", tags[idx].Typeref) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "dostuff", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "dostuff", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserShouldDealWithMacros(t *testing.T) { @@ -207,36 +207,36 @@ func TestCTagsParserShouldDealWithMacros(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 8, len(ctags)) + require.Equal(t, 8, len(tags)) idx := 0 - require.Equal(t, "DEBUG", ctags[idx].FunctionName) - require.Equal(t, "macro", ctags[idx].Kind) + require.Equal(t, "DEBUG", tags[idx].FunctionName) + require.Equal(t, "macro", tags[idx].Kind) idx++ - require.Equal(t, "DISABLED", ctags[idx].FunctionName) - require.Equal(t, "macro", ctags[idx].Kind) + require.Equal(t, "DISABLED", tags[idx].FunctionName) + require.Equal(t, "macro", tags[idx].Kind) idx++ - require.Equal(t, "hello", ctags[idx].FunctionName) - require.Equal(t, "variable", ctags[idx].Kind) + require.Equal(t, "hello", tags[idx].FunctionName) + require.Equal(t, "variable", tags[idx].Kind) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "debug", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "debug", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "disabledIsDefined", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "disabledIsDefined", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "useMyType", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "useMyType", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserShouldDealFunctionWithDifferentSignatures(t *testing.T) { @@ -247,21 +247,21 @@ func TestCTagsParserShouldDealFunctionWithDifferentSignatures(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 3, len(ctags)) + require.Equal(t, 3, len(tags)) idx := 0 - require.Equal(t, "getBytes", ctags[idx].FunctionName) - require.Equal(t, "prototype", ctags[idx].Kind) + require.Equal(t, "getBytes", tags[idx].FunctionName) + require.Equal(t, "prototype", tags[idx].Kind) idx++ - require.Equal(t, "getBytes", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "getBytes", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "getBytes", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "getBytes", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserClassMembersAreFilteredOut(t *testing.T) { @@ -272,30 +272,30 @@ func TestCTagsParserClassMembersAreFilteredOut(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 5, len(ctags)) + require.Equal(t, 5, len(tags)) idx := 0 - require.Equal(t, "set_values", ctags[idx].FunctionName) - require.Equal(t, "prototype", ctags[idx].Kind) - require.Equal(t, "Rectangle", ctags[idx].Class) + require.Equal(t, "set_values", tags[idx].FunctionName) + require.Equal(t, "prototype", tags[idx].Kind) + require.Equal(t, "Rectangle", tags[idx].Class) idx++ - require.Equal(t, "area", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "Rectangle", ctags[idx].Class) + require.Equal(t, "area", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "Rectangle", tags[idx].Class) idx++ - require.Equal(t, "set_values", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "Rectangle", ctags[idx].Class) + require.Equal(t, "set_values", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "Rectangle", tags[idx].Class) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserStructWithFunctions(t *testing.T) { @@ -306,38 +306,38 @@ func TestCTagsParserStructWithFunctions(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 8, len(ctags)) + require.Equal(t, 8, len(tags)) idx := 0 - require.Equal(t, "sensorData", ctags[idx].FunctionName) - require.Equal(t, "struct", ctags[idx].Kind) + require.Equal(t, "sensorData", tags[idx].FunctionName) + require.Equal(t, "struct", tags[idx].Kind) idx++ - require.Equal(t, "sensorData", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "sensorData", ctags[idx].Struct) + require.Equal(t, "sensorData", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "sensorData", tags[idx].Struct) idx++ - require.Equal(t, "sensorData", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "sensorData", ctags[idx].Struct) + require.Equal(t, "sensorData", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "sensorData", tags[idx].Struct) idx++ - require.Equal(t, "sensors", ctags[idx].FunctionName) - require.Equal(t, "variable", ctags[idx].Kind) + require.Equal(t, "sensors", tags[idx].FunctionName) + require.Equal(t, "variable", tags[idx].Kind) idx++ - require.Equal(t, "sensor1", ctags[idx].FunctionName) - require.Equal(t, "variable", ctags[idx].Kind) + require.Equal(t, "sensor1", tags[idx].FunctionName) + require.Equal(t, "variable", tags[idx].Kind) idx++ - require.Equal(t, "sensor2", ctags[idx].FunctionName) - require.Equal(t, "variable", ctags[idx].Kind) + require.Equal(t, "sensor2", tags[idx].FunctionName) + require.Equal(t, "variable", tags[idx].Kind) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserDefaultArguments(t *testing.T) { @@ -348,22 +348,22 @@ func TestCTagsParserDefaultArguments(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 3, len(ctags)) + require.Equal(t, 3, len(tags)) idx := 0 - require.Equal(t, "test", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "void test(int x = 1);", ctags[idx].Prototype) + require.Equal(t, "test", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "void test(int x = 1);", tags[idx].Prototype) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserNamespace(t *testing.T) { @@ -374,22 +374,22 @@ func TestCTagsParserNamespace(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 3, len(ctags)) + require.Equal(t, 3, len(tags)) idx := 0 - require.Equal(t, "value", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "Test", ctags[idx].Namespace) + require.Equal(t, "value", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "Test", tags[idx].Namespace) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserStatic(t *testing.T) { @@ -400,21 +400,21 @@ func TestCTagsParserStatic(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 3, len(ctags)) + require.Equal(t, 3, len(tags)) idx := 0 - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "doStuff", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "doStuff", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserFunctionPointer(t *testing.T) { @@ -425,24 +425,24 @@ func TestCTagsParserFunctionPointer(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 4, len(ctags)) + require.Equal(t, 4, len(tags)) idx := 0 - require.Equal(t, "t1Callback", ctags[idx].FunctionName) - require.Equal(t, "variable", ctags[idx].Kind) + require.Equal(t, "t1Callback", tags[idx].FunctionName) + require.Equal(t, "variable", tags[idx].Kind) idx++ - require.Equal(t, "t1Callback", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "t1Callback", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) } func TestCTagsParserFunctionPointers(t *testing.T) { @@ -453,27 +453,27 @@ func TestCTagsParserFunctionPointers(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) - ctagsParser := builder.CTagsParser{} + ctagsParser := ctags.CTagsParser{} ctagsParser.Run(context) - ctags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) + tags := context[constants.CTX_CTAGS_OF_PREPROC_SOURCE].([]*types.CTag) - require.Equal(t, 5, len(ctags)) + require.Equal(t, 5, len(tags)) idx := 0 - require.Equal(t, "setup", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "setup", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "loop", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "loop", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "func", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) + require.Equal(t, "func", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) idx++ - require.Equal(t, "funcArr", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "int funcArr();", ctags[idx].Prototype) + require.Equal(t, "funcArr", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "int funcArr();", tags[idx].Prototype) idx++ - require.Equal(t, "funcCombo", ctags[idx].FunctionName) - require.Equal(t, "function", ctags[idx].Kind) - require.Equal(t, "void funcCombo(void (*(&in)[5])(int));", ctags[idx].Prototype) -} \ No newline at end of file + require.Equal(t, "funcCombo", tags[idx].FunctionName) + require.Equal(t, "function", tags[idx].Kind) + require.Equal(t, "void funcCombo(void (*(&in)[5])(int));", tags[idx].Prototype) +} diff --git a/src/arduino.cc/builder/test/ctags_runner_test.go b/src/arduino.cc/builder/test/ctags_runner_test.go index 9abab566..ab75fed3 100644 --- a/src/arduino.cc/builder/test/ctags_runner_test.go +++ b/src/arduino.cc/builder/test/ctags_runner_test.go @@ -32,6 +32,7 @@ package test import ( "arduino.cc/builder" "arduino.cc/builder/constants" + "arduino.cc/builder/ctags" "arduino.cc/builder/types" "github.com/stretchr/testify/require" "os" @@ -70,7 +71,7 @@ func TestCTagsRunner(t *testing.T) { &builder.PrintUsedLibrariesIfVerbose{}, &builder.WarnAboutArchIncompatibleLibraries{}, &builder.CTagsTargetFileSaver{SourceField: constants.CTX_SOURCE, TargetFileName: constants.FILE_CTAGS_TARGET}, - &builder.CTagsRunner{}, + &ctags.CTagsRunner{}, } for _, command := range commands { @@ -120,7 +121,7 @@ func TestCTagsRunnerSketchWithClass(t *testing.T) { &builder.PrintUsedLibrariesIfVerbose{}, &builder.WarnAboutArchIncompatibleLibraries{}, &builder.CTagsTargetFileSaver{SourceField: constants.CTX_SOURCE, TargetFileName: constants.FILE_CTAGS_TARGET}, - &builder.CTagsRunner{}, + &ctags.CTagsRunner{}, } for _, command := range commands { @@ -168,7 +169,7 @@ func TestCTagsRunnerSketchWithTypename(t *testing.T) { &builder.PrintUsedLibrariesIfVerbose{}, &builder.WarnAboutArchIncompatibleLibraries{}, &builder.CTagsTargetFileSaver{SourceField: constants.CTX_SOURCE, TargetFileName: constants.FILE_CTAGS_TARGET}, - &builder.CTagsRunner{}, + &ctags.CTagsRunner{}, } for _, command := range commands { @@ -215,7 +216,7 @@ func TestCTagsRunnerSketchWithNamespace(t *testing.T) { &builder.PrintUsedLibrariesIfVerbose{}, &builder.WarnAboutArchIncompatibleLibraries{}, &builder.CTagsTargetFileSaver{SourceField: constants.CTX_SOURCE, TargetFileName: constants.FILE_CTAGS_TARGET}, - &builder.CTagsRunner{}, + &ctags.CTagsRunner{}, } for _, command := range commands { diff --git a/src/arduino.cc/builder/test/ctags_to_prototypes_test.go b/src/arduino.cc/builder/test/ctags_to_prototypes_test.go index c0a4ed6c..57048be0 100644 --- a/src/arduino.cc/builder/test/ctags_to_prototypes_test.go +++ b/src/arduino.cc/builder/test/ctags_to_prototypes_test.go @@ -30,8 +30,8 @@ package test import ( - "arduino.cc/builder" "arduino.cc/builder/constants" + "arduino.cc/builder/ctags" "arduino.cc/builder/types" "github.com/stretchr/testify/require" "io/ioutil" @@ -48,9 +48,9 @@ func TestCTagsToPrototypesShouldListPrototypes(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -81,9 +81,9 @@ func TestCTagsToPrototypesShouldListTemplates(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -112,9 +112,9 @@ func TestCTagsToPrototypesShouldListTemplates2(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -144,9 +144,9 @@ func TestCTagsToPrototypesShouldDealWithClasses(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -171,9 +171,9 @@ func TestCTagsToPrototypesShouldDealWithStructs(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -202,9 +202,9 @@ func TestCTagsToPrototypesShouldDealWithMacros(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -235,9 +235,9 @@ func TestCTagsToPrototypesShouldDealFunctionWithDifferentSignatures(t *testing.T context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -264,9 +264,9 @@ func TestCTagsToPrototypesClassMembersAreFilteredOut(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -294,9 +294,9 @@ func TestCTagsToPrototypesStructWithFunctions(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -324,9 +324,9 @@ func TestCTagsToPrototypesDefaultArguments(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -354,9 +354,9 @@ func TestCTagsToPrototypesNamespace(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -384,9 +384,9 @@ func TestCTagsToPrototypesStatic(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -416,9 +416,9 @@ func TestCTagsToPrototypesFunctionPointer(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { @@ -447,9 +447,9 @@ func TestCTagsToPrototypesFunctionPointers(t *testing.T) { context[constants.CTX_CTAGS_OUTPUT] = string(bytes) commands := []types.Command{ - &builder.CTagsParser{}, + &ctags.CTagsParser{}, &CopyContextKeys{From: constants.CTX_CTAGS_OF_PREPROC_SOURCE, To: constants.CTX_COLLECTED_CTAGS}, - &builder.CTagsToPrototypes{}, + &ctags.CTagsToPrototypes{}, } for _, command := range commands { From 505cc4a27862a04ca9969a35a69198a1ba2b8d76 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 14 Dec 2015 00:16:05 +0100 Subject: [PATCH 4/6] Introduce explicit PropertiesMap type This simplify the use of map[string]string in most cases and remove redundant utility functions. Signed-off-by: Cristian Maglie --- ...operties_from_parent_platform_txt_files.go | 10 ++-- src/arduino.cc/builder/builder_utils/utils.go | 26 ++++----- src/arduino.cc/builder/coan_runner.go | 7 ++- .../builder/container_find_includes.go | 2 +- src/arduino.cc/builder/ctags/ctags_runner.go | 7 ++- .../builder/dump_build_properties.go | 3 +- src/arduino.cc/builder/gcc_preproc_runner.go | 9 ++- src/arduino.cc/builder/hardware_loader.go | 20 ++++--- .../builder/includes_finder_with_gcc.go | 8 ++- .../builder/includes_to_include_folders.go | 7 ++- .../load_vid_pid_specific_properties.go | 10 ++-- .../builder/merge_sketch_with_bootloader.go | 4 +- src/arduino.cc/builder/phases/core_builder.go | 5 +- .../builder/phases/libraries_builder.go | 7 ++- src/arduino.cc/builder/phases/linker.go | 9 +-- .../builder/phases/sketch_builder.go | 3 +- src/arduino.cc/builder/props/properties.go | 56 ++++++++++++++----- src/arduino.cc/builder/recipe_runner.go | 8 ++- .../builder/set_custom_build_properties.go | 2 +- .../builder/setup_build_properties.go | 9 +-- .../builder/target_board_resolver.go | 9 ++- .../load_vid_pid_specific_properties_test.go | 5 +- .../test/merge_sketch_with_bootloader_test.go | 3 +- .../builder/test/properties_test.go | 20 +++---- .../builder/test/recipe_runner_test.go | 3 +- .../test/setup_build_properties_test.go | 10 ++-- src/arduino.cc/builder/types/types.go | 23 ++++++-- src/arduino.cc/builder/utils/utils.go | 38 ------------- .../warn_about_arch_incompatible_libraries.go | 3 +- 29 files changed, 177 insertions(+), 149 deletions(-) diff --git a/src/arduino.cc/builder/add_missing_build_properties_from_parent_platform_txt_files.go b/src/arduino.cc/builder/add_missing_build_properties_from_parent_platform_txt_files.go index 0c613515..bf268070 100644 --- a/src/arduino.cc/builder/add_missing_build_properties_from_parent_platform_txt_files.go +++ b/src/arduino.cc/builder/add_missing_build_properties_from_parent_platform_txt_files.go @@ -31,8 +31,8 @@ package builder import ( "arduino.cc/builder/constants" + "arduino.cc/builder/props" "arduino.cc/builder/types" - "arduino.cc/builder/utils" ) type AddMissingBuildPropertiesFromParentPlatformTxtFiles struct{} @@ -40,11 +40,13 @@ type AddMissingBuildPropertiesFromParentPlatformTxtFiles struct{} func (s *AddMissingBuildPropertiesFromParentPlatformTxtFiles) Run(context map[string]interface{}) error { packages := context[constants.CTX_HARDWARE].(*types.Packages) targetPackage := context[constants.CTX_TARGET_PACKAGE].(*types.Package) - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) - buildProperties = utils.MergeMapsOfStrings(make(map[string]string), packages.Properties, targetPackage.Properties, buildProperties) + newBuildProperties := packages.Properties.Clone() + newBuildProperties.Merge(targetPackage.Properties) + newBuildProperties.Merge(buildProperties) - context[constants.CTX_BUILD_PROPERTIES] = buildProperties + context[constants.CTX_BUILD_PROPERTIES] = newBuildProperties return nil } diff --git a/src/arduino.cc/builder/builder_utils/utils.go b/src/arduino.cc/builder/builder_utils/utils.go index 18ab284e..9d0dc06d 100644 --- a/src/arduino.cc/builder/builder_utils/utils.go +++ b/src/arduino.cc/builder/builder_utils/utils.go @@ -42,7 +42,7 @@ import ( "strings" ) -func CompileFilesRecursive(objectFiles []string, sourcePath string, buildPath string, buildProperties map[string]string, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { +func CompileFilesRecursive(objectFiles []string, sourcePath string, buildPath string, buildProperties props.PropertiesMap, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { objectFiles, err := CompileFiles(objectFiles, sourcePath, false, buildPath, buildProperties, includes, verbose, warningsLevel, logger) if err != nil { return nil, utils.WrapError(err) @@ -63,7 +63,7 @@ func CompileFilesRecursive(objectFiles []string, sourcePath string, buildPath st return objectFiles, nil } -func CompileFiles(objectFiles []string, sourcePath string, recurse bool, buildPath string, buildProperties map[string]string, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { +func CompileFiles(objectFiles []string, sourcePath string, recurse bool, buildPath string, buildProperties props.PropertiesMap, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { objectFiles, err := compileFilesWithExtensionWithRecipe(objectFiles, sourcePath, recurse, buildPath, buildProperties, includes, ".S", constants.RECIPE_S_PATTERN, verbose, warningsLevel, logger) if err != nil { return nil, utils.WrapError(err) @@ -79,7 +79,7 @@ func CompileFiles(objectFiles []string, sourcePath string, recurse bool, buildPa return objectFiles, nil } -func compileFilesWithExtensionWithRecipe(objectFiles []string, sourcePath string, recurse bool, buildPath string, buildProperties map[string]string, includes []string, extension string, recipe string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { +func compileFilesWithExtensionWithRecipe(objectFiles []string, sourcePath string, recurse bool, buildPath string, buildProperties props.PropertiesMap, includes []string, extension string, recipe string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { sources, err := findFilesInFolder(sourcePath, extension, recurse) if err != nil { return nil, utils.WrapError(err) @@ -115,7 +115,7 @@ func findFilesInFolder(sourcePath string, extension string, recurse bool) ([]str return sources, nil } -func compileFilesWithRecipe(objectFiles []string, sourcePath string, sources []string, buildPath string, buildProperties map[string]string, includes []string, recipe string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { +func compileFilesWithRecipe(objectFiles []string, sourcePath string, sources []string, buildPath string, buildProperties props.PropertiesMap, includes []string, recipe string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { for _, source := range sources { objectFile, err := compileFileWithRecipe(sourcePath, source, buildPath, buildProperties, includes, recipe, verbose, warningsLevel, logger) if err != nil { @@ -127,8 +127,8 @@ func compileFilesWithRecipe(objectFiles []string, sourcePath string, sources []s return objectFiles, nil } -func compileFileWithRecipe(sourcePath string, source string, buildPath string, buildProperties map[string]string, includes []string, recipe string, verbose bool, warningsLevel string, logger i18n.Logger) (string, error) { - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties) +func compileFileWithRecipe(sourcePath string, source string, buildPath string, buildProperties props.PropertiesMap, includes []string, recipe string, verbose bool, warningsLevel string, logger i18n.Logger) (string, error) { + properties := buildProperties.Clone() properties[constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS] = properties[constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS+"."+warningsLevel] properties[constants.BUILD_PROPERTIES_INCLUDES] = strings.Join(includes, constants.SPACE) properties[constants.BUILD_PROPERTIES_SOURCE_FILE] = source @@ -255,7 +255,7 @@ func nonEmptyString(s string) bool { return s != constants.EMPTY_STRING } -func ArchiveCompiledFiles(buildPath string, archiveFile string, objectFiles []string, buildProperties map[string]string, verbose bool, logger i18n.Logger) (string, error) { +func ArchiveCompiledFiles(buildPath string, archiveFile string, objectFiles []string, buildProperties props.PropertiesMap, verbose bool, logger i18n.Logger) (string, error) { archiveFilePath := filepath.Join(buildPath, archiveFile) if _, err := os.Stat(archiveFilePath); err == nil { err = os.Remove(archiveFilePath) @@ -265,7 +265,7 @@ func ArchiveCompiledFiles(buildPath string, archiveFile string, objectFiles []st } for _, objectFile := range objectFiles { - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties) + properties := buildProperties.Clone() properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE] = filepath.Base(archiveFilePath) properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE_PATH] = archiveFilePath properties[constants.BUILD_PROPERTIES_OBJECT_FILE] = objectFile @@ -279,7 +279,7 @@ func ArchiveCompiledFiles(buildPath string, archiveFile string, objectFiles []st return archiveFilePath, nil } -func ExecRecipe(properties map[string]string, recipe string, removeUnsetProperties bool, echoCommandLine bool, echoOutput bool, logger i18n.Logger) ([]byte, error) { +func ExecRecipe(properties props.PropertiesMap, recipe string, removeUnsetProperties bool, echoCommandLine bool, echoOutput bool, logger i18n.Logger) ([]byte, error) { command, err := PrepareCommandForRecipe(properties, recipe, removeUnsetProperties, echoCommandLine, echoOutput, logger) if err != nil { return nil, utils.WrapError(err) @@ -300,14 +300,14 @@ func ExecRecipe(properties map[string]string, recipe string, removeUnsetProperti return bytes, utils.WrapError(err) } -func PrepareCommandForRecipe(properties map[string]string, recipe string, removeUnsetProperties bool, echoCommandLine bool, echoOutput bool, logger i18n.Logger) (*exec.Cmd, error) { +func PrepareCommandForRecipe(properties props.PropertiesMap, recipe string, removeUnsetProperties bool, echoCommandLine bool, echoOutput bool, logger i18n.Logger) (*exec.Cmd, error) { pattern := properties[recipe] if pattern == constants.EMPTY_STRING { return nil, utils.ErrorfWithLogger(logger, constants.MSG_PATTERN_MISSING, recipe) } var err error - commandLine := props.ExpandPropsInString(properties, pattern) + commandLine := properties.ExpandPropsInString(pattern) if removeUnsetProperties { commandLine, err = props.DeleteUnexpandedPropsFromString(commandLine) if err != nil { @@ -327,7 +327,7 @@ func PrepareCommandForRecipe(properties map[string]string, recipe string, remove return command, nil } -func ExecRecipeCollectStdErr(properties map[string]string, recipe string, removeUnsetProperties bool, echoCommandLine bool, echoOutput bool, logger i18n.Logger) (string, error) { +func ExecRecipeCollectStdErr(properties props.PropertiesMap, recipe string, removeUnsetProperties bool, echoCommandLine bool, echoOutput bool, logger i18n.Logger) (string, error) { command, err := PrepareCommandForRecipe(properties, recipe, removeUnsetProperties, echoCommandLine, echoOutput, logger) if err != nil { return "", utils.WrapError(err) @@ -339,6 +339,6 @@ func ExecRecipeCollectStdErr(properties map[string]string, recipe string, remove return string(buffer.Bytes()), nil } -func RemoveHyphenMDDFlagFromGCCCommandLine(properties map[string]string) { +func RemoveHyphenMDDFlagFromGCCCommandLine(properties props.PropertiesMap) { properties[constants.BUILD_PROPERTIES_COMPILER_CPP_FLAGS] = strings.Replace(properties[constants.BUILD_PROPERTIES_COMPILER_CPP_FLAGS], "-MMD", "", -1) } diff --git a/src/arduino.cc/builder/coan_runner.go b/src/arduino.cc/builder/coan_runner.go index f4630621..01420d2f 100644 --- a/src/arduino.cc/builder/coan_runner.go +++ b/src/arduino.cc/builder/coan_runner.go @@ -60,8 +60,9 @@ func (s *CoanRunner) Run(context map[string]interface{}) error { return utils.WrapError(err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties, props.SubTree(props.SubTree(buildProperties, constants.BUILD_PROPERTIES_TOOLS_KEY), constants.COAN)) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) + properties := buildProperties.Clone() + properties.Merge(buildProperties.SubTree(constants.BUILD_PROPERTIES_TOOLS_KEY).SubTree(constants.COAN)) properties[constants.BUILD_PROPERTIES_SOURCE_FILE] = coanTargetFileName pattern := properties[constants.BUILD_PROPERTIES_PATTERN] @@ -70,7 +71,7 @@ func (s *CoanRunner) Run(context map[string]interface{}) error { } logger := context[constants.CTX_LOGGER].(i18n.Logger) - commandLine := props.ExpandPropsInString(properties, pattern) + commandLine := properties.ExpandPropsInString(pattern) command, err := utils.PrepareCommandFilteredArgs(commandLine, filterAllowedArg, logger) if verbose { diff --git a/src/arduino.cc/builder/container_find_includes.go b/src/arduino.cc/builder/container_find_includes.go index 35408f21..ae6a2396 100644 --- a/src/arduino.cc/builder/container_find_includes.go +++ b/src/arduino.cc/builder/container_find_includes.go @@ -55,7 +55,7 @@ func (s *ContainerFindIncludes) Run(context map[string]interface{}) error { foldersWithSources.Push(types.SourceFolder{Folder: context[constants.CTX_SKETCH_BUILD_PATH].(string), Recurse: true}) if utils.MapHas(context, constants.CTX_IMPORTED_LIBRARIES) { for _, library := range context[constants.CTX_IMPORTED_LIBRARIES].([]*types.Library) { - sourceFolders := utils.LibraryToSourceFolder(library) + sourceFolders := types.LibraryToSourceFolder(library) for _, sourceFolder := range sourceFolders { foldersWithSources.Push(sourceFolder) } diff --git a/src/arduino.cc/builder/ctags/ctags_runner.go b/src/arduino.cc/builder/ctags/ctags_runner.go index 71d5ba4f..4a603fd9 100644 --- a/src/arduino.cc/builder/ctags/ctags_runner.go +++ b/src/arduino.cc/builder/ctags/ctags_runner.go @@ -40,11 +40,12 @@ import ( type CTagsRunner struct{} func (s *CTagsRunner) Run(context map[string]interface{}) error { - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) ctagsTargetFilePath := context[constants.CTX_CTAGS_TEMP_FILE_PATH].(string) logger := context[constants.CTX_LOGGER].(i18n.Logger) - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties, props.SubTree(props.SubTree(buildProperties, constants.BUILD_PROPERTIES_TOOLS_KEY), constants.CTAGS)) + properties := buildProperties.Clone() + properties.Merge(buildProperties.SubTree(constants.BUILD_PROPERTIES_TOOLS_KEY).SubTree(constants.CTAGS)) properties[constants.BUILD_PROPERTIES_SOURCE_FILE] = ctagsTargetFilePath pattern := properties[constants.BUILD_PROPERTIES_PATTERN] @@ -52,7 +53,7 @@ func (s *CTagsRunner) Run(context map[string]interface{}) error { return utils.Errorf(context, constants.MSG_PATTERN_MISSING, constants.CTAGS) } - commandLine := props.ExpandPropsInString(properties, pattern) + commandLine := properties.ExpandPropsInString(pattern) command, err := utils.PrepareCommand(commandLine, logger) if err != nil { return utils.WrapError(err) diff --git a/src/arduino.cc/builder/dump_build_properties.go b/src/arduino.cc/builder/dump_build_properties.go index 08a5f850..41db23f2 100644 --- a/src/arduino.cc/builder/dump_build_properties.go +++ b/src/arduino.cc/builder/dump_build_properties.go @@ -31,6 +31,7 @@ package builder import ( "arduino.cc/builder/constants" + "arduino.cc/builder/props" "arduino.cc/builder/utils" "fmt" "sort" @@ -39,7 +40,7 @@ import ( type DumpBuildProperties struct{} func (s *DumpBuildProperties) Run(context map[string]interface{}) error { - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) keys := utils.KeysOfMapOfString(buildProperties) sort.Strings(keys) diff --git a/src/arduino.cc/builder/gcc_preproc_runner.go b/src/arduino.cc/builder/gcc_preproc_runner.go index 5c5b87d1..a89e9514 100644 --- a/src/arduino.cc/builder/gcc_preproc_runner.go +++ b/src/arduino.cc/builder/gcc_preproc_runner.go @@ -33,6 +33,7 @@ import ( "arduino.cc/builder/builder_utils" "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/types" "arduino.cc/builder/utils" "path/filepath" @@ -86,7 +87,7 @@ func (s *GCCPreprocRunnerForDiscoveringIncludes) Run(context map[string]interfac return nil } -func prepareGCCPreprocRecipeProperties(context map[string]interface{}, sourceFilePath string, targetFilePath string) (map[string]string, string, error) { +func prepareGCCPreprocRecipeProperties(context map[string]interface{}, sourceFilePath string, targetFilePath string) (props.PropertiesMap, string, error) { if targetFilePath != utils.NULLFile() { preprocPath := context[constants.CTX_PREPROC_PATH].(string) err := utils.EnsureFolderExists(preprocPath) @@ -96,8 +97,10 @@ func prepareGCCPreprocRecipeProperties(context map[string]interface{}, sourceFil targetFilePath = filepath.Join(preprocPath, targetFilePath) } - buildProperties := utils.GetMapStringStringOrDefault(context, constants.CTX_BUILD_PROPERTIES) - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties) + properties := make(props.PropertiesMap) + if p, ok := context[constants.CTX_BUILD_PROPERTIES]; ok { + properties = p.(props.PropertiesMap).Clone() + } properties[constants.BUILD_PROPERTIES_SOURCE_FILE] = sourceFilePath properties[constants.BUILD_PROPERTIES_PREPROCESSED_FILE_PATH] = targetFilePath diff --git a/src/arduino.cc/builder/hardware_loader.go b/src/arduino.cc/builder/hardware_loader.go index 87428166..29dce302 100644 --- a/src/arduino.cc/builder/hardware_loader.go +++ b/src/arduino.cc/builder/hardware_loader.go @@ -67,7 +67,7 @@ func (s *HardwareLoader) Run(context map[string]interface{}) error { if err != nil { return utils.WrapError(err) } - packages.Properties = utils.MergeMapsOfStrings(packages.Properties, hardwarePlatformTxt) + packages.Properties.Merge(hardwarePlatformTxt) subfolders, err := utils.ReadDirFiltered(folder, utils.FilterDirs) if err != nil { @@ -115,7 +115,7 @@ func loadPackage(targetPackage *types.Package, folder string, logger i18n.Logger if err != nil { return utils.WrapError(err) } - targetPackage.Properties = utils.MergeMapsOfStrings(targetPackage.Properties, packagePlatformTxt) + targetPackage.Properties.Merge(packagePlatformTxt) subfolders, err := utils.ReadDirFiltered(folder, utils.FilterDirs) if err != nil { @@ -161,7 +161,7 @@ func getOrCreatePlatform(platforms map[string]*types.Platform, platformId string targetPlatform.PlatformId = platformId targetPlatform.Boards = make(map[string]*types.Board) targetPlatform.Properties = make(map[string]string) - targetPlatform.Programmers = make(map[string]map[string]string) + targetPlatform.Programmers = make(map[string]props.PropertiesMap) return &targetPlatform } @@ -195,13 +195,15 @@ func loadPlatform(targetPlatform *types.Platform, packageId string, folder strin return utils.WrapError(err) } - targetPlatform.Properties = utils.MergeMapsOfStrings(make(map[string]string), targetPlatform.Properties, platformTxt, localPlatformProperties) + targetPlatform.Properties = targetPlatform.Properties.Clone() + targetPlatform.Properties.Merge(platformTxt) + targetPlatform.Properties.Merge(localPlatformProperties) programmersProperties, err := props.SafeLoad(filepath.Join(folder, constants.FILE_PROGRAMMERS_TXT), logger) if err != nil { return utils.WrapError(err) } - targetPlatform.Programmers = utils.MergeMapsOfMapsOfStrings(make(map[string]map[string]string), targetPlatform.Programmers, props.FirstLevelOf(programmersProperties)) + targetPlatform.Programmers = props.MergeMapsOfProperties(make(map[string]props.PropertiesMap), targetPlatform.Programmers, programmersProperties.FirstLevelOf()) return nil } @@ -227,15 +229,15 @@ func loadBoards(boards map[string]*types.Board, packageId string, platformId str return utils.WrapError(err) } - properties = utils.MergeMapsOfStrings(properties, localProperties) + properties = properties.Merge(localProperties) - propertiesByBoardId := props.FirstLevelOf(properties) + propertiesByBoardId := properties.FirstLevelOf() delete(propertiesByBoardId, constants.BOARD_PROPERTIES_MENU) for boardId, properties := range propertiesByBoardId { properties[constants.ID] = boardId board := getOrCreateBoard(boards, boardId) - board.Properties = utils.MergeMapsOfStrings(board.Properties, properties) + board.Properties.Merge(properties) boards[boardId] = board } @@ -249,7 +251,7 @@ func getOrCreateBoard(boards map[string]*types.Board, boardId string) *types.Boa board := types.Board{} board.BoardId = boardId - board.Properties = make(map[string]string) + board.Properties = make(props.PropertiesMap) return &board } diff --git a/src/arduino.cc/builder/includes_finder_with_gcc.go b/src/arduino.cc/builder/includes_finder_with_gcc.go index e633e632..f1bb93a8 100644 --- a/src/arduino.cc/builder/includes_finder_with_gcc.go +++ b/src/arduino.cc/builder/includes_finder_with_gcc.go @@ -33,6 +33,7 @@ import ( "arduino.cc/builder/builder_utils" "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/utils" "strings" ) @@ -42,7 +43,10 @@ type IncludesFinderWithGCC struct { } func (s *IncludesFinderWithGCC) Run(context map[string]interface{}) error { - buildProperties := utils.GetMapStringStringOrDefault(context, constants.CTX_BUILD_PROPERTIES) + buildProperties := make(props.PropertiesMap) + if p, ok := context[constants.CTX_BUILD_PROPERTIES]; ok { + buildProperties = p.(props.PropertiesMap).Clone() + } verbose := context[constants.CTX_VERBOSE].(bool) logger := context[constants.CTX_LOGGER].(i18n.Logger) @@ -53,7 +57,7 @@ func (s *IncludesFinderWithGCC) Run(context map[string]interface{}) error { includesParams = strings.Join(includes, " ") } - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties) + properties := buildProperties.Clone() properties[constants.BUILD_PROPERTIES_SOURCE_FILE] = s.SourceFile properties[constants.BUILD_PROPERTIES_INCLUDES] = includesParams builder_utils.RemoveHyphenMDDFlagFromGCCCommandLine(properties) diff --git a/src/arduino.cc/builder/includes_to_include_folders.go b/src/arduino.cc/builder/includes_to_include_folders.go index 29bbea78..1c52d8a2 100644 --- a/src/arduino.cc/builder/includes_to_include_folders.go +++ b/src/arduino.cc/builder/includes_to_include_folders.go @@ -31,6 +31,7 @@ package builder import ( "arduino.cc/builder/constants" + "arduino.cc/builder/props" "arduino.cc/builder/types" "arduino.cc/builder/utils" "path/filepath" @@ -67,7 +68,7 @@ func (s *IncludesToIncludeFolders) Run(context map[string]interface{}) error { for _, newlyImportedLibrary := range newlyImportedLibraries { if !sliceContainsLibrary(importedLibraries, newlyImportedLibrary) { importedLibraries = append(importedLibraries, newlyImportedLibrary) - sourceFolders := utils.LibraryToSourceFolder(newlyImportedLibrary) + sourceFolders := types.LibraryToSourceFolder(newlyImportedLibrary) for _, sourceFolder := range sourceFolders { foldersWithSources.Push(sourceFolder) } @@ -76,7 +77,7 @@ func (s *IncludesToIncludeFolders) Run(context map[string]interface{}) error { context[constants.CTX_IMPORTED_LIBRARIES] = importedLibraries - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) verbose := context[constants.CTX_VERBOSE].(bool) includeFolders := resolveIncludeFolders(newlyImportedLibraries, buildProperties, verbose) context[constants.CTX_INCLUDE_FOLDERS] = includeFolders @@ -84,7 +85,7 @@ func (s *IncludesToIncludeFolders) Run(context map[string]interface{}) error { return nil } -func resolveIncludeFolders(importedLibraries []*types.Library, buildProperties map[string]string, verbose bool) []string { +func resolveIncludeFolders(importedLibraries []*types.Library, buildProperties props.PropertiesMap, verbose bool) []string { var includeFolders []string includeFolders = append(includeFolders, buildProperties[constants.BUILD_PROPERTIES_BUILD_CORE_PATH]) if buildProperties[constants.BUILD_PROPERTIES_BUILD_VARIANT_PATH] != constants.EMPTY_STRING { diff --git a/src/arduino.cc/builder/load_vid_pid_specific_properties.go b/src/arduino.cc/builder/load_vid_pid_specific_properties.go index 41ecf1bc..3f7ccd2d 100644 --- a/src/arduino.cc/builder/load_vid_pid_specific_properties.go +++ b/src/arduino.cc/builder/load_vid_pid_specific_properties.go @@ -50,7 +50,7 @@ func (s *LoadVIDPIDSpecificProperties) Run(context map[string]interface{}) error vid := vidPidParts[0] pid := vidPidParts[1] - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) VIDPIDIndex, err := findVIDPIDIndex(buildProperties, vid, pid) if err != nil { return utils.WrapError(err) @@ -59,14 +59,14 @@ func (s *LoadVIDPIDSpecificProperties) Run(context map[string]interface{}) error return nil } - vidPidSpecificProperties := props.SubTree(props.SubTree(buildProperties, constants.BUILD_PROPERTIES_VID), strconv.Itoa(VIDPIDIndex)) - utils.MergeMapsOfStrings(buildProperties, vidPidSpecificProperties) + vidPidSpecificProperties := buildProperties.SubTree(constants.BUILD_PROPERTIES_VID).SubTree(strconv.Itoa(VIDPIDIndex)) + buildProperties.Merge(vidPidSpecificProperties) return nil } -func findVIDPIDIndex(buildProperties map[string]string, vid, pid string) (int, error) { - for key, value := range props.SubTree(buildProperties, constants.BUILD_PROPERTIES_VID) { +func findVIDPIDIndex(buildProperties props.PropertiesMap, vid, pid string) (int, error) { + for key, value := range buildProperties.SubTree(constants.BUILD_PROPERTIES_VID) { if !strings.Contains(key, ".") { if vid == strings.ToLower(value) && pid == strings.ToLower(buildProperties[constants.BUILD_PROPERTIES_PID+"."+key]) { return strconv.Atoi(key) diff --git a/src/arduino.cc/builder/merge_sketch_with_bootloader.go b/src/arduino.cc/builder/merge_sketch_with_bootloader.go index 0d73afc4..abac2d87 100644 --- a/src/arduino.cc/builder/merge_sketch_with_bootloader.go +++ b/src/arduino.cc/builder/merge_sketch_with_bootloader.go @@ -43,7 +43,7 @@ import ( type MergeSketchWithBootloader struct{} func (s *MergeSketchWithBootloader) Run(context map[string]interface{}) error { - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) if !utils.MapStringStringHas(buildProperties, constants.BUILD_PROPERTIES_BOOTLOADER_NOBLINK) && !utils.MapStringStringHas(buildProperties, constants.BUILD_PROPERTIES_BOOTLOADER_FILE) { return nil } @@ -71,7 +71,7 @@ func (s *MergeSketchWithBootloader) Run(context map[string]interface{}) error { } else { bootloader = buildProperties[constants.BUILD_PROPERTIES_BOOTLOADER_FILE] } - bootloader = props.ExpandPropsInString(buildProperties, bootloader) + bootloader = buildProperties.ExpandPropsInString(bootloader) bootloaderPath := filepath.Join(buildProperties[constants.BUILD_PROPERTIES_RUNTIME_PLATFORM_PATH], constants.FOLDER_BOOTLOADERS, bootloader) if _, err := os.Stat(bootloaderPath); err != nil { diff --git a/src/arduino.cc/builder/phases/core_builder.go b/src/arduino.cc/builder/phases/core_builder.go index cf1c761d..d1b8cc9b 100644 --- a/src/arduino.cc/builder/phases/core_builder.go +++ b/src/arduino.cc/builder/phases/core_builder.go @@ -33,6 +33,7 @@ import ( "arduino.cc/builder/builder_utils" "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/utils" ) @@ -40,7 +41,7 @@ type CoreBuilder struct{} func (s *CoreBuilder) Run(context map[string]interface{}) error { coreBuildPath := context[constants.CTX_CORE_BUILD_PATH].(string) - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) verbose := context[constants.CTX_VERBOSE].(bool) warningsLevel := context[constants.CTX_WARNINGS_LEVEL].(string) logger := context[constants.CTX_LOGGER].(i18n.Logger) @@ -61,7 +62,7 @@ func (s *CoreBuilder) Run(context map[string]interface{}) error { return nil } -func compileCore(buildPath string, buildProperties map[string]string, verbose bool, warningsLevel string, logger i18n.Logger) (string, []string, error) { +func compileCore(buildPath string, buildProperties props.PropertiesMap, verbose bool, warningsLevel string, logger i18n.Logger) (string, []string, error) { coreFolder := buildProperties[constants.BUILD_PROPERTIES_BUILD_CORE_PATH] variantFolder := buildProperties[constants.BUILD_PROPERTIES_BUILD_VARIANT_PATH] diff --git a/src/arduino.cc/builder/phases/libraries_builder.go b/src/arduino.cc/builder/phases/libraries_builder.go index bb01f8e8..a26f5b2a 100644 --- a/src/arduino.cc/builder/phases/libraries_builder.go +++ b/src/arduino.cc/builder/phases/libraries_builder.go @@ -33,6 +33,7 @@ import ( "arduino.cc/builder/builder_utils" "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/types" "arduino.cc/builder/utils" "os" @@ -43,7 +44,7 @@ type LibrariesBuilder struct{} func (s *LibrariesBuilder) Run(context map[string]interface{}) error { librariesBuildPath := context[constants.CTX_LIBRARIES_BUILD_PATH].(string) - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) includes := context[constants.CTX_INCLUDE_FOLDERS].([]string) includes = utils.Map(includes, utils.WrapWithHyphenI) libraries := context[constants.CTX_IMPORTED_LIBRARIES].([]*types.Library) @@ -66,7 +67,7 @@ func (s *LibrariesBuilder) Run(context map[string]interface{}) error { return nil } -func compileLibraries(libraries []*types.Library, buildPath string, buildProperties map[string]string, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { +func compileLibraries(libraries []*types.Library, buildPath string, buildProperties props.PropertiesMap, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { objectFiles := []string{} for _, library := range libraries { libraryObjectFiles, err := compileLibrary(library, buildPath, buildProperties, includes, verbose, warningsLevel, logger) @@ -80,7 +81,7 @@ func compileLibraries(libraries []*types.Library, buildPath string, buildPropert } -func compileLibrary(library *types.Library, buildPath string, buildProperties map[string]string, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { +func compileLibrary(library *types.Library, buildPath string, buildProperties props.PropertiesMap, includes []string, verbose bool, warningsLevel string, logger i18n.Logger) ([]string, error) { libraryBuildPath := filepath.Join(buildPath, library.Name) err := utils.EnsureFolderExists(libraryBuildPath) diff --git a/src/arduino.cc/builder/phases/linker.go b/src/arduino.cc/builder/phases/linker.go index 7b9fd319..d2530d31 100644 --- a/src/arduino.cc/builder/phases/linker.go +++ b/src/arduino.cc/builder/phases/linker.go @@ -33,6 +33,7 @@ import ( "arduino.cc/builder/builder_utils" "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/utils" "path/filepath" "strings" @@ -57,7 +58,7 @@ func (s *Linker) Run(context map[string]interface{}) error { return utils.WrapError(err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) verbose := context[constants.CTX_VERBOSE].(bool) warningsLevel := context[constants.CTX_WARNINGS_LEVEL].(string) logger := context[constants.CTX_LOGGER].(i18n.Logger) @@ -70,13 +71,13 @@ func (s *Linker) Run(context map[string]interface{}) error { return nil } -func link(objectFiles []string, coreDotARelPath string, coreArchiveFilePath string, buildProperties map[string]string, verbose bool, warningsLevel string, logger i18n.Logger) error { +func link(objectFiles []string, coreDotARelPath string, coreArchiveFilePath string, buildProperties props.PropertiesMap, verbose bool, warningsLevel string, logger i18n.Logger) error { optRelax := addRelaxTrickIfATMEGA2560(buildProperties) objectFiles = utils.Map(objectFiles, wrapWithDoubleQuotes) objectFileList := strings.Join(objectFiles, constants.SPACE) - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties) + properties := buildProperties.Clone() properties[constants.BUILD_PROPERTIES_COMPILER_C_ELF_FLAGS] = properties[constants.BUILD_PROPERTIES_COMPILER_C_ELF_FLAGS] + optRelax properties[constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS] = properties[constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS+"."+warningsLevel] properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE] = coreDotARelPath @@ -91,7 +92,7 @@ func wrapWithDoubleQuotes(value string) string { return "\"" + value + "\"" } -func addRelaxTrickIfATMEGA2560(buildProperties map[string]string) string { +func addRelaxTrickIfATMEGA2560(buildProperties props.PropertiesMap) string { if buildProperties[constants.BUILD_PROPERTIES_BUILD_MCU] == "atmega2560" { return ",--relax" } diff --git a/src/arduino.cc/builder/phases/sketch_builder.go b/src/arduino.cc/builder/phases/sketch_builder.go index 27d26d59..cf9befe7 100644 --- a/src/arduino.cc/builder/phases/sketch_builder.go +++ b/src/arduino.cc/builder/phases/sketch_builder.go @@ -33,6 +33,7 @@ import ( "arduino.cc/builder/builder_utils" "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/utils" ) @@ -40,7 +41,7 @@ type SketchBuilder struct{} func (s *SketchBuilder) Run(context map[string]interface{}) error { sketchBuildPath := context[constants.CTX_SKETCH_BUILD_PATH].(string) - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) includes := context[constants.CTX_INCLUDE_FOLDERS].([]string) includes = utils.Map(includes, utils.WrapWithHyphenI) verbose := context[constants.CTX_VERBOSE].(bool) diff --git a/src/arduino.cc/builder/props/properties.go b/src/arduino.cc/builder/props/properties.go index 9cfa01ad..68ef4861 100644 --- a/src/arduino.cc/builder/props/properties.go +++ b/src/arduino.cc/builder/props/properties.go @@ -41,6 +41,8 @@ import ( "strings" ) +type PropertiesMap map[string]string + var OSNAME string func init() { @@ -56,7 +58,7 @@ func init() { } } -func Load(filepath string, logger i18n.Logger) (map[string]string, error) { +func Load(filepath string, logger i18n.Logger) (PropertiesMap, error) { bytes, err := ioutil.ReadFile(filepath) if err != nil { return nil, utils.WrapError(err) @@ -66,10 +68,10 @@ func Load(filepath string, logger i18n.Logger) (map[string]string, error) { text = strings.Replace(text, "\r\n", "\n", -1) text = strings.Replace(text, "\r", "\n", -1) - properties := make(map[string]string) + properties := make(PropertiesMap) for _, line := range strings.Split(text, "\n") { - err := loadSingleLine(properties, line) + err := properties.loadSingleLine(line) if err != nil { return nil, utils.ErrorfWithLogger(logger, constants.MSG_WRONG_PROPERTIES_FILE, line, filepath) } @@ -78,11 +80,11 @@ func Load(filepath string, logger i18n.Logger) (map[string]string, error) { return properties, nil } -func LoadFromSlice(lines []string, logger i18n.Logger) (map[string]string, error) { - properties := make(map[string]string) +func LoadFromSlice(lines []string, logger i18n.Logger) (PropertiesMap, error) { + properties := make(PropertiesMap) for _, line := range lines { - err := loadSingleLine(properties, line) + err := properties.loadSingleLine(line) if err != nil { return nil, utils.ErrorfWithLogger(logger, constants.MSG_WRONG_PROPERTIES, line) } @@ -91,7 +93,7 @@ func LoadFromSlice(lines []string, logger i18n.Logger) (map[string]string, error return properties, nil } -func loadSingleLine(properties map[string]string, line string) error { +func (properties PropertiesMap) loadSingleLine(line string) error { line = strings.TrimSpace(line) if len(line) > 0 && line[0] != '#' { @@ -109,10 +111,10 @@ func loadSingleLine(properties map[string]string, line string) error { return nil } -func SafeLoad(filepath string, logger i18n.Logger) (map[string]string, error) { +func SafeLoad(filepath string, logger i18n.Logger) (PropertiesMap, error) { _, err := os.Stat(filepath) if os.IsNotExist(err) { - return make(map[string]string), nil + return make(PropertiesMap), nil } properties, err := Load(filepath, logger) @@ -122,26 +124,26 @@ func SafeLoad(filepath string, logger i18n.Logger) (map[string]string, error) { return properties, nil } -func FirstLevelOf(aMap map[string]string) map[string]map[string]string { - newMap := make(map[string]map[string]string) +func (aMap PropertiesMap) FirstLevelOf() map[string]PropertiesMap { + newMap := make(map[string]PropertiesMap) for key, value := range aMap { if strings.Index(key, ".") == -1 { continue } keyParts := strings.SplitN(key, ".", 2) if newMap[keyParts[0]] == nil { - newMap[keyParts[0]] = make(map[string]string) + newMap[keyParts[0]] = make(PropertiesMap) } newMap[keyParts[0]][keyParts[1]] = value } return newMap } -func SubTree(aMap map[string]string, key string) map[string]string { - return FirstLevelOf(aMap)[key] +func (aMap PropertiesMap) SubTree(key string) PropertiesMap { + return aMap.FirstLevelOf()[key] } -func ExpandPropsInString(aMap map[string]string, str string) string { +func (aMap PropertiesMap) ExpandPropsInString(str string) string { replaced := true for i := 0; i < 10 && replaced; i++ { replaced = false @@ -154,6 +156,30 @@ func ExpandPropsInString(aMap map[string]string, str string) string { return str } +func (target PropertiesMap) Merge(sources ...PropertiesMap) PropertiesMap { + for _, source := range sources { + for key, value := range source { + target[key] = value + } + } + return target +} + +func (aMap PropertiesMap) Clone() PropertiesMap { + newMap := make(PropertiesMap) + newMap.Merge(aMap) + return newMap +} + +func MergeMapsOfProperties(target map[string]PropertiesMap, sources ...map[string]PropertiesMap) map[string]PropertiesMap { + for _, source := range sources { + for key, value := range source { + target[key] = value + } + } + return target +} + func DeleteUnexpandedPropsFromString(str string) (string, error) { rxp, err := regexp.Compile("\\{.+?\\}") if err != nil { diff --git a/src/arduino.cc/builder/recipe_runner.go b/src/arduino.cc/builder/recipe_runner.go index 05d3920d..8e656bd7 100644 --- a/src/arduino.cc/builder/recipe_runner.go +++ b/src/arduino.cc/builder/recipe_runner.go @@ -33,6 +33,7 @@ import ( "arduino.cc/builder/builder_utils" "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/utils" "os" "sort" @@ -50,12 +51,15 @@ func (s *RecipeByPrefixSuffixRunner) Run(context map[string]interface{}) error { logger.Fprintln(os.Stdout, constants.LOG_LEVEL_DEBUG, constants.MSG_LOOKING_FOR_RECIPES, s.Prefix, s.Suffix) } - buildProperties := utils.GetMapStringStringOrDefault(context, constants.CTX_BUILD_PROPERTIES) + buildProperties := make(props.PropertiesMap) + if p, ok := context[constants.CTX_BUILD_PROPERTIES]; ok { + buildProperties = p.(props.PropertiesMap).Clone() + } verbose := context[constants.CTX_VERBOSE].(bool) recipes := findRecipes(buildProperties, s.Prefix, s.Suffix) - properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties) + properties := buildProperties.Clone() for _, recipe := range recipes { if utils.DebugLevel(context) >= 10 { logger.Fprintln(os.Stdout, constants.LOG_LEVEL_DEBUG, constants.MSG_RUNNING_RECIPE, recipe) diff --git a/src/arduino.cc/builder/set_custom_build_properties.go b/src/arduino.cc/builder/set_custom_build_properties.go index d77a2098..ed908772 100644 --- a/src/arduino.cc/builder/set_custom_build_properties.go +++ b/src/arduino.cc/builder/set_custom_build_properties.go @@ -44,7 +44,7 @@ func (s *SetCustomBuildProperties) Run(context map[string]interface{}) error { } logger := context[constants.CTX_LOGGER].(i18n.Logger) - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) customBuildProperties, err := props.LoadFromSlice(context[constants.CTX_CUSTOM_BUILD_PROPERTIES].([]string), logger) if err != nil { return utils.WrapError(err) diff --git a/src/arduino.cc/builder/setup_build_properties.go b/src/arduino.cc/builder/setup_build_properties.go index 1c03cbec..7e9332f7 100644 --- a/src/arduino.cc/builder/setup_build_properties.go +++ b/src/arduino.cc/builder/setup_build_properties.go @@ -31,6 +31,7 @@ package builder import ( "arduino.cc/builder/constants" + "arduino.cc/builder/props" "arduino.cc/builder/types" "arduino.cc/builder/utils" "path/filepath" @@ -48,10 +49,10 @@ func (s *SetupBuildProperties) Run(context map[string]interface{}) error { actualPlatform := context[constants.CTX_ACTUAL_PLATFORM].(*types.Platform) targetBoard := context[constants.CTX_TARGET_BOARD].(*types.Board) - buildProperties := make(map[string]string) - utils.MergeMapsOfStrings(buildProperties, actualPlatform.Properties) - utils.MergeMapsOfStrings(buildProperties, targetPlatform.Properties) - utils.MergeMapsOfStrings(buildProperties, targetBoard.Properties) + buildProperties := make(props.PropertiesMap) + buildProperties.Merge(actualPlatform.Properties) + buildProperties.Merge(targetPlatform.Properties) + buildProperties.Merge(targetBoard.Properties) if utils.MapHas(context, constants.CTX_BUILD_PATH) { buildProperties[constants.BUILD_PROPERTIES_BUILD_PATH] = context[constants.CTX_BUILD_PATH].(string) diff --git a/src/arduino.cc/builder/target_board_resolver.go b/src/arduino.cc/builder/target_board_resolver.go index fc67917d..c1c58c4a 100644 --- a/src/arduino.cc/builder/target_board_resolver.go +++ b/src/arduino.cc/builder/target_board_resolver.go @@ -31,7 +31,6 @@ package builder import ( "arduino.cc/builder/constants" - "arduino.cc/builder/props" "arduino.cc/builder/types" "arduino.cc/builder/utils" "strings" @@ -112,16 +111,16 @@ func addAdditionalPropertiesToTargetBoard(board *types.Board, options string) { key := parts[0] value := parts[1] if key != constants.EMPTY_STRING && value != constants.EMPTY_STRING { - menu := props.SubTree(board.Properties, constants.BOARD_PROPERTIES_MENU) + menu := board.Properties.SubTree(constants.BOARD_PROPERTIES_MENU) if len(menu) == 0 { return } - propertiesOfKey := props.SubTree(menu, key) + propertiesOfKey := menu.SubTree(key) if len(propertiesOfKey) == 0 { return } - propertiesOfKeyValue := props.SubTree(propertiesOfKey, value) - utils.MergeMapsOfStrings(board.Properties, propertiesOfKeyValue) + propertiesOfKeyValue := propertiesOfKey.SubTree(value) + board.Properties.Merge(propertiesOfKeyValue) } } } diff --git a/src/arduino.cc/builder/test/load_vid_pid_specific_properties_test.go b/src/arduino.cc/builder/test/load_vid_pid_specific_properties_test.go index fee5d60c..f4ef6ff5 100644 --- a/src/arduino.cc/builder/test/load_vid_pid_specific_properties_test.go +++ b/src/arduino.cc/builder/test/load_vid_pid_specific_properties_test.go @@ -32,6 +32,7 @@ package test import ( "arduino.cc/builder" "arduino.cc/builder/constants" + "arduino.cc/builder/props" "arduino.cc/builder/types" "github.com/stretchr/testify/require" "os" @@ -63,7 +64,7 @@ func TestLoadVIDPIDSpecificPropertiesWhenNoVIDPIDAreProvided(t *testing.T) { NoError(t, err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) require.Equal(t, "0x0037", buildProperties["pid.0"]) require.Equal(t, "\"Genuino Micro\"", buildProperties["vid.4.build.usb_product"]) @@ -95,7 +96,7 @@ func TestLoadVIDPIDSpecificProperties(t *testing.T) { NoError(t, err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) require.Equal(t, "0x0037", buildProperties["pid.0"]) require.Equal(t, "\"Genuino Micro\"", buildProperties["vid.4.build.usb_product"]) diff --git a/src/arduino.cc/builder/test/merge_sketch_with_bootloader_test.go b/src/arduino.cc/builder/test/merge_sketch_with_bootloader_test.go index 8bfd4913..727ab5c9 100644 --- a/src/arduino.cc/builder/test/merge_sketch_with_bootloader_test.go +++ b/src/arduino.cc/builder/test/merge_sketch_with_bootloader_test.go @@ -32,6 +32,7 @@ package test import ( "arduino.cc/builder" "arduino.cc/builder/constants" + "arduino.cc/builder/props" "arduino.cc/builder/types" "arduino.cc/builder/utils" "github.com/stretchr/testify/require" @@ -154,7 +155,7 @@ func TestMergeSketchWithBootloaderWhenNoBootloaderAvailable(t *testing.T) { NoError(t, err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) delete(buildProperties, constants.BUILD_PROPERTIES_BOOTLOADER_NOBLINK) delete(buildProperties, constants.BUILD_PROPERTIES_BOOTLOADER_FILE) diff --git a/src/arduino.cc/builder/test/properties_test.go b/src/arduino.cc/builder/test/properties_test.go index b79d31eb..5e9842ff 100644 --- a/src/arduino.cc/builder/test/properties_test.go +++ b/src/arduino.cc/builder/test/properties_test.go @@ -48,7 +48,7 @@ func TestPropertiesBoardsTxt(t *testing.T) { require.Equal(t, "32256", properties["ethernet.upload.maximum_size"]) require.Equal(t, "{build.usb_flags}", properties["robotMotor.build.extra_flags"]) - ethernet := props.SubTree(properties, "ethernet") + ethernet := properties.SubTree("ethernet") require.Equal(t, "Arduino Ethernet", ethernet[constants.LIBRARY_NAME]) } @@ -73,47 +73,47 @@ func TestPropertiesTestTxt(t *testing.T) { } func TestExpandPropsInString(t *testing.T) { - aMap := make(map[string]string) + aMap := make(props.PropertiesMap) aMap["key1"] = "42" aMap["key2"] = "{key1}" str := "{key1} == {key2} == true" - str = props.ExpandPropsInString(aMap, str) + str = aMap.ExpandPropsInString(str) require.Equal(t, "42 == 42 == true", str) } func TestExpandPropsInString2(t *testing.T) { - aMap := make(map[string]string) + aMap := make(props.PropertiesMap) aMap["key2"] = "{key2}" aMap["key1"] = "42" str := "{key1} == {key2} == true" - str = props.ExpandPropsInString(aMap, str) + str = aMap.ExpandPropsInString(str) require.Equal(t, "42 == {key2} == true", str) } func TestDeleteUnexpandedPropsFromString(t *testing.T) { - aMap := make(map[string]string) + aMap := make(props.PropertiesMap) aMap["key1"] = "42" aMap["key2"] = "{key1}" str := "{key1} == {key2} == {key3} == true" - str = props.ExpandPropsInString(aMap, str) + str = aMap.ExpandPropsInString(str) str, err := props.DeleteUnexpandedPropsFromString(str) NoError(t, err) require.Equal(t, "42 == 42 == == true", str) } func TestDeleteUnexpandedPropsFromString2(t *testing.T) { - aMap := make(map[string]string) + aMap := make(props.PropertiesMap) aMap["key2"] = "42" str := "{key1} == {key2} == {key3} == true" - str = props.ExpandPropsInString(aMap, str) + str = aMap.ExpandPropsInString(str) str, err := props.DeleteUnexpandedPropsFromString(str) NoError(t, err) require.Equal(t, " == 42 == == true", str) @@ -129,7 +129,7 @@ func TestPropertiesRedBeearLabBoardsTxt(t *testing.T) { require.Equal(t, "arduino:arduino", properties["blend.build.core"]) require.Equal(t, "0x2404", properties["blendmicro16.pid.0"]) - ethernet := props.SubTree(properties, "blend") + ethernet := properties.SubTree("blend") require.Equal(t, "arduino:arduino", ethernet[constants.BUILD_PROPERTIES_BUILD_CORE]) } diff --git a/src/arduino.cc/builder/test/recipe_runner_test.go b/src/arduino.cc/builder/test/recipe_runner_test.go index 9eca7957..d4d51f64 100644 --- a/src/arduino.cc/builder/test/recipe_runner_test.go +++ b/src/arduino.cc/builder/test/recipe_runner_test.go @@ -32,6 +32,7 @@ package test import ( "arduino.cc/builder" "arduino.cc/builder/constants" + "arduino.cc/builder/props" "arduino.cc/builder/types" "github.com/stretchr/testify/require" "testing" @@ -43,7 +44,7 @@ import ( // So this test is pretty useless func TestRecipeRunner(t *testing.T) { context := make(map[string]interface{}) - buildProperties := make(map[string]string) + buildProperties := make(props.PropertiesMap) context[constants.CTX_BUILD_PROPERTIES] = buildProperties buildProperties["recipe.hooks.prebuild.1.pattern"] = "echo" diff --git a/src/arduino.cc/builder/test/setup_build_properties_test.go b/src/arduino.cc/builder/test/setup_build_properties_test.go index d63f87ec..b933f8a1 100644 --- a/src/arduino.cc/builder/test/setup_build_properties_test.go +++ b/src/arduino.cc/builder/test/setup_build_properties_test.go @@ -70,7 +70,7 @@ func TestSetupBuildProperties(t *testing.T) { NoError(t, err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) require.Equal(t, "ARDUINO", buildProperties[constants.BUILD_PROPERTIES_SOFTWARE]) @@ -134,7 +134,7 @@ func TestSetupBuildPropertiesWithSomeCustomOverrides(t *testing.T) { NoError(t, err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) require.Equal(t, "ARDUINO", buildProperties[constants.BUILD_PROPERTIES_SOFTWARE]) @@ -173,7 +173,7 @@ func TestSetupBuildPropertiesUserHardware(t *testing.T) { NoError(t, err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) require.Equal(t, "ARDUINO", buildProperties[constants.BUILD_PROPERTIES_SOFTWARE]) @@ -207,7 +207,7 @@ func TestSetupBuildPropertiesWithMissingPropsFromParentPlatformTxtFiles(t *testi NoError(t, err) } - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) require.Equal(t, "ARDUINO", buildProperties[constants.BUILD_PROPERTIES_SOFTWARE]) @@ -217,7 +217,7 @@ func TestSetupBuildPropertiesWithMissingPropsFromParentPlatformTxtFiles(t *testi require.Equal(t, "\"{compiler.path}{compiler.c.cmd}\" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} \"{source_file}\" -o \"{object_file}\"", buildProperties["recipe.c.o.pattern"]) require.Equal(t, "{path}/etc/avrdude.conf", buildProperties["tools.avrdude.config.path"]) - coanProps := props.SubTree(props.SubTree(buildProperties, constants.BUILD_PROPERTIES_TOOLS_KEY), constants.COAN) + coanProps := buildProperties.SubTree(constants.BUILD_PROPERTIES_TOOLS_KEY).SubTree(constants.COAN) require.Equal(t, "{path}/coan", coanProps["cmd.path"]) require.Equal(t, "\"{cmd.path}\" source -m -E -P -kb {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} \"{source_file}\"", coanProps[constants.BUILD_PROPERTIES_PATTERN]) diff --git a/src/arduino.cc/builder/types/types.go b/src/arduino.cc/builder/types/types.go index 5965f37a..2eebaf8e 100644 --- a/src/arduino.cc/builder/types/types.go +++ b/src/arduino.cc/builder/types/types.go @@ -31,6 +31,8 @@ package types import ( "arduino.cc/builder/constants" + "arduino.cc/builder/props" + "path/filepath" "strconv" ) @@ -60,13 +62,13 @@ type Sketch struct { } type Packages struct { - Properties map[string]string + Properties props.PropertiesMap Packages map[string]*Package } type Package struct { PackageId string - Properties map[string]string + Properties props.PropertiesMap Platforms map[string]*Platform } @@ -75,13 +77,13 @@ type Platform struct { Folder string DefaultBoard *Board Boards map[string]*Board - Properties map[string]string - Programmers map[string]map[string]string + Properties props.PropertiesMap + Programmers map[string]props.PropertiesMap } type Board struct { BoardId string - Properties map[string]string + Properties props.PropertiesMap } type Tool struct { @@ -192,3 +194,14 @@ type CTag struct { Function string PrototypeModifiers string } + +func LibraryToSourceFolder(library *Library) []SourceFolder { + sourceFolders := []SourceFolder{} + recurse := library.Layout == LIBRARY_RECURSIVE + sourceFolders = append(sourceFolders, SourceFolder{Folder: library.SrcFolder, Recurse: recurse}) + if library.Layout == LIBRARY_FLAT { + utility := filepath.Join(library.SrcFolder, constants.LIBRARY_FOLDER_UTILITY) + sourceFolders = append(sourceFolders, SourceFolder{Folder: utility, Recurse: false}) + } + return sourceFolders +} diff --git a/src/arduino.cc/builder/utils/utils.go b/src/arduino.cc/builder/utils/utils.go index 100598d3..068d212c 100644 --- a/src/arduino.cc/builder/utils/utils.go +++ b/src/arduino.cc/builder/utils/utils.go @@ -33,7 +33,6 @@ import ( "arduino.cc/builder/constants" "arduino.cc/builder/gohasissues" "arduino.cc/builder/i18n" - "arduino.cc/builder/types" "crypto/md5" "encoding/hex" "github.com/go-errors/errors" @@ -70,15 +69,6 @@ func KeysOfMapOfStringBool(input map[string]bool) []string { return keys } -func MergeMapsOfStrings(target map[string]string, sources ...map[string]string) map[string]string { - for _, source := range sources { - for key, value := range source { - target[key] = value - } - } - return target -} - func MergeMapsOfStringBool(target map[string]bool, sources ...map[string]bool) map[string]bool { for _, source := range sources { for key, value := range source { @@ -88,15 +78,6 @@ func MergeMapsOfStringBool(target map[string]bool, sources ...map[string]bool) m return target } -func MergeMapsOfMapsOfStrings(target map[string]map[string]string, sources ...map[string]map[string]string) map[string]map[string]string { - for _, source := range sources { - for key, value := range source { - target[key] = value - } - } - return target -} - func PrettyOSName() string { switch osName := runtime.GOOS; osName { case "darwin": @@ -327,14 +308,6 @@ func SliceToMapStringBool(keys []string, value bool) map[string]bool { return aMap } -func GetMapStringStringOrDefault(aMap map[string]interface{}, key string) map[string]string { - if MapHas(aMap, key) { - return aMap[key].(map[string]string) - } - - return make(map[string]string) -} - func AbsolutizePaths(files []string) ([]string, error) { for idx, file := range files { absFile, err := filepath.Abs(file) @@ -419,17 +392,6 @@ func AppendIfNotPresent(target []string, elements ...string) []string { return target } -func LibraryToSourceFolder(library *types.Library) []types.SourceFolder { - sourceFolders := []types.SourceFolder{} - recurse := library.Layout == types.LIBRARY_RECURSIVE - sourceFolders = append(sourceFolders, types.SourceFolder{Folder: library.SrcFolder, Recurse: recurse}) - if library.Layout == types.LIBRARY_FLAT { - utility := filepath.Join(library.SrcFolder, constants.LIBRARY_FOLDER_UTILITY) - sourceFolders = append(sourceFolders, types.SourceFolder{Folder: utility, Recurse: false}) - } - return sourceFolders -} - func AddStringsToStringsSet(accumulator []string, stringsToAdd []string) []string { previousStringsSet := SliceToMapStringBool(accumulator, true) stringsSetToAdd := SliceToMapStringBool(stringsToAdd, true) diff --git a/src/arduino.cc/builder/warn_about_arch_incompatible_libraries.go b/src/arduino.cc/builder/warn_about_arch_incompatible_libraries.go index 4cad2db7..8ca59447 100644 --- a/src/arduino.cc/builder/warn_about_arch_incompatible_libraries.go +++ b/src/arduino.cc/builder/warn_about_arch_incompatible_libraries.go @@ -32,6 +32,7 @@ package builder import ( "arduino.cc/builder/constants" "arduino.cc/builder/i18n" + "arduino.cc/builder/props" "arduino.cc/builder/types" "arduino.cc/builder/utils" "os" @@ -46,7 +47,7 @@ func (s *WarnAboutArchIncompatibleLibraries) Run(context map[string]interface{}) } targetPlatform := context[constants.CTX_TARGET_PLATFORM].(*types.Platform) - buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string) + buildProperties := context[constants.CTX_BUILD_PROPERTIES].(props.PropertiesMap) logger := context[constants.CTX_LOGGER].(i18n.Logger) archs := []string{} From 14e2351c54a45cfae789fdfae536966928b5f218 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 15 Dec 2015 10:42:06 +0100 Subject: [PATCH 5/6] Moving check for signatureContainsDefaultArg to prototypes_adder ctags should list all prototypes, this commit moves the responsibility of prototypes selection to prototypes_adder Signed-off-by: Cristian Maglie --- src/arduino.cc/builder/ctags/ctags_parser.go | 5 ----- src/arduino.cc/builder/prototypes_adder.go | 7 +++++++ src/arduino.cc/builder/test/ctags_to_prototypes_test.go | 9 +++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/arduino.cc/builder/ctags/ctags_parser.go b/src/arduino.cc/builder/ctags/ctags_parser.go index c3fdba5d..0a73391f 100644 --- a/src/arduino.cc/builder/ctags/ctags_parser.go +++ b/src/arduino.cc/builder/ctags/ctags_parser.go @@ -67,7 +67,6 @@ func (s *CTagsParser) Run(context map[string]interface{}) error { skipTagsWhere(tags, tagIsUnknown, context) skipTagsWhere(tags, tagIsUnhandled, context) - skipTagsWhere(tags, signatureContainsDefaultArg, context) addPrototypes(tags) removeDefinedProtypes(tags, context) removeDuplicate(tags) @@ -149,10 +148,6 @@ func skipTagsWhere(tags []*types.CTag, skipFunc skipFuncType, context map[string } } -func signatureContainsDefaultArg(tag *types.CTag) bool { - return strings.Contains(tag.Prototype, "=") -} - func prototypeAndCodeDontMatch(tag *types.CTag) bool { if tag.SkipMe { return true diff --git a/src/arduino.cc/builder/prototypes_adder.go b/src/arduino.cc/builder/prototypes_adder.go index fe58c8b5..e23daf28 100644 --- a/src/arduino.cc/builder/prototypes_adder.go +++ b/src/arduino.cc/builder/prototypes_adder.go @@ -78,6 +78,9 @@ func composePrototypeSection(line int, prototypes []*types.Prototype) string { func joinPrototypes(prototypes []*types.Prototype) string { prototypesSlice := []string{} for _, proto := range prototypes { + if signatureContainsaDefaultArg(proto) { + continue + } prototypesSlice = append(prototypesSlice, "#line "+strconv.Itoa(proto.Line)+" \""+proto.File+"\"") prototypeParts := []string{} if proto.Modifiers != "" { @@ -89,6 +92,10 @@ func joinPrototypes(prototypes []*types.Prototype) string { return strings.Join(prototypesSlice, "\n") } +func signatureContainsaDefaultArg(proto *types.Prototype) bool { + return strings.Contains(proto.Prototype, "=") +} + func firstFunctionOutsideOfSource(firstFunctionLine int, sourceRows []string) bool { return firstFunctionLine > len(sourceRows)-1 } diff --git a/src/arduino.cc/builder/test/ctags_to_prototypes_test.go b/src/arduino.cc/builder/test/ctags_to_prototypes_test.go index 57048be0..29597646 100644 --- a/src/arduino.cc/builder/test/ctags_to_prototypes_test.go +++ b/src/arduino.cc/builder/test/ctags_to_prototypes_test.go @@ -336,10 +336,11 @@ func TestCTagsToPrototypesDefaultArguments(t *testing.T) { prototypes := context[constants.CTX_PROTOTYPES].([]*types.Prototype) - require.Equal(t, 2, len(prototypes)) - require.Equal(t, "void setup();", prototypes[0].Prototype) - require.Equal(t, "/tmp/test179252494/preproc/ctags_target.cpp", prototypes[0].File) - require.Equal(t, "void loop();", prototypes[1].Prototype) + require.Equal(t, 3, len(prototypes)) + require.Equal(t, "void test(int x = 1);", prototypes[0].Prototype) + require.Equal(t, "void setup();", prototypes[1].Prototype) + require.Equal(t, "/tmp/test179252494/preproc/ctags_target.cpp", prototypes[1].File) + require.Equal(t, "void loop();", prototypes[2].Prototype) prototypeLine := context[constants.CTX_LINE_WHERE_TO_INSERT_PROTOTYPES].(int) require.Equal(t, 2, prototypeLine) From c205ecdf50e792ca06f8a2c60a3a2ee5d785ae9b Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sun, 20 Dec 2015 15:51:40 +0100 Subject: [PATCH 6/6] Some minor cosmetics Signed-off-by: Cristian Maglie --- src/arduino.cc/builder/prototypes_adder.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/arduino.cc/builder/prototypes_adder.go b/src/arduino.cc/builder/prototypes_adder.go index e23daf28..79055b9e 100644 --- a/src/arduino.cc/builder/prototypes_adder.go +++ b/src/arduino.cc/builder/prototypes_adder.go @@ -48,11 +48,12 @@ func (s *PrototypesAdder) Run(context map[string]interface{}) error { } firstFunctionLine := context[constants.CTX_LINE_WHERE_TO_INSERT_PROTOTYPES].(int) - if firstFunctionOutsideOfSource(firstFunctionLine, sourceRows) { + if isFirstFunctionOutsideOfSource(firstFunctionLine, sourceRows) { return nil } - firstFunctionChar := len(strings.Join(sourceRows[:firstFunctionLine+context[constants.CTX_LINE_OFFSET].(int)-1], "\n")) + 1 + insertionLine := firstFunctionLine + context[constants.CTX_LINE_OFFSET].(int) - 1 + firstFunctionChar := len(strings.Join(sourceRows[:insertionLine], "\n")) + 1 prototypeSection := composePrototypeSection(firstFunctionLine, context[constants.CTX_PROTOTYPES].([]*types.Prototype)) context[constants.CTX_PROTOTYPE_SECTION] = prototypeSection source = source[:firstFunctionChar] + prototypeSection + source[firstFunctionChar:] @@ -96,6 +97,6 @@ func signatureContainsaDefaultArg(proto *types.Prototype) bool { return strings.Contains(proto.Prototype, "=") } -func firstFunctionOutsideOfSource(firstFunctionLine int, sourceRows []string) bool { +func isFirstFunctionOutsideOfSource(firstFunctionLine int, sourceRows []string) bool { return firstFunctionLine > len(sourceRows)-1 }