mirror of https://github.com/t1meshift/js.git
				
				
				
			Add ES2015 nodes
							parent
							
								
									b4bbc8460e
								
							
						
					
					
						commit
						7a1eca4aca
					
				|  | @ -8,17 +8,19 @@ The module lacks support of: | ||||||
|     * debugger statement |     * debugger statement | ||||||
|     * with statement |     * with statement | ||||||
|     * RegExp |     * RegExp | ||||||
|  * ES6 features: |  * ES2015 features: | ||||||
|     * generators/yield statement |     * generators/yield statement | ||||||
|     * for-of statement |     * for-of statement | ||||||
|     * template literals |     * template literals | ||||||
|     * and other ES6 features :) |  * ES2016 features: | ||||||
|  |     * basically, all of them | ||||||
| 
 | 
 | ||||||
| More about ESTree standard: | More about ESTree standard: | ||||||
| https://github.com/estree/estree/ | https://github.com/estree/estree/ | ||||||
| 
 | 
 | ||||||
| Todo: | Todo: | ||||||
|     * Add support for lacking features |     * Add support for lacking features | ||||||
|  |     * Make another attempt to split up this module | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from typing import List, Union, Optional, Literal as TypeLiteral, TypedDict, Any | from typing import List, Union, Optional, Literal as TypeLiteral, TypedDict, Any | ||||||
|  | @ -42,6 +44,9 @@ VarDeclKind = TypeLiteral["var", "let", "const"] | ||||||
| PropKind = TypeLiteral["init", "get", "set"] | PropKind = TypeLiteral["init", "get", "set"] | ||||||
| """A type for a `kind` field of `Property`.""" | """A type for a `kind` field of `Property`.""" | ||||||
| 
 | 
 | ||||||
