Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
徽霖
Vscode
提交
de4dc5c6
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,发现更多精彩内容 >>
提交
de4dc5c6
编写于
7月 13, 2017
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix #29933
上级
49454b1b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
84 addition
and
43 deletion
+84
-43
src/vs/editor/contrib/quickFix/browser/quickFixModel.ts
src/vs/editor/contrib/quickFix/browser/quickFixModel.ts
+29
-39
src/vs/editor/contrib/quickFix/test/browser/quickFixModel.test.ts
...ditor/contrib/quickFix/test/browser/quickFixModel.test.ts
+55
-4
未找到文件。
src/vs/editor/contrib/quickFix/browser/quickFixModel.ts
浏览文件 @
de4dc5c6
...
...
@@ -4,12 +4,11 @@
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
*
as
arrays
from
'
vs/base/common/arrays
'
;
import
Event
,
{
Emitter
,
debounceEvent
}
from
'
vs/base/common/event
'
;
import
{
IDisposable
,
dispose
}
from
'
vs/base/common/lifecycle
'
;
import
URI
from
'
vs/base/common/uri
'
;
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
import
{
IMarker
,
IMarker
Service
}
from
'
vs/platform/markers/common/markers
'
;
import
{
IMarkerService
}
from
'
vs/platform/markers/common/markers
'
;
import
{
Range
}
from
'
vs/editor/common/core/range
'
;
import
{
ICommonCodeEditor
}
from
'
vs/editor/common/editorCommon
'
;
import
{
CodeActionProviderRegistry
,
Command
}
from
'
vs/editor/common/modes
'
;
...
...
@@ -39,10 +38,21 @@ export class QuickFixOracle {
}
trigger
(
type
:
'
manual
'
|
'
auto
'
):
void
{
let
range
=
this
.
_rangeAtPosition
();
// get selection from marker or current word
// unless the selection is non-empty and manually
// requesting code actions
let
selection
=
this
.
_editor
.
getSelection
();
let
range
=
this
.
_getActiveMarkerOrWordRange
();
if
(
type
===
'
manual
'
&&
!
selection
.
isEmpty
())
{
range
=
selection
;
}
// empty selection somewhere in nowhere
if
(
!
range
)
{
range
=
this
.
_editor
.
getSelection
()
;
range
=
selection
;
}
this
.
_signalChange
({
type
,
range
,
...
...
@@ -64,7 +74,7 @@ export class QuickFixOracle {
}
private
_onCursorChange
():
void
{
const
range
=
this
.
_
rangeAtPosition
();
const
range
=
this
.
_
getActiveMarkerOrWordRange
();
if
(
!
Range
.
equalsRange
(
this
.
_currentRange
,
range
))
{
this
.
_currentRange
=
range
;
this
.
_signalChange
({
...
...
@@ -76,48 +86,28 @@ export class QuickFixOracle {
}
}
private
_
rangeAtPosition
():
Range
{
private
_
getActiveMarkerOrWordRange
():
Range
{
// (1) check with non empty selection
const
selection
=
this
.
_editor
.
getSelection
();
if
(
!
selection
.
isEmpty
())
{
return
selection
;
}
const
model
=
this
.
_editor
.
getModel
();
// (2) check with diagnostics markers
const
marker
=
this
.
_markerAtPosition
();
if
(
marker
)
{
return
Range
.
lift
(
marker
);
// (1) return marker that contains a (empty/non-empty) selection
for
(
const
marker
of
this
.
_markerService
.
read
({
resource
:
model
.
uri
}))
{
const
range
=
Range
.
lift
(
marker
);
if
(
range
.
containsRange
(
selection
))
{
return
range
;
}
}
// (3) check with word
return
this
.
_wordAtPosition
();
}
private
_markerAtPosition
():
IMarker
{
const
position
=
this
.
_editor
.
getPosition
();
const
{
uri
}
=
this
.
_editor
.
getModel
();
const
markers
=
this
.
_markerService
.
read
({
resource
:
uri
}).
sort
(
Range
.
compareRangesUsingStarts
);
let
idx
=
arrays
.
findFirst
(
markers
,
marker
=>
marker
.
endLineNumber
>=
position
.
lineNumber
);
while
(
idx
<
markers
.
length
&&
markers
[
idx
].
endLineNumber
>=
position
.
lineNumber
)
{
const
marker
=
markers
[
idx
];
if
(
Range
.
containsPosition
(
marker
,
position
))
{
return
marker
;
// (2) return range of current word
if
(
selection
.
isEmpty
())
{
const
pos
=
selection
.
getStartPosition
();
const
info
=
model
.
getWordAtPosition
(
pos
);
if
(
info
)
{
return
new
Range
(
pos
.
lineNumber
,
info
.
startColumn
,
pos
.
lineNumber
,
info
.
endColumn
);
}
idx
++
;
}
return
undefined
;
}
private
_wordAtPosition
():
Range
{
const
pos
=
this
.
_editor
.
getPosition
();
const
model
=
this
.
_editor
.
getModel
();
const
info
=
model
.
getWordAtPosition
(
pos
);
if
(
info
)
{
return
new
Range
(
pos
.
lineNumber
,
info
.
startColumn
,
pos
.
lineNumber
,
info
.
endColumn
);
}
return
undefined
;
}
}
...
...
src/vs/editor/contrib/quickFix/test/browser/quickFixModel.test.ts
浏览文件 @
de4dc5c6
...
...
@@ -182,11 +182,11 @@ suite('QuickFix', () => {
return
TPromise
.
join
<
any
>
([
TPromise
.
timeout
(
20
)].
concat
(
fixes
)).
then
(
_
=>
{
//
assert
selection
assert
.
deepEqual
(
range
,
{
startLineNumber
:
1
,
startColumn
:
1
,
endLineNumber
:
1
,
endColumn
:
13
}
);
//
'auto' triggered, non-empty
selection
assert
.
equal
(
range
,
undefined
);
range
=
undefined
;
editor
.
setSelection
({
startLineNumber
:
1
,
startColumn
:
2
,
endLineNumber
:
1
,
endColumn
:
2
});
// 'auto' triggered, non-empty selection BUT within a marker
editor
.
setSelection
({
startLineNumber
:
1
,
startColumn
:
2
,
endLineNumber
:
1
,
endColumn
:
4
});
return
TPromise
.
join
([
TPromise
.
timeout
(
20
)].
concat
(
fixes
)).
then
(
_
=>
{
reg
.
dispose
();
...
...
@@ -198,4 +198,55 @@ suite('QuickFix', () => {
});
});
test
(
'
Lightbulb is in the wrong place, #29933
'
,
async
function
()
{
let
reg
=
CodeActionProviderRegistry
.
register
(
languageIdentifier
.
language
,
{
provideCodeActions
(
doc
,
_range
)
{
return
[];
}
});
editor
.
getModel
().
setValue
(
'
// @ts-check
\n
2
\n
con
\n
'
);
markerService
.
changeOne
(
'
fake
'
,
uri
,
[{
startLineNumber
:
3
,
startColumn
:
1
,
endLineNumber
:
3
,
endColumn
:
4
,
message
:
'
error
'
,
severity
:
1
,
code
:
''
,
source
:
''
}]);
// case 1 - drag selection over multiple lines -> no automatic lightbulb
await
new
TPromise
(
resolve
=>
{
let
oracle
=
new
QuickFixOracle
(
editor
,
markerService
,
e
=>
{
assert
.
equal
(
e
.
type
,
'
auto
'
);
assert
.
equal
(
e
.
range
,
undefined
);
oracle
.
dispose
();
resolve
(
null
);
},
5
);
editor
.
setSelection
({
startLineNumber
:
1
,
startColumn
:
1
,
endLineNumber
:
4
,
endColumn
:
1
});
});
// case 2 - selection over multiple lines & manual trigger -> lightbulb
await
new
TPromise
(
resolve
=>
{
editor
.
setSelection
({
startLineNumber
:
1
,
startColumn
:
1
,
endLineNumber
:
4
,
endColumn
:
1
});
let
oracle
=
new
QuickFixOracle
(
editor
,
markerService
,
e
=>
{
assert
.
equal
(
e
.
type
,
'
manual
'
);
assert
.
ok
(
e
.
range
.
equalsRange
({
startLineNumber
:
1
,
startColumn
:
1
,
endLineNumber
:
4
,
endColumn
:
1
}));
oracle
.
dispose
();
resolve
(
null
);
},
5
);
oracle
.
trigger
(
'
manual
'
);
});
reg
.
dispose
();
});
});
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录