Skip to content

Commit fc6c693

Browse files
committed
Add typing for emmet node
1 parent 9652487 commit fc6c693

12 files changed

Lines changed: 153 additions & 70 deletions

extensions/emmet/src/abbreviationActions.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as vscode from 'vscode';
77
import { expand } from '@emmetio/expand-abbreviation';
88
import parseStylesheet from '@emmetio/css-parser';
99
import parse from '@emmetio/html-matcher';
10-
import Node from '@emmetio/node';
10+
import { Node, HtmlNode, Rule } from 'EmmetNode';
1111
import { getNode, getInnerRange } from './util';
1212
import { getExpandOptions, extractAbbreviation, isStyleSheet, isAbbreviationValid } from 'vscode-emmet-helper';
1313
import { DocumentStreamReader } from './bufferStream';
@@ -125,12 +125,16 @@ export function isValidLocationForEmmetAbbreviation(currentNode: Node, syntax: s
125125
}
126126

127127
if (isStyleSheet(syntax)) {
128-
return currentNode.type !== 'rule'
129-
|| (currentNode.selectorToken && position.isAfter(currentNode.selectorToken.end));
128+
if (currentNode.type !== 'rule') {
129+
return true;
130+
}
131+
const currentCssNode = <Rule>currentNode;
132+
return currentCssNode.selectorToken && position.isAfter(currentCssNode.selectorToken.end);
130133
}
131134

