arphaman marked 5 inline comments as done.
arphaman added inline comments.

================
Comment at: include/clang/Tooling/Refactoring/Extract/ExtractFunction.h:21
+/// then called from the place where the original code was.
+class ExtractFunction final : public SourceChangeRefactoringRule {
+public:
----------------
sammccall wrote:
> The interface given here looks great, much simpler to use directly!
> 
> The inheritance gives me some pause. A couple of related things are going on 
> here:
>  - we're inheriting the `RefactoringActionRuleBase` interface, which allows 
> this refactoring to be used generically
>  - we're inheriting `SourceChangeRefactoringRule`, which adapts the generic 
> interface to the one we actually implement
> 
> As consequences:
>   - we're bound to use a fairly generic name as our entry point here (but I 
> actually think it's a good name, so no worries)
>   - we advertise *two* public entry point, that do the same thing (but it's 
> not obvious from the signature)
> 
> The thing is, I don't think people who want the "generic" interface will be 
> using this class directly - they'll be going through the Engine, right?
> So `ExtractFunction` -> `RefactoringActionRuleBase` adapter doesn't need to 
> be here, I think it can be private in the Engine.
> That seems like a clearer separation of concerns: `ExtractFunction` only 
> cares about getting its work done, and `RefactoringEngine` owns exposing a 
> generic interface to all the rules.
You're right about the dual adaption, but this kind of class **should not** be 
invoked directly for the following reason:
While it's easy to call `createSourceReplacements` or `invoke` for local 
refactorings, the cross-TU actions will need a different invocation harness 
around them. Clangd should avoid using this kind of class directly and use 
another harness that can run refactorings across multiple-TUs if needed.

I think it's best if it stays right now, as it will help to drive cross-TU 
refactorings. We can reconsider this in the future though.
I made the `createSourceReplacements` here private though.


================
Comment at: include/clang/Tooling/Refactoring/RefactoringActionRule.h:79
+  /// Returns the descriptor for this refactoring rule.
+  virtual const RefactoringDescriptorInterface &getDescriptor() = 0;
 };
----------------
sammccall wrote:
> Did you intend to put this in RefactoringActionRuleBase? It'd be nice to have 
> it for all types of rules.
> 
> Also, it's an instance method, but don't you want to be able to get at the 
> information even if you can't apply the refactoring in the given context (so 
> initiate fails).
> 
> Maybe this should be static (and `RefactoringEngine` should expose it as part 
> of its generic interface)
Classes like ExtractFunction could be reused by multiple rules, so I put it 
there before to keep the "is this refactoring available in editor" associated 
with a rule. But now with a more generic descriptor that doesn't really 
associate title with "is this refactoring available in an editor" I can put the 
descriptor into the ExtractFunction class itself.


Repository:
  rL LLVM

https://reviews.llvm.org/D38985



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to