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

mlange-42 / modo / 12865372188

20 Jan 2025 09:53AM CUT coverage: 60.673% (+4.0%) from 56.633%
12865372188

push

github

web-flow
Full file to file test (#74)

901 of 1485 relevant lines covered (60.67%)

22.3 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✔
28
                return fmt.Errorf("no package re-exports found. Given flag '--exports', there will be no output.\n       Add exports or run without flag '--exports'")
×
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 {
69✔
40
                if len(expErr.OldPaths) > 1 {
64✔
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
type exportError struct {
64
        NewPath  string
65
        OldPaths []string
66
}
67

68
func (proc *Processor) filterPackage(src, rootOut *Package, oldPath, newPath []string) {
9✔
69
        rootExports := map[string]*members{}
9✔
70
        collectExportsPackage(src, rootExports)
9✔
71

9✔
72
        oldPath = appendNew(oldPath, src.Name)
9✔
73
        newPath = appendNew(newPath, src.Name)
9✔
74

9✔
75
        for _, mod := range src.Modules {
21✔
76
                if mems, ok := rootExports[mod.Name]; ok {
24✔
77
                        proc.collectModuleExports(mod, rootOut, oldPath, newPath, mems)
12✔
78
                }
12✔
79
        }
80

81
        for _, pkg := range src.Packages {
13✔
82
                if mems, ok := rootExports[pkg.Name]; ok {
8✔
83
                        proc.collectPackageExports(pkg, rootOut, oldPath, newPath, mems)
4✔
84
                }
4✔
85
        }
86
}
87

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

4✔
91
        if selfIncluded {
8✔
92
                newPkg := src.linkedCopy()
4✔
93
                proc.filterPackage(src, newPkg, oldPath, newPath)
4✔
94
                rootOut.Packages = append(rootOut.Packages, newPkg)
4✔
95

4✔
96
                tempOldPath := appendNew(oldPath, src.Name)
4✔
97
                tempNewPath := appendNew(newPath, src.Name)
4✔
98
                proc.addLinkExport(tempOldPath, tempNewPath)
4✔
99
        }
4✔
100
        oldPath = appendNew(oldPath, src.Name)
4✔
101

4✔
102
        for _, mod := range src.Modules {
8✔
103
                if mems, ok := toCrawl[mod.Name]; ok {
6✔
104
                        proc.collectModuleExports(mod, rootOut, oldPath, newPath, mems)
2✔
105
                }
2✔
106
        }
107

108
        for _, pkg := range src.Packages {
4✔
109
                if mems, ok := toCrawl[pkg.Name]; ok {
×
110
                        proc.collectPackageExports(pkg, rootOut, oldPath, newPath, mems)
×
111
                }
×
112
        }
113

114
        for _, elem := range src.Aliases {
4✔
115
                proc.collectExportsAlias(elem, oldPath, newPath)
×
116
        }
×
117
        for _, elem := range src.Structs {
4✔
118
                proc.collectExportsStruct(elem, oldPath, newPath)
×
119
        }
×
120
        for _, elem := range src.Traits {
4✔
121
                proc.collectExportsTrait(elem, oldPath, newPath)
×
122
        }
×
123
        for _, elem := range src.Functions {
4✔
124
                proc.collectExportsFunction(elem, oldPath, newPath)
×
125
        }
×
126
}
127

128
func (proc *Processor) collectModuleExports(src *Module, rootOut *Package, oldPath, newPath []string, rootMembers *members) {
14✔
129
        selfIncluded, toCrawl := collectExportMembers(rootMembers)
14✔
130

14✔
131
        oldPath = appendNew(oldPath, src.Name)
14✔
132
        if selfIncluded {
21✔
133
                rootOut.Modules = append(rootOut.Modules, src)
7✔
134

7✔
135
                tempNewPath := appendNew(newPath, src.Name)
7✔
136
                proc.addLinkExport(oldPath, tempNewPath)
7✔
137

7✔
138
                collectExportsList(proc, src.Aliases, oldPath, tempNewPath)
7✔
139
                for _, elem := range src.Structs {
14✔
140
                        proc.collectExportsStruct(elem, oldPath, tempNewPath)
7✔
141
                }
7✔
142
                for _, elem := range src.Traits {
8✔
143
                        proc.collectExportsTrait(elem, oldPath, tempNewPath)
1✔
144
                }
1✔
145
                for _, elem := range src.Functions {
8✔
146
                        proc.collectExportsFunction(elem, oldPath, tempNewPath)
1✔
147
                }
1✔
148
        }
149

150
        for _, elem := range src.Aliases {
19✔
151
                if _, ok := toCrawl[elem.Name]; ok {
7✔
152
                        rootOut.Aliases = append(rootOut.Aliases, elem)
2✔
153
                        proc.collectExportsAlias(elem, oldPath, newPath)
2✔
154
                }
2✔
155
        }
156
        for _, elem := range src.Structs {
30✔
157
                if _, ok := toCrawl[elem.Name]; ok {
25✔
158
                        rootOut.Structs = append(rootOut.Structs, elem)
9✔
159
                        proc.collectExportsStruct(elem, oldPath, newPath)
9✔
160
                }
9✔
161
        }
162
        for _, elem := range src.Traits {
19✔
163
                if _, ok := toCrawl[elem.Name]; ok {
7✔
164
                        rootOut.Traits = append(rootOut.Traits, elem)
2✔
165
                        proc.collectExportsTrait(elem, oldPath, newPath)
2✔
166
                }
2✔
167
        }
168
        for _, elem := range src.Functions {
19✔
169
                if _, ok := toCrawl[elem.Name]; ok {
9✔
170
                        rootOut.Functions = append(rootOut.Functions, elem)
4✔
171
                        proc.collectExportsFunction(elem, oldPath, newPath)
4✔
172
                }
4✔
173
        }
174
}
175

176
func (proc *Processor) collectExportsStruct(s *Struct, oldPath []string, newPath []string) {
16✔
177
        oldPath = appendNew(oldPath, s.Name)
16✔
178
        newPath = appendNew(newPath, s.Name)
16✔
179

16✔
180
        proc.addLinkExport(oldPath, newPath)
16✔
181

16✔
182
        collectExportsList(proc, s.Aliases, oldPath, newPath)
16✔
183
        collectExportsList(proc, s.Parameters, oldPath, newPath)
16✔
184
        collectExportsList(proc, s.Fields, oldPath, newPath)
16✔
185
        collectExportsList(proc, s.Functions, oldPath, newPath)
16✔
186
}
16✔
187

188
func (proc *Processor) collectExportsAlias(a *Alias, oldPath []string, newPath []string) {
2✔
189
        oldPath = appendNew(oldPath, a.Name)
2✔
190
        newPath = appendNew(newPath, a.Name)
2✔
191

2✔
192
        proc.addLinkExport(oldPath, newPath)
2✔
193
}
2✔
194

195
func (proc *Processor) collectExportsTrait(s *Trait, oldPath []string, newPath []string) {
3✔
196
        oldPath = appendNew(oldPath, s.Name)
3✔
197
        newPath = appendNew(newPath, s.Name)
3✔
198

3✔
199
        proc.addLinkExport(oldPath, newPath)
3✔
200

3✔
201
        collectExportsList(proc, s.Fields, oldPath, newPath)
3✔
202
        collectExportsList(proc, s.Functions, oldPath, newPath)
3✔
203
}
3✔
204

205
func (proc *Processor) collectExportsFunction(s *Function, oldPath []string, newPath []string) {
5✔
206
        oldPath = appendNew(oldPath, s.Name)
5✔
207
        newPath = appendNew(newPath, s.Name)
5✔
208

5✔
209
        proc.addLinkExport(oldPath, newPath)
5✔
210
}
5✔
211

212
func collectExportsList[T Named](proc *Processor, sl []T, oldPath, newPath []string) {
77✔
213
        for _, elem := range sl {
99✔
214
                oldPath := appendNew(oldPath, elem.GetName())
22✔
215
                newPath := appendNew(newPath, elem.GetName())
22✔
216
                proc.addLinkExport(oldPath, newPath)
22✔
217
        }
22✔
218
}
219

220
type members struct {
221
        Members []member
222
}
223

224
type member struct {
225
        Include bool
226
        RelPath []string
227
}
228

229
func collectExportMembers(parentMember *members) (selfIncluded bool, toCrawl map[string]*members) {
18✔
230
        selfIncluded = false
18✔
231
        toCrawl = map[string]*members{}
18✔
232

18✔
233
        for _, mem := range parentMember.Members {
50✔
234
                if mem.Include {
43✔
235
                        selfIncluded = true
11✔
236
                        continue
11✔
237
                }
238
                var newMember member
21✔
239
                if len(mem.RelPath) == 1 {
40✔
240
                        newMember = member{Include: true}
19✔
241
                } else {
21✔
242
                        newMember = member{RelPath: mem.RelPath[1:]}
2✔
243
                }
2✔
244
                if members, ok := toCrawl[mem.RelPath[0]]; ok {
23✔
245
                        members.Members = append(members.Members, newMember)
2✔
246
                        continue
2✔
247
                }
248
                toCrawl[mem.RelPath[0]] = &members{Members: []member{newMember}}
19✔
249
        }
250

251
        return
18✔
252
}
253

254
func collectExportsPackage(p *Package, out map[string]*members) {
9✔
255
        for _, ex := range p.exports {
37✔
256
                var newMember member
28✔
257
                if len(ex.Short) == 1 {
37✔
258
                        newMember = member{Include: true}
9✔
259
                } else {
28✔
260
                        newMember = member{RelPath: ex.Short[1:]}
19✔
261
                }
19✔
262
                if members, ok := out[ex.Short[0]]; ok {
40✔
263
                        members.Members = append(members.Members, newMember)
12✔
264
                        continue
12✔
265
                }
266
                out[ex.Short[0]] = &members{Members: []member{newMember}}
16✔
267
        }
268
}
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