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
|
||||
* with statement
|
||||
* RegExp
|
||||
* ES6 features:
|
||||
* ES2015 features:
|
||||
* generators/yield statement
|
||||
* for-of statement
|
||||
* template literals
|
||||
* and other ES6 features :)
|
||||
* ES2016 features:
|
||||
* basically, all of them
|
||||
|
||||
More about ESTree standard:
|
||||
https://github.com/estree/estree/
|
||||
|
||||
Todo:
|
||||
* Add support for lacking features
|
||||
* Make another attempt to split up this module
|
||||
"""
|
||||
|
||||
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"]
|
||||
"""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):
|
||||
"""A unary operator token."""
|
||||
|
@ -1090,6 +1095,21 @@ class ArrayPattern(Pattern):
|
|||
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
|
||||
|
||||
|
||||
|
@ -1100,3 +1120,256 @@ class Identifier(Expression, Pattern):
|
|||
super().__init__("Identifier", loc)
|
||||
self.name = 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