From 8954538399b8c8d838178c1e61a47560f9dfd3cb Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sun, 2 Nov 2014 23:58:18 -0800 Subject: [PATCH] Remove SyntaxNode.ts file Lots of cleanup of the syntax generator. Sort definitions. Remove unused class. --- src/services/syntax/SyntaxGenerator.js | 849 +---------- .../syntax/defaultSyntaxVisitor.generated.ts | 377 ----- src/services/syntax/references.ts | 1 - src/services/syntax/syntaxGenerator.ts | 1254 +---------------- src/services/syntax/syntaxNode.ts | 34 - 5 files changed, 32 insertions(+), 2483 deletions(-) delete mode 100644 src/services/syntax/defaultSyntaxVisitor.generated.ts delete mode 100644 src/services/syntax/syntaxNode.ts diff --git a/src/services/syntax/SyntaxGenerator.js b/src/services/syntax/SyntaxGenerator.js index 3c0ad3077af..de5987c253b 100644 --- a/src/services/syntax/SyntaxGenerator.js +++ b/src/services/syntax/SyntaxGenerator.js @@ -883,7 +883,6 @@ var TypeScript; SyntaxFacts.isType = isType; })(SyntaxFacts = TypeScript.SyntaxFacts || (TypeScript.SyntaxFacts = {})); })(TypeScript || (TypeScript = {})); -var argumentChecks = false; var forPrettyPrinter = false; var interfaces = { IMemberDeclarationSyntax: 'IClassElementSyntax', @@ -1873,22 +1872,15 @@ var definitions = [ ]; function firstKind(definition) { var kindName = getNameWithoutSuffix(definition); - var kind = TypeScript.SyntaxKind[kindName]; - return kind; + return TypeScript.SyntaxKind[kindName]; } -var sortedDefinitions = definitions.sort(function (d1, d2) { return firstKind(d1) - firstKind(d2); }); +definitions.sort(function (d1, d2) { return firstKind(d1) - firstKind(d2); }); function getStringWithoutSuffix(definition) { if (TypeScript.StringUtilities.endsWith(definition, "Syntax")) { return definition.substring(0, definition.length - "Syntax".length); } return definition; } -function getStringWithoutPrefix(definition) { - if (definition.charAt(0) == "I" && definition.charAt(1).toUpperCase() == definition.charAt(1)) { - return definition.substring(1); - } - return definition; -} function getNameWithoutSuffix(definition) { return getStringWithoutSuffix(definition.name); } @@ -1906,9 +1898,6 @@ function getType(child) { return child.type; } } -function pascalCase(value) { - return value.substr(0, 1).toUpperCase() + value.substr(1); -} function camelCase(value) { return value.substr(0, 1).toLowerCase() + value.substr(1); } @@ -1918,339 +1907,6 @@ function getSafeName(child) { } return child.name; } -function getPropertyAccess(child, instance) { - if (instance === void 0) { instance = "this"; } - if (child.type === "SyntaxKind") { - return instance + "._kind"; - } - return instance + "." + child.name; -} -function generateProperties(definition) { - var result = ""; - if (definition.name === "SourceUnitSyntax") { - result += " public syntaxTree: SyntaxTree = undefined;\r\n"; - } - var newLine = false; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (getType(child) === "SyntaxKind") { - result += " private _" + child.name + ": " + getType(child) + ";\r\n"; - newLine = true; - } - else if (child.name === "arguments") { - result += " public " + child.name + ": " + getType(child) + ";\r\n"; - } - } - if (newLine) { - result += "\r\n"; - } - return result; -} -function generateNullChecks(definition) { - var result = ""; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (!child.isOptional && !child.isToken) { - result += " if (!" + child.name + ") { throw Errors.argumentNull('" + child.name + "'); }\r\n"; - } - } - return result; -} -function generateIfKindCheck(child, tokenKinds, indent) { - var result = ""; - result += indent + " if ("; - for (var j = 0; j < tokenKinds.length; j++) { - if (j > 0) { - result += " && "; - } - var tokenKind = tokenKinds[j]; - if (tokenKind === "IdentifierName") { - result += "!SyntaxFacts.isIdentifierName(" + child.name + ".tokenKind)"; - } - else { - result += child.name + ".tokenKind !== SyntaxKind." + tokenKind; - } - } - result += ") { throw Errors.argument('" + child.name + "'); }\r\n"; - return result; -} -function generateSwitchCase(tokenKind, indent) { - return indent + " case SyntaxKind." + tokenKind + ":\r\n"; -} -function generateBreakStatement(indent) { - return indent + " break;\r\n"; -} -function generateSwitchCases(tokenKinds, indent) { - var result = ""; - for (var j = 0; j < tokenKinds.length; j++) { - var tokenKind = tokenKinds[j]; - result += generateSwitchCase(tokenKind, indent); - } - if (tokenKinds.length > 0) { - result += generateBreakStatement(indent); - } - return result; -} -function generateDefaultCase(child, indent) { - var result = ""; - result += indent + " default:\r\n"; - result += indent + " throw Errors.argument('" + child.name + "');\r\n"; - return result; -} -function generateSwitchKindCheck(child, tokenKinds, indent) { - if (tokenKinds.length === 0) { - return ""; - } - var result = ""; - var identifierName = TypeScript.ArrayUtilities.where(tokenKinds, function (v) { return v.indexOf("IdentifierName") >= 0; }); - var notIdentifierName = TypeScript.ArrayUtilities.where(tokenKinds, function (v) { return v.indexOf("IdentifierName") < 0; }); - if (identifierName.length > 0) { - result += indent + " if (!SyntaxFacts.isIdentifierName(" + child.name + ".tokenKind)) {\r\n"; - if (notIdentifierName.length === 0) { - result += indent + " throw Errors.argument('" + child.name + "');\r\n"; - result += indent + " }\r\n"; - return result; - } - indent += " "; - } - if (notIdentifierName.length <= 2) { - result += generateIfKindCheck(child, notIdentifierName, indent); - } - else if (notIdentifierName.length > 2) { - result += indent + " switch (" + child.name + ".tokenKind) {\r\n"; - result += generateSwitchCases(notIdentifierName, indent); - result += generateDefaultCase(child, indent); - result += indent + " }\r\n"; - } - if (identifierName.length > 0) { - result += indent + " }\r\n"; - } - return result; -} -function tokenKinds(child) { - return child.tokenKinds ? child.tokenKinds : [pascalCase(child.name)]; -} -function generateKindCheck(child) { - var indent = ""; - var result = ""; - if (child.isOptional) { - indent = " "; - result += " if (" + child.name + ") {\r\n"; - } - var kinds = tokenKinds(child); - if (kinds.length <= 2) { - result += generateIfKindCheck(child, kinds, indent); - } - else { - result += generateSwitchKindCheck(child, kinds, indent); - } - if (child.isOptional) { - result += " }\r\n"; - } - return result; -} -function generateKindChecks(definition) { - var result = ""; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (child.isToken) { - result += generateKindCheck(child); - } - } - return result; -} -function generateArgumentChecks(definition) { - var result = ""; - if (argumentChecks) { - result += generateNullChecks(definition); - result += generateKindChecks(definition); - if (definition.children.length > 0) { - result += "\r\n"; - } - } - return result; -} -function generateConstructor(definition) { - var i; - var child; - var base = baseType(definition); - var result = ""; - result += " constructor("; - var children = definition.children; - var kindChild = undefined; - for (i = 0; i < children.length; i++) { - child = children[i]; - if (getType(child) === "SyntaxKind") { - kindChild = child; - } - if (getType(child) !== "SyntaxKind" && child.name !== "arguments") { - result += "public "; - } - result += getSafeName(child) + ": " + getType(child); - result += ",\r\n "; - } - result += "data: number) {\r\n"; - if (kindChild) { - result += " super(kind, data); \r\n"; - } - else { - result += " super(SyntaxKind." + getNameWithoutSuffix(definition) + ", data); \r\n"; - } - if (definition.children.length > 0) { - result += "\r\n"; - } - result += generateArgumentChecks(definition); - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - if (child.type === "SyntaxKind" || child.name === "arguments") { - result += " " + getPropertyAccess(child) + " = " + getSafeName(child) + ";\r\n"; - } - } - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - if (child.type !== "SyntaxKind") { - if (child.isOptional) { - result += " " + getSafeName(child) + " && (" + getSafeName(child) + ".parent = this);\r\n"; - } - else { - result += " " + getSafeName(child) + ".parent = this;\r\n"; - } - } - } - result += " }\r\n"; - return result; -} -function isOptional(child) { - if (child.isOptional) { - return true; - } - if (child.isList && !child.requiresAtLeastOneItem) { - return true; - } - if (child.isSeparatedList && !child.requiresAtLeastOneItem) { - return true; - } - return false; -} -function generateFactory1Method(definition) { - return ""; - var mandatoryChildren = TypeScript.ArrayUtilities.where(definition.children, function (c) { return !isOptional(c); }); - if (mandatoryChildren.length === definition.children.length) { - return ""; - } - var result = "\r\n public static create("; - var i; - var child; - for (i = 0; i < mandatoryChildren.length; i++) { - child = mandatoryChildren[i]; - result += child.name + ": " + getType(child); - if (i < mandatoryChildren.length - 1) { - result += ",\r\n "; - } - } - result += "): " + definition.name + " {\r\n"; - result += " return new " + definition.name + "("; - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - if (!isOptional(child)) { - result += child.name; - } - else if (child.isList) { - result += "Syntax.emptyList<" + child.elementType + ">()"; - } - else if (child.isSeparatedList) { - result += "Syntax.emptySeparatedList<" + child.elementType + ">()"; - } - else { - result += "undefined"; - } - result += ", "; - } - result += "/*data:*/ 0);\r\n"; - result += " }\r\n"; - return result; -} -function isKeywordOrPunctuation(kind) { - if (TypeScript.StringUtilities.endsWith(kind, "Keyword")) { - return true; - } - if (TypeScript.StringUtilities.endsWith(kind, "Token") && kind !== "IdentifierName" && kind !== "EndOfFileToken") { - return true; - } - return false; -} -function isDefaultConstructable(definition) { - if (!definition) { - return false; - } - for (var i = 0; i < definition.children.length; i++) { - if (isMandatory(definition.children[i])) { - return false; - } - } - return true; -} -function isMandatory(child) { - if (isOptional(child)) { - return false; - } - if (child.type === "SyntaxKind" || child.isList || child.isSeparatedList) { - return true; - } - if (child.isToken) { - var kinds = tokenKinds(child); - var isFixed = kinds.length === 1 && isKeywordOrPunctuation(kinds[0]); - return !isFixed; - } - return !isDefaultConstructable(memberDefinitionType(child)); -} -function generateFactory2Method(definition) { - return ""; - var mandatoryChildren = TypeScript.ArrayUtilities.where(definition.children, isMandatory); - if (mandatoryChildren.length === definition.children.length) { - return ""; - } - var i; - var child; - var result = "\r\n public static create1("; - for (i = 0; i < mandatoryChildren.length; i++) { - child = mandatoryChildren[i]; - result += child.name + ": " + getType(child); - if (i < mandatoryChildren.length - 1) { - result += ",\r\n "; - } - } - result += "): " + definition.name + " {\r\n"; - result += " return new " + definition.name + "("; - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - if (isMandatory(child)) { - result += child.name; - } - else if (child.isList) { - result += "Syntax.emptyList<" + child.elementType + ">()"; - } - else if (child.isSeparatedList) { - result += "Syntax.emptySeparatedList<" + child.elementType + ">()"; - } - else if (isOptional(child)) { - result += "undefined"; - } - else if (child.isToken) { - result += "Syntax.token(SyntaxKind." + tokenKinds(child)[0] + ")"; - } - else { - result += child.type + ".create1()"; - } - result += ", "; - } - result += "/*data:*/ 0);\r\n"; - result += " }\r\n"; - return result; -} -function generateFactoryMethod(definition) { - return generateFactory1Method(definition) + generateFactory2Method(definition); -} function generateBrands(definition, accessibility) { var properties = ""; var types = []; @@ -2288,300 +1944,6 @@ function generateBrands(definition, accessibility) { } return properties; } -function generateAcceptMethod(definition) { - var result = ""; - result += "\r\n"; - result += " public accept(visitor: ISyntaxVisitor): SyntaxKind {\r\n"; - result += " return visitor.visit" + getNameWithoutSuffix(definition) + "(this);\r\n"; - result += " }\r\n"; - return result; -} -function generateKindMethod(definition) { - var result = ""; - result += "\r\n"; - result += " public kind(): SyntaxKind {\r\n"; - result += " return SyntaxKind." + getNameWithoutSuffix(definition) + ";\r\n"; - result += " }\r\n"; - return result; -} -function generateSlotMethods(definition) { - var result = ""; - result += "\r\n"; - var slotCount = definition.children.length; - result += " public childCount(): number {\r\n"; - result += " return " + slotCount + ";\r\n"; - result += " }\r\n\r\n"; - result += " public childAt(slot: number): ISyntaxElement {\r\n"; - if (slotCount === 0) { - result += " throw Errors.invalidOperation();\r\n"; - } - else { - result += " switch (slot) {\r\n"; - var index = 0; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (child.type === "SyntaxKind") { - continue; - } - result += " case " + index + ": return this." + child.name + ";\r\n"; - index++; - } - result += " default: throw Errors.invalidOperation();\r\n"; - result += " }\r\n"; - } - result += " }\r\n"; - return result; -} -function generateFirstTokenMethod(definition) { - var result = ""; - result += "\r\n"; - result += " public firstToken(): ISyntaxToken {\r\n"; - result += " var token: ISyntaxToken = undefined;\r\n"; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (getType(child) === "SyntaxKind") { - continue; - } - if (child.name === "endOfFileToken") { - continue; - } - result += " if ("; - if (child.isOptional) { - result += getPropertyAccess(child) + " && "; - } - if (child.isToken) { - result += getPropertyAccess(child) + ".width() > 0"; - result += ") { return " + getPropertyAccess(child) + "; }\r\n"; - } - else { - result += "(token = " + getPropertyAccess(child) + ".firstToken())"; - result += ") { return token; }\r\n"; - } - } - if (definition.name === "SourceUnitSyntax") { - result += " return this._endOfFileToken;\r\n"; - } - else { - result += " return undefined;\r\n"; - } - result += " }\r\n"; - result += " }\r\n"; - return result; -} -function generateLastTokenMethod(definition) { - var result = ""; - result += "\r\n"; - result += " public lastToken(): ISyntaxToken {\r\n"; - if (definition.name === "SourceUnitSyntax") { - result += " return this._endOfFileToken;\r\n"; - } - else { - result += " var token: ISyntaxToken = undefined;\r\n"; - for (var i = definition.children.length - 1; i >= 0; i--) { - var child = definition.children[i]; - if (getType(child) === "SyntaxKind") { - continue; - } - if (child.name === "endOfFileToken") { - continue; - } - result += " if ("; - if (child.isOptional) { - result += getPropertyAccess(child) + " && "; - } - if (child.isToken) { - result += getPropertyAccess(child) + ".width() > 0"; - result += ") { return " + getPropertyAccess(child) + "; }\r\n"; - } - else { - result += "(token = " + getPropertyAccess(child) + ".lastToken())"; - result += ") { return token; }\r\n"; - } - } - result += " return undefined;\r\n"; - } - result += " }\r\n"; - return result; -} -function baseType(definition) { - return TypeScript.ArrayUtilities.firstOrDefault(definitions, function (d) { return d.name === definition.baseType; }); -} -function memberDefinitionType(child) { - return TypeScript.ArrayUtilities.firstOrDefault(definitions, function (d) { return d.name === child.type; }); -} -function derivesFrom(def1, def2) { - var current = def1; - while (current) { - var base = baseType(current); - if (base === def2) { - return true; - } - current = base; - } - return false; -} -function contains(definition, child) { - return TypeScript.ArrayUtilities.any(definition.children, function (c) { return c.name === child.name && c.isList === child.isList && c.isSeparatedList === child.isSeparatedList && c.isToken === child.isToken && c.type === child.type; }); -} -function generateAccessors(definition) { - var result = ""; - return result; -} -function generateWithMethod(definition, child) { - return ""; - var result = ""; - result += "\r\n"; - result += " public with" + pascalCase(child.name) + "(" + getSafeName(child) + ": " + getType(child) + "): " + definition.name + " {\r\n"; - result += " return this.update("; - for (var i = 0; i < definition.children.length; i++) { - if (i > 0) { - result += ", "; - } - if (definition.children[i] === child) { - result += getSafeName(child); - } - else { - result += getPropertyAccess(definition.children[i]); - } - } - result += ");\r\n"; - result += " }\r\n"; - if (child.isList || child.isSeparatedList) { - if (TypeScript.StringUtilities.endsWith(child.name, "s")) { - var pascalName = pascalCase(child.name); - pascalName = pascalName.substring(0, pascalName.length - 1); - var argName = getSafeName(child); - argName = argName.substring(0, argName.length - 1); - result += "\r\n"; - result += " public with" + pascalName + "(" + argName + ": " + child.elementType + "): " + definition.name + " {\r\n"; - result += " return this.with" + pascalCase(child.name) + "("; - if (child.isList) { - result += "Syntax.list<" + child.elementType + ">([" + argName + "])"; - } - else { - result += "Syntax.separatedList<" + child.elementType + ">([" + argName + "])"; - } - result += ");\r\n"; - result += " }\r\n"; - } - } - return result; -} -function generateWithMethods(definition) { - var result = ""; - return ""; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - result += generateWithMethod(definition, child); - } - return result; -} -function generateTriviaMethods(definition) { - return ""; - var result = "\r\n"; - result += " public withLeadingTrivia(trivia: ISyntaxTriviaList): " + definition.name + " {\r\n"; - result += " return <" + definition.name + ">super.withLeadingTrivia(trivia);\r\n"; - result += " }\r\n\r\n"; - result += " public withTrailingTrivia(trivia: ISyntaxTriviaList): " + definition.name + " {\r\n"; - result += " return <" + definition.name + ">super.withTrailingTrivia(trivia);\r\n"; - result += " }\r\n"; - return result; -} -function generateUpdateMethod(definition) { - var result = ""; - result += "\r\n"; - result += " public update("; - var i; - var child; - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - result += getSafeName(child) + ": " + getType(child); - if (i < definition.children.length - 1) { - result += ",\r\n "; - } - } - result += "): " + definition.name + " {\r\n"; - if (definition.children.length === 0) { - result += " return this;\r\n"; - } - else { - result += " if ("; - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - if (i !== 0) { - result += " && "; - } - result += getPropertyAccess(child) + " === " + getSafeName(child); - } - result += ") {\r\n"; - result += " return this;\r\n"; - result += " }\r\n\r\n"; - result += " return new " + definition.name + "("; - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - result += getSafeName(child); - result += ", "; - } - result += "this.parsedInStrictMode() ? SyntaxConstants.NodeParsedInStrictModeMask : 0);\r\n"; - } - result += " }\r\n"; - return result; -} -function generateNode(definition, abstract) { - var result = " export class " + definition.name + " implements ISyntaxNode"; - if (definition.interfaces) { - result += ", "; - result += definition.interfaces.join(", "); - } - result += " {\r\n"; - result += " public __data: number; public __cachedTokens: ISyntaxToken[]; public parent: ISyntaxElement;\r\n"; - if (definition.name === "SourceUnitSyntax") { - result += " public syntaxTree: SyntaxTree = undefined;\r\n"; - } - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - result += " public " + child.name + ": " + getType(child) + ";\r\n"; - } - result += generateBrands(definition, true); - result += " constructor(data: number"; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - result += ", " + getSafeName(child) + ": " + getType(child); - } - result += ") {\r\n"; - result += " if (data) { this.__data = data; }\r\n"; - if (definition.name === "SourceUnitSyntax") { - result += " this.parent = undefined,\r\n"; - } - if (definition.children) { - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (child.excludeFromAST && abstract) { - continue; - } - result += " this." + child.name + " = " + getSafeName(child) + ",\r\n"; - } - } - if (definition.children.length > 0) { - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (i) { - result += ",\r\n"; - } - if (child.isOptional) { - result += " " + getSafeName(child) + " && (" + getSafeName(child) + ".parent = this)"; - } - else { - result += " " + getSafeName(child) + ".parent = this"; - } - } - result += ";\r\n"; - } - result += " }\r\n"; - result += generateKindMethod(definition); - result += " }"; - return result; -} function generateConstructorFunction(definition) { var result = " export var " + definition.name + ": " + getNameWithoutSuffix(definition) + "Constructor = function(data: number"; for (var i = 0; i < definition.children.length; i++) { @@ -2623,23 +1985,6 @@ function generateConstructorFunction(definition) { result += " " + definition.name + ".prototype.kind = function() { return SyntaxKind." + getNameWithoutSuffix(definition) + "; }\r\n"; return result; } -function syntaxKindName(kind) { - for (var name in TypeScript.SyntaxKind) { - if (TypeScript.SyntaxKind[name] === kind) { - return name; - } - } - throw new Error(); -} -function getDefinitionForKind(kind) { - var kindName = syntaxKindName(kind); - return TypeScript.ArrayUtilities.firstOrDefault(definitions, function (d) { - if (getNameWithoutSuffix(d) === kindName) { - return true; - } - return false; - }); -} function generateSyntaxInterfaces() { var result = "///\r\n\r\n"; result += "module TypeScript {\r\n"; @@ -2680,7 +2025,7 @@ function generateSyntaxInterface(definition) { result += " }\r\n"; return result; } -function generateNodes(abstract) { +function generateNodes() { var result = "///\r\n\r\n"; result += "module TypeScript"; result += " {\r\n"; @@ -2697,54 +2042,6 @@ function generateNodes(abstract) { function isInterface(name) { return name.substr(0, 1) === "I" && name.substr(1, 1).toUpperCase() === name.substr(1, 1); } -function isNodeOrToken(child) { - return child.type && isInterface(child.type); -} -function generateRewriter() { - var result = "///\r\n\r\n"; - result += "module TypeScript {\r\n" + " export class SyntaxRewriter implements ISyntaxVisitor {\r\n" + " public visitToken(token: ISyntaxToken): ISyntaxToken {\r\n" + " return token;\r\n" + " }\r\n" + "\r\n" + " public visitNode(node: ISyntaxNode): ISyntaxNode {\r\n" + " return visitNodeOrToken(this, node);\r\n" + " }\r\n" + "\r\n" + " public visitNodeOrToken(node: ISyntaxNodeOrToken): ISyntaxNodeOrToken {\r\n" + " return isToken(node) ? this.visitToken(node) : this.visitNode(node);\r\n" + " }\r\n" + "\r\n" + " public visitList(list: T): T {\r\n" + " var newItems: T = undefined;\r\n" + "\r\n" + " for (var i = 0, n = list.length; i < n; i++) {\r\n" + " var item = list[i];\r\n" + " var newItem = this.visitNodeOrToken(item);\r\n" + "\r\n" + " if (item !== newItem && !newItems) {\r\n" + " newItems = [];\r\n" + " for (var j = 0; j < i; j++) {\r\n" + " newItems.push(list[j]);\r\n" + " }\r\n" + " }\r\n" + "\r\n" + " if (newItems) {\r\n" + " newItems.push(newItem);\r\n" + " }\r\n" + " }\r\n" + "\r\n" + " // Debug.assert(!newItems || newItems.length === childCount(list));\r\n" + " return !newItems ? list : Syntax.list(newItems);\r\n" + " }\r\n" + "\r\n"; - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - result += "\r\n"; - result += " public visit" + getNameWithoutSuffix(definition) + "(node: " + definition.name + "): any {\r\n"; - if (definition.children.length === 0) { - result += " return node;\r\n"; - result += " }\r\n"; - continue; - } - result += " return node.update(\r\n"; - for (var j = 0; j < definition.children.length; j++) { - var child = definition.children[j]; - result += " "; - if (child.isOptional) { - result += "!node." + child.name + " ? undefined : "; - } - if (child.isToken) { - result += "this.visitToken(node." + child.name + ")"; - } - else if (child.isList || child.isSeparatedList) { - result += "this.visitList(node." + child.name + ")"; - } - else if (child.type === "SyntaxKind") { - result += "node.kind"; - } - else if (isNodeOrToken(child)) { - result += "<" + child.type + ">this.visitNodeOrToken(node." + child.name + ")"; - } - else { - result += "<" + child.type + ">this.visitNode(node." + child.name + ")"; - } - if (j < definition.children.length - 1) { - result += ",\r\n"; - } - } - result += ");\r\n"; - result += " }\r\n"; - } - result += " }"; - result += "\r\n}"; - return result; -} function generateWalker() { var result = ""; result += "///\r\n" + "\r\n" + "module TypeScript {\r\n" + " export class SyntaxWalker implements ISyntaxVisitor {\r\n" + " public visitToken(token: ISyntaxToken): void {\r\n" + " }\r\n" + "\r\n" + " private visitOptionalToken(token: ISyntaxToken): void {\r\n" + " if (token === undefined) {\r\n" + " return;\r\n" + " }\r\n" + "\r\n" + " this.visitToken(token);\r\n" + " }\r\n" + "\r\n" + " public visitList(list: ISyntaxNodeOrToken[]): void {\r\n" + " for (var i = 0, n = list.length; i < n; i++) {\r\n" + " visitNodeOrToken(this, list[i]);\r\n" + " }\r\n" + " }\r\n"; @@ -2765,10 +2062,7 @@ function generateWalker() { else if (child.isList || child.isSeparatedList) { result += " this.visitList(node." + child.name + ");\r\n"; } - else if (isNodeOrToken(child)) { - result += " visitNodeOrToken(this, node." + child.name + ");\r\n"; - } - else if (child.type === "ISyntaxToken") { + else if (child.isToken) { if (child.isOptional) { result += " this.visitOptionalToken(node." + child.name + ");\r\n"; } @@ -2776,7 +2070,7 @@ function generateWalker() { result += " this.visitToken(node." + child.name + ");\r\n"; } } - else if (child.type !== "SyntaxKind") { + else { result += " visitNodeOrToken(this, node." + child.name + ");\r\n"; } } @@ -2894,6 +2188,14 @@ function generateScannerUtilities() { result += "}"; return result; } +function syntaxKindName(kind) { + for (var name in TypeScript.SyntaxKind) { + if (TypeScript.SyntaxKind[name] === kind) { + return name; + } + } + throw new Error(); +} function generateVisitor() { var result = ""; result += "///\r\n\r\n"; @@ -2919,30 +2221,6 @@ function generateVisitor() { result += "\r\n}"; return result; } -function generateDefaultVisitor() { - var result = ""; - result += "///\r\n\r\n"; - result += "module TypeScript {\r\n"; - if (!forPrettyPrinter) { - result += " export class SyntaxVisitor implements ISyntaxVisitor {\r\n"; - result += " public defaultVisit(node: ISyntaxNodeOrToken): any {\r\n"; - result += " return undefined;\r\n"; - result += " }\r\n"; - result += "\r\n"; - result += " public visitToken(token: ISyntaxToken): any {\r\n"; - result += " return this.defaultVisit(token);\r\n"; - result += " }\r\n"; - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - result += "\r\n public visit" + getNameWithoutSuffix(definition) + "(node: " + definition.name + "): any {\r\n"; - result += " return this.defaultVisit(node);\r\n"; - result += " }\r\n"; - } - result += " }"; - } - result += "\r\n}"; - return result; -} function generateServicesUtilities() { var result = ""; result += "module TypeScript {\r\n"; @@ -2983,114 +2261,15 @@ function generateServicesUtilities() { result += "}"; return result; } -function generateIsTypeScriptSpecific() { - var result = ""; - result += "module TypeScript {\r\n"; - result += " function isListTypeScriptSpecific(list: ISyntaxNodeOrToken[]): boolean {\r\n"; - result += " for (var i = 0, n = list.length; i < n; i++) {\r\n"; - result += " if (isTypeScriptSpecific(list[i])) {\r\n"; - result += " return true;\r\n"; - result += " }\r\n"; - result += " }\r\n\r\n"; - result += " return false;\r\n"; - result += " }\r\n\r\n"; - result += " export function isTypeScriptSpecific(element: ISyntaxElement): boolean {\r\n"; - result += " if (!element) { return false; }\r\n"; - result += " if (isToken(element)) { return false; }\r\n"; - result += " if (isList(element)) { return isListTypeScriptSpecific(element); }\r\n"; - result += " switch (element.kind()) {\r\n"; - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - if (!definition.isTypeScriptSpecific) { - continue; - } - result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ":\r\n"; - } - result += " return true;\r\n"; - var triviallyFalseDefinitions = definitions.filter(function (d) { return d.children.filter(function (c) { return c.type !== "SyntaxKind" && !c.isToken; }).length === 0; }); - for (var i = 0; i < triviallyFalseDefinitions.length; i++) { - var definition = triviallyFalseDefinitions[i]; - if (definition.isTypeScriptSpecific) { - continue; - } - result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ":\r\n"; - } - result += " return false;\r\n"; - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - if (definition.isTypeScriptSpecific) { - continue; - } - if (definition.children.filter(function (c) { return c.type !== "SyntaxKind" && !c.isToken; }).length === 0) { - continue; - } - result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ":"; - result += "\r\n"; - result += " return is" + getNameWithoutSuffix(definition) + "TypeScriptSpecific(<" + definition.name + ">element);\r\n"; - } - result += " }\r\n"; - result += " }\r\n"; - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - if (definition.isTypeScriptSpecific) { - continue; - } - var importantChildren = definition.children.filter(function (d) { return d.type !== "SyntaxKind" && !d.isToken; }); - if (importantChildren.length > 0) { - result += generateIsTypeScriptSpecificMethod(definition); - } - } - result += "}"; - return result; -} -function generateIsTypeScriptSpecificMethod(definition) { - var result = "\r\n function is" + getNameWithoutSuffix(definition) + "TypeScriptSpecific(node: " + definition.name + "): boolean {\r\n"; - result += " return "; - var addedCheck = false; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (child.type === "SyntaxKind") { - continue; - } - if (child.isToken) { - continue; - } - if (addedCheck) { - result += " ||\r\n "; - } - addedCheck = true; - if (child.isTypeScriptSpecific) { - if (child.isList || child.isSeparatedList) { - result += getPropertyAccess(child, "node") + ".length > 0"; - } - else { - result += "!!" + getPropertyAccess(child, "node"); - } - } - else { - result += "isTypeScriptSpecific(" + getPropertyAccess(child, "node") + ")"; - } - } - if (!addedCheck) { - result += "false"; - } - result += ";\r\n"; - result += " }\r\n"; - return result; -} -var syntaxNodesConcrete = generateNodes(false); +var syntaxNodesConcrete = generateNodes(); var syntaxInterfaces = generateSyntaxInterfaces(); -var rewriter = generateRewriter(); var walker = generateWalker(); var scannerUtilities = generateScannerUtilities(); var visitor = generateVisitor(); -var defaultVisitor = generateDefaultVisitor(); var servicesUtilities = generateServicesUtilities(); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxNodes.concrete.generated.ts", syntaxNodesConcrete, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxInterfaces.generated.ts", syntaxInterfaces, false); -sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxRewriter.generated.ts", rewriter, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxWalker.generated.ts", walker, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\scannerUtilities.generated.ts", scannerUtilities, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxVisitor.generated.ts", visitor, false); -sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\defaultSyntaxVisitor.generated.ts", defaultVisitor, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxUtilities.generated.ts", servicesUtilities, false); diff --git a/src/services/syntax/defaultSyntaxVisitor.generated.ts b/src/services/syntax/defaultSyntaxVisitor.generated.ts deleted file mode 100644 index 0ce967ac613..00000000000 --- a/src/services/syntax/defaultSyntaxVisitor.generated.ts +++ /dev/null @@ -1,377 +0,0 @@ -/// - -module TypeScript { - export class SyntaxVisitor implements ISyntaxVisitor { - public defaultVisit(node: ISyntaxNodeOrToken): any { - return undefined; - } - - public visitToken(token: ISyntaxToken): any { - return this.defaultVisit(token); - } - - public visitSourceUnit(node: SourceUnitSyntax): any { - return this.defaultVisit(node); - } - - public visitQualifiedName(node: QualifiedNameSyntax): any { - return this.defaultVisit(node); - } - - public visitObjectType(node: ObjectTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitFunctionType(node: FunctionTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitArrayType(node: ArrayTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitConstructorType(node: ConstructorTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitGenericType(node: GenericTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitTypeQuery(node: TypeQuerySyntax): any { - return this.defaultVisit(node); - } - - public visitTupleType(node: TupleTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitUnionType(node: UnionTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitParenthesizedType(node: ParenthesizedTypeSyntax): any { - return this.defaultVisit(node); - } - - public visitInterfaceDeclaration(node: InterfaceDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitFunctionDeclaration(node: FunctionDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitModuleDeclaration(node: ModuleDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitClassDeclaration(node: ClassDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitEnumDeclaration(node: EnumDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitImportDeclaration(node: ImportDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitExportAssignment(node: ExportAssignmentSyntax): any { - return this.defaultVisit(node); - } - - public visitMemberFunctionDeclaration(node: MemberFunctionDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitMemberVariableDeclaration(node: MemberVariableDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitConstructorDeclaration(node: ConstructorDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitIndexMemberDeclaration(node: IndexMemberDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitGetAccessor(node: GetAccessorSyntax): any { - return this.defaultVisit(node); - } - - public visitSetAccessor(node: SetAccessorSyntax): any { - return this.defaultVisit(node); - } - - public visitPropertySignature(node: PropertySignatureSyntax): any { - return this.defaultVisit(node); - } - - public visitCallSignature(node: CallSignatureSyntax): any { - return this.defaultVisit(node); - } - - public visitConstructSignature(node: ConstructSignatureSyntax): any { - return this.defaultVisit(node); - } - - public visitIndexSignature(node: IndexSignatureSyntax): any { - return this.defaultVisit(node); - } - - public visitMethodSignature(node: MethodSignatureSyntax): any { - return this.defaultVisit(node); - } - - public visitBlock(node: BlockSyntax): any { - return this.defaultVisit(node); - } - - public visitIfStatement(node: IfStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitVariableStatement(node: VariableStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitExpressionStatement(node: ExpressionStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitReturnStatement(node: ReturnStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitSwitchStatement(node: SwitchStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitBreakStatement(node: BreakStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitContinueStatement(node: ContinueStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitForStatement(node: ForStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitForInStatement(node: ForInStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitEmptyStatement(node: EmptyStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitThrowStatement(node: ThrowStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitWhileStatement(node: WhileStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitTryStatement(node: TryStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitLabeledStatement(node: LabeledStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitDoStatement(node: DoStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitDebuggerStatement(node: DebuggerStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitWithStatement(node: WithStatementSyntax): any { - return this.defaultVisit(node); - } - - public visitPrefixUnaryExpression(node: PrefixUnaryExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitDeleteExpression(node: DeleteExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitTypeOfExpression(node: TypeOfExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitVoidExpression(node: VoidExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitConditionalExpression(node: ConditionalExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitBinaryExpression(node: BinaryExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitPostfixUnaryExpression(node: PostfixUnaryExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitMemberAccessExpression(node: MemberAccessExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitInvocationExpression(node: InvocationExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitArrayLiteralExpression(node: ArrayLiteralExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitObjectLiteralExpression(node: ObjectLiteralExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitObjectCreationExpression(node: ObjectCreationExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitParenthesizedExpression(node: ParenthesizedExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitParenthesizedArrowFunctionExpression(node: ParenthesizedArrowFunctionExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitSimpleArrowFunctionExpression(node: SimpleArrowFunctionExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitCastExpression(node: CastExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitElementAccessExpression(node: ElementAccessExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitFunctionExpression(node: FunctionExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitOmittedExpression(node: OmittedExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitTemplateExpression(node: TemplateExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitTemplateAccessExpression(node: TemplateAccessExpressionSyntax): any { - return this.defaultVisit(node); - } - - public visitVariableDeclaration(node: VariableDeclarationSyntax): any { - return this.defaultVisit(node); - } - - public visitVariableDeclarator(node: VariableDeclaratorSyntax): any { - return this.defaultVisit(node); - } - - public visitArgumentList(node: ArgumentListSyntax): any { - return this.defaultVisit(node); - } - - public visitParameterList(node: ParameterListSyntax): any { - return this.defaultVisit(node); - } - - public visitTypeArgumentList(node: TypeArgumentListSyntax): any { - return this.defaultVisit(node); - } - - public visitTypeParameterList(node: TypeParameterListSyntax): any { - return this.defaultVisit(node); - } - - public visitHeritageClause(node: HeritageClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitEqualsValueClause(node: EqualsValueClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitCaseSwitchClause(node: CaseSwitchClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitDefaultSwitchClause(node: DefaultSwitchClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitElseClause(node: ElseClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitCatchClause(node: CatchClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitFinallyClause(node: FinallyClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitTemplateClause(node: TemplateClauseSyntax): any { - return this.defaultVisit(node); - } - - public visitTypeParameter(node: TypeParameterSyntax): any { - return this.defaultVisit(node); - } - - public visitConstraint(node: ConstraintSyntax): any { - return this.defaultVisit(node); - } - - public visitSimplePropertyAssignment(node: SimplePropertyAssignmentSyntax): any { - return this.defaultVisit(node); - } - - public visitFunctionPropertyAssignment(node: FunctionPropertyAssignmentSyntax): any { - return this.defaultVisit(node); - } - - public visitParameter(node: ParameterSyntax): any { - return this.defaultVisit(node); - } - - public visitEnumElement(node: EnumElementSyntax): any { - return this.defaultVisit(node); - } - - public visitTypeAnnotation(node: TypeAnnotationSyntax): any { - return this.defaultVisit(node); - } - - public visitExternalModuleReference(node: ExternalModuleReferenceSyntax): any { - return this.defaultVisit(node); - } - - public visitModuleNameModuleReference(node: ModuleNameModuleReferenceSyntax): any { - return this.defaultVisit(node); - } - } -} \ No newline at end of file diff --git a/src/services/syntax/references.ts b/src/services/syntax/references.ts index 888ee443e12..f2eed1365d5 100644 --- a/src/services/syntax/references.ts +++ b/src/services/syntax/references.ts @@ -17,7 +17,6 @@ /// /// /// -/// /// // SyntaxDedenter depends on SyntaxRewriter diff --git a/src/services/syntax/syntaxGenerator.ts b/src/services/syntax/syntaxGenerator.ts index d0b648430f2..a8783101f98 100644 --- a/src/services/syntax/syntaxGenerator.ts +++ b/src/services/syntax/syntaxGenerator.ts @@ -5,9 +5,6 @@ /// // /// -// Adds argument checking to the generated nodes. Argument checking appears to slow things down -// parsing about 7%. If we want to get that perf back, we can always remove this. -var argumentChecks = false; var forPrettyPrinter = false; interface ITypeDefinition { @@ -29,7 +26,6 @@ interface IMemberDefinition { tokenKinds?: string[]; isTypeScriptSpecific: boolean; elementType?: string; - excludeFromAST?: boolean; } var interfaces: any = { @@ -1015,18 +1011,10 @@ var definitions:ITypeDefinition[] = [ function firstKind(definition: ITypeDefinition): TypeScript.SyntaxKind { var kindName = getNameWithoutSuffix(definition); - //TypeScript.Environment.standardOut.WriteLine(kindName); - var kind = (TypeScript.SyntaxKind)[kindName]; - //TypeScript.Environment.standardOut.WriteLine(kind); - - return kind; + return (TypeScript.SyntaxKind)[kindName]; } -var sortedDefinitions = definitions.sort((d1, d2) => firstKind(d1) - firstKind(d2)); - -//function endsWith(string: string, value: string): boolean { -// return string.substring(string.length - value.length, string.length) === value; -//} +definitions.sort((d1, d2) => firstKind(d1) - firstKind(d2)); function getStringWithoutSuffix(definition: string) { if (TypeScript.StringUtilities.endsWith(definition, "Syntax")) { @@ -1036,14 +1024,6 @@ function getStringWithoutSuffix(definition: string) { return definition; } -function getStringWithoutPrefix(definition: string) { - if (definition.charAt(0) == "I" && definition.charAt(1).toUpperCase() == definition.charAt(1)) { - return definition.substring(1); - } - - return definition; -} - function getNameWithoutSuffix(definition: ITypeDefinition) { return getStringWithoutSuffix(definition.name); } @@ -1063,10 +1043,6 @@ function getType(child: IMemberDefinition): string { } } -function pascalCase(value: string): string { - return value.substr(0, 1).toUpperCase() + value.substr(1); -} - function camelCase(value: string): string { return value.substr(0, 1).toLowerCase() + value.substr(1); } @@ -1079,462 +1055,6 @@ function getSafeName(child: IMemberDefinition) { return child.name; } -function getPropertyAccess(child: IMemberDefinition, instance = "this"): string { - if (child.type === "SyntaxKind") { - return instance + "._kind"; - } - - return instance + "." + child.name; -} - -function generateProperties(definition: ITypeDefinition): string { - var result = ""; - - if (definition.name === "SourceUnitSyntax") { - result += " public syntaxTree: SyntaxTree = undefined;\r\n"; - } - - var newLine = false; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - - if (getType(child) === "SyntaxKind") { - result += " private _" + child.name + ": " + getType(child) + ";\r\n"; - newLine = true; - } - else if (child.name === "arguments") { - result += " public " + child.name + ": " + getType(child) + ";\r\n"; - } - } - - if (newLine) { - result += "\r\n"; - } - - return result; -} - -function generateNullChecks(definition: ITypeDefinition): string { - var result = ""; - - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - - if (!child.isOptional && !child.isToken) { - result += " if (!" + child.name + ") { throw Errors.argumentNull('" + child.name + "'); }\r\n"; - } - } - - return result; -} - -function generateIfKindCheck(child: IMemberDefinition, tokenKinds: string[], indent: string): string { - var result = ""; - - result += indent + " if ("; - - for (var j = 0; j < tokenKinds.length; j++) { - if (j > 0) { - result += " && "; - } - - var tokenKind = tokenKinds[j]; - if (tokenKind === "IdentifierName") { - result += "!SyntaxFacts.isIdentifierName(" + child.name + ".tokenKind)"; - } - else { - result += child.name + ".tokenKind !== SyntaxKind." + tokenKind; - } - } - - result += ") { throw Errors.argument('" + child.name + "'); }\r\n"; - return result; -} - -function generateSwitchCase(tokenKind: string, indent: string): string { - return indent + " case SyntaxKind." + tokenKind + ":\r\n"; -} - -function generateBreakStatement(indent: string): string { - return indent + " break;\r\n"; -} - -function generateSwitchCases(tokenKinds: string[], indent: string): string { - var result = ""; - for (var j = 0; j < tokenKinds.length; j++) { - var tokenKind = tokenKinds[j]; - - result += generateSwitchCase(tokenKind, indent); - } - - if (tokenKinds.length > 0) { - result += generateBreakStatement(indent); - } - - return result; -} - -function generateDefaultCase(child: IMemberDefinition, indent: string): string { - var result = ""; - - result += indent + " default:\r\n"; - result += indent + " throw Errors.argument('" + child.name + "');\r\n"; - - return result; -} - -function generateSwitchKindCheck(child: IMemberDefinition, tokenKinds: string[], indent: string): string { - if (tokenKinds.length === 0) { - return ""; - } - - var result = ""; - - var identifierName = TypeScript.ArrayUtilities.where(tokenKinds, v => v.indexOf("IdentifierName") >= 0); - var notIdentifierName = TypeScript.ArrayUtilities.where(tokenKinds, v => v.indexOf("IdentifierName") < 0); - - if (identifierName.length > 0) { - result += indent + " if (!SyntaxFacts.isIdentifierName(" + child.name + ".tokenKind)) {\r\n"; - if (notIdentifierName.length === 0) { - result += indent + " throw Errors.argument('" + child.name + "');\r\n"; - result += indent + " }\r\n"; - return result; - } - - indent += " "; - } - - if (notIdentifierName.length <= 2) { - result += generateIfKindCheck(child, notIdentifierName, indent); - } - else if (notIdentifierName.length > 2) { - result += indent + " switch (" + child.name + ".tokenKind) {\r\n"; - result += generateSwitchCases(notIdentifierName, indent); - result += generateDefaultCase(child, indent); - result += indent + " }\r\n"; - } - - if (identifierName.length > 0) { - result += indent + " }\r\n"; - } - - // result += indent + " }\r\n"; - return result; -} - -function tokenKinds(child: IMemberDefinition): string[] { - return child.tokenKinds - ? child.tokenKinds - : [pascalCase(child.name)]; -} - -function generateKindCheck(child: IMemberDefinition): string { - var indent = ""; - var result = ""; - - if (child.isOptional) { - indent = " "; - - result += " if (" + child.name + ") {\r\n"; - } - - var kinds = tokenKinds(child); - - if (kinds.length <= 2) { - result += generateIfKindCheck(child, kinds, indent); - } - else { - result += generateSwitchKindCheck(child, kinds, indent); - } - - if (child.isOptional) { - result += " }\r\n"; - } - - return result; -} - -function generateKindChecks(definition: ITypeDefinition): string { - var result = ""; - - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - - if (child.isToken) { - result += generateKindCheck(child); - } - } - - return result; -} - -function generateArgumentChecks(definition: ITypeDefinition): string { - var result = ""; - - if (argumentChecks) { - result += generateNullChecks(definition); - result += generateKindChecks(definition); - - if (definition.children.length > 0) { - result += "\r\n"; - } - } - - return result; -} - -function generateConstructor(definition: ITypeDefinition): string { - var i: number; - var child: IMemberDefinition; - var base = baseType(definition); - - var result = ""; - result += " constructor(" - - var children = definition.children; - var kindChild: IMemberDefinition = undefined; - for (i = 0; i < children.length; i++) { - child = children[i]; - - if (getType(child) === "SyntaxKind") { - kindChild = child; - } - - if (getType(child) !== "SyntaxKind" && child.name !== "arguments") { - result += "public "; - } - - result += getSafeName(child) + ": " + getType(child); - result += ",\r\n "; - } - - result += "data: number) {\r\n"; - - if (kindChild) { - result += " super(kind, data); \r\n"; - } - else { - result += " super(SyntaxKind." + getNameWithoutSuffix(definition) + ", data); \r\n"; - } - - if (definition.children.length > 0) { - result += "\r\n"; - } - - result += generateArgumentChecks(definition); - - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - - if (child.type === "SyntaxKind" || child.name === "arguments") { - result += " " + getPropertyAccess(child) + " = " + getSafeName(child) + ";\r\n"; - } - } - - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - - if (child.type !== "SyntaxKind") { - if (child.isOptional) { - result += " " + getSafeName(child) + " && (" + getSafeName(child) + ".parent = this);\r\n"; - } - //else if (child.isList || child.isSeparatedList) { - // result += " !isShared(" + getSafeName(child) + ") && (" + getSafeName(child) + ".parent = this);\r\n"; - //} - else { - result += " " + getSafeName(child) + ".parent = this;\r\n"; - } - } - } - - //result += " Syntax.setParentForChildren(this);\r\n"; - result += " }\r\n"; - - return result; -} - -function isOptional(child: IMemberDefinition) { - if (child.isOptional) { - return true; - } - - if (child.isList && !child.requiresAtLeastOneItem) { - return true; - } - - if (child.isSeparatedList && !child.requiresAtLeastOneItem) { - return true; - } - - return false; -} - -function generateFactory1Method(definition: ITypeDefinition): string { - return ""; - - var mandatoryChildren = TypeScript.ArrayUtilities.where( - definition.children, c => !isOptional(c)); - if (mandatoryChildren.length === definition.children.length) { - return ""; - } - - var result = "\r\n public static create(" - var i: number; - var child: IMemberDefinition; - - for (i = 0; i < mandatoryChildren.length; i++) { - child = mandatoryChildren[i]; - - result += child.name + ": " + getType(child); - - if (i < mandatoryChildren.length - 1) { - result += ",\r\n "; - } - } - - result += "): " + definition.name + " {\r\n"; - - result += " return new " + definition.name + "("; - - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - - if (!isOptional(child)) { - result += child.name; - } - else if (child.isList) { - result += "Syntax.emptyList<" + child.elementType + ">()"; - } - else if (child.isSeparatedList) { - result += "Syntax.emptySeparatedList<" + child.elementType + ">()"; - } - else { - result += "undefined"; - } - - result += ", "; - } - - result += "/*data:*/ 0);\r\n"; - result += " }\r\n"; - - return result; -} - -function isKeywordOrPunctuation(kind: string): boolean { - if (TypeScript.StringUtilities.endsWith(kind, "Keyword")) { - return true; - } - - if (TypeScript.StringUtilities.endsWith(kind, "Token") && - kind !== "IdentifierName" && - kind !== "EndOfFileToken") { - return true; - } - - return false; -} - -function isDefaultConstructable(definition: ITypeDefinition): boolean { - if (!definition) { - return false; - } - - for (var i = 0; i < definition.children.length; i++) { - if (isMandatory(definition.children[i])) { - // If any child is mandatory, then the type is not default constructable. - return false; - } - } - - // We can default construct this. - return true; -} - -function isMandatory(child: IMemberDefinition): boolean { - // If it's optional then it's not mandatory. - if (isOptional(child)) { - return false; - } - - // Kinds are always mandatory. As are non-optional lists. - if (child.type === "SyntaxKind" || child.isList || child.isSeparatedList) { - return true; - } - - // We have a non optional node or token. Tokens are mandatory if they're not keywords or - // punctuation. - if (child.isToken) { - var kinds = tokenKinds(child); - var isFixed = kinds.length === 1 && isKeywordOrPunctuation(kinds[0]); - - return !isFixed; - } - - // It's a node. It's mandatory if we can't default construct it. - return !isDefaultConstructable(memberDefinitionType(child)); -} - -function generateFactory2Method(definition: ITypeDefinition): string { - return ""; - - var mandatoryChildren: IMemberDefinition[] = TypeScript.ArrayUtilities.where(definition.children, isMandatory); - if (mandatoryChildren.length === definition.children.length) { - return ""; - } - - var i: number; - var child: IMemberDefinition; - var result = "\r\n public static create1(" - - for (i = 0; i < mandatoryChildren.length; i++) { - child = mandatoryChildren[i]; - - result += child.name + ": " + getType(child); - - if (i < mandatoryChildren.length - 1) { - result += ",\r\n "; - } - } - - result += "): " + definition.name + " {\r\n"; - result += " return new " + definition.name + "("; - - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - - if (isMandatory(child)) { - result += child.name; - } - else if (child.isList) { - result += "Syntax.emptyList<" + child.elementType + ">()"; - } - else if (child.isSeparatedList) { - result += "Syntax.emptySeparatedList<" + child.elementType + ">()"; - } - else if (isOptional(child)) { - result += "undefined"; - } - else if (child.isToken) { - result += "Syntax.token(SyntaxKind." + tokenKinds(child)[0] + ")"; - } - else { - result += child.type + ".create1()"; - } - - result += ", "; - } - - result += "/*data:*/ 0);\r\n"; - result += " }\r\n"; - - return result; -} - -function generateFactoryMethod(definition: ITypeDefinition): string { - return generateFactory1Method(definition) + generateFactory2Method(definition); -} - function generateBrands(definition: ITypeDefinition, accessibility: boolean): string { var properties = ""; @@ -1583,433 +1103,6 @@ function generateBrands(definition: ITypeDefinition, accessibility: boolean): st return properties; } -function generateAcceptMethod(definition: ITypeDefinition): string { - var result = ""; - - result += "\r\n"; - result += " public accept(visitor: ISyntaxVisitor): SyntaxKind {\r\n"; - result += " return visitor.visit" + getNameWithoutSuffix(definition) + "(this);\r\n"; - result += " }\r\n"; - - return result; -} - -function generateKindMethod(definition: ITypeDefinition): string { - var result = ""; - - result += "\r\n"; - result += " public kind(): SyntaxKind {\r\n"; - result += " return SyntaxKind." + getNameWithoutSuffix(definition) + ";\r\n"; - result += " }\r\n"; - - return result; -} - -function generateSlotMethods(definition: ITypeDefinition): string { - var result = ""; - - result += "\r\n"; - var slotCount = definition.children.length; - - result += " public childCount(): number {\r\n"; - result += " return " + slotCount + ";\r\n"; - result += " }\r\n\r\n"; - - result += " public childAt(slot: number): ISyntaxElement {\r\n"; - - if (slotCount === 0) { - result += " throw Errors.invalidOperation();\r\n"; - } - else { - result += " switch (slot) {\r\n"; - - var index = 0; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (child.type === "SyntaxKind") { - continue; - } - - result += " case " + index + ": return this." + child.name + ";\r\n"; - index++; - } - - result += " default: throw Errors.invalidOperation();\r\n"; - result += " }\r\n"; - } - - result += " }\r\n"; - - return result; -} - -function generateFirstTokenMethod(definition: ITypeDefinition): string { - var result = ""; - - result += "\r\n"; - result += " public firstToken(): ISyntaxToken {\r\n"; - result += " var token: ISyntaxToken = undefined;\r\n"; - - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - - if (getType(child) === "SyntaxKind") { - continue; - } - - if (child.name === "endOfFileToken") { - continue; - } - - result += " if ("; - - if (child.isOptional) { - result += getPropertyAccess(child) + " && "; - } - - if (child.isToken) { - result += getPropertyAccess(child) + ".width() > 0"; - result += ") { return " + getPropertyAccess(child) + "; }\r\n"; - } - else { - result += "(token = " + getPropertyAccess(child) + ".firstToken())"; - result += ") { return token; }\r\n"; - } - } - - if (definition.name === "SourceUnitSyntax") { - result += " return this._endOfFileToken;\r\n"; - } - else { - result += " return undefined;\r\n"; - } - - result += " }\r\n"; - - result += " }\r\n"; - - return result; -} - -function generateLastTokenMethod(definition: ITypeDefinition): string { - var result = ""; - - result += "\r\n"; - result += " public lastToken(): ISyntaxToken {\r\n"; - - if (definition.name === "SourceUnitSyntax") { - result += " return this._endOfFileToken;\r\n"; - } - else { - result += " var token: ISyntaxToken = undefined;\r\n"; - - for (var i = definition.children.length - 1; i >= 0; i--) { - var child = definition.children[i]; - - if (getType(child) === "SyntaxKind") { - continue; - } - - if (child.name === "endOfFileToken") { - continue; - } - - result += " if ("; - - if (child.isOptional) { - result += getPropertyAccess(child) + " && "; - } - - if (child.isToken) { - result += getPropertyAccess(child) + ".width() > 0"; - result += ") { return " + getPropertyAccess(child) + "; }\r\n"; - } - else { - result += "(token = " + getPropertyAccess(child) + ".lastToken())"; - result += ") { return token; }\r\n"; - } - } - - result += " return undefined;\r\n"; - } - - result += " }\r\n"; - - return result; -} - -function baseType(definition: ITypeDefinition): ITypeDefinition { - return TypeScript.ArrayUtilities.firstOrDefault(definitions, d => d.name === definition.baseType); -} - -function memberDefinitionType(child: IMemberDefinition): ITypeDefinition { - // Debug.assert(child.type !== undefined); - return TypeScript.ArrayUtilities.firstOrDefault(definitions, d => d.name === child.type); -} - -function derivesFrom(def1: ITypeDefinition, def2: ITypeDefinition): boolean { - var current = def1; - while (current) { - var base = baseType(current); - if (base === def2) { - return true; - } - - current = base; - } - - return false; -} - -function contains(definition: ITypeDefinition, child: IMemberDefinition) { - return TypeScript.ArrayUtilities.any(definition.children, - c => c.name === child.name && - c.isList === child.isList && - c.isSeparatedList === child.isSeparatedList && - c.isToken === child.isToken && - c.type === child.type); -} - -function generateAccessors(definition: ITypeDefinition): string { - var result = ""; - - //if (definition.name === "SourceUnitSyntax") { - // result += "\r\n"; - // result += " public syntaxTree(): SyntaxTree {\r\n"; - // result += " return this._syntaxTree;\r\n"; - // result += " }\r\n"; - //} - - //for (var i = 0; i < definition.children.length; i++) { - // var child = definition.children[i]; - - // if (child.type === "SyntaxKind") { - // result += "\r\n"; - // result += " public get " + child.name + "(): " + getType(child) + " {\r\n"; - // result += " return " + getPropertyAccess(child) + ";\r\n"; - // result += " }\r\n"; - // } - //} - - return result; -} - -function generateWithMethod(definition: ITypeDefinition, child: IMemberDefinition): string { - return ""; - - var result = ""; - result += "\r\n"; - result += " public with" + pascalCase(child.name) + "(" + getSafeName(child) + ": " + getType(child) + "): " + definition.name + " {\r\n"; - result += " return this.update(" - - for (var i = 0; i < definition.children.length; i++) { - if (i > 0) { - result += ", "; - } - - if (definition.children[i] === child) { - result += getSafeName(child); - } - else { - result += getPropertyAccess(definition.children[i]); - } - } - - result += ");\r\n"; - result += " }\r\n"; - - if (child.isList || child.isSeparatedList) { - if (TypeScript.StringUtilities.endsWith(child.name, "s")) { - var pascalName = pascalCase(child.name); - pascalName = pascalName.substring(0, pascalName.length - 1); - - var argName = getSafeName(child); - argName = argName.substring(0, argName.length - 1) - - result += "\r\n"; - result += " public with" + pascalName + "(" + argName + ": " + child.elementType + "): " + definition.name + " {\r\n"; - result += " return this.with" + pascalCase(child.name) + "(" - - if (child.isList) { - result += "Syntax.list<" + child.elementType + ">([" + argName + "])"; - } - else { - result += "Syntax.separatedList<" + child.elementType + ">([" + argName + "])"; - } - - result += ");\r\n"; - result += " }\r\n"; - } - } - - return result; -} - -function generateWithMethods(definition: ITypeDefinition): string { - var result = ""; - return ""; - - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - result += generateWithMethod(definition, child); - } - - return result; -} - -function generateTriviaMethods(definition: ITypeDefinition): string { - return ""; - - var result = "\r\n"; - result += " public withLeadingTrivia(trivia: ISyntaxTriviaList): " + definition.name + " {\r\n"; - result += " return <" + definition.name + ">super.withLeadingTrivia(trivia);\r\n"; - result += " }\r\n\r\n"; - result += " public withTrailingTrivia(trivia: ISyntaxTriviaList): " + definition.name + " {\r\n"; - result += " return <" + definition.name + ">super.withTrailingTrivia(trivia);\r\n"; - result += " }\r\n"; - - return result; -} - -function generateUpdateMethod(definition: ITypeDefinition): string { - // return ""; - - var result = ""; - - result += "\r\n"; - result += " public update("; - - var i: number; - var child: IMemberDefinition; - - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - - result += getSafeName(child) + ": " + getType(child); - - if (i < definition.children.length - 1) { - result += ",\r\n "; - } - } - - result += "): " + definition.name + " {\r\n"; - - if (definition.children.length === 0) { - result += " return this;\r\n"; - } - else { - result += " if ("; - - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - - if (i !== 0) { - result += " && "; - } - - result += getPropertyAccess(child) + " === " + getSafeName(child); - } - - result += ") {\r\n"; - result += " return this;\r\n"; - result += " }\r\n\r\n"; - - result += " return new " + definition.name + "("; - - for (i = 0; i < definition.children.length; i++) { - child = definition.children[i]; - - result += getSafeName(child); - result += ", "; - } - - result += "this.parsedInStrictMode() ? SyntaxConstants.NodeParsedInStrictModeMask : 0);\r\n"; - } - - result += " }\r\n"; - - return result; -} - -function generateNode(definition: ITypeDefinition, abstract: boolean): string { - var result = " export class " + definition.name + " implements ISyntaxNode" // + " extends SyntaxNode" - - if (definition.interfaces) { - // result += " implements "; - result += ", "; - result += definition.interfaces.join(", "); - } - - result += " {\r\n"; - result += " public __data: number; public __cachedTokens: ISyntaxToken[]; public parent: ISyntaxElement;\r\n"; - - if (definition.name === "SourceUnitSyntax") { - result += " public syntaxTree: SyntaxTree = undefined;\r\n"; - } - - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - result += " public " + child.name + ": " + getType(child) + ";\r\n"; - } - - result += generateBrands(definition, /*accessibility:*/ true); - - result += " constructor(data: number"; - - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - result += ", " + getSafeName(child) + ": " + getType(child); - } - - result += ") {\r\n"; - result += " if (data) { this.__data = data; }\r\n"; - - if (definition.name === "SourceUnitSyntax") { - result += " this.parent = undefined,\r\n"; - } - - if (definition.children) { - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - if (child.excludeFromAST && abstract) { - continue; - } - - result += " this." + child.name + " = " + getSafeName(child) + ",\r\n"; - } - } - - if (definition.children.length > 0) { - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - - if (i) { - result += ",\r\n"; - } - - //if (child.isList || child.isSeparatedList) { - // result += " !isShared(" + getSafeName(child) + ") && (" + getSafeName(child) + ".parent = this)"; - //} - if (child.isOptional) { - result += " " + getSafeName(child) + " && (" + getSafeName(child) + ".parent = this)"; - } - else { - result += " " + getSafeName(child) + ".parent = this"; - } - } - result += ";\r\n"; - } - - result += " }\r\n"; - - result += generateKindMethod(definition); - // result += generateSlotMethods(definition); - // result += generateAcceptMethod(definition); - - result += " }"; - return result; -} - function generateConstructorFunction(definition: ITypeDefinition) { var result = " export var " + definition.name + ": " + getNameWithoutSuffix(definition) + "Constructor = function(data: number"; @@ -2060,34 +1153,11 @@ function generateConstructorFunction(definition: ITypeDefinition) { } result += " };\r\n"; - result += " " + definition.name + ".prototype.kind = function() { return SyntaxKind." + getNameWithoutSuffix(definition) + "; }\r\n"; return result; } -function syntaxKindName(kind: TypeScript.SyntaxKind): string { - for (var name in TypeScript.SyntaxKind) { - if (TypeScript.SyntaxKind[name] === kind) { - return name; - } - } - - throw new Error(); -} - -function getDefinitionForKind(kind: TypeScript.SyntaxKind): ITypeDefinition { - var kindName = syntaxKindName(kind); - - return TypeScript.ArrayUtilities.firstOrDefault(definitions, d => { - if (getNameWithoutSuffix(d) === kindName) { - return true; - } - - return false; - }); -} - function generateSyntaxInterfaces(): string { var result = "///\r\n\r\n"; @@ -2143,27 +1213,12 @@ function generateSyntaxInterface(definition: ITypeDefinition): string { return result; } - -function generateNodes(abstract: boolean): string { +function generateNodes(): string { var result = "///\r\n\r\n"; result += "module TypeScript"; result += " {\r\n"; - //result += " function finishNode(node: ISyntaxNode, data: number) {\r\n"; - //result += " for (var i = 0, n = childCount(node); i < n; i++) {\r\n"; - //result += " childAt(node, i).parent = node;\r\n"; - //result += " }\r\n"; - ////result += " for (var name in node) {\r\n"; - ////result += " if (node.hasOwnProperty(name)) {\r\n"; - ////result += " (node)[name] = node;\r\n"; - ////result += " }\r\n"; - ////result += " }\r\n"; - //result += "\r\n"; - //result += " if (data) {\r\n"; - //result += " node.__data = data;\r\n"; - //result += " }\r\n"; - //result += " }\r\n"; for (var i = 0; i < definitions.length; i++) { var definition = definitions[i]; @@ -2173,7 +1228,6 @@ function generateNodes(abstract: boolean): string { } result += generateConstructorFunction(definition); - // result += generateNode(definition, abstract); } result += "}"; @@ -2184,109 +1238,6 @@ function isInterface(name: string) { return name.substr(0, 1) === "I" && name.substr(1, 1).toUpperCase() === name.substr(1, 1) } -function isNodeOrToken(child: IMemberDefinition) { - // IWhatever. - return child.type && isInterface(child.type); -} - -function generateRewriter(): string { - var result = "///\r\n\r\n"; - - result += "module TypeScript {\r\n" + -" export class SyntaxRewriter implements ISyntaxVisitor {\r\n" + -" public visitToken(token: ISyntaxToken): ISyntaxToken {\r\n" + -" return token;\r\n" + -" }\r\n" + -"\r\n" + -" public visitNode(node: ISyntaxNode): ISyntaxNode {\r\n" + -" return visitNodeOrToken(this, node);\r\n" + -" }\r\n" + -"\r\n" + -" public visitNodeOrToken(node: ISyntaxNodeOrToken): ISyntaxNodeOrToken {\r\n" + -" return isToken(node) ? this.visitToken(node) : this.visitNode(node);\r\n" + -" }\r\n" + -"\r\n" + -" public visitList(list: T): T {\r\n" + -" var newItems: T = undefined;\r\n" + -"\r\n" + -" for (var i = 0, n = list.length; i < n; i++) {\r\n" + -" var item = list[i];\r\n" + -" var newItem = this.visitNodeOrToken(item);\r\n" + -"\r\n" + -" if (item !== newItem && !newItems) {\r\n" + -" newItems = [];\r\n" + -" for (var j = 0; j < i; j++) {\r\n" + -" newItems.push(list[j]);\r\n" + -" }\r\n" + -" }\r\n" + -"\r\n" + -" if (newItems) {\r\n" + -" newItems.push(newItem);\r\n" + -" }\r\n" + -" }\r\n" + -"\r\n" + -" // Debug.assert(!newItems || newItems.length === childCount(list));\r\n" + -" return !newItems ? list : Syntax.list(newItems);\r\n" + -" }\r\n" + -"\r\n" - - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - - result += "\r\n"; - result += " public visit" + getNameWithoutSuffix(definition) + "(node: " + definition.name + "): any {\r\n"; - - if (definition.children.length === 0) { - result += " return node;\r\n" - result += " }\r\n"; - continue; - } - - //if (definition.children.length === 1) { - // result += " return node.with" + pascalCase(definition.children[0].name) + "(\r\n"; - //} - //else { - result += " return node.update(\r\n"; - //} - - for (var j = 0; j < definition.children.length; j++) { - var child = definition.children[j]; - - result += " "; - if (child.isOptional) { - result += "!node." + child.name + " ? undefined : "; - } - - if (child.isToken) { - result += "this.visitToken(node." + child.name + ")"; - } - else if (child.isList || child.isSeparatedList) { - result += "this.visitList(node." + child.name + ")"; - } - else if (child.type === "SyntaxKind") { - result += "node.kind"; - } - else if (isNodeOrToken(child)) { - result += "<" + child.type + ">this.visitNodeOrToken(node." + child.name + ")"; - } - else { - result += "<" + child.type + ">this.visitNode(node." + child.name + ")"; - } - - if (j < definition.children.length - 1) { - result += ",\r\n"; - } - } - - result += ");\r\n"; - result += " }\r\n"; - } - - result += " }"; - result += "\r\n}"; - return result; -} - function generateWalker(): string { var result = ""; @@ -2332,15 +1283,7 @@ function generateWalker(): string { else if (child.isList || child.isSeparatedList) { result += " this.visitList(node." + child.name + ");\r\n"; } - else if (isNodeOrToken(child)) { - //if (child.isOptional) { - result += " visitNodeOrToken(this, node." + child.name + ");\r\n"; - //} - //else { - // result += " node." + child.name + ".accept(this);\r\n"; - //} - } - else if (child.type === "ISyntaxToken") { + else if (child.isToken) { if (child.isOptional) { result += " this.visitOptionalToken(node." + child.name + ");\r\n"; } @@ -2348,13 +1291,8 @@ function generateWalker(): string { result += " this.visitToken(node." + child.name + ");\r\n"; } } - else if (child.type !== "SyntaxKind") { - //if (child.isOptional) { - result += " visitNodeOrToken(this, node." + child.name + ");\r\n"; - //} - //else { - // result += " node." + child.name + ".accept(this);\r\n"; - //} + else { + result += " visitNodeOrToken(this, node." + child.name + ");\r\n"; } } @@ -2418,7 +1356,6 @@ function generateKeywordCondition(keywords: { text: string; kind: TypeScript.Syn } else { result += " // " + TypeScript.ArrayUtilities.select(keywords, k => k.text).join(", ") + "\r\n" - // result += "\r\n"; index = currentCharacter === 0 ? "start" : ("start + " + currentCharacter); result += indent + "switch(str.charCodeAt(" + index + ")) {\r\n" @@ -2439,7 +1376,6 @@ function generateKeywordCondition(keywords: { text: string; kind: TypeScript.Syn } function min(array: T[], func: (v: T) => number): number { - // Debug.assert(array.length > 0); var min = func(array[0]); for (var i = 1; i < array.length; i++) { @@ -2453,7 +1389,6 @@ function min(array: T[], func: (v: T) => number): number { } function max(array: T[], func: (v: T) => number): number { - // Debug.assert(array.length > 0); var max = func(array[0]); for (var i = 1; i < array.length; i++) { @@ -2516,6 +1451,16 @@ function generateScannerUtilities(): string { return result; } +function syntaxKindName(kind: TypeScript.SyntaxKind): string { + for (var name in TypeScript.SyntaxKind) { + if (TypeScript.SyntaxKind[name] === kind) { + return name; + } + } + + throw new Error(); +} + function generateVisitor(): string { var result = ""; @@ -2524,7 +1469,6 @@ function generateVisitor(): string { result += "module TypeScript {\r\n"; result += " export function visitNodeOrToken(visitor: ISyntaxVisitor, element: ISyntaxNodeOrToken): any {\r\n"; result += " if (element === undefined) { return undefined; }\r\n"; - // result += " return element.accept(visitor);\r\n"; result += " switch (element.kind()) {\r\n"; @@ -2554,44 +1498,10 @@ function generateVisitor(): string { return result; } -function generateDefaultVisitor(): string { - var result = ""; - - result += "///\r\n\r\n"; - - result += "module TypeScript {\r\n"; - if (!forPrettyPrinter) { - result += " export class SyntaxVisitor implements ISyntaxVisitor {\r\n"; - result += " public defaultVisit(node: ISyntaxNodeOrToken): any {\r\n"; - result += " return undefined;\r\n"; - result += " }\r\n"; - result += "\r\n"; - result += " public visitToken(token: ISyntaxToken): any {\r\n"; - result += " return this.defaultVisit(token);\r\n"; - result += " }\r\n"; - - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - - result += "\r\n public visit" + getNameWithoutSuffix(definition) + "(node: " + definition.name + "): any {\r\n"; - result += " return this.defaultVisit(node);\r\n"; - result += " }\r\n"; - } - - result += " }"; - } - - result += "\r\n}"; - - return result; -} - function generateServicesUtilities(): string { - var result = ""; // "/// \r\n\r\n"; - + var result = ""; result += "module TypeScript {\r\n"; - // result += generateIsTypeScriptSpecific(); result += " export function childCount(element: ISyntaxElement): number {\r\n"; result += " if (isList(element)) { return (element).length; }\r\n"; result += " switch (element.kind()) {\r\n"; @@ -2643,144 +1553,16 @@ function generateServicesUtilities(): string { return result; } -function generateIsTypeScriptSpecific(): string { - var result = ""; - - result += "module TypeScript {\r\n"; - - result += " function isListTypeScriptSpecific(list: ISyntaxNodeOrToken[]): boolean {\r\n" - result += " for (var i = 0, n = list.length; i < n; i++) {\r\n"; - result += " if (isTypeScriptSpecific(list[i])) {\r\n"; - result += " return true;\r\n"; - result += " }\r\n"; - result += " }\r\n\r\n"; - result += " return false;\r\n"; - result += " }\r\n\r\n"; - - result += " export function isTypeScriptSpecific(element: ISyntaxElement): boolean {\r\n" - result += " if (!element) { return false; }\r\n"; - result += " if (isToken(element)) { return false; }\r\n"; - result += " if (isList(element)) { return isListTypeScriptSpecific(element); }\r\n"; - result += " switch (element.kind()) {\r\n"; - - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - if (!definition.isTypeScriptSpecific) { - continue; - } - - result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ":\r\n"; - } - - result += " return true;\r\n"; - - var triviallyFalseDefinitions = definitions.filter(d => d.children.filter(c => c.type !== "SyntaxKind" && !c.isToken).length === 0); - for (var i = 0; i < triviallyFalseDefinitions.length; i++) { - var definition = triviallyFalseDefinitions[i]; - if (definition.isTypeScriptSpecific) { - continue; - } - - result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ":\r\n"; - } - - result += " return false;\r\n"; - - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - if (definition.isTypeScriptSpecific) { - continue; - } - - if (definition.children.filter(c => c.type !== "SyntaxKind" && !c.isToken).length === 0) { - continue; - } - - result += " case SyntaxKind." + getNameWithoutSuffix(definition) + ":"; - result += "\r\n"; - result += " return is" + getNameWithoutSuffix(definition) + "TypeScriptSpecific(<" + definition.name + ">element);\r\n"; - } - - result += " }\r\n"; - result += " }\r\n"; - - for (var i = 0; i < definitions.length; i++) { - var definition = definitions[i]; - if (definition.isTypeScriptSpecific) { - continue; - } - - var importantChildren = definition.children.filter(d => d.type !== "SyntaxKind" && !d.isToken); - if (importantChildren.length > 0) { - result += generateIsTypeScriptSpecificMethod(definition); - } - } - - result += "}"; - - return result; -} - -function generateIsTypeScriptSpecificMethod(definition: ITypeDefinition): string { - var result = "\r\n function is" + getNameWithoutSuffix(definition) + "TypeScriptSpecific(node: " + definition.name + "): boolean {\r\n"; - - result += " return "; - - var addedCheck = false; - for (var i = 0; i < definition.children.length; i++) { - var child = definition.children[i]; - - if (child.type === "SyntaxKind") { - continue; - } - - if (child.isToken) { - continue; - } - - if (addedCheck) { - result += " ||\r\n "; - } - - addedCheck = true; - - if (child.isTypeScriptSpecific) { - if (child.isList || child.isSeparatedList) { - result += getPropertyAccess(child, "node") + ".length > 0"; - } - else { - result += "!!" + getPropertyAccess(child, "node"); - } - } - else { - result += "isTypeScriptSpecific(" + getPropertyAccess(child, "node") + ")"; - } - } - - if (!addedCheck) { - result += "false"; - } - - result += ";\r\n"; - result += " }\r\n"; - - return result; -} - -var syntaxNodesConcrete = generateNodes(/*abstract:*/ false); +var syntaxNodesConcrete = generateNodes(); var syntaxInterfaces = generateSyntaxInterfaces(); -var rewriter = generateRewriter(); var walker = generateWalker(); var scannerUtilities = generateScannerUtilities(); var visitor = generateVisitor(); -var defaultVisitor = generateDefaultVisitor(); var servicesUtilities = generateServicesUtilities(); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxNodes.concrete.generated.ts", syntaxNodesConcrete, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxInterfaces.generated.ts", syntaxInterfaces, false); -sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxRewriter.generated.ts", rewriter, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxWalker.generated.ts", walker, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\scannerUtilities.generated.ts", scannerUtilities, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxVisitor.generated.ts", visitor, false); -sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\defaultSyntaxVisitor.generated.ts", defaultVisitor, false); sys.writeFile(sys.getCurrentDirectory() + "\\src\\services\\syntax\\syntaxUtilities.generated.ts", servicesUtilities, false); diff --git a/src/services/syntax/syntaxNode.ts b/src/services/syntax/syntaxNode.ts deleted file mode 100644 index f53bd706c10..00000000000 --- a/src/services/syntax/syntaxNode.ts +++ /dev/null @@ -1,34 +0,0 @@ -/// - -module TypeScript { - /* - export class SyntaxNode implements ISyntaxNode { - // private __kind: SyntaxKind; - public __data: number; - public __cachedTokens: ISyntaxToken[]; - public parent: ISyntaxElement; - - constructor(data: number) { - if (data) { - this.__data = data; - } - } - - public kind(): SyntaxKind { - throw Errors.abstract(); - } - - public childCount(): number { - throw Errors.abstract(); - } - - public childAt(index: number): ISyntaxElement { - throw Errors.abstract(); - } - - public accept(visitor: ISyntaxVisitor): any { - throw Errors.abstract(); - } - } - */ -} \ No newline at end of file