提交 24d0f5f8 编写于 作者: J Johannes Rieken

prep for #31124

上级 122cc332
......@@ -167,6 +167,19 @@ export abstract class Marker {
return this._children;
}
get snippet(): TextmateSnippet {
let candidate: Marker = this;
while (true) {
if (!candidate) {
return undefined;
}
if (candidate instanceof TextmateSnippet) {
return candidate;
}
candidate = candidate.parent;
}
}
toString() {
return '';
}
......@@ -269,8 +282,8 @@ export class Variable extends Marker {
super();
}
resolve(resolver: { resolve(name: string): string }): boolean {
const value = resolver.resolve(this.name);
resolve(resolver: VariableResolver): boolean {
const value = resolver.resolve(this);
if (value !== undefined) {
this._children = [new Text(value)];
return true;
......@@ -289,6 +302,10 @@ export class Variable extends Marker {
}
}
export interface VariableResolver {
resolve(variable: Variable): string | undefined;
}
function walk(marker: Marker[], visitor: (marker: Marker) => boolean): void {
const stack = [...marker];
while (stack.length > 0) {
......@@ -362,7 +379,7 @@ export class TextmateSnippet extends Marker {
return Marker.toString(this.children);
}
resolveVariables(resolver: { resolve(name: string): string }): this {
resolveVariables(resolver: VariableResolver): this {
this.walk(candidate => {
if (candidate instanceof Variable) {
if (candidate.resolve(resolver)) {
......
......@@ -8,8 +8,9 @@
import { basename, dirname } from 'vs/base/common/paths';
import { IModel } from 'vs/editor/common/editorCommon';
import { Selection } from 'vs/editor/common/core/selection';
import { VariableResolver, Variable } from 'vs/editor/contrib/snippet/browser/snippetParser';
export class EditorSnippetVariableResolver {
export class EditorSnippetVariableResolver implements VariableResolver {
static readonly VariableNames = Object.freeze({
'SELECTION': true,
......@@ -30,7 +31,10 @@ export class EditorSnippetVariableResolver {
//
}
resolve(name: string): string {
resolve(variable: Variable): string {
const { name } = variable;
if (name === 'SELECTION' || name === 'TM_SELECTED_TEXT') {
return this._model.getValueInRange(this._selection) || undefined;
......
......@@ -9,7 +9,7 @@ import { isWindows } from 'vs/base/common/platform';
import URI from 'vs/base/common/uri';
import { Selection } from 'vs/editor/common/core/selection';
import { EditorSnippetVariableResolver } from 'vs/editor/contrib/snippet/browser/snippetVariables';
import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser';
import { SnippetParser, Variable } from 'vs/editor/contrib/snippet/browser/snippetParser';
import { Model } from 'vs/editor/common/model/model';
suite('Snippet Variables Resolver', function () {
......@@ -32,58 +32,58 @@ suite('Snippet Variables Resolver', function () {
});
test('editor variables, basics', function () {
assert.equal(resolver.resolve('TM_FILENAME'), 'text.txt');
assert.equal(resolver.resolve('something'), undefined);
assert.equal(resolver.resolve(new Variable('TM_FILENAME')), 'text.txt');
assert.equal(resolver.resolve(new Variable('something')), undefined);
});
test('editor variables, file/dir', function () {
assert.equal(resolver.resolve('TM_FILENAME'), 'text.txt');
assert.equal(resolver.resolve(new Variable('TM_FILENAME')), 'text.txt');
if (!isWindows) {
assert.equal(resolver.resolve('TM_DIRECTORY'), '/foo/files');
assert.equal(resolver.resolve('TM_FILEPATH'), '/foo/files/text.txt');
assert.equal(resolver.resolve(new Variable('TM_DIRECTORY')), '/foo/files');
assert.equal(resolver.resolve(new Variable('TM_FILEPATH')), '/foo/files/text.txt');
}
resolver = new EditorSnippetVariableResolver(
Model.createFromString('', undefined, undefined, URI.parse('http://www.pb.o/abc/def/ghi')),
new Selection(1, 1, 1, 1)
);
assert.equal(resolver.resolve('TM_FILENAME'), 'ghi');
assert.equal(resolver.resolve(new Variable('TM_FILENAME')), 'ghi');
if (!isWindows) {
assert.equal(resolver.resolve('TM_DIRECTORY'), '/abc/def');
assert.equal(resolver.resolve('TM_FILEPATH'), '/abc/def/ghi');
assert.equal(resolver.resolve(new Variable('TM_DIRECTORY')), '/abc/def');
assert.equal(resolver.resolve(new Variable('TM_FILEPATH')), '/abc/def/ghi');
}
resolver = new EditorSnippetVariableResolver(
Model.createFromString('', undefined, undefined, URI.parse('mem:fff.ts')),
new Selection(1, 1, 1, 1)
);
assert.equal(resolver.resolve('TM_DIRECTORY'), '');
assert.equal(resolver.resolve('TM_FILEPATH'), 'fff.ts');
assert.equal(resolver.resolve(new Variable('TM_DIRECTORY')), '');
assert.equal(resolver.resolve(new Variable('TM_FILEPATH')), 'fff.ts');
});
test('editor variables, selection', function () {
resolver = new EditorSnippetVariableResolver(model, new Selection(1, 2, 2, 3));
assert.equal(resolver.resolve('TM_SELECTED_TEXT'), 'his is line one\nth');
assert.equal(resolver.resolve('TM_CURRENT_LINE'), 'this is line two');
assert.equal(resolver.resolve('TM_LINE_INDEX'), '1');
assert.equal(resolver.resolve('TM_LINE_NUMBER'), '2');
assert.equal(resolver.resolve(new Variable('TM_SELECTED_TEXT')), 'his is line one\nth');
assert.equal(resolver.resolve(new Variable('TM_CURRENT_LINE')), 'this is line two');
assert.equal(resolver.resolve(new Variable('TM_LINE_INDEX')), '1');
assert.equal(resolver.resolve(new Variable('TM_LINE_NUMBER')), '2');
resolver = new EditorSnippetVariableResolver(model, new Selection(2, 3, 1, 2));
assert.equal(resolver.resolve('TM_SELECTED_TEXT'), 'his is line one\nth');
assert.equal(resolver.resolve('TM_CURRENT_LINE'), 'this is line one');
assert.equal(resolver.resolve('TM_LINE_INDEX'), '0');
assert.equal(resolver.resolve('TM_LINE_NUMBER'), '1');
assert.equal(resolver.resolve(new Variable('TM_SELECTED_TEXT')), 'his is line one\nth');
assert.equal(resolver.resolve(new Variable('TM_CURRENT_LINE')), 'this is line one');
assert.equal(resolver.resolve(new Variable('TM_LINE_INDEX')), '0');
assert.equal(resolver.resolve(new Variable('TM_LINE_NUMBER')), '1');
resolver = new EditorSnippetVariableResolver(model, new Selection(1, 2, 1, 2));
assert.equal(resolver.resolve('TM_SELECTED_TEXT'), undefined);
assert.equal(resolver.resolve(new Variable('TM_SELECTED_TEXT')), undefined);
assert.equal(resolver.resolve('TM_CURRENT_WORD'), 'this');
assert.equal(resolver.resolve(new Variable('TM_CURRENT_WORD')), 'this');
resolver = new EditorSnippetVariableResolver(model, new Selection(3, 1, 3, 1));
assert.equal(resolver.resolve('TM_CURRENT_WORD'), undefined);
assert.equal(resolver.resolve(new Variable('TM_CURRENT_WORD')), undefined);
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册