From 81177dc7118e74d4e1de6e6d794e713d5fc58c45 Mon Sep 17 00:00:00 2001 From: Jules Villard Date: Thu, 11 May 2017 10:15:19 -0700 Subject: [PATCH] [CLI] skip anon args for `infer clang ...` Summary: `infer clang ...` was not being handled correctly and would error incorrectly. Small fix before bigger change. Reviewed By: mbouaziz Differential Revision: D5036447 fbshipit-source-id: 87fcc40 --- infer/src/base/CommandLineOption.ml | 3 +-- infer/src/base/CommandLineOption.mli | 5 +++-- infer/src/base/Config.ml | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/infer/src/base/CommandLineOption.ml b/infer/src/base/CommandLineOption.ml index 072096a05..70d2c0b2e 100644 --- a/infer/src/base/CommandLineOption.ml +++ b/infer/src/base/CommandLineOption.ml @@ -600,11 +600,10 @@ let mk_rest_actions ?(parse_mode=InferCommand) ?(in_help=[]) doc ~usage decode_a decode_json = fun ~inferconfig_dir:_ _ -> []} ; rest -let mk_subcommand command ?(accept_unknown_args=false) ?deprecated ~long ?(name=long) +let mk_subcommand command ?on_unknown_arg:(on_unknown=`Reject) ?deprecated ~long ?(name=long) ?parse_mode ?in_help command_doc = let switch () = curr_command := Some command; - let on_unknown = if accept_unknown_args then `Add else `Reject in anon_arg_action := {!anon_arg_action with on_unknown} in ignore( mk ?deprecated ~long ~default:() ?parse_mode ?in_help ~meta:"" diff --git a/infer/src/base/CommandLineOption.mli b/infer/src/base/CommandLineOption.mli index d252471eb..545619d00 100644 --- a/infer/src/base/CommandLineOption.mli +++ b/infer/src/base/CommandLineOption.mli @@ -189,8 +189,9 @@ val mk_command_doc : title:string -> section:int -> version:string -> date:strin (** [mk_subcommand command ~long command_doc] defines the subcommand [command]. A subcommand is activated by passing [--long], [name], or any [-key] for [key] in [deprecated] on the command line. [name] defaults to [long]. A man page is automatically generated for [command] based on - the information in [command_doc]. *) -val mk_subcommand : command -> ?accept_unknown_args:bool -> + the information in [command_doc]. [on_unknown_arg] is the action taken on unknown anonymous + arguments; it is `Reject by default. *) +val mk_subcommand : command -> ?on_unknown_arg:[`Add | `Skip | `Reject] -> ?deprecated:string list -> long:string -> ?name:string -> ?parse_mode:parse_mode -> ?in_help:(command * string) list -> command_doc -> unit diff --git a/infer/src/base/Config.ml b/infer/src/base/Config.ml index 17b67c14b..dc68e9a66 100644 --- a/infer/src/base/Config.ml +++ b/infer/src/base/Config.ml @@ -415,16 +415,18 @@ let exe_usage = let anon_args = CLOpt.mk_anon () let () = - let command_accepts_unknown_arg = - List.mem ~equal:CLOpt.equal_command CLOpt.[Clang; Report] in + let on_unknown_arg_from_command (cmd: CLOpt.command) = match cmd with + | Clang -> `Skip + | Report -> `Add + | Analyze | Capture | Compile | ReportDiff | Run -> `Reject in let command_deprecated = List.Assoc.find ~equal:CLOpt.equal_command CLOpt.[ReportDiff, ["-diff"]] in (* make sure we generate doc for all the commands we know about *) List.iter CLOpt.all_commands ~f:(fun cmd -> let { CommandDoc.long; command_doc } = CommandDoc.data_of_command cmd in - let accept_unknown_args = command_accepts_unknown_arg cmd in + let on_unknown_arg = on_unknown_arg_from_command cmd in let deprecated = command_deprecated cmd in - CLOpt.mk_subcommand cmd ~long ~accept_unknown_args ?deprecated command_doc) + CLOpt.mk_subcommand cmd ~long ~on_unknown_arg ?deprecated command_doc) let abs_struct = CLOpt.mk_int ~deprecated:["absstruct"] ~long:"abs-struct" ~default:1