Page 29 - 《软件学报》2021年第11期
P. 29
陶传奇 等:编程现场上下文深度感知的代码行推荐 3355
通过将源代码文件解析成抽象语法树(AST),我们可以检测一个 java 方法块是否具有对其他自定义方法的
调用,即方法块功能原子性指标验证.通过不同维度的数据质量评估之后,我们构造了一个大规模的高质量 Java
方法块数据集.整个评估流程如图 2 所示.
Fig.2 Flow chart of data quality evaluation for a method block
图 2 开源源码数据质量评估流程图
2.2 源数据处理模块
训练数据处理模块对收集到的原始训练数据集进行预处理.为了对已经收集到的项目的源代码进行统一
化的处理,本文使用 Eclipse 的 JDT 编译器将源码文件解析为抽象语法树(AST).此外,由于部分 jar 包中没有源
码,本文使用 jd-jui 反编译工具对 jar 包中 class 文件进行反编译来获得源码.对于 Java 中的 8 种基本数据类型,
即 byte、short、int、long、float、double、char 和 boolean,对其变量名和值都进行统一化处理.具体处理规则见
表 2.
Table 2 Uniform processing rules for basic data types in Java
表 2 Java 基本数据类型的统一化处理规则
数据类型 变量名(统一化) 变量值(统一化) 示例(处理前) 示例(处理后)
byte byte_type 0 byte b=‘a’; byte byte_type=0;
short short_type −1 short s=100; short short_type=−1;
int int_type 1 int i=0; int int_type=1;
long long_type 10 long l=1000; long long_type=10;
float float_type −0.1 float f=1000; float float_type=−0.1;
double double_type 0.1 double d=0.01; double double_type=0.01;
char char_type ‘a’ char c=‘c’; char char_type=‘a’;
boolean boolean_type true boolean b=false; boolean boolean_type=true;
对于非基本数据类型,如同一个类的不同对象,用对应类的类型替换所有的对象类型,直接用类名的小写形
式替换不同的对象名.比如 List resultList=new ArrayList(⋅),统一化处理之后为 List list=new ArrayList(⋅).因为 List
为非基本数据类型,所以按照规则用类名 List 的小写形式 list 替换原本的用户自定义对象名 resultList.
忽略那些不会影响语法结构、开发人员可知的符号,这些符号在代码行被推荐后很容易被补全,不会影响
实际的使用,比如代码行结尾的分号和某些大小括号等.该判断是基于部分有丰富 java 经验以及经过实用性验
证得到的.在处理完所有数据之后,构建代码段数据集 D 具有规范的统一格式.图 3 表示处理之后的方法块实例.
根据程序设计的模块化特点,为了得到关系更加紧密的代码上下文,我们从方法层面构建训练数据集.同时,为
了能从功能比较完整的方法块中抽取数据.为了清除无意义的行,忽略只有大括号或者只有注释的行.