mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-17 21:06:50 -05:00
Specialize findToken walk.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 += "}";
|
||||
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user