From f39494e4c2d2b81901052f513e2a8ce336edf11b Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Mon, 27 Sep 2010 18:01:04 +0200
Subject: [PATCH] C++: make InsertionPointLocator ready for re-use. (cherry
 picked from commit 519f1d11947ff3109850e559fae868c4a55deb43)

---
 src/libs/cplusplus/InsertionPointLocator.cpp  |  46 +++-
 src/libs/cplusplus/InsertionPointLocator.h    |  16 +-
 src/plugins/cppeditor/cppinsertdecldef.cpp    | 234 ++++++++++++++++--
 src/plugins/cppeditor/cppinsertdecldef.h      |  10 +
 src/plugins/designer/qtcreatorintegration.cpp |  27 +-
 tests/auto/cplusplus/codegen/tst_codegen.cpp  | 107 ++++----
 6 files changed, 346 insertions(+), 94 deletions(-)

diff --git a/src/libs/cplusplus/InsertionPointLocator.cpp b/src/libs/cplusplus/InsertionPointLocator.cpp
index 23c45954ea6..aefcdc051be 100644
--- a/src/libs/cplusplus/InsertionPointLocator.cpp
+++ b/src/libs/cplusplus/InsertionPointLocator.cpp
@@ -206,19 +206,23 @@ protected:
             if (AccessDeclarationAST *xsDecl = decl->asAccessDeclaration()) {
                 const unsigned token = xsDecl->access_specifier_token;
                 int newXsSpec = initialXs;
-                bool isSlot = xsDecl->slots_token && tokenKind(xsDecl->slots_token) == T_Q_SLOTS;
+                bool isSlot = xsDecl->slots_token
+                        && tokenKind(xsDecl->slots_token) == T_Q_SLOTS;
 
                 switch (tokenKind(token)) {
                 case T_PUBLIC:
-                    newXsSpec = isSlot ? InsertionPointLocator::PublicSlot : InsertionPointLocator::Public;
+                    newXsSpec = isSlot ? InsertionPointLocator::PublicSlot
+                                       : InsertionPointLocator::Public;
                     break;
 
                 case T_PROTECTED:
-                    newXsSpec = isSlot ? InsertionPointLocator::ProtectedSlot : InsertionPointLocator::Protected;
+                    newXsSpec = isSlot ? InsertionPointLocator::ProtectedSlot
+                                       : InsertionPointLocator::Protected;
                     break;
 
                 case T_PRIVATE:
-                    newXsSpec = isSlot ? InsertionPointLocator::PrivateSlot: InsertionPointLocator::Private;
+                    newXsSpec = isSlot ? InsertionPointLocator::PrivateSlot
+                                       : InsertionPointLocator::Private;
                     break;
 
                 case T_Q_SIGNALS:
@@ -268,13 +272,37 @@ InsertionLocation::InsertionLocation(const QString &prefix, const QString &suffi
     , m_column(column)
 {}
 
-InsertionPointLocator::InsertionPointLocator(const Document::Ptr &doc)
-    : m_doc(doc)
+InsertionPointLocator::InsertionPointLocator(const Snapshot &snapshot)
+    : m_snapshot(snapshot)
 {
 }
 
-InsertionLocation InsertionPointLocator::methodDeclarationInClass(const Class *clazz, AccessSpec xsSpec) const
+InsertionLocation InsertionPointLocator::methodDeclarationInClass(
+    const QString &fileName,
+    const Class *clazz,
+    AccessSpec xsSpec) const
 {
-    FindInClass find(m_doc, clazz, xsSpec);
-    return find();
+    const Document::Ptr doc = m_snapshot.document(fileName);
+    if (doc) {
+        FindInClass find(doc, clazz, xsSpec);
+        return find();
+    } else {
+        return InsertionLocation();
+    }
+}
+
+QList<InsertionLocation> InsertionPointLocator::methodDefinition(
+    const QString &fileName, DeclarationAST *prevDecl, DeclarationAST *nextDecl) const
+{
+    QList<InsertionLocation> result;
+
+    // option 1: after the prevDecl
+
+    // option 2: before the nextDecl
+
+    // option 3: inline in fileName (if fileName is a .h file)
+
+    // option 4: at the end of fileName.cpp (if fileName is not a .cpp file)
+
+    return result;
 }
diff --git a/src/libs/cplusplus/InsertionPointLocator.h b/src/libs/cplusplus/InsertionPointLocator.h
index 20d1cfe8302..424e57b72f7 100644
--- a/src/libs/cplusplus/InsertionPointLocator.h
+++ b/src/libs/cplusplus/InsertionPointLocator.h
@@ -30,6 +30,7 @@
 #ifndef INSERTIONPOINTLOCATOR_H
 #define INSERTIONPOINTLOCATOR_H
 
+#include <ASTfwd.h>
 #include <CPlusPlusForwardDeclarations.h>
 #include <Symbols.h>
 
@@ -82,19 +83,24 @@ public:
 
         SlotBit = 1 << 2,
 
-        PublicSlot = Public | SlotBit,
+        PublicSlot    = Public    | SlotBit,
         ProtectedSlot = Protected | SlotBit,
-        PrivateSlot = Private | SlotBit,
+        PrivateSlot   = Private   | SlotBit,
     };
 
 public:
-    InsertionPointLocator(const Document::Ptr &doc);
+    InsertionPointLocator(const Snapshot &snapshot);
 
-    InsertionLocation methodDeclarationInClass(const Class *clazz,
+    InsertionLocation methodDeclarationInClass(const QString &fileName,
+                                               const Class *clazz,
                                                AccessSpec xsSpec) const;
 
+    QList<InsertionLocation> methodDefinition(const QString &fileName,
+                                              CPlusPlus::DeclarationAST *prevDecl,
+                                              CPlusPlus::DeclarationAST *nextDecl) const;
+
 private:
-    Document::Ptr m_doc;
+    Snapshot m_snapshot;
 };
 
 } // namespace CPlusPlus
diff --git a/src/plugins/cppeditor/cppinsertdecldef.cpp b/src/plugins/cppeditor/cppinsertdecldef.cpp
index 9158c2b481c..c79c502660b 100644
--- a/src/plugins/cppeditor/cppinsertdecldef.cpp
+++ b/src/plugins/cppeditor/cppinsertdecldef.cpp
@@ -51,13 +51,13 @@ using CppEditor::CppRefactoringChanges;
 
 namespace {
 
-class Operation: public CppQuickFixOperation
+class InsertDeclOperation: public CppQuickFixOperation
 {
 public:
-    Operation(const CppQuickFixState &state, int priority,
-              const QString &targetFileName, const Class *targetSymbol,
-              InsertionPointLocator::AccessSpec xsSpec,
-              const QString &decl)
+    InsertDeclOperation(const CppQuickFixState &state, int priority,
+                        const QString &targetFileName, const Class *targetSymbol,
+                        InsertionPointLocator::AccessSpec xsSpec,
+                        const QString &decl)
         : CppQuickFixOperation(state, priority)
         , m_targetFileName(targetFileName)
         , m_targetSymbol(targetSymbol)
@@ -81,12 +81,12 @@ public:
 
     void performChanges(CppRefactoringFile *, CppRefactoringChanges *refactoring)
     {
-        CppRefactoringFile targetFile = refactoring->file(m_targetFileName);
-        Document::Ptr targetDoc = targetFile.cppDocument();
-        InsertionPointLocator locator(targetDoc);
-        const InsertionLocation loc = locator.methodDeclarationInClass(m_targetSymbol, m_xsSpec);
+        InsertionPointLocator locator(state().snapshot());
+        const InsertionLocation loc = locator.methodDeclarationInClass(
+                    m_targetFileName, m_targetSymbol, m_xsSpec);
         Q_ASSERT(loc.isValid());
 
+        CppRefactoringFile targetFile = refactoring->file(m_targetFileName);
         int targetPosition1 = targetFile.position(loc.line(), loc.column());
         int targetPosition2 = qMax(0, targetFile.position(loc.line(), 1) - 1);
 
@@ -151,24 +151,36 @@ QList<CppQuickFixOperation::Ptr> DeclFromDef::match(const CppQuickFixState &stat
                 const QString decl = generateDeclaration(state,
                                                          method,
                                                          targetBinding);
-                results.append(singleResult(new Operation(state, idx, fn, clazz,
-                                                          InsertionPointLocator::Public,
-                                                          decl)));
-                results.append(singleResult(new Operation(state, idx, fn, clazz,
-                                                          InsertionPointLocator::Protected,
-                                                          decl)));
-                results.append(singleResult(new Operation(state, idx, fn, clazz,
-                                                          InsertionPointLocator::Private,
-                                                          decl)));
-                results.append(singleResult(new Operation(state, idx, fn, clazz,
-                                                          InsertionPointLocator::PublicSlot,
-                                                          decl)));
-                results.append(singleResult(new Operation(state, idx, fn, clazz,
-                                                          InsertionPointLocator::ProtectedSlot,
-                                                          decl)));
-                results.append(singleResult(new Operation(state, idx, fn, clazz,
-                                                          InsertionPointLocator::PrivateSlot,
-                                                          decl)));
+                results.append(
+                            singleResult(
+                                new InsertDeclOperation(state, idx, fn, clazz,
+                                                        InsertionPointLocator::Public,
+                                                        decl)));
+                results.append(
+                            singleResult(
+                                new InsertDeclOperation(state, idx, fn, clazz,
+                                                        InsertionPointLocator::Protected,
+                                                        decl)));
+                results.append(
+                            singleResult(
+                                new InsertDeclOperation(state, idx, fn, clazz,
+                                                        InsertionPointLocator::Private,
+                                                        decl)));
+                results.append(
+                            singleResult(
+                                new InsertDeclOperation(state, idx, fn, clazz,
+                                                        InsertionPointLocator::PublicSlot,
+                                                        decl)));
+                results.append(
+                            singleResult(
+                                new InsertDeclOperation(state, idx, fn, clazz,
+                                                        InsertionPointLocator::ProtectedSlot,
+                                                        decl)));
+                results.append(
+                            singleResult(
+                                new InsertDeclOperation(state, idx, fn, clazz,
+                                                        InsertionPointLocator::PrivateSlot,
+                                                        decl)));
                 return results;
             } //! \todo support insertion of non-methods into namespaces
         }
@@ -194,3 +206,171 @@ QString DeclFromDef::generateDeclaration(const CppQuickFixState &,
 
     return decl;
 }
+
+namespace {
+
+static inline bool hasFunctionType(DeclarationAST *decl)
+{
+    if (decl->asFunctionDefinition())
+        return true;
+
+    if (SimpleDeclarationAST *ast = decl->asSimpleDeclaration())
+        if (ast->symbols && ast->symbols->value && !ast->symbols->next)
+            if (Declaration *decl = ast->symbols->value->asDeclaration())
+                if (FullySpecifiedType ty = decl->type())
+                    return ty->asFunctionType();
+
+    return false;
+}
+
+static QPair<DeclarationAST *, DeclarationAST *> findSurroundingDeclarations(
+    DeclarationListAST *members,
+    DeclarationAST *decl)
+{
+    bool found = false;
+    DeclarationAST *last = 0, *next = 0, *prev = 0;
+    DeclarationListAST *iter = members;
+    for (; iter; iter = iter->next) {
+        DeclarationAST *value = iter->value;
+        if (value == decl) {
+            prev = last;
+            found = true;
+        } else if (hasFunctionType(value)) {
+            if (found) {
+                next = value;
+                break;
+            } else {
+                last = value;
+            }
+        }
+    }
+
+    return qMakePair(prev, next);
+}
+
+} // anonymous namespace
+
+QList<CppQuickFixOperation::Ptr> DefFromDecl::match(const CppQuickFixState &state)
+{
+#if 0
+    qDebug() << Q_FUNC_INFO;
+
+    const QList<AST *> &path = state.path();
+    const CppRefactoringFile &file = state.currentFile();
+
+    DeclaratorAST *declAST = 0;
+    ClassSpecifierAST *classSpec = 0;
+    int idx = path.size() - 1;
+    for (; idx >= 0; --idx) {
+        AST *node = path.at(idx);
+        if (ClassSpecifierAST *clazz = node->asClassSpecifier()) {
+            classSpec = clazz;
+            continue;
+        }
+
+        if (idx <= 1) continue;
+        DeclaratorIdAST *declId = node->asDeclaratorId();
+        if (!declId) continue;
+
+        if (!file.isCursorOn(declId)) continue;
+
+        DeclaratorAST *candidate = path.at(idx - 1)->asDeclarator();
+        if (!candidate) continue;
+        if (!candidate->postfix_declarator_list) continue;
+        if (!candidate->postfix_declarator_list->value) continue;
+        if (candidate->postfix_declarator_list->next) continue;
+        FunctionDeclaratorAST *funDecl = candidate->postfix_declarator_list->value->asFunctionDeclarator();
+        if (!funDecl) continue;
+        if (funDecl->symbol->asFunctionType())
+            declAST = candidate;
+    }
+
+    if (!declAST || !classSpec || !classSpec->symbol)
+        return noResult();
+
+    if (!declAST->symbols || !declAST->symbols->value || declAST->symbols->next)
+        return noResult();
+
+    Declaration *decl = declAST->symbols->value->asDeclaration();
+    if (!decl)
+        return noResult();
+
+    Function *funTy = decl->type()->asFunctionType();
+    if (!funTy)
+        return noResult();
+
+    qDebug() << "-> Found funTy.";
+
+    QPair<DeclarationAST *, DeclarationAST *> surroundingNodes =
+            findSurroundingDeclarations(classSpec->member_specifier_list, declAST);
+    qDebug() << "->("<<surroundingNodes.first<<","<<surroundingNodes.second<<")";
+    if (surroundingNodes.first)
+        if (SimpleDeclarationAST *sd = surroundingNodes.first->asSimpleDeclaration())
+            qDebug()<<"-->prev@"<<sd->symbols->value->line()<<sd->symbols->value->column();
+    if (surroundingNodes.second)
+        if (SimpleDeclarationAST *sd=surroundingNodes.second->asSimpleDeclaration())
+            qDebug()<<"-->next@"<<sd->symbols->value->line()<<sd->symbols->value->column();
+#endif
+//    if (ClassOrNamespace *targetBinding = state.context().lookupParent(method)) {
+//        foreach (Symbol *s, targetBinding->symbols()) {
+//            if (Class *clazz = s->asClass()) {
+//                QList<CppQuickFixOperation::Ptr> results;
+//                const QLatin1String fn(clazz->fileName());
+//                const QString decl = generateDeclaration(state,
+//                                                         method,
+//                                                         targetBinding);
+//                results.append(
+//                            singleResult(
+//                                new InsertDeclOperation(state, idx, fn, clazz,
+//                                                        InsertionPointLocator::Public,
+//                                                        decl)));
+//                results.append(
+//                            singleResult(
+//                                new InsertDeclOperation(state, idx, fn, clazz,
+//                                                        InsertionPointLocator::Protected,
+//                                                        decl)));
+//                results.append(
+//                            singleResult(
+//                                new InsertDeclOperation(state, idx, fn, clazz,
+//                                                        InsertionPointLocator::Private,
+//                                                        decl)));
+//                results.append(
+//                            singleResult(
+//                                new InsertDeclOperation(state, idx, fn, clazz,
+//                                                        InsertionPointLocator::PublicSlot,
+//                                                        decl)));
+//                results.append(
+//                            singleResult(
+//                                new InsertDeclOperation(state, idx, fn, clazz,
+//                                                        InsertionPointLocator::ProtectedSlot,
+//                                                        decl)));
+//                results.append(
+//                            singleResult(
+//                                new InsertDeclOperation(state, idx, fn, clazz,
+//                                                        InsertionPointLocator::PrivateSlot,
+//                                                        decl)));
+//                return results;
+//            } //! \todo support insertion into namespaces
+//        }
+//    }
+
+    return noResult();
+}
+
+QString DefFromDecl::generateDefinition(const CppQuickFixState &,
+                                        Function *method,
+                                        ClassOrNamespace *targetBinding)
+{
+    Q_UNUSED(targetBinding);
+
+    Overview oo;
+    oo.setShowFunctionSignatures(true);
+    oo.setShowReturnTypes(true);
+    oo.setShowArgumentNames(true);
+
+    QString decl;
+    decl += oo(method->type(), method->unqualifiedName());
+    decl += QLatin1String(";\n");
+
+    return decl;
+}
diff --git a/src/plugins/cppeditor/cppinsertdecldef.h b/src/plugins/cppeditor/cppinsertdecldef.h
index 024359d0865..c56c17331cb 100644
--- a/src/plugins/cppeditor/cppinsertdecldef.h
+++ b/src/plugins/cppeditor/cppinsertdecldef.h
@@ -52,6 +52,16 @@ protected:
                                        CPlusPlus::ClassOrNamespace *targetBinding);
 };
 
+class DefFromDecl: public CppQuickFixFactory
+{
+public:
+    virtual QList<CppQuickFixOperation::Ptr> match(const CppQuickFixState &state);
+
+protected:
+    static QString generateDefinition(const CppQuickFixState &state,
+                                      CPlusPlus::Function *method,
+                                      CPlusPlus::ClassOrNamespace *targetBinding);
+};
 
 } // namespace Internal
 } // namespace CppEditor
diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp
index a6e48e8834b..4b741898ecb 100644
--- a/src/plugins/designer/qtcreatorintegration.cpp
+++ b/src/plugins/designer/qtcreatorintegration.cpp
@@ -273,21 +273,24 @@ static inline ITextEditable *editableAt(const QString &fileName, int line, int c
     return qobject_cast<ITextEditable *>(TextEditor::BaseTextEditor::openEditorAt(fileName, line, column));
 }
 
-static void addDeclaration(Document::Ptr doc, const Class *cl, const QString &functionName)
+static void addDeclaration(const Snapshot &snapshot,
+                           const QString &fileName,
+                           const Class *cl,
+                           const QString &functionName)
 {
-    const QString docFileName = doc->fileName();
     QString declaration = QLatin1String("void ");
     declaration += functionName;
     declaration += QLatin1String(";\n");
 
-    InsertionPointLocator find(doc);
-    const InsertionLocation loc = find.methodDeclarationInClass(cl, InsertionPointLocator::PrivateSlot);
+    InsertionPointLocator find(snapshot);
+    const InsertionLocation loc = find.methodDeclarationInClass(
+                fileName, cl, InsertionPointLocator::PrivateSlot);
 
     //
     //! \todo change this to use the Refactoring changes.
     //
 
-    if (ITextEditable *editable = editableAt(docFileName, loc.line(), loc.column() - 1)) {
+    if (ITextEditable *editable = editableAt(fileName, loc.line(), loc.column() - 1)) {
         BaseTextEditor *editor = qobject_cast<BaseTextEditor *>(editable->widget());
         if (editor) {
             QTextCursor tc = editor->textCursor();
@@ -302,8 +305,10 @@ static void addDeclaration(Document::Ptr doc, const Class *cl, const QString &fu
 }
 
 static Document::Ptr addDefinition(const CPlusPlus::Snapshot &docTable,
-                                   const QString &headerFileName, const QString &className,
-                                   const QString &functionName, int *line)
+                                   const QString &headerFileName,
+                                   const QString &className,
+                                   const QString &functionName,
+                                   int *line)
 {
     QString definition = QLatin1String("\nvoid ");
     definition += className;
@@ -440,6 +445,7 @@ static Document::Ptr getParsedDocument(const QString &fileName, CppTools::CppMod
 
     Document::Ptr doc = snapshot.documentFromSource(source, fileName);
     doc->check();
+    snapshot.insert(doc);
     return doc;
 }
 
@@ -541,11 +547,12 @@ bool QtCreatorIntegration::navigateToSlot(const QString &objectName,
     } else {
         // add function declaration to cl
         CppTools::CppModelManagerInterface::WorkingCopy workingCopy = cppModelManagerInstance()->workingCopy();
-        Document::Ptr tmpDoc = getParsedDocument(doc->fileName(), workingCopy, docTable);
-        addDeclaration(tmpDoc, cl, functionNameWithParameterNames);
+        const QString fileName = doc->fileName();
+        getParsedDocument(fileName, workingCopy, docTable);
+        addDeclaration(docTable, fileName, cl, functionNameWithParameterNames);
 
         // add function definition to cpp file
-        sourceDoc = addDefinition(docTable, doc->fileName(), className, functionNameWithParameterNames, &line);
+        sourceDoc = addDefinition(docTable, fileName, className, functionNameWithParameterNames, &line);
     }
 
     if (!sourceDoc) {
diff --git a/tests/auto/cplusplus/codegen/tst_codegen.cpp b/tests/auto/cplusplus/codegen/tst_codegen.cpp
index e763886da29..336cf780624 100644
--- a/tests/auto/cplusplus/codegen/tst_codegen.cpp
+++ b/tests/auto/cplusplus/codegen/tst_codegen.cpp
@@ -54,14 +54,17 @@ void tst_Codegen::public_in_empty_class()
     QCOMPARE(doc->diagnosticMessages().size(), 0);
     QCOMPARE(doc->globalSymbolCount(), 1U);
 
-    Class *mainWindow = doc->globalSymbolAt(0)->asClass();
-    QVERIFY(mainWindow);
-    QCOMPARE(mainWindow->line(), 1U);
-    QCOMPARE(mainWindow->column(), 7U);
-
-    InsertionPointLocator find(doc);
+    Class *foo = doc->globalSymbolAt(0)->asClass();
+    QVERIFY(foo);
+    QCOMPARE(foo->line(), 1U);
+    QCOMPARE(foo->column(), 7U);
+
+    Snapshot snapshot;
+    snapshot.insert(doc);
+    InsertionPointLocator find(snapshot);
     InsertionLocation loc = find.methodDeclarationInClass(
-                mainWindow,
+                doc->fileName(),
+                foo,
                 InsertionPointLocator::Public);
     QVERIFY(loc.isValid());
     QCOMPARE(loc.prefix(), QLatin1String("public:\n"));
@@ -90,14 +93,17 @@ void tst_Codegen::public_in_nonempty_class()
     QCOMPARE(doc->diagnosticMessages().size(), 0);
     QCOMPARE(doc->globalSymbolCount(), 1U);
 
-    Class *mainWindow = doc->globalSymbolAt(0)->asClass();
-    QVERIFY(mainWindow);
-    QCOMPARE(mainWindow->line(), 1U);
-    QCOMPARE(mainWindow->column(), 7U);
+    Class *foo = doc->globalSymbolAt(0)->asClass();
+    QVERIFY(foo);
+    QCOMPARE(foo->line(), 1U);
+    QCOMPARE(foo->column(), 7U);
 
-    InsertionPointLocator find(doc);
+    Snapshot snapshot;
+    snapshot.insert(doc);
+    InsertionPointLocator find(snapshot);
     InsertionLocation loc = find.methodDeclarationInClass(
-                mainWindow,
+                doc->fileName(),
+                foo,
                 InsertionPointLocator::Public);
     QVERIFY(loc.isValid());
     QVERIFY(loc.prefix().isEmpty());
@@ -126,14 +132,17 @@ void tst_Codegen::public_before_protected()
     QCOMPARE(doc->diagnosticMessages().size(), 0);
     QCOMPARE(doc->globalSymbolCount(), 1U);
 
-    Class *mainWindow = doc->globalSymbolAt(0)->asClass();
-    QVERIFY(mainWindow);
-    QCOMPARE(mainWindow->line(), 1U);
-    QCOMPARE(mainWindow->column(), 7U);
+    Class *foo = doc->globalSymbolAt(0)->asClass();
+    QVERIFY(foo);
+    QCOMPARE(foo->line(), 1U);
+    QCOMPARE(foo->column(), 7U);
 
-    InsertionPointLocator find(doc);
+    Snapshot snapshot;
+    snapshot.insert(doc);
+    InsertionPointLocator find(snapshot);
     InsertionLocation loc = find.methodDeclarationInClass(
-                mainWindow,
+                doc->fileName(),
+                foo,
                 InsertionPointLocator::Public);
     QVERIFY(loc.isValid());
     QCOMPARE(loc.prefix(), QLatin1String("public:\n"));
@@ -163,14 +172,17 @@ void tst_Codegen::private_after_protected()
     QCOMPARE(doc->diagnosticMessages().size(), 0);
     QCOMPARE(doc->globalSymbolCount(), 1U);
 
-    Class *mainWindow = doc->globalSymbolAt(0)->asClass();
-    QVERIFY(mainWindow);
-    QCOMPARE(mainWindow->line(), 1U);
-    QCOMPARE(mainWindow->column(), 7U);
+    Class *foo = doc->globalSymbolAt(0)->asClass();
+    QVERIFY(foo);
+    QCOMPARE(foo->line(), 1U);
+    QCOMPARE(foo->column(), 7U);
 
-    InsertionPointLocator find(doc);
+    Snapshot snapshot;
+    snapshot.insert(doc);
+    InsertionPointLocator find(snapshot);
     InsertionLocation loc = find.methodDeclarationInClass(
-                mainWindow,
+                doc->fileName(),
+                foo,
                 InsertionPointLocator::Private);
     QVERIFY(loc.isValid());
     QCOMPARE(loc.prefix(), QLatin1String("private:\n"));
@@ -200,14 +212,17 @@ void tst_Codegen::protected_in_nonempty_class()
     QCOMPARE(doc->diagnosticMessages().size(), 0);
     QCOMPARE(doc->globalSymbolCount(), 1U);
 
-    Class *mainWindow = doc->globalSymbolAt(0)->asClass();
-    QVERIFY(mainWindow);
-    QCOMPARE(mainWindow->line(), 1U);
-    QCOMPARE(mainWindow->column(), 7U);
+    Class *foo = doc->globalSymbolAt(0)->asClass();
+    QVERIFY(foo);
+    QCOMPARE(foo->line(), 1U);
+    QCOMPARE(foo->column(), 7U);
 
-    InsertionPointLocator find(doc);
+    Snapshot snapshot;
+    snapshot.insert(doc);
+    InsertionPointLocator find(snapshot);
     InsertionLocation loc = find.methodDeclarationInClass(
-                mainWindow,
+                doc->fileName(),
+                foo,
                 InsertionPointLocator::Protected);
     QVERIFY(loc.isValid());
     QCOMPARE(loc.prefix(), QLatin1String("protected:\n"));
@@ -237,14 +252,17 @@ void tst_Codegen::protected_betwee_public_and_private()
     QCOMPARE(doc->diagnosticMessages().size(), 0);
     QCOMPARE(doc->globalSymbolCount(), 1U);
 
-    Class *mainWindow = doc->globalSymbolAt(0)->asClass();
-    QVERIFY(mainWindow);
-    QCOMPARE(mainWindow->line(), 1U);
-    QCOMPARE(mainWindow->column(), 7U);
+    Class *foo = doc->globalSymbolAt(0)->asClass();
+    QVERIFY(foo);
+    QCOMPARE(foo->line(), 1U);
+    QCOMPARE(foo->column(), 7U);
 
-    InsertionPointLocator find(doc);
+    Snapshot snapshot;
+    snapshot.insert(doc);
+    InsertionPointLocator find(snapshot);
     InsertionLocation loc = find.methodDeclarationInClass(
-                mainWindow,
+                doc->fileName(),
+                foo,
                 InsertionPointLocator::Protected);
     QVERIFY(loc.isValid());
     QCOMPARE(loc.prefix(), QLatin1String("protected:\n"));
@@ -294,14 +312,17 @@ void tst_Codegen::qtdesigner_integration()
     QCOMPARE(doc->diagnosticMessages().size(), 0);
     QCOMPARE(doc->globalSymbolCount(), 2U);
 
-    Class *mainWindow = doc->globalSymbolAt(1)->asClass();
-    QVERIFY(mainWindow);
-    QCOMPARE(mainWindow->line(), 10U);
-    QCOMPARE(mainWindow->column(), 7U);
+    Class *foo = doc->globalSymbolAt(1)->asClass();
+    QVERIFY(foo);
+    QCOMPARE(foo->line(), 10U);
+    QCOMPARE(foo->column(), 7U);
 
-    InsertionPointLocator find(doc);
+    Snapshot snapshot;
+    snapshot.insert(doc);
+    InsertionPointLocator find(snapshot);
     InsertionLocation loc = find.methodDeclarationInClass(
-                mainWindow,
+                doc->fileName(),
+                foo,
                 InsertionPointLocator::PrivateSlot);
     QVERIFY(loc.isValid());
     QCOMPARE(loc.prefix(), QLatin1String("private slots:\n"));
-- 
GitLab