932dc71fe2
For instance, consider class A { int a; int b; } class B { A c; void foo() { c. //<---- (3) } } int main() { c. //<---- (1) foo.c. //<---- (2) } Consider cases (1) and (2) first - in the case (1) scope completion shouldn't be performed because c isn't a global variable; however, in case (2) it should be performed because c is a member. To fix this, we can check whether the typed variable ('c' in this case) is preceeded by another dot - if it is, use member tags for scope completion; otherwise don't use them. There's one exception from this rule - in the case (3) we are accessing a member variable from a member function at the same scope so the function should have access to the variable. For this we can use the scope at the position of the cursor. It should be B::foo in this case, more generally ...::class_name::function_name. We need to check if class_name exists at the given scope and if the member variable we are trying to access is inside ...::class_name - if so, scope completion can be performed using member tags (without explicit invocation on a member).