132-
if (currentNode.close) {
133-
return getInnerRange(currentNode).contains(position);
135+
const currentHtmlNode = <HtmlNode>currentNode;
136+
if (currentHtmlNode.close) {
137+
return getInnerRange(currentHtmlNode).contains(position);
134138
}
135139

136140
return false;

extensions/emmet/src/balance.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as vscode from 'vscode';
77
import parse from '@emmetio/html-matcher';
8-
import Node from '@emmetio/node';
8+
import { HtmlNode } from 'EmmetNode';
99
import { DocumentStreamReader } from './bufferStream';
1010
import { isStyleSheet } from 'vscode-emmet-helper';
1111
import { getNode } from './util';
@@ -29,7 +29,7 @@ function balance(out: boolean) {
2929
}
3030
let getRangeFunction = out ? getRangeToBalanceOut : getRangeToBalanceIn;
3131

32-
let rootNode: Node = parse(new DocumentStreamReader(editor.document));
32+
let rootNode: HtmlNode = parse(new DocumentStreamReader(editor.document));
3333

3434
let newSelections: vscode.Selection[] = [];
3535
editor.selections.forEach(selection => {
@@ -41,8 +41,8 @@ function balance(out: boolean) {
4141
editor.selections = newSelections;
4242
}
4343

44-
function getRangeToBalanceOut(document: vscode.TextDocument, selection: vscode.Selection, rootNode: Node): vscode.Selection {
45-
let nodeToBalance = getNode(rootNode, selection.start);
44+
function getRangeToBalanceOut(document: vscode.TextDocument, selection: vscode.Selection, rootNode: HtmlNode): vscode.Selection {
45+
let nodeToBalance = <HtmlNode>getNode(rootNode, selection.start);
4646
if (!nodeToBalance) {
4747
return;
4848
}
@@ -62,9 +62,8 @@ function getRangeToBalanceOut(document: vscode.TextDocument, selection: vscode.S
6262
return;
6363
}
6464

65-
function getRangeToBalanceIn(document: vscode.TextDocument, selection: vscode.Selection, rootNode: Node): vscode.Selection {
66-
let nodeToBalance: Node = getNode(rootNode, selection.start, true);
67-
65+
function getRangeToBalanceIn(document: vscode.TextDocument, selection: vscode.Selection, rootNode: HtmlNode): vscode.Selection {
66+
let nodeToBalance = <HtmlNode>getNode(rootNode, selection.start);
6867
if (!nodeToBalance) {
6968
return;
7069
}

extensions/emmet/src/defaultCompletionProvider.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import * as vscode from 'vscode';
77
import parseStylesheet from '@emmetio/css-parser';
88
import parse from '@emmetio/html-matcher';
9-
import Node from '@emmetio/node';
9+
import { Node, HtmlNode } from 'EmmetNode';
1010
import { DocumentStreamReader } from './bufferStream';
1111
import { EmmetCompletionItemProvider, isStyleSheet } from 'vscode-emmet-helper';
1212
import { isValidLocationForEmmetAbbreviation } from './abbreviationActions';
@@ -37,12 +37,14 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi
3737
let rootNode: Node = parseContent(new DocumentStreamReader(document));
3838
let currentNode = getNode(rootNode, position);
3939

40-
if (!isStyleSheet(syntax)
41-
&& currentNode
42-
&& currentNode.close
43-
&& currentNode.name === 'style'
44-
&& getInnerRange(currentNode).contains(position)) {
45-
return 'css';
40+
if (!isStyleSheet(syntax)) {
41+
const currentHtmlNode = <HtmlNode>currentNode;
42+
if (currentHtmlNode
43+
&& currentHtmlNode.close
44+
&& currentHtmlNode.name === 'style'
45+
&& getInnerRange(currentHtmlNode).contains(position)) {
46+
return 'css';
47+
}
4648
}
4749

4850
if (!isValidLocationForEmmetAbbreviation(currentNode, syntax, position)) {

extensions/emmet/src/matchTag.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as vscode from 'vscode';
77
import parse from '@emmetio/html-matcher';
8-
import Node from '@emmetio/node';
8+
import { HtmlNode } from 'EmmetNode';
99
import { DocumentStreamReader } from './bufferStream';
1010
import { getNode } from './util';
1111

@@ -16,7 +16,7 @@ export function matchTag() {
1616
return;
1717
}
1818

19-
let rootNode: Node = parse(new DocumentStreamReader(editor.document));
19+
let rootNode: HtmlNode = parse(new DocumentStreamReader(editor.document));
2020
let updatedSelections = [];
2121
editor.selections.forEach(selection => {
2222
let updatedSelection = getUpdatedSelections(editor, selection.start, rootNode);
@@ -30,8 +30,8 @@ export function matchTag() {
3030
}
3131
}
3232

33-
function getUpdatedSelections(editor: vscode.TextEditor, position: vscode.Position, rootNode: Node): vscode.Selection {
34-
let currentNode = getNode(rootNode, position, true);
33+
function getUpdatedSelections(editor: vscode.TextEditor, position: vscode.Position, rootNode: HtmlNode): vscode.Selection {
34+
let currentNode = <HtmlNode>getNode(rootNode, position, true);
3535

3636
// If no closing tag or cursor is between open and close tag, then no-op
3737
if (!currentNode.close || (position.isAfter(currentNode.open.end) && position.isBefore(currentNode.close.start))) {

extensions/emmet/src/mergeLines.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import * as vscode from 'vscode';
77
import parse from '@emmetio/html-matcher';
8-
import Node from '@emmetio/node';
8+
import { Node } from 'EmmetNode';
99
import { DocumentStreamReader } from './bufferStream';
1010
import { isStyleSheet } from 'vscode-emmet-helper';
1111
import { getNode } from './util';

extensions/emmet/src/selectItem.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { nextItemHTML, prevItemHTML } from './selectItemHTML';
99
import { nextItemStylesheet, prevItemStylesheet } from './selectItemStylesheet';
1010
import parseStylesheet from '@emmetio/css-parser';
1111
import parse from '@emmetio/html-matcher';
12-
import Node from '@emmetio/node';
12+
import { Node } from 'EmmetNode';
1313
import { DocumentStreamReader } from './bufferStream';
1414
import { isStyleSheet } from 'vscode-emmet-helper';
1515

extensions/emmet/src/selectItemHTML.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
import * as vscode from 'vscode';
77
import { getDeepestNode, findNextWord, findPrevWord, getNode } from './util';
8-
import Node from '@emmetio/node';
8+
import { HtmlNode } from 'EmmetNode';
99

10-
export function nextItemHTML(selectionStart: vscode.Position, selectionEnd: vscode.Position, editor: vscode.TextEditor, rootNode: Node): vscode.Selection {
11-
let currentNode = getNode(rootNode, selectionEnd);
12-
let nextNode: Node;
10+
export function nextItemHTML(selectionStart: vscode.Position, selectionEnd: vscode.Position, editor: vscode.TextEditor, rootNode: HtmlNode): vscode.Selection {
11+
let currentNode = <HtmlNode>getNode(rootNode, selectionEnd);
12+
let nextNode: HtmlNode;
1313

1414
if (currentNode.type !== 'comment') {
1515
// If cursor is in the tag name, select tag
@@ -49,9 +49,9 @@ export function nextItemHTML(selectionStart: vscode.Position, selectionEnd: vsco
4949
return getSelectionFromNode(nextNode, editor.document);
5050
}
5151

52-
export function prevItemHTML(selectionStart: vscode.Position, selectionEnd: vscode.Position, editor: vscode.TextEditor, rootNode: Node): vscode.Selection {
53-
let currentNode = getNode(rootNode, selectionStart);
54-
let prevNode: Node;
52+
export function prevItemHTML(selectionStart: vscode.Position, selectionEnd: vscode.Position, editor: vscode.TextEditor, rootNode: HtmlNode): vscode.Selection {
53+
let currentNode = <HtmlNode>getNode(rootNode, selectionStart);
54+
let prevNode: HtmlNode;
5555

5656
if (currentNode.type !== 'comment' && selectionStart.translate(0, -1).isAfter(currentNode.open.start)) {
5757

@@ -60,23 +60,23 @@ export function prevItemHTML(selectionStart: vscode.Position, selectionEnd: vsco
6060
} else {
6161
// Select the child that appears just before the cursor and is not a comment
6262
prevNode = currentNode.firstChild;
63-
let oldOption: Node;
63+
let oldOption: HtmlNode;
6464
while (prevNode.nextSibling && selectionStart.isAfterOrEqual(prevNode.nextSibling.end)) {
6565
if (prevNode && prevNode.type !== 'comment') {
6666
oldOption = prevNode;
6767
}
6868
prevNode = prevNode.nextSibling;
6969
}
7070

71-
prevNode = getDeepestNode((prevNode && prevNode.type !== 'comment') ? prevNode : oldOption);
71+
prevNode = <HtmlNode>getDeepestNode((prevNode && prevNode.type !== 'comment') ? prevNode : oldOption);
7272
}
7373
}
7474

7575
// Select previous sibling which is not a comment. If none found, then select parent
7676
while (!prevNode && currentNode) {
7777
if (currentNode.previousSibling) {
7878
if (currentNode.previousSibling.type !== 'comment') {
79-
prevNode = getDeepestNode(currentNode.previousSibling);
79+
prevNode = <HtmlNode>getDeepestNode(currentNode.previousSibling);
8080
} else {
8181
currentNode = currentNode.previousSibling;
8282
}
@@ -90,7 +90,7 @@ export function prevItemHTML(selectionStart: vscode.Position, selectionEnd: vsco
9090
return attrSelection ? attrSelection : getSelectionFromNode(prevNode, editor.document);
9191
}
9292

93-
function getSelectionFromNode(node: Node, document: vscode.TextDocument): vscode.Selection {
93+
function getSelectionFromNode(node: HtmlNode, document: vscode.TextDocument): vscode.Selection {
9494
if (node && node.open) {
9595
let selectionStart = (<vscode.Position>node.open.start).translate(0, 1);
9696
let selectionEnd = selectionStart.translate(0, node.name.length);
@@ -99,7 +99,7 @@ function getSelectionFromNode(node: Node, document: vscode.TextDocument): vscode
9999
}
100100
}
101101

102-
function getNextAttribute(selectionStart: vscode.Position, selectionEnd: vscode.Position, document: vscode.TextDocument, node: Node): vscode.Selection {
102+
function getNextAttribute(selectionStart: vscode.Position, selectionEnd: vscode.Position, document: vscode.TextDocument, node: HtmlNode): vscode.Selection {
103103

104104
if (!node.attributes || node.attributes.length === 0 || node.type === 'comment') {
105105
return;
@@ -150,7 +150,7 @@ function getNextAttribute(selectionStart: vscode.Position, selectionEnd: vscode.
150150
}
151151
}
152152

153-
function getPrevAttribute(selectionStart: vscode.Position, selectionEnd: vscode.Position, document: vscode.TextDocument, node: Node): vscode.Selection {
153+
function getPrevAttribute(selectionStart: vscode.Position, selectionEnd: vscode.Position, document: vscode.TextDocument, node: HtmlNode): vscode.Selection {
154154

155155
if (!node.attributes || node.attributes.length === 0 || node.type === 'comment') {
156156
return;

extensions/emmet/src/selectItemStylesheet.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
import * as vscode from 'vscode';
77
import { getDeepestNode, findNextWord, findPrevWord, getNode } from './util';
8-
import Node from '@emmetio/node';
8+
import { Node, CssNode, Rule, Property } from 'EmmetNode';
99

1010
export function nextItemStylesheet(startOffset: vscode.Position, endOffset: vscode.Position, editor: vscode.TextEditor, rootNode: Node): vscode.Selection {
11-
let currentNode = getNode(rootNode, endOffset, true);
11+
let currentNode = <CssNode>getNode(rootNode, endOffset, true);
1212
if (!currentNode) {
13-
currentNode = rootNode;
13+
currentNode = <CssNode>rootNode;
1414
}
1515

1616
// Full property is selected, so select full property value next
@@ -19,16 +19,16 @@ export function nextItemStylesheet(startOffset: vscode.Position, endOffset: vsco
1919
}
2020

2121
// Part or whole of propertyValue is selected, so select the next word in the propertyValue
22-
if (currentNode.type === 'property' && startOffset.isAfterOrEqual(currentNode.valueToken.start) && endOffset.isBeforeOrEqual(currentNode.valueToken.end)) {
22+
if (currentNode.type === 'property' && startOffset.isAfterOrEqual((<Property>currentNode).valueToken.start) && endOffset.isBeforeOrEqual((<Property>currentNode).valueToken.end)) {
2323
let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'next');
2424
if (singlePropertyValue) {
2525
return singlePropertyValue;
2626
}
2727
}
2828

2929
// Cursor is in the selector or in a property
30-
if ((currentNode.type === 'rule' && endOffset.isBefore(currentNode.selectorToken.end))
31-
|| (currentNode.type === 'property' && endOffset.isBefore(currentNode.valueToken.end))) {
30+
if ((currentNode.type === 'rule' && endOffset.isBefore((<Rule>currentNode).selectorToken.end))
31+
|| (currentNode.type === 'property' && endOffset.isBefore((<Property>currentNode).valueToken.end))) {
3232
return getSelectionFromNode(currentNode, editor.document);
3333
}
3434

@@ -48,19 +48,19 @@ export function nextItemStylesheet(startOffset: vscode.Position, endOffset: vsco
4848

4949
}
5050

51-
export function prevItemStylesheet(startOffset: vscode.Position, endOffset: vscode.Position, editor: vscode.TextEditor, rootNode: Node): vscode.Selection {
52-
let currentNode = getNode(rootNode, startOffset);
51+
export function prevItemStylesheet(startOffset: vscode.Position, endOffset: vscode.Position, editor: vscode.TextEditor, rootNode: CssNode): vscode.Selection {
52+
let currentNode = <CssNode>getNode(rootNode, startOffset);
5353
if (!currentNode) {
5454
currentNode = rootNode;
5555
}
5656

5757
// Full property value is selected, so select the whole property next
58-
if (currentNode.type === 'property' && startOffset.isEqual(currentNode.valueToken.start) && endOffset.isEqual(currentNode.valueToken.end)) {
58+
if (currentNode.type === 'property' && startOffset.isEqual((<Property>currentNode).valueToken.start) && endOffset.isEqual((<Property>currentNode).valueToken.end)) {
5959
return getSelectionFromNode(currentNode, editor.document);
6060
}
6161

6262
// Part of propertyValue is selected, so select the prev word in the propertyValue
63-
if (currentNode.type === 'property' && startOffset.isAfterOrEqual(currentNode.valueToken.start) && endOffset.isBeforeOrEqual(currentNode.valueToken.end)) {
63+
if (currentNode.type === 'property' && startOffset.isAfterOrEqual((<Property>currentNode).valueToken.start) && endOffset.isBeforeOrEqual((<Property>currentNode).valueToken.end)) {
6464
let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'prev');
6565
if (singlePropertyValue) {
6666
return singlePropertyValue;
@@ -76,7 +76,7 @@ export function prevItemStylesheet(startOffset: vscode.Position, endOffset: vsco
7676
while (prevNode.nextSibling && startOffset.isAfterOrEqual(prevNode.nextSibling.end)) {
7777
prevNode = prevNode.nextSibling;
7878
}
79-
prevNode = getDeepestNode(prevNode);
79+
prevNode = <CssNode>getDeepestNode(prevNode);
8080

8181
return getSelectionFromProperty(prevNode, editor.document, startOffset, endOffset, false, 'prev');
8282

@@ -88,7 +88,7 @@ function getSelectionFromNode(node: Node, document: vscode.TextDocument): vscode
8888
return;
8989
}
9090

91-
let nodeToSelect = node.type === 'rule' ? node.selectorToken : node;
91+
let nodeToSelect = node.type === 'rule' ? (<Rule>node).selectorToken : node;
9292
return new vscode.Selection(nodeToSelect.start, nodeToSelect.end);
9393
}
9494

@@ -97,27 +97,28 @@ function getSelectionFromProperty(node: Node, document: vscode.TextDocument, sel
9797
if (!node || node.type !== 'property') {
9898
return;
9999
}
100+
const propertyNode = <Property>node;
100101

101-
let propertyValue = node.valueToken.stream.substring(node.valueToken.start, node.valueToken.end);
102-
selectFullValue = selectFullValue || (direction === 'prev' && selectionStart.isEqual(node.valueToken.start) && selectionEnd.isBefore(node.valueToken.end));
102+
let propertyValue = propertyNode.valueToken.stream.substring(propertyNode.valueToken.start, propertyNode.valueToken.end);
103+
selectFullValue = selectFullValue || (direction === 'prev' && selectionStart.isEqual(propertyNode.valueToken.start) && selectionEnd.isBefore(propertyNode.valueToken.end));
103104

104105
if (selectFullValue) {
105-
return new vscode.Selection(node.valueToken.start, node.valueToken.end);
106+
return new vscode.Selection(propertyNode.valueToken.start, propertyNode.valueToken.end);
106107
}
107108

108109
let pos;
109110
if (direction === 'prev') {
110-
if (selectionStart.isEqual(node.valueToken.start)) {
111+
if (selectionStart.isEqual(propertyNode.valueToken.start)) {
111112
return;
112113
}
113-
pos = selectionStart.isAfter(node.valueToken.end) ? propertyValue.length : selectionStart.character - node.valueToken.start.character;
114+
pos = selectionStart.isAfter(propertyNode.valueToken.end) ? propertyValue.length : selectionStart.character - propertyNode.valueToken.start.character;
114115
}
115116

116117
if (direction === 'next') {
117-
if (selectionEnd.isEqual(node.valueToken.end) && (selectionStart.isAfter(node.valueToken.start) || propertyValue.indexOf(' ') === -1)) {
118+
if (selectionEnd.isEqual(propertyNode.valueToken.end) && (selectionStart.isAfter(propertyNode.valueToken.start) || propertyValue.indexOf(' ') === -1)) {
118119
return;
119120
}
120-
pos = selectionEnd.isEqual(node.valueToken.end) ? -1 : selectionEnd.character - node.valueToken.start.character - 1;
121+
pos = selectionEnd.isEqual(propertyNode.valueToken.end) ? -1 : selectionEnd.character - propertyNode.valueToken.start.character - 1;
121122
}
122123

123124

@@ -126,8 +127,8 @@ function getSelectionFromProperty(node: Node, document: vscode.TextDocument, sel
126127
return;
127128
}
128129

129-
const newSelectionStart = (<vscode.Position>node.valueToken.start).translate(0, newSelectionStartOffset);
130-
const newSelectionEnd = (<vscode.Position>node.valueToken.start).translate(0, newSelectionEndOffset);
130+
const newSelectionStart = (<vscode.Position>propertyNode.valueToken.start).translate(0, newSelectionStartOffset);
131+
const newSelectionEnd = (<vscode.Position>propertyNode.valueToken.start).translate(0, newSelectionEndOffset);
131132

132133
return new vscode.Selection(newSelectionStart, newSelectionEnd);
133134
}

extensions/emmet/src/toggleComment.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as vscode from 'vscode';
77
import { getNodesInBetween, getNode } from './util';
88
import parse from '@emmetio/html-matcher';
99
import parseStylesheet from '@emmetio/css-parser';
10-
import Node from '@emmetio/node';
10+
import { Node, Stylesheet } from 'EmmetNode';
1111
import { DocumentStreamReader } from './bufferStream';
1212
import { isStyleSheet } from 'vscode-emmet-helper';
1313

@@ -102,7 +102,7 @@ function getRangesToUnCommentHTML(node: Node, document: vscode.TextDocument): vs
102102
return rangesToUnComment;
103103
}
104104

105-
function toggleCommentStylesheet(document: vscode.TextDocument, selection: vscode.Selection, rootNode: Node): [vscode.Range[], vscode.Range] {
105+
function toggleCommentStylesheet(document: vscode.TextDocument, selection: vscode.Selection, rootNode: Stylesheet): [vscode.Range[], vscode.Range] {
106106

107107
const selectionStart = selection.isReversed ? selection.active : selection.anchor;
108108
const selectionEnd = selection.isReversed ? selection.anchor : selection.active;

0 commit comments

Comments
 (0)