Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
18bda862
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,发现更多精彩内容 >>
提交
18bda862
编写于
12月 11, 2015
作者:
M
Martin Aeschlimann
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1191 from Microsoft/aeschli/suggest-move-overwrite-fields
Move overwriteBefore/overwriteAfter to ISuggestion
上级
d08132fc
406b22f7
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
76 addition
and
76 deletion
+76
-76
src/vs/editor/common/modes.ts
src/vs/editor/common/modes.ts
+2
-3
src/vs/editor/common/modes/abstractModeWorker.ts
src/vs/editor/common/modes/abstractModeWorker.ts
+1
-3
src/vs/editor/contrib/suggest/browser/suggestWidget.ts
src/vs/editor/contrib/suggest/browser/suggestWidget.ts
+2
-2
src/vs/editor/contrib/suggest/common/suggest.ts
src/vs/editor/contrib/suggest/common/suggest.ts
+0
-29
src/vs/languages/html/common/htmlWorker.ts
src/vs/languages/html/common/htmlWorker.ts
+6
-9
src/vs/languages/json/common/jsonIntellisense.ts
src/vs/languages/json/common/jsonIntellisense.ts
+10
-4
src/vs/workbench/api/common/extHostApiCommands.ts
src/vs/workbench/api/common/extHostApiCommands.ts
+1
-1
src/vs/workbench/api/common/extHostLanguageFeatures.ts
src/vs/workbench/api/common/extHostLanguageFeatures.ts
+3
-3
src/vs/workbench/api/common/pluginHostTypeConverters.ts
src/vs/workbench/api/common/pluginHostTypeConverters.ts
+10
-3
src/vs/workbench/test/common/api/extHostApiCommands.test.ts
src/vs/workbench/test/common/api/extHostApiCommands.test.ts
+41
-19
未找到文件。
src/vs/editor/common/modes.ts
浏览文件 @
18bda862
...
...
@@ -388,20 +388,19 @@ export interface ISuggestion {
label
:
string
;
codeSnippet
:
string
;
type
:
string
;
textEdit
?:
EditorCommon
.
ISingleEditOperation
;
typeLabel
?:
string
;
documentationLabel
?:
string
;
filterText
?:
string
;
sortText
?:
string
;
noAutoAccept
?:
boolean
;
overwriteBefore
?:
number
;
overwriteAfter
?:
number
;
}
export
interface
ISuggestResult
{
currentWord
:
string
;
suggestions
:
ISuggestion
[];
incomplete
?:
boolean
;
overwriteBefore
?:
number
;
overwriteAfter
?:
number
;
}
export
interface
ISuggestionFilter
{
...
...
src/vs/editor/common/modes/abstractModeWorker.ts
浏览文件 @
18bda862
...
...
@@ -153,9 +153,7 @@ export class AbstractModeWorker {
result
.
push
(
<
Modes
.
ISuggestResult
>
{
currentWord
:
value
.
currentWord
,
suggestions
:
value
.
suggestions
.
filter
((
element
)
=>
!!
accept
(
values
[
i
].
currentWord
,
element
)),
incomplete
:
value
.
incomplete
,
overwriteBefore
:
value
.
overwriteBefore
,
overwriteAfter
:
value
.
overwriteAfter
incomplete
:
value
.
incomplete
});
}
return
result
;
...
...
src/vs/editor/contrib/suggest/browser/suggestWidget.ts
浏览文件 @
18bda862
...
...
@@ -504,8 +504,8 @@ export class SuggestWidget implements EditorBrowser.IContentWidget, IDisposable
this
.
submitTelemetryData
();
const
container
=
item
.
container
;
const
overwriteBefore
=
(
typeof
container
.
overwriteBefore
===
'
undefined
'
)
?
container
.
currentWord
.
length
:
container
.
overwriteBefore
;
const
overwriteAfter
=
(
typeof
container
.
overwriteAfter
===
'
undefined
'
)
?
0
:
Math
.
max
(
0
,
container
.
overwriteAfter
);
const
overwriteBefore
=
(
typeof
item
.
suggestion
.
overwriteBefore
===
'
undefined
'
)
?
container
.
currentWord
.
length
:
item
.
suggestion
.
overwriteBefore
;
const
overwriteAfter
=
(
typeof
item
.
suggestion
.
overwriteAfter
===
'
undefined
'
)
?
0
:
Math
.
max
(
0
,
item
.
suggestion
.
overwriteAfter
);
this
.
model
.
accept
(
item
.
suggestion
,
overwriteBefore
,
overwriteAfter
);
this
.
editor
.
focus
();
...
...
src/vs/editor/contrib/suggest/common/suggest.ts
浏览文件 @
18bda862
...
...
@@ -50,7 +50,6 @@ export function suggest(model: IModel, position: IPosition, triggerCharacter: st
if
(
!
suggestResult
||
!
Array
.
isArray
(
suggestResult
.
suggestions
)
||
suggestResult
.
suggestions
.
length
===
0
)
{
continue
;
}
...
...
@@ -58,36 +57,8 @@ export function suggest(model: IModel, position: IPosition, triggerCharacter: st
support
,
currentWord
:
suggestResult
.
currentWord
,
incomplete
:
suggestResult
.
incomplete
,
overwriteAfter
:
suggestResult
.
overwriteAfter
,
overwriteBefore
:
suggestResult
.
overwriteBefore
,
suggestions
:
suggestResult
.
suggestions
}
const
defaultRange
:
IRange
=
{
startLineNumber
:
position
.
lineNumber
,
startColumn
:
position
.
column
,
endLineNumber
:
position
.
lineNumber
,
endColumn
:
position
.
column
};
if
(
typeof
suggestResult
.
overwriteBefore
===
'
number
'
&&
suggestResult
.
overwriteBefore
>
0
)
{
defaultRange
.
startColumn
-=
suggestResult
.
overwriteBefore
;
}
if
(
typeof
suggestResult
.
overwriteAfter
===
'
number
'
&&
suggestResult
.
overwriteAfter
>
0
)
{
defaultRange
.
endColumn
+=
suggestResult
.
overwriteAfter
}
for
(
let
suggestion
of
suggestResult
.
suggestions
)
{
if
(
!
suggestion
.
textEdit
)
{
suggestion
.
textEdit
=
{
text
:
suggestion
.
codeSnippet
,
range
:
defaultRange
};
}
}
// add additional properties
mixin
(
suggestions2
,
suggestResult
,
false
);
result
.
push
(
suggestions2
);
}
...
...
src/vs/languages/html/common/htmlWorker.ts
浏览文件 @
18bda862
...
...
@@ -195,13 +195,14 @@ export class HTMLWorker extends AbstractModeWorker {
var
contentAfter
=
model
.
getLineContent
(
position
.
lineNumber
).
substr
(
position
.
column
-
1
);
var
closeTag
=
isWhiteSpace
(
contentAfter
)
||
strings
.
startsWith
(
contentAfter
,
'
<
'
)
?
'
>
'
:
''
;
var
collectClosingTagSuggestion
=
(
correctIndent
:
boolean
)
=>
{
var
collectClosingTagSuggestion
=
(
correctIndent
:
boolean
,
overwriteBefore
:
number
)
=>
{
var
endPosition
=
scanner
.
getTokenPosition
();
var
matchingTag
=
this
.
findMatchingOpenTag
(
scanner
);
if
(
matchingTag
)
{
var
suggestion
:
Modes
.
ISuggestion
=
{
label
:
'
/
'
+
matchingTag
,
codeSnippet
:
'
/
'
+
matchingTag
+
closeTag
,
overwriteBefore
:
overwriteBefore
,
type
:
'
property
'
};
suggestions
.
suggestions
.
push
(
suggestion
);
...
...
@@ -213,7 +214,7 @@ export class HTMLWorker extends AbstractModeWorker {
var
startIndent
=
model
.
getLineContent
(
startPosition
.
lineNumber
).
substring
(
0
,
startPosition
.
column
-
1
);
var
endIndent
=
model
.
getLineContent
(
endPosition
.
lineNumber
).
substring
(
0
,
endPosition
.
column
-
1
);
if
(
isWhiteSpace
(
startIndent
)
&&
isWhiteSpace
(
endIndent
))
{
suggestion
s
.
overwriteBefore
=
position
.
column
-
1
;
suggestion
.
overwriteBefore
=
position
.
column
-
1
;
// replace from start of line
suggestion
.
codeSnippet
=
startIndent
+
'
</
'
+
matchingTag
+
closeTag
;
}
}
...
...
@@ -225,17 +226,13 @@ export class HTMLWorker extends AbstractModeWorker {
if
(
scanner
.
getTokenType
()
===
DELIM_END
)
{
suggestions
.
overwriteBefore
=
suggestions
.
currentWord
.
length
+
1
;
var
hasClose
=
collectClosingTagSuggestion
(
true
);
var
hasClose
=
collectClosingTagSuggestion
(
true
,
suggestions
.
currentWord
.
length
+
1
);
if
(
!
hasClose
)
{
suggestions
.
overwriteBefore
=
suggestions
.
currentWord
.
length
+
1
;
this
.
_tagProviders
.
forEach
((
provider
)
=>
{
provider
.
collectTags
((
tag
,
label
)
=>
{
suggestions
.
suggestions
.
push
({
label
:
'
/
'
+
tag
,
overwriteBefore
:
suggestions
.
currentWord
.
length
+
1
,
codeSnippet
:
'
/
'
+
tag
+
closeTag
,
type
:
'
property
'
,
documentationLabel
:
label
...
...
@@ -244,7 +241,7 @@ export class HTMLWorker extends AbstractModeWorker {
});
}
}
else
{
collectClosingTagSuggestion
(
false
);
collectClosingTagSuggestion
(
false
,
suggestions
.
currentWord
.
length
);
this
.
_tagProviders
.
forEach
((
provider
)
=>
{
provider
.
collectTags
((
tag
,
label
)
=>
{
...
...
src/vs/languages/json/common/jsonIntellisense.ts
浏览文件 @
18bda862
...
...
@@ -44,11 +44,17 @@ export class JSONIntellisense {
incomplete
:
false
,
suggestions
:
[]
};
var
overwriteBefore
=
void
0
;
var
overwriteAfter
=
void
0
;
var
proposed
:
{
[
key
:
string
]:
boolean
}
=
{};
var
collector
:
JsonWorker
.
ISuggestionsCollector
=
{
add
:
(
suggestion
:
Modes
.
ISuggestion
)
=>
{
if
(
!
proposed
[
suggestion
.
label
])
{
proposed
[
suggestion
.
label
]
=
true
;
suggestion
.
overwriteBefore
=
overwriteBefore
;
suggestion
.
overwriteAfter
=
overwriteAfter
;
result
.
suggestions
.
push
(
suggestion
);
}
},
...
...
@@ -74,8 +80,8 @@ export class JSONIntellisense {
var
stringNode
=
<
Parser
.
StringASTNode
>
node
;
if
(
stringNode
.
isKey
)
{
var
nodeRange
=
modelMirror
.
getRangeFromOffsetAndLength
(
node
.
start
,
node
.
end
-
node
.
start
);
result
.
overwriteBefore
=
position
.
column
-
nodeRange
.
startColumn
;
result
.
overwriteAfter
=
nodeRange
.
endColumn
-
position
.
column
;
overwriteBefore
=
position
.
column
-
nodeRange
.
startColumn
;
overwriteAfter
=
nodeRange
.
endColumn
-
position
.
column
;
addValue
=
!
(
node
.
parent
&&
((
<
Parser
.
PropertyASTNode
>
node
.
parent
).
value
));
currentProperty
=
node
.
parent
?
<
Parser
.
PropertyASTNode
>
node
.
parent
:
null
;
currentKey
=
modelMirror
.
getValueInRange
({
startColumn
:
nodeRange
.
startColumn
+
1
,
startLineNumber
:
nodeRange
.
startLineNumber
,
endColumn
:
position
.
column
,
endLineNumber
:
position
.
lineNumber
});
...
...
@@ -122,8 +128,8 @@ export class JSONIntellisense {
// proposals for values
if
(
node
&&
(
node
.
type
===
'
string
'
||
node
.
type
===
'
number
'
||
node
.
type
===
'
boolean
'
||
node
.
type
===
'
null
'
))
{
var
nodeRange
=
modelMirror
.
getRangeFromOffsetAndLength
(
node
.
start
,
node
.
end
-
node
.
start
);
result
.
overwriteBefore
=
position
.
column
-
nodeRange
.
startColumn
;
result
.
overwriteAfter
=
nodeRange
.
endColumn
-
position
.
column
;
overwriteBefore
=
position
.
column
-
nodeRange
.
startColumn
;
overwriteAfter
=
nodeRange
.
endColumn
-
position
.
column
;
node
=
node
.
parent
;
}
...
...
src/vs/workbench/api/common/extHostApiCommands.ts
浏览文件 @
18bda862
...
...
@@ -256,7 +256,7 @@ export class ExtHostApiCommands {
for
(
let
group
of
value
)
{
for
(
let
suggestions
of
group
)
{
for
(
let
suggestion
of
suggestions
.
suggestions
)
{
const
item
=
typeConverters
.
Suggest
.
to
(
suggestion
);
const
item
=
typeConverters
.
Suggest
.
to
(
suggestion
s
,
position
,
suggestion
);
items
.
push
(
item
);
}
}
...
...
src/vs/workbench/api/common/extHostLanguageFeatures.ts
浏览文件 @
18bda862
...
...
@@ -502,12 +502,12 @@ class SuggestAdapter implements modes.ISuggestSupport {
// insert the text of the edit and create a dedicated
// suggestion-container with overwrite[Before|After]
suggestion
.
codeSnippet
=
item
.
textEdit
.
newText
;
suggestion
.
overwriteBefore
=
pos
.
character
-
editRange
.
start
.
character
,
suggestion
.
overwriteAfter
=
editRange
.
end
.
character
-
pos
.
character
allSuggestions
.
push
({
currentWord
:
doc
.
getText
(
<
any
>
editRange
),
suggestions
:
[
suggestion
],
overwriteBefore
:
pos
.
character
-
editRange
.
start
.
character
,
overwriteAfter
:
editRange
.
end
.
character
-
pos
.
character
suggestions
:
[
suggestion
]
});
}
else
{
...
...
src/vs/workbench/api/common/pluginHostTypeConverters.ts
浏览文件 @
18bda862
...
...
@@ -326,7 +326,6 @@ export const Suggest = {
codeSnippet
:
item
.
insertText
||
item
.
label
,
type
:
types
.
CompletionItemKind
[
item
.
kind
||
types
.
CompletionItemKind
.
Text
].
toString
().
toLowerCase
(),
typeLabel
:
item
.
detail
,
textEdit
:
item
.
textEdit
&&
TextEdit
.
from
(
item
.
textEdit
),
documentationLabel
:
item
.
documentation
,
sortText
:
item
.
sortText
,
filterText
:
item
.
filterText
...
...
@@ -334,7 +333,7 @@ export const Suggest = {
return
suggestion
;
},
to
(
suggestion
:
modes
.
ISuggestion
):
types
.
CompletionItem
{
to
(
container
:
modes
.
ISuggestResult
,
position
:
types
.
Position
,
suggestion
:
modes
.
ISuggestion
):
types
.
CompletionItem
{
const
result
=
new
types
.
CompletionItem
(
suggestion
.
label
);
result
.
insertText
=
suggestion
.
codeSnippet
;
result
.
kind
=
types
.
CompletionItemKind
[
suggestion
.
type
.
charAt
(
0
).
toUpperCase
()
+
suggestion
.
type
.
substr
(
1
)];
...
...
@@ -342,7 +341,15 @@ export const Suggest = {
result
.
documentation
=
suggestion
.
documentationLabel
;
result
.
sortText
=
suggestion
.
sortText
;
result
.
filterText
=
suggestion
.
filterText
;
result
.
textEdit
=
suggestion
.
textEdit
&&
<
any
>
TextEdit
.
to
(
suggestion
.
textEdit
);
let
overwriteBefore
=
(
typeof
suggestion
.
overwriteBefore
===
'
number
'
)
?
suggestion
.
overwriteBefore
:
container
.
currentWord
.
length
;
let
startPosition
=
new
types
.
Position
(
position
.
line
,
Math
.
max
(
0
,
position
.
character
-
overwriteBefore
));
let
endPosition
=
position
;
if
(
typeof
suggestion
.
overwriteAfter
===
'
number
'
)
{
endPosition
=
new
types
.
Position
(
position
.
line
,
position
.
character
+
suggestion
.
overwriteAfter
);
}
result
.
textEdit
=
types
.
TextEdit
.
replace
(
new
types
.
Range
(
startPosition
,
endPosition
),
suggestion
.
codeSnippet
);
return
result
;
}
}
...
...
src/vs/workbench/test/common/api/extHostApiCommands.test.ts
浏览文件 @
18bda862
...
...
@@ -244,29 +244,51 @@ suite('ExtHostLanguageFeatureCommands', function() {
provideCompletionItems
(
doc
,
pos
):
any
{
let
a
=
new
types
.
CompletionItem
(
'
item1
'
);
let
b
=
new
types
.
CompletionItem
(
'
item2
'
);
b
.
textEdit
=
types
.
TextEdit
.
replace
(
new
types
.
Range
(
0
,
0
,
0
,
4
),
'
foo
'
);
return
[
a
,
b
];
b
.
textEdit
=
types
.
TextEdit
.
replace
(
new
types
.
Range
(
0
,
4
,
0
,
8
),
'
foo
'
);
// overwite after
let
c
=
new
types
.
CompletionItem
(
'
item3
'
);
c
.
textEdit
=
types
.
TextEdit
.
replace
(
new
types
.
Range
(
0
,
1
,
0
,
6
),
'
foobar
'
);
// overwite before & after
let
d
=
new
types
.
CompletionItem
(
'
item4
'
);
d
.
textEdit
=
types
.
TextEdit
.
replace
(
new
types
.
Range
(
0
,
1
,
0
,
4
),
''
);
// overwite before
return
[
a
,
b
,
c
,
d
];
}
},
[]));
threadService
.
sync
().
then
(()
=>
{
commands
.
executeCommand
<
vscode
.
CompletionItem
[]
>
(
'
vscode.executeCompletionItemProvider
'
,
model
.
getAssociatedResource
(),
new
types
.
Position
(
0
,
0
)).
then
(
values
=>
{
assert
.
equal
(
values
.
length
,
2
);
let
[
first
,
second
]
=
values
;
assert
.
equal
(
first
.
label
,
'
item1
'
);
assert
.
equal
(
first
.
textEdit
.
newText
,
'
item1
'
);
assert
.
equal
(
first
.
textEdit
.
range
.
start
.
line
,
0
);
assert
.
equal
(
first
.
textEdit
.
range
.
start
.
character
,
0
);
assert
.
equal
(
first
.
textEdit
.
range
.
end
.
line
,
0
);
assert
.
equal
(
first
.
textEdit
.
range
.
end
.
character
,
0
);
assert
.
equal
(
second
.
label
,
'
item2
'
);
assert
.
equal
(
second
.
textEdit
.
newText
,
'
foo
'
);
assert
.
equal
(
second
.
textEdit
.
range
.
start
.
line
,
0
);
assert
.
equal
(
second
.
textEdit
.
range
.
start
.
character
,
0
);
assert
.
equal
(
second
.
textEdit
.
range
.
end
.
line
,
0
);
assert
.
equal
(
second
.
textEdit
.
range
.
end
.
character
,
4
);
done
();
commands
.
executeCommand
<
vscode
.
CompletionItem
[]
>
(
'
vscode.executeCompletionItemProvider
'
,
model
.
getAssociatedResource
(),
new
types
.
Position
(
0
,
4
)).
then
(
values
=>
{
try
{
assert
.
equal
(
values
.
length
,
4
);
let
[
first
,
second
,
third
,
forth
]
=
values
;
assert
.
equal
(
first
.
label
,
'
item1
'
);
assert
.
equal
(
first
.
textEdit
.
newText
,
'
item1
'
);
assert
.
equal
(
first
.
textEdit
.
range
.
start
.
line
,
0
);
assert
.
equal
(
first
.
textEdit
.
range
.
start
.
character
,
0
);
assert
.
equal
(
first
.
textEdit
.
range
.
end
.
line
,
0
);
assert
.
equal
(
first
.
textEdit
.
range
.
end
.
character
,
4
);
assert
.
equal
(
second
.
label
,
'
item2
'
);
assert
.
equal
(
second
.
textEdit
.
newText
,
'
foo
'
);
assert
.
equal
(
second
.
textEdit
.
range
.
start
.
line
,
0
);
assert
.
equal
(
second
.
textEdit
.
range
.
start
.
character
,
4
);
assert
.
equal
(
second
.
textEdit
.
range
.
end
.
line
,
0
);
assert
.
equal
(
second
.
textEdit
.
range
.
end
.
character
,
8
);
assert
.
equal
(
third
.
label
,
'
item3
'
);
assert
.
equal
(
third
.
textEdit
.
newText
,
'
foobar
'
);
assert
.
equal
(
third
.
textEdit
.
range
.
start
.
line
,
0
);
assert
.
equal
(
third
.
textEdit
.
range
.
start
.
character
,
1
);
assert
.
equal
(
third
.
textEdit
.
range
.
end
.
line
,
0
);
assert
.
equal
(
third
.
textEdit
.
range
.
end
.
character
,
6
);
assert
.
equal
(
forth
.
label
,
'
item4
'
);
assert
.
equal
(
forth
.
textEdit
.
newText
,
''
);
assert
.
equal
(
forth
.
textEdit
.
range
.
start
.
line
,
0
);
assert
.
equal
(
forth
.
textEdit
.
range
.
start
.
character
,
1
);
assert
.
equal
(
forth
.
textEdit
.
range
.
end
.
line
,
0
);
assert
.
equal
(
forth
.
textEdit
.
range
.
end
.
character
,
4
);
done
();
}
catch
(
e
)
{
done
(
e
);
}
});
});
});
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录