Specialize findToken walk.

This commit is contained in:
Cyrus Najmabadi
2014-11-04 00:49:42 -08:00
parent c9edc5963e
commit 12d3d8a741
4 changed files with 46 additions and 8 deletions

View File

@@ -2261,7 +2261,6 @@ function generateServicesUtilities() {
}
result += "undefined";
}
;
for (var i = 0; i < definitions.length; i++) {
var definition = definitions[i];
result += ",\r\n";
@@ -2282,6 +2281,9 @@ function generateServicesUtilities() {
result += " export function childAt(element: ISyntaxElement, index: number): ISyntaxElement {\r\n";
result += " if (isList(element)) { return (<ISyntaxNodeOrToken[]>element)[index]; }\r\n";
result += " return childAtArray[element.kind](element, index);\r\n";
result += " }\r\n\r\n";
result += " export function getChildAtFunction(element: ISyntaxNodeOrToken): (nodeOrToken: ISyntaxElement, index: number) => ISyntaxElement {\r\n";
result += " return childAtArray[element.kind];\r\n";
result += " }\r\n";
result += "}";
return result;

View File

@@ -53,7 +53,7 @@ module TypeScript {
throw Errors.argumentOutOfRange("position");
}
var token = findTokenWorker(sourceUnit, 0, position);
var token = findTokenInNodeOrToken(sourceUnit, 0, position);
if (token) {
Debug.assert(token.fullWidth() > 0);
return token;
@@ -113,13 +113,40 @@ module TypeScript {
}
function findTokenWorker(element: ISyntaxElement, elementPosition: number, position: number): ISyntaxToken {
if (isToken(element)) {
return <ISyntaxToken>element;
if (isList(element)) {
return findTokenInList(<ISyntaxNodeOrToken[]>element, elementPosition, position);
}
else {
return findTokenInNodeOrToken(<ISyntaxNodeOrToken>element, elementPosition, position);
}
}
function findTokenInList(list: ISyntaxNodeOrToken[], elementPosition: number, position: number): ISyntaxToken {
for (var i = 0, n = list.length; i < n; i++) {
var child = list[i];
var childFullWidth = fullWidth(child);
var elementEndPosition = elementPosition + childFullWidth;
if (position < elementEndPosition) {
return findTokenWorker(child, elementPosition, position);
}
elementPosition = elementEndPosition;
}
// Consider: we could use a binary search here to find the child more quickly.
for (var i = 0, n = childCount(element); i < n; i++) {
var child = childAt(element, i);
return undefined;
}
function findTokenInNodeOrToken(nodeOrToken: ISyntaxNodeOrToken, elementPosition: number, position: number): ISyntaxToken {
if (isToken(nodeOrToken)) {
return <ISyntaxToken>nodeOrToken;
}
var childAtFunction = getChildAtFunction(nodeOrToken);
for (var i = 0, n = childCount(nodeOrToken); i < n; i++) {
var child = childAtFunction(nodeOrToken, i);
if (child) {
var childFullWidth = fullWidth(child);

View File

@@ -1534,7 +1534,7 @@ function generateServicesUtilities(): string {
result += "0";
}
else {
var definition = TypeScript.ArrayUtilities.first(definitions,d => firstKind(d) === i);
var definition = TypeScript.ArrayUtilities.first(definitions, d => firstKind(d) === i);
result += definition.children.length;
}
}
@@ -1609,8 +1609,13 @@ function generateServicesUtilities(): string {
//}
//result += " }\r\n";
result += " }\r\n\r\n";
result += " export function getChildAtFunction(element: ISyntaxNodeOrToken): (nodeOrToken: ISyntaxElement, index: number) => ISyntaxElement {\r\n";
result += " return childAtArray[element.kind];\r\n";
result += " }\r\n";
result += "}";

View File

@@ -696,4 +696,8 @@ module TypeScript {
if (isList(element)) { return (<ISyntaxNodeOrToken[]>element)[index]; }
return childAtArray[element.kind](element, index);
}
export function getChildAtFunction(element: ISyntaxNodeOrToken): (nodeOrToken: ISyntaxElement, index: number) => ISyntaxElement {
return childAtArray[element.kind];
}
}