Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
1311b224
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,发现更多精彩内容 >>
提交
1311b224
编写于
2月 19, 2020
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
text files -
💄
names
上级
1233630e
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
122 addition
and
104 deletion
+122
-104
src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts
...kbench/contrib/files/browser/editors/fileEditorTracker.ts
+2
-2
src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts
...workbench/contrib/files/common/editors/fileEditorInput.ts
+4
-4
src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts
...bench/contrib/telemetry/browser/telemetry.contribution.ts
+3
-3
src/vs/workbench/services/textfile/browser/browserTextFileService.ts
...bench/services/textfile/browser/browserTextFileService.ts
+2
-2
src/vs/workbench/services/textfile/common/textFileEditorModel.ts
...workbench/services/textfile/common/textFileEditorModel.ts
+15
-15
src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts
...ch/services/textfile/common/textFileEditorModelManager.ts
+27
-27
src/vs/workbench/services/textfile/common/textfiles.ts
src/vs/workbench/services/textfile/common/textfiles.ts
+57
-39
src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts
...ervices/textfile/test/browser/textFileEditorModel.test.ts
+10
-10
src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts
...ices/textmodelResolver/common/textModelResolverService.ts
+2
-2
未找到文件。
src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts
浏览文件 @
1311b224
...
...
@@ -7,7 +7,7 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
{
IEditorViewState
}
from
'
vs/editor/common/editorCommon
'
;
import
{
toResource
,
SideBySideEditorInput
,
IWorkbenchEditorConfiguration
,
SideBySideEditor
as
SideBySideEditorChoice
}
from
'
vs/workbench/common/editor
'
;
import
{
ITextFileService
,
ModelState
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
TextFileEditor
ModelState
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
FileOperationEvent
,
FileOperation
,
IFileService
,
FileChangeType
,
FileChangesEvent
,
FileSystemProviderCapabilities
}
from
'
vs/platform/files/common/files
'
;
import
{
FileEditorInput
}
from
'
vs/workbench/contrib/files/common/editors/fileEditorInput
'
;
import
{
ILifecycleService
}
from
'
vs/platform/lifecycle/common/lifecycle
'
;
...
...
@@ -285,7 +285,7 @@ export class FileEditorTracker extends Disposable implements IWorkbenchContribut
}
const
model
=
this
.
textFileService
.
files
.
get
(
resource
);
if
(
model
?.
hasState
(
ModelState
.
PENDING_SAVE
))
{
if
(
model
?.
hasState
(
TextFileEditor
ModelState
.
PENDING_SAVE
))
{
return
false
;
// resource must not be pending to save
}
...
...
src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts
浏览文件 @
1311b224
...
...
@@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri';
import
{
EncodingMode
,
IFileEditorInput
,
Verbosity
,
TextResourceEditorInput
}
from
'
vs/workbench/common/editor
'
;
import
{
BinaryEditorModel
}
from
'
vs/workbench/common/editor/binaryEditorModel
'
;
import
{
FileOperationError
,
FileOperationResult
,
IFileService
}
from
'
vs/platform/files/common/files
'
;
import
{
ITextFileService
,
ModelState
,
LoadReason
,
TextFileOperationError
,
TextFileOperationResult
,
ITextFileEditorModel
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
TextFileEditorModelState
,
TextFile
LoadReason
,
TextFileOperationError
,
TextFileOperationResult
,
ITextFileEditorModel
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
IInstantiationService
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
IReference
,
dispose
,
DisposableStore
}
from
'
vs/base/common/lifecycle
'
;
import
{
ITextModelService
}
from
'
vs/editor/common/services/resolverService
'
;
...
...
@@ -174,7 +174,7 @@ export class FileEditorInput extends TextResourceEditorInput implements IFileEdi
}
private
decorateLabel
(
label
:
string
):
string
{
const
orphaned
=
this
.
model
?.
hasState
(
ModelState
.
ORPHAN
);
const
orphaned
=
this
.
model
?.
hasState
(
TextFileEditor
ModelState
.
ORPHAN
);
const
readonly
=
this
.
isReadonly
();
if
(
orphaned
&&
readonly
)
{
...
...
@@ -205,7 +205,7 @@ export class FileEditorInput extends TextResourceEditorInput implements IFileEdi
}
isSaving
():
boolean
{
if
(
this
.
model
?.
hasState
(
ModelState
.
SAVED
)
||
this
.
model
?.
hasState
(
ModelState
.
CONFLICT
)
||
this
.
model
?.
hasState
(
ModelState
.
ERROR
))
{
if
(
this
.
model
?.
hasState
(
TextFileEditorModelState
.
SAVED
)
||
this
.
model
?.
hasState
(
TextFileEditorModelState
.
CONFLICT
)
||
this
.
model
?.
hasState
(
TextFileEditor
ModelState
.
ERROR
))
{
return
false
;
// require the model to be dirty and not in conflict or error state
}
...
...
@@ -241,7 +241,7 @@ export class FileEditorInput extends TextResourceEditorInput implements IFileEdi
encoding
:
this
.
preferredEncoding
,
reload
:
{
async
:
true
},
// trigger a reload of the model if it exists already but do not wait to show the model
allowBinary
:
this
.
forceOpenAs
===
ForceOpenAs
.
Text
,
reason
:
LoadReason
.
EDITOR
reason
:
TextFile
LoadReason
.
EDITOR
});
// This is a bit ugly, because we first resolve the model and then resolve a model reference. the reason being that binary
...
...
src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts
浏览文件 @
1311b224
...
...
@@ -19,7 +19,7 @@ import ErrorTelemetry from 'vs/platform/telemetry/browser/errorTelemetry';
import
{
configurationTelemetry
}
from
'
vs/platform/telemetry/common/telemetryUtils
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
IViewletService
}
from
'
vs/workbench/services/viewlet/browser/viewlet
'
;
import
{
ITextFileService
,
ITextFile
ModelSaveEvent
,
ITextFileModel
LoadEvent
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
ITextFile
SaveEvent
,
ITextFile
LoadEvent
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
extname
,
basename
,
isEqual
,
isEqualOrParent
,
joinPath
}
from
'
vs/base/common/resources
'
;
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
{
Schemas
}
from
'
vs/base/common/network
'
;
...
...
@@ -131,7 +131,7 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr
this
.
_register
(
lifecycleService
.
onShutdown
(()
=>
this
.
dispose
()));
}
private
onTextFileModelLoaded
(
e
:
ITextFile
Model
LoadEvent
):
void
{
private
onTextFileModelLoaded
(
e
:
ITextFileLoadEvent
):
void
{
const
settingsType
=
this
.
getTypeIfSettings
(
e
.
model
.
resource
);
if
(
settingsType
)
{
type
SettingsReadClassification
=
{
...
...
@@ -146,7 +146,7 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr
}
}
private
onTextFileModelSaved
(
e
:
ITextFile
Model
SaveEvent
):
void
{
private
onTextFileModelSaved
(
e
:
ITextFileSaveEvent
):
void
{
const
settingsType
=
this
.
getTypeIfSettings
(
e
.
model
.
resource
);
if
(
settingsType
)
{
type
SettingsWrittenClassification
=
{
...
...
src/vs/workbench/services/textfile/browser/browserTextFileService.ts
浏览文件 @
1311b224
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import
{
AbstractTextFileService
}
from
'
vs/workbench/services/textfile/browser/textFileService
'
;
import
{
ITextFileService
,
IResourceEncodings
,
IResourceEncoding
,
ModelState
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
IResourceEncodings
,
IResourceEncoding
,
TextFileEditor
ModelState
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
registerSingleton
}
from
'
vs/platform/instantiation/common/extensions
'
;
import
{
ShutdownReason
}
from
'
vs/platform/lifecycle/common/lifecycle
'
;
...
...
@@ -24,7 +24,7 @@ export class BrowserTextFileService extends AbstractTextFileService {
}
protected
onBeforeShutdown
(
reason
:
ShutdownReason
):
boolean
{
if
(
this
.
files
.
models
.
some
(
model
=>
model
.
hasState
(
ModelState
.
PENDING_SAVE
)))
{
if
(
this
.
files
.
models
.
some
(
model
=>
model
.
hasState
(
TextFileEditor
ModelState
.
PENDING_SAVE
)))
{
console
.
warn
(
'
Unload prevented: pending file saves
'
);
return
true
;
// files are pending to be saved: veto
...
...
src/vs/workbench/services/textfile/common/textFileEditorModel.ts
浏览文件 @
1311b224
...
...
@@ -7,7 +7,7 @@ import * as nls from 'vs/nls';
import
{
Emitter
}
from
'
vs/base/common/event
'
;
import
{
URI
}
from
'
vs/base/common/uri
'
;
import
{
assertIsDefined
,
withNullAsUndefined
}
from
'
vs/base/common/types
'
;
import
{
ITextFileService
,
ModelState
,
ITextFileEditorModel
,
ITextFileStreamContent
,
ILoadOptions
,
IResolvedTextFileEditorModel
,
ITextFileSaveOptions
,
LoadReason
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
TextFileEditorModelState
,
ITextFileEditorModel
,
ITextFileStreamContent
,
ITextFileLoadOptions
,
IResolvedTextFileEditorModel
,
ITextFileSaveOptions
,
TextFile
LoadReason
}
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
,
IResolvedBackup
}
from
'
vs/workbench/services/backup/common/backup
'
;
...
...
@@ -43,7 +43,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
private
readonly
_onDidChangeContent
=
this
.
_register
(
new
Emitter
<
void
>
());
readonly
onDidChangeContent
=
this
.
_onDidChangeContent
.
event
;
private
readonly
_onDidLoad
=
this
.
_register
(
new
Emitter
<
LoadReason
>
());
private
readonly
_onDidLoad
=
this
.
_register
(
new
Emitter
<
TextFile
LoadReason
>
());
readonly
onDidLoad
=
this
.
_onDidLoad
.
event
;
private
readonly
_onDidChangeDirty
=
this
.
_register
(
new
Emitter
<
void
>
());
...
...
@@ -248,7 +248,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
//#region Load
async
load
(
options
?:
I
LoadOptions
):
Promise
<
I
TextFileEditorModel
>
{
async
load
(
options
?:
I
TextFileLoadOptions
):
Promise
<
TextFileEditorModel
>
{
this
.
logService
.
trace
(
'
[text file model] load() - enter
'
,
this
.
resource
.
toString
());
// It is very important to not reload the model when the model is dirty.
...
...
@@ -281,7 +281,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
return
this
.
loadFromFile
(
options
);
}
private
async
loadFromBackup
(
backup
:
IResolvedBackup
<
IBackupMetaData
>
,
options
?:
ILoadOptions
):
Promise
<
TextFileEditorModel
>
{
private
async
loadFromBackup
(
backup
:
IResolvedBackup
<
IBackupMetaData
>
,
options
?:
I
TextFile
LoadOptions
):
Promise
<
TextFileEditorModel
>
{
// Load with backup
this
.
loadFromContent
({
...
...
@@ -303,7 +303,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
return
this
;
}
private
async
loadFromFile
(
options
?:
ILoadOptions
):
Promise
<
TextFileEditorModel
>
{
private
async
loadFromFile
(
options
?:
I
TextFile
LoadOptions
):
Promise
<
TextFileEditorModel
>
{
const
forceReadFromDisk
=
options
?.
forceReadFromDisk
;
const
allowBinary
=
this
.
isResolved
()
/* always allow if we resolved previously */
||
options
?.
allowBinary
;
...
...
@@ -358,7 +358,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
}
}
private
loadFromContent
(
content
:
ITextFileStreamContent
,
options
?:
ILoadOptions
,
fromBackup
?:
boolean
):
TextFileEditorModel
{
private
loadFromContent
(
content
:
ITextFileStreamContent
,
options
?:
I
TextFile
LoadOptions
,
fromBackup
?:
boolean
):
TextFileEditorModel
{
this
.
logService
.
trace
(
'
[text file model] load() - resolved content
'
,
this
.
resource
.
toString
());
// Update our resolved disk stat model
...
...
@@ -396,7 +396,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
}
// Emit as event
this
.
_onDidLoad
.
fire
(
options
?.
reason
??
LoadReason
.
OTHER
);
this
.
_onDidLoad
.
fire
(
options
?.
reason
??
TextFile
LoadReason
.
OTHER
);
return
this
;
}
...
...
@@ -544,7 +544,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
}
if
(
(
this
.
hasState
(
ModelState
.
CONFLICT
)
||
this
.
hasState
(
ModelState
.
ERROR
))
&&
(
this
.
hasState
(
TextFileEditorModelState
.
CONFLICT
)
||
this
.
hasState
(
TextFileEditor
ModelState
.
ERROR
))
&&
(
options
.
reason
===
SaveReason
.
AUTO
||
options
.
reason
===
SaveReason
.
FOCUS_CHANGE
||
options
.
reason
===
SaveReason
.
WINDOW_CHANGE
)
)
{
this
.
logService
.
trace
(
'
[text file model] save() - ignoring auto save request for model that is in conflict or error
'
,
this
.
resource
.
toString
());
...
...
@@ -794,19 +794,19 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil
//#endregion
hasState
(
state
:
ModelState
):
boolean
{
hasState
(
state
:
TextFileEditor
ModelState
):
boolean
{
switch
(
state
)
{
case
ModelState
.
CONFLICT
:
case
TextFileEditor
ModelState
.
CONFLICT
:
return
this
.
inConflictMode
;
case
ModelState
.
DIRTY
:
case
TextFileEditor
ModelState
.
DIRTY
:
return
this
.
dirty
;
case
ModelState
.
ERROR
:
case
TextFileEditor
ModelState
.
ERROR
:
return
this
.
inErrorMode
;
case
ModelState
.
ORPHAN
:
case
TextFileEditor
ModelState
.
ORPHAN
:
return
this
.
inOrphanMode
;
case
ModelState
.
PENDING_SAVE
:
case
TextFileEditor
ModelState
.
PENDING_SAVE
:
return
this
.
saveSequentializer
.
hasPending
();
case
ModelState
.
SAVED
:
case
TextFileEditor
ModelState
.
SAVED
:
return
!
this
.
dirty
;
}
}
...
...
src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts
浏览文件 @
1311b224
...
...
@@ -9,7 +9,7 @@ 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
,
DisposableStore
}
from
'
vs/base/common/lifecycle
'
;
import
{
ITextFileEditorModel
,
ITextFileEditorModelManager
,
I
ModelLoadOrCreateOptions
,
ITextFileModelLoadEvent
,
ITextFileModel
SaveEvent
,
ITextFileSaveParticipant
,
IResolvedTextFileEditorModel
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileEditorModel
,
ITextFileEditorModelManager
,
I
TextFileEditorModelLoadOrCreateOptions
,
ITextFileLoadEvent
,
ITextFile
SaveEvent
,
ITextFileSaveParticipant
,
IResolvedTextFileEditorModel
}
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
'
;
...
...
@@ -29,31 +29,31 @@ import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry';
export
class
TextFileEditorModelManager
extends
Disposable
implements
ITextFileEditorModelManager
{
private
readonly
_onDidCreate
=
this
.
_register
(
new
Emitter
<
I
TextFileEditorModel
>
());
private
readonly
_onDidCreate
=
this
.
_register
(
new
Emitter
<
TextFileEditorModel
>
());
readonly
onDidCreate
=
this
.
_onDidCreate
.
event
;
private
readonly
_onDidLoad
=
this
.
_register
(
new
Emitter
<
ITextFile
Model
LoadEvent
>
());
private
readonly
_onDidLoad
=
this
.
_register
(
new
Emitter
<
ITextFileLoadEvent
>
());
readonly
onDidLoad
=
this
.
_onDidLoad
.
event
;
private
readonly
_onDidChangeDirty
=
this
.
_register
(
new
Emitter
<
I
TextFileEditorModel
>
());
private
readonly
_onDidChangeDirty
=
this
.
_register
(
new
Emitter
<
TextFileEditorModel
>
());
readonly
onDidChangeDirty
=
this
.
_onDidChangeDirty
.
event
;
private
readonly
_onDidSaveError
=
this
.
_register
(
new
Emitter
<
I
TextFileEditorModel
>
());
private
readonly
_onDidSaveError
=
this
.
_register
(
new
Emitter
<
TextFileEditorModel
>
());
readonly
onDidSaveError
=
this
.
_onDidSaveError
.
event
;
private
readonly
_onDidSave
=
this
.
_register
(
new
Emitter
<
ITextFile
Model
SaveEvent
>
());
private
readonly
_onDidSave
=
this
.
_register
(
new
Emitter
<
ITextFileSaveEvent
>
());
readonly
onDidSave
=
this
.
_onDidSave
.
event
;
private
readonly
_onDidRevert
=
this
.
_register
(
new
Emitter
<
I
TextFileEditorModel
>
());
private
readonly
_onDidRevert
=
this
.
_register
(
new
Emitter
<
TextFileEditorModel
>
());
readonly
onDidRevert
=
this
.
_onDidRevert
.
event
;
private
readonly
_onDidChangeEncoding
=
this
.
_register
(
new
Emitter
<
I
TextFileEditorModel
>
());
private
readonly
_onDidChangeEncoding
=
this
.
_register
(
new
Emitter
<
TextFileEditorModel
>
());
readonly
onDidChangeEncoding
=
this
.
_onDidChangeEncoding
.
event
;
private
readonly
mapResourceToModel
=
new
ResourceMap
<
I
TextFileEditorModel
>
();
private
readonly
mapResourceToModel
=
new
ResourceMap
<
TextFileEditorModel
>
();
private
readonly
mapResourceToModelListeners
=
new
ResourceMap
<
IDisposable
>
();
private
readonly
mapResourceToDisposeListener
=
new
ResourceMap
<
IDisposable
>
();
private
readonly
mapResourceToPendingModelLoaders
=
new
ResourceMap
<
Promise
<
I
TextFileEditorModel
>>
();
private
readonly
mapResourceToPendingModelLoaders
=
new
ResourceMap
<
Promise
<
TextFileEditorModel
>>
();
private
readonly
modelLoadQueue
=
this
.
_register
(
new
ResourceQueue
());
...
...
@@ -67,7 +67,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
};
})();
get
models
():
I
TextFileEditorModel
[]
{
get
models
():
TextFileEditorModel
[]
{
return
this
.
mapResourceToModel
.
values
();
}
...
...
@@ -111,7 +111,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
).
forEach
(
model
=>
this
.
queueModelLoad
(
model
));
}
private
queueModelLoad
(
model
:
I
TextFileEditorModel
):
void
{
private
queueModelLoad
(
model
:
TextFileEditorModel
):
void
{
// Load model to update (use a queue to prevent accumulation of loads
// when the load actually takes long. At most we only want the queue
...
...
@@ -137,8 +137,8 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
if
(
source
&&
(
e
.
operation
===
FileOperation
.
COPY
||
e
.
operation
===
FileOperation
.
MOVE
))
{
// find all models that related to either source or target (can be many if resource is a folder)
const
sourceModels
:
I
TextFileEditorModel
[]
=
[];
const
targetModels
:
I
TextFileEditorModel
[]
=
[];
const
sourceModels
:
TextFileEditorModel
[]
=
[];
const
targetModels
:
TextFileEditorModel
[]
=
[];
for
(
const
model
of
this
.
models
)
{
const
resource
=
model
.
resource
;
...
...
@@ -238,11 +238,11 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
}
}
get
(
resource
:
URI
):
I
TextFileEditorModel
|
undefined
{
get
(
resource
:
URI
):
TextFileEditorModel
|
undefined
{
return
this
.
mapResourceToModel
.
get
(
resource
);
}
async
resolve
(
resource
:
URI
,
options
?:
I
ModelLoadOrCreateOptions
):
Promise
<
I
TextFileEditorModel
>
{
async
resolve
(
resource
:
URI
,
options
?:
I
TextFileEditorModelLoadOrCreateOptions
):
Promise
<
TextFileEditorModel
>
{
// Return early if model is currently being loaded
const
pendingLoad
=
this
.
mapResourceToPendingModelLoaders
.
get
(
resource
);
...
...
@@ -250,7 +250,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
return
pendingLoad
;
}
let
modelPromise
:
Promise
<
I
TextFileEditorModel
>
;
let
modelPromise
:
Promise
<
TextFileEditorModel
>
;
let
model
=
this
.
get
(
resource
);
let
didCreateModel
=
false
;
...
...
@@ -281,15 +281,15 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
modelPromise
=
model
.
load
(
options
);
// Install model listeners
const
l
isteners
=
new
DisposableStore
();
l
isteners
.
add
(
model
.
onDidLoad
(
reason
=>
this
.
_onDidLoad
.
fire
({
model
:
newModel
,
reason
})));
l
isteners
.
add
(
model
.
onDidChangeDirty
(()
=>
this
.
_onDidChangeDirty
.
fire
(
newModel
)));
l
isteners
.
add
(
model
.
onDidSaveError
(()
=>
this
.
_onDidSaveError
.
fire
(
newModel
)));
l
isteners
.
add
(
model
.
onDidSave
(
reason
=>
this
.
_onDidSave
.
fire
({
model
:
newModel
,
reason
})));
l
isteners
.
add
(
model
.
onDidRevert
(()
=>
this
.
_onDidRevert
.
fire
(
newModel
)));
l
isteners
.
add
(
model
.
onDidChangeEncoding
(()
=>
this
.
_onDidChangeEncoding
.
fire
(
newModel
)));
this
.
mapResourceToModelListeners
.
set
(
resource
,
l
isteners
);
const
modelL
isteners
=
new
DisposableStore
();
modelL
isteners
.
add
(
model
.
onDidLoad
(
reason
=>
this
.
_onDidLoad
.
fire
({
model
:
newModel
,
reason
})));
modelL
isteners
.
add
(
model
.
onDidChangeDirty
(()
=>
this
.
_onDidChangeDirty
.
fire
(
newModel
)));
modelL
isteners
.
add
(
model
.
onDidSaveError
(()
=>
this
.
_onDidSaveError
.
fire
(
newModel
)));
modelL
isteners
.
add
(
model
.
onDidSave
(
reason
=>
this
.
_onDidSave
.
fire
({
model
:
newModel
,
reason
})));
modelL
isteners
.
add
(
model
.
onDidRevert
(()
=>
this
.
_onDidRevert
.
fire
(
newModel
)));
modelL
isteners
.
add
(
model
.
onDidChangeEncoding
(()
=>
this
.
_onDidChangeEncoding
.
fire
(
newModel
)));
this
.
mapResourceToModelListeners
.
set
(
resource
,
modelL
isteners
);
}
// Store pending loads to avoid race conditions
...
...
@@ -335,7 +335,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE
}
}
add
(
resource
:
URI
,
model
:
I
TextFileEditorModel
):
void
{
add
(
resource
:
URI
,
model
:
TextFileEditorModel
):
void
{
const
knownModel
=
this
.
mapResourceToModel
.
get
(
resource
);
if
(
knownModel
===
model
)
{
return
;
// already cached
...
...
src/vs/workbench/services/textfile/common/textfiles.ts
浏览文件 @
1311b224
...
...
@@ -161,13 +161,18 @@ export const enum TextFileOperationResult {
}
export
class
TextFileOperationError
extends
FileOperationError
{
constructor
(
message
:
string
,
public
textFileOperationResult
:
TextFileOperationResult
,
public
options
?:
IReadTextFileOptions
&
IWriteTextFileOptions
)
{
super
(
message
,
FileOperationResult
.
FILE_OTHER_ERROR
);
}
static
isTextFileOperationError
(
obj
:
unknown
):
obj
is
TextFileOperationError
{
return
obj
instanceof
Error
&&
!
isUndefinedOrNull
((
obj
as
TextFileOperationError
).
textFileOperationResult
);
}
constructor
(
message
:
string
,
public
textFileOperationResult
:
TextFileOperationResult
,
public
options
?:
IReadTextFileOptions
&
IWriteTextFileOptions
)
{
super
(
message
,
FileOperationResult
.
FILE_OTHER_ERROR
);
}
}
export
interface
IResourceEncodings
{
...
...
@@ -193,7 +198,7 @@ export interface ISaveErrorHandler {
/**
* States the text file editor model can be in.
*/
export
const
enum
ModelState
{
export
const
enum
TextFileEditor
ModelState
{
/**
* A model is saved.
...
...
@@ -228,17 +233,7 @@ export const enum ModelState {
ERROR
}
export
interface
ITextFileOperationResult
{
results
:
IResult
[];
}
export
interface
IResult
{
source
:
URI
;
target
?:
URI
;
error
?:
boolean
;
}
export
const
enum
LoadReason
{
export
const
enum
TextFileLoadReason
{
EDITOR
=
1
,
REFERENCE
=
2
,
OTHER
=
3
...
...
@@ -268,12 +263,12 @@ export interface ITextFileStreamContent extends IBaseTextFileContent {
value
:
ITextBufferFactory
;
}
export
interface
IModelLoadOrCreateOptions
{
export
interface
I
TextFileEditor
ModelLoadOrCreateOptions
{
/**
* Context why the model is being loaded or created.
*/
reason
?:
LoadReason
;
reason
?:
TextFile
LoadReason
;
/**
* The language mode to use for the model text content.
...
...
@@ -303,14 +298,14 @@ export interface IModelLoadOrCreateOptions {
allowBinary
?:
boolean
;
}
export
interface
ITextFile
Model
SaveEvent
{
export
interface
ITextFileSaveEvent
{
model
:
ITextFileEditorModel
;
reason
:
SaveReason
;
}
export
interface
ITextFile
Model
LoadEvent
{
export
interface
ITextFileLoadEvent
{
model
:
ITextFileEditorModel
;
reason
:
LoadReason
;
reason
:
TextFile
LoadReason
;
}
export
interface
ITextFileSaveParticipant
{
...
...
@@ -330,36 +325,69 @@ export interface ITextFileSaveParticipant {
export
interface
ITextFileEditorModelManager
{
readonly
onDidCreate
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidLoad
:
Event
<
ITextFile
Model
LoadEvent
>
;
readonly
onDidLoad
:
Event
<
ITextFileLoadEvent
>
;
readonly
onDidChangeDirty
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidChangeEncoding
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidSaveError
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidSave
:
Event
<
ITextFile
Model
SaveEvent
>
;
readonly
onDidSave
:
Event
<
ITextFileSaveEvent
>
;
readonly
onDidRevert
:
Event
<
ITextFileEditorModel
>
;
readonly
onDidChangeEncoding
:
Event
<
ITextFileEditorModel
>
;
readonly
models
:
ITextFileEditorModel
[];
saveErrorHandler
:
ISaveErrorHandler
;
/**
* Returns the text file editor model for the provided resource
* or undefined if none.
*/
get
(
resource
:
URI
):
ITextFileEditorModel
|
undefined
;
resolve
(
resource
:
URI
,
options
?:
IModelLoadOrCreateOptions
):
Promise
<
ITextFileEditorModel
>
;
/**
* Allows to load a text file model from disk.
*/
resolve
(
resource
:
URI
,
options
?:
ITextFileEditorModelLoadOrCreateOptions
):
Promise
<
ITextFileEditorModel
>
;
/**
* Adds a participant for saving text file models.
*/
addSaveParticipant
(
participant
:
ITextFileSaveParticipant
):
IDisposable
;
runSaveParticipants
(
model
:
IResolvedTextFileEditorModel
,
context
:
{
reason
:
SaveReason
;
},
token
:
CancellationToken
):
Promise
<
void
>
disposeModel
(
model
:
ITextFileEditorModel
):
void
;
}
export
interface
ITextFileSaveOptions
extends
ISaveOptions
{
/**
* Makes the file writable if it is readonly.
*/
overwriteReadonly
?:
boolean
;
/**
* Overwrite the encoding of the file on disk as configured.
*/
overwriteEncoding
?:
boolean
;
/**
* Save the file with elevated privileges.
*
* Note: This may not be supported in all environments.
*/
writeElevated
?:
boolean
;
/**
* Allows to write to a file even if it has been modified on disk.
*/
ignoreModifiedSince
?:
boolean
;
/**
* If set, will bubble up the error to the caller instead of handling it.
*/
ignoreErrorHandler
?:
boolean
;
}
export
interface
ILoadOptions
{
export
interface
I
TextFile
LoadOptions
{
/**
* Go to disk bypassing any cache of the model if any.
...
...
@@ -374,39 +402,29 @@ export interface ILoadOptions {
/**
* Context why the model is being loaded.
*/
reason
?:
LoadReason
;
reason
?:
TextFile
LoadReason
;
}
export
interface
ITextFileEditorModel
extends
ITextEditorModel
,
IEncodingSupport
,
IModeSupport
,
IWorkingCopy
{
readonly
onDidChangeContent
:
Event
<
void
>
;
readonly
onDidLoad
:
Event
<
LoadReason
>
;
readonly
onDidSaveError
:
Event
<
void
>
;
readonly
onDidSave
:
Event
<
SaveReason
>
;
readonly
onDidRevert
:
Event
<
void
>
;
readonly
onDidChangeEncoding
:
Event
<
void
>
;
readonly
onDidChangeOrphaned
:
Event
<
void
>
;
hasState
(
state
:
ModelState
):
boolean
;
hasState
(
state
:
TextFileEditor
ModelState
):
boolean
;
updatePreferredEncoding
(
encoding
:
string
|
undefined
):
void
;
updateTextEditorModel
(
newValue
?:
ITextBufferFactory
,
preferredMode
?:
string
):
void
;
save
(
options
?:
ITextFileSaveOptions
):
Promise
<
boolean
>
;
load
(
options
?:
ILoadOptions
):
Promise
<
ITextFileEditorModel
>
;
revert
(
options
?:
IRevertOptions
):
Promise
<
boolean
>
;
isDirty
():
this
is
IResolvedTextFileEditorModel
;
load
(
options
?:
ITextFileLoadOptions
):
Promise
<
ITextFileEditorModel
>
;
setDirty
(
dirty
:
boolean
):
void
;
isDirty
():
this
is
IResolvedTextFileEditorModel
;
getMode
():
string
|
undefined
;
isResolved
():
this
is
IResolvedTextFileEditorModel
;
isDisposed
():
boolean
;
}
...
...
src/vs/workbench/services/textfile/test/browser/textFileEditorModel.test.ts
浏览文件 @
1311b224
...
...
@@ -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
,
snapshotToString
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
TextFileEditor
ModelState
,
snapshotToString
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
createFileInput
,
TestFileService
,
TestTextFileService
,
workbenchInstantiationService
}
from
'
vs/workbench/test/browser/workbenchTestServices
'
;
import
{
toResource
}
from
'
vs/base/test/common/utils
'
;
import
{
TextFileEditorModelManager
}
from
'
vs/workbench/services/textfile/common/textFileEditorModelManager
'
;
...
...
@@ -100,7 +100,7 @@ suite('Files - TextFileEditorModel', () => {
model
.
textEditorModel
!
.
setValue
(
'
bar
'
);
assert
.
ok
(
getLastModifiedTime
(
model
)
<=
Date
.
now
());
assert
.
ok
(
model
.
hasState
(
ModelState
.
DIRTY
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
DIRTY
));
assert
.
equal
(
accessor
.
workingCopyService
.
dirtyCount
,
1
);
assert
.
equal
(
accessor
.
workingCopyService
.
isDirty
(
model
.
resource
),
true
);
...
...
@@ -116,11 +116,11 @@ suite('Files - TextFileEditorModel', () => {
});
const
pendingSave
=
model
.
save
();
assert
.
ok
(
model
.
hasState
(
ModelState
.
PENDING_SAVE
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
PENDING_SAVE
));
await
pendingSave
;
assert
.
ok
(
model
.
hasState
(
ModelState
.
SAVED
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
SAVED
));
assert
.
ok
(
!
model
.
isDirty
());
assert
.
ok
(
savedEvent
);
assert
.
ok
(
workingCopyEvent
);
...
...
@@ -169,11 +169,11 @@ suite('Files - TextFileEditorModel', () => {
accessor
.
fileService
.
writeShouldThrowError
=
new
Error
(
'
failed to write
'
);
try
{
const
pendingSave
=
model
.
save
();
assert
.
ok
(
model
.
hasState
(
ModelState
.
PENDING_SAVE
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
PENDING_SAVE
));
await
pendingSave
;
assert
.
ok
(
model
.
hasState
(
ModelState
.
ERROR
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
ERROR
));
assert
.
ok
(
model
.
isDirty
());
assert
.
ok
(
saveErrorEvent
);
...
...
@@ -199,11 +199,11 @@ suite('Files - TextFileEditorModel', () => {
accessor
.
fileService
.
writeShouldThrowError
=
new
FileOperationError
(
'
save conflict
'
,
FileOperationResult
.
FILE_MODIFIED_SINCE
);
try
{
const
pendingSave
=
model
.
save
();
assert
.
ok
(
model
.
hasState
(
ModelState
.
PENDING_SAVE
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
PENDING_SAVE
));
await
pendingSave
;
assert
.
ok
(
model
.
hasState
(
ModelState
.
CONFLICT
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
CONFLICT
));
assert
.
ok
(
model
.
isDirty
());
assert
.
ok
(
saveErrorEvent
);
...
...
@@ -273,7 +273,7 @@ suite('Files - TextFileEditorModel', () => {
test
(
'
Load does not trigger save
'
,
async
function
()
{
const
model
=
instantiationService
.
createInstance
(
TextFileEditorModel
,
toResource
.
call
(
this
,
'
/path/index.txt
'
),
'
utf8
'
,
undefined
);
assert
.
ok
(
model
.
hasState
(
ModelState
.
SAVED
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
SAVED
));
model
.
onDidSave
(
e
=>
assert
.
fail
());
model
.
onDidChangeDirty
(
e
=>
assert
.
fail
());
...
...
@@ -290,7 +290,7 @@ suite('Files - TextFileEditorModel', () => {
await
model
.
load
();
model
.
textEditorModel
!
.
setValue
(
'
foo
'
);
assert
.
ok
(
model
.
isDirty
());
assert
.
ok
(
model
.
hasState
(
ModelState
.
DIRTY
));
assert
.
ok
(
model
.
hasState
(
TextFileEditor
ModelState
.
DIRTY
));
await
model
.
load
();
assert
.
ok
(
model
.
isDirty
());
...
...
src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts
浏览文件 @
1311b224
...
...
@@ -10,7 +10,7 @@ import { ITextModel } from 'vs/editor/common/model';
import
{
IDisposable
,
toDisposable
,
IReference
,
ReferenceCollection
,
ImmortalReference
}
from
'
vs/base/common/lifecycle
'
;
import
{
IModelService
}
from
'
vs/editor/common/services/modelService
'
;
import
{
ResourceEditorModel
}
from
'
vs/workbench/common/editor/resourceEditorModel
'
;
import
{
ITextFileService
,
LoadReason
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
{
ITextFileService
,
TextFile
LoadReason
}
from
'
vs/workbench/services/textfile/common/textfiles
'
;
import
*
as
network
from
'
vs/base/common/network
'
;
import
{
ITextModelService
,
ITextModelContentProvider
,
ITextEditorModel
,
IResolvedTextEditorModel
}
from
'
vs/editor/common/services/resolverService
'
;
import
{
IUntitledTextEditorService
}
from
'
vs/workbench/services/untitled/common/untitledTextEditorService
'
;
...
...
@@ -38,7 +38,7 @@ class ResourceModelCollection extends ReferenceCollection<Promise<ITextEditorMod
// File or remote file provider already known
if
(
this
.
fileService
.
canHandleResource
(
resource
))
{
return
this
.
textFileService
.
files
.
resolve
(
resource
,
{
reason
:
LoadReason
.
REFERENCE
});
return
this
.
textFileService
.
files
.
resolve
(
resource
,
{
reason
:
TextFile
LoadReason
.
REFERENCE
});
}
// Virtual documents
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录