static ClassDocumentPtrPair findClassRecursively(const LookupContext &context, const QString &className, unsigned maxIncludeDepth, QString *namespaceName) { const Document::Ptr doc = context.thisDocument(); const Snapshot docTable = context.snapshot(); if (Designer::Constants::Internal::debug) qDebug() << Q_FUNC_INFO << doc->fileName() << className << maxIncludeDepth; // Check document if (const Class *cl = findClass(doc->globalNamespace(), context, className, namespaceName)) return ClassDocumentPtrPair(cl, doc); if (maxIncludeDepth) { // Check the includes const unsigned recursionMaxIncludeDepth = maxIncludeDepth - 1u; const auto includedFiles = doc->includedFiles(); for (const QString &include : includedFiles) { const Snapshot::const_iterator it = docTable.find(include); if (it != docTable.end()) { const Document::Ptr includeDoc = it.value(); LookupContext context(includeDoc, docTable); const ClassDocumentPtrPair irc = findClassRecursively(context, className, recursionMaxIncludeDepth, namespaceName); if (irc.first) return irc; } } } return ClassDocumentPtrPair(0, Document::Ptr()); }
std::unique_ptr<Unit> TypeChecker::TypeCheckerTest::runCore(std::unique_ptr<Factory> factory, const std::string& code, const std::string& fullFileName, const std::vector<Diagnostic::Code>& expectedReports, const std::pair<std::string, Type::Kind>& expectedBindings) { std::vector<std::string> searchPaths = readSearchPaths(); TokenMap tokens; LexemeMap lexs; Snapshot snapshot; DiagnosticReports reports; Manager manager; manager.config(factory.get(), &tokens, &lexs, snapshot); for (const auto& path : searchPaths) manager.addSearchPath(path); std::unique_ptr<Unit> unit = manager.process(code, fullFileName); UAISO_EXPECT_TRUE(unit->ast()); Program* prog = snapshot.find(fullFileName); UAISO_EXPECT_TRUE(prog); TypeChecker typeChecker(factory.get()); typeChecker.setLexemes(&lexs); typeChecker.setTokens(&tokens); typeChecker.collectDiagnostics(&reports); typeChecker.check(Program_Cast(unit->ast())); UAISO_EXPECT_INT_EQ(expectedReports.size(), reports.size()); for (const auto& s : expectedReports) { UAISO_EXPECT_TRUE(std::find_if(reports.begin(), reports.end(), [s](const DiagnosticReport& report) { return report.diagnostic().code() == s; }) != reports.end()); } const std::string& symName = expectedBindings.first; if (!symName.empty()) { for (auto valSym : prog->env().listValueDecls()) { if (valSym->name()->str() == symName) { auto ty = valSym->valueType(); UAISO_EXPECT_INT_EQ(static_cast<int>(expectedBindings.second), static_cast<int>(ty->kind())); } } } return std::move(unit); }