浏览代码

Merge topic 'refactor-conditions-evaluation'

54a70b3988 Refactor: Move version compare op table out of the function
f37d6a3170 Refactor: Remove redundant checks for `0` and `1` literals
00961a4782 Refactor: Copy exactly required count of args and avoid `pop_back()`
2a72cad9be Style: Better names of local vars for `IN_LIST` handler
0dd7795706 Refactor: Extract the logic of testing for special variable to func
866b0595f6 Refactor: Introduce `cmArgumentList` container class
51d9194a96 Refactor: Reduce one more condition checking on handling math compare
46810235e3 Refactor: Avoid `if` → `else if` → … for compare operators
...

Acked-by: Kitware Robot <[email protected]>
Merge-request: !6392
Brad King 4 年之前
父节点
当前提交
350065bb85

文件差异内容过多而无法显示
+ 482 - 409
Source/cmConditionEvaluator.cxx


+ 13 - 17
Source/cmConditionEvaluator.h

@@ -4,23 +4,22 @@
 
 
 #include "cmConfigure.h" // IWYU pragma: keep
 #include "cmConfigure.h" // IWYU pragma: keep
 
 
-#include <list>
 #include <string>
 #include <string>
 #include <vector>
 #include <vector>
 
 
-#include "cmExpandedCommandArgument.h"
+#include <cmext/string_view>
+
 #include "cmListFileCache.h"
 #include "cmListFileCache.h"
 #include "cmMessageType.h"
 #include "cmMessageType.h"
 #include "cmPolicies.h"
 #include "cmPolicies.h"
 #include "cmProperty.h"
 #include "cmProperty.h"
 
 
+class cmExpandedCommandArgument;
 class cmMakefile;
 class cmMakefile;
 
 
 class cmConditionEvaluator
 class cmConditionEvaluator
 {
 {
 public:
 public:
-  using cmArgumentList = std::list<cmExpandedCommandArgument>;
-
   cmConditionEvaluator(cmMakefile& makefile, cmListFileBacktrace bt);
   cmConditionEvaluator(cmMakefile& makefile, cmListFileBacktrace bt);
 
 
   // this is a shared function for both If and Else to determine if the
   // this is a shared function for both If and Else to determine if the
@@ -30,14 +29,16 @@ public:
               std::string& errorString, MessageType& status);
               std::string& errorString, MessageType& status);
 
 
 private:
 private:
+  class cmArgumentList;
+
   // Filter the given variable definition based on policy CMP0054.
   // Filter the given variable definition based on policy CMP0054.
   cmProp GetDefinitionIfUnquoted(
   cmProp GetDefinitionIfUnquoted(
     const cmExpandedCommandArgument& argument) const;
     const cmExpandedCommandArgument& argument) const;
 
 
   cmProp GetVariableOrString(const cmExpandedCommandArgument& argument) const;
   cmProp GetVariableOrString(const cmExpandedCommandArgument& argument) const;
 
 
-  bool IsKeyword(std::string const& keyword,
-                 cmExpandedCommandArgument& argument) const;
+  bool IsKeyword(cm::static_string_view keyword,
+                 const cmExpandedCommandArgument& argument) const;
 
 
   bool GetBooleanValue(cmExpandedCommandArgument& arg) const;
   bool GetBooleanValue(cmExpandedCommandArgument& arg) const;
 
 
@@ -49,19 +50,14 @@ private:
                                           MessageType& status,
                                           MessageType& status,
                                           bool oneArg = false) const;
                                           bool oneArg = false) const;
 
 
-  void IncrementArguments(cmArgumentList& newArgs,
-                          cmArgumentList::iterator& argP1,
-                          cmArgumentList::iterator& argP2) const;
+  template <int N>
+  int matchKeysImpl(const cmExpandedCommandArgument&);
 
 
-  void HandlePredicate(bool value, int& reducible,
-                       cmArgumentList::iterator& arg, cmArgumentList& newArgs,
-                       cmArgumentList::iterator& argP1,
-                       cmArgumentList::iterator& argP2) const;
+  template <int N, typename T, typename... Keys>
+  int matchKeysImpl(const cmExpandedCommandArgument&, T, Keys...);
 
 
-  void HandleBinaryOp(bool value, int& reducible,
-                      cmArgumentList::iterator& arg, cmArgumentList& newArgs,
-                      cmArgumentList::iterator& argP1,
-                      cmArgumentList::iterator& argP2);
+  template <typename... Keys>
+  int matchKeys(const cmExpandedCommandArgument&, Keys...);
 
 
   bool HandleLevel0(cmArgumentList& newArgs, std::string& errorString,
   bool HandleLevel0(cmArgumentList& newArgs, std::string& errorString,
                     MessageType& status);
                     MessageType& status);

+ 6 - 0
Tests/RunCMake/if/IncompleteMatches-stdout.txt

@@ -0,0 +1,6 @@
+-- Test #1 passed
+-- Test #2 passed
+-- Test #3 passed
+-- Test #4 passed
+-- Test #5 passed
+-- Test #6 passed

+ 36 - 0
Tests/RunCMake/if/IncompleteMatches.cmake

@@ -0,0 +1,36 @@
+if(MATCHES)
+  message(SEND_ERROR "Test #1 failed")
+else()
+  message(STATUS "Test #1 passed")
+endif()
+
+if("" MATCHES "")
+  message(STATUS "Test #2 passed")
+else()
+  message(SEND_ERROR "Test #2 failed")
+endif()
+
+if(MATCHES RHS)
+  message(SEND_ERROR "Test #3 failed")
+else()
+  message(STATUS "Test #3 passed")
+endif()
+
+set(RHS "")
+if(MATCHES RHS)
+  message(SEND_ERROR "Test #4 failed")
+else()
+  message(STATUS "Test #4 passed")
+endif()
+
+if(MATCHES "^$")
+  message(SEND_ERROR "Test #5 failed")
+else()
+  message(STATUS "Test #5 passed")
+endif()
+
+if("" MATCHES "^$")
+  message(STATUS "Test #6 passed")
+else()
+  message(SEND_ERROR "Test #6 failed")
+endif()

+ 1 - 0
Tests/RunCMake/if/IncompleteMatchesFail-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/if/IncompleteMatchesFail-stderr.txt

@@ -0,0 +1,6 @@
+CMake Error at IncompleteMatchesFail\.cmake:1 \(if\):
+  if given arguments:
+
+    "LHS" "MATCHES"
+
+  Unknown arguments specified

+ 2 - 0
Tests/RunCMake/if/IncompleteMatchesFail.cmake

@@ -0,0 +1,2 @@
+if(LHS MATCHES)
+endif()

+ 2 - 0
Tests/RunCMake/if/RunCMakeTest.cmake

@@ -10,6 +10,8 @@ run_cmake(elseif-message)
 run_cmake(misplaced-elseif)
 run_cmake(misplaced-elseif)
 
 
 run_cmake(MatchesSelf)
 run_cmake(MatchesSelf)
+run_cmake(IncompleteMatches)
+run_cmake(IncompleteMatchesFail)
 
 
 run_cmake(TestNameThatExists)
 run_cmake(TestNameThatExists)
 run_cmake(TestNameThatDoesNotExist)
 run_cmake(TestNameThatDoesNotExist)

部分文件因为文件数量过多而无法显示