首页 > 其他分享 >写个统计代码量的小工具

写个统计代码量的小工具

时间:2024-08-01 22:28:31浏览次数:8  
标签:setText 写个 代码 item QString new line 工具 QStandardItem

源代码:https://gitee.com/qianqiu-10000/statistical.git

1.首先有个方法可以判断一行代码属于注释还是代码

1.1输入一行字符串

1.2去掉前后空字符

1.3如果当前处在多行注释状态,直接跳过一些判断,多行注释+1,然后判断是否结束多行注释

1.4如果没有处在多行注释状态,一点点判断

1.5自己再添加其他判断条件

void myAnalyzer::oneLine(const QString &line)
{

    QString newline = line.simplified();

    if(!m_multiFlag)                                                                   //多行注释中不需要判断
    {
        if(newline.isEmpty()) {
            m_linePointer = &m_emptyLines;
        }
        else if(newline.startsWith('#')) {                                      //该行是预编译宏
            m_linePointer = &m_microLines;
        }
        else if(newline.startsWith("//")) {                                    //该行是注释
            m_linePointer = &m_annoSingleLines;
        }
        else if(newline.startsWith("/*")) {                                    //注释开始
            m_linePointer = &m_annoMultiLines;
            m_multiFlag = true;
        } else {
            m_linePointer = &m_codeLines;
        }
    }

    (*m_linePointer)++;

    if(m_multiFlag && newline.endsWith("*/"))    {
        m_multiFlag = false;
    }

}

2.有一个方法打开文件,逐行读取判断

bool myAnalyzer::procFile(const QString &name)
{
    initialize();
    QFile file(name);
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        while(!file.atEnd()) {
            oneLine(file.readLine());
        }

        file.close();
        return true;
    }

    return false;

}

