未验证 提交 cef3b30d 编写于 作者: J Johannes Rieken 提交者: GitHub

Merge pull request #41653 from usernamehw/time_variables_for_snippets

Add time variables for snippets
......@@ -15,7 +15,7 @@ import { Range } from 'vs/editor/common/core/range';
import { IPosition } from 'vs/editor/common/core/position';
import { groupBy } from 'vs/base/common/arrays';
import { dispose } from 'vs/base/common/lifecycle';
import { SelectionBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, ClipboardBasedVariableResolver } from './snippetVariables';
import { SelectionBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, ClipboardBasedVariableResolver, TimeBasedVariableResolver } from './snippetVariables';
import { ModelDecorationOptions } from 'vs/editor/common/model/textModel';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
......@@ -318,7 +318,8 @@ export class SnippetSession {
.resolveVariables(new CompositeSnippetVariableResolver([
modelBasedVariableResolver,
new ClipboardBasedVariableResolver(clipboardService, idx, indexedSelections.length),
new SelectionBasedVariableResolver(model, selection)
new SelectionBasedVariableResolver(model, selection),
new TimeBasedVariableResolver
]));
const offset = model.getOffsetAt(start) + delta;
......
......@@ -9,10 +9,17 @@ import { basename, dirname } from 'vs/base/common/paths';
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';
import { getLeadingWhitespace, commonPrefixLength, isFalsyOrWhitespace } from 'vs/base/common/strings';
import { getLeadingWhitespace, commonPrefixLength, isFalsyOrWhitespace, pad } from 'vs/base/common/strings';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
export const KnownSnippetVariableNames = Object.freeze({
'CURRENT_YEAR': true,
'CURRENT_YEAR_SHORT': true,
'CURRENT_MONTH': true,
'CURRENT_DATE': true,
'CURRENT_HOUR': true,
'CURRENT_MINUTE': true,
'CURRENT_SECOND': true,
'SELECTION': true,
'CLIPBOARD': true,
'TM_SELECTED_TEXT': true,
......@@ -170,3 +177,28 @@ export class ClipboardBasedVariableResolver implements VariableResolver {
}
}
}
export class TimeBasedVariableResolver implements VariableResolver {
resolve(variable: Variable): string {
const { name } = variable;
if (name === 'CURRENT_YEAR') {
return String(new Date().getFullYear());
} else if (name === 'CURRENT_YEAR_SHORT') {
return String(new Date().getFullYear()).slice(-2);
} else if (name === 'CURRENT_MONTH') {
return pad((new Date().getMonth().valueOf() + 1), 2);
} else if (name === 'CURRENT_DATE') {
return pad(new Date().getDate().valueOf(), 2);
} else if (name === 'CURRENT_HOUR') {
return pad(new Date().getHours().valueOf(), 2);
} else if (name === 'CURRENT_MINUTE') {
return pad(new Date().getMinutes().valueOf(), 2);
} else if (name === 'CURRENT_SECOND') {
return pad(new Date().getSeconds().valueOf(), 2);
}
return undefined;
}
}
......@@ -8,7 +8,7 @@ import * as assert from 'assert';
import { isWindows } from 'vs/base/common/platform';
import URI from 'vs/base/common/uri';
import { Selection } from 'vs/editor/common/core/selection';
import { SelectionBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, ClipboardBasedVariableResolver } from 'vs/editor/contrib/snippet/snippetVariables';
import { SelectionBasedVariableResolver, CompositeSnippetVariableResolver, ModelBasedVariableResolver, ClipboardBasedVariableResolver, TimeBasedVariableResolver } from 'vs/editor/contrib/snippet/snippetVariables';
import { SnippetParser, Variable, VariableResolver } from 'vs/editor/contrib/snippet/snippetParser';
import { TextModel } from 'vs/editor/common/model/textModel';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
......@@ -261,4 +261,25 @@ suite('Snippet Variables Resolver', function () {
resolver = new ClipboardBasedVariableResolver(clipboardService, 0, 2);
assertVariableResolve(resolver, 'CLIPBOARD', 'line1');
});
function assertVariableResolve3(resolver: VariableResolver, varName: string) {
const snippet = new SnippetParser().parse(`$${varName}`);
const variable = <Variable>snippet.children[0];
assert.equal(variable.resolve(resolver), true, `${varName} failed to resolve`);
}
test('Add time variables for snippets #41631', function () {
const resolver = new TimeBasedVariableResolver;
assertVariableResolve3(resolver, 'CURRENT_YEAR');
assertVariableResolve3(resolver, 'CURRENT_YEAR_SHORT');
assertVariableResolve3(resolver, 'CURRENT_MONTH');
assertVariableResolve3(resolver, 'CURRENT_DATE');
assertVariableResolve3(resolver, 'CURRENT_HOUR');
assertVariableResolve3(resolver, 'CURRENT_MINUTE');
assertVariableResolve3(resolver, 'CURRENT_SECOND');
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册