Closed xmnlab closed 1 month ago
Examples of ImportFromStmt
in Python:
>>> ast.dump(ast.parse("from abc import ABC"))
"Module(body=[ImportFrom(module='abc', names=[alias(name='ABC')], level=0)], type_ignores=[])"
>>> ast.dump(ast.parse("from abc import ABC as MyABC"))
"Module(body=[ImportFrom(module='abc', names=[alias(name='ABC', asname='MyABC')], level=0)], type_ignores=[])"
>>> ast.dump(ast.parse("from .. import annotations"))
"Module(body=[ImportFrom(names=[alias(name='annotations')], level=2)], type_ignores=[])"
>>> ast.dump(ast.parse("from . import annotations"))
"Module(body=[ImportFrom(names=[alias(name='annotations')], level=1)], type_ignores=[])"
>>> ast.dump(ast.parse("from .mypkg import class1"))
"Module(body=[ImportFrom(module='mypkg', names=[alias(name='class1')], level=1)], type_ignores=[])"
Example of ImportStmt
in Python:
>>> ast.dump(ast.parse("import ABC as MyABC"))
"Module(body=[Import(names=[alias(name='ABC', asname='MyABC')])], type_ignores=[])"
>>> ast.dump(ast.parse("import matplotlib.pyplot as plt"))
"Module(body=[Import(names=[alias(name='matplotlib.pyplot', asname='plt')])], type_ignores=[])"
So probably we should add a class for Alias
solved by @apkrelling #118 thanks!
from gpt:
note: expression classes should inherit from
Expr
and statement classes should inherit fromStatementType
. we probably should renameStatementType
toStatement
in the futureOverview
ImportStmt
: Represents an import statement likeimport module_name
.ImportFromStmt
: Represents an import-from statement likefrom module_name import name [as alias]
.AliasExpr
: Represents an alias in an import statement, handling theas alias
part.We will design these classes to integrate seamlessly with your existing AST framework, following the structure and conventions you've established.
Step-by-Step Guide
1. Understanding the Existing Structure
Before designing the new classes, let's briefly review the relevant parts of your AST framework:
AST
: Base class for all AST nodes.ASTKind
: Enum class for different kinds of AST nodes.ASTNodes
: Class for nodes that contain a list of AST nodes (e.g., modules, blocks).Expr
: Represents expressions in the AST.StatementType
: Base class for statements.Given that import statements are statements in the language, they should inherit from
StatementType
orAST
.2. Updating
ASTKind
EnumWe need to add new kinds to the
ASTKind
enum to represent the import statements and aliases.Code for Updating
ASTKind
Explanation
ImportStmtKind
: Kind forImportStmt
.ImportFromStmtKind
: Kind forImportFromStmt
.AliasExprKind
: Kind forAliasExpr
.3. Defining the
AliasExpr
ClassFirst, let's define the
AliasExpr
class to represent aliases in import statements.Code for
AliasExpr
ClassExplanation
Attributes:
name
: The original name being imported.asname
: The alias name, if any.Methods:
__str__
: Provides a readable string representation.get_struct
: Returns the AST structure for serialization and visualization.Inheritance: Inherits from
AST
since it's a fundamental node.4. Defining the
ImportStmt
ClassNow, let's define the
ImportStmt
class to represent statements likeimport module_name
.Code for
ImportStmt
ClassExplanation
Attributes:
names
: A list ofAliasExpr
instances representing the modules or names being imported.Methods:
__str__
: Provides a readable string representation.get_struct
: Returns the AST structure.Inheritance: Inherits from
AST
.5. Defining the
ImportFromStmt
ClassNext, define the
ImportFromStmt
class to represent statements likefrom module_name import name [as alias]
.Code for
ImportFromStmt
ClassExplanation
Attributes:
module
: The module name from which to import; can beNone
for relative imports likefrom . import name
.names
: A list ofAliasExpr
instances representing the names being imported.level
: The level of relative import (e.g.,from ..module import name
would havelevel=2
).Methods:
__str__
: Provides a readable string representation, handling relative imports.get_struct
: Returns the AST structure.Inheritance: Inherits from
AST
.6. Testing the Implementation
Example Usage
Expected Output
7. Integration with
ASTNodes
If you have a module or block of code represented by an
ASTNodes
instance, you can include import statements in it.Example
Expected Output
8. Handling Edge Cases
Relative Imports
Ensure that relative imports without a module name are handled correctly (e.g.,
from . import name
).Wildcard Imports
Handle the case where
names
contains a wildcard (e.g.,from module import *
).Code Update for
ImportFromStmt
9. Full Code Snippets
Updated
astx/base.py
New Module
astx/statements.py
Since import statements are statements, it might be logical to place them in a new module,
statements.py
.10. Integration with the Rest of the Framework
Ensure that your module imports and exports are updated to include the new classes.
In
astx/__init__.py
Conclusion
By defining the
AliasExpr
,ImportStmt
, andImportFromStmt
classes, you've extended your AST framework to handle import statements, including aliases. These classes integrate with your existing structure and support AST representation and visualization.Next Steps
Testing: Write unit tests to ensure that the classes handle various import scenarios correctly, including edge cases like relative imports and wildcard imports.
Error Handling: Implement validation in the constructors to handle invalid inputs (e.g., empty module names when not allowed).
Documentation: Update your module's documentation to include these new classes and explain their usage.
Additional Considerations
1. Handling Future Imports
If your language supports future imports (e.g.,
from __future__ import division
in Python), you may want to handle them explicitly.Code Suggestion
You can add an attribute or subclass to handle future imports.
2. Integration with Symbol Table
If your AST framework interacts with a symbol table or namespace management, you might need to update those components to handle import statements and aliases.
3. Extending
AliasExpr
If your language allows importing multiple levels (e.g.,
import package.module
), you may need to represent the full dotted name.Code Update
*4. Representing `Import
in
ImportStmt`**If your language allows
import *
outside offrom
statements, you might need to handle that inImportStmt
.