Browse Source

Refactor struct TargetFileSystemArtifact

Creates base class TargetArtifactBase which enable to share code with
future new functionalities.
Marc Chevrier 6 years ago
parent
commit
26b6d2aff0
1 changed files with 31 additions and 10 deletions
  1. 31 10
      Source/cmGeneratorExpressionNode.cxx

+ 31 - 10
Source/cmGeneratorExpressionNode.cxx

@@ -2023,18 +2023,16 @@ struct TargetFilesystemArtifactResultGetter<ArtifactPathTag>
   static std::string Get(const std::string& result) { return result; }
 };
 
-template <typename ArtifactT, typename ComponentT>
-struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
+struct TargetArtifactBase : public cmGeneratorExpressionNode
 {
-  TargetFilesystemArtifact() {} // NOLINT(modernize-use-equals-default)
-
-  int NumExpectedParameters() const override { return 1; }
+  TargetArtifactBase() {} // NOLINT(modernize-use-equals-default)
 
-  std::string Evaluate(
+protected:
+  cmGeneratorTarget* GetTarget(
     const std::vector<std::string>& parameters,
     cmGeneratorExpressionContext* context,
     const GeneratorExpressionContent* content,
-    cmGeneratorExpressionDAGChecker* dagChecker) const override
+    cmGeneratorExpressionDAGChecker* dagChecker) const
   {
     // Lookup the referenced target.
     std::string name = parameters.front();
@@ -2042,20 +2040,20 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
     if (!cmGeneratorExpression::IsValidTargetName(name)) {
       ::reportError(context, content->GetOriginalExpression(),
                     "Expression syntax not recognized.");
-      return std::string();
+      return nullptr;
     }
     cmGeneratorTarget* target = context->LG->FindGeneratorTargetToUse(name);
     if (!target) {
       ::reportError(context, content->GetOriginalExpression(),
                     "No target \"" + name + "\"");
-      return std::string();
+      return nullptr;
     }
     if (target->GetType() >= cmStateEnums::OBJECT_LIBRARY &&
         target->GetType() != cmStateEnums::UNKNOWN_LIBRARY) {
       ::reportError(context, content->GetOriginalExpression(),
                     "Target \"" + name +
                       "\" is not an executable or library.");
-      return std::string();
+      return nullptr;
     }
     if (dagChecker &&
         (dagChecker->EvaluatingLinkLibraries(target) ||
@@ -2064,6 +2062,29 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
       ::reportError(context, content->GetOriginalExpression(),
                     "Expressions which require the linker language may not "
                     "be used while evaluating link libraries");
+      return nullptr;
+    }
+
+    return target;
+  }
+};
+
+template <typename ArtifactT, typename ComponentT>
+struct TargetFilesystemArtifact : public TargetArtifactBase
+{
+  TargetFilesystemArtifact() {} // NOLINT(modernize-use-equals-default)
+
+  int NumExpectedParameters() const override { return 1; }
+
+  std::string Evaluate(
+    const std::vector<std::string>& parameters,
+    cmGeneratorExpressionContext* context,
+    const GeneratorExpressionContent* content,
+    cmGeneratorExpressionDAGChecker* dagChecker) const override
+  {
+    cmGeneratorTarget* target =
+      this->GetTarget(parameters, context, content, dagChecker);
+    if (!target) {
       return std::string();
     }
     context->DependTargets.insert(target);