Skip to content

Commit e20b671

Browse files
Merge pull request #724 from Microsoft/braceYourselves
Moved brace matching functionality to use the new syntax tree
2 parents 5a33707 + 4c87375 commit e20b671

File tree

5 files changed

+66
-84
lines changed

5 files changed

+66
-84
lines changed

src/harness/fourslash.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,9 +1661,9 @@ module FourSlash {
16611661
}
16621662

16631663
var actualMatchPosition = -1;
1664-
if (bracePosition >= actual[0].start() && bracePosition <= actual[0].end()) {
1664+
if (bracePosition === actual[0].start()) {
16651665
actualMatchPosition = actual[1].start();
1666-
} else if (bracePosition >= actual[1].start() && bracePosition <= actual[1].end()) {
1666+
} else if (bracePosition === actual[1].start()) {
16671667
actualMatchPosition = actual[0].start();
16681668
} else {
16691669
throw new Error('verifyMatchingBracePosition failed - could not find the brace position: ' + bracePosition + ' in the returned list: (' + actual[0].start() + ',' + actual[0].end() + ') and (' + actual[1].start() + ',' + actual[1].end() + ')');

src/services/braceMatcher.ts

Lines changed: 0 additions & 73 deletions
This file was deleted.

src/services/services.ts

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
/// <reference path='syntax\incrementalParser.ts' />
88
/// <reference path='outliningElementsCollector.ts' />
99
/// <reference path='getScriptLexicalStructureWalker.ts' />
10-
/// <reference path='braceMatcher.ts' />
1110
/// <reference path='breakpoints.ts' />
1211
/// <reference path='indentation.ts' />
1312
/// <reference path='formatting\formatting.ts' />
@@ -2111,7 +2110,7 @@ module ts {
21112110
if (child.getFullStart() <= position && position < child.getEnd()) {
21122111
current = child;
21132112
continue outer;
2114-
}
2113+
}
21152114
}
21162115
return current;
21172116
}
@@ -3759,14 +3758,61 @@ module ts {
37593758
}
37603759

37613760
function getBraceMatchingAtPosition(filename: string, position: number) {
3762-
filename = TypeScript.switchToForwardSlashes(filename);
3763-
var syntaxTree = getSyntaxTree(filename);
3764-
return TypeScript.Services.BraceMatcher.getMatchSpans(syntaxTree, position);
3761+
var sourceFile = getCurrentSourceFile(filename);
3762+
var result: TypeScript.TextSpan[] = [];
3763+
3764+
var token = getTokenAtPosition(sourceFile, position);
3765+
3766+
if (token.getStart(sourceFile) === position) {
3767+
var matchKind = getMatchingTokenKind(token);
3768+
3769+
// Ensure that there is a corresponding token to match ours.
3770+
if (matchKind) {
3771+
var parentElement = token.parent;
3772+
3773+
var childNodes = parentElement.getChildren(sourceFile);
3774+
for (var i = 0, n = childNodes.length; i < n; i++) {
3775+
var current = childNodes[i];
3776+
3777+
if (current.kind === matchKind) {
3778+
var range1 = new TypeScript.TextSpan(token.getStart(sourceFile), token.getWidth(sourceFile));
3779+
var range2 = new TypeScript.TextSpan(current.getStart(sourceFile), current.getWidth(sourceFile));
3780+
3781+
// We want to order the braces when we return the result.
3782+
if (range1.start() < range2.start()) {
3783+
result.push(range1, range2);
3784+
}
3785+
else {
3786+
result.push(range2, range1);
3787+
}
3788+
3789+
break;
3790+
}
3791+
}
3792+
}
3793+
}
3794+
3795+
return result;
3796+
3797+
function getMatchingTokenKind(token: Node): ts.SyntaxKind {
3798+
switch (token.kind) {
3799+
case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken
3800+
case ts.SyntaxKind.OpenParenToken: return ts.SyntaxKind.CloseParenToken;
3801+
case ts.SyntaxKind.OpenBracketToken: return ts.SyntaxKind.CloseBracketToken;
3802+
case ts.SyntaxKind.LessThanToken: return ts.SyntaxKind.GreaterThanToken;
3803+
case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken
3804+
case ts.SyntaxKind.CloseParenToken: return ts.SyntaxKind.OpenParenToken;
3805+
case ts.SyntaxKind.CloseBracketToken: return ts.SyntaxKind.OpenBracketToken;
3806+
case ts.SyntaxKind.GreaterThanToken: return ts.SyntaxKind.LessThanToken;
3807+
}
3808+
3809+
return undefined;
3810+
}
37653811
}
37663812

37673813
function getIndentationAtPosition(filename: string, position: number, editorOptions: EditorOptions) {
37683814
filename = TypeScript.switchToForwardSlashes(filename);
3769-
3815+
37703816
var sourceFile = getCurrentSourceFile(filename);
37713817
var options = new TypeScript.FormattingOptions(!editorOptions.ConvertTabsToSpaces, editorOptions.TabSize, editorOptions.IndentSize, editorOptions.NewLineCharacter)
37723818

tests/cases/fourslash_old/getMatchingBraces.ts renamed to tests/cases/fourslash/getMatchingBraces.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@
3838
////}
3939

4040
test.ranges().forEach((range) => {
41-
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
42-
verify.matchingBracePositionInCurrentFile(range.end - 1, range.start);
43-
});
41+
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
42+
verify.matchingBracePositionInCurrentFile(range.end - 1, range.start);
43+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
////function f[|<T>|][|(x: T)|][|{
2+
//// return x;
3+
////}|]
4+
5+
// If there is an adjacent opening and closing brace,
6+
// then only the opening brace should get highlighted.
7+
test.ranges().forEach(range => {
8+
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
9+
});

0 commit comments

Comments
 (0)