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