[PATCH] D148457: [clangd] Support macro evaluation on hover

Younan Zhang via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 28 20:56:27 PDT 2023


zyounan added a comment.

Haha. My bad for misunderstanding.

> I think rather if the common ancestor isn't completely selected, evaluation shouldn't happen.

I don't think it is a feasible approach to simply opt out of partial selection. Please consider this snippet:

  #define SizeOf sizeof
  void check() {
    Siz^eOf(int);
  }

And associative selection tree:

  Built selection tree
   TranslationUnitDecl 
     FunctionDecl void check()
       CompoundStmt { …
        .UnaryExprOrTypeTraitExpr sizeof(int)  # Partial selected. Exclude it?

Obviously we're expecting evaluation on such macro (which is just what the original issue addresses). And it's worth noting that if we define the macro a whole expression e.g., `sizeof(int)`, rather than a token `sizeof`, the common ancestor will be seen as completely selected.

OTOH, it doesn't seem so trivial to me to tell if an expression or token is appropriate (or to say, full enough?) to evaluate. Take Nathan's case for example. The macros `#define PLUS_TWO +2` and the `#define PLUS_TWO 2` are both transformed into the same AST. The mapped selection tree is,

  .BinaryOperator 40 + 2
     *IntegerLiteral 2  # For either '40 PLU^S_TWO' or '40 + PLU^S_TWO'

...or even more extreme,

  #define PLUS_TWO +2
  40 + PL^US_TWO;  // it should be seen as '+2', right?

As of now I didn't come up with a better idea to split the cases. Any suggestion? :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148457



More information about the cfe-commits mailing list