Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
ebe8680a
V
vscode
项目概览
掘金者说
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
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,发现更多精彩内容 >>
提交
ebe8680a
编写于
9月 27, 2021
作者:
R
Rob Lourens
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix debug console not setting up completion provider
Fix #133930
上级
a7f87cbc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
78 addition
and
72 deletion
+78
-72
src/vs/workbench/contrib/debug/browser/repl.ts
src/vs/workbench/contrib/debug/browser/repl.ts
+78
-72
未找到文件。
src/vs/workbench/contrib/debug/browser/repl.ts
浏览文件 @
ebe8680a
...
...
@@ -143,78 +143,11 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
}
private
registerListeners
():
void
{
this
.
_register
(
this
.
debugService
.
getViewModel
().
onDidFocusSession
(
async
session
=>
{
if
(
session
)
{
sessionsToIgnore
.
delete
(
session
);
if
(
this
.
completionItemProvider
)
{
this
.
completionItemProvider
.
dispose
();
}
if
(
session
.
capabilities
.
supportsCompletionsRequest
)
{
this
.
completionItemProvider
=
CompletionProviderRegistry
.
register
({
scheme
:
DEBUG_SCHEME
,
pattern
:
'
**/replinput
'
,
hasAccessToAllModels
:
true
},
{
triggerCharacters
:
session
.
capabilities
.
completionTriggerCharacters
||
[
'
.
'
],
provideCompletionItems
:
async
(
_
:
ITextModel
,
position
:
Position
,
_context
:
CompletionContext
,
token
:
CancellationToken
):
Promise
<
CompletionList
>
=>
{
// Disable history navigation because up and down are used to navigate through the suggest widget
this
.
setHistoryNavigationEnablement
(
false
);
const
model
=
this
.
replInput
.
getModel
();
if
(
model
)
{
const
word
=
model
.
getWordAtPosition
(
position
);
const
overwriteBefore
=
word
?
word
.
word
.
length
:
0
;
const
text
=
model
.
getValue
();
const
focusedStackFrame
=
this
.
debugService
.
getViewModel
().
focusedStackFrame
;
const
frameId
=
focusedStackFrame
?
focusedStackFrame
.
frameId
:
undefined
;
const
response
=
await
session
.
completions
(
frameId
,
focusedStackFrame
?.
thread
.
threadId
||
0
,
text
,
position
,
overwriteBefore
,
token
);
const
suggestions
:
CompletionItem
[]
=
[];
const
computeRange
=
(
length
:
number
)
=>
Range
.
fromPositions
(
position
.
delta
(
0
,
-
length
),
position
);
if
(
response
&&
response
.
body
&&
response
.
body
.
targets
)
{
response
.
body
.
targets
.
forEach
(
item
=>
{
if
(
item
&&
item
.
label
)
{
let
insertTextRules
:
CompletionItemInsertTextRule
|
undefined
=
undefined
;
let
insertText
=
item
.
text
||
item
.
label
;
if
(
typeof
item
.
selectionStart
===
'
number
'
)
{
// If a debug completion item sets a selection we need to use snippets to make sure the selection is selected #90974
insertTextRules
=
CompletionItemInsertTextRule
.
InsertAsSnippet
;
const
selectionLength
=
typeof
item
.
selectionLength
===
'
number
'
?
item
.
selectionLength
:
0
;
const
placeholder
=
selectionLength
>
0
?
'
${1:
'
+
insertText
.
substr
(
item
.
selectionStart
,
selectionLength
)
+
'
}$0
'
:
'
$0
'
;
insertText
=
insertText
.
substr
(
0
,
item
.
selectionStart
)
+
placeholder
+
insertText
.
substr
(
item
.
selectionStart
+
selectionLength
);
}
suggestions
.
push
({
label
:
item
.
label
,
insertText
,
kind
:
completionKindFromString
(
item
.
type
||
'
property
'
),
filterText
:
(
item
.
start
&&
item
.
length
)
?
text
.
substr
(
item
.
start
,
item
.
length
).
concat
(
item
.
label
)
:
undefined
,
range
:
computeRange
(
item
.
length
||
overwriteBefore
),
sortText
:
item
.
sortText
,
insertTextRules
});
}
});
}
if
(
this
.
configurationService
.
getValue
<
IDebugConfiguration
>
(
'
debug
'
).
console
.
historySuggestions
)
{
const
history
=
this
.
history
.
getHistory
();
history
.
forEach
(
h
=>
suggestions
.
push
({
label
:
h
,
insertText
:
h
,
kind
:
CompletionItemKind
.
Text
,
range
:
computeRange
(
h
.
length
),
sortText
:
'
ZZZ
'
}));
}
return
{
suggestions
};
}
return
Promise
.
resolve
({
suggestions
:
[]
});
}
});
}
}
if
(
this
.
debugService
.
getViewModel
().
focusedSession
)
{
this
.
onDidFocusSession
(
this
.
debugService
.
getViewModel
().
focusedSession
);
}
await
this
.
selectSession
();
}));
this
.
_register
(
this
.
debugService
.
getViewModel
().
onDidFocusSession
(
async
session
=>
this
.
onDidFocusSession
(
session
)));
this
.
_register
(
this
.
debugService
.
onWillNewSession
(
async
newSession
=>
{
// Need to listen to output events for sessions which are not yet fully initialised
const
input
=
this
.
tree
.
getInput
();
...
...
@@ -279,6 +212,79 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
}));
}
private
async
onDidFocusSession
(
session
:
IDebugSession
|
undefined
):
Promise
<
void
>
{
if
(
session
)
{
sessionsToIgnore
.
delete
(
session
);
if
(
this
.
completionItemProvider
)
{
this
.
completionItemProvider
.
dispose
();
}
if
(
session
.
capabilities
.
supportsCompletionsRequest
)
{
this
.
completionItemProvider
=
CompletionProviderRegistry
.
register
({
scheme
:
DEBUG_SCHEME
,
pattern
:
'
**/replinput
'
,
hasAccessToAllModels
:
true
},
{
triggerCharacters
:
session
.
capabilities
.
completionTriggerCharacters
||
[
'
.
'
],
provideCompletionItems
:
async
(
_
:
ITextModel
,
position
:
Position
,
_context
:
CompletionContext
,
token
:
CancellationToken
):
Promise
<
CompletionList
>
=>
{
// Disable history navigation because up and down are used to navigate through the suggest widget
this
.
setHistoryNavigationEnablement
(
false
);
const
model
=
this
.
replInput
.
getModel
();
if
(
model
)
{
const
word
=
model
.
getWordAtPosition
(
position
);
const
overwriteBefore
=
word
?
word
.
word
.
length
:
0
;
const
text
=
model
.
getValue
();
const
focusedStackFrame
=
this
.
debugService
.
getViewModel
().
focusedStackFrame
;
const
frameId
=
focusedStackFrame
?
focusedStackFrame
.
frameId
:
undefined
;
const
response
=
await
session
.
completions
(
frameId
,
focusedStackFrame
?.
thread
.
threadId
||
0
,
text
,
position
,
overwriteBefore
,
token
);
const
suggestions
:
CompletionItem
[]
=
[];
const
computeRange
=
(
length
:
number
)
=>
Range
.
fromPositions
(
position
.
delta
(
0
,
-
length
),
position
);
if
(
response
&&
response
.
body
&&
response
.
body
.
targets
)
{
response
.
body
.
targets
.
forEach
(
item
=>
{
if
(
item
&&
item
.
label
)
{
let
insertTextRules
:
CompletionItemInsertTextRule
|
undefined
=
undefined
;
let
insertText
=
item
.
text
||
item
.
label
;
if
(
typeof
item
.
selectionStart
===
'
number
'
)
{
// If a debug completion item sets a selection we need to use snippets to make sure the selection is selected #90974
insertTextRules
=
CompletionItemInsertTextRule
.
InsertAsSnippet
;
const
selectionLength
=
typeof
item
.
selectionLength
===
'
number
'
?
item
.
selectionLength
:
0
;
const
placeholder
=
selectionLength
>
0
?
'
${1:
'
+
insertText
.
substr
(
item
.
selectionStart
,
selectionLength
)
+
'
}$0
'
:
'
$0
'
;
insertText
=
insertText
.
substr
(
0
,
item
.
selectionStart
)
+
placeholder
+
insertText
.
substr
(
item
.
selectionStart
+
selectionLength
);
}
suggestions
.
push
({
label
:
item
.
label
,
insertText
,
kind
:
completionKindFromString
(
item
.
type
||
'
property
'
),
filterText
:
(
item
.
start
&&
item
.
length
)
?
text
.
substr
(
item
.
start
,
item
.
length
).
concat
(
item
.
label
)
:
undefined
,
range
:
computeRange
(
item
.
length
||
overwriteBefore
),
sortText
:
item
.
sortText
,
insertTextRules
});
}
});
}
if
(
this
.
configurationService
.
getValue
<
IDebugConfiguration
>
(
'
debug
'
).
console
.
historySuggestions
)
{
const
history
=
this
.
history
.
getHistory
();
history
.
forEach
(
h
=>
suggestions
.
push
({
label
:
h
,
insertText
:
h
,
kind
:
CompletionItemKind
.
Text
,
range
:
computeRange
(
h
.
length
),
sortText
:
'
ZZZ
'
}));
}
return
{
suggestions
};
}
return
Promise
.
resolve
({
suggestions
:
[]
});
}
});
}
}
await
this
.
selectSession
();
}
getFilterStats
():
{
total
:
number
,
filtered
:
number
}
{
// This could be called before the tree is created when setting this.filterState.filterText value
return
{
...
...
@@ -379,7 +385,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
}
async
selectSession
(
session
?:
IDebugSession
):
Promise
<
void
>
{
const
treeInput
=
this
.
tree
.
getInput
();
const
treeInput
=
this
.
tree
&&
this
.
tree
.
getInput
();
if
(
!
session
)
{
const
focusedSession
=
this
.
debugService
.
getViewModel
().
focusedSession
;
// If there is a focusedSession focus on that one, otherwise just show any other not ignored session
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录