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 }