C++: add code-model support for defines-per-editor.

The UI side will come in another commit.

Change-Id: I1038a438587fe4cef70408f7f627d08837fc192d
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
Erik Verbruggen
2013-09-30 14:37:50 +02:00
parent 02072109bc
commit 8c79d5bc23
5 changed files with 132 additions and 2 deletions

View File

@@ -970,3 +970,99 @@ void CppToolsPlugin::test_modelmanager_defines_per_project_pch()
QCOMPARE(decl->name()->identifier()->chars(), "two");
}
}
void CppToolsPlugin::test_modelmanager_defines_per_editor()
{
ModelManagerTestHelper helper;
MyTestDataDir testDataDirectory(QLatin1String("testdata_defines"));
const QString main1File = testDataDirectory.file(QLatin1String("main1.cpp"));
const QString main2File = testDataDirectory.file(QLatin1String("main2.cpp"));
const QString header = testDataDirectory.file(QLatin1String("header.h"));
CppModelManager *mm = CppModelManager::instance();
Project *project = helper.createProject(
QLatin1String("test_modelmanager_defines_per_editor"));
ProjectPart::Ptr part1(new ProjectPart);
part1->files.append(ProjectFile(main1File, ProjectFile::CXXSource));
part1->files.append(ProjectFile(header, ProjectFile::CXXHeader));
part1->cxxVersion = ProjectPart::CXX11;
part1->qtVersion = ProjectPart::NoQt;
part1->includePaths = QStringList() << testDataDirectory.includeDir(false);
ProjectPart::Ptr part2(new ProjectPart);
part2->files.append(ProjectFile(main2File, ProjectFile::CXXSource));
part2->files.append(ProjectFile(header, ProjectFile::CXXHeader));
part2->cxxVersion = ProjectPart::CXX11;
part2->qtVersion = ProjectPart::NoQt;
part2->includePaths = QStringList() << testDataDirectory.includeDir(false);
ProjectInfo pi = mm->projectInfo(project);
pi.appendProjectPart(part1);
pi.appendProjectPart(part2);
mm->updateProjectInfo(pi);
helper.waitForRefreshedSourceFiles();
QCOMPARE(mm->snapshot().size(), 4);
// Open a file in the editor
QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 0);
{
Core::IEditor *editor = Core::EditorManager::openEditor(main1File);
EditorCloser closer(editor);
QVERIFY(editor);
QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 1);
QVERIFY(mm->isCppEditor(editor));
CppEditorSupport *sup = mm->cppEditorSupport(
qobject_cast<TextEditor::BaseTextEditor *>(editor));
while (sup->lastSemanticInfoDocument().isNull())
QCoreApplication::processEvents();
sup->snapshotUpdater()->setEditorDefines(QByteArray("#define SUB1\n"));
sup->snapshotUpdater()->update(mm->workingCopy());
Document::Ptr doc = mm->snapshot().document(main1File);
QVERIFY(doc);
QVERIFY(doc->globalNamespace());
QCOMPARE(doc->globalSymbolCount(), 1U);
CPlusPlus::Symbol *s = doc->globalSymbolAt(0);
QVERIFY(s);
CPlusPlus::Declaration *decl = s->asDeclaration();
QVERIFY(decl);
QVERIFY(decl->type()->isIntegerType());
QCOMPARE(decl->name()->identifier()->chars(), "one");
}
{
Core::IEditor *editor = Core::EditorManager::openEditor(main2File);
EditorCloser closer(editor);
QVERIFY(editor);
QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 1);
QVERIFY(mm->isCppEditor(editor));
CppEditorSupport *sup = mm->cppEditorSupport(
qobject_cast<TextEditor::BaseTextEditor *>(editor));
while (sup->lastSemanticInfoDocument().isNull())
QCoreApplication::processEvents();
sup->snapshotUpdater()->setEditorDefines(QByteArray("#define SUB2\n"));
sup->snapshotUpdater()->update(mm->workingCopy());
Document::Ptr doc = mm->snapshot().document(main2File);
QVERIFY(doc);
QVERIFY(doc->globalNamespace());
QCOMPARE(doc->globalSymbolCount(), 1U);
CPlusPlus::Symbol *s = doc->globalSymbolAt(0);
QVERIFY(s);
CPlusPlus::Declaration *decl = s->asDeclaration();
QVERIFY(decl);
QVERIFY(decl->type()->isIntegerType());
QCOMPARE(decl->name()->identifier()->chars(), "two");
}
}