@@ -9,10 +9,12 @@ import (
9
9
"reflect"
10
10
11
11
"github.com/BurntSushi/toml"
12
+ "github.com/golangci/golangci-lint/pkg/logutils"
12
13
"github.com/mgechev/dots"
13
14
reviveConfig "github.com/mgechev/revive/config"
14
15
"github.com/mgechev/revive/lint"
15
16
"github.com/mgechev/revive/rule"
17
+ "github.com/pkg/errors"
16
18
"golang.org/x/tools/go/analysis"
17
19
18
20
"github.com/golangci/golangci-lint/pkg/config"
@@ -31,6 +33,8 @@ type jsonObject struct {
31
33
32
34
// NewRevive returns a new Revive linter.
33
35
func NewRevive (cfg * config.ReviveSettings ) * goanalysis.Linter {
36
+ reviveDebugf := logutils .Debug ("revive" )
37
+
34
38
var issues []goanalysis.Issue
35
39
36
40
analyzer := & analysis.Analyzer {
@@ -56,6 +60,8 @@ func NewRevive(cfg *config.ReviveSettings) *goanalysis.Linter {
56
60
return nil , err
57
61
}
58
62
63
+ reviveDebugf ("revive configuration: %#v" , conf )
64
+
59
65
formatter , err := reviveConfig .GetFormatter ("json" )
60
66
if err != nil {
61
67
return nil , err
@@ -145,13 +151,13 @@ func getReviveConfig(cfg *config.ReviveSettings) (*lint.Config, error) {
145
151
146
152
err := toml .NewEncoder (buf ).Encode (rawRoot )
147
153
if err != nil {
148
- return nil , err
154
+ return nil , errors . Wrap ( err , "failed to encode configuration" )
149
155
}
150
156
151
157
conf = & lint.Config {}
152
158
_ , err = toml .DecodeReader (buf , conf )
153
159
if err != nil {
154
- return nil , err
160
+ return nil , errors . Wrap ( err , "failed to decode configuration" )
155
161
}
156
162
}
157
163
@@ -184,7 +190,7 @@ func createConfigMap(cfg *config.ReviveSettings) map[string]interface{} {
184
190
for _ , s := range cfg .Rules {
185
191
rawRules [s .Name ] = map [string ]interface {}{
186
192
"severity" : s .Severity ,
187
- "arguments" : s .Arguments ,
193
+ "arguments" : safeTomlSlice ( s .Arguments ) ,
188
194
}
189
195
}
190
196
@@ -195,6 +201,28 @@ func createConfigMap(cfg *config.ReviveSettings) map[string]interface{} {
195
201
return rawRoot
196
202
}
197
203
204
+ func safeTomlSlice (r []interface {}) []interface {} {
205
+ if len (r ) == 0 {
206
+ return nil
207
+ }
208
+
209
+ if _ , ok := r [0 ].(map [interface {}]interface {}); ! ok {
210
+ return r
211
+ }
212
+
213
+ var typed []interface {}
214
+ for _ , elt := range r {
215
+ item := map [string ]interface {}{}
216
+ for k , v := range elt .(map [interface {}]interface {}) {
217
+ item [k .(string )] = v
218
+ }
219
+
220
+ typed = append (typed , item )
221
+ }
222
+
223
+ return typed
224
+ }
225
+
198
226
// This element is not exported by revive, so we need copy the code.
199
227
// Extracted from https://github.com/mgechev/revive/blob/389ba853b0b3587f0c3b71b5f0c61ea4e23928ec/config/config.go#L15
200
228
var defaultRules = []lint.Rule {
0 commit comments