@@ -292,39 +292,105 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor ~text =
292
292
scope :=
293
293
! scope |> Scope. addValue ~name: vd.pval_name.txt ~loc: vd.pval_name.loc
294
294
in
295
- let rec scopePattern ?contextPath (pat : Parsetree.pattern ) =
295
+ let rec scopePattern ?contextPath
296
+ ?(patternPath : Completable.nestedPath list = [] )
297
+ (pat : Parsetree.pattern ) =
298
+ let contextPathToSave =
299
+ match (contextPath, patternPath) with
300
+ | maybeContextPath , [] -> maybeContextPath
301
+ | Some contextPath , patternPath ->
302
+ Some
303
+ (Completable. CPatternPath
304
+ {rootCtxPath = contextPath; nested = List. rev patternPath})
305
+ | _ -> None
306
+ in
296
307
match pat.ppat_desc with
297
308
| Ppat_any -> ()
298
309
| Ppat_var {txt; loc} ->
299
- scope := ! scope |> Scope. addValue ~name: txt ~loc ?contextPath
310
+ scope :=
311
+ ! scope |> Scope. addValue ~name: txt ~loc ?contextPath:contextPathToSave
300
312
| Ppat_alias (p , asA ) ->
301
- scopePattern p;
313
+ scopePattern p ~pattern Path ?contextPath;
314
+ let ctxPath =
315
+ if contextPathToSave = None then
316
+ match p with
317
+ | {ppat_desc = Ppat_var {txt} } ->
318
+ Some (Completable. CPId ([txt], Value ))
319
+ | _ -> None
320
+ else None
321
+ in
302
322
scope :=
303
- ! scope
304
- |> Scope. addValue ~name: asA.txt ~loc: asA.loc
305
- ?contextPath:
306
- (match p with
307
- | {ppat_desc = Ppat_var {txt} } -> Some (CPId ([txt], Value ))
308
- | _ -> None )
323
+ ! scope |> Scope. addValue ~name: asA.txt ~loc: asA.loc ?contextPath:ctxPath
309
324
| Ppat_constant _ | Ppat_interval _ -> ()
310
- | Ppat_tuple pl -> pl |> List. iter (scopePattern ?contextPath)
325
+ | Ppat_tuple pl ->
326
+ pl
327
+ |> List. iteri (fun index p ->
328
+ scopePattern p
329
+ ~pattern Path:(NTupleItem {itemNum = index} :: patternPath)
330
+ ?contextPath)
311
331
| Ppat_construct (_ , None) -> ()
312
- | Ppat_construct (_ , Some p ) -> scopePattern ?contextPath p
332
+ | Ppat_construct ({txt} , Some {ppat_desc = Ppat_tuple pl } ) ->
333
+ pl
334
+ |> List. iteri (fun index p ->
335
+ scopePattern p
336
+ ~pattern Path:
337
+ (NVariantPayload
338
+ {
339
+ itemNum = index;
340
+ constructorName = Utils. getUnqualifiedName txt;
341
+ }
342
+ :: patternPath)
343
+ ?contextPath)
344
+ | Ppat_construct ({txt} , Some p ) ->
345
+ scopePattern
346
+ ~pattern Path:
347
+ (NVariantPayload
348
+ {itemNum = 0 ; constructorName = Utils. getUnqualifiedName txt}
349
+ :: patternPath)
350
+ ?contextPath p
313
351
| Ppat_variant (_ , None) -> ()
314
- | Ppat_variant (_ , Some p ) -> scopePattern ?contextPath p
352
+ | Ppat_variant (txt , Some {ppat_desc = Ppat_tuple pl } ) ->
353
+ pl
354
+ |> List. iteri (fun index p ->
355
+ scopePattern p
356
+ ~pattern Path:
357
+ (NPolyvariantPayload {itemNum = index; constructorName = txt}
358
+ :: patternPath)
359
+ ?contextPath)
360
+ | Ppat_variant (txt , Some p ) ->
361
+ scopePattern
362
+ ~pattern Path:
363
+ (NPolyvariantPayload {itemNum = 0 ; constructorName = txt}
364
+ :: patternPath)
365
+ ?contextPath p
315
366
| Ppat_record (fields , _ ) ->
316
- fields |> List. iter (fun (_ , p ) -> scopePattern ?contextPath p)
317
- | Ppat_array pl -> pl |> List. iter (scopePattern ?contextPath)
318
- | Ppat_or (p1 , _ ) -> scopePattern ?contextPath p1
367
+ fields
368
+ |> List. iter (fun (fname , p ) ->
369
+ match fname with
370
+ | {Location. txt = Longident. Lident fname } ->
371
+ scopePattern
372
+ ~pattern Path:
373
+ (Completable. NFollowRecordField {fieldName = fname}
374
+ :: patternPath)
375
+ ?contextPath p
376
+ | _ -> () )
377
+ | Ppat_array pl ->
378
+ pl
379
+ |> List. iter
380
+ (scopePattern ~pattern Path:(NArray :: patternPath) ?contextPath)
381
+ | Ppat_or (p1 , _ ) -> scopePattern ~pattern Path ?contextPath p1
319
382
| Ppat_constraint (p , coreType ) ->
320
- scopePattern ?contextPath:(TypeUtils. contextPathFromCoreType coreType) p
383
+ scopePattern ~pattern Path
384
+ ?contextPath:(TypeUtils. contextPathFromCoreType coreType)
385
+ p
321
386
| Ppat_type _ -> ()
322
- | Ppat_lazy p -> scopePattern ?contextPath p
387
+ | Ppat_lazy p -> scopePattern ~pattern Path ?contextPath p
323
388
| Ppat_unpack {txt; loc} ->
324
- scope := ! scope |> Scope. addValue ~name: txt ~loc ?contextPath
325
- | Ppat_exception p -> scopePattern ?contextPath p
389
+ scope :=
390
+ ! scope |> Scope. addValue ~name: txt ~loc ?contextPath:contextPathToSave
391
+ | Ppat_exception p -> scopePattern ~pattern Path ?contextPath p
326
392
| Ppat_extension _ -> ()
327
- | Ppat_open (_ , p ) -> scopePattern ?contextPath p
393
+ | Ppat_open (_ , p ) -> scopePattern ~pattern Path ?contextPath p
328
394
in
329
395
330
396
let lookingForPat = ref None in
0 commit comments