blob: ccbfd4011e5220b0249f9b240e3823fe19cfad3f [file] [log] [blame]
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "../parser/htmlScanner", "vscode-languageserver-types", "../htmlLanguageTypes"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var htmlScanner_1 = require("../parser/htmlScanner");
var vscode_languageserver_types_1 = require("vscode-languageserver-types");
var htmlLanguageTypes_1 = require("../htmlLanguageTypes");
function findDocumentHighlights(document, position, htmlDocument) {
var offset = document.offsetAt(position);
var node = htmlDocument.findNodeAt(offset);
if (!node.tag) {
return [];
}
var result = [];
var startTagRange = getTagNameRange(htmlLanguageTypes_1.TokenType.StartTag, document, node.start);
var endTagRange = typeof node.endTagStart === 'number' && getTagNameRange(htmlLanguageTypes_1.TokenType.EndTag, document, node.endTagStart);
if (startTagRange && covers(startTagRange, position) || endTagRange && covers(endTagRange, position)) {
if (startTagRange) {
result.push({ kind: vscode_languageserver_types_1.DocumentHighlightKind.Read, range: startTagRange });
}
if (endTagRange) {
result.push({ kind: vscode_languageserver_types_1.DocumentHighlightKind.Read, range: endTagRange });
}
}
return result;
}
exports.findDocumentHighlights = findDocumentHighlights;
function isBeforeOrEqual(pos1, pos2) {
return pos1.line < pos2.line || (pos1.line === pos2.line && pos1.character <= pos2.character);
}
function covers(range, position) {
return isBeforeOrEqual(range.start, position) && isBeforeOrEqual(position, range.end);
}
function getTagNameRange(tokenType, document, startOffset) {
var scanner = htmlScanner_1.createScanner(document.getText(), startOffset);
var token = scanner.scan();
while (token !== htmlLanguageTypes_1.TokenType.EOS && token !== tokenType) {
token = scanner.scan();
}
if (token !== htmlLanguageTypes_1.TokenType.EOS) {
return { start: document.positionAt(scanner.getTokenOffset()), end: document.positionAt(scanner.getTokenEnd()) };
}
return null;
}
});