diff --git a/src/arduino.cc/builder/add_additional_entries_to_context.go b/src/arduino.cc/builder/add_additional_entries_to_context.go index a4250c88..4a6e7c46 100644 --- a/src/arduino.cc/builder/add_additional_entries_to_context.go +++ b/src/arduino.cc/builder/add_additional_entries_to_context.go @@ -69,7 +69,6 @@ func (s *AddAdditionalEntriesToContext) Run(ctx *types.Context) error { } ctx.CollectedSourceFiles = &types.UniqueStringQueue{} - ctx.FoldersWithSourceFiles = &types.UniqueSourceFolderQueue{} ctx.LibrariesResolutionResults = make(map[string]types.LibraryResolutionResult) ctx.HardwareRewriteResults = make(map[*types.Platform][]types.PlatforKeyRewrite) diff --git a/src/arduino.cc/builder/collect_all_source_files_from_folders_with_sources.go b/src/arduino.cc/builder/collect_all_source_files_from_folders_with_sources.go deleted file mode 100644 index b9bc589f..00000000 --- a/src/arduino.cc/builder/collect_all_source_files_from_folders_with_sources.go +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of Arduino Builder. - * - * Arduino Builder is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - * - * Copyright 2015 Arduino LLC (http://www.arduino.cc/) - */ - -package builder - -import ( - "arduino.cc/builder/i18n" - "arduino.cc/builder/types" - "arduino.cc/builder/utils" -) - -type CollectAllSourceFilesFromFoldersWithSources struct{} - -func (s *CollectAllSourceFilesFromFoldersWithSources) Run(ctx *types.Context) error { - foldersWithSources := ctx.FoldersWithSourceFiles - sourceFiles := ctx.CollectedSourceFiles - extensions := func(ext string) bool { return ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS[ext] } - - filePaths := []string{} - for !foldersWithSources.Empty() { - sourceFolder := foldersWithSources.Pop().(types.SourceFolder) - err := utils.FindFilesInFolder(&filePaths, sourceFolder.Folder, extensions, sourceFolder.Recurse) - if err != nil { - return i18n.WrapError(err) - } - } - - for _, filePath := range filePaths { - sourceFiles.Push(filePath) - } - - return nil -} diff --git a/src/arduino.cc/builder/container_find_includes.go b/src/arduino.cc/builder/container_find_includes.go index 7d2e05c5..06aea4b3 100644 --- a/src/arduino.cc/builder/container_find_includes.go +++ b/src/arduino.cc/builder/container_find_includes.go @@ -42,52 +42,30 @@ import ( type ContainerFindIncludes struct{} func (s *ContainerFindIncludes) Run(ctx *types.Context) error { - err := runCommand(ctx, &IncludesToIncludeFolders{}) - if err != nil { - return i18n.WrapError(err) + ctx.IncludeFolders = append(ctx.IncludeFolders, ctx.BuildProperties[constants.BUILD_PROPERTIES_BUILD_CORE_PATH]) + if ctx.BuildProperties[constants.BUILD_PROPERTIES_BUILD_VARIANT_PATH] != constants.EMPTY_STRING { + ctx.IncludeFolders = append(ctx.IncludeFolders, ctx.BuildProperties[constants.BUILD_PROPERTIES_BUILD_VARIANT_PATH]) } sketchBuildPath := ctx.SketchBuildPath sketch := ctx.Sketch - err = findIncludesUntilDone(ctx, filepath.Join(sketchBuildPath, filepath.Base(sketch.MainFile.Name)+".cpp")) - if err != nil { - return i18n.WrapError(err) - } + ctx.CollectedSourceFiles.Push(filepath.Join(sketchBuildPath, filepath.Base(sketch.MainFile.Name)+".cpp")) - foldersWithSources := ctx.FoldersWithSourceFiles - foldersWithSources.Push(types.SourceFolder{Folder: ctx.SketchBuildPath, Recurse: false}) + sourceFilePaths := ctx.CollectedSourceFiles + queueSourceFilesFromFolder(sourceFilePaths, ctx.SketchBuildPath, /* recurse */ false) srcSubfolderPath := filepath.Join(ctx.SketchBuildPath, constants.SKETCH_FOLDER_SRC) if info, err := os.Stat(srcSubfolderPath); err == nil && info.IsDir() { - foldersWithSources.Push(types.SourceFolder{Folder: srcSubfolderPath, Recurse: true}) - } - if len(ctx.ImportedLibraries) > 0 { - for _, library := range ctx.ImportedLibraries { - sourceFolders := types.LibraryToSourceFolder(library) - for _, sourceFolder := range sourceFolders { - foldersWithSources.Push(sourceFolder) - } - } - } - - err = runCommand(ctx, &CollectAllSourceFilesFromFoldersWithSources{}) - if err != nil { - return i18n.WrapError(err) + queueSourceFilesFromFolder(sourceFilePaths, srcSubfolderPath, /* recurse */ true) } - sourceFilePaths := ctx.CollectedSourceFiles - for !sourceFilePaths.Empty() { - err = findIncludesUntilDone(ctx, sourceFilePaths.Pop().(string)) - if err != nil { - return i18n.WrapError(err) - } - err := runCommand(ctx, &CollectAllSourceFilesFromFoldersWithSources{}) + err := findIncludesUntilDone(ctx, sourceFilePaths.Pop().(string)) if err != nil { return i18n.WrapError(err) } } - err = runCommand(ctx, &FailIfImportedLibraryIsWrong{}) + err := runCommand(ctx, &FailIfImportedLibraryIsWrong{}) if err != nil { return i18n.WrapError(err) } @@ -106,13 +84,10 @@ func runCommand(ctx *types.Context, command types.Command) error { func findIncludesUntilDone(ctx *types.Context, sourceFilePath string) error { targetFilePath := utils.NULLFile() - importedLibraries := ctx.ImportedLibraries - done := false - for !done { + for { commands := []types.Command{ &GCCPreprocRunnerForDiscoveringIncludes{SourceFilePath: sourceFilePath, TargetFilePath: targetFilePath}, &IncludesFinderWithRegExp{Source: &ctx.SourceGccMinusE}, - &IncludesToIncludeFolders{}, } for _, command := range commands { err := runCommand(ctx, command) @@ -120,14 +95,42 @@ func findIncludesUntilDone(ctx *types.Context, sourceFilePath string) error { return i18n.WrapError(err) } } - if len(ctx.IncludesJustFound) == 0 { - done = true - } else if len(ctx.ImportedLibraries) == len(importedLibraries) { + if ctx.IncludeJustFound == "" { + // No missing includes found, we're done + return nil + } + + library := ResolveLibrary(ctx, ctx.IncludeJustFound) + if library == nil { + // Library could not be resolved, show error err := runCommand(ctx, &GCCPreprocRunner{TargetFileName: constants.FILE_CTAGS_TARGET_FOR_GCC_MINUS_E}) return i18n.WrapError(err) } - importedLibraries = ctx.ImportedLibraries - ctx.IncludesJustFound = []string{} + + // Add this library to the list of libraries, the + // include path and queue its source files for further + // include scanning + ctx.ImportedLibraries = append(ctx.ImportedLibraries, library) + ctx.IncludeFolders = append(ctx.IncludeFolders, library.SrcFolder) + sourceFolders := types.LibraryToSourceFolder(library) + for _, sourceFolder := range sourceFolders { + queueSourceFilesFromFolder(ctx.CollectedSourceFiles, sourceFolder.Folder, sourceFolder.Recurse) + } } +} + +func queueSourceFilesFromFolder(queue *types.UniqueStringQueue, folder string, recurse bool) error { + extensions := func(ext string) bool { return ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS[ext] } + + filePaths := []string{} + err := utils.FindFilesInFolder(&filePaths, folder, extensions, recurse) + if err != nil { + return i18n.WrapError(err) + } + + for _, filePath := range filePaths { + queue.Push(filePath) + } + return nil } diff --git a/src/arduino.cc/builder/includes_finder_with_regexp.go b/src/arduino.cc/builder/includes_finder_with_regexp.go index 6bc81882..f093759d 100644 --- a/src/arduino.cc/builder/includes_finder_with_regexp.go +++ b/src/arduino.cc/builder/includes_finder_with_regexp.go @@ -31,7 +31,6 @@ package builder import ( "arduino.cc/builder/types" - "arduino.cc/builder/utils" "regexp" "strings" ) @@ -45,24 +44,17 @@ type IncludesFinderWithRegExp struct { func (s *IncludesFinderWithRegExp) Run(ctx *types.Context) error { source := *s.Source - matches := INCLUDE_REGEXP.FindAllStringSubmatch(source, -1) - includes := []string{} - for _, match := range matches { - includes = append(includes, strings.TrimSpace(match[1])) - } - if len(includes) == 0 { - include := findIncludesForOldCompilers(source) - if include != "" { - includes = append(includes, include) - } + match := INCLUDE_REGEXP.FindStringSubmatch(source) + if match != nil { + ctx.IncludeJustFound = strings.TrimSpace(match[1]) + } else { + ctx.IncludeJustFound = findIncludeForOldCompilers(source) } - ctx.IncludesJustFound = includes - ctx.Includes = utils.AppendIfNotPresent(ctx.Includes, includes...) return nil } -func findIncludesForOldCompilers(source string) string { +func findIncludeForOldCompilers(source string) string { lines := strings.Split(source, "\n") for _, line := range lines { splittedLine := strings.Split(line, ":") diff --git a/src/arduino.cc/builder/includes_to_include_folders.go b/src/arduino.cc/builder/resolve_library.go similarity index 75% rename from src/arduino.cc/builder/includes_to_include_folders.go rename to src/arduino.cc/builder/resolve_library.go index 3a3671ed..4ba46f82 100644 --- a/src/arduino.cc/builder/includes_to_include_folders.go +++ b/src/arduino.cc/builder/resolve_library.go @@ -34,92 +34,34 @@ import ( "strings" "arduino.cc/builder/constants" - "arduino.cc/builder/i18n" "arduino.cc/builder/types" "arduino.cc/builder/utils" - "arduino.cc/properties" ) -type IncludesToIncludeFolders struct{} - -func (s *IncludesToIncludeFolders) Run(ctx *types.Context) error { - includes := ctx.Includes +func ResolveLibrary(ctx *types.Context, header string) *types.Library { headerToLibraries := ctx.HeaderToLibraries - - platform := ctx.TargetPlatform - actualPlatform := ctx.ActualPlatform + platforms := []*types.Platform{ctx.ActualPlatform, ctx.TargetPlatform} libraryResolutionResults := ctx.LibrariesResolutionResults importedLibraries := ctx.ImportedLibraries - newlyImportedLibraries, err := resolveLibraries(includes, headerToLibraries, importedLibraries, []*types.Platform{actualPlatform, platform}, libraryResolutionResults) - if err != nil { - return i18n.WrapError(err) - } - - foldersWithSources := ctx.FoldersWithSourceFiles - - for _, newlyImportedLibrary := range newlyImportedLibraries { - if !sliceContainsLibrary(importedLibraries, newlyImportedLibrary) { - importedLibraries = append(importedLibraries, newlyImportedLibrary) - sourceFolders := types.LibraryToSourceFolder(newlyImportedLibrary) - for _, sourceFolder := range sourceFolders { - foldersWithSources.Push(sourceFolder) - } - } - } - - ctx.ImportedLibraries = importedLibraries - ctx.IncludeFolders = resolveIncludeFolders(newlyImportedLibraries, ctx.BuildProperties, ctx.Verbose) - - return nil -} - -func resolveIncludeFolders(importedLibraries []*types.Library, buildProperties properties.Map, 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 { - includeFolders = append(includeFolders, buildProperties[constants.BUILD_PROPERTIES_BUILD_VARIANT_PATH]) - } - - for _, library := range importedLibraries { - includeFolders = append(includeFolders, library.SrcFolder) - } - - return includeFolders -} - -//FIXME it's also resolving previously resolved libraries -func resolveLibraries(includes []string, headerToLibraries map[string][]*types.Library, importedLibraries []*types.Library, platforms []*types.Platform, libraryResolutionResults map[string]types.LibraryResolutionResult) ([]*types.Library, error) { markImportedLibrary := make(map[*types.Library]bool) for _, library := range importedLibraries { markImportedLibrary[library] = true } - for _, header := range includes { - resolveLibrary(header, headerToLibraries, markImportedLibrary, platforms, libraryResolutionResults) - } - - var newlyImportedLibraries []*types.Library - for library, _ := range markImportedLibrary { - newlyImportedLibraries = append(newlyImportedLibraries, library) - } - return newlyImportedLibraries, nil -} - -func resolveLibrary(header string, headerToLibraries map[string][]*types.Library, markImportedLibrary map[*types.Library]bool, platforms []*types.Platform, libraryResolutionResults map[string]types.LibraryResolutionResult) { libraries := append([]*types.Library{}, headerToLibraries[header]...) if libraries == nil || len(libraries) == 0 { - return + return nil } if len(libraries) == 1 { markImportedLibrary[libraries[0]] = true - return + return libraries[0] } if markImportedLibraryContainsOneOfCandidates(markImportedLibrary, libraries) { - return + return nil } reverse(libraries) @@ -151,6 +93,7 @@ func resolveLibrary(header string, headerToLibraries map[string][]*types.Library libraryResolutionResults[header] = types.LibraryResolutionResult{Library: library, NotUsedLibraries: filterOutLibraryFrom(libraries, library)} markImportedLibrary[library] = true + return library } //facepalm. sort.Reverse needs an Interface that implements Len/Less/Swap. It's a slice! What else for reversing it?!? diff --git a/src/arduino.cc/builder/test/add_additional_entries_to_context_test.go b/src/arduino.cc/builder/test/add_additional_entries_to_context_test.go index a2bfbfc6..3bb057d4 100644 --- a/src/arduino.cc/builder/test/add_additional_entries_to_context_test.go +++ b/src/arduino.cc/builder/test/add_additional_entries_to_context_test.go @@ -52,7 +52,6 @@ func TestAddAdditionalEntriesToContextNoBuildPath(t *testing.T) { require.NotNil(t, ctx.WarningsLevel) require.True(t, ctx.CollectedSourceFiles.Empty()) - require.True(t, ctx.FoldersWithSourceFiles.Empty()) require.Equal(t, 0, len(ctx.LibrariesResolutionResults)) } @@ -72,7 +71,6 @@ func TestAddAdditionalEntriesToContextWithBuildPath(t *testing.T) { require.NotNil(t, ctx.WarningsLevel) require.True(t, ctx.CollectedSourceFiles.Empty()) - require.True(t, ctx.FoldersWithSourceFiles.Empty()) require.Equal(t, 0, len(ctx.LibrariesResolutionResults)) } diff --git a/src/arduino.cc/builder/test/collect_all_source_files_from_folders_with_sources_test.go b/src/arduino.cc/builder/test/collect_all_source_files_from_folders_with_sources_test.go deleted file mode 100644 index ce9ab58f..00000000 --- a/src/arduino.cc/builder/test/collect_all_source_files_from_folders_with_sources_test.go +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This file is part of Arduino Builder. - * - * Arduino Builder is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - * - * Copyright 2015 Arduino LLC (http://www.arduino.cc/) - */ - -package test - -import ( - "arduino.cc/builder" - "arduino.cc/builder/types" - "github.com/stretchr/testify/require" - "path/filepath" - "sort" - "testing" -) - -func TestCollectAllSourceFilesFromFoldersWithSources(t *testing.T) { - ctx := &types.Context{} - - sourceFiles := &types.UniqueStringQueue{} - ctx.CollectedSourceFiles = sourceFiles - foldersWithSources := &types.UniqueSourceFolderQueue{} - foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, "sketch_with_config"), Recurse: true}) - ctx.FoldersWithSourceFiles = foldersWithSources - - commands := []types.Command{ - &builder.CollectAllSourceFilesFromFoldersWithSources{}, - } - - for _, command := range commands { - err := command.Run(ctx) - NoError(t, err) - } - - require.Equal(t, 1, len(*sourceFiles)) - require.Equal(t, 0, len(*foldersWithSources)) - sort.Strings(*sourceFiles) - - require.Equal(t, Abs(t, filepath.Join("sketch_with_config", "src", "includes", "de bug.cpp")), sourceFiles.Pop()) - require.Equal(t, 0, len(*sourceFiles)) -} - -func TestCollectAllSourceFilesFromFoldersWithSourcesOfLibrary(t *testing.T) { - ctx := &types.Context{} - - sourceFiles := &types.UniqueStringQueue{} - ctx.CollectedSourceFiles = sourceFiles - foldersWithSources := &types.UniqueSourceFolderQueue{} - foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, filepath.Join("downloaded_libraries", "Bridge")), Recurse: true}) - ctx.FoldersWithSourceFiles = foldersWithSources - - commands := []types.Command{ - &builder.CollectAllSourceFilesFromFoldersWithSources{}, - } - - for _, command := range commands { - err := command.Run(ctx) - NoError(t, err) - } - - require.Equal(t, 9, len(*sourceFiles)) - require.Equal(t, 0, len(*foldersWithSources)) - sort.Strings(*sourceFiles) - - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "Bridge.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "BridgeClient.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "BridgeServer.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "BridgeUdp.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "Console.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "FileIO.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "HttpClient.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "Mailbox.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "Process.cpp")), sourceFiles.Pop()) - require.Equal(t, 0, len(*sourceFiles)) -} - -func TestCollectAllSourceFilesFromFoldersWithSourcesOfOldLibrary(t *testing.T) { - ctx := &types.Context{} - - sourceFiles := &types.UniqueStringQueue{} - ctx.CollectedSourceFiles = sourceFiles - foldersWithSources := &types.UniqueSourceFolderQueue{} - foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs")), Recurse: false}) - foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs", "utility")), Recurse: false}) - ctx.FoldersWithSourceFiles = foldersWithSources - - commands := []types.Command{ - &builder.CollectAllSourceFilesFromFoldersWithSources{}, - } - - for _, command := range commands { - err := command.Run(ctx) - NoError(t, err) - } - - require.Equal(t, 2, len(*sourceFiles)) - require.Equal(t, 0, len(*foldersWithSources)) - sort.Strings(*sourceFiles) - - require.Equal(t, Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs", "ShouldNotRecurseWithOldLibs.cpp")), sourceFiles.Pop()) - require.Equal(t, Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs", "utility", "utils.cpp")), sourceFiles.Pop()) - require.Equal(t, 0, len(*sourceFiles)) -} diff --git a/src/arduino.cc/builder/test/includes_finder_with_regexp_test.go b/src/arduino.cc/builder/test/includes_finder_with_regexp_test.go index 161416be..d6bc1553 100644 --- a/src/arduino.cc/builder/test/includes_finder_with_regexp_test.go +++ b/src/arduino.cc/builder/test/includes_finder_with_regexp_test.go @@ -33,7 +33,6 @@ import ( "arduino.cc/builder" "arduino.cc/builder/types" "github.com/stretchr/testify/require" - "sort" "testing" ) @@ -50,9 +49,7 @@ func TestIncludesFinderWithRegExp(t *testing.T) { err := parser.Run(ctx) NoError(t, err) - includes := ctx.Includes - require.Equal(t, 1, len(includes)) - require.Equal(t, "SPI.h", includes[0]) + require.Equal(t, "SPI.h", ctx.IncludeJustFound) } func TestIncludesFinderWithRegExpEmptyOutput(t *testing.T) { @@ -66,31 +63,7 @@ func TestIncludesFinderWithRegExpEmptyOutput(t *testing.T) { err := parser.Run(ctx) NoError(t, err) - includes := ctx.Includes - require.Equal(t, 0, len(includes)) -} - -func TestIncludesFinderWithRegExpPreviousIncludes(t *testing.T) { - ctx := &types.Context{ - Includes: []string{"test.h"}, - } - - output := "/some/path/sketch.ino:1:17: fatal error: SPI.h: No such file or directory\n" + - "#include \n" + - "^\n" + - "compilation terminated." - - ctx.Source = output - - parser := builder.IncludesFinderWithRegExp{Source: &ctx.Source} - err := parser.Run(ctx) - NoError(t, err) - - includes := ctx.Includes - require.Equal(t, 2, len(includes)) - sort.Strings(includes) - require.Equal(t, "SPI.h", includes[0]) - require.Equal(t, "test.h", includes[1]) + require.Equal(t, "", ctx.IncludeJustFound) } func TestIncludesFinderWithRegExpPaddedIncludes(t *testing.T) { @@ -106,10 +79,7 @@ func TestIncludesFinderWithRegExpPaddedIncludes(t *testing.T) { err := parser.Run(ctx) NoError(t, err) - includes := ctx.Includes - require.Equal(t, 1, len(includes)) - sort.Strings(includes) - require.Equal(t, "Wire.h", includes[0]) + require.Equal(t, "Wire.h", ctx.IncludeJustFound) } func TestIncludesFinderWithRegExpPaddedIncludes2(t *testing.T) { @@ -125,10 +95,7 @@ func TestIncludesFinderWithRegExpPaddedIncludes2(t *testing.T) { err := parser.Run(ctx) NoError(t, err) - includes := ctx.Includes - require.Equal(t, 1, len(includes)) - sort.Strings(includes) - require.Equal(t, "Wire.h", includes[0]) + require.Equal(t, "Wire.h", ctx.IncludeJustFound) } func TestIncludesFinderWithRegExpPaddedIncludes3(t *testing.T) { @@ -143,10 +110,7 @@ func TestIncludesFinderWithRegExpPaddedIncludes3(t *testing.T) { err := parser.Run(ctx) NoError(t, err) - includes := ctx.Includes - require.Equal(t, 1, len(includes)) - sort.Strings(includes) - require.Equal(t, "SPI.h", includes[0]) + require.Equal(t, "SPI.h", ctx.IncludeJustFound) } func TestIncludesFinderWithRegExpPaddedIncludes4(t *testing.T) { @@ -161,8 +125,5 @@ func TestIncludesFinderWithRegExpPaddedIncludes4(t *testing.T) { err := parser.Run(ctx) NoError(t, err) - includes := ctx.Includes - require.Equal(t, 1, len(includes)) - sort.Strings(includes) - require.Equal(t, "register.h", includes[0]) + require.Equal(t, "register.h", ctx.IncludeJustFound) } diff --git a/src/arduino.cc/builder/types/accessories.go b/src/arduino.cc/builder/types/accessories.go index 1d7b7fc2..3270ce26 100644 --- a/src/arduino.cc/builder/types/accessories.go +++ b/src/arduino.cc/builder/types/accessories.go @@ -51,26 +51,3 @@ func (queue *UniqueStringQueue) Pop() interface{} { func (queue *UniqueStringQueue) Empty() bool { return queue.Len() == 0 } - -type UniqueSourceFolderQueue []SourceFolder - -func (queue UniqueSourceFolderQueue) Len() int { return len(queue) } -func (queue UniqueSourceFolderQueue) Less(i, j int) bool { return false } -func (queue UniqueSourceFolderQueue) Swap(i, j int) { panic("Who called me?!?") } - -func (queue *UniqueSourceFolderQueue) Push(value SourceFolder) { - if !sliceContainsSourceFolder(*queue, value) { - *queue = append(*queue, value) - } -} - -func (queue *UniqueSourceFolderQueue) Pop() interface{} { - old := *queue - x := old[0] - *queue = old[1:] - return x -} - -func (queue *UniqueSourceFolderQueue) Empty() bool { - return queue.Len() == 0 -} diff --git a/src/arduino.cc/builder/types/context.go b/src/arduino.cc/builder/types/context.go index 75a052b2..d1421deb 100644 --- a/src/arduino.cc/builder/types/context.go +++ b/src/arduino.cc/builder/types/context.go @@ -47,7 +47,6 @@ type Context struct { SketchObjectFiles []string CollectedSourceFiles *UniqueStringQueue - FoldersWithSourceFiles *UniqueSourceFolderQueue Sketch *Sketch Source string @@ -56,12 +55,11 @@ type Context struct { WarningsLevel string // Libraries handling - Includes []string Libraries []*Library HeaderToLibraries map[string][]*Library ImportedLibraries []*Library LibrariesResolutionResults map[string]LibraryResolutionResult - IncludesJustFound []string + IncludeJustFound string IncludeFolders []string OutputGccMinusM string diff --git a/src/arduino.cc/builder/types/utils.go b/src/arduino.cc/builder/types/utils.go index 1d26c93d..d7c6d40a 100644 --- a/src/arduino.cc/builder/types/utils.go +++ b/src/arduino.cc/builder/types/utils.go @@ -38,12 +38,3 @@ func sliceContains(slice []string, target string) bool { } return false } - -func sliceContainsSourceFolder(slice []SourceFolder, target SourceFolder) bool { - for _, elem := range slice { - if elem.Folder == target.Folder { - return true - } - } - return false -}