From 873838fe3a000daf3bcd22e8aebd61634effd471 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Wed, 17 Jun 2009 11:11:21 +0200
Subject: [PATCH] Simplified TypeOf/ResolveExpression.

---
 src/libs/cplusplus/CppDocument.cpp       |  2 ++
 src/libs/cplusplus/ResolveExpression.cpp | 24 ++++++++----------------
 src/libs/cplusplus/TypeOfExpression.cpp  |  1 +
 3 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 64654030f28..bd93b8bb318 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -329,6 +329,8 @@ void Document::check()
         for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) {
             semantic.check(decl, globals);
         }
+    } else if (ExpressionAST *ast = _translationUnit->ast()->asExpression()) {
+        semantic.check(ast, globals);
     }
 }
 
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 7fa9751f1c4..9124087b6c6 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -259,8 +259,7 @@ bool ResolveExpression::visit(BinaryExpressionAST *ast)
 
 bool ResolveExpression::visit(CastExpressionAST *ast)
 {
-    Scope dummy;
-    addResult(sem.check(ast->type_id, &dummy));
+    addResult(sem.check(ast->type_id, _context.expressionDocument()->globalSymbols()));
     return false;
 }
 
@@ -278,8 +277,7 @@ bool ResolveExpression::visit(ConditionalExpressionAST *)
 
 bool ResolveExpression::visit(CppCastExpressionAST *ast)
 {
-    Scope dummy;
-    addResult(sem.check(ast->type_id, &dummy));
+    addResult(sem.check(ast->type_id, _context.expressionDocument()->globalSymbols()));
     return false;
 }
 
@@ -450,8 +448,7 @@ bool ResolveExpression::visit(CompoundLiteralAST *ast)
 bool ResolveExpression::visit(QualifiedNameAST *ast)
 {
     ResolveClass resolveClass;
-    Scope dummy;
-    Name *name = sem.check(ast, &dummy);
+    Name *name = ast->name;
 
     QList<Symbol *> symbols = _context.resolve(name);
     foreach (Symbol *symbol, symbols) {
@@ -485,10 +482,7 @@ bool ResolveExpression::visit(ConversionFunctionIdAST *)
 
 bool ResolveExpression::visit(SimpleNameAST *ast)
 {
-    Scope dummy;
-    Name *name = sem.check(ast, &dummy);
-
-    QList<Symbol *> symbols = _context.resolve(name);
+    QList<Symbol *> symbols = _context.resolve(ast->name);
     foreach (Symbol *symbol, symbols)
         addResult(symbol->type(), symbol);
 
@@ -504,10 +498,7 @@ bool ResolveExpression::visit(DestructorNameAST *)
 
 bool ResolveExpression::visit(TemplateIdAST *ast)
 {
-    Scope dummy;
-    Name *name = sem.check(ast, &dummy);
-
-    QList<Symbol *> symbols = _context.resolve(name);
+    QList<Symbol *> symbols = _context.resolve(ast->name);
     foreach (Symbol *symbol, symbols)
         addResult(symbol->type(), symbol);
 
@@ -601,8 +592,9 @@ bool ResolveExpression::visit(MemberAccessAST *ast)
     QList<Result> baseResults = _results;
 
     // Evaluate the expression-id that follows the access operator.
-    Scope dummy;
-    Name *memberName = sem.check(ast->member_name, &dummy);
+    Name *memberName = 0;
+    if (ast->member_name)
+        memberName = ast->member_name->name;
 
     // Remember the access operator.
     const unsigned accessOp = tokenKind(ast->access_token);
diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp
index 7d2d7ffdb07..a2a7b58f9a7 100644
--- a/src/libs/cplusplus/TypeOfExpression.cpp
+++ b/src/libs/cplusplus/TypeOfExpression.cpp
@@ -63,6 +63,7 @@ QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expr
     if (mode == Preprocess)
         code = preprocessedExpression(expression, m_snapshot, document);
     Document::Ptr expressionDoc = documentForExpression(code);
+    expressionDoc->check();
     m_ast = extractExpressionAST(expressionDoc);
 
     m_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc,
-- 
GitLab