ilya-biryukov added inline comments.

================
Comment at: test/CodeCompletion/qualifiers-as-written.cpp:29
+  // CHECK-2: COMPLETION: func : [#int#]func(<#foo a#>, <#bar b#>, <#ns::bar 
c#>, <#ns::baz d#>
+  // CHECK-2: COMPLETION: func : [#int#]func(<#foo::type a#>, <#bar b#>, <#baz 
c#>
+}
----------------
arphaman wrote:
> Sorry, I see the issue now. However, I don't think that we'd like to change 
> the signature for a function like this, as we'd still prefer to show `func 
> (foo::type, ns::bar, ns::baz);` on this line.
> 
> In Xcode we actually avoid the problem with `std::vector<>`s that you've 
> pointed out entirely by using `value_type`. I'll check what our solution does.
> 
> Btw, maybe using things like `value_type` is completely wrong (with or 
> without the qualifier)? If we have `std::vector<int>` shouldn't we rather 
> show `push_back(int _Value)`, rather than the `value_type`? Perhaps this kind 
> of change should be discussed with a wider community somehow to find out 
> what's best for all users.
Using `int _Value` may be good in case of `vector<int>`, but it would probably 
loose typedefs, i.e. `vector<int32>` would still have `int`, which may be 
undesirable.
Also, for `vector<vector<int>>`, the type inside `push_back` would probably end 
up being `vector<int, std::allocator<int>>`. 


As for the current vs new behavior, I can totally see why you want to see more 
context in completion items. 

I would argue that the current code does not do a great job there, as it only 
adds qualifiers to unqualified references. But the context may be missing for 
qualified references as well.
For example, in the following code:
```
  template <class T, class Alloc = std::allocator<T>>
  struct vector {
    typedef T value_type;

    typename value_type::some_type foo();
    value_type bar()
  };
```

Completion item for `vector<X>::bar` will have return type `vector<X, 
std::allocator<X>>::value_type`. However, completion item for `vector<X, 
std::allocator<X>>::foo` will have return type `value_type::some_type` (note 
that no `vector<X, std::allocator<X>>` qualifier was added).

I would also question the intent of the current implementation. The following 
line suggest that adding those qualifers was not intended in the first place:
```
  Policy.SuppressUnwrittenScope = true;
```
But that's just a wild guess, I may be completely wrong.


That being said, I don't think there is one right preference, different people 
may prefer different options. We can surely discuss that in a wider community, 
though.

Would you be open to adding an option for that in completion and keeping the 
current behavior as a default?




https://reviews.llvm.org/D38538



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

Reply via email to