Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
c6750ffa
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,发现更多精彩内容 >>
提交
c6750ffa
编写于
2月 04, 2020
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
debt - careful with dispose() and assignments
上级
a07225a3
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
62 addition
and
40 deletion
+62
-40
src/vs/base/browser/ui/menu/menubar.ts
src/vs/base/browser/ui/menu/menubar.ts
+4
-5
src/vs/base/common/lifecycle.ts
src/vs/base/common/lifecycle.ts
+6
-1
src/vs/editor/contrib/suggest/suggestWidget.ts
src/vs/editor/contrib/suggest/suggestWidget.ts
+4
-2
src/vs/platform/list/browser/listService.ts
src/vs/platform/list/browser/listService.ts
+3
-2
src/vs/platform/storage/browser/storageService.ts
src/vs/platform/storage/browser/storageService.ts
+3
-2
src/vs/platform/storage/node/storageService.ts
src/vs/platform/storage/node/storageService.ts
+3
-2
src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts
src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts
+2
-2
src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts
...workbench/contrib/files/common/editors/fileEditorInput.ts
+7
-4
src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts
...kbench/contrib/files/test/browser/fileEditorInput.test.ts
+24
-17
src/vs/workbench/contrib/terminal/browser/terminalInstance.ts
...vs/workbench/contrib/terminal/browser/terminalInstance.ts
+6
-3
未找到文件。
src/vs/base/browser/ui/menu/menubar.ts
浏览文件 @
c6750ffa
...
...
@@ -88,7 +88,7 @@ export class MenuBar extends Disposable {
private
numMenusShown
:
number
=
0
;
private
menuStyle
:
IMenuStyles
|
undefined
;
private
overflowLayoutScheduled
:
IDisposable
|
null
=
null
;
private
overflowLayoutScheduled
:
IDisposable
|
undefined
=
undefined
;
constructor
(
private
container
:
HTMLElement
,
private
options
:
IMenuBarOptions
=
{})
{
super
();
...
...
@@ -419,9 +419,8 @@ export class MenuBar extends Disposable {
DOM
.
removeNode
(
this
.
overflowMenu
.
titleElement
);
DOM
.
removeNode
(
this
.
overflowMenu
.
buttonElement
);
if
(
this
.
overflowLayoutScheduled
)
{
this
.
overflowLayoutScheduled
=
dispose
(
this
.
overflowLayoutScheduled
);
}
dispose
(
this
.
overflowLayoutScheduled
);
this
.
overflowLayoutScheduled
=
undefined
;
}
blur
():
void
{
...
...
@@ -561,7 +560,7 @@ export class MenuBar extends Disposable {
if
(
!
this
.
overflowLayoutScheduled
)
{
this
.
overflowLayoutScheduled
=
DOM
.
scheduleAtNextAnimationFrame
(()
=>
{
this
.
updateOverflowAction
();
this
.
overflowLayoutScheduled
=
null
;
this
.
overflowLayoutScheduled
=
undefined
;
});
}
...
...
src/vs/base/common/lifecycle.ts
浏览文件 @
c6750ffa
...
...
@@ -91,6 +91,9 @@ export function toDisposable(fn: () => void): IDisposable {
}
export
class
DisposableStore
implements
IDisposable
{
static
DISABLE_DISPOSED_WARNING
=
false
;
private
_toDispose
=
new
Set
<
IDisposable
>
();
private
_isDisposed
=
false
;
...
...
@@ -127,7 +130,9 @@ export class DisposableStore implements IDisposable {
markTracked
(
t
);
if
(
this
.
_isDisposed
)
{
console
.
warn
(
new
Error
(
'
Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!
'
).
stack
);
if
(
!
DisposableStore
.
DISABLE_DISPOSED_WARNING
)
{
console
.
warn
(
new
Error
(
'
Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!
'
).
stack
);
}
}
else
{
this
.
_toDispose
.
add
(
t
);
}
...
...
src/vs/editor/contrib/suggest/suggestWidget.ts
浏览文件 @
c6750ffa
...
...
@@ -342,7 +342,8 @@ class SuggestionDetails {
}
renderItem
(
item
:
CompletionItem
,
explainMode
:
boolean
):
void
{
this
.
renderDisposeable
=
dispose
(
this
.
renderDisposeable
);
dispose
(
this
.
renderDisposeable
);
this
.
renderDisposeable
=
undefined
;
let
{
documentation
,
detail
}
=
item
.
completion
;
// --- documentation
...
...
@@ -449,7 +450,8 @@ class SuggestionDetails {
dispose
():
void
{
this
.
disposables
.
dispose
();
this
.
renderDisposeable
=
dispose
(
this
.
renderDisposeable
);
dispose
(
this
.
renderDisposeable
);
this
.
renderDisposeable
=
undefined
;
}
}
...
...
src/vs/platform/list/browser/listService.ts
浏览文件 @
c6750ffa
...
...
@@ -952,7 +952,7 @@ class WorkbenchTreeInternals<TInput, T, TFilterData> {
private
hasMultiSelection
:
IContextKey
<
boolean
>
;
private
_useAltAsMultipleSelectionModifier
:
boolean
;
private
disposables
:
IDisposable
[]
=
[];
private
styler
!
:
IDisposable
;
private
styler
:
IDisposable
|
undefined
;
constructor
(
private
tree
:
WorkbenchObjectTree
<
T
,
TFilterData
>
|
CompressibleObjectTree
<
T
,
TFilterData
>
|
WorkbenchDataTree
<
TInput
,
T
,
TFilterData
>
|
WorkbenchAsyncDataTree
<
TInput
,
T
,
TFilterData
>
|
WorkbenchCompressibleAsyncDataTree
<
TInput
,
T
,
TFilterData
>
,
...
...
@@ -1048,7 +1048,8 @@ class WorkbenchTreeInternals<TInput, T, TFilterData> {
dispose
():
void
{
this
.
disposables
=
dispose
(
this
.
disposables
);
this
.
styler
=
dispose
(
this
.
styler
);
dispose
(
this
.
styler
);
this
.
styler
=
undefined
;
}
}
...
...
src/vs/platform/storage/browser/storageService.ts
浏览文件 @
c6750ffa
...
...
@@ -136,7 +136,7 @@ export class BrowserStorageService extends Disposable implements IStorageService
private
doFlushWhenIdle
():
void
{
// Dispose any previous idle runner
this
.
runWhenIdleDisposable
=
dispose
(
this
.
runWhenIdleDisposable
);
dispose
(
this
.
runWhenIdleDisposable
);
// Run when idle
this
.
runWhenIdleDisposable
=
runWhenIdle
(()
=>
{
...
...
@@ -180,7 +180,8 @@ export class BrowserStorageService extends Disposable implements IStorageService
}
dispose
():
void
{
this
.
runWhenIdleDisposable
=
dispose
(
this
.
runWhenIdleDisposable
);
dispose
(
this
.
runWhenIdleDisposable
);
this
.
runWhenIdleDisposable
=
undefined
;
super
.
dispose
();
}
...
...
src/vs/platform/storage/node/storageService.ts
浏览文件 @
c6750ffa
...
...
@@ -203,7 +203,7 @@ export class NativeStorageService extends Disposable implements IStorageService
private
doFlushWhenIdle
():
void
{
// Dispose any previous idle runner
this
.
runWhenIdleDisposable
=
dispose
(
this
.
runWhenIdleDisposable
);
dispose
(
this
.
runWhenIdleDisposable
);
// Run when idle
this
.
runWhenIdleDisposable
=
runWhenIdle
(()
=>
{
...
...
@@ -224,7 +224,8 @@ export class NativeStorageService extends Disposable implements IStorageService
// Stop periodic scheduler and idle runner as we now collect state normally
this
.
periodicFlushScheduler
.
dispose
();
this
.
runWhenIdleDisposable
=
dispose
(
this
.
runWhenIdleDisposable
);
dispose
(
this
.
runWhenIdleDisposable
);
this
.
runWhenIdleDisposable
=
undefined
;
// Signal as event so that clients can still store data
this
.
_onWillSaveState
.
fire
({
reason
:
WillSaveStateReason
.
SHUTDOWN
});
...
...
src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts
浏览文件 @
c6750ffa
...
...
@@ -606,8 +606,8 @@ export class LoadedScriptsView extends ViewPane {
}
dispose
():
void
{
this
.
tree
=
dispose
(
this
.
tree
);
this
.
treeLabels
=
dispose
(
this
.
treeLabels
);
dispose
(
this
.
tree
);
dispose
(
this
.
treeLabels
);
super
.
dispose
();
}
}
...
...
src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts
浏览文件 @
c6750ffa
...
...
@@ -240,10 +240,12 @@ export class FileEditorInput extends TextResourceEditorInput implements IFileEdi
// re-emit some events from the model
this
.
_register
(
model
.
onDidChangeDirty
(()
=>
this
.
_onDidChangeDirty
.
fire
()));
this
.
_register
(
model
.
onDidSave
(()
=>
this
.
_onDidChangeDirty
.
fire
()));
this
.
_register
(
model
.
onDidSaveError
(()
=>
this
.
_onDidChangeDirty
.
fire
()));
this
.
_register
(
model
.
onDidRevert
(()
=>
this
.
_onDidChangeDirty
.
fire
()));
this
.
_register
(
model
.
onDidChangeOrphaned
(()
=>
this
.
_onDidChangeLabel
.
fire
()));
// important: treat save errors as potential dirty change because
// a file that is in save conflict or error will report dirty even
// if auto save is turned on.
this
.
_register
(
model
.
onDidSaveError
(()
=>
this
.
_onDidChangeDirty
.
fire
()));
}
private
async
doResolveAsBinary
():
Promise
<
BinaryEditorModel
>
{
...
...
@@ -269,7 +271,8 @@ export class FileEditorInput extends TextResourceEditorInput implements IFileEdi
dispose
():
void
{
// Model reference
this
.
cachedTextFileModelReference
=
dispose
(
this
.
cachedTextFileModelReference
);
dispose
(
this
.
cachedTextFileModelReference
);
this
.
cachedTextFileModelReference
=
undefined
;
super
.
dispose
();
}
...
...
src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts
浏览文件 @
c6750ffa
...
...
@@ -17,6 +17,7 @@ import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textF
import
{
IModelService
}
from
'
vs/editor/common/services/modelService
'
;
import
{
timeout
}
from
'
vs/base/common/async
'
;
import
{
ModesRegistry
,
PLAINTEXT_MODE_ID
}
from
'
vs/editor/common/modes/modesRegistry
'
;
import
{
DisposableStore
}
from
'
vs/base/common/lifecycle
'
;
class
ServiceAccessor
{
constructor
(
...
...
@@ -66,23 +67,29 @@ suite('Files - FileEditorInput', () => {
resolved
=
await
inputToResolve
.
resolve
();
assert
(
resolvedModelA
===
resolved
);
// OK: Resolved Model cached globally per input
const
otherResolved
=
await
sameOtherInput
.
resolve
();
assert
(
otherResolved
===
resolvedModelA
);
// OK: Resolved Model cached globally per input
inputToResolve
.
dispose
();
resolved
=
await
inputToResolve
.
resolve
();
assert
(
resolvedModelA
===
resolved
);
// Model is still the same because we had 2 clients
inputToResolve
.
dispose
();
sameOtherInput
.
dispose
();
resolvedModelA
.
dispose
();
resolved
=
await
inputToResolve
.
resolve
();
assert
(
resolvedModelA
!==
resolved
);
// Different instance, because input got disposed
const
stat
=
(
resolved
as
TextFileEditorModel
).
getStat
();
resolved
=
await
inputToResolve
.
resolve
();
await
timeout
(
0
);
assert
(
stat
!==
(
resolved
as
TextFileEditorModel
).
getStat
());
// Different stat, because resolve always goes to the server for refresh
try
{
DisposableStore
.
DISABLE_DISPOSED_WARNING
=
true
;
// prevent unwanted warning output from occuring
const
otherResolved
=
await
sameOtherInput
.
resolve
();
assert
(
otherResolved
===
resolvedModelA
);
// OK: Resolved Model cached globally per input
inputToResolve
.
dispose
();
resolved
=
await
inputToResolve
.
resolve
();
assert
(
resolvedModelA
===
resolved
);
// Model is still the same because we had 2 clients
inputToResolve
.
dispose
();
sameOtherInput
.
dispose
();
resolvedModelA
.
dispose
();
resolved
=
await
inputToResolve
.
resolve
();
assert
(
resolvedModelA
!==
resolved
);
// Different instance, because input got disposed
const
stat
=
(
resolved
as
TextFileEditorModel
).
getStat
();
resolved
=
await
inputToResolve
.
resolve
();
await
timeout
(
0
);
assert
(
stat
!==
(
resolved
as
TextFileEditorModel
).
getStat
());
// Different stat, because resolve always goes to the server for refresh
}
finally
{
DisposableStore
.
DISABLE_DISPOSED_WARNING
=
false
;
}
});
test
(
'
preferred mode
'
,
async
function
()
{
...
...
src/vs/workbench/contrib/terminal/browser/terminalInstance.ts
浏览文件 @
c6750ffa
...
...
@@ -795,9 +795,12 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
dispose
(
this
.
_windowsShellHelper
);
this
.
_windowsShellHelper
=
undefined
;
this
.
_linkHandler
=
dispose
(
this
.
_linkHandler
);
this
.
_commandTrackerAddon
=
dispose
(
this
.
_commandTrackerAddon
);
this
.
_widgetManager
=
dispose
(
this
.
_widgetManager
);
dispose
(
this
.
_linkHandler
);
this
.
_linkHandler
=
undefined
;
dispose
(
this
.
_commandTrackerAddon
);
this
.
_commandTrackerAddon
=
undefined
;
dispose
(
this
.
_widgetManager
);
this
.
_widgetManager
=
undefined
;
if
(
this
.
_xterm
&&
this
.
_xterm
.
element
)
{
this
.
_hadFocusOnExit
=
dom
.
hasClass
(
this
.
_xterm
.
element
,
'
focus
'
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录