-
Notifications
You must be signed in to change notification settings - Fork 0
/
gcovjs.go
74 lines (60 loc) · 1.51 KB
/
gcovjs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"compress/gzip"
"encoding/json"
"io"
)
type GCovData struct {
DataFile string `json:"data_file"`
GCCVersion string `json:"gcc_version"`
Files []GCovFile `json:"files"`
}
type GCovFile struct {
File string `json:"file"`
Functions []GCovFunction `json:"functions"`
Lines []GCovLine `json:"lines"`
}
type GCovFunction struct {
Name string `json:"name"`
StartLine int `json:"start_line"`
ExecutionCount uint64 `json:"execution_count"`
}
type GCovLine struct {
LineNumber int `json:"line_number"`
Count uint64 `json:"count"`
Branches []GCovBranch `json:"branches"`
}
type GCovBranch struct {
Fallthrough bool `json:"fallthrough"`
Count uint64 `json:"count"`
Throw bool `json:"throw"`
}
func loadGCovJSFile(fds FileDataSet, file io.Reader) error {
jsonData := GCovData{}
gz, err := gzip.NewReader(file)
if err != nil {
return err
}
err = json.NewDecoder(gz).Decode(&jsonData)
if err != nil {
return err
}
for _, v := range jsonData.Files {
filename := v.File
currentData := fds.FileData(filename)
for _, u := range v.Functions {
currentData.AppendFunctionData(u.Name, u.StartLine, u.ExecutionCount)
}
for _, u := range v.Lines {
currentData.AppendLineCountData(u.LineNumber, u.Count)
for _, b := range u.Branches {
status := BranchNotTaken
if b.Count > 0 {
status = BranchTaken
}
currentData.AppendBranchData(u.LineNumber, status)
}
}
}
return nil
}