@@ -29,44 +29,31 @@ const (
29
29
30
30
type parseModHandle struct {
31
31
handle * memoize.Handle
32
-
33
- mod , sum source.FileHandle
34
32
}
35
33
36
34
type parseModData struct {
37
35
memoize.NoCopy
38
36
39
- parsed * modfile.File
40
- m * protocol.ColumnMapper
41
-
42
- // parseErrors refers to syntax errors found in the go.mod file.
43
- parseErrors []source.Error
37
+ parsed * source.ParsedModule
44
38
45
39
// err is any error encountered while parsing the file.
46
40
err error
47
41
}
48
42
49
- func (mh * parseModHandle ) Mod () source.FileHandle {
50
- return mh .mod
51
- }
52
-
53
- func (mh * parseModHandle ) Sum () source.FileHandle {
54
- return mh .sum
55
- }
56
-
57
- func (mh * parseModHandle ) Parse (ctx context.Context , s source.Snapshot ) (* modfile.File , * protocol.ColumnMapper , []source.Error , error ) {
43
+ func (mh * parseModHandle ) parse (ctx context.Context , s source.Snapshot ) (* source.ParsedModule , error ) {
58
44
v , err := mh .handle .Get (ctx , s .(* snapshot ))
59
45
if err != nil {
60
- return nil , nil , nil , err
46
+ return nil , err
61
47
}
62
48
data := v .(* parseModData )
63
- return data .parsed , data .m , data . parseErrors , data . err
49
+ return data .parsed , data .err
64
50
}
65
51
66
- func (s * snapshot ) ParseModHandle (ctx context.Context , modFH source.FileHandle ) (source.ParseModHandle , error ) {
52
+ func (s * snapshot ) ParseMod (ctx context.Context , modFH source.FileHandle ) (* source.ParsedModule , error ) {
67
53
if handle := s .getModHandle (modFH .URI ()); handle != nil {
68
- return handle , nil
54
+ return handle . parse ( ctx , s )
69
55
}
56
+
70
57
h := s .view .session .cache .store .Bind (modFH .Identity ().String (), func (ctx context.Context , _ memoize.Arg ) interface {} {
71
58
_ , done := event .Start (ctx , "cache.ParseModHandle" , tag .URI .Of (modFH .URI ()))
72
59
defer done ()
@@ -80,55 +67,52 @@ func (s *snapshot) ParseModHandle(ctx context.Context, modFH source.FileHandle)
80
67
Converter : span .NewContentConverter (modFH .URI ().Filename (), contents ),
81
68
Content : contents ,
82
69
}
83
- parsed , err := modfile .Parse (modFH .URI ().Filename (), contents , nil )
84
- if err != nil {
85
- parseErr , _ := extractModParseErrors (modFH .URI (), m , err , contents )
86
- var parseErrors []source.Error
87
- if parseErr != nil {
88
- parseErrors = append (parseErrors , * parseErr )
89
- }
90
- return & parseModData {
91
- parseErrors : parseErrors ,
92
- err : err ,
93
- }
70
+ data := & parseModData {
71
+ parsed : & source.ParsedModule {
72
+ Mapper : m ,
73
+ },
94
74
}
95
- return & parseModData {
96
- parsed : parsed ,
97
- m : m ,
75
+ data .parsed .File , data .err = modfile .Parse (modFH .URI ().Filename (), contents , nil )
76
+ if data .err != nil {
77
+ // Attempt to convert the error to a non-fatal parse error.
78
+ if parseErr , extractErr := extractModParseErrors (modFH .URI (), m , data .err , contents ); extractErr == nil {
79
+ data .err = nil
80
+ data .parsed .ParseErrors = []source.Error {* parseErr }
81
+ }
98
82
}
83
+ return data
99
84
})
85
+
86
+ pmh := & parseModHandle {handle : h }
87
+ s .mu .Lock ()
88
+ s .parseModHandles [modFH .URI ()] = pmh
89
+ s .mu .Unlock ()
90
+
91
+ return pmh .parse (ctx , s )
92
+ }
93
+
94
+ func (s * snapshot ) sumFH (ctx context.Context , modFH source.FileHandle ) (source.FileHandle , error ) {
100
95
// Get the go.sum file, either from the snapshot or directly from the
101
96
// cache. Avoid (*snapshot).GetFile here, as we don't want to add
102
97
// nonexistent file handles to the snapshot if the file does not exist.
103
98
sumURI := span .URIFromPath (sumFilename (modFH .URI ()))
104
99
sumFH := s .FindFile (sumURI )
105
100
if sumFH == nil {
106
- fh , err := s .view .session .cache .getFile (ctx , sumURI )
107
- if err != nil && ! os .IsNotExist (err ) {
101
+ var err error
102
+ sumFH , err = s .view .session .cache .getFile (ctx , sumURI )
103
+ if err != nil {
108
104
return nil , err
109
105
}
110
- if fh .err != nil && ! os .IsNotExist (fh .err ) {
111
- return nil , fh .err
112
- }
113
- // If the file doesn't exist, we can just keep the go.sum nil.
114
- if err != nil || fh .err != nil {
115
- sumFH = nil
116
- } else {
117
- sumFH = fh
118
- }
119
106
}
120
- s .mu .Lock ()
121
- defer s .mu .Unlock ()
122
- s .parseModHandles [modFH .URI ()] = & parseModHandle {
123
- handle : h ,
124
- mod : modFH ,
125
- sum : sumFH ,
107
+ _ , err := sumFH .Read ()
108
+ if err != nil {
109
+ return nil , err
126
110
}
127
- return s . parseModHandles [ modFH . URI ()] , nil
111
+ return sumFH , nil
128
112
}
129
113
130
114
func sumFilename (modURI span.URI ) string {
131
- return modURI . Filename ()[: len ( modURI .Filename ()) - len ( " mod" )] + "sum"
115
+ return strings . TrimSuffix ( modURI .Filename (), ". mod" ) + ". sum"
132
116
}
133
117
134
118
// extractModParseErrors processes the raw errors returned by modfile.Parse,
@@ -197,7 +181,7 @@ type modWhyData struct {
197
181
err error
198
182
}
199
183
200
- func (mwh * modWhyHandle ) Why (ctx context.Context , s source.Snapshot ) (map [string ]string , error ) {
184
+ func (mwh * modWhyHandle ) why (ctx context.Context , s source.Snapshot ) (map [string ]string , error ) {
201
185
v , err := mwh .handle .Get (ctx , s .(* snapshot ))
202
186
if err != nil {
203
187
return nil , err
@@ -206,15 +190,14 @@ func (mwh *modWhyHandle) Why(ctx context.Context, s source.Snapshot) (map[string
206
190
return data .why , data .err
207
191
}
208
192
209
- func (s * snapshot ) ModWhyHandle (ctx context.Context ) (source. ModWhyHandle , error ) {
193
+ func (s * snapshot ) ModWhy (ctx context.Context ) (map [ string ] string , error ) {
210
194
if err := s .awaitLoaded (ctx ); err != nil {
211
195
return nil , err
212
196
}
213
197
fh , err := s .GetFile (ctx , s .view .modURI )
214
198
if err != nil {
215
199
return nil , err
216
200
}
217
- cfg := s .config (ctx )
218
201
key := modKey {
219
202
sessionID : s .view .session .id ,
220
203
cfg : hashConfig (s .config (ctx )),
@@ -228,46 +211,42 @@ func (s *snapshot) ModWhyHandle(ctx context.Context) (source.ModWhyHandle, error
228
211
229
212
snapshot := arg .(* snapshot )
230
213
231
- pmh , err := snapshot .ParseModHandle (ctx , fh )
232
- if err != nil {
233
- return & modWhyData {err : err }
234
- }
235
-
236
- parsed , _ , _ , err := pmh .Parse (ctx , snapshot )
214
+ pm , err := snapshot .ParseMod (ctx , fh )
237
215
if err != nil {
238
216
return & modWhyData {err : err }
239
217
}
240
218
// No requires to explain.
241
- if len (parsed .Require ) == 0 {
219
+ if len (pm . File .Require ) == 0 {
242
220
return & modWhyData {}
243
221
}
244
222
// Run `go mod why` on all the dependencies.
245
223
args := []string {"why" , "-m" }
246
- for _ , req := range parsed .Require {
224
+ for _ , req := range pm . File .Require {
247
225
args = append (args , req .Mod .Path )
248
226
}
249
- _ , stdout , err := runGoCommand ( ctx , cfg , pmh , snapshot .view . tmpMod , "mod" , args )
227
+ stdout , err := snapshot .RunGoCommand ( ctx , "mod" , args )
250
228
if err != nil {
251
229
return & modWhyData {err : err }
252
230
}
253
231
whyList := strings .Split (stdout .String (), "\n \n " )
254
- if len (whyList ) != len (parsed .Require ) {
232
+ if len (whyList ) != len (pm . File .Require ) {
255
233
return & modWhyData {
256
- err : fmt .Errorf ("mismatched number of results: got %v, want %v" , len (whyList ), len (parsed .Require )),
234
+ err : fmt .Errorf ("mismatched number of results: got %v, want %v" , len (whyList ), len (pm . File .Require )),
257
235
}
258
236
}
259
- why := make (map [string ]string , len (parsed .Require ))
260
- for i , req := range parsed .Require {
237
+ why := make (map [string ]string , len (pm . File .Require ))
238
+ for i , req := range pm . File .Require {
261
239
why [req .Mod .Path ] = whyList [i ]
262
240
}
263
241
return & modWhyData {why : why }
264
242
})
243
+
244
+ mwh := & modWhyHandle {handle : h }
265
245
s .mu .Lock ()
266
- defer s .mu .Unlock ()
267
- s .modWhyHandle = & modWhyHandle {
268
- handle : h ,
269
- }
270
- return s .modWhyHandle , nil
246
+ s .modWhyHandle = mwh
247
+ s .mu .Unlock ()
248
+
249
+ return s .modWhyHandle .why (ctx , s )
271
250
}
272
251
273
252
type modUpgradeHandle struct {
@@ -290,7 +269,7 @@ func (muh *modUpgradeHandle) Upgrades(ctx context.Context, s source.Snapshot) (m
290
269
return data .upgrades , data .err
291
270
}
292
271
293
- func (s * snapshot ) ModUpgradeHandle (ctx context.Context ) (source. ModUpgradeHandle , error ) {
272
+ func (s * snapshot ) ModUpgrade (ctx context.Context ) (map [ string ] string , error ) {
294
273
if err := s .awaitLoaded (ctx ); err != nil {
295
274
return nil , err
296
275
}
@@ -312,28 +291,24 @@ func (s *snapshot) ModUpgradeHandle(ctx context.Context) (source.ModUpgradeHandl
312
291
313
292
snapshot := arg .(* snapshot )
314
293
315
- pmh , err := s .ParseModHandle (ctx , fh )
294
+ pm , err := s .ParseMod (ctx , fh )
316
295
if err != nil {
317
296
return & modUpgradeData {err : err }
318
297
}
319
298
320
- parsed , _ , _ , err := pmh .Parse (ctx , snapshot )
321
- if err != nil {
322
- return & modUpgradeData {err : err }
323
- }
324
299
// No requires to upgrade.
325
- if len (parsed .Require ) == 0 {
300
+ if len (pm . File .Require ) == 0 {
326
301
return & modUpgradeData {}
327
302
}
328
303
// Run "go list -mod readonly -u -m all" to be able to see which deps can be
329
304
// upgraded without modifying mod file.
330
305
args := []string {"-u" , "-m" , "all" }
331
- if ! snapshot .view .tmpMod || containsVendor (pmh . Mod () .URI ()) {
306
+ if ! snapshot .view .tmpMod || containsVendor (fh .URI ()) {
332
307
// Use -mod=readonly if the module contains a vendor directory
333
308
// (see golang/go#38711).
334
309
args = append ([]string {"-mod" , "readonly" }, args ... )
335
310
}
336
- _ , stdout , err := runGoCommand ( ctx , cfg , pmh , snapshot .view . tmpMod , "list" , args )
311
+ stdout , err := snapshot .RunGoCommand ( ctx , "list" , args )
337
312
if err != nil {
338
313
return & modUpgradeData {err : err }
339
314
}
@@ -364,12 +339,12 @@ func (s *snapshot) ModUpgradeHandle(ctx context.Context) (source.ModUpgradeHandl
364
339
upgrades : upgrades ,
365
340
}
366
341
})
342
+ muh := & modUpgradeHandle {handle : h }
367
343
s .mu .Lock ()
368
- defer s .mu .Unlock ()
369
- s .modUpgradeHandle = & modUpgradeHandle {
370
- handle : h ,
371
- }
372
- return s .modUpgradeHandle , nil
344
+ s .modUpgradeHandle = muh
345
+ s .mu .Unlock ()
346
+
347
+ return s .modUpgradeHandle .Upgrades (ctx , s )
373
348
}
374
349
375
350
// containsVendor reports whether the module has a vendor folder.
0 commit comments