kadircet added a comment.

In D143640#4122603 <https://reviews.llvm.org/D143640#4122603>, @hokein wrote:

> Thanks for the comment, putting more thoughts.
>
> In D143640#4121998 <https://reviews.llvm.org/D143640#4121998>, @kadircet 
> wrote:
>
>> All this complexity for handling only 4 symbols feels wrong. is this the 
>> whole set? are there any other symbols that fall under this class? can we 
>> disambiguate all of them solely based on number of parameters?
>
> No, these 4 symbols is not the whole set, there are other symbols (e.g. 
> `isspace` from `<cctype>`, or `<locale>`), but these are not important, IMO.

I agree them being not important. But I think having such a complex 
infrastructure for just 4 symbols and making it more complex in the future when 
we want to handle these just sounds like a big negative.

> The number of parameters is the most critical information to disambiguate -- 
> there are some exceptions, e.g. `std::get()` has a few 1-parameter overloads 
> for array, vector, etc. We will add more information in the `SymbolName` 
> structure for disambiguation in the future.

Makes sense. but maybe there's a way that involves not relying on parameter 
count at all and something completely different. that's another reason why I 
was asking for other symbols that are causing problems today.

>> Downsides:
>>
>> - We are relying heavily on number of parameters in certain cases now
>
> Yeah, I think this is expected if we want to do disambiguations.
>
>> - We only have that information available for symbols with variants
>
> My intention of this information is internal, and merely used for 
> disambiguation. And we're not exposing them to public APIs.

I can see that purpose, but having those symbols available internally without 
any way for users to poke at them sounds like a shortcoming of the design 
that'll never address. Hence I was trying to avoid that.

>> - We're creating a discrepancy in Symbol::all() vs Symbol::named() views of 
>> the world
>
> Oh, this is not intended, we can remove this discrepancy, and make 
> `Symbol::all()` and `Symbol::named()` aligned.

I don't think removing that discrepancy by also dropping these symbols from 
::all is the right trade-off though. As they're still available as a `Symbol` 
through Recognizer. I think the more appropriate thing would require us to 
change `::named` to return multiple symbols, with enough details for 
disambiguation if needed.

>> - In addition to generator and hand curated list, now there's a 3rd place to 
>> augment symbol mapping
>
> Right, this bit is untweaked in this current patch (there is a FIXME), we can 
> merge it with the hand-curated list.
>
>> This complexity both in terms of mental load when introducing new symbols, 
>> and also possible discrepancies that can be encountered when using the 
>> public APIs makes me question if we're doing the sensible thing that'll 
>> generalize for the future variant symbols, or just trying to patch up a 
>> solution for couple cases we know to be not working.
>> I'd suggest:
>> 1- doing a little bit more design work here and at least getting rid of the 
>> burden on the public APIs and a way to introduce these symbols through hand 
>> curated lists (e.g. we should be returning all alternatives in 
>> Symbol::named, with enough details for the caller to have a chance to 
>> disambiguate and have maybe new syntax in raw symbol map files to indicate 
>> this variant situation).
>
> OK, looks like we have some different ideas on the design here. I'm not sure 
> returning all alternatives in `Symbol::named` and exposing all information 
> for disambiguation is a good idea (I'm also not sure it is an important 
> usecase). This seems complicating the public APIs too much.

I think we agree on them being not important so far. But I don't see why having 
a discrepancy between `Symbol`s received through `Recognizer` and 
`Symbol::named` is preferred instead of having a unified view between the two 
(which we already have right now, by excluding variants from both).
I was suggesting preserving this invariant because it's easier to reason about 
the library when we only have a single view rather than 2. Could you elaborate 
a little on why you think "exposing all information for disambiguation" is not 
a good idea? The public interfaces stays ~the same. We'll be having these extra 
information in `Symbol`, if we can find a meaningful set.

> My original design is
>
> - full disambiguation is *only* performed in the `Recognizer` API where the 
> input is the AST node
> - other qualified-name-based APIs `Symbol::named` remains the same (or best 
> effort returning the symbol with most common header)
>
> I share your concern about the current approach, it is not perfect, but I 
> think this is moving towards a right direction, the tradeoff seems OK to me 
> (rather than putting the special-case handling to *every* application, we 
> isolate it in one place).

I agree that sharing this logic with applications is definitely a plus (and is 
the main goal of this library). I am mostly concerned of current approach 
because it's adding too much complexity for handling of 2 special symbols, that 
might not generalise to others in the future and we can special case these 
symbols on the applications with only couple lines of code + this special 
casing still needs to exist in applications that uses Symbol::named interfaces. 
Therefore this discrepancy might create bugs in the future, just because people 
are used to behaviour in one side and expect the same on the other.

>> 2- or handling this in include-cleaner only, similar to how we do it in 
>> clangd and other applications, until we encounter more problematic symbols. 
>> as handling this in the general case seems hard (especially in the absence 
>> of an AST), and we haven't seen enough signals for symbols other than 
>> `std::move` to cause trouble.
>>
>> i feel like 2nd alternative gets us a long way with minimal effort. WDYT?
>
> The 2nd alternative definitely sounds good to me. Before we settle down the 
> design, I will prepare a patch to special-case these symbols in 
> include-cleaner.

Thanks a lot!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D143640

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

Reply via email to