// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_BIN_DARTDEV_OPTIONS_H_ #define RUNTIME_BIN_DARTDEV_OPTIONS_H_ #include "bin/dartutils.h" #include "bin/options.h" #include "platform/globals.h" #include "platform/growable_array.h" #include "platform/hashmap.h" namespace dart { namespace bin { #if defined(DART_PRECOMPILED_RUNTIME) // A list of options taking string arguments. Organized as: // V(flag_name, field_name) // The value of the flag can then be accessed with Options::field_name(). #define STRING_OPTIONS_LIST(V) \ V(packages, packages_file) \ V(namespace, namespc) // As STRING_OPTIONS_LIST but for boolean valued options. The default value is // always false, and the presence of the flag switches the value to true. #define BOOL_OPTIONS_LIST(V) \ V(disable_exit, exit_disabled) \ V(version, version_option) \ V(suppress_core_dump, suppress_core_dump) // Boolean flags that have a short form. #define SHORT_BOOL_OPTIONS_LIST(V) \ V(h, help, help_option) \ V(v, verbose, verbose_option) // Callbacks passed to DEFINE_CB_OPTION(). #define CB_OPTIONS_LIST(V) \ V(ProcessEnvironmentOption) \ V(ProcessVMOptions) enum VerbosityLevel { kError, kWarning, kInfo, kAll, }; static const char* const kVerbosityLevelNames[] = { "error", "warning", "info", "all", nullptr, }; class Options { public: // Returns true if argument parsing succeeded. False otherwise. static bool ParseDartDevArguments(int argc, char** argv, CommandLineOptions* vm_options, CommandLineOptions* dart_vm_options, CommandLineOptions* dart_options, bool* skip_dartdev); #define STRING_OPTION_GETTER(flag, variable) \ static const char* variable() { return variable##_; } STRING_OPTIONS_LIST(STRING_OPTION_GETTER) #undef STRING_OPTION_GETTER #define BOOL_OPTION_GETTER(flag, variable) \ static bool variable() { return variable##_; } BOOL_OPTIONS_LIST(BOOL_OPTION_GETTER) #undef BOOL_OPTION_GETTER #define SHORT_BOOL_OPTION_GETTER(short_name, long_name, variable) \ static bool variable() { return variable##_; } SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_GETTER) #undef SHORT_BOOL_OPTION_GETTER // Callbacks have to be public. #define CB_OPTIONS_DECL(callback) \ static bool callback(const char* arg, CommandLineOptions* vm_options); CB_OPTIONS_LIST(CB_OPTIONS_DECL) #undef CB_OPTIONS_DECL static dart::SimpleHashMap* environment() { return environment_; } static void PrintUsage(); static void PrintVersion(); static void Cleanup(); #if defined(DART_PRECOMPILED_RUNTIME) // Get the list of options in DART_VM_OPTIONS. static char** GetEnvArguments(int* argc); #endif // defined(DART_PRECOMPILED_RUNTIME) private: static void DestroyEnvironment(); #if defined(DART_PRECOMPILED_RUNTIME) static void DestroyEnvArgv(); #endif // defined(DART_PRECOMPILED_RUNTIME) #define STRING_OPTION_DECL(flag, variable) static const char* variable##_; STRING_OPTIONS_LIST(STRING_OPTION_DECL) #undef STRING_OPTION_DECL #define BOOL_OPTION_DECL(flag, variable) static bool variable##_; BOOL_OPTIONS_LIST(BOOL_OPTION_DECL) #undef BOOL_OPTION_DECL #define SHORT_BOOL_OPTION_DECL(short_name, long_name, variable) \ static bool variable##_; SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_DECL) #undef SHORT_BOOL_OPTION_DECL static dart::SimpleHashMap* environment_; static char** env_argv_; static int env_argc_; #define OPTION_FRIEND(flag, variable) friend class OptionProcessor_##flag; STRING_OPTIONS_LIST(OPTION_FRIEND) BOOL_OPTIONS_LIST(OPTION_FRIEND) #undef OPTION_FRIEND #define SHORT_BOOL_OPTION_FRIEND(short_name, long_name, variable) \ friend class OptionProcessor_##long_name; SHORT_BOOL_OPTIONS_LIST(SHORT_BOOL_OPTION_FRIEND) #undef SHORT_BOOL_OPTION_FRIEND DISALLOW_ALLOCATION(); DISALLOW_IMPLICIT_CONSTRUCTORS(Options); }; #endif // defined(DART_PRECOMPILED_RUNTIME) } // namespace bin } // namespace dart #endif // RUNTIME_BIN_DARTDEV_OPTIONS_H_