• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mlange-42 / modo / 12908930225

22 Jan 2025 01:09PM CUT coverage: 61.572%. Remained the same
12908930225

push

github

web-flow
Always mention config in addition to flags (#95)

0 of 1 new or added line in 1 file covered. (0.0%)

987 of 1603 relevant lines covered (61.57%)

29.41 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.07
/document/filter.go
1
package document
2

3
import (
4
        "fmt"
5
        "strings"
6
)
7

8
// Filters and re-structures docs for package re-exports.
9
//
10
// Also collects a lookup, mapping from original to altered cross-refs.
11
func (proc *Processor) filterPackages() error {
8✔
12
        proc.linkExports = map[string]string{}
8✔
13
        proc.linkExportsReverse = map[string]*exportError{}
8✔
14
        anyExports, err := proc.collectExports(proc.Docs.Decl, nil)
8✔
15
        if err != nil {
8✔
16
                return err
×
17
        }
×
18

19
        if !proc.Config.UseExports {
11✔
20
                proc.ExportDocs = &Docs{
3✔
21
                        Version: proc.Docs.Version,
3✔
22
                        Decl:    proc.Docs.Decl,
3✔
23
                }
3✔
24
                return nil
3✔
25
        }
3✔
26

27
        if !anyExports {
5✔
NEW
28
                return fmt.Errorf("no package re-exports found. As 'exports' are enabled, there will be no output.\n       Add re-exports or run without 'exports' enabled")
×
29
        }
×
30

31
        proc.ExportDocs = &Docs{
5✔
32
                Version: proc.Docs.Version,
5✔
33
                Decl:    proc.Docs.Decl.linkedCopy(),
5✔
34
        }
5✔
35
        proc.addLinkExport([]string{proc.Docs.Decl.Name}, []string{proc.Docs.Decl.Name})
5✔
36
        proc.filterPackage(proc.Docs.Decl, proc.ExportDocs.Decl, nil, nil)
5✔
37

5✔
38
        errs := []*exportError{}
5✔
39
        for _, expErr := range proc.linkExportsReverse {
75✔
40
                if len(expErr.OldPaths) > 1 {
70✔
41
                        errs = append(errs, expErr)
×
42
                }
×
43
        }
44
        if len(errs) == 0 {
10✔
45
                return nil
5✔
46
        }
5✔
47
        msg := strings.Builder{}
×
48
        msg.WriteString(fmt.Sprintln("Name collisions in package re-exports:"))
×
49
        for _, expErr := range errs {
×
50
                msg.WriteString(fmt.Sprintf(" - %s (", expErr.NewPath))
×
51
                for i, pOld := range expErr.OldPaths {
×
52
                        if i > 0 {
×
53
                                msg.WriteString(", ")
×
54
                        }
×
55
                        msg.WriteString(pOld)
×
56
                }
57
                msg.WriteString(")\n")
×
58
        }
59

60
        return fmt.Errorf("%s", msg.String())
×
61
}
62

63
func (proc *Processor) filterPackage(src, rootOut *Package, oldPath, newPath []string) {
9✔
64
        rootExports := map[string]*members{}
9✔
65
        collectExportsPackage(src, rootExports)
9✔
66

9✔
67
        oldPath = appendNew(oldPath, src.Name)
9✔
68
        newPath = appendNew(newPath, src.Name)
9✔
69

9✔
70
        for _, mod := range src.Modules {
23✔
71
                if mems, ok := rootExports[mod.Name]; ok {
28✔
72
                        proc.collectModuleExports(mod, rootOut, oldPath, newPath, mems)
14✔
73
                }
14✔
74
        }
75

76
        for _, pkg := range src.Packages {
13✔
77
                if mems, ok := rootExports[pkg.Name]; ok {
8✔
78
                        proc.collectPackageExports(pkg, rootOut, oldPath, newPath, mems)
4✔
79
                }
4✔
80
        }
81
}
82

83
func (proc *Processor) collectPackageExports(src, rootOut *Package, oldPath, newPath []string, rootMembers *members) {
4✔
84
        selfIncluded, toCrawl := collectExportMembers(rootMembers)
4✔
85

4✔
86
        if selfIncluded {
8✔
87
                newPkg := src.linkedCopy()
4✔
88
                proc.filterPackage(src, newPkg, oldPath, newPath)
4✔
89
                rootOut.Packages = append(rootOut.Packages, newPkg)
4✔
90

4✔
91
                tempOldPath := appendNew(oldPath, src.Name)
4✔
92
                tempNewPath := appendNew(newPath, src.Name)
4✔
93
                proc.addLinkExport(tempOldPath, tempNewPath)
4✔
94
        }
4✔
95
        oldPath = appendNew(oldPath, src.Name)
4✔
96

4✔
97
        for _, mod := range src.Modules {
8✔
98
                if mems, ok := toCrawl[mod.Name]; ok {
6✔
99
                        proc.collectModuleExports(mod, rootOut, oldPath, newPath, mems)
2✔
100
                }
2✔
101
        }
102

103
        for _, pkg := range src.Packages {
4✔
104
                if mems, ok := toCrawl[pkg.Name]; ok {
×
105
                        proc.collectPackageExports(pkg, rootOut, oldPath, newPath, mems)
×
106
                }
×
107
        }
108

109
        for _, elem := range src.Aliases {
4✔
110
                proc.collectExportsAlias(elem, oldPath, newPath)
×
111
        }
×
112
        for _, elem := range src.Structs {
4✔
113
                proc.collectExportsStruct(elem, oldPath, newPath)
×
114
        }
×
115
        for _, elem := range src.Traits {
4✔
116
                proc.collectExportsTrait(elem, oldPath, newPath)
×
117
        }
×
118
        for _, elem := range src.Functions {
4✔
119
                proc.collectExportsFunction(elem, oldPath, newPath)
×
120
        }
×
121
}
122

123
func (proc *Processor) collectModuleExports(src *Module, rootOut *Package, oldPath, newPath []string, rootMembers *members) {
16✔
124
        selfIncluded, toCrawl := collectExportMembers(rootMembers)
16✔
125

16✔
126
        oldPath = appendNew(oldPath, src.Name)
16✔
127
        if selfIncluded {
25✔
128
                rootOut.Modules = append(rootOut.Modules, src)
9✔
129

9✔
130
                tempNewPath := appendNew(newPath, src.Name)
9✔
131
                proc.addLinkExport(oldPath, tempNewPath)
9✔
132

9✔
133
                collectExportsList(proc, src.Aliases, oldPath, tempNewPath)
9✔
134
                for _, elem := range src.Structs {
18✔
135
                        proc.collectExportsStruct(elem, oldPath, tempNewPath)
9✔
136
                }
9✔
137
                for _, elem := range src.Traits {
10✔
138
                        proc.collectExportsTrait(elem, oldPath, tempNewPath)
1✔
139
                }
1✔
140
                for _, elem := range src.Functions {
10✔
141
                        proc.collectExportsFunction(elem, oldPath, tempNewPath)
1✔
142
                }
1✔
143
        }
144

145
        for _, elem := range src.Aliases {
21✔
146
                if _, ok := toCrawl[elem.Name]; ok {
7✔
147
                        rootOut.Aliases = append(rootOut.Aliases, elem)
2✔
148
                        proc.collectExportsAlias(elem, oldPath, newPath)
2✔
149
                }
2✔
150
        }
151
        for _, elem := range src.Structs {
34✔
152
                if _, ok := toCrawl[elem.Name]; ok {
27✔
153
                        rootOut.Structs = append(rootOut.Structs, elem)
9✔
154
                        proc.collectExportsStruct(elem, oldPath, newPath)
9✔
155
                }
9✔
156
        }
157
        for _, elem := range src.Traits {
21✔
158
                if _, ok := toCrawl[elem.Name]; ok {
7✔
159
                        rootOut.Traits = append(rootOut.Traits, elem)
2✔
160
                        proc.collectExportsTrait(elem, oldPath, newPath)
2✔
161
                }
2✔
162
        }
163
        for _, elem := range src.Functions {
21✔
164
                if _, ok := toCrawl[elem.Name]; ok {
9✔
165
                        rootOut.Functions = append(rootOut.Functions, elem)
4✔
166
                        proc.collectExportsFunction(elem, oldPath, newPath)
4✔
167
                }
4✔
168
        }
169
}
170

171
func (proc *Processor) collectExportsStruct(s *Struct, oldPath []string, newPath []string) {
18✔
172
        oldPath = appendNew(oldPath, s.Name)
18✔
173
        newPath = appendNew(newPath, s.Name)
18✔
174

18✔
175
        proc.addLinkExport(oldPath, newPath)
18✔
176

18✔
177
        collectExportsList(proc, s.Aliases, oldPath, newPath)
18✔
178
        collectExportsList(proc, s.Parameters, oldPath, newPath)
18✔
179
        collectExportsList(proc, s.Fields, oldPath, newPath)
18✔
180
        collectExportsList(proc, s.Functions, oldPath, newPath)
18✔
181
}
18✔
182

183
func (proc *Processor) collectExportsAlias(a *Alias, oldPath []string, newPath []string) {
2✔
184
        oldPath = appendNew(oldPath, a.Name)
2✔
185
        newPath = appendNew(newPath, a.Name)
2✔
186

2✔
187
        proc.addLinkExport(oldPath, newPath)
2✔
188
}
2✔
189

190
func (proc *Processor) collectExportsTrait(s *Trait, oldPath []string, newPath []string) {
3✔
191
        oldPath = appendNew(oldPath, s.Name)
3✔
192
        newPath = appendNew(newPath, s.Name)
3✔
193

3✔
194
        proc.addLinkExport(oldPath, newPath)
3✔
195

3✔
196
        collectExportsList(proc, s.Fields, oldPath, newPath)
3✔
197
        collectExportsList(proc, s.Functions, oldPath, newPath)
3✔
198
}
3✔
199

200
func (proc *Processor) collectExportsFunction(s *Function, oldPath []string, newPath []string) {
5✔
201
        oldPath = appendNew(oldPath, s.Name)
5✔
202
        newPath = appendNew(newPath, s.Name)
5✔
203

5✔
204
        proc.addLinkExport(oldPath, newPath)
5✔
205
}
5✔
206

207
func collectExportsList[T Named](proc *Processor, sl []T, oldPath, newPath []string) {
87✔
208
        for _, elem := range sl {
111✔
209
                oldPath := appendNew(oldPath, elem.GetName())
24✔
210
                newPath := appendNew(newPath, elem.GetName())
24✔
211
                proc.addLinkExport(oldPath, newPath)
24✔
212
        }
24✔
213
}
214

215
type members struct {
216
        Members []member
217
}
218

219
type member struct {
220
        Include bool
221
        RelPath []string
222
}
223

224
func collectExportMembers(parentMember *members) (selfIncluded bool, toCrawl map[string]*members) {
20✔
225
        selfIncluded = false
20✔
226
        toCrawl = map[string]*members{}
20✔
227

20✔
228
        for _, mem := range parentMember.Members {
54✔
229
                if mem.Include {
47✔
230
                        selfIncluded = true
13✔
231
                        continue
13✔
232
                }
233
                var newMember member
21✔
234
                if len(mem.RelPath) == 1 {
40✔
235
                        newMember = member{Include: true}
19✔
236
                } else {
21✔
237
                        newMember = member{RelPath: mem.RelPath[1:]}
2✔
238
                }
2✔
239
                if members, ok := toCrawl[mem.RelPath[0]]; ok {
23✔
240
                        members.Members = append(members.Members, newMember)
2✔
241
                        continue
2✔
242
                }
243
                toCrawl[mem.RelPath[0]] = &members{Members: []member{newMember}}
19✔
244
        }
245

246
        return
20✔
247
}
248

249
func collectExportsPackage(p *Package, out map[string]*members) {
9✔
250
        for _, ex := range p.exports {
39✔
251
                var newMember member
30✔
252
                if len(ex.Short) == 1 {
41✔
253
                        newMember = member{Include: true}
11✔
254
                } else {
30✔
255
                        newMember = member{RelPath: ex.Short[1:]}
19✔
256
                }
19✔
257
                if members, ok := out[ex.Short[0]]; ok {
42✔
258
                        members.Members = append(members.Members, newMember)
12✔
259
                        continue
12✔
260
                }
261
                out[ex.Short[0]] = &members{Members: []member{newMember}}
18✔
262
        }
263
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc