diff --git a/CsharpReverseEngineer.js b/CsharpReverseEngineer.js index 17b84f5..cb81d44 100644 --- a/CsharpReverseEngineer.js +++ b/CsharpReverseEngineer.js @@ -148,10 +148,7 @@ define(function (require, exports, module) { if (!err) { try { var ast = parser.parse(data); -// self._currentCompilationUnit = ast; -// self._currentCompilationUnit.file = file; -// self.translateCompilationUnit(options, self._root, ast); - + var results = []; for (var property in ast) { var value = ast[property]; @@ -160,6 +157,13 @@ define(function (require, exports, module) { } } console.log( JSON.stringify(ast) ); + + + self._currentCompilationUnit = ast; + self._currentCompilationUnit.file = file; + self.translateCompilationUnit(options, self._root, ast); + + result.resolve(); } catch (ex) { console.error("[C#] Failed to parse - " + file._name + " : " + ex); @@ -174,6 +178,464 @@ define(function (require, exports, module) { }; + /** + * Translate C# CompilationUnit Node. + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} compilationUnitNode + */ + CsharpCodeAnalyzer.prototype.translateCompilationUnit = function (options, namespace, compilationUnitNode) + { + var _namespace = namespace, + i, + len; + + this.translateTypes(options, _namespace, compilationUnitNode["namespace"]); + + }; + + /** + * Translate Type Nodes + * @param {Object} options + * @param {type.Model} namespace + * @param {Array.} typeNodeArray + */ + CsharpCodeAnalyzer.prototype.translateTypes = function (options, namespace, typeNodeArray) { + var _namespace = namespace, i, len; + if (typeNodeArray.length > 0) { + for (i = 0, len = typeNodeArray.length; i < len; i++) { + var typeNode = typeNodeArray[i]; + switch (typeNode.node) { + case "namespace": + var _package = this.translatePackage(options, _namespace, typeNode); + if (_package !== null) { + _namespace = _package; + } + // Translate Types + this.translateTypes(options, _namespace, typeNode.body); + break; + case "class": + this.translateClass(options, namespace, typeNode); + break; + case "interface": +// this.translateInterface(options, namespace, typeNode); + break; + case "enum": +// this.translateEnum(options, namespace, typeNode); + break; + case "annotationType": +// this.translateAnnotationType(options, namespace, typeNode); + break; + } + } + } + }; + + /** + * Return visiblity from modifiers + * + * @param {Array.} modifiers + * @return {string} Visibility constants for UML Elements + */ + CsharpCodeAnalyzer.prototype._getVisibility = function (modifiers) { + if (_.contains(modifiers, "public")) { + return UML.VK_PUBLIC; + } else if (_.contains(modifiers, "protected")) { + return UML.VK_PROTECTED; + } else if (_.contains(modifiers, "private")) { + return UML.VK_PRIVATE; + } + return UML.VK_PACKAGE; + }; + + + /** + * Translate C# Class Node. + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} compilationUnitNode + */ + CsharpCodeAnalyzer.prototype.translateClass = function (options, namespace, classNode) { + var i, len, _class; + + // Create Class + _class = new type.UMLClass(); + _class._parent = namespace; + _class.name = classNode.name; + + // Access Modifiers + _class.visibility = this._getVisibility(classNode.modifiers); + + // Abstract Class + if (_.contains(classNode.modifiers, "abstract")) { + _class.isAbstract = true; + } + + // Final Class + if (_.contains(classNode.modifiers, "sealed")) { + _class.isFinalSpecification = true; + _class.isLeaf = true; + } + + // CsharpDoc +// if (classNode.comment) { +// _class.documentation = classNode.comment; +// } + + namespace.ownedElements.push(_class); + + // Register Extends for 2nd Phase Translation + if (classNode["base"]) { + var _extendPending = { + classifier: _class, + node: classNode["base"], + kind: "class", + compilationUnitNode: this._currentCompilationUnit + }; + this._extendPendings.push(_extendPending); + } + + + // Translate Type Parameters + this.translateTypeParameters(options, _class, classNode.typeParameters); + // Translate Types + this.translateTypes(options, _class, classNode.body); + // Translate Members + this.translateMembers(options, _class, classNode.body.members); + }; + + + /** + * Translate Members Nodes + * @param {Object} options + * @param {type.Model} namespace + * @param {Array.} memberNodeArray + */ + CsharpCodeAnalyzer.prototype.translateMembers = function (options, namespace, memberNodeArray) { + var i, len; + if (memberNodeArray.length > 0) { + for (i = 0, len = memberNodeArray.length; i < len; i++) { + var memberNode = memberNodeArray[i], + visibility = this._getVisibility(memberNode.modifiers); + + // Generate public members only if publicOnly == true + if (options.publicOnly && visibility !== UML.VK_PUBLIC) { + continue; + } + + memberNode.compilationUnitNode = this._currentCompilationUnit; + + switch (memberNode.node) { + case "field": + case "property": + if (options.association) { + this.translateFieldAsAssociation(options, namespace, memberNode); + } else { + this.translateFieldAsAttribute(options, namespace, memberNode); + } + break; + case "constructor": + this.translateMethod(options, namespace, memberNode, true); + break; + case "method": + this.translateMethod(options, namespace, memberNode); + break; + case "constant": +// this.translateEnumConstant(options, namespace, memberNode); + break; + } + } + } + }; + + + /** + * Translate Enumeration Constant + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} enumConstantNode + */ + CsharpCodeAnalyzer.prototype.translateEnumConstant = function (options, namespace, enumConstantNode) { + var _literal = new type.UMLEnumerationLiteral(); + _literal._parent = namespace; + _literal.name = enumConstantNode.name; + + // CsharpDoc +// if (enumConstantNode.comment) { +// _literal.documentation = enumConstantNode.comment; +// } + +// namespace.literals.push(_literal); + }; + + + /** + * Translate Method + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} methodNode + * @param {boolean} isConstructor + */ + CsharpCodeAnalyzer.prototype.translateMethod = function (options, namespace, methodNode, isConstructor) + { + var i, len, _operation = new type.UMLOperation(); + _operation._parent = namespace; + _operation.name = methodNode.name; + namespace.operations.push(_operation); + + // Modifiers + _operation.visibility = this._getVisibility(methodNode.modifiers); + if (_.contains(methodNode.modifiers, "static")) { + _operation.isStatic = true; + } + if (_.contains(methodNode.modifiers, "abstract")) { + _operation.isAbstract = true; + } + if (_.contains(methodNode.modifiers, "sealed")) { + _operation.isLeaf = true; + } +// if (_.contains(methodNode.modifiers, "synchronized")) { +// _operation.concurrency = UML.CCK_CONCURRENT; +// } +// if (_.contains(methodNode.modifiers, "native")) { +// this._addTag(_operation, Core.TK_BOOLEAN, "native", true); +// } +// if (_.contains(methodNode.modifiers, "strictfp")) { +// this._addTag(_operation, Core.TK_BOOLEAN, "strictfp", true); +// } + + // Constructor + if (isConstructor) { + _operation.stereotype = "constructor"; + } + + // Formal Parameters + if (methodNode.parameter && methodNode.parameter.length > 0) { + for (i = 0, len = methodNode.parameter.length; i < len; i++) { + var parameterNode = methodNode.parameter[i]; + parameterNode.compilationUnitNode = methodNode.compilationUnitNode; + this.translateParameter(options, _operation, parameterNode); + } + } + + // Return Type + if (methodNode.type) { + var _returnParam = new type.UMLParameter(); + _returnParam._parent = _operation; + _returnParam.name = ""; + _returnParam.direction = UML.DK_RETURN; + // Add to _typedFeaturePendings + this._typedFeaturePendings.push({ + namespace: namespace, + feature: _returnParam, + node: methodNode + }); + _operation.parameters.push(_returnParam); + } + + // Throws +// if (methodNode.throws) { +// for (i = 0, len = methodNode.throws.length; i < len; i++) { +// var _throwNode = methodNode.throws[i]; +// var _throwPending = { +// operation: _operation, +// node: _throwNode, +// compilationUnitNode: methodNode.compilationUnitNode +// }; +// this._throwPendings.push(_throwPending); +// } +// } + + // CsharpDoc +// if (methodNode.comment) { +// _operation.documentation = methodNode.comment; +// } + + // "default" for Annotation Type Element +// if (methodNode.defaultValue) { +// this._addTag(_operation, Core.TK_STRING, "default", methodNode.defaultValue); +// } + + // Translate Type Parameters +// this.translateTypeParameters(options, _operation, methodNode.typeParameters); + }; + + + /** + * Translate Method Parameters + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} parameterNode + */ + CsharpCodeAnalyzer.prototype.translateParameter = function (options, namespace, parameterNode) { + var _parameter = new type.UMLParameter(); + _parameter._parent = namespace; + _parameter.name = parameterNode.name; + namespace.parameters.push(_parameter); + + // Add to _typedFeaturePendings + this._typedFeaturePendings.push({ + namespace: namespace._parent, + feature: _parameter, + node: parameterNode + }); + }; + + + /** + * Translate C# Field Node as UMLAssociation. + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} fieldNode + */ + CsharpCodeAnalyzer.prototype.translateFieldAsAssociation = function (options, namespace, fieldNode) { + var i, len; + if (fieldNode.name && fieldNode.name.length > 0) { + // Add to _associationPendings + var _associationPending = { + classifier: namespace, + node: fieldNode + }; + this._associationPendings.push(_associationPending); + } + }; + + /** + * Translate C# Field Node as UMLAttribute. + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} fieldNode + */ + CsharpCodeAnalyzer.prototype.translateFieldAsAttribute = function (options, namespace, fieldNode) { + var i, len; + if (fieldNode.name && fieldNode.name.length > 0) { + for (i = 0, len = fieldNode.name.length; i < len; i++) { + var variableNode = fieldNode.name[i]; + + // Create Attribute + var _attribute = new type.UMLAttribute(); + _attribute._parent = namespace; + _attribute.name = variableNode.name; + + // Access Modifiers + _attribute.visibility = this._getVisibility(fieldNode.modifiers); + if (variableNode.initialize) { + _attribute.defaultValue = variableNode.initialize; + } + + // Static Modifier + if (_.contains(fieldNode.modifiers, "static")) { + _attribute.isStatic = true; + } + + // Final Modifier + if (_.contains(fieldNode.modifiers, "sealed")) { + _attribute.isLeaf = true; + _attribute.isReadOnly = true; + } + + // Volatile Modifier + if (_.contains(fieldNode.modifiers, "volatile")) { + this._addTag(_attribute, Core.TK_BOOLEAN, "volatile", true); + } + + // CsharpDoc +// if (fieldNode.comment) { +// _attribute.documentation = fieldNode.comment; +// } + + namespace.attributes.push(_attribute); + + // Add to _typedFeaturePendings + var _typedFeature = { + namespace: namespace, + feature: _attribute, + node: fieldNode + }; + this._typedFeaturePendings.push(_typedFeature); + + } + } + }; + + + + /** + * Translate C# Type Parameter Nodes. + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} typeParameterNodeArray + */ + CsharpCodeAnalyzer.prototype.translateTypeParameters = function (options, namespace, typeParameterNodeArray) { + if (typeParameterNodeArray) { + var i, len, _typeParam; + for (i = 0, len = typeParameterNodeArray.length; i < len; i++) { + _typeParam = typeParameterNodeArray[i]; + if (_typeParam.node === "TypeParameter") { + var _templateParameter = new type.UMLTemplateParameter(); + _templateParameter._parent = namespace; + _templateParameter.name = _typeParam.name; + if (_typeParam.type) { + _templateParameter.parameterType = _typeParam.type; + } + namespace.templateParameters.push(_templateParameter); + } + } + } + }; + + /** + * Translate C# Package Node. + * @param {Object} options + * @param {type.Model} namespace + * @param {Object} compilationUnitNode + */ + CsharpCodeAnalyzer.prototype.translatePackage = function (options, namespace, packageNode) { + if (packageNode && packageNode.qualifiedName ) { + + var pathNames = packageNode.qualifiedName.split("."); + return this._ensurePackage(namespace, pathNames); + } + return null; + }; + + + /** + * Return the package of a given pathNames. If not exists, create the package. + * @param {type.Model} namespace + * @param {Array.} pathNames + * @return {type.Model} Package element corresponding to the pathNames + */ + CsharpCodeAnalyzer.prototype._ensurePackage = function (namespace, pathNames) { + if (pathNames.length > 0) { + var name = pathNames.shift(); + if (name && name.length > 0) { + var elem = namespace.findByName(name); + if (elem !== null) { + // Package exists + if (pathNames.length > 0) { + return this._ensurePackage(elem, pathNames); + } else { + return elem; + } + } else { + // Package not exists, then create one. + var _package = new type.UMLPackage(); + namespace.ownedElements.push(_package); + _package._parent = namespace; + _package.name = name; + if (pathNames.length > 0) { + return this._ensurePackage(_package, pathNames); + } else { + return _package; + } + } + } + } else { + return namespace; + } + }; + /** * Analyze all C# files in basePath * @param {string} basePath diff --git a/grammar/csharp.jison b/grammar/csharp.jison index 32acc06..10194c7 100644 --- a/grammar/csharp.jison +++ b/grammar/csharp.jison @@ -123,8 +123,27 @@ namespace-or-type-name IDENTIFIER_WITH_TEMPLATE : IDENTIFIER TEMPLATE - { - $$ = $1 + "" + $2; + { + + $$ = { + "name": $1 + }; + + $$["typeParameters"] = []; + if ($2[0] === "<" && $2[$2.length-1] === ">") { + var i, _temp, _param, _bounded; + $2 = $2.substring(1, $2.length-1); + _temp = $2.split(","); + for (i = 0; i < _temp.length; i++) { + _param = _temp[i].trim(); + + $$["typeParameters"].push({ + "node": "TypeParameter", + "name": _param + }); + + } + } } | IDENTIFIER { @@ -1569,73 +1588,121 @@ delegate-declaration { $$ = { "node": "delegate", - "type": $2, - "name": $3 + "type": $2 }; + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes DELEGATE type-with-interr IDENTIFIER_WITH_TEMPLATE OPEN_PARENS CLOSE_PARENS where-base SEMICOLON { $$ = { "node": "delegate", - "type": $3, - "name": $4 + "type": $3 }; + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | modifiers DELEGATE type-with-interr IDENTIFIER_WITH_TEMPLATE OPEN_PARENS CLOSE_PARENS where-base SEMICOLON { $$ = { "node": "delegate", "modifiers": $1, - "type": $3, - "name": $4 + "type": $3 }; + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | DELEGATE type-with-interr IDENTIFIER_WITH_TEMPLATE OPEN_PARENS formal-parameter-list CLOSE_PARENS where-base SEMICOLON { $$ = { "node": "delegate", - "type": $2, - "name": $3, + "type": $2, "parameters": $5 }; + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers DELEGATE type-with-interr IDENTIFIER_WITH_TEMPLATE OPEN_PARENS formal-parameter-list CLOSE_PARENS where-base SEMICOLON { $$ = { "node": "delegate", "modifiers": $1, - "type": $3, - "name": $4, + "type": $3, "parameters": $6 }; + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes DELEGATE type-with-interr IDENTIFIER_WITH_TEMPLATE OPEN_PARENS formal-parameter-list CLOSE_PARENS where-base SEMICOLON { $$ = { "node": "delegate", - "type": $3, - "name": $4, + "type": $3, "parameters": $6 }; + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers DELEGATE type-with-interr IDENTIFIER_WITH_TEMPLATE OPEN_PARENS CLOSE_PARENS where-base SEMICOLON { $$ = { "node": "delegate", "modifiers": $2, - "type": $4, - "name": $5 + "type": $4 }; + if($5["typeParameters"]){ + $$["name"] = $5["name"]; + $$["typeParameters"] = $5["typeParameters"]; + } + else { + $$["name"] = $5; + } } | attributes modifiers DELEGATE type-with-interr IDENTIFIER_WITH_TEMPLATE OPEN_PARENS formal-parameter-list CLOSE_PARENS where-base SEMICOLON { $$ = { "node": "delegate", "modifiers": $2, - "type": $4, - "name": $5, + "type": $4, "parameters": $7 }; + if($5["typeParameters"]){ + $$["name"] = $5["name"]; + $$["typeParameters"] = $5["typeParameters"]; + } + else { + $$["name"] = $5; + } } ; @@ -1646,146 +1713,258 @@ enum-declaration : ENUM IDENTIFIER_WITH_TEMPLATE enum-body { $$ = { - "node": "enum", - "name": $2, + "node": "enum", "body": $3 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes ENUM IDENTIFIER_WITH_TEMPLATE enum-body { $$ = { - "node": "enum", - "name": $3, + "node": "enum", "body": $4 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-body { $$ = { "node": "enum", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $4 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body { $$ = { - "node": "enum", - "name": $2, + "node": "enum", "base": $3, "body": $4 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | ENUM IDENTIFIER_WITH_TEMPLATE enum-body SEMICOLON { $$ = { - "node": "enum", - "name": $2, + "node": "enum", "body": $3 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-body { $$ = { "node": "enum", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $5 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body { $$ = { - "node": "enum", - "name": $3, + "node": "enum", "base": $4, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes ENUM IDENTIFIER_WITH_TEMPLATE enum-body SEMICOLON { $$ = { - "node": "enum", - "name": $3, + "node": "enum", "body": $4 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body { $$ = { "node": "enum", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-body SEMICOLON { $$ = { "node": "enum", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $4 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body SEMICOLON { $$ = { - "node": "enum", - "name": $2, + "node": "enum", "base": $3, "body": $4 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body SEMICOLON { $$ = { "node": "enum", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body SEMICOLON { $$ = { - "node": "enum", - "name": $3, + "node": "enum", "base": $4, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-body SEMICOLON { $$ = { "node": "enum", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $5 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body { $$ = { "node": "enum", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers ENUM IDENTIFIER_WITH_TEMPLATE enum-base enum-body SEMICOLON { $$ = { "node": "enum", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } ; @@ -1857,146 +2036,258 @@ interface-declaration : INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body { $$ = { - "node": "interface", - "name": $2, + "node": "interface", "body": $4 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body { $$ = { - "node": "interface", - "name": $3, + "node": "interface", "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body { $$ = { "node": "interface", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body { $$ = { - "node": "interface", - "name": $2, + "node": "interface", "base": $3, "body": $5 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body SEMICOLON { $$ = { - "node": "interface", - "name": $2, + "node": "interface", "body": $4 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body { $$ = { "node": "interface", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body { $$ = { - "node": "interface", - "name": $3, + "node": "interface", "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body SEMICOLON { $$ = { - "node": "interface", - "name": $3, + "node": "interface", "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body { $$ = { "node": "interface", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body SEMICOLON { $$ = { "node": "interface", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body SEMICOLON { $$ = { - "node": "interface", - "name": $2, + "node": "interface", "base": $3, "body": $5 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body SEMICOLON { $$ = { "node": "interface", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body SEMICOLON { $$ = { - "node": "interface", - "name": $3, + "node": "interface", "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE where-base interface-body SEMICOLON { $$ = { "node": "interface", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body { $$ = { "node": "interface", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $7 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers INTERFACE IDENTIFIER_WITH_TEMPLATE interface-base where-base interface-body SEMICOLON { $$ = { "node": "interface", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $7 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } ; @@ -2247,146 +2538,258 @@ struct-declaration : STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body { $$ = { - "node": "struct", - "name": $2, + "node": "struct", "body": $4 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body { $$ = { - "node": "struct", - "name": $3, + "node": "struct", "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body { $$ = { "node": "struct", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body { $$ = { - "node": "struct", - "name": $2, + "node": "struct", "base": $3, "body": $5 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body SEMICOLON { $$ = { - "node": "struct", - "name": $2, + "node": "struct", "body": $4 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes modifiers STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body { $$ = { "node": "struct", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body { $$ = { - "node": "struct", - "name": $3, + "node": "struct", "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body SEMICOLON { $$ = { - "node": "struct", - "name": $3, + "node": "struct", "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body { $$ = { "node": "struct", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body SEMICOLON { $$ = { "node": "struct", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body SEMICOLON { $$ = { - "node": "struct", - "name": $2, + "node": "struct", "base": $3, "body": $5 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | modifiers STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body SEMICOLON { $$ = { "node": "struct", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body SEMICOLON { $$ = { - "node": "struct", - "name": $3, + "node": "struct", "base": $4, "body": $6 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes modifiers STRUCT IDENTIFIER_WITH_TEMPLATE where-base struct-body SEMICOLON { $$ = { "node": "struct", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body { $$ = { "node": "struct", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $7 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers STRUCT IDENTIFIER_WITH_TEMPLATE struct-interfaces where-base struct-body SEMICOLON { $$ = { "node": "struct", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $7 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } ; @@ -2536,22 +2939,17 @@ namespace-body : OPEN_BRACE CLOSE_BRACE | OPEN_BRACE using-directives CLOSE_BRACE { - $$ = { - "using" : $2 - }; + $$ = $2; } | OPEN_BRACE namespace-member-declarations CLOSE_BRACE { - $$ = { - "member" : $2 - }; + $$ = $2; + } | OPEN_BRACE using-directives namespace-member-declarations CLOSE_BRACE { - $$ = { - "using" : $2, - "member" : $3 - }; + + $$ = $2.concat($3); } ; @@ -2684,27 +3082,48 @@ class-declaration : CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body { $$ = { - "node": "class", - "name": $2, + "node": "class", "body": $3 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body { $$ = { - "node": "class", - "name": $3, + "node": "class", "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body { $$ = { "node": "class", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body { @@ -2716,39 +3135,58 @@ class-declaration } if (isAnnotationType){ $$ = { - "node": "class", - "name": $2, + "node": "annotationType", "base": $3, - "body": $5, - "annotationType": "annotationType" + "body": $5 }; } else{ $$ = { - "node": "class", - "name": $2, + "node": "class", "base": $3, "body": $5 }; } + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } + } | CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body SEMICOLON { $$ = { - "node": "class", - "name": $2, + "node": "class", "body": $4 }; + + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | attributes modifiers CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body { $$ = { "node": "class", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body { @@ -2761,29 +3199,41 @@ class-declaration if (isAnnotationType){ $$ = { - "node": "class", - "name": $3, + "node": "annotationType", "base": $4, - "body": $6, - "annotationType": "annotationType" + "body": $6 }; } else { $$ = { - "node": "class", - "name": $3, + "node": "class", "base": $4, "body": $6 }; } + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body SEMICOLON { $$ = { - "node": "class", - "name": $3, + "node": "class", "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body { @@ -2796,32 +3246,44 @@ class-declaration if (isAnnotationType){ $$ = { - "node": "class", - "modifiers": $1, - "name": $3, + "node": "annotationType", + "modifiers": $1, "base": $4, - "body": $6, - "annotationType": "annotationType" + "body": $6 }; } else { $$ = { "node": "class", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $6 }; } + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | modifiers CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body SEMICOLON { $$ = { "node": "class", - "modifiers": $1, - "name": $3, + "modifiers": $1, "body": $5 }; + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body SEMICOLON { @@ -2833,22 +3295,25 @@ class-declaration } if (isAnnotationType){ $$ = { - "node": "class", - "name": $2, + "node": "annotationType", "base": $3, - "body": $5, - "annotationType": "annotationType" + "body": $5 }; } else { $$ = { - "node": "class", - "name": $2, + "node": "class", "base": $3, "body": $5 }; } - + if($2["typeParameters"]){ + $$["name"] = $2["name"]; + $$["typeParameters"] = $2["typeParameters"]; + } + else { + $$["name"] = $2; + } } | modifiers CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body SEMICOLON { @@ -2861,24 +3326,28 @@ class-declaration if (isAnnotationType){ $$ = { - "node": "class", - "modifiers": $1, - "name": $3, + "node": "annotationType", + "modifiers": $1, "base": $4, - "body": $6, - "annotationType": "annotationType" + "body": $6 }; } else { $$ = { "node": "class", - "modifiers": $1, - "name": $3, + "modifiers": $1, "base": $4, "body": $6 }; - } + } + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body SEMICOLON { @@ -2891,30 +3360,42 @@ class-declaration if (isAnnotationType){ $$ = { - "node": "class", - "name": $3, + "node": "annotationType", "base": $4, - "body": $6, - "annotationType": "annotationType" + "body": $6 }; } else { $$ = { - "node": "class", - "name": $3, + "node": "class", "base": $4, "body": $6 }; } + + if($3["typeParameters"]){ + $$["name"] = $3["name"]; + $$["typeParameters"] = $3["typeParameters"]; + } + else { + $$["name"] = $3; + } } | attributes modifiers CLASS IDENTIFIER_WITH_TEMPLATE where-base class-body SEMICOLON { $$ = { "node": "class", - "modifiers": $2, - "name": $4, + "modifiers": $2, "body": $6 }; + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body { @@ -2927,23 +3408,28 @@ class-declaration if (isAnnotationType){ $$ = { - "node": "class", - "modifiers": $2, - "name": $4, + "node": "annotationType", + "modifiers": $2, "base": $5, - "body": $7, - "annotationType": "annotationType" + "body": $7 }; } else { $$ = { "node": "class", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $7 }; } + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } | attributes modifiers CLASS IDENTIFIER_WITH_TEMPLATE class-base where-base class-body SEMICOLON { @@ -2956,23 +3442,28 @@ class-declaration if (isAnnotationType){ $$ = { - "node": "class", - "modifiers": $2, - "name": $4, + "node": "annotationType", + "modifiers": $2, "base": $5, - "body": $7, - "annotationType": "annotationType" + "body": $7 }; } else { $$ = { "node": "class", - "modifiers": $2, - "name": $4, + "modifiers": $2, "base": $5, "body": $7 }; } + + if($4["typeParameters"]){ + $$["name"] = $4["name"]; + $$["typeParameters"] = $4["typeParameters"]; + } + else { + $$["name"] = $4; + } } ; diff --git a/grammar/csharp.js b/grammar/csharp.js index feeda09..27ac242 100644 --- a/grammar/csharp.js +++ b/grammar/csharp.js @@ -110,7 +110,31 @@ case 18: this.$ = $$[$0-2] + "." + $$[$0]; break; -case 20: case 23: case 25: case 26: case 29: case 48: case 49: case 52: case 53: case 85: case 88: case 90: case 127: case 128: case 129: case 146: case 152: case 173: case 174: case 175: case 176: case 177: case 178: case 179: case 181: case 182: +case 20: + + + this.$ = { + "name": $$[$0-1] + }; + + this.$["typeParameters"] = []; + if ($$[$0][0] === "<" && $$[$0][$$[$0].length-1] === ">") { + var i, _temp, _param, _bounded; + $$[$0] = $$[$0].substring(1, $$[$0].length-1); + _temp = $$[$0].split(","); + for (i = 0; i < _temp.length; i++) { + _param = _temp[i].trim(); + + this.$["typeParameters"].push({ + "node": "TypeParameter", + "name": _param + }); + + } + } + +break; +case 23: case 25: case 26: case 29: case 48: case 49: case 52: case 53: case 85: case 88: case 90: case 127: case 128: case 129: case 146: case 152: case 173: case 174: case 175: case 176: case 177: case 178: case 179: case 181: case 182: this.$ = $$[$0-1] + "" + $$[$0]; @@ -209,33 +233,66 @@ case 292: case 452: case 453: }; break; -case 420: case 421: +case 420: this.$ = { "node": "delegate", - "type": $$[$0-5], - "name": $$[$0-4] + "type": $$[$0-5] }; + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; -case 422: case 426: +case 421: + + this.$ = { + "node": "delegate", + "type": $$[$0-5] + }; + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } + +break; +case 422: this.$ = { "node": "delegate", "modifiers": $$[$0-7], - "type": $$[$0-5], - "name": $$[$0-4] + "type": $$[$0-5] }; + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 423: case 425: this.$ = { "node": "delegate", - "type": $$[$0-6], - "name": $$[$0-5], + "type": $$[$0-6], "parameters": $$[$0-3] }; + if($$[$0-5]["typeParameters"]){ + this.$["name"] = $$[$0-5]["name"]; + this.$["typeParameters"] = $$[$0-5]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-5]; + } break; case 424: case 427: @@ -243,103 +300,171 @@ case 424: case 427: this.$ = { "node": "delegate", "modifiers": $$[$0-8], - "type": $$[$0-6], - "name": $$[$0-5], + "type": $$[$0-6], "parameters": $$[$0-3] }; + if($$[$0-5]["typeParameters"]){ + this.$["name"] = $$[$0-5]["name"]; + this.$["typeParameters"] = $$[$0-5]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-5]; + } + +break; +case 426: + + this.$ = { + "node": "delegate", + "modifiers": $$[$0-7], + "type": $$[$0-5] + }; + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 428: case 429: this.$ = { - "node": "enum", - "name": $$[$0-1], + "node": "enum", "body": $$[$0] }; + + if($$[$0-1]["typeParameters"]){ + this.$["name"] = $$[$0-1]["name"]; + this.$["typeParameters"] = $$[$0-1]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-1]; + } break; case 430: case 433: this.$ = { "node": "enum", - "modifiers": $$[$0-3], - "name": $$[$0-1], + "modifiers": $$[$0-3], "body": $$[$0] }; + + if($$[$0-1]["typeParameters"]){ + this.$["name"] = $$[$0-1]["name"]; + this.$["typeParameters"] = $$[$0-1]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-1]; + } break; case 431: case 434: this.$ = { - "node": "enum", - "name": $$[$0-2], + "node": "enum", "base": $$[$0-1], "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 432: case 435: this.$ = { - "node": "enum", - "name": $$[$0-2], + "node": "enum", "body": $$[$0-1] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 436: case 442: this.$ = { "node": "enum", - "modifiers": $$[$0-4], - "name": $$[$0-2], + "modifiers": $$[$0-4], "base": $$[$0-1], "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; -case 437: +case 437: case 441: this.$ = { "node": "enum", - "modifiers": $$[$0-4], - "name": $$[$0-2], + "modifiers": $$[$0-4], "body": $$[$0-1] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 438: case 440: this.$ = { - "node": "enum", - "name": $$[$0-3], + "node": "enum", "base": $$[$0-2], "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 439: case 443: this.$ = { "node": "enum", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "base": $$[$0-2], "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; -case 441: - - this.$ = { - "node": "enum", - "modifiers": $$[$0-4], - "name": $$[$0-2], - "body": $$[$0-1] - }; - -break; -case 446: case 472: case 529: case 650: case 651: case 767: case 768: +case 446: case 472: case 529: case 553: case 650: case 651: case 767: case 768: this.$ = $$[$0-1]; @@ -359,91 +484,154 @@ break; case 454: case 455: this.$ = { - "node": "interface", - "name": $$[$0-2], + "node": "interface", "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 456: case 459: this.$ = { "node": "interface", - "modifiers": $$[$0-4], - "name": $$[$0-2], + "modifiers": $$[$0-4], "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 457: case 460: this.$ = { - "node": "interface", - "name": $$[$0-3], + "node": "interface", "base": $$[$0-2], "body": $$[$0] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 458: case 461: this.$ = { - "node": "interface", - "name": $$[$0-3], + "node": "interface", "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 462: case 468: this.$ = { "node": "interface", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "base": $$[$0-2], "body": $$[$0] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 463: case 467: this.$ = { "node": "interface", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 464: this.$ = { - "node": "interface", - "name": $$[$0-4], + "node": "interface", "base": $$[$0-3], "body": $$[$0-1] }; + + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 465: case 469: this.$ = { "node": "interface", - "modifiers": $$[$0-6], - "name": $$[$0-4], + "modifiers": $$[$0-6], "base": $$[$0-3], "body": $$[$0-1] }; + + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 466: this.$ = { - "node": "interface", - "name": $$[$0-4], + "node": "interface", "base": $$[$0-3], "body": $$[$0-1] }; + + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 474: case 531: case 557: case 563: case 588: case 626: @@ -502,81 +690,137 @@ break; case 511: case 512: this.$ = { - "node": "struct", - "name": $$[$0-2], + "node": "struct", "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 513: case 516: this.$ = { "node": "struct", - "modifiers": $$[$0-4], - "name": $$[$0-2], + "modifiers": $$[$0-4], "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 514: case 517: this.$ = { - "node": "struct", - "name": $$[$0-3], + "node": "struct", "base": $$[$0-2], "body": $$[$0] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 515: case 518: this.$ = { - "node": "struct", - "name": $$[$0-3], + "node": "struct", "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 519: case 525: this.$ = { "node": "struct", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "base": $$[$0-2], "body": $$[$0] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 520: case 524: this.$ = { "node": "struct", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 521: case 523: this.$ = { - "node": "struct", - "name": $$[$0-4], + "node": "struct", "base": $$[$0-3], "body": $$[$0-1] }; + + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 522: case 526: this.$ = { "node": "struct", - "modifiers": $$[$0-6], - "name": $$[$0-4], + "modifiers": $$[$0-6], "base": $$[$0-3], "body": $$[$0-1] }; + + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 543: @@ -638,27 +882,17 @@ case 551: "body":$$[$0-1] }; -break; -case 553: - - this.$ = { - "using" : $$[$0-1] - }; - break; case 554: - this.$ = { - "member" : $$[$0-1] - }; + this.$ = $$[$0-1]; + break; case 555: - this.$ = { - "using" : $$[$0-2], - "member" : $$[$0-1] - }; + + this.$ = $$[$0-2].concat($$[$0-1]); break; case 560: case 561: @@ -672,29 +906,50 @@ break; case 589: this.$ = { - "node": "class", - "name": $$[$0-2], + "node": "class", "body": $$[$0-1] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 590: this.$ = { - "node": "class", - "name": $$[$0-2], + "node": "class", "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 591: this.$ = { "node": "class", - "modifiers": $$[$0-4], - "name": $$[$0-2], + "modifiers": $$[$0-4], "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 592: @@ -707,41 +962,60 @@ case 592: } if (isAnnotationType){ this.$ = { - "node": "class", - "name": $$[$0-3], + "node": "annotationType", "base": $$[$0-2], - "body": $$[$0], - "annotationType": "annotationType" + "body": $$[$0] }; } else{ this.$ = { - "node": "class", - "name": $$[$0-3], + "node": "class", "base": $$[$0-2], "body": $$[$0] }; } + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } + break; case 593: this.$ = { - "node": "class", - "name": $$[$0-3], + "node": "class", "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 594: this.$ = { "node": "class", - "modifiers": $$[$0-4], - "name": $$[$0-2], + "modifiers": $$[$0-4], "body": $$[$0] }; + + if($$[$0-2]["typeParameters"]){ + this.$["name"] = $$[$0-2]["name"]; + this.$["typeParameters"] = $$[$0-2]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-2]; + } break; case 595: @@ -755,30 +1029,42 @@ case 595: if (isAnnotationType){ this.$ = { - "node": "class", - "name": $$[$0-3], + "node": "annotationType", "base": $$[$0-2], - "body": $$[$0], - "annotationType": "annotationType" + "body": $$[$0] }; } else { this.$ = { - "node": "class", - "name": $$[$0-3], + "node": "class", "base": $$[$0-2], "body": $$[$0] }; } + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 596: this.$ = { - "node": "class", - "name": $$[$0-3], + "node": "class", "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 597: @@ -792,33 +1078,45 @@ case 597: if (isAnnotationType){ this.$ = { - "node": "class", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "node": "annotationType", + "modifiers": $$[$0-5], "base": $$[$0-2], - "body": $$[$0], - "annotationType": "annotationType" + "body": $$[$0] }; } else { this.$ = { "node": "class", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "base": $$[$0-2], "body": $$[$0] }; } + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 598: this.$ = { "node": "class", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 599: @@ -831,22 +1129,25 @@ case 599: } if (isAnnotationType){ this.$ = { - "node": "class", - "name": $$[$0-4], + "node": "annotationType", "base": $$[$0-3], - "body": $$[$0-1], - "annotationType": "annotationType" + "body": $$[$0-1] }; } else { this.$ = { - "node": "class", - "name": $$[$0-4], + "node": "class", "base": $$[$0-3], "body": $$[$0-1] }; } - + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 600: @@ -860,24 +1161,28 @@ case 600: if (isAnnotationType){ this.$ = { - "node": "class", - "modifiers": $$[$0-6], - "name": $$[$0-4], + "node": "annotationType", + "modifiers": $$[$0-6], "base": $$[$0-3], - "body": $$[$0-1], - "annotationType": "annotationType" + "body": $$[$0-1] }; } else { this.$ = { "node": "class", - "modifiers": $$[$0-6], - "name": $$[$0-4], + "modifiers": $$[$0-6], "base": $$[$0-3], "body": $$[$0-1] }; - } + } + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 601: @@ -891,31 +1196,43 @@ case 601: if (isAnnotationType){ this.$ = { - "node": "class", - "name": $$[$0-4], + "node": "annotationType", "base": $$[$0-3], - "body": $$[$0-1], - "annotationType": "annotationType" + "body": $$[$0-1] }; } else { this.$ = { - "node": "class", - "name": $$[$0-4], + "node": "class", "base": $$[$0-3], "body": $$[$0-1] }; } + + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 602: this.$ = { "node": "class", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "body": $$[$0-1] }; + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 603: @@ -929,23 +1246,28 @@ case 603: if (isAnnotationType){ this.$ = { - "node": "class", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "node": "annotationType", + "modifiers": $$[$0-5], "base": $$[$0-2], - "body": $$[$0], - "annotationType": "annotationType" + "body": $$[$0] }; } else { this.$ = { "node": "class", - "modifiers": $$[$0-5], - "name": $$[$0-3], + "modifiers": $$[$0-5], "base": $$[$0-2], "body": $$[$0] }; } + + if($$[$0-3]["typeParameters"]){ + this.$["name"] = $$[$0-3]["name"]; + this.$["typeParameters"] = $$[$0-3]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-3]; + } break; case 604: @@ -959,23 +1281,28 @@ case 604: if (isAnnotationType){ this.$ = { - "node": "class", - "modifiers": $$[$0-6], - "name": $$[$0-4], + "node": "annotationType", + "modifiers": $$[$0-6], "base": $$[$0-3], - "body": $$[$0-1], - "annotationType": "annotationType" + "body": $$[$0-1] }; } else { this.$ = { "node": "class", - "modifiers": $$[$0-6], - "name": $$[$0-4], + "modifiers": $$[$0-6], "base": $$[$0-3], "body": $$[$0-1] }; } + + if($$[$0-4]["typeParameters"]){ + this.$["name"] = $$[$0-4]["name"]; + this.$["typeParameters"] = $$[$0-4]["typeParameters"]; + } + else { + this.$["name"] = $$[$0-4]; + } break; case 620: