Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
b1b96196
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b1b96196
编写于
5月 23, 2017
作者:
P
Phil Price
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Cleanup and comment conflict parsing code
上级
a7410845
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
40 deletion
+49
-40
extensions/merge-conflict/src/mergeConflictParser.ts
extensions/merge-conflict/src/mergeConflictParser.ts
+49
-40
未找到文件。
extensions/merge-conflict/src/mergeConflictParser.ts
浏览文件 @
b1b96196
...
...
@@ -6,14 +6,14 @@ import * as vscode from 'vscode';
import
*
as
interfaces
from
'
./interfaces
'
;
import
{
DocumentMergeConflict
}
from
'
./documentMergeConflict
'
;
const
startMarker
=
'
<<<<<<<
'
;
const
start
Header
Marker
=
'
<<<<<<<
'
;
const
splitterMarker
=
'
=======
'
;
const
endMarker
=
'
>>>>>>>
'
;
const
end
Footer
Marker
=
'
>>>>>>>
'
;
interface
I
PartialMergeConflictDescriptor
{
curren
tHeader
:
vscode
.
TextLine
;
interface
I
ScanMergedConflict
{
star
tHeader
:
vscode
.
TextLine
;
splitter
?:
vscode
.
TextLine
;
incoming
Footer
?:
vscode
.
TextLine
;
end
Footer
?:
vscode
.
TextLine
;
}
export
class
MergeConflictParser
{
...
...
@@ -22,44 +22,53 @@ export class MergeConflictParser {
// Scan each line in the document, we already know there is atleast a <<<<<<< and
// >>>>>> marker within the document, we need to group these into conflict ranges.
// We initially build a scan match, that references the lines of the header, splitter
// and footer. This is then converted into a full descriptor containing all required
// ranges.
let
currentConflict
:
IPartialMergeConflictDescriptor
|
null
=
null
;
let
currentConflict
:
IScanMergedConflict
|
null
=
null
;
const
conflictDescriptors
:
interfaces
.
IDocumentMergeConflictDescriptor
[]
=
[];
for
(
let
i
=
0
;
i
<
document
.
lineCount
;
i
++
)
{
const
line
=
document
.
lineAt
(
i
);
if
(
line
.
text
.
startsWith
(
startMarker
))
{
// Ignore empty lines
if
(
!
line
||
line
.
isEmptyOrWhitespace
)
{
continue
;
}
// Is this a start line? <<<<<<<
if
(
line
.
text
.
startsWith
(
startHeaderMarker
))
{
if
(
currentConflict
!==
null
)
{
// Error, we should not see a startMarker before we've seen an endMarker
currentConflict
=
null
;
// Give up parsing, anything matched up this to this point will be decorated
// anything after will not
break
;
}
currentConflict
=
{
currentHeader
:
line
};
// Create a new conflict starting at this line
currentConflict
=
{
startHeader
:
line
};
}
else
if
(
line
.
text
.
startsWith
(
splitterMarker
))
{
if
(
currentConflict
===
null
)
{
continue
;
// Ignore
}
// Are we within a conflict block and is this a splitter? =======
else
if
(
currentConflict
&&
line
.
text
.
startsWith
(
splitterMarker
))
{
currentConflict
.
splitter
=
line
;
}
else
if
(
line
.
text
.
startsWith
(
endMarker
))
{
if
(
currentConflict
===
null
)
{
continue
;
// Ignore
}
currentConflict
.
incomingFooter
=
line
;
// Are we withon a conflict block and is this a footer? >>>>>>>
else
if
(
currentConflict
&&
line
.
text
.
startsWith
(
endFooterMarker
))
{
currentConflict
.
endFooter
=
line
;
let
completeDescriptor
=
MergeConflictParser
.
completePartialMergeDescriptor
(
document
,
currentConflict
);
// Create a full descriptor from the lines that we matched. This can return
// null if the descriptor could not be completed.
let
completeDescriptor
=
MergeConflictParser
.
scanItemTolMergeConflictDescriptor
(
document
,
currentConflict
);
if
(
completeDescriptor
!==
null
)
{
conflictDescriptors
.
push
(
completeDescriptor
);
}
// Reset the current conflict to be empty, so we can match the next
// starting header marker.
currentConflict
=
null
;
}
}
...
...
@@ -69,9 +78,9 @@ export class MergeConflictParser {
.
map
(
descriptor
=>
new
DocumentMergeConflict
(
document
,
descriptor
));
}
private
static
completePartialMergeDescriptor
(
document
:
vscode
.
TextDocument
,
partial
:
IPartialMergeConflictDescriptor
):
interfaces
.
IDocumentMergeConflictDescriptor
|
null
{
// Validate we have
valid ranges
if
(
!
partial
.
currentHeader
||
!
partial
.
splitter
||
!
partial
.
incoming
Footer
)
{
private
static
scanItemTolMergeConflictDescriptor
(
document
:
vscode
.
TextDocument
,
scanned
:
IScanMergedConflict
):
interfaces
.
IDocumentMergeConflictDescriptor
|
null
{
// Validate we have
all the required lines within the scan item.
if
(
!
scanned
.
startHeader
||
!
scanned
.
splitter
||
!
scanned
.
end
Footer
)
{
return
null
;
}
...
...
@@ -82,30 +91,30 @@ export class MergeConflictParser {
// the decorator will wrap to the next line.
return
{
current
:
{
header
:
partial
.
curren
tHeader
.
range
,
header
:
scanned
.
star
tHeader
.
range
,
decoratorContent
:
new
vscode
.
Range
(
partial
.
curren
tHeader
.
rangeIncludingLineBreak
.
end
,
MergeConflictParser
.
shiftBackOneCharacter
(
document
,
partial
.
splitter
.
range
.
start
)),
scanned
.
star
tHeader
.
rangeIncludingLineBreak
.
end
,
MergeConflictParser
.
shiftBackOneCharacter
(
document
,
scanned
.
splitter
.
range
.
start
)),
// Current content is range between header (shifted for linebreak) and splitter start
content
:
new
vscode
.
Range
(
partial
.
curren
tHeader
.
rangeIncludingLineBreak
.
end
,
partial
.
splitter
.
range
.
start
),
name
:
document
.
getText
(
partial
.
currentHeader
.
range
).
substring
(
start
Marker
.
length
)
scanned
.
star
tHeader
.
rangeIncludingLineBreak
.
end
,
scanned
.
splitter
.
range
.
start
),
name
:
scanned
.
startHeader
.
text
.
substring
(
startHeader
Marker
.
length
)
},
splitter
:
partial
.
splitter
.
range
,
splitter
:
scanned
.
splitter
.
range
,
incoming
:
{
header
:
partial
.
incoming
Footer
.
range
,
header
:
scanned
.
end
Footer
.
range
,
decoratorContent
:
new
vscode
.
Range
(
partial
.
splitter
.
rangeIncludingLineBreak
.
end
,
MergeConflictParser
.
shiftBackOneCharacter
(
document
,
partial
.
incoming
Footer
.
range
.
start
)),
scanned
.
splitter
.
rangeIncludingLineBreak
.
end
,
MergeConflictParser
.
shiftBackOneCharacter
(
document
,
scanned
.
end
Footer
.
range
.
start
)),
// Incoming content is range between splitter (shifted for linebreak) and footer start
content
:
new
vscode
.
Range
(
partial
.
splitter
.
rangeIncludingLineBreak
.
end
,
partial
.
incoming
Footer
.
range
.
start
),
name
:
document
.
getText
(
partial
.
incomingFooter
.
range
).
substring
(
end
Marker
.
length
)
scanned
.
splitter
.
rangeIncludingLineBreak
.
end
,
scanned
.
end
Footer
.
range
.
start
),
name
:
scanned
.
endFooter
.
text
.
substring
(
endFooter
Marker
.
length
)
},
// Entire range is between current header start and incoming header end (including line break)
range
:
new
vscode
.
Range
(
partial
.
currentHeader
.
range
.
start
,
partial
.
incoming
Footer
.
rangeIncludingLineBreak
.
end
)
range
:
new
vscode
.
Range
(
scanned
.
startHeader
.
range
.
start
,
scanned
.
end
Footer
.
rangeIncludingLineBreak
.
end
)
};
}
...
...
@@ -115,7 +124,7 @@ export class MergeConflictParser {
}
let
text
=
document
.
getText
();
return
text
.
includes
(
start
Marker
)
&&
text
.
includes
(
end
Marker
);
return
text
.
includes
(
start
HeaderMarker
)
&&
text
.
includes
(
endFooter
Marker
);
}
private
static
shiftBackOneCharacter
(
document
:
vscode
.
TextDocument
,
range
:
vscode
.
Position
):
vscode
.
Position
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录