//===--- DefaultArgumentsDeclarationsCheck.cpp - clang-tidy ---------------===//
//
// 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 "DefaultArgumentsDeclarationsCheck.h"
#include "clang/Lex/Lexer.h"

using namespace clang::ast_matchers;

namespace clang::tidy::fuchsia {

void DefaultArgumentsDeclarationsCheck::registerMatchers(MatchFinder *Finder) {
  // Declaring default parameters is disallowed.
  Finder->addMatcher(parmVarDecl(hasDefaultArgument()).bind("decl"), this);
}

void DefaultArgumentsDeclarationsCheck::check(
    const MatchFinder::MatchResult &Result) {
  const auto *D = Result.Nodes.getNodeAs<ParmVarDecl>("decl");
  if (!D)
    return;

  SourceRange DefaultArgRange = D->getDefaultArgRange();

  if (DefaultArgRange.getEnd() != D->getEndLoc())
    return;

  if (DefaultArgRange.getBegin().isMacroID()) {
    diag(D->getBeginLoc(),
         "declaring a parameter with a default argument is disallowed");
    return;
  }

  SourceLocation StartLocation =
      D->getName().empty() ? D->getBeginLoc() : D->getLocation();

  SourceRange RemovalRange(
      Lexer::getLocForEndOfToken(StartLocation, 0, *Result.SourceManager,
                                 Result.Context->getLangOpts()),
      DefaultArgRange.getEnd());

  diag(D->getBeginLoc(),
       "declaring a parameter with a default argument is disallowed")
      << D << FixItHint::CreateRemoval(RemovalRange);
}

} // namespace clang::tidy::fuchsia
