CN115904480B - 代码重构方法、装置、电子设备及存储介质 - Google Patents
代码重构方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN115904480B CN115904480B CN202310024011.2A CN202310024011A CN115904480B CN 115904480 B CN115904480 B CN 115904480B CN 202310024011 A CN202310024011 A CN 202310024011A CN 115904480 B CN115904480 B CN 115904480B
- Authority
- CN
- China
- Prior art keywords
- code
- file
- abstract syntax
- node
- syntax tree
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 118
- 238000004590 computer program Methods 0.000 claims description 11
- 230000008569 process Effects 0.000 abstract description 52
- 238000012545 processing Methods 0.000 abstract description 7
- 238000012986 modification Methods 0.000 description 18
- 230000004048 modification Effects 0.000 description 18
- 238000004458 analytical method Methods 0.000 description 8
- 238000004891 communication Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 4
- 230000014759 maintenance of location Effects 0.000 description 4
- 239000011800 void material Substances 0.000 description 4
- 238000012423 maintenance Methods 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 238000004422 calculation algorithm Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 239000008186 active pharmaceutical agent Substances 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 239000003550 marker Substances 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000012552 review Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Images
Classifications
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及计算机数据处理技术领域,提供一种代码重构方法、装置、电子设备及存储介质,该方法首先从待重构的代码文件集合中选取参考代码文件,计算参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于差异信息,生成描述文件;此后根据描述文件,对代码文件集合中除参考代码文件外的其他代码文件进行重构。该方法可以自动生成参考代码文件与目标代码文件的重构过程对应的描述文件,不需要借助开发人员人工构建的重构语法模型进行重构,解决了重构过程的描述过于抽象,难以使用的问题,大大降低了重构难度,进而提高了重构结果的准确性和重构过程的效率。
Description
技术领域
本发明涉及计算机数据处理技术领域,尤其涉及一种代码重构方法、装置、电子设备及存储介质。
背景技术
在项目持续开发维护的背景下,代码重构技术至关重要。代码重构是指在不改***件***外部行为的前提下,改善它的内部结构。代码重构在修改代码的同时修改所有引用该代码的位置。
现有技术中,大规模的代码重构方法通常是根据程序代码生成语法树,按照重构语法模型修改语法树,然后根据修改后的语法树生成程序代码的文本内容,最后重新写入程序代码文件。
上述方法虽然可以从技术层面解决重构问题,并用自动化的程序替代手工修改,在一定程度上提高了重构过程的效率。但是重构过程中所需要的重构语法模型难以构造,不可避免地增加了重构难度,而且也会对重构结果的准确性和重构过程的效率产生影响。
发明内容
本发明提供一种代码重构方法、装置、电子设备及存储介质,用以解决现有技术中存在的缺陷。
本发明提供一种代码重构方法,包括:
从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;
基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;
其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行重构得到。
根据本发明提供的一种代码重构方法,所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中均包含有节点文本表示;
相应地,所述基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构,包括:
基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示;
基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构。
根据本发明提供的一种代码重构方法,所述基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构,包括:
对于所述其他代码文件中的任一代码文件,基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树;
基于所述差异节点文本表示,对所述第三抽象语法树的节点内容中的节点文本表示进行更新,得到更新后的目标节点文本表示;
基于所述第四抽象语法树以及所述目标节点文本表示,得到所述任一代码文件对应的重构结果。
根据本发明提供的一种代码重构方法,所述基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树,包括:
修改所述描述文件中所述参考代码文件对应的固定值信息,得到重构参考文件;
基于所述重构参考文件,对所述第三抽象语法树进行修改,得到所述第四抽象语法树。
根据本发明提供的一种代码重构方法,所述基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示,包括:
基于所述编程语言,确定所述差异信息对应的语法模型;
基于所述语法模型,确定所述差异节点文本表示;
或者,
基于所述编程语言,确定所述第二抽象语法树的节点内容中包含的节点文本表示;
基于所述第一抽象语法树的节点内容中包含的节点文本表示,以及所述第二抽象语法树的节点内容中包含的节点文本表示,确定所述差异节点文本表示。
根据本发明提供的一种代码重构方法,所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中包含的节点文本表示包括标记序列文本表示。
根据本发明提供的一种代码重构方法,所述基于所述差异信息,生成描述文件,包括:
确定描述语言格式;
基于所述描述语言格式,对所述差异信息进行描述,生成所述描述文件。
本发明还提供一种代码重构装置,包括:
计算模块,用于从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;
重构模块,用于基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;
其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行修改得到。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述的代码重构方法。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述的代码重构方法。
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述的代码重构方法。
本发明提供的代码重构方法、装置、电子设备及存储介质,该方法首先从待重构的代码文件集合中选取参考代码文件,计算参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于差异信息,生成描述文件;此后根据描述文件,对代码文件集合中除参考代码文件外的其他代码文件进行重构。该方法可以自动生成参考代码文件与目标代码文件的重构过程对应的描述文件,不需要借助开发人员人工构建的重构语法模型进行重构,解决了重构过程的描述过于抽象,难以使用的问题,大大降低了重构难度,进而提高了重构结果的准确性和重构过程的效率。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单的介绍。显而易见,下面描述中的附图,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是现有技术中的代码重构方法的流程示意图;
图2是本发明提供的代码重构方法的流程示意图之一;
图3是本发明提供的代码重构方法的流程示意图之二;
图4是本发明提供的代码重构方法中节点P对应的节点文本表示示意图;
图5是本发明提供的代码重构方法中重放过程的流程示意图;
图6是本发明提供的代码重构装置的结构示意图;
图7是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,现有技术中的代码重构方法通常包括:首先对程序代码文件进行词法分析,得到标记(token)序列,然后对标记序列进行语法分析,得到抽象语法树,此后构建重构语法模型,通过重构语法模型自动化重构出修改后的抽象语法树,最后通过抽象语法树生成源代码文件,得到重构后的程序代码。该方法虽然可以从技术层面解决重构问题,并用自动化的程序替代手工修改,在一定程度上可以提高重构过程的效率。但是由于开发人员往往擅长实际修改代码,难以对重构过程进行描述,进而很难构建出重构过程中的重构语法模型,不仅增加了重构难度,而且也会对重构结果的准确性和重构过程的效率产生影响。
基于此,本发明实施例中提供了一种代码重构方法。
图2为本发明实施例中提供的一种代码重构方法的流程示意图,如图2所示,该方法包括:
S1,从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;
S2,基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;
其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行重构得到。
具体地,本发明实施例中提供的代码重构方法,其执行主体为代码重构装置,该装置可以配置于计算机内,该计算机可以为本地计算机或云计算机,本地计算机可以是电脑、平板等,此处不作具体限定。
首先执行步骤S1,此处,待重构的代码文件集合是指由待重构的代码文件构成的集合,代码文件集合中包括多个代码文件。本发明实施例中提供的代码重构方法,可以实现对代码文件集合中的所有代码文件进行批量化的代码修改,进而实现代码重构。
此处,可以从代码文件集合中选取任一个或多个代码文件作为参考代码文件,即参考代码文件可以包括一个或多个。参考代码文件为字符序列。
对于每个参考代码文件,一方面,均可以通过词法分析得到token序列,再对token序列进行语法分析,得到对应的第一抽象语法树。另一方面,可以按代码重构要求,对参考代码文件进行手动修改,得到目标代码文件,目标代码文件也为字符序列,同样先经过词法分析得到token序列,再对token序列进行语法分析,得到对应的第二抽象语法树。此处,代码重构要求是指需要对待重构的代码文件集合中所有代码文件均进行统一修改的要求,例如可以是将所有代码文件中的所有Manager结尾的类名均改为Handler结尾,将存储位置均由data1改为data2等。
可以理解的是,词法分析是指编译过程中将字符序列转换为token序列的过程,可以通过词法分析器实现。token序列是由若干个token构成,每个token是程序代码中具有某些意义的标记,例如标识符、运算符、关键字、数字等。
语法分析是指从token序列中识别出各类短语并构造抽象语法树的过程。抽象语法树是源代码语法结构的一种抽象表示,它以树状的形式表现编程语言的语法结构,抽象语法树上的每个节点都表示源代码中的一种结构。
每个参考代码文件对应的第一抽象语法树与其目标代码文件对应的第二抽象语法树均可以计算出一个差异信息,该差异信息可以通过树结构对比算法实现,此处不作具体限定。该差异信息可以用于表征第一抽象语法树与第二抽象语法树之间的结构差异,例如包含的不同节点。
此后通过差异信息,生成描述文件。即将该差异信息用描述语言描述出来,得到描述文件。该描述文件与参考代码文件一一对应,该描述文件可以用于表示对参考代码文件的重构过程的形式化描述。该描述文件可以是文本形式,可以提交版本管理工具跟踪变化便于查询问题,跟踪修改过程记录,同时也方便复用。
然后执行步骤S2,利用每个参考代码文件对应的描述文件,对代码文件集合中除参考代码文件外的其他代码文件进行重构。此处,可以先利用代码重构要求,将描述文件进行通用化处理,使该描述文件变为适用于对代码文件集合中除参考代码文件外的其他代码文件进行同类型修改的重构参考文件。
通用化处理可以是修改描述文件中参考代码文件对应的固定值信息,该固定值信息是只适用于该参考代码文件的信息。例如,描述文件的文件内容为“modify:AbcManager->AbcHandler”,则其中的“Abc”即为固定值信息,通用化处理的修改方式可以是将固定值信息修改为随机值,可以用“*”表示,即描述文件对应的重构参考文件的文件内容可以表示为“modify:*Manager->*Handler”。
代码文件集合中除参考代码文件外的其他代码文件可以包括一个或多个,每个其他代码文件均可以利用对各参考代码文件对应的描述文件通用化处理得到的重构参考文件进行重构。例如,可以利用各重构参考文件,对每个其他代码文件对应的抽象语法树进行树结构的修改以及节点内容的修改,即修改每个其他代码文件对应的抽象语法树的节点信息以及对应的节点内容,得到每个其他代码文件对应的新的抽象语法树,根据该新的抽象语法树则可以生成重构后的代码文件,即得到每个其他代码文件对应的重构结果。
本发明实施例中,上述步骤S1实现的过程,是利用修改前后的参考代码文件确定描述文本作为参考的过程,可以称之为“录制”过程,上述步骤S2实现的过程,是利用步骤S1得到的描述文本对其他代码文件进行重构的过程,可以称之为录制过程对应的“重放”过程。
本发明实施例中提供的代码重构方法,首先从待重构的代码文件集合中选取参考代码文件,计算参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于差异信息,生成描述文件;此后根据描述文件,对代码文件集合中除参考代码文件外的其他代码文件进行重构。该方法可以自动生成参考代码文件与目标代码文件的重构过程对应的描述文件,不需要借助开发人员人工构建的重构语法模型进行重构,解决了重构过程的描述过于抽象,难以使用的问题,大大降低了重构难度,进而提高了重构结果的准确性和重构过程的效率。
现有的重构过程均以程序的编译过程为基础,在抽象语法树上进行修改,忽略了对于程序编译过程不重要的空格、换行符、分隔符等,此类字符被忽略后,修改前和修改后的程序对于编译程序是等价的,所以对编译过程无影响。但是忽略的字符对于代码阅读和维护人员仍然是非常重要的。例如:
1)空格、换行风格有可能是开发人员所在组织的规范,不能在重构过程中随便修改。
2)如果编写特定的换行、空格风格控制文件需要额外花费时间,需要开发人员掌握解析器原理和应用程序界面(Application Program Interface,API)。
3)修改后的代码对比阶段,虽然现存对比工具可以部分忽略风格变化,但是超出一定限度的风格变化仍然需要人工对比,大规模重构之后,对比核对阶段会耗费大量时间。
基于此,在上述实施例的基础上,本发明实施例中提供的代码重构方法,所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中均包含有节点文本表示;
相应地,所述基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构,包括:
基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示;
基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构。
具体地,本发明实施例中,在构建代码文件集合中每个代码文件对应的抽象语法树时,可以在每个抽象语法树的节点内容中添加节点文本表示,使每个代码文件对应的抽象语法树的节点内容中均包含有节点文本表示。节点文本表示是指抽象语法树的每个节点对应的节点内容的文本表示,可以基于词法分析得到的token序列确定,例如可以对token序列中各token进一步分类得到。节点文本表示可以采用代码文件集合对应的编程语言进行描述,该编程语言可以根据实际情况而定,例如可以是Java语言、C语言、C++语言、Python语言等。在节点文本表示中,可以包括代码格式相关的空格和换行符等。
因此,在基于描述文件,对代码文件集合中其他代码文件进行重构时,可以先根据代码文件集合对应的编程语言,确定出差异信息对应的差异节点文本表示,既可以通过该编程语言,对差异信息进行描述得到,也可以通过代码文件集合对应的编程语言确定出第二抽象语法树的节点内容中包含的节点文本表示,进而与第一抽象语法树的节点内容中包含的节点文本表示进行比较确定,此处不作具体限定。
此后,结合描述文件、差异节点文本表示以及其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对其他代码文件进行重构,例如可以先根据描述文件对其他代码文件对应的抽象语法树进行树结构的修改以及节点内容的修改,然后再根据差异节点文本表示,对其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示进行更新,最终结合更新后的节点文本表示以及修改后的抽象语法树,还原出重构后的代码文件。
本发明实施例中,由于引入了节点文本表示,可以在代码重构过程中保留编译无关字符,保持原有代码文件的代码风格,使重构后的代码易于阅读,不会产生代码风格混乱的情况出现,为开发人员和维护人员提供了便利。而且,在代码重构后的代码对比核对阶段,由于风格一致,不需要花费额外时间以人工方式对比代码风格,在大规模的代码重构之后,代码对比核对阶段将节约大量时间。
在上述实施例的基础上,本发明实施例中提供的代码重构方法,所述基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构,包括:
对于所述其他代码文件中的任一代码文件,基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树;
基于所述差异节点文本表示,对所述第三抽象语法树的节点内容中的节点文本表示进行更新,得到更新后的目标节点文本表示;
基于所述第四抽象语法树以及所述目标节点文本表示,得到所述任一代码文件对应的重构结果。
具体地,本发明实施例中,在对其他代码文件进行重构时,可以对其他代码文件中的任一代码文件分别执行如下过程:
首先,根据描述文件,对任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树。该第四抽象语法树相比于第三抽象语法树而言,修改了与描述文件对应的节点信息以及节点内容信息。
然后,根据差异节点文本表示,对第三抽象语法树的节点内容中的节点文本表示进行更新,得到更新后的目标节点文本表示。该更新后的目标节点文本表示中记录有对应于同一代码风格的第四抽象语法树的每个节点对应的节点文本表示。
最后,根据第四抽象语法树以及目标节点文本表示,得到任一代码文件对应的重构结果。例如,可以利用目标节点文本表示,将第四抽象语法树转换为代码,得到任一代码文件对应的重构后的代码文件,使重构后的代码文件与重构前的代码文件具有相同的代码风格。
在上述实施例的基础上,本发明实施例中提供的代码重构方法,所述基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树,包括:
修改所述描述文件中所述参考代码文件对应的固定值信息,得到重构参考文件;
基于所述重构参考文件,对所述第三抽象语法树进行修改,得到所述第四抽象语法树。
具体地,本发明实施例中,为保证描述文件可以应用于对任一代码文件对应的第三抽象语法树进行修改,可以将描述文件通用化处理为重构参考文件,通用化处理操作可以是修改描述文件中参考代码文件对应的固定值信息。具体参见上述实施例,此处不再赘述。
此处,还可以先将描述文件进行图形化,然后根据图形化编辑器将图形化的描述文件通用化处理为重构参考文件,如此可以简化通用化处理过程。
此后,根据重构参考文件,对第三抽象语法树进行修改,例如将第四抽象语法树中所有的“*Manager”均修改为“*Handler”,即得到第四抽象语法树。
本发明实施例中,通过修改描述文件中参考代码文件对应的固定值信息实现对描述文件的通用化处理,便于对第三抽象语法树进行修改,可以快速得到第四抽象语法树。
在上述实施例的基础上,本发明实施例中提供的代码重构方法,所述基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示,包括:
基于所述编程语言,确定所述差异信息对应的语法模型;
基于所述语法模型,确定所述差异节点文本表示;
或者,
基于所述编程语言,确定所述第二抽象语法树的节点内容中包含的节点文本表示;
基于所述第一抽象语法树的节点内容中包含的节点文本表示,以及所述第二抽象语法树的节点内容中包含的节点文本表示,确定所述差异节点文本表示。
具体地,本发明实施例中,在确定差异信息对应的差异节点文本表示时,可以通过如下两种方法实现。
一种方法是利用编程语言对差异信息进行处理,即可以先根据编程语言,确定出差异信息对应的语法模型。该编程语言可以根据实际情况而定,例如可以是Java语言、C语言、C++语言、Python语言等。语法模型可以利用已经成熟的模型,例如可以直接从三方库中提取。
利用该语法模型,即可确定出差异节点文本表示。
另一种方法是先根据编程语言,确定出第二抽象语法树的节点内容中包含的节点文本表示,进而通过将第一抽象语法树的节点内容中包含的节点文本表示与第二抽象语法树的节点内容中包含的节点文本表示进行比对,即可确定出差异节点文本表示。
本发明实施例中,给出了差异节点文本表示的两种确定方法,可以保证在代码重构时,对节点文本表示的利用,以使重构后的代码文件与重构前的代码文件的代码风格一致。
在上述实施例的基础上,本发明实施例中提供的代码重构方法,所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中包含的节点文本表示包括标记序列文本表示。
具体地,本发明实施例中,代码文件集合中的每个代码文件均可以通过解析得到对应的抽象语法树,每个抽象语法树的节点内容中均包含有节点文本表示,该节点文本表示均可以是标记序列文本表示,即token序列的文本表示,如此便于记录代码中不被抽象语法树关注的空格、换行符、分隔符等,进而有助于保持代码风格。
在上述实施例的基础上,本发明实施例中提供的代码重构方法,所述基于所述差异信息,生成描述文件,包括:
确定描述语言格式;
基于所述描述语言格式,对所述差异信息进行描述,生成所述描述文件。
具体地,本发明实施例中,在通过差异信息生成描述文件时,可以先确定描述语言格式,该描述语言格式可以是JSON格式、XML格式,也可以是其他自定义语言格式,此处不作具体限定。
此后,可以通过该描述语言格式,对差异信息进行描述,即可得到描述文件。
如图3所示,在上述实施例的基础上,本发明实施例中提供的代码重构方法,可以包括:录制过程31、描述文件编辑过程32以及重放过程33;
在录制过程31中,先从待重构的代码文件集合中选取参考代码文件,通过对参考代码文件进行重构,得到重构后的目标代码文件。然后通过解析器分别得到参考代码文件对应的第一抽象语法树以及目标代码文件对应的第二抽象语法树。进而,根据树结构对比算法,计算出第一抽象语法树与第二抽象语法树之间的差异信息,结合自定义语言格式,生成描述文件。
在描述文件编辑过程32中,可以将描述文件进行图形化,然后通过图形化编辑器对图形化的描述文件进行更新,即修改图形化的描述文件中参考代码文件对应的固定值信息,得到重构参考文件。
在重放过程33中,对于其他代码文件中的任一代码文件,读入该任一代码文件,并进行代码遍历,对于该任一代码文件的源代码,结合差异信息对应的语法模型以及重构参考文件,对源代码进行重构,得到重构结果。
例如,对于参考代码文件File-A,对应的目标代码文件为File-B。通过对File-A进行解析可以得到File-A对应的第一抽象语法树Tree-A,通过对File-B进行解析可以得到File-B对应的第二抽象语法树Tree-B。Tree-A中可以包括节点P,代码重构要求可以是将节点P的节点内容中增加一个入参,节点P在File-B对应的第二抽象语法树中的对应节点P’的节点内容可以通过代码表示为:“void foo(int a, int b) {...}”,Tree-A与File-B的差异信息为“, int b”。
根据差异信息得到的描述文件可以表示为:
节点P对应的节点文本表示可以为:
1.child(void)
2.token(space)
3.child(name)
4.token(lparen)
5.child(param#0)
6.token(rparen)
7.token(space)
8.child(body)
对应节点P’的节点文本表示可以为:
1. child(void)
2. token(space)
3. child(name)
4. token(lparen)
5. child(param#0)
6. token(comma)
7. token(space)
8. child(param#1)
9. token(rparen)
10. token(space)
11. child(body)
差异信息对应的差异节点文本表示可以为:
增加: token(comma)
增加: token(space)
增加: child(param#1)
进而,对比节点P对应的节点文本表示与对应节点P’的节点文本表示,可以得到:
1. 保留: child(void)
2. 保留: token(space)
3. 保留: child(name)
4. 保留: token(lparen)
5. 保留: child(param#0)
6. 增加: token(comma)
7. 增加: token(space)
8. 增加: child(param#1)
9. 保留: token(rparen)
10. 保留: token(space)
11. 保留: child(body)
如图5所示,在上述实施例的基础上,本发明实施例中提供的代码重构方法,在重放过程33中,首先对该任一代码文件的源代码进行解析,得到任一代码文件对应的第三抽象语法树,然后读取描述文件,并监听节点更新事件,修改第三抽象语法树,得到第四抽象语法树;通过文本表示模块,结合差异信息对应的语法模型,确定差异信息对应的差异节点文本表示,进而对第三抽象语法树的节点内容中的节点文本表示进行更新,得到更新后的目标节点文本表示。
此后,利用更新后的目标节点文本表示,将第四抽象语法树转换为重构后的代码文件,即得到重构结果。
综上所述,本发明实施例中通过手工修改一个或者一组参考代码文件,实现对修改步骤的录制,录制结果为通过对比第一抽象语法树与第二抽象语法树自动生成的描述文件,便于后续重放过程的修改。本发明实施例中,在构建抽象语法树的过程中,可以记录与编译过程无关的空格、换行符等,方便保留代码格式,重构后方便进行代码对比。本发明实施例中,可以解决重构过程难以描述,重构后不能保留原有代码格式的问题。
本发明实施例中提供的代码重构方法,可以通过重构程序自动实现,既可以自动生成重构步骤中的描述文件,还可以同时保留原有程序的代码风格。不仅可以提高生产效率,减少手工构建重构语法模型耗费的时间,降低人工编写重构程序出错的可能。还可以在代码重构过程中保持原有代码风格,方便代码对比,清晰地显示差异,同时便于代码评审。
如图6所示,在上述实施例的基础上,本发明实施例中提供了一种代码重构装置,包括:
计算模块61,用于从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;
重构模块62,用于基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;
其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行修改得到。
在上述实施例的基础上,本发明实施例中提供的代码重构装置,所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中均包含有节点文本表示;
相应地,所述重构模块,用于:
基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示;
基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构。
在上述实施例的基础上,本发明实施例中提供的代码重构装置,所述重构模块,具体用于:
对于所述其他代码文件中的任一代码文件,基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树;
基于所述差异节点文本表示,对所述第三抽象语法树的节点内容中的节点文本表示进行更新,得到更新后的目标节点文本表示;
基于所述第四抽象语法树以及所述目标节点文本表示,得到所述任一代码文件对应的重构结果。
在上述实施例的基础上,本发明实施例中提供的代码重构装置,所述重构模块,具体用于:
修改所述描述文件中所述参考代码文件对应的固定值信息,得到重构参考文件;
基于所述重构参考文件,对所述第三抽象语法树进行修改,得到所述第四抽象语法树。
在上述实施例的基础上,本发明实施例中提供的代码重构装置,所述重构模块,具体用于:
基于所述编程语言,确定所述差异信息对应的语法模型;
基于所述语法模型,确定所述差异节点文本表示;
或者,
基于所述编程语言,确定所述第二抽象语法树的节点内容中包含的节点文本表示;
基于所述第一抽象语法树的节点内容中包含的节点文本表示,以及所述第二抽象语法树的节点内容中包含的节点文本表示,确定所述差异节点文本表示。
在上述实施例的基础上,本发明实施例中提供的代码重构装置,所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中包含的节点文本表示包括标记序列文本表示。
在上述实施例的基础上,本发明实施例中提供的代码重构装置,所述计算模块,用于:
确定描述语言格式;
基于所述描述语言格式,对所述差异信息进行描述,生成所述描述文件。
具体地,本发明实施例中提供的代码重构装置中各模块的作用与上述方法类实施例中各步骤的操作流程是一一对应的,实现的效果也是一致的,具体参见上述实施例,本发明实施例中对此不再赘述。
图7示例了一种电子设备的实体结构示意图,如图7所示,该电子设备可以包括:处理器(Processor)710、通信接口(Communications Interface)720、存储器(Memory)730和通信总线740,其中,处理器710,通信接口720,存储器730通过通信总线740完成相互间的通信。处理器710可以调用存储器730中的逻辑指令,以执行上述各实施例中提供的代码重构方法,该方法包括:从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行重构得到。
此外,上述的存储器730中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各实施例中提供的代码重构方法,该方法包括:从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行重构得到。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各实施例中提供的代码重构方法,该方法包括:从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行重构得到。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (7)
1.一种代码重构方法,其特征在于,包括:
从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;
基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;
其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行重构得到;
所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中均包含有节点文本表示;
相应地,所述基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构,包括:
基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示;
基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构;
所述基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构,包括:
对于所述其他代码文件中的任一代码文件,基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树;
基于所述差异节点文本表示,对所述第三抽象语法树的节点内容中的节点文本表示进行更新,得到更新后的目标节点文本表示;
基于所述第四抽象语法树以及所述目标节点文本表示,得到所述任一代码文件对应的重构结果;
所述基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树,包括:
修改所述描述文件中所述参考代码文件对应的固定值信息,得到重构参考文件;
基于所述重构参考文件,对所述第三抽象语法树进行修改,得到所述第四抽象语法树。
2.根据权利要求1所述的代码重构方法,其特征在于,所述基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示,包括:
基于所述编程语言,确定所述差异信息对应的语法模型;
基于所述语法模型,确定所述差异节点文本表示;
或者,
基于所述编程语言,确定所述第二抽象语法树的节点内容中包含的节点文本表示;
基于所述第一抽象语法树的节点内容中包含的节点文本表示,以及所述第二抽象语法树的节点内容中包含的节点文本表示,确定所述差异节点文本表示。
3.根据权利要求1所述的代码重构方法,其特征在于,所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中包含的节点文本表示包括标记序列文本表示。
4.根据权利要求1所述的代码重构方法,其特征在于,所述基于所述差异信息,生成描述文件,包括:
确定描述语言格式;
基于所述描述语言格式,对所述差异信息进行描述,生成所述描述文件。
5.一种代码重构装置,其特征在于,包括:
计算模块,用于从待重构的代码文件集合中选取参考代码文件,计算所述参考代码文件对应的第一抽象语法树与目标代码文件对应的第二抽象语法树之间的差异信息,并基于所述差异信息,生成描述文件;
重构模块,用于基于所述描述文件,对所述代码文件集合中除所述参考代码文件外的其他代码文件进行重构;
其中,所述目标代码文件基于代码重构要求对所述参考代码文件进行修改得到;
所述代码文件集合中每个代码文件对应的抽象语法树的节点内容中均包含有节点文本表示;
相应地,所述重构模块,用于:
基于所述代码文件集合对应的编程语言,确定所述差异信息对应的差异节点文本表示;
基于所述描述文件、所述差异节点文本表示以及所述其他代码文件对应的抽象语法树的节点内容中包含的节点文本表示,对所述其他代码文件进行重构;
所述重构模块,具体用于:
对于所述其他代码文件中的任一代码文件,基于所述描述文件,对所述任一代码文件对应的第三抽象语法树进行修改,得到修改后的第四抽象语法树;
基于所述差异节点文本表示,对所述第三抽象语法树的节点内容中的节点文本表示进行更新,得到更新后的目标节点文本表示;
基于所述第四抽象语法树以及所述目标节点文本表示,得到所述任一代码文件对应的重构结果;
所述重构模块,具体用于:
修改所述描述文件中所述参考代码文件对应的固定值信息,得到重构参考文件;
基于所述重构参考文件,对所述第三抽象语法树进行修改,得到所述第四抽象语法树。
6.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-4中任一项所述的代码重构方法。
7.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-4中任一项所述的代码重构方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310024011.2A CN115904480B (zh) | 2023-01-09 | 2023-01-09 | 代码重构方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310024011.2A CN115904480B (zh) | 2023-01-09 | 2023-01-09 | 代码重构方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115904480A CN115904480A (zh) | 2023-04-04 |
CN115904480B true CN115904480B (zh) | 2023-07-14 |
Family
ID=86491928
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310024011.2A Active CN115904480B (zh) | 2023-01-09 | 2023-01-09 | 代码重构方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115904480B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116302078B (zh) * | 2023-05-19 | 2023-08-01 | 深圳前海环融联易信息科技服务有限公司 | 代码文件合并方法及装置、存储介质、计算机设备 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112799677A (zh) * | 2021-02-05 | 2021-05-14 | 北京字节跳动网络技术有限公司 | 一种编译期的hook方法、装置、设备及存储介质 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110609693B (zh) * | 2019-08-15 | 2023-05-26 | 深圳赛安特技术服务有限公司 | 基于数据标准化的代码更新方法、装置及终端设备 |
CN113377431A (zh) * | 2020-02-25 | 2021-09-10 | 华为技术有限公司 | 一种代码处理方法、装置、设备及介质 |
US11481201B2 (en) * | 2020-03-05 | 2022-10-25 | Intuit Inc. | Integrated development environment for developing and compiling query language schemas for application program interfaces |
CN111752571A (zh) * | 2020-06-29 | 2020-10-09 | 广州华多网络科技有限公司 | 程序升级方法、装置、设备及存储介质 |
CN112181428B (zh) * | 2020-09-28 | 2021-10-22 | 北京航空航天大学 | 一种基于抽象语法树的开源软件缺陷数据分类方法及*** |
CN114035805B (zh) * | 2021-11-16 | 2024-07-26 | 北京字节跳动网络技术有限公司 | 用于预编译器的代码转换方法、装置、介质及设备 |
CN113900962B (zh) * | 2021-12-10 | 2022-03-18 | 广州易方信息科技股份有限公司 | 代码差异检测方法及装置 |
-
2023
- 2023-01-09 CN CN202310024011.2A patent/CN115904480B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112799677A (zh) * | 2021-02-05 | 2021-05-14 | 北京字节跳动网络技术有限公司 | 一种编译期的hook方法、装置、设备及存储介质 |
Non-Patent Citations (2)
Title |
---|
AST-Transformation:Encodering Abstract Syntax Trees Efficiently for Code Summarization;Tang Ze 等;《arXiv:2112.01184v1》;全文 * |
基于源代码扩展信息的细粒度缺陷定位方法;李晓卓 等;《软件学报》;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN115904480A (zh) | 2023-04-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20210174006A1 (en) | System and method for facilitating complex document drafting and management | |
CN108469952B (zh) | 一种管理游戏配置的代码生成方法及配套工具 | |
US9146712B2 (en) | Extensible code auto-fix framework based on XML query languages | |
CN107273117B (zh) | 一种编程友好型的敏捷代码自动生成*** | |
CN112199086B (zh) | 自动编程控制***、方法、装置、电子设备及存储介质 | |
US20140282444A1 (en) | Programming language transformations with abstract syntax tree extensions | |
Barbosa et al. | Scalable fine-grained proofs for formula processing | |
CN109032577B (zh) | 一种数据仿真方法 | |
CN113238932B (zh) | 测试用例自动生成方法 | |
CN111309313A (zh) | 一种快速生成html以及存储表单数据的方法 | |
CN112286814A (zh) | 一种测试用例脚本的自动化生成***及方法 | |
CN115904480B (zh) | 代码重构方法、装置、电子设备及存储介质 | |
Tankink et al. | Formal mathematics on display: A wiki for Flyspeck | |
CN114138244A (zh) | 模型类文件自动生成方法、装置、存储介质及电子设备 | |
Strüber et al. | Scalability of Model Transformations: Position Paper and Benchmark Set. | |
CN112860264B (zh) | 一种抽象语法树重构方法及装置 | |
CN111143228B (zh) | 基于决策表法的测试代码生成方法及装置 | |
CN111930387B (zh) | 一种集成包的集成方法及装置、电子设备和存储介质 | |
CN114519071A (zh) | 规则匹配模型的生成方法、匹配方法、***、设备和介质 | |
CN113448852A (zh) | 一种测试案例的获取方法、装置、电子设备及存储介质 | |
CN102393868B (zh) | 一种实现解决具有复杂计算关系的指标计算模型的方法 | |
JP2009080681A (ja) | プログラム構造解析方法及び装置 | |
CN112925564B (zh) | 一种源代码的冗余导入类清理方法及装置 | |
CN117369789B (zh) | 基于可视化配置工具生成代码的方法及可视化显示设备 | |
CN115454414B (zh) | 一种代码处理方法、装置及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |