CN109857390B - 一种Git仓库文件注解系统的注解传递方法 - Google Patents

一种Git仓库文件注解系统的注解传递方法 Download PDF

Info

Publication number
CN109857390B
CN109857390B CN201910039534.8A CN201910039534A CN109857390B CN 109857390 B CN109857390 B CN 109857390B CN 201910039534 A CN201910039534 A CN 201910039534A CN 109857390 B CN109857390 B CN 109857390B
Authority
CN
China
Prior art keywords
annotation
variable
statement
annotations
database
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910039534.8A
Other languages
English (en)
Other versions
CN109857390A (zh
Inventor
张卫丰
袁聚懋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University of Posts and Telecommunications
Original Assignee
Nanjing University of Posts and Telecommunications
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University of Posts and Telecommunications filed Critical Nanjing University of Posts and Telecommunications
Priority to CN201910039534.8A priority Critical patent/CN109857390B/zh
Publication of CN109857390A publication Critical patent/CN109857390A/zh
Application granted granted Critical
Publication of CN109857390B publication Critical patent/CN109857390B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明公开一种Git仓库文件注解系统的注解传递方法,首先对需要进行传递的项目进行静态分析,将需要分析的代码全部加载到缓存转换为中间表示;然后连接数据库将该项目的注解全部加载进来;接下来将注解和变量或者函数进行绑定,主要是通过对比注解和代码的位置来确立对应关系;最后通过数据流将已有的注解传递给相关的变量或函数,然后将传递来的注解更新到数据库中,通过Git仓库文件注解系统可以查看到传递后的注解;该方法主要是通过数据流分析将已有的注解传递到相关的地方,提高代码中注解的覆盖率,减少开发人员的重复工作。

Description

一种Git仓库文件注解系统的注解传递方法
技术领域
本发明属于互联网和软件工程领域,具体涉及一种Git仓库文件注解系统的注解传递方法。
背景技术
在软件开发和维护过程中,工作人员往往花费大约一半的时间来理解代码。大多数开发人员都认为阅读他人的代码并不容易。代码注释是软件开发和维护的重要组成部分,为了能够让读者(代码完成后若干长时间后的开发者本人、新接手代码的同行、协同工作的伙伴、调用代码的人)清晰地理解代码的意图,在代码中会人工加入一些不执行的说明语句。通常注释比源代码更直接、更具描述性和可理解性。优质的代码注释不仅能覆盖软件系统中的核心业务逻辑,还能避免产生代码冗余、破坏代码的整体结构,从而有效保障软件的可理解能力和可维护性。
但在软件的开发、维护过程中,注释并没有得到太多的关注。具体表现在:开源项目中通常注释比较匮乏;注释没有随着代码的演化而不断更新;注释与代码可能存在不一致;不规范注释和冗余注释;等等。这些现状导致了源代码可读性和程序可维护性的下降.究其原因,一方面是由于对注释的重视程度不够,另一方面也是由于在代码和注释之间频繁切换,开发者的确需要花费更多的时间和精力。
虽然代码中已经有了功能注释和逻辑注释,但是在团队协作开发过程中,负责人在审核提交代码的时候,可能需要在不改变源代码的情况下对部分代码添加一些注解,同时,开发者也可以对代码添加一些注解,这些注解可以包括大量文字的知识点解析、伪算法讲解和图片,还可以跨越多个文件的多处代码进行整合注解等。目前,比较流行的GitHub或者GitLab代码托管平台本身没有提供注解传递的功能,无法满足我们的需求。
发明内容
本发明的目的是针对现有技术存在的问题,提供一种Git仓库文件注解系统的注解传递方法,通过数据流分析将已有的注解传递到相关的地方,提高代码中注解的覆盖率,减少开发人员的重复工作。
为实现上述目的,本发明采用的技术方案是:
一种Git仓库文件注解系统的注解传递方法,包括以下步骤:
S1,将项目代码转化为中间表示;
由于无法对项目的源码直接进行分析或运行,故需要先构建语法树,解析代码并构建所有源码之间的关系;因此,先通过静态分析框架将项目代码转化为框架形式的中间表示,再构建完整的函数调用关系图,最终将每个变量和函数都转化为框架形式的中间表示,并按照程序的逻辑进行组织;
S2,加载所述项目代码的所有注解,在数据库中将所述项目代码的所有注解加载到程序的内部缓存中;
S3,将所述注解与中间表示进行绑定,通过对比所述注解的位置信息和中间表示的位置信息,将位置信息相同的变量和注解进行绑定;
S4,通过数据流传递注解,通过数据流将已进行绑定的注解传递给其他的变量或函数;
S5,更新传递后的注解到数据库,将注解传递到其它的变量或函数进行绑定后,遍历项目的所有代码,将传递的注解加入一个Set集合中,再将Set集合中的所有注解插入到数据库中。
具体地,步骤S1中,在构建完整的函数调用关系图之后,还需要设定一个虚拟的函数入口,用于动态地调用所有的分析方法;所述分析方法包括将中间表示与注解进行绑定的方法和通过数据流传递注解的方法。
所述中间表示是分析项目时,用于表示项目中代码的一种数据结构,这种中间表示是静态分析框架所提供的,方便获取到代码中的各种信息,比如函数之间的调用关系或者是变量的类型等。
具体地,步骤S2中,加载所述项目代码的所有注解,具体方法为:以源码文件的名称为查询条件,使用SQL语句在数据库中查询出所有符合条件的注解,再将所有符合条件的注解缓存到本地的一个Map集合中,其中主键为位置信息,其值为注解所对应的实体类;由于在数据库中,所述注解的位置信息是以序列化后的对象存储的,故在缓存所述注解的过程中,需要对所述注解的位置信息采用反序列化操作才能正确地将所述注解信息转化为缓存对象。
具体地,步骤S3中,将所述注解与中间表示进行绑定,具体方法为:首先,取变量的位置信息作为Key;然后,在程序的内部缓存中查询是否存在于该Key的位置信息对应的注解,若存在注解,则将该注解与所述变量进行绑定;若不存在注解,则说明所述变量不存在注解;最后,遍历项目的所有代码,将所有的注解和对应的变量进行绑定;绑定关系是通过静态分析框架来实现的,可以将注解作为中间表示的一个属性添加进去。
具体地,步骤S4中,通过数据流传递注解,具体方法为:在传递注解的过程中,通过数据流对程序语句进行着条分析,若当前语句中存在之前绑定了注解的变量,则将之前变量的注解与当前语句中对应的变量进行绑定;若当前语句的变量已经绑定了注解,则将该变量及其注解更新到当前语句的输出集合中,并将当前语句的输出集合作为下一条语句的输入集合对下一条语句进行分析。
进一步地,在分析程序语句时,每条所述语句均具备输入集合和输出集合,当前语句的输入集合即为上一条语句的输出集合,当前语句的输出集合即为下一条语句的输入集合;所述输入集合内包含有当前语句及当前语句之后所有语句存在的变量;在将当前语句的变量及其注解更新到当前语句的输出集合的过程中,需要用当前语句的变量将当前语句输入集合中与该变量的注解重复的变量替换掉。
具体地,步骤S5中,在将传递后的注解更新到数据库时,首先要传入原始注解到数据库对注解的版本号进行定位;再将所述Set集合中所有传递过来的注解都依照所述版本号插入数据库。
与现有技术相比,本发明的有益效果是:本发明的注解传递方法只需要对项目中的少量代码进行注解,然后通过数据流分析即可将注解传递到项目的其他程序语句中,从而提高代码注解的覆盖率,同时减少开发人员的工作量,从而节约软件开发和维护的成本。
附图说明
图1为本发明一种Git仓库文件注解系统的注解传递方法的流程结构示意图;
图2为实施例将注解与中间表示进行绑定的流程结构示意图;
图3为本实施例中数据流传递方法的流程结构示意图。
具体实施方式
下面将结合本发明中的附图,对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动条件下所获得的所有其它实施例,都属于本发明保护的范围。
如图1所示,本实施例提供了一种Git仓库文件注解系统的注解传递方法,包括以下步骤:
S1,将项目代码转化为中间表示;
由于无法对项目的源码直接进行分析或运行,故需要先构建语法树,解析代码并构建所有源码之间的关系;因此,先通过静态分析框架将项目代码转化为框架形式的中间表示,再构建完整的函数调用关系图,最终将每个变量和函数都转化为框架形式的中间表示,并按照程序的逻辑进行组织;
S2,加载所述项目代码的所有注解,在数据库中将所述项目代码的所有注解加载到程序的内部缓存中;
S3,将所述注解与中间表示进行绑定,通过对比所述注解的位置信息和中间表示的位置信息,将位置信息相同的变量和注解进行绑定;
S4,通过数据流传递注解,通过数据流将已进行绑定的注解传递给其他的变量或函数;
S5,更新传递后的注解到数据库,将注解传递到其它的变量或函数进行绑定后,遍历项目的所有代码,将传递的注解加入一个Set集合中,再将Set集合中的所有注解插入到数据库中。
具体地,步骤S1中,在构建完整的函数调用关系图之后,还需要设定一个虚拟的函数入口,用于动态地调用所有的分析方法。
具体地,步骤S2中,加载所述项目代码的所有注解,具体方法为:以源码文件的名称为查询条件,使用SQL语句在数据库中查询出所有符合条件的注解,再将所有符合条件的注解缓存到本地的一个Map集合中,其中主键为位置信息,其值为注解所对应的实体类;由于在数据库中,所述注解的位置信息是以序列化后的对象存储的,故在缓存所述注解的过程中,需要对所述注解的位置信息采用反序列化操作才能正确地将所述注解信息转化为缓存对象;在加载数据库中所有的相关注解之前,已经通过步骤S1将项目以中间表示的形式加载进了内存中,因此可以获取所有需要分析的项目的路径名,根据路径名可以连接数据库后将符合要求的数据全部查询出来,并放入缓存之中。加载所述项目代码的所有注解主要包括四个步骤:获取数据库连接、按照分析项目路径查询相关注解、获取缓存表以及将注解插入缓存表。
具体地,如图2所示,步骤S3中,将所述注解与中间表示进行绑定,以变量为例,具体方法为:首先,取变量的位置信息作为Key;然后,在程序的内部缓存中查询是否存在于该Key的位置信息对应的注解,若存在注解,则将该注解与所述变量进行绑定;若不存在注解,则说明所述变量不存在注解;最后,遍历项目的所有代码,将所有的注解和对应的变量进行绑定;绑定关系是通过静态分析框架来实现的,可以将注解作为中间表示的一个属性添加进去。
具体地,通过步骤S3的绑定之后,就要使用静态程序框架来进行数据流分析了,主要分为三个部分,获取输入集合,对当前语句进行传递,以及生成输出集合,其中输入集合是由上一个语句传递来的。所以主要需要处理的就是当前语句注解的传递以及输出集合的生成。
具体地,如图3所示,所述数据流传递方法的步骤如下:
在传递注解的过程中,通过数据流对程序语句进行着条分析,若当前语句中存在之前绑定了注解的变量,则将之前变量的注解与当前语句中对应的变量进行绑定;若当前语句的变量已经绑定了注解,则将该变量及其注解更新到当前语句的输出集合中,并将当前语句的输出集合作为下一条语句的输入集合对下一条语句进行分析。
进一步地,在分析程序语句时,每条所述语句均具备输入集合和输出集合,当前语句的输入集合即为上一条语句的输出集合,当前语句的输出集合即为下一条语句的输入集合;所述输入集合内包含有当前语句及当前语句之后所有语句存在的变量;在将当前语句的变量及其注解更新到当前语句的输出集合的过程中,需要用当前语句的变量将当前语句输入集合中与该变量的注解重复的变量替换掉。
具体地,步骤S5中,在将传递后的注解更新到数据库时,首先要传入原始注解到数据库对注解的版本号进行定位;再将所述Set集合中所有传递过来的注解都依照所述版本号插入数据库。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

Claims (5)

1.一种Git仓库文件注解系统的注解传递方法,其特征在于,包括以下步骤:
S1,将项目代码转化为中间表示,通过静态分析框架将项目代码转化为框架形式的中间表示,再构建完整的函数调用关系图,最终将每个变量和函数都转化为框架形式的中间表示,并按照程序的逻辑对中间表示进行组织;
S2,加载所述项目代码的所有注解,在数据库中将所述项目代码的所有注解加载到程序的内部缓存中;
S3,将所述注解与中间表示进行绑定,通过对比所述注解的位置信息和中间表示的位置信息,将位置信息相同的变量和注解进行绑定;
S4,通过数据流传递注解,通过数据流将已进行绑定的注解传递给其他的变量或函数;
S5,更新传递后的注解到数据库,将注解传递到其它的变量或函数进行绑定后,遍历项目的所有代码,将传递的注解加入一个Set集合中,再将Set集合中的所有注解插入到数据库中;
步骤S3中,将所述注解与中间表示进行绑定的方法为:首先,取变量的位置信息作为Key;然后,在程序的内部缓存中查询是否存在于该Key的位置信息对应的注解,若存在注解,则将该注解与所述变量进行绑定;若不存在注解,则说明所述变量不存在注解;最后,遍历项目的所有代码,将所有的注解和对应的变量进行绑定;
步骤S4中,通过数据流传递注解的方法为:在传递注解的过程中,通过数据流对程序语句进行逐 条分析,若当前语句中存在之前绑定了注解的变量,则将之前变量的注解与当前语句中对应的变量进行绑定;若当前语句的变量已经绑定了注解,则将该变量及其注解更新到当前语句的输出集合中,并将当前语句的输出集合作为下一条语句的输入集合对下一条语句进行分析。
2.根据权利要求1所述的一种Git仓库文件注解系统的注解传递方法,其特征在于,步骤S1中,在构建完整的函数调用关系图之后,还需要设定一个虚拟的函数入口,用于动态地调用所有的分析方法。
3.根据权利要求1所述的一种Git仓库文件注解系统的注解传递方法,其特征在于,步骤S2中,加载所述项目代码的所有注解,具体方法为:以源码文件的名称为查询条件,使用SQL语句在数据库中查询出所有符合条件的注解,再将所有符合条件的注解缓存到本地的一个Map集合中;在缓存所述注解的过程中,需要对所述注解的位置信息采用反序列化操作。
4.根据权利要求1所述的一种Git仓库文件注解系统的注解传递方法,其特征在于,在分析程序语句时,每条所述语句均具备输入集合和输出集合,当前语句的输入集合即为上一条语句的输出集合,当前语句的输出集合即为下一条语句的输入集合;所述输入集合内包含有当前语句及当前语句之后所有语句存在的变量;在将当前语句的变量及其注解更新到当前语句的输出集合的过程中,需要用当前语句的变量将当前语句输入集合中与该变量的注解重复的变量替换掉。
5.根据权利要求1所述的一种Git仓库文件注解系统的注解传递方法,其特征在于,步骤S5中,在将传递后的注解更新到数据库时,首先要传入原始注解到数据库对注解的版本号进行定位;再将所述Set集合中所有传递过来的注解都依照所述版本号插入数据库。
CN201910039534.8A 2019-01-16 2019-01-16 一种Git仓库文件注解系统的注解传递方法 Active CN109857390B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910039534.8A CN109857390B (zh) 2019-01-16 2019-01-16 一种Git仓库文件注解系统的注解传递方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910039534.8A CN109857390B (zh) 2019-01-16 2019-01-16 一种Git仓库文件注解系统的注解传递方法

Publications (2)

Publication Number Publication Date
CN109857390A CN109857390A (zh) 2019-06-07
CN109857390B true CN109857390B (zh) 2022-05-31

Family

ID=66894901

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910039534.8A Active CN109857390B (zh) 2019-01-16 2019-01-16 一种Git仓库文件注解系统的注解传递方法

Country Status (1)

Country Link
CN (1) CN109857390B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108170756A (zh) * 2017-12-22 2018-06-15 南京邮电大学 基于Git仓库的多维度、多视角和可视化注解系统的实现方法
CN108228231A (zh) * 2018-01-08 2018-06-29 南京邮电大学 一种Git仓库文件注解系统的可视化漂移算法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8181165B2 (en) * 2007-10-30 2012-05