github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/cmd/internal/cov/readcovdata.go (about)

     1  // Copyright 2022 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package cov
     6  
     7  import (
     8  	"github.com/shogo82148/std/internal/coverage"
     9  	"github.com/shogo82148/std/internal/coverage/decodecounter"
    10  	"github.com/shogo82148/std/internal/coverage/decodemeta"
    11  	"github.com/shogo82148/std/internal/coverage/pods"
    12  )
    13  
    14  // CovDataReader is a general-purpose helper/visitor object for
    15  // reading coverage data files in a structured way. Clients create a
    16  // CovDataReader to process a given collection of coverage data file
    17  // directories, then pass in a visitor object with methods that get
    18  // invoked at various important points. CovDataReader is intended
    19  // to facilitate common coverage data file operations such as
    20  // merging or intersecting data files, analyzing data files, or
    21  // dumping data files.
    22  type CovDataReader struct {
    23  	vis            CovDataVisitor
    24  	indirs         []string
    25  	matchpkg       func(name string) bool
    26  	flags          CovDataReaderFlags
    27  	err            error
    28  	verbosityLevel int
    29  }
    30  
    31  // MakeCovDataReader creates a CovDataReader object to process the
    32  // given set of input directories. Here 'vis' is a visitor object
    33  // providing methods to be invoked as we walk through the data,
    34  // 'indirs' is the set of coverage data directories to examine,
    35  // 'verbosityLevel' controls the level of debugging trace messages
    36  // (zero for off, higher for more output), 'flags' stores flags that
    37  // indicate what to do if errors are detected, and 'matchpkg' is a
    38  // caller-provided function that can be used to select specific
    39  // packages by name (if nil, then all packages are included).
    40  func MakeCovDataReader(vis CovDataVisitor, indirs []string, verbosityLevel int, flags CovDataReaderFlags, matchpkg func(name string) bool) *CovDataReader
    41  
    42  type CovDataVisitor interface {
    43  	BeginPod(p pods.Pod)
    44  	EndPod(p pods.Pod)
    45  
    46  	VisitMetaDataFile(mdf string, mfr *decodemeta.CoverageMetaFileReader)
    47  
    48  	BeginCounterDataFile(cdf string, cdr *decodecounter.CounterDataReader, dirIdx int)
    49  	EndCounterDataFile(cdf string, cdr *decodecounter.CounterDataReader, dirIdx int)
    50  
    51  	VisitFuncCounterData(payload decodecounter.FuncPayload)
    52  
    53  	EndCounters()
    54  
    55  	BeginPackage(pd *decodemeta.CoverageMetaDataDecoder, pkgIdx uint32)
    56  	EndPackage(pd *decodemeta.CoverageMetaDataDecoder, pkgIdx uint32)
    57  
    58  	VisitFunc(pkgIdx uint32, fnIdx uint32, fd *coverage.FuncDesc)
    59  
    60  	Finish()
    61  }
    62  
    63  type CovDataReaderFlags uint32
    64  
    65  const (
    66  	CovDataReaderNoFlags CovDataReaderFlags = 0
    67  	PanicOnError                            = 1 << iota
    68  	PanicOnWarning
    69  )
    70  
    71  func (r *CovDataReader) Visit() error