@@ -14,6 +14,12 @@ export interface IncreaseConcatOpts {
1414 hash ?: string ;
1515}
1616
17+ interface LineNumberCheckItem {
18+ delete ?: string ,
19+ insert ?: string ,
20+ normal ?: string ,
21+ }
22+
1723export class IncreaseConcat implements Concat {
1824 // 配置
1925 private opts : IncreaseConcatOpts = { } ;
@@ -101,17 +107,47 @@ export class IncreaseConcat implements Concat {
101107 } ;
102108
103109 // 统计变换了的行号
104- const diffLineArr : Array < number > = [ ] ;
110+ const diffInsertLineArr : Array < number > = [ ] ;
111+ const lineNumberCheckMap : { [ key : number ] : LineNumberCheckItem } = { } ;
112+
105113 diffItem . hunks . forEach ( ( hunk ) => {
106114 hunk . changes . forEach ( ( change ) => {
115+ if ( ! change . lineNumber ) {
116+ return ;
117+ }
118+
119+ // 以行号为key,缓存下该行号 insert 或 delete 时的内容
120+ const lineNumberCheckItem : LineNumberCheckItem = lineNumberCheckMap [ change . lineNumber ] || { } ;
121+ lineNumberCheckItem [ change . type ] = change . content ;
122+ lineNumberCheckMap [ change . lineNumber ] = lineNumberCheckItem ;
123+
107124 // 只需要判断 insert 类型且有行号的的结果即可,
108125 // 毕竟计算增量的目的是为了看存在,所以 delete 类型的不需要计算
109- if ( ( change . type === 'insert' ) && change . lineNumber ) {
110- diffLineArr . push ( change . lineNumber ) ;
126+ if ( ( change . type === 'insert' ) ) {
127+ diffInsertLineArr . push ( change . lineNumber ) ;
111128 }
112129 } ) ;
113130 } ) ;
114131
132+ // 注意一种特殊情况,如果某行既是 insert 且又是 delete,且 content 内容还是一模一样,则忽略该情况
133+ // 公司内的增量覆盖率算法为上述处理策略,因此此处做统一,
134+ // 虽然个人觉得不太合理,感觉只要是 delete 和 insert 应该都算增量变化,但需进一步研究
135+ // 统计变换了的行号
136+ const diffLineArr : Array < number > = [ ] ;
137+ diffInsertLineArr . forEach ( ( lineNumber ) => {
138+ const lineNumberCheckItem : LineNumberCheckItem = lineNumberCheckMap [ lineNumber ] ;
139+
140+ if ( ! lineNumberCheckItem ) {
141+ return ;
142+ }
143+
144+ if ( lineNumberCheckItem . insert && lineNumberCheckItem . delete && ( lineNumberCheckItem . insert === lineNumberCheckItem . delete ) ) {
145+ return ;
146+ }
147+
148+ diffLineArr . push ( lineNumber ) ;
149+ } ) ;
150+
115151 // 统计每行对应的hit数
116152 const lcovLineHit : Record < string , number > = { } ;
117153
0 commit comments