//=- unittest/Tooling/RecursiveASTVisitorTests/ImplicitCtorInitializer.cpp -=//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "TestVisitor.h"

using namespace clang;

namespace {

class CXXCtorInitializerVisitor : public ExpectedLocationVisitor {
public:
  CXXCtorInitializerVisitor(bool VisitImplicitCode) {
    ShouldVisitImplicitCode = VisitImplicitCode;
  }

  bool TraverseConstructorInitializer(CXXCtorInitializer *Init) override {
    if (!Init->isWritten())
      VisitedImplicitInitializer = true;
    Match("initializer", Init->getSourceLocation());
    return ExpectedLocationVisitor::TraverseConstructorInitializer(Init);
  }

  bool VisitedImplicitInitializer = false;
};

// Check to ensure that CXXCtorInitializer is not visited when implicit code
// should not be visited and that it is visited when implicit code should be
// visited.
TEST(RecursiveASTVisitor, CXXCtorInitializerVisitNoImplicit) {
  for (bool VisitImplCode : {true, false}) {
    CXXCtorInitializerVisitor Visitor(VisitImplCode);
    Visitor.ExpectMatch("initializer", 7, 17);
    llvm::StringRef Code = R"cpp(
        class A {};
        class B : public A {
          B() {};
        };
        class C : public A {
          C() : A() {}
        };
      )cpp";
    EXPECT_TRUE(Visitor.runOver(Code, CXXCtorInitializerVisitor::Lang_CXX));
    EXPECT_EQ(Visitor.VisitedImplicitInitializer, VisitImplCode);
  }
}
} // end anonymous namespace
