Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
ad41028d
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,发现更多精彩内容 >>
提交
ad41028d
编写于
1月 13, 2020
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
debt - drop untyped events in favor of typed (text files)
上级
06a9d488
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
133 addition
and
154 deletion
+133
-154
src/vs/workbench/api/browser/mainThreadDocuments.ts
src/vs/workbench/api/browser/mainThreadDocuments.ts
+3
-3
src/vs/workbench/browser/parts/editor/editorStatus.ts
src/vs/workbench/browser/parts/editor/editorStatus.ts
+1
-1
src/vs/workbench/contrib/experiments/common/experimentService.ts
...workbench/contrib/experiments/common/experimentService.ts
+1
-1
src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts
...kbench/contrib/files/browser/editors/fileEditorTracker.ts
+2
-2
src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts
...contrib/files/browser/editors/textFileSaveErrorHandler.ts
+2
-2
src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts
...workbench/contrib/files/common/editors/fileEditorInput.ts
+5
-5
src/vs/workbench/contrib/surveys/browser/languageSurveys.contribution.ts
...h/contrib/surveys/browser/languageSurveys.contribution.ts
+1
-1
src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts
...bench/contrib/telemetry/browser/telemetry.contribution.ts
+2
-2
src/vs/workbench/services/textfile/common/textFileEditorModel.ts
...workbench/services/textfile/common/textFileEditorModel.ts
+31
-13
src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts
...ch/services/textfile/common/textFileEditorModelManager.ts
+37
-63
src/vs/workbench/services/textfile/common/textfiles.ts
src/vs/workbench/services/textfile/common/textfiles.ts
+14
-19
src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts
...kbench/services/textfile/test/textFileEditorModel.test.ts
+21
-29
src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts
...services/textfile/test/textFileEditorModelManager.test.ts
+7
-7
src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts
...lectron-browser/api/mainThreadDocumentsAndEditors.test.ts
+3
-3
src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts
...bench/test/electron-browser/api/mainThreadEditors.test.ts
+3
-3
未找到文件。
src/vs/workbench/api/browser/mainThreadDocuments.ts
浏览文件 @
ad41028d
...
...
@@ -104,17 +104,17 @@ export class MainThreadDocuments implements MainThreadDocumentsShape {
this
.
_toDispose
.
add
(
this
.
_modelReferenceCollection
);
this
.
_toDispose
.
add
(
modelService
.
onModelModeChanged
(
this
.
_onModelModeChanged
,
this
));
this
.
_toDispose
.
add
(
textFileService
.
models
.
on
ModelSaved
(
m
=>
{
this
.
_toDispose
.
add
(
textFileService
.
models
.
on
DidSave
(
m
=>
{
if
(
this
.
_shouldHandleFileEvent
(
m
.
resource
))
{
this
.
_proxy
.
$acceptModelSaved
(
m
.
resource
);
}
}));
this
.
_toDispose
.
add
(
textFileService
.
models
.
on
ModelReverted
(
m
=>
{
this
.
_toDispose
.
add
(
textFileService
.
models
.
on
DidRevert
(
m
=>
{
if
(
this
.
_shouldHandleFileEvent
(
m
.
resource
))
{
this
.
_proxy
.
$acceptDirtyStateChanged
(
m
.
resource
,
false
);
}
}));
this
.
_toDispose
.
add
(
textFileService
.
models
.
on
Model
Dirty
(
m
=>
{
this
.
_toDispose
.
add
(
textFileService
.
models
.
on
DidChange
Dirty
(
m
=>
{
if
(
this
.
_shouldHandleFileEvent
(
m
.
resource
))
{
this
.
_proxy
.
$acceptDirtyStateChanged
(
m
.
resource
,
true
);
}
...
...
src/vs/workbench/browser/parts/editor/editorStatus.ts
浏览文件 @
ad41028d
...
...
@@ -314,7 +314,7 @@ export class EditorStatus extends Disposable implements IWorkbenchContribution {
private
registerListeners
():
void
{
this
.
_register
(
this
.
editorService
.
onDidActiveEditorChange
(()
=>
this
.
updateStatusBar
()));
this
.
_register
(
this
.
untitledTextEditorService
.
onDidChangeEncoding
(
r
=>
this
.
onResourceEncodingChange
(
r
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
ModelEncodingChanged
(
m
=>
this
.
onResourceEncodingChange
((
m
.
resource
))));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidChangeEncoding
(
m
=>
this
.
onResourceEncodingChange
((
m
.
resource
))));
this
.
_register
(
TabFocus
.
onDidChangeTabFocus
(
e
=>
this
.
onTabFocusModeChange
()));
}
...
...
src/vs/workbench/contrib/experiments/common/experimentService.ts
浏览文件 @
ad41028d
...
...
@@ -448,7 +448,7 @@ export class ExperimentService extends Disposable implements IExperimentService
}
},
250
));
const
onSaveHandler
=
this
.
_register
(
this
.
textFileService
.
models
.
on
ModelSaved
(
m
=>
onModelsSavedWorker
.
work
(
m
)));
const
onSaveHandler
=
this
.
_register
(
this
.
textFileService
.
models
.
on
DidSave
(
m
=>
onModelsSavedWorker
.
work
(
m
)));
return
ExperimentState
.
Evaluating
;
});
}
...
...
src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts
浏览文件 @
ad41028d
...
...
@@ -61,8 +61,8 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut
this
.
_register
(
this
.
fileService
.
onFileChanges
(
e
=>
this
.
onFileChanges
(
e
)));
// Ensure dirty text file and untitled models are always opened as editors
this
.
_register
(
this
.
textFileService
.
models
.
on
Model
Dirty
(
m
=>
this
.
ensureDirtyFilesAreOpenedWorker
.
work
(
m
.
resource
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
Model
SaveError
(
m
=>
this
.
ensureDirtyFilesAreOpenedWorker
.
work
(
m
.
resource
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidChange
Dirty
(
m
=>
this
.
ensureDirtyFilesAreOpenedWorker
.
work
(
m
.
resource
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
Did
SaveError
(
m
=>
this
.
ensureDirtyFilesAreOpenedWorker
.
work
(
m
.
resource
)));
this
.
_register
(
this
.
untitledTextEditorService
.
onDidChangeDirty
(
r
=>
this
.
ensureDirtyFilesAreOpenedWorker
.
work
(
r
)));
// Out of workspace file watchers
...
...
src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts
浏览文件 @
ad41028d
...
...
@@ -71,8 +71,8 @@ export class TextFileSaveErrorHandler extends Disposable implements ISaveErrorHa
}
private
registerListeners
():
void
{
this
.
_register
(
this
.
textFileService
.
models
.
on
ModelSaved
(
m
=>
this
.
onFileSavedOrReverted
(
m
.
resource
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
ModelReverted
(
m
=>
this
.
onFileSavedOrReverted
(
m
.
resource
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidSave
(
m
=>
this
.
onFileSavedOrReverted
(
m
.
resource
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidRevert
(
m
=>
this
.
onFileSavedOrReverted
(
m
.
resource
)));
this
.
_register
(
this
.
editorService
.
onDidActiveEditorChange
(()
=>
this
.
onActiveEditorChanged
()));
}
...
...
src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts
浏览文件 @
ad41028d
...
...
@@ -70,15 +70,15 @@ export class FileEditorInput extends TextEditorInput implements IFileEditorInput
private
registerListeners
():
void
{
// Dirty changes
this
.
_register
(
this
.
textFileService
.
models
.
on
Model
Dirty
(
m
=>
this
.
onDirtyStateChange
(
m
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
Model
SaveError
(
m
=>
this
.
onDirtyStateChange
(
m
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
ModelSaved
(
m
=>
this
.
onDirtyStateChange
(
m
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
ModelReverted
(
m
=>
this
.
onDirtyStateChange
(
m
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidChange
Dirty
(
m
=>
this
.
onDirtyStateChange
(
m
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
Did
SaveError
(
m
=>
this
.
onDirtyStateChange
(
m
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidSave
(
m
=>
this
.
onDirtyStateChange
(
m
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidRevert
(
m
=>
this
.
onDirtyStateChange
(
m
)));
// Label changes
this
.
_register
(
this
.
labelService
.
onDidChangeFormatters
(()
=>
FileEditorInput
.
MEMOIZER
.
clear
()));
this
.
_register
(
this
.
fileService
.
onDidChangeFileSystemProviderRegistrations
(()
=>
FileEditorInput
.
MEMOIZER
.
clear
()));
this
.
_register
(
this
.
textFileService
.
models
.
on
ModelOrphanedChang
ed
(
model
=>
this
.
onModelOrphanedChanged
(
model
)));
this
.
_register
(
this
.
textFileService
.
models
.
on
DidChangeOrphan
ed
(
model
=>
this
.
onModelOrphanedChanged
(
model
)));
}
private
onDirtyStateChange
(
model
:
ITextFileEditorModel
):
void
{
...
...
src/vs/workbench/contrib/surveys/browser/languageSurveys.contribution.ts
浏览文件 @
ad41028d
...
...
@@ -62,7 +62,7 @@ class LanguageSurvey extends Disposable {
});
},
250
));
this
.
_register
(
textFileService
.
models
.
on
ModelSaved
(
m
=>
onModelsSavedWorker
.
work
(
m
)));
this
.
_register
(
textFileService
.
models
.
on
DidSave
(
m
=>
onModelsSavedWorker
.
work
(
m
)));
}
const
lastSessionDate
=
storageService
.
get
(
LAST_SESSION_DATE_KEY
,
StorageScope
.
GLOBAL
,
new
Date
(
0
).
toDateString
());
...
...
src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts
浏览文件 @
ad41028d
...
...
@@ -124,8 +124,8 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr
this
.
_register
(
configurationTelemetry
(
telemetryService
,
configurationService
));
// Files Telemetry
this
.
_register
(
textFileService
.
models
.
on
ModelLoade
d
(
m
=>
this
.
onTextFileModelLoaded
(
m
)));
this
.
_register
(
textFileService
.
models
.
on
ModelSaved
(
m
=>
this
.
onTextFileModelSaved
(
m
)));
this
.
_register
(
textFileService
.
models
.
on
DidLoa
d
(
m
=>
this
.
onTextFileModelLoaded
(
m
)));
this
.
_register
(
textFileService
.
models
.
on
DidSave
(
m
=>
this
.
onTextFileModelSaved
(
m
)));
// Lifecycle
this
.
_register
(
lifecycleService
.
onShutdown
(()
=>
this
.
dispose
()));
...
...
src/vs/workbench/services/textfile/common/textFileEditorModel.ts
浏览文件 @
ad41028d
...
...
@@ -8,7 +8,7 @@ import { Emitter } from 'vs/base/common/event';
import
{
toErrorMessage
}
from
'
vs/base/common/errorMessage
'
;
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
{
assertIsDefined
}
from
'
vs/base/common/types
'
;
import
{
ITextFileService
,
ModelState
,
ITextFileEditorModel
,
ISaveErrorHandler
,
ISaveParticipant
,
StateChange
,
ITextFileStreamContent
,
ILoadOptions
,
IResolvedTextFileEditorModel
,
ITextFileSaveOptions
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
ModelState
,
ITextFileEditorModel
,
ISaveErrorHandler
,
ISaveParticipant
,
ITextFileStreamContent
,
ILoadOptions
,
IResolvedTextFileEditorModel
,
ITextFileSaveOptions
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
EncodingMode
,
IRevertOptions
,
SaveReason
}
from
'
vs/workbench/common/editor
'
;
import
{
BaseTextEditorModel
}
from
'
vs/workbench/common/editor/textEditorModel
'
;
import
{
IBackupFileService
}
from
'
vs/workbench/services/backup/common/backup
'
;
...
...
@@ -44,15 +44,34 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
private
static
saveParticipant
:
ISaveParticipant
|
null
;
static
setSaveParticipant
(
handler
:
ISaveParticipant
|
null
):
void
{
TextFileEditorModel
.
saveParticipant
=
handler
;
}
//#region Events
private
readonly
_onDidChangeContent
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidChangeContent
=
this
.
_onDidChangeContent
.
event
;
private
readonly
_onDidChangeState
=
this
.
_register
(
new
Emitter
<
StateChange
>
());
readonly
onDidChangeState
=
this
.
_onDidChangeState
.
event
;
private
readonly
_onDidLoad
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidLoad
=
this
.
_onDidLoad
.
event
;
private
readonly
_onDidSaveError
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidSaveError
=
this
.
_onDidSaveError
.
event
;
private
readonly
_onDidSave
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidSave
=
this
.
_onDidSave
.
event
;
private
readonly
_onDidRevert
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidRevert
=
this
.
_onDidRevert
.
event
;
private
readonly
_onDidChangeEncoding
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidChangeEncoding
=
this
.
_onDidChangeEncoding
.
event
;
private
readonly
_onDidChangeOrphaned
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidChangeOrphaned
=
this
.
_onDidChangeOrphaned
.
event
;
private
readonly
_onDidChangeDirty
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidChangeDirty
=
this
.
_onDidChangeDirty
.
event
;
//#endregion
readonly
capabilities
=
0
;
private
contentEncoding
:
string
|
undefined
;
// encoding as reported from disk
...
...
@@ -147,7 +166,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
private
setOrphaned
(
orphaned
:
boolean
):
void
{
if
(
this
.
inOrphanMode
!==
orphaned
)
{
this
.
inOrphanMode
=
orphaned
;
this
.
_onDidChange
State
.
fire
(
StateChange
.
ORPHANED_CHANGE
);
this
.
_onDidChange
Orphaned
.
fire
(
);
}
}
...
...
@@ -215,7 +234,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
}
// Emit file change event
this
.
_onDid
ChangeState
.
fire
(
StateChange
.
REVERTED
);
this
.
_onDid
Revert
.
fire
(
);
// Emit dirty change event
if
(
wasDirty
)
{
...
...
@@ -372,7 +391,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
if
(
this
.
preferredEncoding
)
{
this
.
updatePreferredEncoding
(
this
.
contentEncoding
);
// make sure to reflect the real encoding of the file (never out of sync)
}
else
if
(
oldEncoding
!==
this
.
contentEncoding
)
{
this
.
_onDidChange
State
.
fire
(
StateChange
.
ENCODING
);
this
.
_onDidChange
Encoding
.
fire
(
);
}
// Update Existing Model
...
...
@@ -386,7 +405,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
}
// Emit as event
this
.
_onDid
ChangeState
.
fire
(
StateChange
.
LOADED
);
this
.
_onDid
Load
.
fire
(
);
return
this
;
}
...
...
@@ -464,7 +483,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
// Emit event
if
(
wasDirty
)
{
this
.
_onDid
ChangeState
.
fire
(
StateChange
.
REVERTED
);
this
.
_onDid
Revert
.
fire
(
);
this
.
_onDidChangeDirty
.
fire
();
}
}
else
{
...
...
@@ -494,7 +513,6 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
// Emit as Event if we turned dirty
if
(
!
wasDirty
)
{
this
.
_onDidChangeState
.
fire
(
StateChange
.
DIRTY
);
this
.
_onDidChangeDirty
.
fire
();
}
}
...
...
@@ -657,7 +675,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
this
.
updateLastResolvedFileStat
(
stat
);
// Emit Events
this
.
_onDid
ChangeState
.
fire
(
StateChange
.
SAVED
);
this
.
_onDid
Save
.
fire
(
);
this
.
_onDidChangeDirty
.
fire
();
},
error
=>
{
this
.
logService
.
error
(
`[text file model] doSave(
${
versionId
}
) - exit - resulted in a save error:
${
error
.
toString
()}
`
,
this
.
resource
.
toString
());
...
...
@@ -674,7 +692,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
this
.
onSaveError
(
error
);
// Emit as event
this
.
_onDid
ChangeState
.
fire
(
StateChange
.
SAVE_ERROR
);
this
.
_onDid
SaveError
.
fire
(
);
}));
}));
}
...
...
@@ -695,7 +713,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
this
.
updateLastResolvedFileStat
(
stat
);
// Emit File Saved Event
this
.
_onDid
ChangeState
.
fire
(
StateChange
.
SAVED
);
this
.
_onDid
Save
.
fire
(
);
},
error
=>
onUnexpectedError
(
error
)
/* just log any error but do not notify the user since the file was not dirty */
));
}
...
...
@@ -850,7 +868,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
this
.
preferredEncoding
=
encoding
;
// Emit
this
.
_onDidChange
State
.
fire
(
StateChange
.
ENCODING
);
this
.
_onDidChange
Encoding
.
fire
(
);
}
private
isNewEncoding
(
encoding
:
string
|
undefined
):
boolean
{
...
...
src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts
浏览文件 @
ad41028d
...
...
@@ -6,8 +6,8 @@
import
{
Emitter
}
from
'
vs/base/common/event
'
;
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
{
TextFileEditorModel
}
from
'
vs/workbench/services/textfile/common/textFileEditorModel
'
;
import
{
dispose
,
IDisposable
,
Disposable
}
from
'
vs/base/common/lifecycle
'
;
import
{
ITextFileEditorModel
,
ITextFileEditorModelManager
,
StateChange
,
IModelLoadOrCreateOptions
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
dispose
,
IDisposable
,
Disposable
,
DisposableStore
}
from
'
vs/base/common/lifecycle
'
;
import
{
ITextFileEditorModel
,
ITextFileEditorModelManager
,
IModelLoadOrCreateOptions
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ILifecycleService
}
from
'
vs/platform/lifecycle/common/lifecycle
'
;
import
{
IInstantiationService
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
ResourceMap
}
from
'
vs/base/common/map
'
;
...
...
@@ -18,31 +18,30 @@ import { onUnexpectedError } from 'vs/base/common/errors';
export
class
TextFileEditorModelManager
extends
Disposable
implements
ITextFileEditorModelManager
{
private
readonly
_on
ModelLoade
d
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
ModelLoaded
=
this
.
_onModelLoade
d
.
event
;
private
readonly
_on
DidLoa
d
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
DidLoad
=
this
.
_onDidLoa
d
.
event
;
private
readonly
_on
Model
Dirty
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
ModelDirty
=
this
.
_onModel
Dirty
.
event
;
private
readonly
_on
DidChange
Dirty
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
DidChangeDirty
=
this
.
_onDidChange
Dirty
.
event
;
private
readonly
_on
Model
SaveError
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
ModelSaveError
=
this
.
_onModel
SaveError
.
event
;
private
readonly
_on
Did
SaveError
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
DidSaveError
=
this
.
_onDid
SaveError
.
event
;
private
readonly
_on
ModelSaved
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
ModelSaved
=
this
.
_onModelSaved
.
event
;
private
readonly
_on
DidSave
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
DidSave
=
this
.
_onDidSave
.
event
;
private
readonly
_on
ModelReverted
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
ModelReverted
=
this
.
_onModelReverted
.
event
;
private
readonly
_on
DidRevert
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
DidRevert
=
this
.
_onDidRevert
.
event
;
private
readonly
_on
ModelEncodingChanged
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
ModelEncodingChanged
=
this
.
_onModelEncodingChanged
.
event
;
private
readonly
_on
DidChangeEncoding
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
DidChangeEncoding
=
this
.
_onDidChangeEncoding
.
event
;
private
readonly
_on
ModelOrphanedChang
ed
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
ModelOrphanedChanged
=
this
.
_onModelOrphanedChang
ed
.
event
;
private
readonly
_on
DidChangeOrphan
ed
=
this
.
_register
(
new
Emitter
<
ITextFileEditorModel
>
());
readonly
on
DidChangeOrphaned
=
this
.
_onDidChangeOrphan
ed
.
event
;
private
readonly
mapResourceToDisposeListener
=
new
ResourceMap
<
IDisposable
>
();
private
readonly
mapResourceToStateChangeListener
=
new
ResourceMap
<
IDisposable
>
();
private
readonly
mapResourceToModelContentChangeListener
=
new
ResourceMap
<
IDisposable
>
();
private
readonly
mapResourceToModel
=
new
ResourceMap
<
ITextFileEditorModel
>
();
private
readonly
mapResourceToModelListeners
=
new
ResourceMap
<
IDisposable
>
();
private
readonly
mapResourceToDisposeListener
=
new
ResourceMap
<
IDisposable
>
();
private
readonly
mapResourceToPendingModelLoaders
=
new
ResourceMap
<
Promise
<
ITextFileEditorModel
>>
();
private
readonly
modelLoadQueue
=
new
ResourceQueue
();
...
...
@@ -128,32 +127,17 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
const
newModel
=
model
=
this
.
instantiationService
.
createInstance
(
TextFileEditorModel
,
resource
,
options
?
options
.
encoding
:
undefined
,
options
?
options
.
mode
:
undefined
);
modelPromise
=
model
.
load
(
options
);
// Install state change listener
this
.
mapResourceToStateChangeListener
.
set
(
resource
,
model
.
onDidChangeState
(
state
=>
{
switch
(
state
)
{
case
StateChange
.
LOADED
:
this
.
_onModelLoaded
.
fire
(
newModel
);
break
;
case
StateChange
.
DIRTY
:
this
.
_onModelDirty
.
fire
(
newModel
);
break
;
case
StateChange
.
SAVE_ERROR
:
this
.
_onModelSaveError
.
fire
(
newModel
);
break
;
case
StateChange
.
SAVED
:
this
.
_onModelSaved
.
fire
(
newModel
);
break
;
case
StateChange
.
REVERTED
:
this
.
_onModelReverted
.
fire
(
newModel
);
break
;
case
StateChange
.
ENCODING
:
this
.
_onModelEncodingChanged
.
fire
(
newModel
);
break
;
case
StateChange
.
ORPHANED_CHANGE
:
this
.
_onModelOrphanedChanged
.
fire
(
newModel
);
break
;
}
}));
// Install model listeners
const
listeners
=
new
DisposableStore
();
listeners
.
add
(
model
.
onDidLoad
(()
=>
this
.
_onDidLoad
.
fire
(
newModel
)));
listeners
.
add
(
model
.
onDidChangeDirty
(()
=>
this
.
_onDidChangeDirty
.
fire
(
newModel
)));
listeners
.
add
(
model
.
onDidSaveError
(()
=>
this
.
_onDidSaveError
.
fire
(
newModel
)));
listeners
.
add
(
model
.
onDidSave
(()
=>
this
.
_onDidSave
.
fire
(
newModel
)));
listeners
.
add
(
model
.
onDidRevert
(()
=>
this
.
_onDidRevert
.
fire
(
newModel
)));
listeners
.
add
(
model
.
onDidChangeEncoding
(()
=>
this
.
_onDidChangeEncoding
.
fire
(
newModel
)));
listeners
.
add
(
model
.
onDidChangeOrphaned
(()
=>
this
.
_onDidChangeOrphaned
.
fire
(
newModel
)));
this
.
mapResourceToModelListeners
.
set
(
resource
,
listeners
);
}
// Store pending loads to avoid race conditions
...
...
@@ -167,7 +151,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
// Model can be dirty if a backup was restored, so we make sure to have this event delivered
if
(
resolvedModel
.
isDirty
())
{
this
.
_on
Model
Dirty
.
fire
(
resolvedModel
);
this
.
_on
DidChange
Dirty
.
fire
(
resolvedModel
);
}
// Remove from pending loads
...
...
@@ -236,16 +220,10 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
this
.
mapResourceToDisposeListener
.
delete
(
resource
);
}
const
stateChangeListener
=
this
.
mapResourceToStateChangeListener
.
get
(
resource
);
if
(
stateChangeListener
)
{
dispose
(
stateChangeListener
);
this
.
mapResourceToStateChangeListener
.
delete
(
resource
);
}
const
modelContentChangeListener
=
this
.
mapResourceToModelContentChangeListener
.
get
(
resource
);
if
(
modelContentChangeListener
)
{
dispose
(
modelContentChangeListener
);
this
.
mapResourceToModelContentChangeListener
.
delete
(
resource
);
const
modelListener
=
this
.
mapResourceToModelListeners
.
get
(
resource
);
if
(
modelListener
)
{
dispose
(
modelListener
);
this
.
mapResourceToModelListeners
.
delete
(
resource
);
}
}
...
...
@@ -259,13 +237,9 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
this
.
mapResourceToDisposeListener
.
forEach
(
l
=>
l
.
dispose
());
this
.
mapResourceToDisposeListener
.
clear
();
// dispose the state change listeners
this
.
mapResourceToStateChangeListener
.
forEach
(
l
=>
l
.
dispose
());
this
.
mapResourceToStateChangeListener
.
clear
();
// dispose the model content change listeners
this
.
mapResourceToModelContentChangeListener
.
forEach
(
l
=>
l
.
dispose
());
this
.
mapResourceToModelContentChangeListener
.
clear
();
// dispose the model change listeners
this
.
mapResourceToModelListeners
.
forEach
(
l
=>
l
.
dispose
());
this
.
mapResourceToModelListeners
.
clear
();
}
disposeModel
(
model
:
TextFileEditorModel
):
void
{
...
...
src/vs/workbench/services/textfile/common/textfiles.ts
浏览文件 @
ad41028d
...
...
@@ -275,16 +275,6 @@ export const enum ModelState {
ERROR
}
export
const
enum
StateChange
{
LOADED
,
DIRTY
,
SAVE_ERROR
,
SAVED
,
REVERTED
,
ENCODING
,
ORPHANED_CHANGE
}
export
interface
ITextFileOperationResult
{
results
:
IResult
[];
}
...
...
@@ -362,14 +352,13 @@ export interface IModelLoadOrCreateOptions {
export
interface
ITextFileEditorModelManager
{
readonly
onModelEncodingChanged
:
Event
<
ITextFileEditorModel
>
;
readonly
onModelOrphanedChanged
:
Event
<
ITextFileEditorModel
>
;
readonly
onModelLoaded
:
Event
<
ITextFileEditorModel
>
;
readonly
onModelDirty
:
Event
<
ITextFileEditorModel
>
;
readonly
onModelSaveError
:
Event
<
ITextFileEditorModel
>
;
readonly
onModelSaved
:
Event
<
ITextFileEditorModel
>
;
readonly
onModelReverted
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidLoad
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidChangeDirty
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidSaveError
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidSave
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidRevert
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidChangeEncoding
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidChangeOrphaned
:
Event
<
ITextFileEditorModel
>
;
get
(
resource
:
URI
):
ITextFileEditorModel
|
undefined
;
...
...
@@ -407,7 +396,13 @@ export interface ILoadOptions {
export
interface
ITextFileEditorModel
extends
ITextEditorModel
,
IEncodingSupport
,
IModeSupport
,
IWorkingCopy
{
readonly
onDidChangeState
:
Event
<
StateChange
>
;
readonly
onDidChangeContent
:
Event
<
void
>
;
readonly
onDidLoad
:
Event
<
void
>
;
readonly
onDidSaveError
:
Event
<
void
>
;
readonly
onDidSave
:
Event
<
void
>
;
readonly
onDidRevert
:
Event
<
void
>
;
readonly
onDidChangeEncoding
:
Event
<
void
>
;
readonly
onDidChangeOrphaned
:
Event
<
void
>
;
hasState
(
state
:
ModelState
):
boolean
;
...
...
src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts
浏览文件 @
ad41028d
...
...
@@ -7,7 +7,7 @@ import * as assert from 'assert';
import
{
IInstantiationService
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
EncodingMode
}
from
'
vs/workbench/common/editor
'
;
import
{
TextFileEditorModel
}
from
'
vs/workbench/services/textfile/common/textFileEditorModel
'
;
import
{
ITextFileService
,
ModelState
,
StateChange
,
snapshotToString
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
ModelState
,
snapshotToString
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
workbenchInstantiationService
,
TestTextFileService
,
createFileInput
,
TestFileService
}
from
'
vs/workbench/test/workbenchTestServices
'
;
import
{
toResource
}
from
'
vs/base/test/common/utils
'
;
import
{
TextFileEditorModelManager
}
from
'
vs/workbench/services/textfile/common/textFileEditorModelManager
'
;
...
...
@@ -95,10 +95,8 @@ suite('Files - TextFileEditorModel', () => {
assert
.
equal
(
accessor
.
workingCopyService
.
isDirty
(
model
.
resource
),
true
);
let
savedEvent
=
false
;
model
.
onDidChangeState
(
e
=>
{
if
(
e
===
StateChange
.
SAVED
)
{
savedEvent
=
true
;
}
model
.
onDidSave
(
e
=>
{
savedEvent
=
true
;
});
let
workingCopyEvent
=
false
;
...
...
@@ -132,10 +130,8 @@ suite('Files - TextFileEditorModel', () => {
await
model
.
load
();
let
savedEvent
=
false
;
model
.
onDidChangeState
(
e
=>
{
if
(
e
===
StateChange
.
SAVED
)
{
savedEvent
=
true
;
}
model
.
onDidSave
(
e
=>
{
savedEvent
=
true
;
});
let
workingCopyEvent
=
false
;
...
...
@@ -206,8 +202,12 @@ suite('Files - TextFileEditorModel', () => {
const
model
=
instantiationService
.
createInstance
(
TextFileEditorModel
,
toResource
.
call
(
this
,
'
/path/index.txt
'
),
'
utf8
'
,
undefined
);
assert
.
ok
(
model
.
hasState
(
ModelState
.
SAVED
));
model
.
onDidChangeState
(
e
=>
{
assert
.
ok
(
e
!==
StateChange
.
DIRTY
&&
e
!==
StateChange
.
SAVED
);
model
.
onDidSave
(
e
=>
{
assert
.
fail
();
});
model
.
onDidChangeDirty
(
e
=>
{
assert
.
fail
();
});
await
model
.
load
();
...
...
@@ -234,10 +234,8 @@ suite('Files - TextFileEditorModel', () => {
const
model
=
instantiationService
.
createInstance
(
TextFileEditorModel
,
toResource
.
call
(
this
,
'
/path/index_async.txt
'
),
'
utf8
'
,
undefined
);
model
.
onDidChangeState
(
e
=>
{
if
(
e
===
StateChange
.
REVERTED
)
{
eventCounter
++
;
}
model
.
onDidRevert
(
e
=>
{
eventCounter
++
;
});
let
workingCopyEvent
=
false
;
...
...
@@ -271,10 +269,8 @@ suite('Files - TextFileEditorModel', () => {
const
model
=
instantiationService
.
createInstance
(
TextFileEditorModel
,
toResource
.
call
(
this
,
'
/path/index_async.txt
'
),
'
utf8
'
,
undefined
);
model
.
onDidChangeState
(
e
=>
{
if
(
e
===
StateChange
.
REVERTED
)
{
eventCounter
++
;
}
model
.
onDidRevert
(
e
=>
{
eventCounter
++
;
});
let
workingCopyEvent
=
false
;
...
...
@@ -331,10 +327,8 @@ suite('Files - TextFileEditorModel', () => {
await
model
.
revert
({
soft
:
true
});
assert
.
ok
(
!
model
.
isDirty
());
model
.
onDidChangeState
(
e
=>
{
if
(
e
===
StateChange
.
DIRTY
)
{
eventCounter
++
;
}
model
.
onDidChangeDirty
(
e
=>
{
eventCounter
++
;
});
let
workingCopyEvent
=
false
;
...
...
@@ -416,12 +410,10 @@ suite('Files - TextFileEditorModel', () => {
let
eventCounter
=
0
;
const
model
:
TextFileEditorModel
=
instantiationService
.
createInstance
(
TextFileEditorModel
,
toResource
.
call
(
this
,
'
/path/index_async.txt
'
),
'
utf8
'
,
undefined
);
model
.
onDidChangeState
(
e
=>
{
if
(
e
===
StateChange
.
SAVED
)
{
assert
.
equal
(
snapshotToString
(
model
.
createSnapshot
()
!
),
'
bar
'
);
assert
.
ok
(
!
model
.
isDirty
());
eventCounter
++
;
}
model
.
onDidSave
(
e
=>
{
assert
.
equal
(
snapshotToString
(
model
.
createSnapshot
()
!
),
'
bar
'
);
assert
.
ok
(
!
model
.
isDirty
());
eventCounter
++
;
});
TextFileEditorModel
.
setSaveParticipant
({
...
...
src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts
浏览文件 @
ad41028d
...
...
@@ -127,7 +127,7 @@ suite('Files - TextFileEditorModelManager', () => {
model3
.
dispose
();
});
test
(
'
events
'
,
async
function
()
{
test
(
'
pasero
events
'
,
async
function
()
{
const
manager
:
TextFileEditorModelManager
=
instantiationService
.
createInstance
(
TextFileEditorModelManager
);
const
resource1
=
toResource
.
call
(
this
,
'
/path/index.txt
'
);
...
...
@@ -139,31 +139,31 @@ suite('Files - TextFileEditorModelManager', () => {
let
savedCounter
=
0
;
let
encodingCounter
=
0
;
manager
.
on
ModelLoade
d
(
model
=>
{
manager
.
on
DidLoa
d
(
model
=>
{
if
(
model
.
resource
.
toString
()
===
resource1
.
toString
())
{
loadedCounter
++
;
}
});
manager
.
on
Model
Dirty
(
model
=>
{
manager
.
on
DidChange
Dirty
(
model
=>
{
if
(
model
.
resource
.
toString
()
===
resource1
.
toString
())
{
dirtyCounter
++
;
}
});
manager
.
on
ModelReverted
(
model
=>
{
manager
.
on
DidRevert
(
model
=>
{
if
(
model
.
resource
.
toString
()
===
resource1
.
toString
())
{
revertedCounter
++
;
}
});
manager
.
on
ModelSaved
(
model
=>
{
manager
.
on
DidSave
(
model
=>
{
if
(
model
.
resource
.
toString
()
===
resource1
.
toString
())
{
savedCounter
++
;
}
});
manager
.
on
ModelEncodingChanged
(
model
=>
{
manager
.
on
DidChangeEncoding
(
model
=>
{
if
(
model
.
resource
.
toString
()
===
resource1
.
toString
())
{
encodingCounter
++
;
}
...
...
@@ -189,7 +189,7 @@ suite('Files - TextFileEditorModelManager', () => {
model2
.
dispose
();
await
model1
.
revert
();
assert
.
equal
(
dirtyCounter
,
2
);
assert
.
equal
(
dirtyCounter
,
4
);
assert
.
equal
(
revertedCounter
,
1
);
assert
.
equal
(
savedCounter
,
1
);
assert
.
equal
(
encodingCounter
,
2
);
...
...
src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts
浏览文件 @
ad41028d
...
...
@@ -49,9 +49,9 @@ suite('MainThreadDocumentsAndEditors', () => {
textFileService
=
new
class
extends
mock
<
ITextFileService
>
()
{
isDirty
()
{
return
false
;
}
models
=
<
any
>
{
on
ModelSaved
:
Event
.
None
,
on
ModelReverted
:
Event
.
None
,
on
ModelDirty
:
Event
.
None
,
on
DidSave
:
Event
.
None
,
on
DidRevert
:
Event
.
None
,
on
DidChangeDirty
:
Event
.
None
};
};
const
workbenchEditorService
=
new
TestEditorService
();
...
...
src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts
浏览文件 @
ad41028d
...
...
@@ -73,9 +73,9 @@ suite('MainThreadEditors', () => {
return
Promise
.
resolve
(
Object
.
create
(
null
));
}
models
=
<
any
>
{
on
ModelSaved
:
Event
.
None
,
on
ModelReverted
:
Event
.
None
,
on
ModelDirty
:
Event
.
None
,
on
DidSave
:
Event
.
None
,
on
DidRevert
:
Event
.
None
,
on
DidChangeDirty
:
Event
.
None
};
};
const
workbenchEditorService
=
new
TestEditorService
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录