diff --git a/src/services/selectorPrinting.ts b/src/services/selectorPrinting.ts index 7ceba029..cbcb7c64 100644 --- a/src/services/selectorPrinting.ts +++ b/src/services/selectorPrinting.ts @@ -357,9 +357,13 @@ function selectorToSpecificityMarkedString(node: nodes.Node): MarkedString { export function selectorToMarkedString(node: nodes.Selector): MarkedString[] { const root = selectorToElement(node); - const markedStrings = new MarkedStringPrinter('"').print(root); - markedStrings.push(selectorToSpecificityMarkedString(node)); - return markedStrings; + if (root) { + const markedStrings = new MarkedStringPrinter('"').print(root); + markedStrings.push(selectorToSpecificityMarkedString(node)); + return markedStrings; + } else { + return []; + } } export function simpleSelectorToMarkedString(node: nodes.SimpleSelector): MarkedString[] { @@ -438,7 +442,7 @@ function isNewSelectorContext(node: nodes.Node): boolean { return false; } -export function selectorToElement(node: nodes.Selector): Element { +export function selectorToElement(node: nodes.Selector): Element | null { if (node.matches('@at-root')) { return null; } diff --git a/src/test/css/hover.test.ts b/src/test/css/hover.test.ts new file mode 100644 index 00000000..2cb72080 --- /dev/null +++ b/src/test/css/hover.test.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as assert from 'assert'; +import { TextDocument, FoldingRange, FoldingRangeKind, Hover } from 'vscode-languageserver-types'; +import { CSSHover } from '../../services/cssHover'; +import { SCSSParser } from '../../parser/scssParser'; + +function assertSCSSHover(value: string, expected: Hover): void { + const languageId = 'scss' + + let offset = value.indexOf('|'); + value = value.substr(0, offset) + value.substr(offset + 1); + + const hover = new CSSHover() + const document = TextDocument.create(`test://foo/bar.${languageId}`, languageId, 1, value); + const hoverResult = hover.doHover(document, document.positionAt(offset), new SCSSParser().parseStylesheet(document)); + + if (hoverResult.range && expected.range) { + assert.equal(hoverResult.range, expected.range); + } + assert.deepEqual(hoverResult.contents, expected.contents); +} + +suite('SCSS Hover', () => { + test('@at-root', () => { + + assertSCSSHover('.test { @|at-root { }', { + contents: [] + }) + }); +});