3.还要有一个类,在当前目录下查找*.h/*.cpp/*.cxx文件,对每一个文件打开分析。然后获取当目录下的文件夹,对每个文件夹路径递归查找。

void myFindFiles::run(const QString &dir)
{
    initialize();
    QStandardItem *root = new QStandardItem;
    root->setText(dir);
    root->setData(dir);
    m_model.appendRow(root);
    recursion(root);

    QList<QStandardItem *>line;
    QStandardItem *item = new QStandardItem;
    item->setText("统计");
    line.append(item);
    item = new QStandardItem;
    item->setText(QString::number(m_codeLines));
    line.append(item);
    item = new QStandardItem;
    item->setText(QString::number(m_emptyLines));
    line.append(item);
    item = new QStandardItem;
    item->setText(QString::number(m_microLines));
    line.append(item);
    item = new QStandardItem;
    item->setText(QString::number(m_annoMultiLines));
    line.append(item);
    item = new QStandardItem;
    item->setText(QString::number(m_annoSingleLines));
    line.append(item);
    m_model.appendRow(line);
}

void myFindFiles::recursion(QStandardItem *node)
{

    QDir workDir(node->data().toString());
    if(workDir.isEmpty()) {
        return;
    }
    if(!workDir.isReadable()) {
        return;
    }
    QStringList fileList = workDir.entryList(
                               QStringList() << "*.cpp" << "*.h" << "*.cxx",
                               QDir::Files);
    myAnalyzer analyzer;
    for(int i = 0; i < fileList.count(); i++)
    {
        QString file = fileList.at(i);

        if(! analyzer.procFile(workDir.path() + "/" + file)) {
            continue;
        }

        int codeLines = analyzer.codeLines();
        int emptyLines = analyzer.emptyLines();
        int microLines = analyzer.microLines();
        int annoMultiLines = analyzer.annoMultiLines();
        int annoSingleLines = analyzer.annoSingleLines();

        m_codeLines += codeLines;
        m_emptyLines += emptyLines;
        m_microLines += microLines;
        m_annoMultiLines += annoMultiLines;
        m_annoSingleLines += annoSingleLines;

        QList<QStandardItem *>line;
        QStandardItem *item = new QStandardItem;
        item->setText(file);
        item->setData(workDir.absolutePath() + "/" + file);
        line.append(item);
        item = new QStandardItem;
        item->setText(QString::number(codeLines));
        line.append(item);
        item = new QStandardItem;
        item->setText(QString::number(emptyLines));
        line.append(item);
        item = new QStandardItem;
        item->setText(QString::number(microLines));
        line.append(item);
        item = new QStandardItem;
        item->setText(QString::number(annoMultiLines));
        line.append(item);
        item = new QStandardItem;
        item->setText(QString::number(annoSingleLines));
        line.append(item);

        node->appendRow(line);
    }



    QStringList dirList = workDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);

    foreach(QString d, dirList) {
        QStandardItem *item = new QStandardItem;
        item->setText(d);
        item->setData(workDir.path() + "/" + d);
        node->appendRow(item);
        recursion(item);
    }
}

4.数据保存在一棵树中(QStandardItemModel),然后用QTreeView显示,效果如下

标签:setText,写个,代码,item,QString,new,line,工具,QStandardItem
From: https://blog.csdn.net/weixin_69505365/article/details/140822180

相关文章

  • 「代码随想录算法训练营」第二十六天 | 贪心算法 part4
    452.用最少数量的箭引爆气球题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/题目难度:中等文章讲解:https://programmercarl.com/0452.用最少数量的箭引爆气球.html视频讲解:https://www.bilibili.com/video/BV1SA41167xe题目状态:有点思路......
  • TpmVscMgr.exe 命令行工具让具有管理凭据的用户能够在计算机上创建和删除 TPM 虚拟智
     tpmvscmgr|MicrosoftLearn tpmvscmgr命令行工具让具有管理凭据的用户能够在计算机上创建和删除TPM虚拟智能卡。 tpmvscmgrTpmVscMgr.exe 命令:    create        [/quiet]        /name<名称>       ......
  • where /? 在 Windows 中,where 命令是用于在命令提示符或 PowerShell 中查找指定命令的
     在Windows中,where命令是用于在命令提示符或PowerShell中查找指定命令的位置的工具。它可以帮助用户确定系统中某个可执行文件的路径。使用方法:基本用法:shellCopyCodewherecommand其中command是你要查找的命令或可执行文件的名称。例如,如果你想查找notepad的......
  • FRISTILEAKS: 1.3打靶渗透【附代码】(权限提升)
    靶机下载地址:FristiLeaks:1.3~VulnHubFristiLeaks:1.3,madebyAr0xA.Download&walkthroughlinksareavailable.https://www.vulnhub.com/entry/fristileaks-13,133/1.主机发现+端口扫描+目录扫描+敏感信息收集1.1.主机发现:nmap-sn192.168.7.0/24|grep-B2'......
  • 排序工具类 - SortUtils
    packagecom.kurumi.util;importorg.springframework.stereotype.Component;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;importjava.util.Map;publicclassSortUtils{/***将list安装sortMap中的传参排......
  • Java/SpringCloud/RabbitMq/无感实现消息携带用户信息 --- 逻辑讲解、代码实现、图形
    一、需求:依据黑马商城hmall为例,用户下单创建订单后,交易服务trade-service向交换机topic发送消息,交换机topic路由到队列,购物车服务cart-service监听此队列,实现自动清空购物车。改造下单功能,将基于OpenFeign的清理购物车同步调用,改为基于RabbitMQ的异步通知:定义t......
  • 「代码随想录算法训练营」第二十五天 | 贪心算法 part3
    134.加油站题目链接:https://leetcode.cn/problems/gas-station/题目难度:中等文章讲解:https://programmercarl.com/0134.加油站.html视频讲解:https://www.bilibili.com/video/BV1jA411r7WX题目状态:没有思路,学习题解思路一:全局最优解首先将所有路径的加油量和耗油量加一起......
  • Jenkins 配置即代码(Configuration as Code)详解
    1、概述在《Centos7下安装配置最新版本Jenkins(2.452.3)》这篇博文中讲解了如何安装Jenkins,虽然在安装Jenkins时安装了一些必备的推荐插件,但在企业环境中使用Jenkins之前,我们仍需完成一系列手动配置工作,如配置SystemConfiguration、Security。SystemConfiguration是确保......
  • 代码随想录Day2
    209.长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组$[nums_l,nums_{l+1},...,nums_{r-1},nums_r]$,并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=......
  • 2008-2022年 上市公司-异常审计费用(初始数据,计算代码,参考文献和最终数据)
    异常审计费用指的是实际审计费用与正常审计费用之间的偏差部分,这种偏差可能由多种不可观测因素引起,包括审计师的额外努力、审计师与被审计单位之间的特殊关系,或是被审计单位在市场中的优势地位等。研究异常审计费用与审计质量的关系,对于理解审计市场运作和提高审计透明度具有重......