From 0daf22c7a0f3f302164b791dc219232e3e22ed19 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Wed, 23 Dec 2009 12:55:35 +0100
Subject: [PATCH] Quickfix: Add a typeOf helper to conveniently get the type of
 an expr.

Reviewed-by: Erik Verbruggen
---
 src/plugins/cppeditor/cppquickfix.cpp | 23 +++++++++++++++++++++--
 src/plugins/cppeditor/cppquickfix.h   |  6 +++++-
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index 7a89f982c1b..ee18165ceab 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -841,7 +841,10 @@ Snapshot QuickFixOperation::snapshot() const
 { return _snapshot; }
 
 void QuickFixOperation::setSnapshot(const CPlusPlus::Snapshot &snapshot)
-{ _snapshot = snapshot; }
+{
+    _snapshot = snapshot;
+    _typeOfExpression.setSnapshot(snapshot);
+}
 
 CPPEditor *QuickFixOperation::editor() const
 { return _editor; }
@@ -1032,7 +1035,7 @@ QString QuickFixOperation::textOf(int firstOffset, int lastOffset) const
     return tc.selectedText();
 }
 
-QString QuickFixOperation::textOf(AST *ast) const
+QString QuickFixOperation::textOf(const AST *ast) const
 {
     return textOf(startOf(ast), endOf(ast));
 }
@@ -1054,6 +1057,22 @@ void QuickFixOperation::apply()
     _textCursor.endEditBlock();
 }
 
+/**
+ * Returns a list of possible fully specified types associated with the
+ * given expression.
+ *
+ * NOTE: The fully specified types only stay valid until the next call to typeOf.
+ */
+const QList<LookupItem> QuickFixOperation::typeOf(const CPlusPlus::ExpressionAST *ast)
+{
+    unsigned line, column;
+    document()->translationUnit()->getTokenStartPosition(ast->firstToken(), &line, &column);
+    Symbol *lastVisibleSymbol = document()->findSymbolAt(line, column);
+
+    return _typeOfExpression(textOf(ast), document(), lastVisibleSymbol,
+                             TypeOfExpression::Preprocess);
+}
+
 CPPQuickFixCollector::CPPQuickFixCollector()
     : _modelManager(CppTools::CppModelManagerInterface::instance()), _editor(0)
 { }
diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h
index d98f606d846..5281876053d 100644
--- a/src/plugins/cppeditor/cppquickfix.h
+++ b/src/plugins/cppeditor/cppquickfix.h
@@ -33,6 +33,7 @@
 #include <texteditor/icompletioncollector.h>
 
 #include <cplusplus/CppDocument.h>
+#include <cplusplus/TypeOfExpression.h>
 #include <ASTfwd.h>
 
 #include <utils/changeset.h>
@@ -114,7 +115,7 @@ protected:
     void copy(const CPlusPlus::AST *ast, int to);
 
     QString textOf(int firstOffset, int lastOffset) const;
-    QString textOf(CPlusPlus::AST *ast) const;
+    QString textOf(const CPlusPlus::AST *ast) const;
 
     struct Range {
         Range() {}
@@ -127,6 +128,8 @@ protected:
     Range createRange(CPlusPlus::AST *ast) const; // ### rename me
     void reindent(const Range &range);
 
+    const QList<CPlusPlus::LookupItem> typeOf(const CPlusPlus::ExpressionAST *ast);
+
 private:
     CPlusPlus::Document::Ptr _document;
     CPlusPlus::Snapshot _snapshot;
@@ -134,6 +137,7 @@ private:
     Utils::ChangeSet _changeSet;
     CPPEditor *_editor;
     CPlusPlus::AST *_topLevelNode;
+    CPlusPlus::TypeOfExpression _typeOfExpression;
 };
 
 class CPPQuickFixCollector: public TextEditor::IQuickFixCollector
-- 
GitLab