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());
}
Example #2
0
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);
}