|  | MethodDefinitionKind = TypeLiteral["constructor", "method", "get", "set"] | ||||||
|  | """A type for a `kind` field of `MethodDefinition`.""" | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class UnaryOperator(Enum): | class UnaryOperator(Enum): | ||||||
|     """A unary operator token.""" |     """A unary operator token.""" | ||||||
|  | @ -1090,6 +1095,21 @@ class ArrayPattern(Pattern): | ||||||
|         self._fields.update({"elements": self.elements}) |         self._fields.update({"elements": self.elements}) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class RestElement(Pattern): | ||||||
|  |     def __init__(self, loc: Optional[SourceLocation], argument: Pattern): | ||||||
|  |         super().__init__("RestElement", loc) | ||||||
|  |         self.argument = argument | ||||||
|  |         self._fields.update({"argument": self.argument}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AssignmentPattern(Pattern): | ||||||
|  |     def __init__(self, loc: Optional[SourceLocation], left: Pattern, right: Expression): | ||||||
|  |         super().__init__("AssignmentPattern", loc) | ||||||
|  |         self.left = left | ||||||
|  |         self.right = right | ||||||
|  |         self._fields.update({"left": self.left, "right": self.right}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| # "Identifier" block | # "Identifier" block | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1100,3 +1120,256 @@ class Identifier(Expression, Pattern): | ||||||
|         super().__init__("Identifier", loc) |         super().__init__("Identifier", loc) | ||||||
|         self.name = name |         self.name = name | ||||||
|         self._fields.update({"name": self.name}) |         self._fields.update({"name": self.name}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # "Classes" block | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class MethodDefinition(Node): | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         key: Expression, | ||||||
|  |         value: FunctionExpression, | ||||||
|  |         kind: MethodDefinitionKind, | ||||||
|  |         computed: bool, | ||||||
|  |         static: bool, | ||||||
|  |     ): | ||||||
|  |         super().__init__("MethodDefinition", loc) | ||||||
|  |         self.key = key | ||||||
|  |         self.value = value | ||||||
|  |         self.kind = kind | ||||||
|  |         self.computed = computed | ||||||
|  |         self.static = static | ||||||
|  |         self._fields.update( | ||||||
|  |             { | ||||||
|  |                 "key": self.key, | ||||||
|  |                 "value": self.value, | ||||||
|  |                 "kind": self.kind, | ||||||
|  |                 "computed": self.computed, | ||||||
|  |                 "static": self.static, | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ClassBody(Node): | ||||||
|  |     def __init__(self, loc: Optional[SourceLocation], body: List[MethodDefinition]): | ||||||
|  |         super().__init__("ClassBody", loc) | ||||||
|  |         self.body = body | ||||||
|  |         self._fields.update({"body": self.body}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Class(Node): | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         node_type: str, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         class_id: Optional[Identifier], | ||||||
|  |         super_class: Optional[Expression], | ||||||
|  |         body: ClassBody, | ||||||
|  |     ): | ||||||
|  |         super().__init__(node_type, loc) | ||||||
|  |         self.id = class_id | ||||||
|  |         self.super_class = super_class | ||||||
|  |         self.body = body | ||||||
|  |         self._fields.update( | ||||||
|  |             {"id": self.id, "superClass": self.super_class, "body": self.body} | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ClassDeclaration(Class, Declaration): | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         class_id: Identifier, | ||||||
|  |         super_class: Optional[Expression], | ||||||
|  |         body: ClassBody, | ||||||
|  |     ): | ||||||
|  |         super().__init__("ClassDeclaration", loc, class_id, super_class, body) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ClassExpression(Class, Expression): | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         class_id: Optional[Identifier], | ||||||
|  |         super_class: Optional[Expression], | ||||||
|  |         body: ClassBody, | ||||||
|  |     ): | ||||||
|  |         super().__init__("ClassExpression", loc, class_id, super_class, body) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class MetaProperty(Expression): | ||||||
|  |     """`MetaProperty` node represents ``new.target`` meta property in ES2015. | ||||||
|  |     In the future, it will represent other meta properties as well. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__( | ||||||
|  |         self, loc: Optional[SourceLocation], meta: Identifier, meta_property: Identifier | ||||||
|  |     ): | ||||||
|  |         super().__init__("MetaProperty", loc) | ||||||
|  |         self.meta = (meta,) | ||||||
|  |         self.property = meta_property | ||||||
|  |         self._fields.update({"meta": self.meta, "property": self.property}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # "Modules" block | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ModuleDeclaration(Node): | ||||||
|  |     """A module ``import`` or ``export`` declaration.""" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, node_type: str, loc: Optional[SourceLocation]): | ||||||
|  |         super().__init__(node_type, loc) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ModuleSpecifier(Node): | ||||||
|  |     """A specifier in an import or export declaration.""" | ||||||
|  | 
 | ||||||
|  |     def __init__( | ||||||
|  |         self, node_type: str, loc: Optional[SourceLocation], local: Identifier | ||||||
|  |     ): | ||||||
|  |         super().__init__(node_type, loc) | ||||||
|  |         self.local = local | ||||||
|  |         self._fields.update({"local": self.local}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ImportSpecifier(ModuleSpecifier): | ||||||
|  |     """An imported variable binding, e.g., ``{foo}`` in ``import {foo} from "mod"`` | ||||||
|  |     or ``{foo as bar}`` in ``import {foo as bar} from "mod"``. The `imported` field | ||||||
|  |     refers to the name of the export imported from the module. The `local` field | ||||||
|  |     refers to the binding imported into the local module scope. If it is a basic named | ||||||
|  |     import, such as in ``import {foo} from "mod"``, both `imported` and `local` are | ||||||
|  |     equivalent `Identifier` nodes; in this case an `Identifier` node representing ``foo``. | ||||||
|  |     If it is an aliased import, such as in ``import {foo as bar} from "mod"``, the | ||||||
|  |     `imported` field is an `Identifier` node representing ``foo``, and the `local` field  | ||||||
|  |     is an `Identifier` node representing ``bar``. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__( | ||||||
|  |         self, loc: Optional[SourceLocation], local: Identifier, imported: Identifier | ||||||
|  |     ): | ||||||
|  |         super().__init__("ImportSpecifier", loc, local) | ||||||
|  |         self.imported = imported | ||||||
|  |         self._fields.update({"imported": self.imported}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ImportDefaultSpecifier(ModuleSpecifier): | ||||||
|  |     """A default import specifier, e.g., ``foo`` in ``import foo from "mod.js"``.""" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, loc: Optional[SourceLocation], local: Identifier): | ||||||
|  |         super().__init__("ImportDefaultSpecifier", loc, local) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ImportNamespaceSpecifier(ModuleSpecifier): | ||||||
|  |     """A namespace import specifier, e.g., ``* as foo`` in ``import * as foo from "mod.js"``.""" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, loc: Optional[SourceLocation], local: Identifier): | ||||||
|  |         super().__init__("ImportNamespaceSpecifier", loc, local) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ImportDeclaration(ModuleDeclaration): | ||||||
|  |     """An import declaration, e.g., ``import foo from "mod";``.""" | ||||||
|  | 
 | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         specifiers: List[ | ||||||
|  |             Union[ImportSpecifier, ImportDefaultSpecifier, ImportNamespaceSpecifier] | ||||||
|  |         ], | ||||||
|  |         source: Literal, | ||||||
|  |     ): | ||||||
|  |         super().__init__("ImportDeclaration", loc) | ||||||
|  |         self.specifiers = specifiers | ||||||
|  |         self.source = source | ||||||
|  |         self._fields.update({"specifiers": self.specifiers, "source": self.source}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ExportSpecifier(ModuleSpecifier): | ||||||
|  |     """An exported variable binding, e.g., ``{foo}`` in ``export {foo}`` or ``{bar as foo}`` | ||||||
|  |     in ``export {bar as foo}``. The `exported` field refers to the name exported in the module. | ||||||
|  |     The `local` field refers to the binding into the local module scope. If it is a basic named | ||||||
|  |     export, such as in ``export {foo}``, both `exported` and `local` are equivalent `Identifier` | ||||||
|  |     nodes; in this case an `Identifier` node representing ``foo``. If it is an aliased export, | ||||||
|  |     such as in ``export {bar as foo}``, the `exported` field is an `Identifier` node representing | ||||||
|  |     ``foo``, and the `local` field is an `Identifier` node representing ``bar``. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__( | ||||||
|  |         self, loc: Optional[SourceLocation], local: Identifier, exported: Identifier | ||||||
|  |     ): | ||||||
|  |         super().__init__("ExportSpecifier", loc, local) | ||||||
|  |         self.exported = exported | ||||||
|  |         self._fields.update({"exported": self.exported}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ExportNamedDeclaration(ModuleDeclaration): | ||||||
|  |     """An export named declaration, e.g., ``export {foo, bar};``, ``export {foo} from "mod";`` | ||||||
|  |     or ``export var foo = 1;``. | ||||||
|  | 
 | ||||||
|  |     Notes: | ||||||
|  |         Having `declaration` populated with non-empty `specifiers` or non-null `source` results | ||||||
|  |         in an invalid state. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         declaration: Optional[Declaration], | ||||||
|  |         specifiers: List[ExportSpecifier], | ||||||
|  |         source: Optional[Literal], | ||||||
|  |     ): | ||||||
|  |         super().__init__("ExportNamedDeclaration", loc) | ||||||
|  |         self.declaration = declaration | ||||||
|  |         self.specifiers = specifiers | ||||||
|  |         self.source = source | ||||||
|  |         self._fields.update( | ||||||
|  |             { | ||||||
|  |                 "declaration": self.declaration, | ||||||
|  |                 "specifiers": self.specifiers, | ||||||
|  |                 "source": self.source, | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AnonymousDefaultExportedFunctionDeclaration(Function): | ||||||
|  |     def __init__( | ||||||
|  |         self, loc: Optional[SourceLocation], params: List[Pattern], body: FunctionBody | ||||||
|  |     ): | ||||||
|  |         super().__init__("FunctionDeclaration", loc, None, params, body) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AnonymousDefaultExportedClassDeclaration(Class): | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         super_class: Optional[Expression], | ||||||
|  |         body: ClassBody, | ||||||
|  |     ): | ||||||
|  |         super().__init__("ClassDeclaration", loc, None, super_class, body) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ExportDefaultDeclaration(ModuleDeclaration): | ||||||
|  |     """An export default declaration, e.g., ``export default function () {};`` or ``export default 1;``.""" | ||||||
|  | 
 | ||||||
|  |     def __init__( | ||||||
|  |         self, | ||||||
|  |         loc: Optional[SourceLocation], | ||||||
|  |         declaration: Union[ | ||||||
|  |             AnonymousDefaultExportedFunctionDeclaration, | ||||||
|  |             FunctionDeclaration, | ||||||
|  |             AnonymousDefaultExportedClassDeclaration, | ||||||
|  |             ClassDeclaration, | ||||||
|  |             Expression, | ||||||
|  |         ], | ||||||
|  |     ): | ||||||
|  |         super().__init__("ExportDefaultDeclaration", loc) | ||||||
|  |         self.declaration = declaration | ||||||
|  |         self._fields.update({"declaration": self.declaration}) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ExportAllDeclaration(ModuleDeclaration): | ||||||
|  |     def __init__(self, loc: Optional[SourceLocation], source: Literal): | ||||||
|  |         super().__init__("ExportAllDeclaration", loc) | ||||||
|  |         self.source = source | ||||||
|  |         self._fields.update({"source": self.source}) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue