1//===--- RefactoringActionRule.h - Clang refactoring library -------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULE_H
10#define LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULE_H
11
12#include "clang/Basic/LLVM.h"
13#include "llvm/ADT/Optional.h"
14#include "llvm/ADT/StringRef.h"
15
16namespace clang {
17namespace tooling {
18
19class RefactoringOptionVisitor;
20class RefactoringResultConsumer;
21class RefactoringRuleContext;
22
23struct RefactoringDescriptor {
24  /// A unique identifier for the specific refactoring.
25  StringRef Name;
26  /// A human readable title for the refactoring.
27  StringRef Title;
28  /// A human readable description of what the refactoring does.
29  StringRef Description;
30};
31
32/// A common refactoring action rule interface that defines the 'invoke'
33/// function that performs the refactoring operation (either fully or
34/// partially).
35class RefactoringActionRuleBase {
36public:
37  virtual ~RefactoringActionRuleBase() {}
38
39  /// Initiates and performs a specific refactoring action.
40  ///
41  /// The specific rule will invoke an appropriate \c handle method on a
42  /// consumer to propagate the result of the refactoring action.
43  virtual void invoke(RefactoringResultConsumer &Consumer,
44                      RefactoringRuleContext &Context) = 0;
45
46  /// Returns the structure that describes the refactoring.
47  // static const RefactoringDescriptor &describe() = 0;
48};
49
50/// A refactoring action rule is a wrapper class around a specific refactoring
51/// action rule (SourceChangeRefactoringRule, etc) that, in addition to invoking
52/// the action, describes the requirements that determine when the action can be
53/// initiated.
54class RefactoringActionRule : public RefactoringActionRuleBase {
55public:
56  /// Returns true when the rule has a source selection requirement that has
57  /// to be fulfilled before refactoring can be performed.
58  virtual bool hasSelectionRequirement() = 0;
59
60  /// Traverses each refactoring option used by the rule and invokes the
61  /// \c visit callback in the consumer for each option.
62  ///
63  /// Options are visited in the order of use, e.g. if a rule has two
64  /// requirements that use options, the options from the first requirement
65  /// are visited before the options in the second requirement.
66  virtual void visitRefactoringOptions(RefactoringOptionVisitor &Visitor) = 0;
67};
68
69} // end namespace tooling
70} // end namespace clang
71
72#endif // LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULE_H
73