File indexing completed on 2024-05-19 15:42:33

0001 /*
0002     SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0003     SPDX-FileCopyrightText: 2010-2012 Sven Brauch <svenbrauch@googlemail.com>
0004     SPDX-FileCopyrightText: 2012 Patrick Spendrin <ps_ml@gmx.de>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "ast.h"
0010 #include "astbuilder.h"
0011 #include <language/duchain/problem.h>
0012 
0013 namespace Python
0014 {
0015 
0016 static void dumpNode(QString &r, QString prefix, const Ast* node)
0017 {
0018     r.append(prefix);
0019     r.append(node ? node->dump(): "None");
0020 }
0021 
0022 
0023 static void dumpContext(QString &r, QString prefix, ExpressionAst::Context context)
0024 {
0025     r.append(prefix);
0026     switch(context) {
0027         case ExpressionAst::Context::Load:
0028             r.append("Load()");
0029             break;
0030         case ExpressionAst::Context::Store:
0031             r.append("Store()");
0032             break;
0033         case ExpressionAst::Context::Delete:
0034             r.append("Delete()");
0035             break;
0036         default:
0037             r.append("Invalid");
0038     }
0039 }
0040 
0041 static void dumpOperator(QString &r, QString prefix, Ast::OperatorTypes op)
0042 {
0043     r.append(prefix);
0044     switch(op) {
0045         case Ast::OperatorAdd:
0046             r.append("Add()");
0047             break;
0048         case Ast::OperatorSub:
0049             r.append("Sub()");
0050             break;
0051         case Ast::OperatorMult:
0052             r.append("Mult()");
0053             break;
0054         case Ast::OperatorMatMult:
0055             r.append("MatMult()");
0056             break;
0057         case Ast::OperatorDiv:
0058             r.append("Div()");
0059             break;
0060         case Ast::OperatorPow:
0061             r.append("Pow()");
0062             break;
0063         case Ast::OperatorLeftShift:
0064             r.append("LShift()");
0065             break;
0066         case Ast::OperatorRightShift:
0067             r.append("RShift()");
0068             break;
0069         case Ast::OperatorBitwiseOr:
0070             r.append("BitwiseOr");
0071             break;
0072         case Ast::OperatorBitwiseXor:
0073             r.append("BitwiseXor()");
0074             break;
0075         case Ast::OperatorFloorDivision:
0076             r.append("FloorDivision()");
0077             break;
0078         default:
0079             r.append("Invalid");
0080     }
0081 }
0082 
0083 template<class T>
0084 static void dumpList(QString &r, QString prefix, const T list, QString sep=", ")
0085 {
0086     int i = 0;
0087     r.append(prefix);
0088     r.append("[");
0089     foreach(const Ast* node, list) {
0090         i += 1;
0091         dumpNode(r, "", node);
0092         if (i < list.size())
0093             r.append(sep);
0094     }
0095     r.append("]");
0096 }
0097 
0098 // We never need actual constructors for AST nodes, but it seems to be required, at least for some platforms
0099 // so we provide pseudo implementations
0100 // there's nothing happening here, don't bother reading the code
0101     
0102 Ast::Ast( Ast* parent, Ast::AstType type ) : parent(parent), astType( type ), startCol(0), startLine(-99999), endCol(0), endLine(0), hasUsefulRangeInformation(false), context(nullptr) { }
0103 Ast::Ast() :  parent(nullptr), startCol(0), startLine(-5), endCol(0), endLine(0), hasUsefulRangeInformation(false), context(nullptr) { }
0104 
0105 ArgumentsAst::ArgumentsAst(Ast* parent): Ast(parent, Ast::ArgumentsAstType)
0106 {
0107     
0108 }
0109 
0110 QString ArgumentsAst::dump() const
0111 {
0112     QString r = "arguments(";
0113     dumpList(r, "posonlyargs=", posonlyargs);
0114     dumpList(r, ", args=", arguments);
0115     dumpList(r, ", kwonlyargs=", kwonlyargs);
0116     dumpList(r, ", defaults=", defaultValues);
0117     dumpList(r, ", kw_defaults=", defaultKwValues);
0118     if (vararg)
0119         dumpNode(r, ", vararg=", vararg);
0120     if (kwarg)
0121         dumpNode(r, ", kwarg=", kwarg);
0122     r.append(")");
0123     return r;
0124 }
0125 
0126 ArgAst::ArgAst(Ast* parent): Ast(parent, Ast::ArgAstType), argumentName(nullptr), annotation(nullptr)
0127 {
0128 
0129 }
0130 
0131 QString ArgAst::dump() const
0132 {
0133     QString r = "arg(";
0134     dumpNode(r, "name=", argumentName);
0135     dumpNode(r, ", annotation=", annotation);
0136     r.append(")");
0137     return r;
0138 }
0139 
0140 AssertionAst::AssertionAst(Ast* parent): StatementAst(parent, Ast::AssertionAstType) 
0141 {
0142     
0143 }
0144 
0145 QString AssertionAst::dump() const
0146 {
0147     QString r = "Assertion(";
0148     dumpNode(r, "condition=", condition);
0149     dumpNode(r, ", message=", message);
0150     r.append(")");
0151     return r;
0152 }
0153 
0154 AssignmentAst::AssignmentAst(Ast* parent): StatementAst(parent, Ast::AssignmentAstType), value(nullptr)
0155 {
0156     
0157 }
0158 
0159 QString AssignmentAst::dump() const
0160 {
0161     QString r = "Assign(";
0162     dumpList(r, "targets=", targets);
0163     dumpNode(r, ", value=", value);
0164     r.append(")");
0165     return r;
0166 }
0167 
0168 AttributeAst::AttributeAst(Ast* parent): ExpressionAst(parent, Ast::AttributeAstType), value(nullptr), depth(0)
0169 {
0170     
0171 }
0172 
0173 QString AttributeAst::dump() const
0174 {
0175     QString r = "Attribute(";
0176     dumpNode(r, "value=", value);
0177     dumpNode(r, ", attr=", attribute);
0178     dumpContext(r, ", ctx=", context);
0179     r.append(")");
0180     return r;
0181 }
0182 
0183 AugmentedAssignmentAst::AugmentedAssignmentAst(Ast* parent): StatementAst(parent, Ast::AugmentedAssignmentAstType), value(nullptr)
0184 {
0185     
0186 }
0187 
0188 QString AugmentedAssignmentAst::dump() const
0189 {
0190     QString r = "AugmentedAssignment(";
0191     dumpNode(r, "target=", target);
0192     dumpNode(r, ", value=", value);
0193     dumpOperator(r, ", op=", op);
0194     r.append(")");
0195     return r;
0196 }
0197 
0198 AnnotationAssignmentAst::AnnotationAssignmentAst(Ast* parent): StatementAst(parent, Ast::AnnotationAssignmentAstType), target(nullptr), value(nullptr), annotation(nullptr)
0199 {
0200 
0201 }
0202 
0203 QString AnnotationAssignmentAst::dump() const
0204 {
0205     QString r = "AnnotationAssignment(";
0206     dumpNode(r, "target=", target);
0207     dumpNode(r, ", value=", value);
0208     dumpNode(r, ", annotation=", annotation);
0209     r.append(")");
0210     return r;
0211 }
0212 
0213 
0214 BinaryOperationAst::BinaryOperationAst(Ast* parent): ExpressionAst(parent, Ast::BinaryOperationAstType), lhs(nullptr), rhs(nullptr)
0215 {
0216 
0217 }
0218 
0219 BooleanOperationAst::BooleanOperationAst(Ast* parent): ExpressionAst(parent, Ast::BooleanOperationAstType)
0220 {
0221     
0222 }
0223 
0224 BreakAst::BreakAst(Ast* parent): StatementAst(parent, Ast::BreakAstType)
0225 {
0226     
0227 }
0228 
0229 CallAst::CallAst(Ast* parent): ExpressionAst(parent, Ast::CallAstType), function(nullptr)
0230 {
0231     
0232 }
0233 
0234 
0235 QString CallAst::dump() const
0236 {
0237     QString r;
0238     r.append("Call(");
0239     dumpNode(r, "func=", function);
0240     dumpList(r, ", args=", arguments);
0241     dumpList(r, ", keywords=", keywords);
0242     r.append(")");
0243     return r;
0244 }
0245 
0246 ClassDefinitionAst::ClassDefinitionAst(Ast* parent): StatementAst(parent, Ast::ClassDefinitionAstType), name(nullptr)
0247 {
0248     
0249 }
0250 
0251 
0252 QString ClassDefinitionAst::dump() const
0253 {
0254     QString r;
0255     r.append("ClassDef(");
0256     dumpNode(r, "name=", name);
0257     dumpList(r, ", bases=", baseClasses);
0258     dumpList(r, ", body=", body, ",\n  ");
0259     // TODO: Keywords?
0260     dumpList(r, ", decorator_list=", decorators);
0261     r.append(")");
0262     return r;
0263 }
0264 
0265 CodeAst::CodeAst() : Ast(nullptr, Ast::CodeAstType), name(nullptr)
0266 {
0267 }
0268 
0269 CodeAst::~CodeAst()
0270 {
0271     free_ast_recursive(this);
0272 }
0273 
0274 QString CodeAst::dump() const
0275 {
0276     QString r;
0277     r.append("Module(");
0278     dumpNode(r, "name=", name);
0279     dumpList(r, ", body=", body, ",\n  ");
0280     r.append(")");
0281     return r;
0282 }
0283 
0284 CompareAst::CompareAst(Ast* parent): ExpressionAst(parent, Ast::CompareAstType), leftmostElement(nullptr)
0285 {
0286     
0287 }
0288 
0289 ComprehensionAst::ComprehensionAst(Ast* parent): Ast(parent, Ast::ComprehensionAstType), target(nullptr), iterator(nullptr)
0290 {
0291     
0292 }
0293 
0294 ContinueAst::ContinueAst(Ast* parent): StatementAst(parent, Ast::ContinueAstType)
0295 {
0296     
0297 }
0298 
0299 DeleteAst::DeleteAst(Ast* parent): StatementAst(parent, Ast::DeleteAstType)
0300 {
0301     
0302 }
0303 
0304 QString DeleteAst::dump() const
0305 {
0306     QString r = "Delete(";
0307     dumpList(r, "targets=", targets);
0308     r.append(")");
0309     return r;
0310 }
0311 
0312 DictAst::DictAst(Ast* parent): ExpressionAst(parent, Ast::DictAstType)
0313 {
0314 
0315 }
0316 
0317 QString DictAst::dump() const
0318 {
0319     QString r = "Dict(";
0320     dumpList(r, "keys=", keys);
0321     dumpList(r, ", values=", values);
0322     r.append(")");
0323     return r;
0324 }
0325 
0326 
0327 SliceAst::SliceAst(Ast* parent): ExpressionAst(parent, Ast::SliceAstType), lower(nullptr), upper(nullptr), step(nullptr)
0328 {
0329 
0330 }
0331 
0332 QString SliceAst::dump() const
0333 {
0334     QString r;
0335     r.append("Slice(");
0336     dumpNode(r, "lower=", lower);
0337     dumpNode(r, ", upper=", upper);
0338     dumpNode(r, ", step=", step);
0339     r.append(")");
0340     return r;
0341 }
0342 
0343 DictionaryComprehensionAst::DictionaryComprehensionAst(Ast* parent): ExpressionAst(parent, Ast::DictionaryComprehensionAstType), key(nullptr), value(nullptr)
0344 {
0345     
0346 }
0347 
0348 ExceptionHandlerAst::ExceptionHandlerAst(Ast* parent): Ast(parent, Ast::ExceptionHandlerAstType), type(nullptr), name(nullptr)
0349 {
0350     
0351 }
0352 
0353 ListComprehensionAst::ListComprehensionAst(Ast* parent): ExpressionAst(parent, Ast::ListComprehensionAstType), element(nullptr)
0354 {
0355 
0356 }
0357 
0358 ExpressionAst::ExpressionAst(Ast* parent, AstType type): Ast(parent, type), value(nullptr)
0359 {
0360     
0361 }
0362 
0363 AssignmentExpressionAst::AssignmentExpressionAst(Ast* parent): ExpressionAst(parent, Ast::AssignmentExpressionAstType), value(nullptr)
0364 {
0365 
0366 }
0367 
0368 QString AssignmentExpressionAst::dump() const
0369 {
0370     QString r = "AssignmentExpression(";
0371     dumpNode(r, "target=", target);
0372     dumpNode(r, ", value=", value);
0373     r.append(")");
0374     return r;
0375 }
0376 
0377 YieldFromAst::YieldFromAst(Ast* parent) : ExpressionAst(parent, Ast::YieldFromAstType)
0378 {
0379 
0380 }
0381 
0382 QString YieldFromAst::dump() const
0383 {
0384     QString r = "YieldFrom(";
0385     dumpNode(r, "value=", value);
0386     r.append(")");
0387     return r;
0388 }
0389 
0390 ForAst::ForAst(Ast* parent): StatementAst(parent, Ast::ForAstType), target(nullptr), iterator(nullptr)
0391 {
0392     
0393 }
0394 
0395 QString ForAst::dump() const
0396 {
0397     QString r = async ? "AsyncFor(": "For(";
0398     dumpNode(r, "target=", target);
0399     dumpNode(r, ", iterator=", iterator);
0400     dumpList(r, ", body=", body, ",\n    ");
0401     if (orelse.size())
0402         dumpList(r, ", orelse=", orelse, ",\n    ");
0403     r.append(")");
0404     return r;
0405 }
0406 
0407 FunctionDefinitionAst::FunctionDefinitionAst(Ast* parent): StatementAst(parent, Ast::FunctionDefinitionAstType), name(nullptr), arguments(nullptr), async(false)
0408 {
0409     
0410 }
0411 
0412 QString FunctionDefinitionAst::dump() const
0413 {
0414     QString r = async ? "AsyncFuncDef(": "FuncDef(";
0415     dumpNode(r, "name=", name);
0416     dumpNode(r, ", args=", arguments);
0417     dumpList(r, ", body=", body, ",\n    ");
0418     if (decorators.size())
0419         dumpList(r, ", decorator_list=", decorators);
0420     if (returns)
0421         dumpNode(r, ", returns=", returns);
0422     r.append(")");
0423     return r;
0424 }
0425 
0426 GeneratorExpressionAst::GeneratorExpressionAst(Ast* parent): ExpressionAst(parent, Ast::GeneratorExpressionAstType), element(nullptr)
0427 {
0428     
0429 }
0430 
0431 GlobalAst::GlobalAst(Ast* parent): StatementAst(parent, Ast::GlobalAstType)
0432 {
0433     
0434 }
0435 
0436 
0437 QString GlobalAst::dump() const
0438 {
0439     QString r = "Global(";
0440     dumpList(r, "names=", names);
0441     r.append(")");
0442     return r;
0443 }
0444 
0445 Identifier::Identifier(QString value) : Ast(nullptr, Ast::IdentifierAstType), value(value)
0446 {
0447     
0448 }
0449 
0450 QString Identifier::dump() const
0451 {
0452     return "'" + value + "'";
0453 }
0454 
0455 IfAst::IfAst(Ast* parent): StatementAst(parent, Ast::IfAstType), condition(nullptr)
0456 {
0457     
0458 }
0459 
0460 QString IfAst::dump() const
0461 {
0462     QString r = "If(";
0463     dumpNode(r, "condition=", condition);
0464     dumpList(r, ", body=", body, ",\n    ");
0465     if (orelse.size())
0466         dumpList(r, ", orelse=", orelse, ",\n    ");
0467     r.append(")");
0468     return r;
0469 }
0470 
0471 IfExpressionAst::IfExpressionAst(Ast* parent): ExpressionAst(parent, Ast::IfExpressionAstType), condition(nullptr)
0472 {
0473     
0474 }
0475 
0476 QString IfExpressionAst::dump() const
0477 {
0478     QString r = "IfExpr(";
0479     dumpNode(r, "condition=", condition);
0480     dumpNode(r, ", body=", body);
0481     if (orelse)
0482         dumpNode(r, ", orelse=", orelse);
0483     r.append(")");
0484     return r;
0485 }
0486 
0487 ImportAst::ImportAst(Ast* parent): StatementAst(parent, Ast::ImportAstType)
0488 {
0489     
0490 }
0491 
0492 QString ImportAst::dump() const
0493 {
0494     QString r = "Import(";
0495     dumpList(r, "names=", names);
0496     r.append(")");
0497     return r;
0498 }
0499 
0500 ImportFromAst::ImportFromAst(Ast* parent): StatementAst(parent, Ast::ImportFromAstType), module(nullptr), level(0)
0501 {
0502     
0503 }
0504 
0505 QString ImportFromAst::dump() const
0506 {
0507     QString r = "ImportFrom(";
0508     dumpNode(r, "module=", module);
0509     dumpList(r, ", names=", names);
0510     r.append(")");
0511     return r;
0512 }
0513 
0514 KeywordAst::KeywordAst(Ast* parent): Ast(parent, Ast::KeywordAstType), argumentName(nullptr), value(nullptr)
0515 {
0516     
0517 }
0518 
0519 QString KeywordAst::dump() const
0520 {
0521     QString r;
0522     r.append("Keyword(");
0523     dumpNode(r, "arg=", argumentName);
0524     dumpNode(r, ", value=", value);
0525     r.append(")");
0526     return r;
0527 }
0528 
0529 LambdaAst::LambdaAst(Ast* parent): ExpressionAst(parent, Ast::LambdaAstType), arguments(nullptr)
0530 {
0531     
0532 }
0533 
0534 ListAst::ListAst(Ast* parent): ExpressionAst(parent, Ast::ListAstType)
0535 {
0536     
0537 }
0538 
0539 QString ListAst::dump() const
0540 {
0541     QString r = "List(";
0542     dumpList(r, "elts=", elements);
0543     dumpContext(r, ", ctx=", context);
0544     r.append(")");
0545     return r;
0546 }
0547 
0548 NameAst::NameAst(Ast* parent): ExpressionAst(parent, Ast::NameAstType), identifier(nullptr)
0549 {
0550     
0551 }
0552 
0553 QString NameAst::dump() const
0554 {
0555     QString r = "Name(";
0556     dumpNode(r, "id=", identifier);
0557     dumpContext(r, ", ctx=", context);
0558     r.append(")");
0559     return r;
0560 }
0561 
0562 AwaitAst::AwaitAst(Ast* parent): ExpressionAst(parent, Ast::AwaitAstType), value(nullptr)
0563 {
0564 
0565 }
0566 
0567 QString AwaitAst::dump() const
0568 {
0569     QString r = "AwaitAst(";
0570     dumpNode(r, "value=", value);
0571     r.append(")");
0572     return r;
0573 }
0574 
0575 QString NameConstantAst::dump() const
0576 {
0577     switch (value) {
0578         case NameConstantAst::NameConstantTypes::False:
0579             return "False";
0580         case NameConstantAst::NameConstantTypes::True:
0581             return "True";
0582         case NameConstantAst::NameConstantTypes::None:
0583             return "None";
0584         default:
0585             return "Invalid";
0586     }
0587 }
0588 
0589 QString NumberAst::dump() const
0590 {
0591     if (isInt)
0592         return QString::fromLatin1("Number(%1)").arg(value);
0593     else
0594         return "Float()";
0595 }
0596 
0597 PassAst::PassAst(Ast* parent): StatementAst(parent, Ast::PassAstType)
0598 {
0599     
0600 }
0601 
0602 NonlocalAst::NonlocalAst(Ast* parent): StatementAst(parent, Ast::NonlocalAstType)
0603 {
0604     
0605 }
0606 
0607 RaiseAst::RaiseAst(Ast* parent): StatementAst(parent, Ast::RaiseAstType), type(nullptr)
0608 {
0609     
0610 }
0611 
0612 
0613 QString RaiseAst::dump() const
0614 {
0615     QString r;
0616     r.append("Raise(");
0617     dumpNode(r, "type=", type);
0618     r.append(")");
0619     return r;
0620 }
0621 
0622 ReturnAst::ReturnAst(Ast* parent): StatementAst(parent, Ast::ReturnAstType), value(nullptr)
0623 {
0624     
0625 }
0626 
0627 QString ReturnAst::dump() const
0628 {
0629     QString r;
0630     r.append("Return(");
0631     dumpNode(r, "value=", value);
0632     r.append(")");
0633     return r;
0634 }
0635 
0636 SetAst::SetAst(Ast* parent): ExpressionAst(parent, Ast::SetAstType)
0637 {
0638     
0639 }
0640 
0641 QString SetAst::dump() const
0642 {
0643     QString r = "Set(";
0644     dumpList(r, "elts=", elements);
0645     r.append(")");
0646     return r;
0647 }
0648 
0649 SetComprehensionAst::SetComprehensionAst(Ast* parent): ExpressionAst(parent, Ast::SetComprehensionAstType), element(nullptr)
0650 {
0651     
0652 }
0653 
0654 StatementAst::StatementAst(Ast* parent, AstType type): Ast(parent, type)
0655 {
0656     
0657 }
0658 
0659 JoinedStringAst::JoinedStringAst(Ast* parent): ExpressionAst(parent, Ast::JoinedStringAstType), values()
0660 {
0661 
0662 }
0663 
0664 FormattedValueAst::FormattedValueAst(Ast* parent): ExpressionAst(parent, Ast::FormattedValueAstType), value(nullptr), conversion(0), formatSpec(nullptr)
0665 {
0666 
0667 }
0668 
0669 SubscriptAst::SubscriptAst(Ast* parent): ExpressionAst(parent, Ast::SubscriptAstType), value(nullptr), slice(nullptr)
0670 {
0671     
0672 }
0673 
0674 QString SubscriptAst::dump() const
0675 {
0676     QString r;
0677     r.append("Subscript(");
0678     dumpNode(r, "value=", value);
0679     dumpNode(r, ", slice=", slice);
0680     dumpContext(r, ", context=", context);
0681     r.append(")");
0682     return r;
0683 }
0684 
0685 StarredAst::StarredAst(Ast* parent): ExpressionAst(parent, Ast::StarredAstType)
0686 {
0687     
0688 }
0689 
0690 QString StarredAst::dump() const
0691 {
0692     QString r;
0693     r.append("Starred(");
0694     dumpNode(r, "value=", value);
0695     dumpContext(r, ", context=", context);
0696     r.append(")");
0697     return r;
0698 }
0699 
0700 TupleAst::TupleAst(Ast* parent): ExpressionAst(parent, Ast::TupleAstType)
0701 {
0702     
0703 }
0704 
0705 QString TupleAst::dump() const
0706 {
0707     QString r = "Tuple(";
0708     dumpList(r, "elts=", elements);
0709     dumpContext(r, ", context=", context);
0710     r.append(")");
0711     return r;
0712 }
0713 
0714 
0715 UnaryOperationAst::UnaryOperationAst(Ast* parent): ExpressionAst(parent, Ast::UnaryOperationAstType), operand(nullptr)
0716 {
0717     
0718 }
0719 
0720 QString UnaryOperationAst::dump() const {
0721     QString r;
0722     r.append("Unary(");
0723     dumpNode(r, "value=", operand);
0724     r.append(", op=");
0725     switch(type) {
0726        case Ast::UnaryOperatorInvert:
0727             r.append("Invert()");
0728             break;
0729         case Ast::UnaryOperatorNot:
0730             r.append("Not()");
0731             break;
0732         case Ast::UnaryOperatorAdd:
0733             r.append("UAdd()");
0734             break;
0735         case Ast::UnaryOperatorSub:
0736             r.append("USub()");
0737             break;
0738         default:
0739             r.append("Invalid");
0740     }
0741     r.append(")");
0742     return r;
0743 }
0744 
0745 TryStarAst::TryStarAst(Ast* parent): StatementAst(parent, Ast::TryStarAstType)
0746 {
0747 
0748 }
0749 
0750 TryAst::TryAst(Ast* parent): StatementAst(parent, Ast::TryAstType)
0751 {
0752 
0753 }
0754 
0755 QString TryAst::dump() const
0756 {
0757     QString r = "Try(";
0758     dumpList(r, "body=", body, ",\n    ");
0759     dumpList(r, ", handlers=", handlers);
0760     if (orelse.size())
0761         dumpList(r, ", orelse=", orelse, ",\n    ");
0762     if (finally.size())
0763         dumpList(r, ", finally=", finally, ",\n    ");
0764     r.append(")");
0765     return r;
0766 }
0767 
0768 
0769 WhileAst::WhileAst(Ast* parent): StatementAst(parent, Ast::WhileAstType), condition(nullptr)
0770 {
0771     
0772 }
0773 
0774 QString WhileAst::dump() const
0775 {
0776     QString r = "While(";
0777     dumpNode(r, "condition=", condition);
0778     dumpList(r, ", body=", body, ",\n    ");
0779     if (orelse.size())
0780         dumpList(r, ", orelse=", orelse, ",\n    ");
0781     r.append(")");
0782     return r;
0783 }
0784 
0785 
0786 WithAst::WithAst(Ast* parent): StatementAst(parent, Ast::WithAstType)
0787 {
0788     
0789 }
0790 
0791 QString WithAst::dump() const
0792 {
0793     QString r = async ? "AsyncWith(": "With(";
0794     dumpList(r, ", items=", items);
0795     dumpList(r, ", body=", body, ",\n    ");
0796     r.append(")");
0797     return r;
0798 }
0799 
0800 WithItemAst::WithItemAst(Ast* parent): Ast(parent, Ast::WithItemAstType)
0801 {
0802 
0803 }
0804 
0805 YieldAst::YieldAst(Ast* parent): ExpressionAst(parent, Ast::YieldAstType), value(nullptr)
0806 {
0807     
0808 }
0809 
0810 QString YieldAst::dump() const
0811 {
0812     QString r = "Yield(";
0813     dumpNode(r, "value=", value);
0814     r.append(")");
0815     return r;
0816 }
0817 
0818 
0819 AliasAst::AliasAst(Ast* parent): Ast(parent, Ast::AliasAstType), name(nullptr), asName(nullptr)
0820 {
0821     
0822 }
0823 
0824 QString AliasAst::dump() const
0825 {
0826     QString r = "Alias(";
0827     dumpNode(r, "name=", name);
0828     dumpNode(r, ", as=", asName);
0829     r.append(")");
0830     return r;
0831 }
0832 
0833 QString MatchAst::dump() const
0834 {
0835     QString r = "Match(";
0836     dumpNode(r, "subject=", subject);
0837     dumpList(r, ", cases=", cases);
0838     r.append(")");
0839     return r;
0840 }
0841 
0842 QString MatchCaseAst::dump() const
0843 {
0844     QString r = "MatchCase(";
0845     dumpNode(r, "pattern=", pattern);
0846     if (guard)
0847         dumpNode(r, ", guard=", guard);
0848     dumpList(r, ", body=", body);
0849     r.append(")");
0850     return r;
0851 }
0852 
0853 QString MatchValueAst::dump() const
0854 {
0855     QString r = "MatchValue(";
0856     dumpNode(r, "value=", value);
0857     r.append(")");
0858     return r;
0859 }
0860 
0861 QString MatchSingletonAst::dump() const
0862 {
0863     QString r = "MatchSingleton(";
0864     switch (value) {
0865         case NameConstantAst::NameConstantTypes::True:
0866             r.append("value=True");
0867             break;
0868         case NameConstantAst::NameConstantTypes::False:
0869             r.append("value=False");
0870             break;
0871         case NameConstantAst::NameConstantTypes::None:
0872             r.append("value=None");
0873             break;
0874         default:
0875             r.append("value=Invalid");
0876     }
0877     r.append(")");
0878     return r;
0879 }
0880 
0881 QString MatchSequenceAst::dump() const
0882 {
0883     QString r = "MatchSequence(";
0884     dumpList(r, "patterns=", patterns);
0885     r.append(")");
0886     return r;
0887 }
0888 
0889 QString MatchMappingAst::dump() const
0890 {
0891     QString r = "MatchMapping(";
0892     dumpList(r, "keys=", keys);
0893     dumpList(r, ", patterns=", patterns);
0894     dumpNode(r, ", rest=", rest);
0895     r.append(")");
0896     return r;
0897 }
0898 
0899 QString MatchClassAst::dump() const
0900 {
0901     QString r = "MatchClass(";
0902     dumpNode(r, "cls=", cls);
0903     dumpList(r, ", patterns=", patterns);
0904     dumpNode(r, ", kwd_attrs=", kwdAttrs);
0905     dumpList(r, ", kwd_patterns=", kwdPatterns);
0906     r.append(")");
0907     return r;
0908 }
0909 
0910 QString MatchStarAst::dump() const
0911 {
0912     QString r = "MatchStar(";
0913     dumpNode(r, "name=", name);
0914     r.append(")");
0915     return r;
0916 }
0917 
0918 QString MatchAsAst::dump() const
0919 {
0920     QString r = "MatchAs(";
0921     dumpNode(r, "name=", name);
0922     if (pattern)
0923         dumpNode(r, ", pattern=", pattern);
0924     r.append(")");
0925     return r;
0926 }
0927 
0928 QString MatchOrAst::dump() const
0929 {
0930     QString r = "MatchOr(";
0931     dumpList(r, ", patterns=", patterns);
0932     r.append(")");
0933     return r;
0934 }
0935 
0936 
0937 }