Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
徽霖
Vscode
提交
f94f0b71
V
Vscode
项目概览
徽霖
/
Vscode
通知
9
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
Vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f94f0b71
编写于
9月 21, 2016
作者:
A
Alex Dima
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Clean up findPrevBracket, findNextBracket
上级
23d6239f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
77 addition
and
48 deletion
+77
-48
src/vs/editor/common/model/textModelWithTokens.ts
src/vs/editor/common/model/textModelWithTokens.ts
+65
-45
src/vs/editor/test/common/model/textModelWithTokens.test.ts
src/vs/editor/test/common/model/textModelWithTokens.test.ts
+12
-3
未找到文件。
src/vs/editor/common/model/textModelWithTokens.ts
浏览文件 @
f94f0b71
...
...
@@ -15,7 +15,7 @@ import {ModelLine} from 'vs/editor/common/model/modelLine';
import
{
TextModel
}
from
'
vs/editor/common/model/textModel
'
;
import
{
WordHelper
}
from
'
vs/editor/common/model/textModelWithTokensHelpers
'
;
import
{
TokenIterator
}
from
'
vs/editor/common/model/tokenIterator
'
;
import
{
ITokenizationSupport
,
ILineContext
,
ILineTokens
,
IMode
,
IState
,
TokenizationRegistry
}
from
'
vs/editor/common/modes
'
;
import
{
ITokenizationSupport
,
ILineContext
,
ILineTokens
,
IMode
,
IState
,
TokenizationRegistry
,
IRichEditBrackets
}
from
'
vs/editor/common/modes
'
;
import
{
NULL_MODE_ID
,
nullTokenize
}
from
'
vs/editor/common/modes/nullMode
'
;
import
{
ignoreBracketsInToken
}
from
'
vs/editor/common/modes/supports
'
;
import
{
BracketsUtils
}
from
'
vs/editor/common/modes/supports/richEditBrackets
'
;
...
...
@@ -728,33 +728,42 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
}
public
findPrevBracket
(
_position
:
editorCommon
.
IPosition
):
editorCommon
.
IFoundBracket
{
let
position
=
this
.
validatePosition
(
_position
);
let
reversedBracketRegex
=
/
[\(\)\[\]\{\}]
/
;
// TODO@Alex: use mode's brackets
const
position
=
this
.
validatePosition
(
_position
);
let
modeId
:
string
=
null
;
let
modeBrackets
:
IRichEditBrackets
;
for
(
let
lineNumber
=
position
.
lineNumber
;
lineNumber
>=
1
;
lineNumber
--
)
{
le
t
lineTokens
=
this
.
_lines
[
lineNumber
-
1
].
getTokens
(
this
.
_tokensInflatorMap
);
le
t
lineText
=
this
.
_lines
[
lineNumber
-
1
].
text
;
cons
t
lineTokens
=
this
.
_lines
[
lineNumber
-
1
].
getTokens
(
this
.
_tokensInflatorMap
);
cons
t
lineText
=
this
.
_lines
[
lineNumber
-
1
].
text
;
let
tokensLength
=
lineTokens
.
getTokenCount
()
-
1
;
let
currentTokenEndOffset
=
lineText
.
length
;
let
currentToken
:
LineToken
;
let
searchStopOffset
:
number
;
if
(
lineNumber
===
position
.
lineNumber
)
{
tokensLength
=
lineTokens
.
findTokenIndexAtOffset
(
position
.
column
-
1
);
currentTokenEndOffset
=
position
.
column
-
1
;
currentToken
=
lineTokens
.
findTokenAtOffset
(
position
.
column
-
1
);
searchStopOffset
=
position
.
column
-
1
;
}
else
{
currentToken
=
lineTokens
.
lastToken
();
if
(
currentToken
)
{
searchStopOffset
=
currentToken
.
endOffset
;
}
}
for
(
let
tokenIndex
=
tokensLength
;
tokenIndex
>=
0
;
tokenIndex
--
)
{
let
currentTokenType
=
lineTokens
.
getTokenType
(
tokenIndex
);
let
currentTokenStartOffset
=
lineTokens
.
getTokenStartOffset
(
tokenIndex
);
if
(
!
ignoreBracketsInToken
(
currentTokenType
))
{
let
r
=
BracketsUtils
.
findPrevBracketInToken
(
reversedBracketRegex
,
lineNumber
,
lineText
,
currentTokenStartOffset
,
currentTokenEndOffset
);
while
(
currentToken
)
{
if
(
modeId
!==
currentToken
.
modeId
)
{
modeId
=
currentToken
.
modeId
;
modeBrackets
=
LanguageConfigurationRegistry
.
getBracketsSupport
(
modeId
);
}
if
(
modeBrackets
&&
!
ignoreBracketsInToken
(
currentToken
.
type
))
{
let
r
=
BracketsUtils
.
findPrevBracketInToken
(
modeBrackets
.
reversedRegex
,
lineNumber
,
lineText
,
currentToken
.
startOffset
,
searchStopOffset
);
if
(
r
)
{
return
this
.
_toFoundBracket
(
r
);
return
this
.
_toFoundBracket
(
modeBrackets
,
r
);
}
}
currentTokenEndOffset
=
currentTokenStartOffset
;
currentToken
=
currentToken
.
prev
();
if
(
currentToken
)
{
searchStopOffset
=
currentToken
.
endOffset
;
}
}
}
...
...
@@ -762,55 +771,66 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
}
public
findNextBracket
(
_position
:
editorCommon
.
IPosition
):
editorCommon
.
IFoundBracket
{
let
position
=
this
.
validatePosition
(
_position
);
let
bracketRegex
=
/
[\(\)\[\]\{\}]
/
;
// TODO@Alex: use mode's brackets
const
position
=
this
.
validatePosition
(
_position
);
let
modeId
:
string
=
null
;
let
modeBrackets
:
IRichEditBrackets
;
for
(
let
lineNumber
=
position
.
lineNumber
,
lineCount
=
this
.
getLineCount
();
lineNumber
<=
lineCount
;
lineNumber
++
)
{
le
t
lineTokens
=
this
.
_lines
[
lineNumber
-
1
].
getTokens
(
this
.
_tokensInflatorMap
);
le
t
lineText
=
this
.
_lines
[
lineNumber
-
1
].
text
;
cons
t
lineTokens
=
this
.
_lines
[
lineNumber
-
1
].
getTokens
(
this
.
_tokensInflatorMap
);
cons
t
lineText
=
this
.
_lines
[
lineNumber
-
1
].
text
;
let
startTokenIndex
=
0
;
let
currentTokenStartOffset
=
lineTokens
.
getTokenStartOffset
(
startTokenIndex
)
;
let
currentToken
:
LineToken
;
let
searchStartOffset
:
number
;
if
(
lineNumber
===
position
.
lineNumber
)
{
startTokenIndex
=
lineTokens
.
findTokenIndexAtOffset
(
position
.
column
-
1
);
currentTokenStartOffset
=
Math
.
max
(
currentTokenStartOffset
,
position
.
column
-
1
);
currentToken
=
lineTokens
.
findTokenAtOffset
(
position
.
column
-
1
);
searchStartOffset
=
position
.
column
-
1
;
}
else
{
currentToken
=
lineTokens
.
firstToken
();
if
(
currentToken
)
{
searchStartOffset
=
currentToken
.
startOffset
;
}
}
for
(
let
tokenIndex
=
startTokenIndex
,
tokensLength
=
lineTokens
.
getTokenCount
();
tokenIndex
<
tokensLength
;
tokenIndex
++
)
{
let
currentTokenType
=
lineTokens
.
getTokenType
(
tokenIndex
);
let
currentTokenEndOffset
=
lineTokens
.
getTokenEndOffset
(
tokenIndex
);
if
(
!
ignoreBracketsInToken
(
currentTokenType
))
{
let
r
=
BracketsUtils
.
findNextBracketInToken
(
bracketRegex
,
lineNumber
,
lineText
,
currentTokenStartOffset
,
currentTokenEndOffset
);
while
(
currentToken
)
{
if
(
modeId
!==
currentToken
.
modeId
)
{
modeId
=
currentToken
.
modeId
;
modeBrackets
=
LanguageConfigurationRegistry
.
getBracketsSupport
(
modeId
);
}
if
(
modeBrackets
&&
!
ignoreBracketsInToken
(
currentToken
.
type
))
{
let
r
=
BracketsUtils
.
findNextBracketInToken
(
modeBrackets
.
forwardRegex
,
lineNumber
,
lineText
,
searchStartOffset
,
currentToken
.
endOffset
);
if
(
r
)
{
return
this
.
_toFoundBracket
(
r
);
return
this
.
_toFoundBracket
(
modeBrackets
,
r
);
}
}
currentTokenStartOffset
=
currentTokenEndOffset
;
currentToken
=
currentToken
.
next
();
if
(
currentToken
)
{
searchStartOffset
=
currentToken
.
startOffset
;
}
}
}
return
null
;
}
private
_toFoundBracket
(
r
:
Range
):
editorCommon
.
IFoundBracket
{
private
_toFoundBracket
(
modeBrackets
:
IRichEditBrackets
,
r
:
Range
):
editorCommon
.
IFoundBracket
{
if
(
!
r
)
{
return
null
;
}
let
text
=
this
.
getValueInRange
(
r
);
text
=
text
.
toLowerCase
();
// TODO@Alex: use mode's brackets
switch
(
text
)
{
case
'
(
'
:
return
{
range
:
r
,
open
:
'
(
'
,
close
:
'
)
'
,
isOpen
:
true
};
case
'
)
'
:
return
{
range
:
r
,
open
:
'
(
'
,
close
:
'
)
'
,
isOpen
:
false
};
case
'
[
'
:
return
{
range
:
r
,
open
:
'
[
'
,
close
:
'
]
'
,
isOpen
:
true
};
case
'
]
'
:
return
{
range
:
r
,
open
:
'
[
'
,
close
:
'
]
'
,
isOpen
:
false
};
case
'
{
'
:
return
{
range
:
r
,
open
:
'
{
'
,
close
:
'
}
'
,
isOpen
:
true
};
case
'
}
'
:
return
{
range
:
r
,
open
:
'
{
'
,
close
:
'
}
'
,
isOpen
:
false
};
let
data
=
modeBrackets
.
textIsBracket
[
text
];
if
(
!
data
)
{
return
null
;
}
return
null
;
return
{
range
:
r
,
open
:
data
.
open
,
close
:
data
.
close
,
isOpen
:
modeBrackets
.
textIsOpenBracket
[
text
]
};
}
}
src/vs/editor/test/common/model/textModelWithTokens.test.ts
浏览文件 @
f94f0b71
...
...
@@ -7,7 +7,7 @@
import
*
as
assert
from
'
assert
'
;
import
{
Model
}
from
'
vs/editor/common/model/model
'
;
import
{
ViewLineToken
}
from
'
vs/editor/common/core/viewLineToken
'
;
import
{
TokenizationRegistry
}
from
'
vs/editor/common/modes
'
;
import
{
TokenizationRegistry
,
CharacterPair
}
from
'
vs/editor/common/modes
'
;
import
{
MockMode
}
from
'
vs/editor/test/common/mocks/mockMode
'
;
import
{
Token
}
from
'
vs/editor/common/core/token
'
;
import
{
Range
}
from
'
vs/editor/common/core/range
'
;
...
...
@@ -19,7 +19,7 @@ import {LanguageConfigurationRegistry} from 'vs/editor/common/modes/languageConf
suite
(
'
TextModelWithTokens
'
,
()
=>
{
function
testBrackets
(
contents
:
string
[],
brackets
:
string
[]
[]):
void
{
function
testBrackets
(
contents
:
string
[],
brackets
:
CharacterPair
[]):
void
{
function
toRelaxedFoundBracket
(
a
:
IFoundBracket
)
{
if
(
!
a
)
{
return
null
;
...
...
@@ -67,7 +67,16 @@ suite('TextModelWithTokens', () => {
}
}
let
model
=
new
TextModelWithTokens
([],
TextModel
.
toRawText
(
contents
.
join
(
'
\n
'
),
TextModel
.
DEFAULT_CREATION_OPTIONS
),
null
);
class
Mode
extends
MockMode
{
constructor
()
{
super
();
LanguageConfigurationRegistry
.
register
(
this
.
getId
(),
{
brackets
:
brackets
});
}
}
let
model
=
new
TextModelWithTokens
([],
TextModel
.
toRawText
(
contents
.
join
(
'
\n
'
),
TextModel
.
DEFAULT_CREATION_OPTIONS
),
new
Mode
().
getId
());
// findPrevBracket
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录