Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
40798a95
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,发现更多精彩内容 >>
提交
40798a95
编写于
1月 25, 2018
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use live objects and avoid promises
上级
5c9b0eb1
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
124 addition
and
54 deletion
+124
-54
src/vs/platform/workspace/common/workspace.ts
src/vs/platform/workspace/common/workspace.ts
+2
-2
src/vs/vscode.proposed.d.ts
src/vs/vscode.proposed.d.ts
+3
-2
src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts
src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts
+2
-2
src/vs/workbench/api/node/extHost.protocol.ts
src/vs/workbench/api/node/extHost.protocol.ts
+1
-1
src/vs/workbench/api/node/extHostWorkspace.ts
src/vs/workbench/api/node/extHostWorkspace.ts
+116
-47
未找到文件。
src/vs/platform/workspace/common/workspace.ts
浏览文件 @
40798a95
...
...
@@ -205,8 +205,8 @@ export class Workspace implements IWorkspace {
export
class
WorkspaceFolder
implements
IWorkspaceFolder
{
readonly
uri
:
URI
;
readonly
name
:
string
;
readonly
index
:
number
;
name
:
string
;
index
:
number
;
constructor
(
data
:
IWorkspaceFolderData
,
readonly
raw
?:
IStoredWorkspaceFolder
)
{
...
...
src/vs/vscode.proposed.d.ts
浏览文件 @
40798a95
...
...
@@ -188,9 +188,10 @@ declare module 'vscode' {
* @param deleteCount the optional number of workspace folders to remove.
* @param workspaceFoldersToAdd the optional variable set of workspace folders to add in place of the deleted ones.
* Each workspace is identified with a mandatory URI and an optional name.
* @return A thenable that resolves when the workspace folder was removed successfully.
* @return true if the operation was successfully started. Use the [onDidChangeWorkspaceFolders()](#onDidChangeWorkspaceFolders)
* event to get notified when the workspace folders have been updated.
*/
export
function
updateWorkspaceFolders
(
start
:
number
,
deleteCount
:
number
,
...
workspaceFoldersToAdd
:
{
uri
:
Uri
,
name
?:
string
}[]):
Thenable
<
boolean
>
;
export
function
updateWorkspaceFolders
(
start
:
number
,
deleteCount
:
number
,
...
workspaceFoldersToAdd
:
{
uri
:
Uri
,
name
?:
string
}[]):
boolean
;
}
export
namespace
window
{
...
...
src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts
浏览文件 @
40798a95
...
...
@@ -50,13 +50,13 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
// --- workspace ---
$updateWorkspaceFolders
(
extensionName
:
string
,
index
:
number
,
deleteCount
:
number
,
foldersToAdd
:
{
uri
:
UriComponents
,
name
?:
string
}[]):
Thenable
<
boolean
>
{
$updateWorkspaceFolders
(
extensionName
:
string
,
index
:
number
,
deleteCount
:
number
,
foldersToAdd
:
{
uri
:
UriComponents
,
name
?:
string
}[]):
Thenable
<
void
>
{
const
workspaceFoldersToAdd
=
foldersToAdd
.
map
(
f
=>
({
uri
:
URI
.
revive
(
f
.
uri
),
name
:
f
.
name
}));
// Indicate in status message
this
.
_statusbarService
.
setStatusMessage
(
this
.
getStatusMessage
(
extensionName
,
workspaceFoldersToAdd
.
length
,
deleteCount
),
10
*
1000
/* 10s */
);
return
this
.
_workspaceEditingService
.
updateFolders
(
index
,
deleteCount
,
workspaceFoldersToAdd
,
true
)
.
then
(()
=>
true
)
;
return
this
.
_workspaceEditingService
.
updateFolders
(
index
,
deleteCount
,
workspaceFoldersToAdd
,
true
);
}
private
getStatusMessage
(
extensionName
,
addCount
:
number
,
removeCount
:
number
):
string
{
...
...
src/vs/workbench/api/node/extHost.protocol.ts
浏览文件 @
40798a95
...
...
@@ -355,7 +355,7 @@ export interface MainThreadWorkspaceShape extends IDisposable {
$startSearch
(
includePattern
:
string
,
includeFolder
:
string
,
excludePattern
:
string
,
maxResults
:
number
,
requestId
:
number
):
Thenable
<
UriComponents
[]
>
;
$cancelSearch
(
requestId
:
number
):
Thenable
<
boolean
>
;
$saveAll
(
includeUntitled
?:
boolean
):
Thenable
<
boolean
>
;
$updateWorkspaceFolders
(
extensionName
:
string
,
index
:
number
,
deleteCount
:
number
,
workspaceFoldersToAdd
:
{
uri
:
UriComponents
,
name
?:
string
}[]):
Thenable
<
boolean
>
;
$updateWorkspaceFolders
(
extensionName
:
string
,
index
:
number
,
deleteCount
:
number
,
workspaceFoldersToAdd
:
{
uri
:
UriComponents
,
name
?:
string
}[]):
Thenable
<
void
>
;
}
export
interface
IFileChangeDto
{
...
...
src/vs/workbench/api/node/extHostWorkspace.ts
浏览文件 @
40798a95
...
...
@@ -16,20 +16,78 @@ import { compare } from 'vs/base/common/strings';
import
{
TernarySearchTree
}
from
'
vs/base/common/map
'
;
import
{
basenameOrAuthority
,
isEqual
}
from
'
vs/base/common/resources
'
;
import
{
isLinux
}
from
'
vs/base/common/platform
'
;
import
{
onUnexpectedError
}
from
'
vs/base/common/errors
'
;
function
isFolderEqual
(
folderA
:
URI
,
folderB
:
URI
):
boolean
{
return
isEqual
(
folderA
,
folderB
,
!
isLinux
);
}
class
Workspace2
extends
Workspace
{
static
fromData
(
data
:
IWorkspaceData
)
{
static
acceptWorkspaceData
(
data
:
IWorkspaceData
,
oldWorkspace
?:
Workspace2
):
{
workspace
:
Workspace2
,
added
:
vscode
.
WorkspaceFolder
[],
removed
:
vscode
.
WorkspaceFolder
[]
}
{
if
(
!
data
)
{
return
null
;
}
else
{
return
{
workspace
:
null
,
added
:
[],
removed
:
[]
};
}
const
{
id
,
name
,
folders
}
=
data
;
return
new
Workspace2
(
id
,
name
,
folders
.
map
(({
uri
,
name
,
index
})
=>
new
WorkspaceFolder
({
name
,
index
,
uri
:
URI
.
revive
(
uri
)
}))
);
const
newWorkspaceFolders
:
WorkspaceFolder
[]
=
[];
// If we have an existing workspace, we try to find the folders that match our
// data and update their properties. It could be that an extension stored them
// for later use and we want to keep them "live" if they are still present.
if
(
oldWorkspace
)
{
folders
.
forEach
((
folderData
,
index
)
=>
{
const
folderUri
=
URI
.
revive
(
folderData
.
uri
);
const
existingFolder
=
Workspace2
.
_findFolder
(
oldWorkspace
,
folderUri
);
if
(
existingFolder
)
{
existingFolder
.
name
=
folderData
.
name
;
existingFolder
.
index
=
folderData
.
index
;
newWorkspaceFolders
.
push
(
existingFolder
);
}
else
{
newWorkspaceFolders
.
push
(
new
WorkspaceFolder
({
name
:
folderData
.
name
,
index
,
uri
:
folderUri
}));
}
});
}
else
{
newWorkspaceFolders
.
push
(...
folders
.
map
(({
uri
,
name
,
index
})
=>
new
WorkspaceFolder
({
name
,
index
,
uri
:
URI
.
revive
(
uri
)
})));
}
const
workspace
=
new
Workspace2
(
id
,
name
,
newWorkspaceFolders
);
const
oldRoots
=
oldWorkspace
?
oldWorkspace
.
workspaceFolders
.
sort
(
Workspace2
.
compareWorkspaceFolderByUri
)
:
[];
const
newRoots
=
workspace
.
workspaceFolders
.
sort
(
Workspace2
.
compareWorkspaceFolderByUri
);
const
{
added
,
removed
}
=
delta
(
oldRoots
,
newRoots
,
Workspace2
.
compareWorkspaceFolderByUri
);
return
{
workspace
,
added
,
removed
};
}
static
compareWorkspaceFolderByUri
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
,
includeName
?:
boolean
):
number
{
if
(
isFolderEqual
(
a
.
uri
,
b
.
uri
))
{
return
0
;
}
return
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
());
}
static
compareWorkspaceFolderByUriAndName
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
):
number
{
if
(
isFolderEqual
(
a
.
uri
,
b
.
uri
)
&&
compare
(
a
.
name
,
b
.
name
)
===
0
)
{
return
0
;
}
return
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
())
+
compare
(
a
.
name
,
b
.
name
);
}
private
static
_findFolder
(
workspace
:
Workspace2
,
folderUriToFind
:
URI
):
WorkspaceFolder
{
for
(
let
i
=
0
;
i
<
workspace
.
folders
.
length
;
i
++
)
{
const
folder
=
workspace
.
folders
[
i
];
if
(
isFolderEqual
(
folder
.
uri
,
folderUriToFind
))
{
return
folder
;
}
}
return
undefined
;
}
private
readonly
_workspaceFolders
:
vscode
.
WorkspaceFolder
[]
=
[];
...
...
@@ -65,77 +123,95 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape {
private
readonly
_onDidChangeWorkspace
=
new
Emitter
<
vscode
.
WorkspaceFoldersChangeEvent
>
();
private
readonly
_proxy
:
MainThreadWorkspaceShape
;
private
_workspace
:
Workspace2
;
private
_confirmedWorkspace
:
Workspace2
;
private
_unconfirmedWorkspace
:
Workspace2
;
readonly
onDidChangeWorkspace
:
Event
<
vscode
.
WorkspaceFoldersChangeEvent
>
=
this
.
_onDidChangeWorkspace
.
event
;
constructor
(
mainContext
:
IMainContext
,
data
:
IWorkspaceData
)
{
this
.
_proxy
=
mainContext
.
getProxy
(
MainContext
.
MainThreadWorkspace
);
this
.
_
workspace
=
Workspace2
.
fromData
(
data
)
;
this
.
_
confirmedWorkspace
=
Workspace2
.
acceptWorkspaceData
(
data
).
workspace
;
}
// --- workspace ---
get
workspace
():
Workspace
{
return
this
.
_workspace
;
return
this
.
_actualWorkspace
;
}
private
get
_actualWorkspace
():
Workspace2
{
return
this
.
_unconfirmedWorkspace
||
this
.
_confirmedWorkspace
;
}
getWorkspaceFolders
():
vscode
.
WorkspaceFolder
[]
{
if
(
!
this
.
_
w
orkspace
)
{
if
(
!
this
.
_
actualW
orkspace
)
{
return
undefined
;
}
else
{
return
this
.
_workspace
.
workspaceFolders
.
slice
(
0
);
}
return
this
.
_actualWorkspace
.
workspaceFolders
.
slice
(
0
);
}
updateWorkspaceFolders
(
extensionName
:
string
,
index
:
number
,
deleteCount
:
number
,
...
workspaceFoldersToAdd
:
{
uri
:
vscode
.
Uri
,
name
?:
string
}[]):
Thenable
<
boolean
>
{
updateWorkspaceFolders
(
extensionName
:
string
,
index
:
number
,
deleteCount
:
number
,
...
workspaceFoldersToAdd
:
{
uri
:
vscode
.
Uri
,
name
?:
string
}[]):
boolean
{
const
validatedDistinctWorkspaceFoldersToAdd
:
{
uri
:
vscode
.
Uri
,
name
?:
string
}[]
=
[];
if
(
Array
.
isArray
(
workspaceFoldersToAdd
))
{
workspaceFoldersToAdd
.
forEach
(
folderToAdd
=>
{
if
(
URI
.
isUri
(
folderToAdd
.
uri
)
&&
!
validatedDistinctWorkspaceFoldersToAdd
.
some
(
f
=>
is
Equal
(
f
.
uri
,
folderToAdd
.
uri
,
!
isLinux
)))
{
if
(
URI
.
isUri
(
folderToAdd
.
uri
)
&&
!
validatedDistinctWorkspaceFoldersToAdd
.
some
(
f
=>
is
FolderEqual
(
f
.
uri
,
folderToAdd
.
uri
)))
{
validatedDistinctWorkspaceFoldersToAdd
.
push
(
folderToAdd
);
}
});
}
if
([
index
,
deleteCount
].
some
(
i
=>
typeof
i
!==
'
number
'
||
i
<
0
))
{
return
Promise
.
resolve
(
false
)
;
// validate numbers
return
false
;
// validate numbers
}
if
(
deleteCount
===
0
&&
validatedDistinctWorkspaceFoldersToAdd
.
length
===
0
)
{
return
Promise
.
resolve
(
false
)
;
// nothing to delete or add
return
false
;
// nothing to delete or add
}
const
currentWorkspaceFolders
:
vscode
.
WorkspaceFolder
[]
=
this
.
_
workspace
?
this
.
_w
orkspace
.
workspaceFolders
:
[];
const
currentWorkspaceFolders
:
vscode
.
WorkspaceFolder
[]
=
this
.
_
actualWorkspace
?
this
.
_actualW
orkspace
.
workspaceFolders
:
[];
if
(
index
+
deleteCount
>
currentWorkspaceFolders
.
length
)
{
return
Promise
.
resolve
(
false
)
;
// cannot delete more than we have
return
false
;
// cannot delete more than we have
}
const
newWorkspaceFolders
=
currentWorkspaceFolders
.
slice
(
0
);
newWorkspaceFolders
.
splice
(
index
,
deleteCount
,
...
validatedDistinctWorkspaceFoldersToAdd
.
map
((
f
,
index
)
=>
({
uri
:
f
.
uri
,
name
:
f
.
name
||
basenameOrAuthority
(
f
.
uri
),
index
})));
const
{
added
,
removed
}
=
delta
(
currentWorkspaceFolders
,
newWorkspaceFolders
,
ExtHostWorkspace
.
_compareWorkspaceFolderByUriAndName
);
const
oldRoots
=
currentWorkspaceFolders
.
sort
(
Workspace2
.
compareWorkspaceFolderByUri
);
const
newRoots
=
newWorkspaceFolders
.
sort
(
Workspace2
.
compareWorkspaceFolderByUri
);
const
{
added
,
removed
}
=
delta
(
oldRoots
,
newRoots
,
Workspace2
.
compareWorkspaceFolderByUriAndName
);
if
(
added
.
length
===
0
&&
removed
.
length
===
0
)
{
return
Promise
.
resolve
(
false
);
// nothing actually changed
return
false
;
// nothing actually changed
}
// Trigger on main side
this
.
_proxy
.
$updateWorkspaceFolders
(
extensionName
,
index
,
deleteCount
,
validatedDistinctWorkspaceFoldersToAdd
).
then
(
null
,
onUnexpectedError
);
// Update directly here. The workspace is unconfirmed as long as we did not get an
// acknowledgement from the main side (via acceptWorkspaceData)
if
(
this
.
_actualWorkspace
)
{
this
.
_unconfirmedWorkspace
=
Workspace2
.
acceptWorkspaceData
({
id
:
this
.
_actualWorkspace
.
id
,
name
:
this
.
_actualWorkspace
.
name
,
configuration
:
this
.
_actualWorkspace
.
configuration
,
folders
:
newWorkspaceFolders
},
this
.
_actualWorkspace
).
workspace
;
}
return
t
his
.
_proxy
.
$updateWorkspaceFolders
(
extensionName
,
index
,
deleteCount
,
validatedDistinctWorkspaceFoldersToAdd
)
;
return
t
rue
;
}
getWorkspaceFolder
(
uri
:
vscode
.
Uri
,
resolveParent
?:
boolean
):
vscode
.
WorkspaceFolder
{
if
(
!
this
.
_
w
orkspace
)
{
if
(
!
this
.
_
actualW
orkspace
)
{
return
undefined
;
}
return
this
.
_
w
orkspace
.
getWorkspaceFolder
(
uri
,
resolveParent
);
return
this
.
_
actualW
orkspace
.
getWorkspaceFolder
(
uri
,
resolveParent
);
}
getPath
():
string
{
// this is legacy from the days before having
// multi-root and we keep it only alive if there
// is just one workspace folder.
if
(
!
this
.
_
w
orkspace
)
{
if
(
!
this
.
_
actualW
orkspace
)
{
return
undefined
;
}
const
{
folders
}
=
this
.
_workspace
;
const
{
folders
}
=
this
.
_actualWorkspace
;
if
(
folders
.
length
===
0
)
{
return
undefined
;
}
...
...
@@ -165,7 +241,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape {
}
if
(
typeof
includeWorkspace
===
'
undefined
'
)
{
includeWorkspace
=
this
.
w
orkspace
.
folders
.
length
>
1
;
includeWorkspace
=
this
.
_actualW
orkspace
.
folders
.
length
>
1
;
}
let
result
=
relative
(
folder
.
uri
.
fsPath
,
path
);
...
...
@@ -177,27 +253,20 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape {
$acceptWorkspaceData
(
data
:
IWorkspaceData
):
void
{
// keep old workspace folder, build new workspace, and
// capture new workspace folders. Compute delta between
// them send that as event
const
oldRoots
=
this
.
_workspace
?
this
.
_workspace
.
workspaceFolders
.
sort
(
ExtHostWorkspace
.
_compareWorkspaceFolderByUri
)
:
[];
const
{
workspace
,
added
,
removed
}
=
Workspace2
.
acceptWorkspaceData
(
data
,
this
.
_confirmedWorkspace
/* use confirmed workspace to produce the true delta from last time */
);
this
.
_workspace
=
Workspace2
.
fromData
(
data
);
const
newRoots
=
this
.
_workspace
?
this
.
_workspace
.
workspaceFolders
.
sort
(
ExtHostWorkspace
.
_compareWorkspaceFolderByUri
)
:
[];
// Update our workspace object. We have a confirmed workspace, so we drop our
// unconfirmed workspace.
this
.
_confirmedWorkspace
=
workspace
;
this
.
_unconfirmedWorkspace
=
undefined
;
const
{
added
,
removed
}
=
delta
(
oldRoots
,
newRoots
,
ExtHostWorkspace
.
_compareWorkspaceFolderByUri
);
// Events
if
(
added
.
length
||
removed
.
length
)
{
this
.
_onDidChangeWorkspace
.
fire
(
Object
.
freeze
({
added
:
Object
.
freeze
<
vscode
.
WorkspaceFolder
[]
>
(
added
),
removed
:
Object
.
freeze
<
vscode
.
WorkspaceFolder
[]
>
(
removed
)
}));
}
private
static
_compareWorkspaceFolderByUri
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
,
includeName
?:
boolean
):
number
{
return
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
());
}
private
static
_compareWorkspaceFolderByUriAndName
(
a
:
vscode
.
WorkspaceFolder
,
b
:
vscode
.
WorkspaceFolder
):
number
{
return
compare
(
a
.
uri
.
toString
(),
b
.
uri
.
toString
())
+
compare
(
a
.
name
,
b
.
name
);
}
// --- search ---
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录