ilya-biryukov added a comment.

In D64518#1588092 <https://reviews.llvm.org/D64518#1588092>, @ymandel wrote:

> This seems like a good candidate for configuration -- the user could then 
> choose which mode to run in.  But, I'm also open to just reporting these 
> conditions as errors.  It's already in a context that returns Expected, so 
> its no trouble; it's just a matter of choosing what we think is "correct".


WRT to returning `Expected` vs `Optional`. Either seems fine and in the spirit 
of the library, depending on whether we want to produce more detailed errors. 
However, if we choose `Optional` let's stick to it, as practice shows switching 
from `Optional` to `Expected` correctly is almost impossible, as that requires 
a lot of attention to make sure all clients consume the errors (and given that 
it's an error case, tests often don't catch unconsumed errors).
I would personally go with `Optional` here (meaning the client code would have 
to say something generic like `could not map from macro expansion to source 
code`). But up to you, not a strong preference.

WRT to which cases we choose to handle, I'd start with a minimal number of 
supported examples (covering full macro expansion, or inside a single argument) 
and gradually add other cases as we find use-cases. What are your thoughts on 
that?



================
Comment at: clang/lib/Tooling/Refactoring/Transformer.cpp:76
+static llvm::Optional<CharSourceRange>
+makeValidRange(CharSourceRange Range, const MatchResult &Result) {
+  const SourceManager &SM = *Result.SourceManager;
----------------
ymandel wrote:
> ilya-biryukov wrote:
> > Could we add unit tests for this particular function?
> > 
> > Interesting cases (`[[` and `]]` mark the start and end of a range):
> > ```
> > #define FOO(a) a+a;
> > #define BAR 10+
> > 
> > // change part of a macro argument
> > int a = FOO([[10]] + 10);
> > 
> > // change the whole macro expansion
> > int b = [[FOO(10+10)]];
> > 
> > // Try to change 10 inside 'BAR', but not '+'.
> > // Should this fail? Should we give a warning?
> > int c = BAR 3; 
> > 
> > // Try changing the lhs (10) of a binary expr, but not rhs.
> > // Is that allowed? Should we give a warning?
> > int d = FOO(10);
> > ```
> Sure. What do you think of exposing this function in 
> clang/include/clang/Tooling/Refactoring/SourceCode.h and testing it from 
> there?
Sounds reasonable. Was thinking of a better name, maybe something like 
`getRangeForEdit()`?
Would also suggest to accept `SourceManager` and `LangOptions` instead of 
`MatchResult` to narrow down the requirements on the clients.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D64518/new/

https://reviews.llvm.org/D64518



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

Reply via email to