xaizek / zograscope (License: AGPLv3 only) (since 2018-12-07)
Mainly a syntax-aware diff that also provides a number of additional tools.
<root> / tools / tui / FileRegistry.cpp (d9b726231709661dd6d6090b013f310a8174cf32) (2,449B) (mode 100644) [raw]
// Copyright (C) 2019 xaizek <xaizek@posteo.net>
//
// This file is part of zograscope.
//
// zograscope is free software: you can redistribute it and/or modify
// it under the terms of version 3 of the GNU Affero General Public License as
// published by the Free Software Foundation.
//
// zograscope is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with zograscope.  If not, see <http://www.gnu.org/licenses/>.

#include "FileRegistry.hpp"

#include <boost/optional.hpp>

#include <iostream>
#include <string>
#include <vector>

#include "tooling/FunctionAnalyzer.hpp"
#include "tooling/common.hpp"
#include "utils/optional.hpp"
#include "NodeRange.hpp"
#include "mtypes.hpp"
#include "tree.hpp"

FileRegistry::FileRegistry(Environment &env) : env(env)
{ }

bool
FileRegistry::addFile(const std::string &path)
{
    const CommonArgs &args = env.getCommonArgs();
    Tree &tree = trees.emplace(path, Tree(&mr)).first->second;

    if (optional_t<Tree> &&t = buildTreeFromFile(env, path, &mr)) {
        tree = *t;
    } else {
        std::cerr << "Failed to parse: " << path << '\n';
        return false;
    }

    dumpTree(args, tree);

    if (args.dryRun) {
        return true;
    }

    Language &lang = *tree.getLanguage();

    FunctionAnalyzer functionAnalyzer(lang);
    Location loc = { path, -1, -1 };
    for (const Node *node : NodeRange(tree.getRoot())) {
        if (!node->leaf && lang.classify(node->stype) == MType::Function) {
            loc.line = node->line;
            loc.col = node->col;

            int size = functionAnalyzer.getLineCount(node);
            int params = functionAnalyzer.getParamCount(node);
            infos.emplace_back(FuncInfo { node, loc, size, params });
        }
    }

    return true;
}

const std::vector<FuncInfo> &
FileRegistry::getFuncInfos() const
{
    return infos;
}

std::vector<std::string>
FileRegistry::listFileNames() const
{
    std::vector<std::string> files;
    files.reserve(trees.size());

    for (const auto &entry : trees) {
        files.push_back(entry.first);
    }

    return files;
}

const Tree &
FileRegistry::getTree(const std::string &path) const
{
    return trees.at(path);
}
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/zograscope

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/zograscope

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master