Home | History | Annotate | Download | only in gn
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef TOOLS_GN_FUNCTIONS_H_
      6 #define TOOLS_GN_FUNCTIONS_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/containers/hash_tables.h"
     12 #include "base/strings/string_piece.h"
     13 
     14 class Err;
     15 class BlockNode;
     16 class FunctionCallNode;
     17 class Label;
     18 class ListNode;
     19 class ParseNode;
     20 class Scope;
     21 class Token;
     22 class Value;
     23 
     24 // -----------------------------------------------------------------------------
     25 
     26 namespace functions {
     27 
     28 // This type of function invocation has no block and evaluates its arguments
     29 // itself rather than taking a pre-executed list. This allows us to implement
     30 // certain built-in functions.
     31 typedef Value (*SelfEvaluatingArgsFunction)(Scope* scope,
     32                                             const FunctionCallNode* function,
     33                                             const ListNode* args_list,
     34                                             Err* err);
     35 
     36 // This type of function invocation takes a block node that it will execute.
     37 typedef Value (*GenericBlockFunction)(Scope* scope,
     38                                       const FunctionCallNode* function,
     39                                       const std::vector<Value>& args,
     40                                       BlockNode* block,
     41                                       Err* err);
     42 
     43 // This type of function takes a block, but does not need to control execution
     44 // of it. The dispatch function will pre-execute the block and pass the
     45 // resulting block_scope to the function.
     46 typedef Value(*ExecutedBlockFunction)(const FunctionCallNode* function,
     47                                       const std::vector<Value>& args,
     48                                       Scope* block_scope,
     49                                       Err* err);
     50 
     51 // This type of function does not take a block. It just has arguments.
     52 typedef Value (*NoBlockFunction)(Scope* scope,
     53                                  const FunctionCallNode* function,
     54                                  const std::vector<Value>& args,
     55                                  Err* err);
     56 
     57 extern const char kAssert[];
     58 extern const char kAssert_Help[];
     59 Value RunAssert(Scope* scope,
     60                 const FunctionCallNode* function,
     61                 const std::vector<Value>& args,
     62                 Err* err);
     63 
     64 extern const char kComponent[];
     65 extern const char kComponent_Help[];
     66 Value RunComponent(Scope* scope,
     67                    const FunctionCallNode* function,
     68                    const std::vector<Value>& args,
     69                    BlockNode* block,
     70                    Err* err);
     71 
     72 extern const char kConfig[];
     73 extern const char kConfig_Help[];
     74 Value RunConfig(const FunctionCallNode* function,
     75                 const std::vector<Value>& args,
     76                 Scope* block_scope,
     77                 Err* err);
     78 
     79 extern const char kCopy[];
     80 extern const char kCopy_Help[];
     81 Value RunCopy(const FunctionCallNode* function,
     82               const std::vector<Value>& args,
     83               Scope* block_scope,
     84               Err* err);
     85 
     86 extern const char kCustom[];
     87 extern const char kCustom_Help[];
     88 Value RunCustom(Scope* scope,
     89                 const FunctionCallNode* function,
     90                 const std::vector<Value>& args,
     91                 BlockNode* block,
     92                 Err* err);
     93 
     94 extern const char kDeclareArgs[];
     95 extern const char kDeclareArgs_Help[];
     96 Value RunDeclareArgs(Scope* scope,
     97                      const FunctionCallNode* function,
     98                      const std::vector<Value>& args,
     99                      BlockNode* block,
    100                      Err* err);
    101 
    102 extern const char kDefined[];
    103 extern const char kDefined_Help[];
    104 Value RunDefined(Scope* scope,
    105                  const FunctionCallNode* function,
    106                  const ListNode* args_list,
    107                  Err* err);
    108 
    109 extern const char kExecScript[];
    110 extern const char kExecScript_Help[];
    111 Value RunExecScript(Scope* scope,
    112                     const FunctionCallNode* function,
    113                     const std::vector<Value>& args,
    114                     Err* err);
    115 
    116 extern const char kExecutable[];
    117 extern const char kExecutable_Help[];
    118 Value RunExecutable(Scope* scope,
    119                     const FunctionCallNode* function,
    120                     const std::vector<Value>& args,
    121                     BlockNode* block,
    122                     Err* err);
    123 
    124 extern const char kGroup[];
    125 extern const char kGroup_Help[];
    126 Value RunGroup(Scope* scope,
    127                const FunctionCallNode* function,
    128                const std::vector<Value>& args,
    129                BlockNode* block,
    130                Err* err);
    131 
    132 extern const char kImport[];
    133 extern const char kImport_Help[];
    134 Value RunImport(Scope* scope,
    135                 const FunctionCallNode* function,
    136                 const std::vector<Value>& args,
    137                 Err* err);
    138 
    139 extern const char kPrint[];
    140 extern const char kPrint_Help[];
    141 Value RunPrint(Scope* scope,
    142                const FunctionCallNode* function,
    143                const std::vector<Value>& args,
    144                Err* err);
    145 
    146 extern const char kProcessFileTemplate[];
    147 extern const char kProcessFileTemplate_Help[];
    148 Value RunProcessFileTemplate(Scope* scope,
    149                              const FunctionCallNode* function,
    150                              const std::vector<Value>& args,
    151                              Err* err);
    152 
    153 extern const char kReadFile[];
    154 extern const char kReadFile_Help[];
    155 Value RunReadFile(Scope* scope,
    156                   const FunctionCallNode* function,
    157                   const std::vector<Value>& args,
    158                   Err* err);
    159 
    160 extern const char kRebasePath[];
    161 extern const char kRebasePath_Help[];
    162 Value RunRebasePath(Scope* scope,
    163                     const FunctionCallNode* function,
    164                     const std::vector<Value>& args,
    165                     Err* err);
    166 
    167 extern const char kSetDefaults[];
    168 extern const char kSetDefaults_Help[];
    169 Value RunSetDefaults(Scope* scope,
    170                      const FunctionCallNode* function,
    171                      const std::vector<Value>& args,
    172                      BlockNode* block,
    173                      Err* err);
    174 
    175 extern const char kSetDefaultToolchain[];
    176 extern const char kSetDefaultToolchain_Help[];
    177 Value RunSetDefaultToolchain(Scope* scope,
    178                              const FunctionCallNode* function,
    179                              const std::vector<Value>& args,
    180                              Err* err);
    181 
    182 extern const char kSetSourcesAssignmentFilter[];
    183 extern const char kSetSourcesAssignmentFilter_Help[];
    184 Value RunSetSourcesAssignmentFilter(Scope* scope,
    185                                     const FunctionCallNode* function,
    186                                     const std::vector<Value>& args,
    187                                     Err* err);
    188 
    189 extern const char kSharedLibrary[];
    190 extern const char kSharedLibrary_Help[];
    191 Value RunSharedLibrary(Scope* scope,
    192                        const FunctionCallNode* function,
    193                        const std::vector<Value>& args,
    194                        BlockNode* block,
    195                        Err* err);
    196 
    197 extern const char kSourceSet[];
    198 extern const char kSourceSet_Help[];
    199 Value RunSourceSet(Scope* scope,
    200                    const FunctionCallNode* function,
    201                    const std::vector<Value>& args,
    202                    BlockNode* block,
    203                    Err* err);
    204 
    205 extern const char kStaticLibrary[];
    206 extern const char kStaticLibrary_Help[];
    207 Value RunStaticLibrary(Scope* scope,
    208                        const FunctionCallNode* function,
    209                        const std::vector<Value>& args,
    210                        BlockNode* block,
    211                        Err* err);
    212 
    213 extern const char kTemplate[];
    214 extern const char kTemplate_Help[];
    215 Value RunTemplate(Scope* scope,
    216                   const FunctionCallNode* function,
    217                   const std::vector<Value>& args,
    218                   BlockNode* block,
    219                   Err* err);
    220 
    221 extern const char kTest[];
    222 extern const char kTest_Help[];
    223 Value RunTest(Scope* scope,
    224               const FunctionCallNode* function,
    225               const std::vector<Value>& args,
    226               BlockNode* block,
    227               Err* err);
    228 
    229 extern const char kTool[];
    230 extern const char kTool_Help[];
    231 Value RunTool(Scope* scope,
    232               const FunctionCallNode* function,
    233               const std::vector<Value>& args,
    234               BlockNode* block,
    235               Err* err);
    236 
    237 extern const char kToolchain[];
    238 extern const char kToolchain_Help[];
    239 Value RunToolchain(Scope* scope,
    240                    const FunctionCallNode* function,
    241                    const std::vector<Value>& args,
    242                    BlockNode* block,
    243                    Err* err);
    244 
    245 extern const char kToolchainArgs[];
    246 extern const char kToolchainArgs_Help[];
    247 Value RunToolchainArgs(Scope* scope,
    248                        const FunctionCallNode* function,
    249                        const std::vector<Value>& args,
    250                        BlockNode* block,
    251                        Err* err);
    252 
    253 extern const char kWriteFile[];
    254 extern const char kWriteFile_Help[];
    255 Value RunWriteFile(Scope* scope,
    256                    const FunctionCallNode* function,
    257                    const std::vector<Value>& args,
    258                    Err* err);
    259 
    260 // -----------------------------------------------------------------------------
    261 
    262 // One function record. Only one of the given runner types will be non-null
    263 // which indicates the type of function it is.
    264 struct FunctionInfo {
    265   FunctionInfo();
    266   FunctionInfo(SelfEvaluatingArgsFunction seaf, const char* in_help);
    267   FunctionInfo(GenericBlockFunction gbf, const char* in_help);
    268   FunctionInfo(ExecutedBlockFunction ebf, const char* in_help);
    269   FunctionInfo(NoBlockFunction nbf, const char* in_help);
    270 
    271   SelfEvaluatingArgsFunction self_evaluating_args_runner;
    272   GenericBlockFunction generic_block_runner;
    273   ExecutedBlockFunction executed_block_runner;
    274   NoBlockFunction no_block_runner;
    275 
    276   const char* help;
    277 };
    278 
    279 typedef base::hash_map<base::StringPiece, FunctionInfo> FunctionInfoMap;
    280 
    281 // Returns the mapping of all built-in functions.
    282 const FunctionInfoMap& GetFunctions();
    283 
    284 // Runs the given function.
    285 Value RunFunction(Scope* scope,
    286                   const FunctionCallNode* function,
    287                   const ListNode* args_list,
    288                   BlockNode* block,  // Optional.
    289                   Err* err);
    290 
    291 }  // namespace functions
    292 
    293 // Helper functions -----------------------------------------------------------
    294 
    295 // Verifies that the current scope is not processing an import. If it is, it
    296 // will set the error, blame the given parse node for it, and return false.
    297 bool EnsureNotProcessingImport(const ParseNode* node,
    298                                const Scope* scope,
    299                                Err* err);
    300 
    301 // Like EnsureNotProcessingImport but checks for running the build config.
    302 bool EnsureNotProcessingBuildConfig(const ParseNode* node,
    303                                     const Scope* scope,
    304                                     Err* err);
    305 
    306 // Sets up the |block_scope| for executing a target (or something like it).
    307 // The |scope| is the containing scope. It should have been already set as the
    308 // parent for the |block_scope| when the |block_scope| was created.
    309 //
    310 // This will set up the target defaults and set the |target_name| variable in
    311 // the block scope to the current target name, which is assumed to be the first
    312 // argument to the function.
    313 //
    314 // On success, returns true. On failure, sets the error and returns false.
    315 bool FillTargetBlockScope(const Scope* scope,
    316                           const FunctionCallNode* function,
    317                           const std::string& target_type,
    318                           const BlockNode* block,
    319                           const std::vector<Value>& args,
    320                           Scope* block_scope,
    321                           Err* err);
    322 
    323 // Sets the given error to a message explaining that the function call requires
    324 // a block.
    325 void FillNeedsBlockError(const FunctionCallNode* function, Err* err);
    326 
    327 // Validates that the given function call has one string argument. This is
    328 // the most common function signature, so it saves space to have this helper.
    329 // Returns false and sets the error on failure.
    330 bool EnsureSingleStringArg(const FunctionCallNode* function,
    331                            const std::vector<Value>& args,
    332                            Err* err);
    333 
    334 // Returns the name of the toolchain for the given scope.
    335 const Label& ToolchainLabelForScope(const Scope* scope);
    336 
    337 // Generates a label for the given scope, using the current directory and
    338 // toolchain, and the given name.
    339 Label MakeLabelForScope(const Scope* scope,
    340                         const FunctionCallNode* function,
    341                         const std::string& name);
    342 
    343 #endif  // TOOLS_GN_FUNCTIONS_H_
    344