Completion for typedef of pointer to struct.

This commit is contained in:
Roberto Raggi
2008-12-31 10:57:27 +01:00
parent c7ac64e7de
commit f0ac751f4a
3 changed files with 42 additions and 21 deletions

View File

@@ -32,13 +32,15 @@
***************************************************************************/ ***************************************************************************/
#include "LookupContext.h" #include "LookupContext.h"
#include "ResolveExpression.h"
#include "Overview.h"
#include <CoreTypes.h> #include <CoreTypes.h>
#include <Symbols.h> #include <Symbols.h>
#include <Literals.h> #include <Literals.h>
#include <Names.h> #include <Names.h>
#include <Scope.h> #include <Scope.h>
#include <Control.h> #include <Control.h>
#include <cplusplus/Overview.h>
#include <QtDebug> #include <QtDebug>

View File

@@ -427,7 +427,7 @@ bool ResolveExpression::visit(UnaryExpressionAST *ast)
bool ResolveExpression::visit(QualifiedNameAST *ast) bool ResolveExpression::visit(QualifiedNameAST *ast)
{ {
ResolveClass symbolsForDotAcces; ResolveClass resolveClass;
Scope dummy; Scope dummy;
Name *name = sem.check(ast, &dummy); Name *name = sem.check(ast, &dummy);
@@ -437,7 +437,8 @@ bool ResolveExpression::visit(QualifiedNameAST *ast)
if (NamedType *namedTy = symbol->type()->asNamedType()) { if (NamedType *namedTy = symbol->type()->asNamedType()) {
LookupContext symbolContext(symbol, _context); LookupContext symbolContext(symbol, _context);
const Result r(namedTy, symbol); const Result r(namedTy, symbol);
const QList<Symbol *> resolvedClasses = symbolsForDotAcces(r, _context); const QList<Symbol *> resolvedClasses =
resolveClass(r, _context);
if (resolvedClasses.count()) { if (resolvedClasses.count()) {
foreach (Symbol *s, resolvedClasses) { foreach (Symbol *s, resolvedClasses) {
addResult(s->type(), s); addResult(s->type(), s);
@@ -555,8 +556,8 @@ bool ResolveExpression::visit(ArrayAccessAST *ast)
symbolsForDotAcccess(p, _context); symbolsForDotAcccess(p, _context);
foreach (Symbol *classObject, classObjectCandidates) { foreach (Symbol *classObject, classObjectCandidates) {
const QList<Result> overloads = resolveArrayOperator(p, namedTy, const QList<Result> overloads =
classObject->asClass()); resolveArrayOperator(p, namedTy, classObject->asClass());
foreach (Result r, overloads) { foreach (Result r, overloads) {
FullySpecifiedType ty = r.first; FullySpecifiedType ty = r.first;
Function *funTy = ty->asFunction(); Function *funTy = ty->asFunction();

View File

@@ -581,24 +581,36 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
if (results.isEmpty()) if (results.isEmpty())
return false; return false;
const TypeOfExpression::Result p = results.first(); TypeOfExpression::Result result = results.first();
QList<Symbol *> classObjectCandidates; QList<Symbol *> classObjectCandidates;
if (m_completionOperator == T_ARROW) { if (m_completionOperator == T_ARROW) {
FullySpecifiedType ty = p.first; FullySpecifiedType ty = result.first;
if (ReferenceType *refTy = ty->asReferenceType()) if (ReferenceType *refTy = ty->asReferenceType())
ty = refTy->elementType(); ty = refTy->elementType();
if (NamedType *namedTy = ty->asNamedType()) {
// ### This code is pretty slow.
const QList<Symbol *> candidates = context.resolve(namedTy->name());
foreach (Symbol *candidate, candidates) {
if (candidate->isTypedef()) {
ty = candidate->type();
const ResolveExpression::Result r(ty, candidate);
result = r;
break;
}
}
}
if (NamedType *namedTy = ty->asNamedType()) { if (NamedType *namedTy = ty->asNamedType()) {
ResolveExpression resolveExpression(context); ResolveExpression resolveExpression(context);
ResolveClass resolveClass; ResolveClass resolveClass;
const QList<Symbol *> candidates = resolveClass(namedTy, p, context); const QList<Symbol *> candidates = resolveClass(result, context);
foreach (Symbol *classObject, candidates) { foreach (Symbol *classObject, candidates) {
const QList<TypeOfExpression::Result> overloads = const QList<TypeOfExpression::Result> overloads =
resolveExpression.resolveArrowOperator(p, namedTy, resolveExpression.resolveArrowOperator(result, namedTy,
classObject->asClass()); classObject->asClass());
foreach (TypeOfExpression::Result r, overloads) { foreach (TypeOfExpression::Result r, overloads) {
@@ -615,7 +627,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
if (PointerType *ptrTy = ty->asPointerType()) { if (PointerType *ptrTy = ty->asPointerType()) {
if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) { if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) {
const QList<Symbol *> classes = const QList<Symbol *> classes =
resolveClass(namedTy, p, context); resolveClass(namedTy, result, context);
foreach (Symbol *c, classes) { foreach (Symbol *c, classes) {
if (! classObjectCandidates.contains(c)) if (! classObjectCandidates.contains(c))
@@ -629,17 +641,22 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) { if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) {
ResolveClass resolveClass; ResolveClass resolveClass;
const QList<Symbol *> classes = resolveClass(namedTy, p, const QList<Symbol *> classes = resolveClass(namedTy, result,
context); context);
foreach (Symbol *c, classes) { foreach (Symbol *c, classes) {
if (! classObjectCandidates.contains(c)) if (! classObjectCandidates.contains(c))
classObjectCandidates.append(c); classObjectCandidates.append(c);
} }
} else if (Class *classTy = ptrTy->elementType()->asClass()) {
// typedef struct { int x } *Ptr;
// Ptr p;
// p->
classObjectCandidates.append(classTy);
} }
} }
} else if (m_completionOperator == T_DOT) { } else if (m_completionOperator == T_DOT) {
FullySpecifiedType ty = p.first; FullySpecifiedType ty = result.first;
if (ReferenceType *refTy = ty->asReferenceType()) if (ReferenceType *refTy = ty->asReferenceType())
ty = refTy->elementType(); ty = refTy->elementType();
@@ -663,7 +680,8 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
if (namedTy) { if (namedTy) {
ResolveClass resolveClass; ResolveClass resolveClass;
const QList<Symbol *> symbols = resolveClass(namedTy, p, context); const QList<Symbol *> symbols = resolveClass(namedTy, result,
context);
foreach (Symbol *symbol, symbols) { foreach (Symbol *symbol, symbols) {
if (classObjectCandidates.contains(symbol)) if (classObjectCandidates.contains(symbol))
continue; continue;