diff --git a/analysis/bin/main.ml b/analysis/bin/main.ml index e857e6af2..5a2fb5f40 100644 --- a/analysis/bin/main.ml +++ b/analysis/bin/main.ml @@ -110,12 +110,8 @@ let main () = path line col in match args with - | [_; "completion"; path; line; col; currentFile; supportsSnippets] -> + | [_; "completion"; path; line; col; currentFile] -> printHeaderInfo path line col; - (Cfg.supportsSnippets := - match supportsSnippets with - | "true" -> true - | _ -> false); Commands.completion ~debug ~path ~pos:(int_of_string line, int_of_string col) ~currentFile @@ -193,9 +189,7 @@ let main () = (Json.escape (CreateInterface.command ~path ~cmiFile)) | [_; "format"; path] -> Printf.printf "\"%s\"" (Json.escape (Commands.format ~path)) - | [_; "test"; path] -> - Cfg.supportsSnippets := true; - Commands.test ~path + | [_; "test"; path] -> Commands.test ~path | args when List.mem "-h" args || List.mem "--help" args -> prerr_endline help | _ -> prerr_endline help; diff --git a/analysis/src/Cfg.ml b/analysis/src/Cfg.ml index 777d76a97..e8c90989d 100644 --- a/analysis/src/Cfg.ml +++ b/analysis/src/Cfg.ml @@ -1,5 +1,3 @@ -let supportsSnippets = ref false - let debugFollowCtxPath = ref false let isDocGenFromCompiler = ref false diff --git a/analysis/src/CompletionBackEnd.ml b/analysis/src/CompletionBackEnd.ml index 1b79c1434..c8c1e7e7f 100644 --- a/analysis/src/CompletionBackEnd.ml +++ b/analysis/src/CompletionBackEnd.ml @@ -631,9 +631,7 @@ let completionToItem | Some detail -> detail) ~docstring in - if !Cfg.supportsSnippets then - {item with sortText; insertText; insertTextFormat; filterText} - else item + {item with sortText; insertText; insertTextFormat; filterText} let completionsGetTypeEnv = function | {Completion.kind = Value typ; env} :: _ -> Some (typ, env) @@ -1021,14 +1019,13 @@ and getCompletionsForContextPath ~debug ~full ~opens ~rawOpens ~pos ~env ~exact |> String.concat "." in [ - Completion.createWithSnippet ~name ~kind:(Value typ) ~env + Completion.create name ~includesSnippets:true ~kind:(Value typ) ~env ~sortText:"A" ~docstring: [ "Turns `" ^ builtinNameToComplete ^ "` into a JSX element so it can be used inside of JSX."; - ] - (); + ]; ] @ completions | _ -> completions) @@ -1274,7 +1271,6 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens ~full ~prefix ~completionContext ~mode (t : SharedTypes.completionType) = let emptyCase = emptyCase ~mode in let printConstructorArgs = printConstructorArgs ~mode in - let createWithSnippet = Completion.createWithSnippet ?typeArgContext in let create = Completion.create ?typeArgContext in match t with | TtypeT {env; path} -> @@ -1326,14 +1322,15 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens if valueWithTypeT typeExpr then getCompletionName name |> Option.map (fun name -> - createWithSnippet ~name ~insertText:name ~kind:(Value typeExpr) - ~env ()) + create name ~includesSnippets:true ~insertText:name + ~kind:(Value typeExpr) ~env) else if fnReturnsTypeT typeExpr then getCompletionName name |> Option.map (fun name -> - createWithSnippet - ~name:(Printf.sprintf "%s()" name) - ~insertText:(name ^ "($0)") ~kind:(Value typeExpr) ~env ()) + create + (Printf.sprintf "%s()" name) + ~includesSnippets:true ~insertText:(name ^ "($0)") + ~kind:(Value typeExpr) ~env) else None in let completionItems = @@ -1353,8 +1350,8 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens match path with | Pdot (Pdot (Pident m, "Re", _), "t", _) when Ident.name m = "Js" -> (* regexps *) - createWithSnippet ~name:"%re()" ~insertText:"%re(\"/$0/g\")" - ~kind:(Label "Regular expression") ~env () + create "%re()" ~insertText:"%re(\"/$0/g\")" ~includesSnippets:true + ~kind:(Label "Regular expression") ~env :: completionItems | _ -> completionItems in @@ -1375,29 +1372,28 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens | InlineRecord _ -> 1 | Args args -> List.length args in - createWithSnippet ?deprecated:constructor.deprecated - ~name: - (constructor.cname.txt - ^ printConstructorArgs numArgs ~asSnippet:false) + create ?deprecated:constructor.deprecated ~includesSnippets:true + (constructor.cname.txt + ^ printConstructorArgs numArgs ~asSnippet:false) ~insertText: (constructor.cname.txt ^ printConstructorArgs numArgs ~asSnippet:true) ~kind: (Constructor (constructor, variantDecl |> Shared.declToString variantName)) - ~env ()) + ~env) |> filterItems ~prefix | Tpolyvariant {env; constructors; typeExpr} -> if Debug.verbose () then print_endline "[complete_typed_value]--> Tpolyvariant"; constructors |> List.map (fun (constructor : polyVariantConstructor) -> - createWithSnippet - ~name: - ("#" ^ constructor.displayName - ^ printConstructorArgs - (List.length constructor.args) - ~asSnippet:false) + create + ("#" ^ constructor.displayName + ^ printConstructorArgs + (List.length constructor.args) + ~asSnippet:false) + ~includesSnippets:true ~insertText: ((if Utils.startsWith prefix "#" then "" else "#") ^ constructor.displayName @@ -1407,7 +1403,7 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens ~kind: (PolyvariantConstructor (constructor, typeExpr |> Shared.typeToString)) - ~env ()) + ~env) |> filterItems ~prefix:(if Utils.startsWith prefix "#" then prefix else "#" ^ prefix) | Toption (env, t) -> @@ -1436,19 +1432,17 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens in let noneCase = Completion.create "None" ~kind:(kindFromInnerType t) ~env in let someAnyCase = - createWithSnippet ~name:"Some(_)" ~kind:(kindFromInnerType t) ~env + create "Some(_)" ~includesSnippets:true ~kind:(kindFromInnerType t) ~env ~insertText:(Printf.sprintf "Some(%s)" (emptyCase 1)) - () in let completions = match completionContext with | Some (Completable.CameFromRecordField fieldName) -> [ - createWithSnippet - ~name:("Some(" ^ fieldName ^ ")") - ~kind:(kindFromInnerType t) ~env - ~insertText:("Some(" ^ fieldName ^ ")$0") - (); + create + ("Some(" ^ fieldName ^ ")") + ~includesSnippets:true ~kind:(kindFromInnerType t) ~env + ~insertText:("Some(" ^ fieldName ^ ")$0"); someAnyCase; noneCase; ] @@ -1498,24 +1492,21 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens }) in let okAnyCase = - createWithSnippet ~name:"Ok(_)" ~kind:(Value okType) ~env + create "Ok(_)" ~includesSnippets:true ~kind:(Value okType) ~env ~insertText:(Printf.sprintf "Ok(%s)" (emptyCase 1)) - () in let errorAnyCase = - createWithSnippet ~name:"Error(_)" ~kind:(Value errorType) ~env + create "Error(_)" ~includesSnippets:true ~kind:(Value errorType) ~env ~insertText:(Printf.sprintf "Error(%s)" (emptyCase 1)) - () in let completions = match completionContext with | Some (Completable.CameFromRecordField fieldName) -> [ - createWithSnippet - ~name:("Ok(" ^ fieldName ^ ")") - ~kind:(Value okType) ~env - ~insertText:("Ok(" ^ fieldName ^ ")$0") - (); + create + ("Ok(" ^ fieldName ^ ")") + ~includesSnippets:true ~kind:(Value okType) ~env + ~insertText:("Ok(" ^ fieldName ^ ")$0"); okAnyCase; errorAnyCase; ] @@ -1527,10 +1518,11 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens if Debug.verbose () then print_endline "[complete_typed_value]--> Tuple"; let numExprs = List.length exprs in [ - createWithSnippet - ~name:(printConstructorArgs numExprs ~asSnippet:false) + create + (printConstructorArgs numExprs ~asSnippet:false) + ~includesSnippets:true ~insertText:(printConstructorArgs numExprs ~asSnippet:true) - ~kind:(Value typ) ~env (); + ~kind:(Value typ) ~env; ] | Trecord {env; fields} as extractedType -> ( if Debug.verbose () then print_endline "[complete_typed_value]--> Trecord"; @@ -1564,16 +1556,14 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens | _ -> if prefix = "" then [ - createWithSnippet ~name:"{}" - ~insertText:(if !Cfg.supportsSnippets then "{$0}" else "{}") - ~sortText:"A" + create "{}" ~includesSnippets:true ~insertText:"{$0}" ~sortText:"A" ~kind: (ExtractedType ( extractedType, match mode with | Pattern _ -> `Type | Expression -> `Value )) - ~env (); + ~env; ] else []) | TinlineRecord {env; fields} -> ( @@ -1591,18 +1581,15 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens | _ -> if prefix = "" then [ - createWithSnippet ~name:"{}" - ~insertText:(if !Cfg.supportsSnippets then "{$0}" else "{}") - ~sortText:"A" ~kind:(Label "Inline record") ~env (); + create "{}" ~includesSnippets:true ~insertText:"{$0}" ~sortText:"A" + ~kind:(Label "Inline record") ~env; ] else []) | Tarray (env, typ) -> if Debug.verbose () then print_endline "[complete_typed_value]--> Tarray"; if prefix = "" then [ - createWithSnippet ~name:"[]" - ~insertText:(if !Cfg.supportsSnippets then "[$0]" else "[]") - ~sortText:"A" + create "[]" ~includesSnippets:true ~insertText:"[$0]" ~sortText:"A" ~kind: (match typ with | ExtractedType typ -> @@ -1612,19 +1599,17 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens | Pattern _ -> `Type | Expression -> `Value ) | TypeExpr typ -> Value typ) - ~env (); + ~env; ] else [] | Tstring env -> if Debug.verbose () then print_endline "[complete_typed_value]--> Tstring"; if prefix = "" then [ - createWithSnippet ~name:"\"\"" - ~insertText:(if !Cfg.supportsSnippets then "\"$0\"" else "\"\"") - ~sortText:"A" + create "\"\"" ~includesSnippets:true ~insertText:"\"$0\"" ~sortText:"A" ~kind: (Value (Ctype.newconstr (Path.Pident (Ident.create "string")) [])) - ~env (); + ~env; ] else [] | Tfunction {env; typ; args; uncurried; returnType} @@ -1673,14 +1658,11 @@ let rec completeTypedValue ?(typeArgContext : typeArgContext option) ~rawOpens in let asyncPrefix = if isAsync then "async " else "" in [ - createWithSnippet - ~name:(asyncPrefix ^ mkFnArgs ~asSnippet:false ^ " => {}") - ~insertText: - (asyncPrefix - ^ mkFnArgs ~asSnippet:!Cfg.supportsSnippets - ^ " => " - ^ if !Cfg.supportsSnippets then "{$0}" else "{}") - ~sortText:"A" ~kind:(Value typ) ~env (); + create + (asyncPrefix ^ mkFnArgs ~asSnippet:false ^ " => {}") + ~includesSnippets:true + ~insertText:(asyncPrefix ^ mkFnArgs ~asSnippet:true ^ " => " ^ "{$0}") + ~sortText:"A" ~kind:(Value typ) ~env; ] | Tfunction _ -> if Debug.verbose () then @@ -1952,8 +1934,8 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover completable = | Cdecorator prefix -> let mkDecorator (name, docstring, maybeInsertText) = { - (Completion.createWithSnippet ~name ~kind:(Label "") ~env - ?insertText:maybeInsertText ()) + (Completion.create name ~includesSnippets:true ~kind:(Label "") ~env + ?insertText:maybeInsertText) with docstring; } diff --git a/analysis/src/SharedTypes.ml b/analysis/src/SharedTypes.ml index 9b569015c..e25e66fc3 100644 --- a/analysis/src/SharedTypes.ml +++ b/analysis/src/SharedTypes.ml @@ -802,24 +802,8 @@ module Completion = struct typeArgContext: typeArgContext option; } - let create ~kind ~env ?typeArgContext ?(docstring = []) ?filterText ?detail - ?deprecated ?insertText name = - { - name; - env; - deprecated; - docstring; - kind; - sortText = None; - insertText; - insertTextFormat = None; - filterText; - detail; - typeArgContext; - } - - let createWithSnippet ~name ?typeArgContext ?insertText ~kind ~env ?sortText - ?deprecated ?filterText ?detail ?(docstring = []) () = + let create ?typeArgContext ?(includesSnippets = false) ?insertText ~kind ~env + ?sortText ?deprecated ?filterText ?detail ?(docstring = []) name = { name; env; @@ -828,7 +812,8 @@ module Completion = struct kind; sortText; insertText; - insertTextFormat = Some Protocol.Snippet; + insertTextFormat = + (if includesSnippets then Some Protocol.Snippet else None); filterText; detail; typeArgContext; diff --git a/server/src/server.ts b/server/src/server.ts index 08ebd1714..944d3e22c 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -653,7 +653,6 @@ function completion(msg: p.RequestMessage) { params.position.line, params.position.character, tmpname, - Boolean(extensionClientCapabilities.supportsSnippetSyntax), ], msg );