@@ -319,13 +319,36 @@ let completionWithParser ~debug ~path ~posCursor ~currentFile ~text =
319319 scope :=
320320 ! scope |> Scope. addValue ~name: vd.pval_name.txt ~loc: vd.pval_name.loc
321321 in
322+ let rec scopePattern (pat : Parsetree.pattern ) =
323+ match pat.ppat_desc with
324+ | Ppat_any -> ()
325+ | Ppat_var {txt; loc} -> scope := ! scope |> Scope. addValue ~name: txt ~loc
326+ | Ppat_alias (p , asA ) ->
327+ scopePattern p;
328+ scope := ! scope |> Scope. addValue ~name: asA.txt ~loc: asA.loc
329+ | Ppat_constant _ | Ppat_interval _ -> ()
330+ | Ppat_tuple pl -> pl |> List. iter scopePattern
331+ | Ppat_construct (_ , None) -> ()
332+ | Ppat_construct (_ , Some p ) -> scopePattern p
333+ | Ppat_variant (_ , None) -> ()
334+ | Ppat_variant (_ , Some p ) -> scopePattern p
335+ | Ppat_record (fields , _ ) ->
336+ fields |> List. iter (fun (_ , p ) -> scopePattern p)
337+ | Ppat_array pl -> pl |> List. iter scopePattern
338+ | Ppat_or (p1 , _ ) -> scopePattern p1
339+ | Ppat_constraint (p , _ ) -> scopePattern p
340+ | Ppat_type _ -> ()
341+ | Ppat_lazy p -> scopePattern p
342+ | Ppat_unpack {txt; loc} -> scope := ! scope |> Scope. addValue ~name: txt ~loc
343+ | Ppat_exception p -> scopePattern p
344+ | Ppat_extension _ -> ()
345+ | Ppat_open (_ , p ) -> scopePattern p
346+ in
347+
322348 let scopeValueBinding (vb : Parsetree.value_binding ) =
323- match vb.pvb_pat.ppat_desc with
324- | Ppat_var {txt; loc}
325- | Ppat_constraint ({ppat_desc = Ppat_var {txt; loc} } , _ ) ->
326- scope := ! scope |> Scope. addValue ~name: txt ~loc
327- | _ -> ()
349+ scopePattern vb.pvb_pat
328350 in
351+
329352 let scopeTypeKind (tk : Parsetree.type_kind ) =
330353 match tk with
331354 | Ptype_variant constrDecls ->
@@ -355,6 +378,12 @@ let completionWithParser ~debug ~path ~posCursor ~currentFile ~text =
355378 ! scope |> Scope. addModule ~name: md.pmd_name.txt ~loc: md.pmd_name.loc
356379 in
357380
381+ let case (iterator : Ast_iterator.iterator ) (case : Parsetree.case ) =
382+ let oldScope = ! scope in
383+ scopePattern case.pc_lhs;
384+ Ast_iterator. default_iterator.case iterator case;
385+ scope := oldScope
386+ in
358387 let structure (iterator : Ast_iterator.iterator )
359388 (structure : Parsetree.structure ) =
360389 let oldScope = ! scope in
@@ -712,6 +741,7 @@ let completionWithParser ~debug ~path ~posCursor ~currentFile ~text =
712741 {
713742 Ast_iterator. default_iterator with
714743 attribute;
744+ case;
715745 expr;
716746 module_expr;
717747 module_type;
0 commit comments