forked from qt-creator/qt-creator
		
	C++: fix support for nested anonymous classes
A member of nested anonymous class should be visible as a member of enclosing class(if there is no declaration of this nested anonymous class). Fix: * marking * find usage * follow symbol * completion Task-number: QTCREATORBUG-10876 Task-number: QTCREATORBUG-11170 Change-Id: If5b4d198e9075f2a8aa899ae59190f2c05f7b1ff Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Przemyslaw Gorszkowski <pgorszkowski@gmail.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
		
				
					committed by
					
						
						Erik Verbruggen
					
				
			
			
				
	
			
			
			
						parent
						
							b96bb6172e
						
					
				
				
					commit
					376f77952e
				
			@@ -1554,27 +1554,46 @@ void CppCompletionAssistProcessor::completeClass(CPlusPlus::ClassOrNamespace *b,
 | 
			
		||||
            if (staticLookup)
 | 
			
		||||
                addCompletionItem(scope, InjectedClassNameOrder); // add a completion item for the injected class name.
 | 
			
		||||
 | 
			
		||||
            for (Scope::iterator it = scope->firstMember(); it != scope->lastMember(); ++it) {
 | 
			
		||||
                Symbol *member = *it;
 | 
			
		||||
                if (member->isFriend()
 | 
			
		||||
                        || member->isQtPropertyDeclaration()
 | 
			
		||||
                        || member->isQtEnum()) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                } else if (!staticLookup && (member->isTypedef() ||
 | 
			
		||||
                                            member->isEnum()    ||
 | 
			
		||||
                                            member->isClass())) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (member->isPublic())
 | 
			
		||||
                    addCompletionItem(member, PublicClassMemberOrder);
 | 
			
		||||
                else
 | 
			
		||||
                    addCompletionItem(member);
 | 
			
		||||
            }
 | 
			
		||||
            addClassMembersToCompletion(scope, staticLookup);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CppCompletionAssistProcessor::addClassMembersToCompletion(Scope *scope, bool staticLookup)
 | 
			
		||||
{
 | 
			
		||||
    if (!scope)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    std::set<Class *> nestedAnonymouses;
 | 
			
		||||
 | 
			
		||||
    for (Scope::iterator it = scope->firstMember(); it != scope->lastMember(); ++it) {
 | 
			
		||||
        Symbol *member = *it;
 | 
			
		||||
        if (member->isFriend()
 | 
			
		||||
                || member->isQtPropertyDeclaration()
 | 
			
		||||
                || member->isQtEnum()) {
 | 
			
		||||
            continue;
 | 
			
		||||
        } else if (!staticLookup && (member->isTypedef() ||
 | 
			
		||||
                                    member->isEnum()    ||
 | 
			
		||||
                                    member->isClass())) {
 | 
			
		||||
            continue;
 | 
			
		||||
        } else if (member->isClass() && member->name()->isAnonymousNameId()) {
 | 
			
		||||
            nestedAnonymouses.insert(member->asClass());
 | 
			
		||||
        } else if (member->isDeclaration()) {
 | 
			
		||||
            Class *declTypeAsClass = member->asDeclaration()->type()->asClassType();
 | 
			
		||||
            if (declTypeAsClass && declTypeAsClass->name()->isAnonymousNameId())
 | 
			
		||||
                nestedAnonymouses.erase(declTypeAsClass);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (member->isPublic())
 | 
			
		||||
            addCompletionItem(member, PublicClassMemberOrder);
 | 
			
		||||
        else
 | 
			
		||||
            addCompletionItem(member);
 | 
			
		||||
    }
 | 
			
		||||
    std::set<Class *>::const_iterator citEnd = nestedAnonymouses.end();
 | 
			
		||||
    for (std::set<Class *>::const_iterator cit = nestedAnonymouses.begin(); cit != citEnd; ++cit)
 | 
			
		||||
        addClassMembersToCompletion(*cit, staticLookup);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool CppCompletionAssistProcessor::completeQtMethod(const QList<CPlusPlus::LookupItem> &results, bool wantSignals)
 | 
			
		||||
{
 | 
			
		||||
    if (results.isEmpty())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user