提交 979efb6b 编写于 作者: R Ramya Achutha Rao

Allow ! as css abbreviation in property value Fixes #49214

上级 b69b51d4
...@@ -391,13 +391,13 @@ export function isValidLocationForEmmetAbbreviation(document: vscode.TextDocumen ...@@ -391,13 +391,13 @@ export function isValidLocationForEmmetAbbreviation(document: vscode.TextDocumen
&& position.isAfterOrEqual(propertyNode.separatorToken.end) && position.isAfterOrEqual(propertyNode.separatorToken.end)
&& position.isBeforeOrEqual(propertyNode.terminatorToken.start) && position.isBeforeOrEqual(propertyNode.terminatorToken.start)
&& abbreviation.indexOf(':') === -1) { && abbreviation.indexOf(':') === -1) {
return hexColorRegex.test(abbreviation); return hexColorRegex.test(abbreviation) || abbreviation === '!';
} }
if (!propertyNode.terminatorToken if (!propertyNode.terminatorToken
&& propertyNode.separator && propertyNode.separator
&& position.isAfterOrEqual(propertyNode.separatorToken.end) && position.isAfterOrEqual(propertyNode.separatorToken.end)
&& abbreviation.indexOf(':') === -1) { && abbreviation.indexOf(':') === -1) {
return hexColorRegex.test(abbreviation); return hexColorRegex.test(abbreviation) || abbreviation === '!';
} }
} }
......
...@@ -151,32 +151,41 @@ nav# ...@@ -151,32 +151,41 @@ nav#
}); });
}); });
test('Allow hex color when typing property values when there is a property in the next line (CSS)', () => { test('Allow hex color or !important when typing property values when there is a property in the next line (CSS)', () => {
const testContent = ` const testContent = `
.foo { .foo {
margin: #12 margin: #12 !
margin: 10px; margin: 10px;
} }
`; `;
return withRandomFileEditor(testContent, 'css', (editor, doc) => { return withRandomFileEditor(testContent, 'css', (editor, doc) => {
editor.selection = new Selection(2, 12, 2, 12); const cancelSrc = new CancellationTokenSource();
return expandEmmetAbbreviation(null).then(() => { const completionPromise1 = completionProvider.provideCompletionItems(editor.document, new Position(2, 12), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke });
assert.equal(editor.document.getText(), testContent.replace('#12', '#121212')); const completionPromise2 = completionProvider.provideCompletionItems(editor.document, new Position(2, 14), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke });
const cancelSrc = new CancellationTokenSource();
const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(2, 12), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); if (!completionPromise1 || !completionPromise2) {
if (!completionPromise) { assert.equal(1, 2, `Completion promise wasnt returned`);
assert.fail('Completion promise wasnt returned'); return Promise.resolve();
return Promise.resolve(); }
const callBack = (completionList: CompletionList, expandedText: string) => {
if (!completionList.items || !completionList.items.length) {
assert.equal(1, 2, `Empty Completions`);
return;
} }
completionPromise.then(result => { const emmetCompletionItem = completionList.items[0];
if (!result || !result.items || !result.items.length) { assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`);
assert.fail('Completion promise came back empty'); assert.equal((<string>emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`);
return Promise.resolve(); };
}
assert.equal(result.items[0].label, '#121212'); return Promise.all<CompletionList>([completionPromise1, completionPromise2]).then(([result1, result2]) => {
callBack(result1, '#121212');
callBack(result2, '!important');
editor.selections = [new Selection(2, 12, 2, 12), new Selection(2, 14, 2, 14)];
return expandEmmetAbbreviation(null).then(() => {
assert.equal(editor.document.getText(), testContent.replace('#12', '#121212').replace('!', '!important'));
}); });
return Promise.resolve();
}); });
}); });
}); });
...@@ -203,32 +212,41 @@ nav# ...@@ -203,32 +212,41 @@ nav#
}); });
}); });
test('Allow hex color when typing property values when there is a property in the previous line (CSS)', () => { test('Allow hex color or !important when typing property values when there is a property in the previous line (CSS)', () => {
const testContent = ` const testContent = `
.foo { .foo {
margin: 10px; margin: 10px;
margin: #12 margin: #12 !
} }
`; `;
return withRandomFileEditor(testContent, 'css', (editor, doc) => { return withRandomFileEditor(testContent, 'css', (editor, doc) => {
editor.selection = new Selection(3, 12, 3, 12); const cancelSrc = new CancellationTokenSource();
return expandEmmetAbbreviation(null).then(() => { const completionPromise1 = completionProvider.provideCompletionItems(editor.document, new Position(3, 12), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke });
assert.equal(editor.document.getText(), testContent.replace('#12', '#121212')); const completionPromise2 = completionProvider.provideCompletionItems(editor.document, new Position(3, 14), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke });
const cancelSrc = new CancellationTokenSource();
const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(3, 12), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); if (!completionPromise1 || !completionPromise2) {
if (!completionPromise) { assert.equal(1, 2, `Completion promise wasnt returned`);
assert.fail('Completion promise wasnt returned'); return Promise.resolve();
return Promise.resolve(); }
const callBack = (completionList: CompletionList, expandedText: string) => {
if (!completionList.items || !completionList.items.length) {
assert.equal(1, 2, `Empty Completions`);
return;
} }
completionPromise.then(result => { const emmetCompletionItem = completionList.items[0];
if (!result || !result.items || !result.items.length) { assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`);
assert.fail('Completion promise came back empty'); assert.equal((<string>emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`);
return Promise.resolve(); };
}
assert.equal(result.items[0].label, '#121212'); return Promise.all<CompletionList>([completionPromise1, completionPromise2]).then(([result1, result2]) => {
callBack(result1, '#121212');
callBack(result2, '!important');
editor.selections = [new Selection(3, 12, 3, 12), new Selection(3, 14, 3, 14)];
return expandEmmetAbbreviation(null).then(() => {
assert.equal(editor.document.getText(), testContent.replace('#12', '#121212').replace('!', '!important'));
}); });
return Promise.resolve();
}); });
}); });
}); });
...@@ -254,31 +272,40 @@ nav# ...@@ -254,31 +272,40 @@ nav#
}); });
}); });
test('Allow hex colors when typing property values when it is the only property in the rule (CSS)', () => { test('Allow hex colors or !important when typing property values when it is the only property in the rule (CSS)', () => {
const testContent = ` const testContent = `
.foo { .foo {
margin: #12 margin: #12 !
} }
`; `;
return withRandomFileEditor(testContent, 'css', (editor, doc) => { return withRandomFileEditor(testContent, 'css', (editor, doc) => {
editor.selection = new Selection(2, 12, 2, 12); const cancelSrc = new CancellationTokenSource();
return expandEmmetAbbreviation(null).then(() => { const completionPromise1 = completionProvider.provideCompletionItems(editor.document, new Position(2, 12), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke });
assert.equal(editor.document.getText(), testContent.replace('#12', '#121212')); const completionPromise2 = completionProvider.provideCompletionItems(editor.document, new Position(2, 14), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke });
const cancelSrc = new CancellationTokenSource();
const completionPromise = completionProvider.provideCompletionItems(editor.document, new Position(2, 12), cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); if (!completionPromise1 || !completionPromise2) {
if (!completionPromise) { assert.equal(1, 2, `Completion promise wasnt returned`);
assert.fail('Completion promise wasnt returned'); return Promise.resolve();
return Promise.resolve(); }
const callBack = (completionList: CompletionList, expandedText: string) => {
if (!completionList.items || !completionList.items.length) {
assert.equal(1, 2, `Empty Completions`);
return;
} }
completionPromise.then(result => { const emmetCompletionItem = completionList.items[0];
if (!result || !result.items || !result.items.length) { assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`);
assert.fail('Completion promise came back empty'); assert.equal((<string>emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`);
return Promise.resolve(); };
}
assert.equal(result.items[0].label, '#121212'); return Promise.all<CompletionList>([completionPromise1, completionPromise2]).then(([result1, result2]) => {
callBack(result1, '#121212');
callBack(result2, '!important');
editor.selections = [new Selection(2, 12, 2, 12), new Selection(2, 14, 2, 14)];
return expandEmmetAbbreviation(null).then(() => {
assert.equal(editor.document.getText(), testContent.replace('#12', '#121212').replace('!', '!important'));
}); });
return Promise.resolve();
}); });
}); });
}); });
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册