@@ -51,7 +51,7 @@ type libraryResolutionResult struct {
5151type SketchLibrariesDetector struct {
5252 librariesResolver * librariesresolver.Cpp
5353 useCachedLibrariesResolution bool
54- cache * includeCache
54+ cache * detectorCache
5555 onlyUpdateCompilationDatabase bool
5656 importedLibraries libraries.List
5757 librariesResolutionResults map [string ]libraryResolutionResult
@@ -71,6 +71,7 @@ func NewSketchLibrariesDetector(
7171 return & SketchLibrariesDetector {
7272 librariesResolver : libsResolver ,
7373 useCachedLibrariesResolution : useCachedLibrariesResolution ,
74+ cache : newDetectorCache (),
7475 librariesResolutionResults : map [string ]libraryResolutionResult {},
7576 importedLibraries : libraries.List {},
7677 includeFolders : paths.PathList {},
@@ -172,21 +173,10 @@ func (l *SketchLibrariesDetector) IncludeFolders() paths.PathList {
172173 return l .includeFolders
173174}
174175
175- // appendIncludeFolder todo should rename this, probably after refactoring the
176- // container_find_includes command.
177- // Original comment:
178- // Append the given folder to the include path and match or append it to
179- // the cache. sourceFilePath and include indicate the source of this
180- // include (e.g. what #include line in what file it was resolved from)
181- // and should be the empty string for the default include folders, like
182- // the core or variant.
183- func (l * SketchLibrariesDetector ) appendIncludeFolder (
184- sourceFilePath * paths.Path ,
185- include string ,
186- folder * paths.Path ,
187- ) {
176+ // addIncludeFolder add the given folder to the include path.
177+ func (l * SketchLibrariesDetector ) addIncludeFolder (folder * paths.Path ) {
188178 l .includeFolders = append (l .includeFolders , folder )
189- l .cache .ExpectEntry ( sourceFilePath , include , folder )
179+ l .cache .Expect ( & detectorCacheEntry { AddedIncludePath : folder } )
190180}
191181
192182// FindIncludes todo
@@ -242,11 +232,13 @@ func (l *SketchLibrariesDetector) findIncludes(
242232 }
243233
244234 cachePath := buildPath .Join ("includes.cache" )
245- l .cache = readCache (cachePath )
235+ if err := l .cache .Load (cachePath ); err != nil {
236+ l .logger .Warn (i18n .Tr ("Failed to load library discovery cache: %[1]s" , err ))
237+ }
246238
247- l .appendIncludeFolder ( nil , "" , buildCorePath )
239+ l .addIncludeFolder ( buildCorePath )
248240 if buildVariantPath != nil {
249- l .appendIncludeFolder ( nil , "" , buildVariantPath )
241+ l .addIncludeFolder ( buildVariantPath )
250242 }
251243
252244 sourceFileQueue := & uniqueSourceFileQueue {}
@@ -266,16 +258,15 @@ func (l *SketchLibrariesDetector) findIncludes(
266258 }
267259
268260 for ! sourceFileQueue .Empty () {
269- err := l .findIncludesUntilDone (ctx , sourceFileQueue , buildProperties , librariesBuildPath , platformArch )
261+ err := l .findMissingIncludesInCompilationUnit (ctx , sourceFileQueue , buildProperties , librariesBuildPath , platformArch )
270262 if err != nil {
271263 cachePath .Remove ()
272264 return err
273265 }
274266 }
275267
276268 // Finalize the cache
277- l .cache .ExpectEnd ()
278- if err := l .cache .write (cachePath ); err != nil {
269+ if err := l .cache .Save (cachePath ); err != nil {
279270 return err
280271 }
281272 }
@@ -293,7 +284,7 @@ func (l *SketchLibrariesDetector) findIncludes(
293284 return nil
294285}
295286
296- func (l * SketchLibrariesDetector ) findIncludesUntilDone (
287+ func (l * SketchLibrariesDetector ) findMissingIncludesInCompilationUnit (
297288 ctx context.Context ,
298289 sourceFileQueue * uniqueSourceFileQueue ,
299290 buildProperties * properties.Map ,
@@ -325,7 +316,7 @@ func (l *SketchLibrariesDetector) findIncludesUntilDone(
325316
326317 first := true
327318 for {
328- l .cache .ExpectFile ( sourcePath )
319+ l .cache .Expect ( & detectorCacheEntry { CompilingSourcePath : sourcePath } )
329320
330321 // Libraries may require the "utility" directory to be added to the include
331322 // search path, but only for the source code of the library, so we temporary
@@ -340,8 +331,8 @@ func (l *SketchLibrariesDetector) findIncludesUntilDone(
340331 var preprocFirstResult * runner.Result
341332
342333 var missingIncludeH string
343- if unchanged && l .cache .valid {
344- missingIncludeH = l . cache . Next (). Include
334+ if entry := l .cache .Peek (); unchanged && entry != nil && entry . MissingIncludeH != nil {
335+ missingIncludeH = * entry . MissingIncludeH
345336 if first && l .logger .Verbose () {
346337 l .logger .Info (i18n .Tr ("Using cached library dependencies for file: %[1]s" , sourcePath ))
347338 }
@@ -367,9 +358,10 @@ func (l *SketchLibrariesDetector) findIncludesUntilDone(
367358 }
368359 }
369360
361+ l .cache .Expect (& detectorCacheEntry {MissingIncludeH : & missingIncludeH })
362+
370363 if missingIncludeH == "" {
371364 // No missing includes found, we're done
372- l .cache .ExpectEntry (sourcePath , "" , nil )
373365 return nil
374366 }
375367
@@ -402,7 +394,7 @@ func (l *SketchLibrariesDetector) findIncludesUntilDone(
402394 // include path and queue its source files for further
403395 // include scanning
404396 l .AppendImportedLibraries (library )
405- l .appendIncludeFolder ( sourcePath , missingIncludeH , library .SourceDir )
397+ l .addIncludeFolder ( library .SourceDir )
406398
407399 if library .Precompiled && library .PrecompiledWithSources {
408400 // Fully precompiled libraries should have no dependencies to avoid ABI breakage
0 commit comments