提交 17cd9fb7 编写于 作者: J Johannes Rieken

fix #76840

上级 4ed70122
......@@ -22,6 +22,7 @@ import { ClipboardBasedVariableResolver, CompositeSnippetVariableResolver, Model
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
import * as colors from 'vs/platform/theme/common/colorRegistry';
import { withNullAsUndefined } from 'vs/base/common/types';
import { ILabelService } from 'vs/platform/label/common/label';
registerThemingParticipant((theme, collector) => {
......@@ -384,9 +385,9 @@ export class SnippetSession {
}
const model = editor.getModel();
const modelBasedVariableResolver = new ModelBasedVariableResolver(model);
const clipboardService = editor.invokeWithinContext(accessor => accessor.get(IClipboardService, optional));
const workspaceService = editor.invokeWithinContext(accessor => accessor.get(IWorkspaceContextService, optional));
const modelBasedVariableResolver = editor.invokeWithinContext(accessor => new ModelBasedVariableResolver(accessor.get(ILabelService, optional), model));
let delta = 0;
......
......@@ -4,7 +4,8 @@
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vs/nls';
import { basename, dirname } from 'vs/base/common/path';
import * as path from 'vs/base/common/path';
import { dirname } from 'vs/base/common/resources';
import { ITextModel } from 'vs/editor/common/model';
import { Selection } from 'vs/editor/common/core/selection';
import { VariableResolver, Variable, Text } from 'vs/editor/contrib/snippet/snippetParser';
......@@ -13,6 +14,7 @@ import { getLeadingWhitespace, commonPrefixLength, isFalsyOrWhitespace, pad, end
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { isSingleFolderWorkspaceIdentifier, toWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces';
import { ILabelService } from 'vs/platform/label/common/label';
export const KnownSnippetVariableNames: { [key: string]: true } = Object.freeze({
'CURRENT_YEAR': true,
......@@ -126,6 +128,7 @@ export class SelectionBasedVariableResolver implements VariableResolver {
export class ModelBasedVariableResolver implements VariableResolver {
constructor(
private readonly _labelService: ILabelService,
private readonly _model: ITextModel
) {
//
......@@ -136,10 +139,10 @@ export class ModelBasedVariableResolver implements VariableResolver {
const { name } = variable;
if (name === 'TM_FILENAME') {
return basename(this._model.uri.fsPath);
return path.basename(this._model.uri.fsPath);
} else if (name === 'TM_FILENAME_BASE') {
const name = basename(this._model.uri.fsPath);
const name = path.basename(this._model.uri.fsPath);
const idx = name.lastIndexOf('.');
if (idx <= 0) {
return name;
......@@ -148,11 +151,13 @@ export class ModelBasedVariableResolver implements VariableResolver {
}
} else if (name === 'TM_DIRECTORY') {
const dir = dirname(this._model.uri.fsPath);
return dir !== '.' ? dir : '';
if (path.dirname(this._model.uri.fsPath) === '.') {
return '';
}
return this._labelService.getUriLabel(dirname(this._model.uri));
} else if (name === 'TM_FILEPATH') {
return this._model.uri.fsPath;
return this._labelService.getUriLabel(this._model.uri);
}
return undefined;
......@@ -266,10 +271,10 @@ export class WorkspaceBasedVariableResolver implements VariableResolver {
}
if (isSingleFolderWorkspaceIdentifier(workspaceIdentifier)) {
return basename(workspaceIdentifier.path);
return path.basename(workspaceIdentifier.path);
}
let filename = basename(workspaceIdentifier.configPath.path);
let filename = path.basename(workspaceIdentifier.configPath.path);
if (endsWith(filename, WORKSPACE_EXTENSION)) {
filename = filename.substr(0, filename.length - WORKSPACE_EXTENSION.length - 1);
}
......
......@@ -11,9 +11,17 @@ import { SnippetParser, Variable, VariableResolver } from 'vs/editor/contrib/sni
import { TextModel } from 'vs/editor/common/model/textModel';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { Workspace, toWorkspaceFolders, IWorkspace, IWorkspaceContextService, toWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
import { ILabelService } from 'vs/platform/label/common/label';
import { mock } from 'vs/editor/contrib/suggest/test/suggestModel.test';
suite('Snippet Variables Resolver', function () {
const labelService = new class extends mock<ILabelService>() {
getUriLabel(uri: URI) {
return uri.fsPath;
}
};
let model: TextModel;
let resolver: VariableResolver;
......@@ -25,7 +33,7 @@ suite('Snippet Variables Resolver', function () {
].join('\n'), undefined, undefined, URI.parse('file:///foo/files/text.txt'));
resolver = new CompositeSnippetVariableResolver([
new ModelBasedVariableResolver(model),
new ModelBasedVariableResolver(labelService, model),
new SelectionBasedVariableResolver(model, new Selection(1, 1, 1, 1)),
]);
});
......@@ -59,6 +67,7 @@ suite('Snippet Variables Resolver', function () {
}
resolver = new ModelBasedVariableResolver(
labelService,
TextModel.createFromString('', undefined, undefined, URI.parse('http://www.pb.o/abc/def/ghi'))
);
assertVariableResolve(resolver, 'TM_FILENAME', 'ghi');
......@@ -68,6 +77,7 @@ suite('Snippet Variables Resolver', function () {
}
resolver = new ModelBasedVariableResolver(
labelService,
TextModel.createFromString('', undefined, undefined, URI.parse('mem:fff.ts'))
);
assertVariableResolve(resolver, 'TM_DIRECTORY', '');
......@@ -75,6 +85,21 @@ suite('Snippet Variables Resolver', function () {
});
test('Path delimiters in code snippet variables aren\'t specific to remote OS #76840', function () {
const labelService = new class extends mock<ILabelService>() {
getUriLabel(uri: URI) {
return uri.fsPath.replace(/\/|\\/g, '|');
}
};
const model = TextModel.createFromString([].join('\n'), undefined, undefined, URI.parse('foo:///foo/files/text.txt'));
const resolver = new CompositeSnippetVariableResolver([new ModelBasedVariableResolver(labelService, model)]);
assertVariableResolve(resolver, 'TM_FILEPATH', '|foo|files|text.txt');
});
test('editor variables, selection', function () {
resolver = new SelectionBasedVariableResolver(model, new Selection(1, 2, 2, 3));
......@@ -119,16 +144,19 @@ suite('Snippet Variables Resolver', function () {
assertVariableResolve(resolver, 'TM_FILENAME_BASE', 'text');
resolver = new ModelBasedVariableResolver(
labelService,
TextModel.createFromString('', undefined, undefined, URI.parse('http://www.pb.o/abc/def/ghi'))
);
assertVariableResolve(resolver, 'TM_FILENAME_BASE', 'ghi');
resolver = new ModelBasedVariableResolver(
labelService,
TextModel.createFromString('', undefined, undefined, URI.parse('mem:.git'))
);
assertVariableResolve(resolver, 'TM_FILENAME_BASE', '.git');
resolver = new ModelBasedVariableResolver(
labelService,
TextModel.createFromString('', undefined, undefined, URI.parse('mem:foo.'))
);
assertVariableResolve(resolver, 'TM_FILENAME_BASE', 'foo');
......@@ -336,4 +364,4 @@ suite('Snippet Variables Resolver', function () {
workspace = new Workspace('', toWorkspaceFolders([{ path: 'folderName' }], workspaceConfigPath), workspaceConfigPath);
assertVariableResolve(resolver, 'WORKSPACE_NAME', 'testWorkspace');
});
});
\ No newline at end of file
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册