Add typing for emmet node

This commit is contained in:
Ramya Achutha Rao
2017-06-26 13:57:26 -07:00
parent 96524872b3
commit fc6c69311d
12 changed files with 153 additions and 70 deletions

View File

@@ -5,12 +5,12 @@
import * as vscode from 'vscode';
import { getDeepestNode, findNextWord, findPrevWord, getNode } from './util';
import Node from '@emmetio/node';
import { Node, CssNode, Rule, Property } from 'EmmetNode';
export function nextItemStylesheet(startOffset: vscode.Position, endOffset: vscode.Position, editor: vscode.TextEditor, rootNode: Node): vscode.Selection {
let currentNode = getNode(rootNode, endOffset, true);
let currentNode = <CssNode>getNode(rootNode, endOffset, true);
if (!currentNode) {
currentNode = rootNode;
currentNode = <CssNode>rootNode;
}
// Full property is selected, so select full property value next
@@ -19,7 +19,7 @@ export function nextItemStylesheet(startOffset: vscode.Position, endOffset: vsco
}
// Part or whole of propertyValue is selected, so select the next word in the propertyValue
if (currentNode.type === 'property' && startOffset.isAfterOrEqual(currentNode.valueToken.start) && endOffset.isBeforeOrEqual(currentNode.valueToken.end)) {
if (currentNode.type === 'property' && startOffset.isAfterOrEqual((<Property>currentNode).valueToken.start) && endOffset.isBeforeOrEqual((<Property>currentNode).valueToken.end)) {
let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'next');
if (singlePropertyValue) {
return singlePropertyValue;
@@ -27,8 +27,8 @@ export function nextItemStylesheet(startOffset: vscode.Position, endOffset: vsco
}
// Cursor is in the selector or in a property
if ((currentNode.type === 'rule' && endOffset.isBefore(currentNode.selectorToken.end))
|| (currentNode.type === 'property' && endOffset.isBefore(currentNode.valueToken.end))) {
if ((currentNode.type === 'rule' && endOffset.isBefore((<Rule>currentNode).selectorToken.end))
|| (currentNode.type === 'property' && endOffset.isBefore((<Property>currentNode).valueToken.end))) {
return getSelectionFromNode(currentNode, editor.document);
}
@@ -48,19 +48,19 @@ export function nextItemStylesheet(startOffset: vscode.Position, endOffset: vsco
}
export function prevItemStylesheet(startOffset: vscode.Position, endOffset: vscode.Position, editor: vscode.TextEditor, rootNode: Node): vscode.Selection {
let currentNode = getNode(rootNode, startOffset);
export function prevItemStylesheet(startOffset: vscode.Position, endOffset: vscode.Position, editor: vscode.TextEditor, rootNode: CssNode): vscode.Selection {
let currentNode = <CssNode>getNode(rootNode, startOffset);
if (!currentNode) {
currentNode = rootNode;
}
// Full property value is selected, so select the whole property next
if (currentNode.type === 'property' && startOffset.isEqual(currentNode.valueToken.start) && endOffset.isEqual(currentNode.valueToken.end)) {
if (currentNode.type === 'property' && startOffset.isEqual((<Property>currentNode).valueToken.start) && endOffset.isEqual((<Property>currentNode).valueToken.end)) {
return getSelectionFromNode(currentNode, editor.document);
}
// Part of propertyValue is selected, so select the prev word in the propertyValue
if (currentNode.type === 'property' && startOffset.isAfterOrEqual(currentNode.valueToken.start) && endOffset.isBeforeOrEqual(currentNode.valueToken.end)) {
if (currentNode.type === 'property' && startOffset.isAfterOrEqual((<Property>currentNode).valueToken.start) && endOffset.isBeforeOrEqual((<Property>currentNode).valueToken.end)) {
let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'prev');
if (singlePropertyValue) {
return singlePropertyValue;
@@ -76,7 +76,7 @@ export function prevItemStylesheet(startOffset: vscode.Position, endOffset: vsco
while (prevNode.nextSibling && startOffset.isAfterOrEqual(prevNode.nextSibling.end)) {
prevNode = prevNode.nextSibling;
}
prevNode = getDeepestNode(prevNode);
prevNode = <CssNode>getDeepestNode(prevNode);
return getSelectionFromProperty(prevNode, editor.document, startOffset, endOffset, false, 'prev');
@@ -88,7 +88,7 @@ function getSelectionFromNode(node: Node, document: vscode.TextDocument): vscode
return;
}
let nodeToSelect = node.type === 'rule' ? node.selectorToken : node;
let nodeToSelect = node.type === 'rule' ? (<Rule>node).selectorToken : node;
return new vscode.Selection(nodeToSelect.start, nodeToSelect.end);
}
@@ -97,27 +97,28 @@ function getSelectionFromProperty(node: Node, document: vscode.TextDocument, sel
if (!node || node.type !== 'property') {
return;
}
const propertyNode = <Property>node;
let propertyValue = node.valueToken.stream.substring(node.valueToken.start, node.valueToken.end);
selectFullValue = selectFullValue || (direction === 'prev' && selectionStart.isEqual(node.valueToken.start) && selectionEnd.isBefore(node.valueToken.end));
let propertyValue = propertyNode.valueToken.stream.substring(propertyNode.valueToken.start, propertyNode.valueToken.end);
selectFullValue = selectFullValue || (direction === 'prev' && selectionStart.isEqual(propertyNode.valueToken.start) && selectionEnd.isBefore(propertyNode.valueToken.end));
if (selectFullValue) {
return new vscode.Selection(node.valueToken.start, node.valueToken.end);
return new vscode.Selection(propertyNode.valueToken.start, propertyNode.valueToken.end);
}
let pos;
if (direction === 'prev') {
if (selectionStart.isEqual(node.valueToken.start)) {
if (selectionStart.isEqual(propertyNode.valueToken.start)) {
return;
}
pos = selectionStart.isAfter(node.valueToken.end) ? propertyValue.length : selectionStart.character - node.valueToken.start.character;
pos = selectionStart.isAfter(propertyNode.valueToken.end) ? propertyValue.length : selectionStart.character - propertyNode.valueToken.start.character;
}
if (direction === 'next') {
if (selectionEnd.isEqual(node.valueToken.end) && (selectionStart.isAfter(node.valueToken.start) || propertyValue.indexOf(' ') === -1)) {
if (selectionEnd.isEqual(propertyNode.valueToken.end) && (selectionStart.isAfter(propertyNode.valueToken.start) || propertyValue.indexOf(' ') === -1)) {
return;
}
pos = selectionEnd.isEqual(node.valueToken.end) ? -1 : selectionEnd.character - node.valueToken.start.character - 1;
pos = selectionEnd.isEqual(propertyNode.valueToken.end) ? -1 : selectionEnd.character - propertyNode.valueToken.start.character - 1;
}
@@ -126,8 +127,8 @@ function getSelectionFromProperty(node: Node, document: vscode.TextDocument, sel
return;
}
const newSelectionStart = (<vscode.Position>node.valueToken.start).translate(0, newSelectionStartOffset);
const newSelectionEnd = (<vscode.Position>node.valueToken.start).translate(0, newSelectionEndOffset);
const newSelectionStart = (<vscode.Position>propertyNode.valueToken.start).translate(0, newSelectionStartOffset);
const newSelectionEnd = (<vscode.Position>propertyNode.valueToken.start).translate(0, newSelectionEndOffset);
return new vscode.Selection(newSelectionStart, newSelectionEnd);
}