-
Notifications
You must be signed in to change notification settings - Fork 37
/
analyzer.go
56 lines (51 loc) · 1.22 KB
/
analyzer.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
package definitiontypeorder
import (
"math"
"reflect"
"go.einride.tech/can/pkg/dbc"
"go.einride.tech/can/pkg/dbc/analysis"
)
func Analyzer() *analysis.Analyzer {
return &analysis.Analyzer{
Name: "definitiontypeorder",
Doc: "check that definitions are in the correct order",
Run: run,
}
}
func orderOf(def dbc.Def) uint64 {
for i, orderDef := range []dbc.Def{
&dbc.VersionDef{},
&dbc.NewSymbolsDef{},
&dbc.BitTimingDef{},
&dbc.NodesDef{},
&dbc.ValueTableDef{},
&dbc.MessageDef{},
&dbc.MessageTransmittersDef{},
&dbc.EnvironmentVariableDef{},
&dbc.EnvironmentVariableDataDef{},
&dbc.CommentDef{},
&dbc.AttributeDef{},
&dbc.AttributeDefaultValueDef{},
&dbc.AttributeValueForObjectDef{},
&dbc.ValueDescriptionsDef{},
} {
if reflect.TypeOf(def) == reflect.TypeOf(orderDef) {
return uint64(i)
}
}
return math.MaxUint64
}
func run(pass *analysis.Pass) error {
minOrder := uint64(math.MaxUint64)
for i := range pass.File.Defs {
// diagnostics make more sense when going backwards
def := pass.File.Defs[len(pass.File.Defs)-i-1]
currOrder := orderOf(def)
if currOrder > minOrder {
pass.Reportf(def.Position(), "definition out of order")
} else {
minOrder = currOrder
}
}
return nil
}