public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/kdevelop-python] f44: Rebase python-3.8 patch
@ 2026-07-04  1:00 Jan Grulich
  0 siblings, 0 replies; only message in thread
From: Jan Grulich @ 2026-07-04  1:00 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/kdevelop-python
Branch : f44
Commit : 289d49b3dfb0bd17b579a7fa528907d924ec8e77
Author : Jan Grulich <jgrulich@redhat.com>
Date   : 2019-10-24T08:00:06+02:00
Stats  : +257/-84 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/kdevelop-python/c/289d49b3dfb0bd17b579a7fa528907d924ec8e77?branch=f44

Log:
Rebase python-3.8 patch

---
diff --git a/kdev-python-python38.patch b/kdev-python-python38.patch
index 7e1c31c..682f836 100644
--- a/kdev-python-python38.patch
+++ b/kdev-python-python38.patch
@@ -1,9 +1,9 @@
 diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 6f9e465ba4b53417821af0422a20fa6e29285434..09b089dd694fec18e557d2e1e110edc1527ce796 100644
+index 84ea130..5379518 100644
 --- a/CMakeLists.txt
 +++ b/CMakeLists.txt
 @@ -31,7 +31,7 @@ add_definitions( -DTRANSLATION_DOMAIN=\"kdevpython\" )
-
+ 
  # CMake looks for exactly the specified version first and ignores newer versions.
  # To avoid that, start looking for the newest supported version and work down.
 -set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4)
@@ -13,21 +13,21 @@ index 6f9e465ba4b53417821af0422a20fa6e29285434..09b089dd694fec18e557d2e1e110edc1
      if ( PYTHONINTERP_FOUND )
 @@ -49,7 +49,7 @@ if ( PYTHONINTERP_FOUND AND PYTHON_VERSION_STRING VERSION_GREATER "3.4" )
  endif()
-
+ 
  if ( NOT PYTHONLIBS_FOUND OR PYTHONLIBS_VERSION_STRING VERSION_LESS "3.4.3" )
 -    message(FATAL_ERROR "Python >= 3.4.3 but < 3.8 with --enable-shared is required to build kdev-python")
 +    message(FATAL_ERROR "Python >= 3.4.3 but < 3.9 with --enable-shared is required to build kdev-python")
  endif()
-
+ 
  configure_file(kdevpythonversion.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/kdevpythonversion.h" @ONLY)
 diff --git a/duchain/declarationbuilder.cpp b/duchain/declarationbuilder.cpp
-index e3cb2b9c5c8423f428dfe420a6b6926745b4fcc8..61e144c5966d328d289f12cba99ea9e268e8430f 100644
+index e3cb2b9..61e144c 100644
 --- a/duchain/declarationbuilder.cpp
 +++ b/duchain/declarationbuilder.cpp
 @@ -1354,6 +1354,14 @@ void DeclarationBuilder::visitAnnotationAssignment(AnnotationAssignmentAst* node
      assignToUnknown(node->target, assignType);
  }
-
+ 
 +void DeclarationBuilder::visitAssignmentExpression(AssignmentExpressionAst* node) {
 +    AstDefaultVisitor::visitAssignmentExpression(node);
 +
@@ -49,7 +49,7 @@ index e3cb2b9c5c8423f428dfe420a6b6926745b4fcc8..61e144c5966d328d289f12cba99ea9e2
          // to the functions FunctionType.
          currentIndex += 1;
 diff --git a/duchain/declarationbuilder.h b/duchain/declarationbuilder.h
-index adee6d6d552aa0380910e4f6fb26b760704feb50..1992b7815ebc4010e9d35231a538794490906ecb 100644
+index adee6d6..1992b78 100644
 --- a/duchain/declarationbuilder.h
 +++ b/duchain/declarationbuilder.h
 @@ -90,6 +90,7 @@ protected:
@@ -61,21 +61,21 @@ index adee6d6d552aa0380910e4f6fb26b760704feb50..1992b7815ebc4010e9d35231a5387944
      void visitImport(ImportAst* node) override;
      void visitImportFrom(ImportFromAst* node) override;
 diff --git a/duchain/expressionvisitor.cpp b/duchain/expressionvisitor.cpp
-index 5c5286aeb76f20263ed58b4458bdc6a5963ff5c8..055c5b498647a0663c7520f8b538dd72b5536ec9 100644
+index 5c5286a..055c5b4 100644
 --- a/duchain/expressionvisitor.cpp
 +++ b/duchain/expressionvisitor.cpp
 @@ -757,5 +757,9 @@ void ExpressionVisitor::visitBooleanOperation(Python::BooleanOperationAst* node)
      encounter(result);
  }
-
+ 
 +void ExpressionVisitor::visitAssignmentExpression(Python::AssignmentExpressionAst* node) {
 +    visitNode(node->value);
 +}
 +
  }
-
+ 
 diff --git a/duchain/expressionvisitor.h b/duchain/expressionvisitor.h
-index 25ca231938d460370ea591eac7249e098b31386d..a56481ad37bf93e97a32ef899916d03b0cbfc2ef 100644
+index 25ca231..a56481a 100644
 --- a/duchain/expressionvisitor.h
 +++ b/duchain/expressionvisitor.h
 @@ -81,6 +81,7 @@ public:
@@ -83,11 +83,11 @@ index 25ca231938d460370ea591eac7249e098b31386d..a56481ad37bf93e97a32ef899916d03b
      void visitIfExpression(IfExpressionAst* node) override;
      void visitNameConstant(NameConstantAst* node) override;
 +    void visitAssignmentExpression(AssignmentExpressionAst* node) override;
-
+ 
      /**
       * @brief Checks for magic docstrings that override a call's return type.
 diff --git a/duchain/tests/pyduchaintest.cpp b/duchain/tests/pyduchaintest.cpp
-index 7142ed2b2026b99e44386c47589af063dae03172..17ba34e53662eaa961c54b556adce1dc749772c2 100644
+index 7142ed2..17ba34e 100644
 --- a/duchain/tests/pyduchaintest.cpp
 +++ b/duchain/tests/pyduchaintest.cpp
 @@ -838,6 +838,7 @@ void PyDUChainTest::testTypes()
@@ -97,7 +97,7 @@ index 7142ed2b2026b99e44386c47589af063dae03172..17ba34e53662eaa961c54b556adce1dc
 +    QEXPECT_FAIL("assignment_expr_context", "not implemented", Continue);
      QCOMPARE(visitor->found, true);
  }
-
+ 
 @@ -1302,6 +1303,21 @@ void PyDUChainTest::testTypes_data()
          "        def foo(self, ccc=aaa, ddd=bbb):\n" // self.bbb is visible here, Foo().aaa isn't.
          "            return ccc, ddd\n"
@@ -118,7 +118,7 @@ index 7142ed2b2026b99e44386c47589af063dae03172..17ba34e53662eaa961c54b556adce1dc
 +    "checkme = foo(10, 'x', 2.3, d='y')\n" << "tuple of (int, str, float, str)";
 +#endif
  }
-
+ 
  typedef QPair<Declaration*, int> pair;
 @@ -1780,6 +1796,9 @@ void PyDUChainTest::testVariableCreation_data()
                                                                                  << QStringList{"int", "int", "float"};
@@ -128,16 +128,16 @@ index 7142ed2b2026b99e44386c47589af063dae03172..17ba34e53662eaa961c54b556adce1dc
 +    QTest::newRow("assignment_expr") << "a = (b := 10)" << QStringList{"a", "b"} << QStringList{"int", "int"};
 +#endif
  }
-
+ 
  void PyDUChainTest::testCleanupMultiplePasses()
 diff --git a/parser/ast.cpp b/parser/ast.cpp
-index 9892b184068079f92292ee3d996a0b714481b65c..cd570d36f34efe6ec09e236cb469d36402d50700 100644
+index 9892b18..cd570d3 100644
 --- a/parser/ast.cpp
 +++ b/parser/ast.cpp
 @@ -163,6 +163,11 @@ ExpressionAst::ExpressionAst(Ast* parent, AstType type): Ast(parent, type), valu
-
+     
  }
-
+ 
 +AssignmentExpressionAst::AssignmentExpressionAst(Ast* parent): ExpressionAst(parent, Ast::AssignmentExpressionAstType), value(nullptr)
 +{
 +
@@ -145,18 +145,18 @@ index 9892b184068079f92292ee3d996a0b714481b65c..cd570d36f34efe6ec09e236cb469d364
 +
  YieldFromAst::YieldFromAst(Ast* parent) : ExpressionAst(parent, Ast::YieldFromAstType)
  {
-
+ 
 @@ -248,7 +253,7 @@ NameConstantAst::NameConstantAst(Ast* parent): ExpressionAst(parent, Ast::NameCo
-
+ 
  }
-
+ 
 -NumberAst::NumberAst(Ast* parent): ExpressionAst(parent, Ast::NumberAstType), value(0)
 +NumberAst::NumberAst(Ast* parent): ExpressionAst(parent, Ast::NumberAstType), value(0), isInt(false)
  {
-
+     
  }
 diff --git a/parser/ast.h b/parser/ast.h
-index 378af0bd03106b5c0cef958ca8b81530544bef12..65fef1cd4b26cdb24bcc53692fb97836417abfb6 100644
+index 378af0b..65fef1c 100644
 --- a/parser/ast.h
 +++ b/parser/ast.h
 @@ -131,6 +131,7 @@ public:
@@ -165,12 +165,12 @@ index 378af0bd03106b5c0cef958ca8b81530544bef12..65fef1cd4b26cdb24bcc53692fb97836
          IndexAstType,
 +        AssignmentExpressionAstType,
          LastExpressionType, // keep this at the end of the expr ast list
-
+ 
          CodeAstType,
 @@ -457,6 +458,13 @@ public:
      ExpressionAst* value; // WARNING this is not set in most cases!
  };
-
+ 
 +class KDEVPYTHONPARSER_EXPORT AssignmentExpressionAst : public ExpressionAst {
 +public:
 +    AssignmentExpressionAst(Ast* parent);
@@ -190,13 +190,13 @@ index 378af0bd03106b5c0cef958ca8b81530544bef12..65fef1cd4b26cdb24bcc53692fb97836
      ArgAst* vararg;
      ArgAst* kwarg;
 diff --git a/parser/astbuilder.cpp b/parser/astbuilder.cpp
-index a1ccd68dd378dcfc0e2117f25ac887746770d7d9..ad2e0dce821b746dbda279380716f50cbf617e38 100644
+index a1ccd68..ad2e0dc 100644
 --- a/parser/astbuilder.cpp
 +++ b/parser/astbuilder.cpp
 @@ -101,7 +101,13 @@ CodeAst::Ptr AstBuilder::parse(const QUrl& filename, QString &contents)
      PythonInitializer pyIniter(pyInitLock);
      PyArena* arena = pyIniter.arena;
-
+ 
 +#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
 +    PyCompilerFlags flags;
 +    flags.cf_flags = PyCF_SOURCE_IS_UTF8 | PyCF_IGNORE_COOKIE | PyCF_ONLY_AST;
@@ -204,17 +204,17 @@ index a1ccd68dd378dcfc0e2117f25ac887746770d7d9..ad2e0dce821b746dbda279380716f50c
 +#else
      PyCompilerFlags flags = {PyCF_SOURCE_IS_UTF8 | PyCF_IGNORE_COOKIE};
 +#endif
-
+ 
      CythonSyntaxRemover cythonSyntaxRemover;
-
+ 
 diff --git a/parser/astdefaultvisitor.cpp b/parser/astdefaultvisitor.cpp
-index 5db1f6f16ba31eff2006c1320735650c5c9c56d8..cdd31bbff9a4406eefda3c10fd0bb15c3626008c 100644
+index 5db1f6f..cdd31bb 100644
 --- a/parser/astdefaultvisitor.cpp
 +++ b/parser/astdefaultvisitor.cpp
 @@ -292,6 +292,12 @@ void AstDefaultVisitor::visitAnnotationAssignment(AnnotationAssignmentAst* node)
      visitNode(node->value);
  }
-
+ 
 +void AstDefaultVisitor::visitAssignmentExpression(AssignmentExpressionAst* node)
 +{
 +    visitNode(node->target);
@@ -225,7 +225,7 @@ index 5db1f6f16ba31eff2006c1320735650c5c9c56d8..cdd31bbff9a4406eefda3c10fd0bb15c
  {
      visitNode(node->lhs);
 diff --git a/parser/astdefaultvisitor.h b/parser/astdefaultvisitor.h
-index e8e0d3de72622d903a2aae6895194c2f93914402..aa1f540c9753fd0d9911b656548135e7030f6fee 100644
+index e8e0d3d..aa1f540 100644
 --- a/parser/astdefaultvisitor.h
 +++ b/parser/astdefaultvisitor.h
 @@ -49,6 +49,7 @@ public:
@@ -245,7 +245,7 @@ index e8e0d3de72622d903a2aae6895194c2f93914402..aa1f540c9753fd0d9911b656548135e7
      void visitWhile(WhileAst* node) override { AstDefaultVisitor::visitWhile(node); delete node; }
      void visitIf(IfAst* node) override { AstDefaultVisitor::visitIf(node); delete node; }
 diff --git a/parser/astvisitor.cpp b/parser/astvisitor.cpp
-index ace7d6192b1baa70b9f52713e22cc8d1f671cf1b..51c5a1c5f131fa05bc570e6b74fc4866623d52ed 100644
+index ace7d61..51c5a1c 100644
 --- a/parser/astvisitor.cpp
 +++ b/parser/astvisitor.cpp
 @@ -47,6 +47,7 @@ void AstVisitor::visitNode(Ast* node)
@@ -257,7 +257,7 @@ index ace7d6192b1baa70b9f52713e22cc8d1f671cf1b..51c5a1c5f131fa05bc570e6b74fc4866
          case Ast::WhileAstType:                                 this->visitWhile(static_cast<WhileAst*>(node)); break;
          case Ast::IfAstType:                                    this->visitIf(static_cast<IfAst*>(node)); break;
 diff --git a/parser/astvisitor.h b/parser/astvisitor.h
-index 1908e9dd9864c2dd1c4cd33d6db1e25be8d487fb..51aa47b4b820225a2a395092bc40f69f379c4196 100644
+index 1908e9d..51aa47b 100644
 --- a/parser/astvisitor.h
 +++ b/parser/astvisitor.h
 @@ -61,6 +61,7 @@ public:
@@ -269,46 +269,45 @@ index 1908e9dd9864c2dd1c4cd33d6db1e25be8d487fb..51aa47b4b820225a2a395092bc40f69f
      virtual void visitWhile(WhileAst* node) { Q_UNUSED(node); };
      virtual void visitIf(IfAst* node) { Q_UNUSED(node); };
 diff --git a/parser/conversionGenerator.py b/parser/conversionGenerator.py
-index 9d65cc0d9915bd6c0cfa4ea37fd3136a8c18e9d2..66055953ef4e3cc9896a13bd59cb641c93a2c589 100644
+index 9d65cc0..ab4a332 100644
 --- a/parser/conversionGenerator.py
 +++ b/parser/conversionGenerator.py
 @@ -9,7 +9,7 @@
-
+ 
  import sys
-
+ 
 -contents = open('python36.sdef').read().replace("\n", "").split(';;')
 +contents = open('python38.sdef').read().replace("\n", "").split(';;')
-
+ 
  func_structure = '''
      Ast* visitNode(%{RULE_FOR}* node) {
 @@ -45,7 +45,6 @@ simple_func_structure = '''
-
+ 
  switch_line = '''        case %{KIND}: {
  %{ACTIONS}
 -                result = v;
                  break;
              }'''
-
+ 
 @@ -139,6 +138,7 @@ for rule in contents:
          results[rule_for] = list()
-
+     
      current_actions = list()
 +    created_v = False
      for action in actions:
          command = action.split('|')[0]
          try:
-@@ -204,14 +204,17 @@ for rule in contents:
+@@ -204,7 +204,8 @@ for rule in contents:
          elif command == 'create':
              astType = arguments
              current_actions.append(create_ast_line.replace('%{AST_TYPE}', astType))
--
+-    
 +            created_v = True
 +
      if code:
          current_actions.append(code);
--
-+
-     current_actions = "\n".join(current_actions)
+     
+@@ -212,6 +213,8 @@ for rule in contents:
      if kind == 'any':
          current_stmt = current_actions
      else:
@@ -318,7 +317,7 @@ index 9d65cc0d9915bd6c0cfa4ea37fd3136a8c18e9d2..66055953ef4e3cc9896a13bd59cb641c
      if before_version:
          version_cpp_if = ("#if PYTHON_VERSION < QT_VERSION_CHECK(%d, %d, 0)\n"
 diff --git a/parser/generated.h b/parser/generated.h
-index 9061deb039bbe6418dd854c269ee242734117a4c..e1136f843d3780beffd4198e4fc43485f5ac8a95 100644
+index 9061deb..e1136f8 100644
 --- a/parser/generated.h
 +++ b/parser/generated.h
 @@ -76,12 +76,23 @@ private:
@@ -344,7 +343,7 @@ index 9061deb039bbe6418dd854c269ee242734117a4c..e1136f843d3780beffd4198e4fc43485
 +#endif
          return v;
      }
-
+ 
 @@ -280,18 +291,22 @@ private:
                  break;
              }
@@ -426,36 +425,209 @@ index 9061deb039bbe6418dd854c269ee242734117a4c..e1136f843d3780beffd4198e4fc43485
          default:
              qWarning() << "Unsupported _expr AST type: " << node->kind;
              Q_ASSERT(false);
-diff --git a/parser/python36.sdef b/parser/python38.sdef
-similarity index 82%
-rename from parser/python36.sdef
-rename to parser/python38.sdef
-index f53ff1c79a5117d20de37e58aad33955b15eb4aa..30d9f95aba4ce3154a70073a72cd713c972c53a3 100644
+diff --git a/parser/python36.sdef b/parser/python36.sdef
+deleted file mode 100644
+index f53ff1c..0000000
 --- a/parser/python36.sdef
-+++ b/parser/python38.sdef
-@@ -73,20 +73,62 @@ if (node->v.Call.kwargs) {
-     v->keywords.append(kwargs);
-     nodeStack.pop();
- };;
++++ /dev/null
+@@ -1,102 +0,0 @@
+-COMMENT;This file specifies rules for a conversion of a python (C) to a plugin-internal (C++) syntax tree;;
+-COMMENT;All lines are terminated by a double semicolon token, newlines are ignored.;;
+-COMMENT;-> stands for "convert AST", => for "convert AST list", ~> for "make an identifier", :> is an assignment w/o conversion, and *> is an enum cast.;;
+-COMMENT;$> is a string assignment, +> is a "mindless assignment, like, it just does v->arg = node->arg.
+-COMMENT;_> is a Singleton Assignment (converts Py_True, Py_False, Py_None to enum)
+-COMMENT;the CODE statement can be used to add custom code.;;
+-
+-
+-RULE_FOR _stmt;KIND Expr_kind;ACTIONS create|ExpressionAst set|value->ExpressionAst,value;;
+-RULE_FOR _stmt;KIND FunctionDef_kind;ACTIONS create|FunctionDefinitionAst set|name~>name set|arguments->ArgumentsAst,args
+-    set|body=>Ast,body set|decorators=>ExpressionAst,decorator_list set|returns->ExpressionAst,returns;;
+-RULE_FOR _stmt;KIND AsyncFunctionDef_kind;ACTIONS create|FunctionDefinitionAst set|name~>name set|arguments->ArgumentsAst,args
+-    set|body=>Ast,body set|decorators=>ExpressionAst,decorator_list set|returns->ExpressionAst,returns;SINCE 3.5;CODE v->async = true;;
+-RULE_FOR _stmt;KIND ClassDef_kind;ACTIONS create|ClassDefinitionAst set|name~>name set|baseClasses=>ExpressionAst,bases set|body=>Ast,body
+-    set|decorators=>ExpressionAst,decorator_list;;
+-RULE_FOR _stmt;KIND Return_kind;ACTIONS create|ReturnAst set|value->ExpressionAst,value;;
+-RULE_FOR _stmt;KIND Delete_kind;ACTIONS create|DeleteAst set|targets=>ExpressionAst,targets;;
+-RULE_FOR _stmt;KIND Assign_kind;ACTIONS create|AssignmentAst set|targets=>ExpressionAst,targets set|value->ExpressionAst,value;;
+-RULE_FOR _stmt;KIND AugAssign_kind;ACTIONS create|AugmentedAssignmentAst set|target->ExpressionAst,target set|op*>OperatorTypes,op set|value->ExpressionAst,value;;
+-RULE_FOR _stmt;KIND AnnAssign_kind;ACTIONS create|AnnotationAssignmentAst set|target->ExpressionAst,target set|annotation->ExpressionAst,annotation set|value->ExpressionAst,value;SINCE 3.6;;
+-RULE_FOR _stmt;KIND For_kind;ACTIONS create|ForAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|body=>Ast,body set|orelse=>Ast,orelse;;
+-RULE_FOR _stmt;KIND AsyncFor_kind;ACTIONS create|ForAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|body=>Ast,body set|orelse=>Ast,orelse;SINCE 3.5;;
+-RULE_FOR _stmt;KIND While_kind;ACTIONS create|WhileAst set|condition->ExpressionAst,test set|body=>Ast,body set|orelse=>Ast,orelse;;
+-RULE_FOR _stmt;KIND If_kind;ACTIONS create|IfAst set|condition->ExpressionAst,test set|body=>Ast,body set|orelse=>Ast,orelse;;
+-RULE_FOR _stmt;KIND With_kind;ACTIONS create|WithAst set|body=>Ast,body set|items=>WithItemAst,items;;
+-RULE_FOR _stmt;KIND AsyncWith_kind;ACTIONS create|WithAst set|body=>Ast,body set|items=>WithItemAst,items;SINCE 3.5;;
+-
+-COMMENT;FIXME: the struct Raise has changed, so the following line is likely wrong;;
+-RULE_FOR _stmt;KIND Raise_kind;ACTIONS create|RaiseAst set|type->ExpressionAst,exc;;
+-RULE_FOR _stmt;KIND Try_kind;ACTIONS create|TryAst set|body=>Ast,body set|handlers=>ExceptionHandlerAst,handlers set|orelse=>Ast,orelse set|finally=>Ast,finalbody;;
+-RULE_FOR _stmt;KIND Assert_kind;ACTIONS create|AssertionAst set|condition->ExpressionAst,test set|message->ExpressionAst,msg;;
+-RULE_FOR _stmt;KIND Import_kind;ACTIONS create|ImportAst set|names=>AliasAst,names;;
+-RULE_FOR _stmt;KIND ImportFrom_kind;ACTIONS create|ImportFromAst set|module~>module set|names=>AliasAst,names set|level:>level;;
+-RULE_FOR _stmt;KIND Global_kind;ACTIONS create|GlobalAst set|names=>Identifier,names;;
+-RULE_FOR _stmt;KIND Break_kind;ACTIONS create|BreakAst;;
+-RULE_FOR _stmt;KIND Continue_kind;ACTIONS create|ContinueAst;;
+-RULE_FOR _stmt;KIND Pass_kind;ACTIONS create|PassAst;;
+-RULE_FOR _stmt;KIND Nonlocal_kind;ACTIONS create|NonlocalAst;;
+-
+-RULE_FOR _expr;KIND Await_kind;ACTIONS create|AwaitAst set|value->ExpressionAst,value;SINCE 3.5;;
+-RULE_FOR _expr;KIND BoolOp_kind;ACTIONS create|BooleanOperationAst set|type*>BooleanOperationTypes,op set|values=>ExpressionAst,values;;
+-RULE_FOR _expr;KIND BinOp_kind;ACTIONS create|BinaryOperationAst set|type*>OperatorTypes,op set|lhs->ExpressionAst,left set|rhs->ExpressionAst,right;;
+-RULE_FOR _expr;KIND UnaryOp_kind;ACTIONS create|UnaryOperationAst set|type*>UnaryOperatorTypes,op set|operand->ExpressionAst,operand;;
+-RULE_FOR _expr;KIND Lambda_kind;ACTIONS create|LambdaAst set|arguments->ArgumentsAst,args set|body->ExpressionAst,body;;
+-RULE_FOR _expr;KIND IfExp_kind;ACTIONS create|IfExpressionAst set|condition->ExpressionAst,test set|body->ExpressionAst,body set|orelse->ExpressionAst,orelse;;
+-RULE_FOR _expr;KIND Dict_kind;ACTIONS create|DictAst set|keys=>ExpressionAst,keys set|values=>ExpressionAst,values;;
+-RULE_FOR _expr;KIND Set_kind;ACTIONS create|SetAst set|elements=>ExpressionAst,elts;;
+-RULE_FOR _expr;KIND ListComp_kind;ACTIONS create|ListComprehensionAst set|element->ExpressionAst,elt set|generators=>ComprehensionAst,generators;;
+-RULE_FOR _expr;KIND SetComp_kind;ACTIONS create|SetComprehensionAst set|element->ExpressionAst,elt set|generators=>ComprehensionAst,generators;;
+-RULE_FOR _expr;KIND DictComp_kind;ACTIONS create|DictionaryComprehensionAst set|key->ExpressionAst,key set|value->ExpressionAst,value set|generators=>ComprehensionAst,generators;;
+-RULE_FOR _expr;KIND GeneratorExp_kind;ACTIONS create|GeneratorExpressionAst set|element->ExpressionAst,elt set|generators=>ComprehensionAst,generators;;
+-RULE_FOR _expr;KIND Yield_kind;ACTIONS create|YieldAst set|value->ExpressionAst,value;;
+-RULE_FOR _expr;KIND Compare_kind;ACTIONS create|CompareAst set|leftmostElement->ExpressionAst,left set|operators#>ComparisonOperatorTypes,ops set|comparands=>ExpressionAst,comparators;;
+-RULE_FOR _expr;KIND Call_kind;ACTIONS create|CallAst set|function->ExpressionAst,func set|arguments=>ExpressionAst,args set|keywords=>KeywordAst,keywords;SINCE 3.5;;
+-RULE_FOR _expr;KIND Call_kind;ACTIONS create|CallAst set|function->ExpressionAst,func set|arguments=>ExpressionAst,args set|keywords=>KeywordAst,keywords;BEFORE 3.5;
+-CODE /* Convert 3.4 unpacked-args AST to match the new format from 3.5+ */
+-if (node->v.Call.starargs) {
+-    nodeStack.push(v);
+-    auto starred = new StarredAst(v);
+-    starred->context = ExpressionAst::Context::Load;
+-    nodeStack.push(starred);
+-    starred->value = static_cast<ExpressionAst*>(visitNode(node->v.Call.starargs));
+-    nodeStack.pop();
+-    v->arguments.append(starred);
+-    nodeStack.pop();
+-};
+-if (node->v.Call.kwargs) {
+-    nodeStack.push(v);
+-    auto kwargs = new KeywordAst(v);
+-    nodeStack.push(kwargs);
+-    kwargs->value = static_cast<ExpressionAst*>(visitNode(node->v.Call.kwargs));
+-    nodeStack.pop();
+-    v->keywords.append(kwargs);
+-    nodeStack.pop();
+-};;
 -RULE_FOR _expr;KIND Num_kind;ACTIONS create|NumberAst;CODE v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);;
 -RULE_FOR _expr;KIND Str_kind;ACTIONS create|StringAst set|value$>s;;
-+RULE_FOR _expr;KIND Num_kind;ACTIONS create|NumberAst;BEFORE 3.8;CODE v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);;
-+RULE_FOR _expr;KIND Str_kind;ACTIONS create|StringAst set|value$>s;BEFORE 3.8;;
- RULE_FOR _expr;KIND JoinedStr_kind;ACTIONS create|JoinedStringAst set|values=>ExpressionAst,values;SINCE 3.6;;
- RULE_FOR _expr;KIND FormattedValue_kind;ACTIONS create|FormattedValueAst set|value->ExpressionAst,value set|conversion:>conversion set|formatSpec->ExpressionAst,format_spec;SINCE 3.6;;
+-RULE_FOR _expr;KIND JoinedStr_kind;ACTIONS create|JoinedStringAst set|values=>ExpressionAst,values;SINCE 3.6;;
+-RULE_FOR _expr;KIND FormattedValue_kind;ACTIONS create|FormattedValueAst set|value->ExpressionAst,value set|conversion:>conversion set|formatSpec->ExpressionAst,format_spec;SINCE 3.6;;
 -RULE_FOR _expr;KIND Bytes_kind;ACTIONS create|BytesAst set|value$>s;;
-+RULE_FOR _expr;KIND Bytes_kind;ACTIONS create|BytesAst set|value$>s;BEFORE 3.8;;
- RULE_FOR _expr;KIND Attribute_kind;ACTIONS create|AttributeAst set|attribute~>attr set|value->ExpressionAst,value set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Subscript_kind;ACTIONS create|SubscriptAst set|value->ExpressionAst,value set|slice->SliceAst,slice set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Starred_kind;ACTIONS create|StarredAst set|value->ExpressionAst,value set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Name_kind;ACTIONS create|NameAst set|identifier~>id set|context*>Context,ctx;;
- RULE_FOR _expr;KIND List_kind;ACTIONS create|ListAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Tuple_kind;ACTIONS create|TupleAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
+-RULE_FOR _expr;KIND Attribute_kind;ACTIONS create|AttributeAst set|attribute~>attr set|value->ExpressionAst,value set|context*>Context,ctx;;
+-RULE_FOR _expr;KIND Subscript_kind;ACTIONS create|SubscriptAst set|value->ExpressionAst,value set|slice->SliceAst,slice set|context*>Context,ctx;;
+-RULE_FOR _expr;KIND Starred_kind;ACTIONS create|StarredAst set|value->ExpressionAst,value set|context*>Context,ctx;;
+-RULE_FOR _expr;KIND Name_kind;ACTIONS create|NameAst set|identifier~>id set|context*>Context,ctx;;
+-RULE_FOR _expr;KIND List_kind;ACTIONS create|ListAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
+-RULE_FOR _expr;KIND Tuple_kind;ACTIONS create|TupleAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
 -RULE_FOR _expr;KIND Ellipsis_kind;ACTIONS create|EllipsisAst;;
 -RULE_FOR _expr;KIND NameConstant_kind;ACTIONS create|NameConstantAst set|value_>value;;
+-RULE_FOR _expr;KIND YieldFrom_kind;ACTIONS create|YieldFromAst set|value->ExpressionAst,value;;
+-
+-RULE_FOR _slice;KIND Slice_kind;ACTIONS create|SliceAst set|lower->ExpressionAst,lower set|upper->ExpressionAst,upper set|step->ExpressionAst,step;;
+-RULE_FOR _slice;KIND ExtSlice_kind;ACTIONS create|ExtendedSliceAst set|dims=>SliceAst,dims;;
+-RULE_FOR _slice;KIND Index_kind;ACTIONS create|IndexAst set|value->ExpressionAst,value;;
+-
+-
+-RULE_FOR _comprehension;KIND any;ACTIONS create|ComprehensionAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|conditions=>ExpressionAst,ifs;;
+-RULE_FOR _excepthandler;KIND ExceptHandler_kind;ACTIONS create|ExceptionHandlerAst set|type->ExpressionAst,type set|name~>name set|body=>Ast,body;;
+-RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs;;
+-RULE_FOR _arg;KIND any;ACTIONS create|ArgAst set|argumentName~>arg set|annotation->ExpressionAst,annotation;;
+-RULE_FOR _keyword;KIND any;ACTIONS create|KeywordAst set|argumentName~>arg set|value->ExpressionAst,value;;
+-RULE_FOR _alias;KIND any;ACTIONS create|AliasAst set|name~>name set|asName~>asname;;
+-RULE_FOR _withitem;KIND any; ACTIONS create|WithItemAst set|contextExpression->ExpressionAst,context_expr set|optionalVars->ExpressionAst,optional_vars;;
+diff --git a/parser/python38.sdef b/parser/python38.sdef
+new file mode 100644
+index 0000000..30d9f95
+--- /dev/null
++++ b/parser/python38.sdef
+@@ -0,0 +1,145 @@
++COMMENT;This file specifies rules for a conversion of a python (C) to a plugin-internal (C++) syntax tree;;
++COMMENT;All lines are terminated by a double semicolon token, newlines are ignored.;;
++COMMENT;-> stands for "convert AST", => for "convert AST list", ~> for "make an identifier", :> is an assignment w/o conversion, and *> is an enum cast.;;
++COMMENT;$> is a string assignment, +> is a "mindless assignment, like, it just does v->arg = node->arg.
++COMMENT;_> is a Singleton Assignment (converts Py_True, Py_False, Py_None to enum)
++COMMENT;the CODE statement can be used to add custom code.;;
++
++
++RULE_FOR _stmt;KIND Expr_kind;ACTIONS create|ExpressionAst set|value->ExpressionAst,value;;
++RULE_FOR _stmt;KIND FunctionDef_kind;ACTIONS create|FunctionDefinitionAst set|name~>name set|arguments->ArgumentsAst,args
++    set|body=>Ast,body set|decorators=>ExpressionAst,decorator_list set|returns->ExpressionAst,returns;;
++RULE_FOR _stmt;KIND AsyncFunctionDef_kind;ACTIONS create|FunctionDefinitionAst set|name~>name set|arguments->ArgumentsAst,args
++    set|body=>Ast,body set|decorators=>ExpressionAst,decorator_list set|returns->ExpressionAst,returns;SINCE 3.5;CODE v->async = true;;
++RULE_FOR _stmt;KIND ClassDef_kind;ACTIONS create|ClassDefinitionAst set|name~>name set|baseClasses=>ExpressionAst,bases set|body=>Ast,body
++    set|decorators=>ExpressionAst,decorator_list;;
++RULE_FOR _stmt;KIND Return_kind;ACTIONS create|ReturnAst set|value->ExpressionAst,value;;
++RULE_FOR _stmt;KIND Delete_kind;ACTIONS create|DeleteAst set|targets=>ExpressionAst,targets;;
++RULE_FOR _stmt;KIND Assign_kind;ACTIONS create|AssignmentAst set|targets=>ExpressionAst,targets set|value->ExpressionAst,value;;
++RULE_FOR _stmt;KIND AugAssign_kind;ACTIONS create|AugmentedAssignmentAst set|target->ExpressionAst,target set|op*>OperatorTypes,op set|value->ExpressionAst,value;;
++RULE_FOR _stmt;KIND AnnAssign_kind;ACTIONS create|AnnotationAssignmentAst set|target->ExpressionAst,target set|annotation->ExpressionAst,annotation set|value->ExpressionAst,value;SINCE 3.6;;
++RULE_FOR _stmt;KIND For_kind;ACTIONS create|ForAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|body=>Ast,body set|orelse=>Ast,orelse;;
++RULE_FOR _stmt;KIND AsyncFor_kind;ACTIONS create|ForAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|body=>Ast,body set|orelse=>Ast,orelse;SINCE 3.5;;
++RULE_FOR _stmt;KIND While_kind;ACTIONS create|WhileAst set|condition->ExpressionAst,test set|body=>Ast,body set|orelse=>Ast,orelse;;
++RULE_FOR _stmt;KIND If_kind;ACTIONS create|IfAst set|condition->ExpressionAst,test set|body=>Ast,body set|orelse=>Ast,orelse;;
++RULE_FOR _stmt;KIND With_kind;ACTIONS create|WithAst set|body=>Ast,body set|items=>WithItemAst,items;;
++RULE_FOR _stmt;KIND AsyncWith_kind;ACTIONS create|WithAst set|body=>Ast,body set|items=>WithItemAst,items;SINCE 3.5;;
++
++COMMENT;FIXME: the struct Raise has changed, so the following line is likely wrong;;
++RULE_FOR _stmt;KIND Raise_kind;ACTIONS create|RaiseAst set|type->ExpressionAst,exc;;
++RULE_FOR _stmt;KIND Try_kind;ACTIONS create|TryAst set|body=>Ast,body set|handlers=>ExceptionHandlerAst,handlers set|orelse=>Ast,orelse set|finally=>Ast,finalbody;;
++RULE_FOR _stmt;KIND Assert_kind;ACTIONS create|AssertionAst set|condition->ExpressionAst,test set|message->ExpressionAst,msg;;
++RULE_FOR _stmt;KIND Import_kind;ACTIONS create|ImportAst set|names=>AliasAst,names;;
++RULE_FOR _stmt;KIND ImportFrom_kind;ACTIONS create|ImportFromAst set|module~>module set|names=>AliasAst,names set|level:>level;;
++RULE_FOR _stmt;KIND Global_kind;ACTIONS create|GlobalAst set|names=>Identifier,names;;
++RULE_FOR _stmt;KIND Break_kind;ACTIONS create|BreakAst;;
++RULE_FOR _stmt;KIND Continue_kind;ACTIONS create|ContinueAst;;
++RULE_FOR _stmt;KIND Pass_kind;ACTIONS create|PassAst;;
++RULE_FOR _stmt;KIND Nonlocal_kind;ACTIONS create|NonlocalAst;;
++
++RULE_FOR _expr;KIND Await_kind;ACTIONS create|AwaitAst set|value->ExpressionAst,value;SINCE 3.5;;
++RULE_FOR _expr;KIND BoolOp_kind;ACTIONS create|BooleanOperationAst set|type*>BooleanOperationTypes,op set|values=>ExpressionAst,values;;
++RULE_FOR _expr;KIND BinOp_kind;ACTIONS create|BinaryOperationAst set|type*>OperatorTypes,op set|lhs->ExpressionAst,left set|rhs->ExpressionAst,right;;
++RULE_FOR _expr;KIND UnaryOp_kind;ACTIONS create|UnaryOperationAst set|type*>UnaryOperatorTypes,op set|operand->ExpressionAst,operand;;
++RULE_FOR _expr;KIND Lambda_kind;ACTIONS create|LambdaAst set|arguments->ArgumentsAst,args set|body->ExpressionAst,body;;
++RULE_FOR _expr;KIND IfExp_kind;ACTIONS create|IfExpressionAst set|condition->ExpressionAst,test set|body->ExpressionAst,body set|orelse->ExpressionAst,orelse;;
++RULE_FOR _expr;KIND Dict_kind;ACTIONS create|DictAst set|keys=>ExpressionAst,keys set|values=>ExpressionAst,values;;
++RULE_FOR _expr;KIND Set_kind;ACTIONS create|SetAst set|elements=>ExpressionAst,elts;;
++RULE_FOR _expr;KIND ListComp_kind;ACTIONS create|ListComprehensionAst set|element->ExpressionAst,elt set|generators=>ComprehensionAst,generators;;
++RULE_FOR _expr;KIND SetComp_kind;ACTIONS create|SetComprehensionAst set|element->ExpressionAst,elt set|generators=>ComprehensionAst,generators;;
++RULE_FOR _expr;KIND DictComp_kind;ACTIONS create|DictionaryComprehensionAst set|key->ExpressionAst,key set|value->ExpressionAst,value set|generators=>ComprehensionAst,generators;;
++RULE_FOR _expr;KIND GeneratorExp_kind;ACTIONS create|GeneratorExpressionAst set|element->ExpressionAst,elt set|generators=>ComprehensionAst,generators;;
++RULE_FOR _expr;KIND Yield_kind;ACTIONS create|YieldAst set|value->ExpressionAst,value;;
++RULE_FOR _expr;KIND Compare_kind;ACTIONS create|CompareAst set|leftmostElement->ExpressionAst,left set|operators#>ComparisonOperatorTypes,ops set|comparands=>ExpressionAst,comparators;;
++RULE_FOR _expr;KIND Call_kind;ACTIONS create|CallAst set|function->ExpressionAst,func set|arguments=>ExpressionAst,args set|keywords=>KeywordAst,keywords;SINCE 3.5;;
++RULE_FOR _expr;KIND Call_kind;ACTIONS create|CallAst set|function->ExpressionAst,func set|arguments=>ExpressionAst,args set|keywords=>KeywordAst,keywords;BEFORE 3.5;
++CODE /* Convert 3.4 unpacked-args AST to match the new format from 3.5+ */
++if (node->v.Call.starargs) {
++    nodeStack.push(v);
++    auto starred = new StarredAst(v);
++    starred->context = ExpressionAst::Context::Load;
++    nodeStack.push(starred);
++    starred->value = static_cast<ExpressionAst*>(visitNode(node->v.Call.starargs));
++    nodeStack.pop();
++    v->arguments.append(starred);
++    nodeStack.pop();
++};
++if (node->v.Call.kwargs) {
++    nodeStack.push(v);
++    auto kwargs = new KeywordAst(v);
++    nodeStack.push(kwargs);
++    kwargs->value = static_cast<ExpressionAst*>(visitNode(node->v.Call.kwargs));
++    nodeStack.pop();
++    v->keywords.append(kwargs);
++    nodeStack.pop();
++};;
++RULE_FOR _expr;KIND Num_kind;ACTIONS create|NumberAst;BEFORE 3.8;CODE v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);;
++RULE_FOR _expr;KIND Str_kind;ACTIONS create|StringAst set|value$>s;BEFORE 3.8;;
++RULE_FOR _expr;KIND JoinedStr_kind;ACTIONS create|JoinedStringAst set|values=>ExpressionAst,values;SINCE 3.6;;
++RULE_FOR _expr;KIND FormattedValue_kind;ACTIONS create|FormattedValueAst set|value->ExpressionAst,value set|conversion:>conversion set|formatSpec->ExpressionAst,format_spec;SINCE 3.6;;
++RULE_FOR _expr;KIND Bytes_kind;ACTIONS create|BytesAst set|value$>s;BEFORE 3.8;;
++RULE_FOR _expr;KIND Attribute_kind;ACTIONS create|AttributeAst set|attribute~>attr set|value->ExpressionAst,value set|context*>Context,ctx;;
++RULE_FOR _expr;KIND Subscript_kind;ACTIONS create|SubscriptAst set|value->ExpressionAst,value set|slice->SliceAst,slice set|context*>Context,ctx;;
++RULE_FOR _expr;KIND Starred_kind;ACTIONS create|StarredAst set|value->ExpressionAst,value set|context*>Context,ctx;;
++RULE_FOR _expr;KIND Name_kind;ACTIONS create|NameAst set|identifier~>id set|context*>Context,ctx;;
++RULE_FOR _expr;KIND List_kind;ACTIONS create|ListAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
++RULE_FOR _expr;KIND Tuple_kind;ACTIONS create|TupleAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
 +RULE_FOR _expr;KIND Ellipsis_kind;ACTIONS create|EllipsisAst;BEFORE 3.8;;
 +RULE_FOR _expr;KIND NameConstant_kind;ACTIONS create|NameConstantAst set|value_>value;BEFORE 3.8;;
- RULE_FOR _expr;KIND YieldFrom_kind;ACTIONS create|YieldFromAst set|value->ExpressionAst,value;;
++RULE_FOR _expr;KIND YieldFrom_kind;ACTIONS create|YieldFromAst set|value->ExpressionAst,value;;
 +RULE_FOR _expr;KIND Constant_kind;ACTIONS;SINCE 3.8;CODE
 +PyObject *value = node->v.Constant.value;
 +if (value == Py_None) {
@@ -498,21 +670,22 @@ index f53ff1c79a5117d20de37e58aad33955b15eb4aa..30d9f95aba4ce3154a70073a72cd713c
 +    Q_ASSERT(false);
 +};;
 +RULE_FOR _expr;KIND NamedExpr_kind;ACTIONS create|AssignmentExpressionAst set|target->ExpressionAst,target set|value->ExpressionAst,value;SINCE 3.8;;
-
- RULE_FOR _slice;KIND Slice_kind;ACTIONS create|SliceAst set|lower->ExpressionAst,lower set|upper->ExpressionAst,upper set|step->ExpressionAst,step;;
- RULE_FOR _slice;KIND ExtSlice_kind;ACTIONS create|ExtendedSliceAst set|dims=>SliceAst,dims;;
-@@ -95,7 +137,8 @@ RULE_FOR _slice;KIND Index_kind;ACTIONS create|IndexAst set|value->ExpressionAst
-
- RULE_FOR _comprehension;KIND any;ACTIONS create|ComprehensionAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|conditions=>ExpressionAst,ifs;;
- RULE_FOR _excepthandler;KIND ExceptHandler_kind;ACTIONS create|ExceptionHandlerAst set|type->ExpressionAst,type set|name~>name set|body=>Ast,body;;
--RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs;;
++
++RULE_FOR _slice;KIND Slice_kind;ACTIONS create|SliceAst set|lower->ExpressionAst,lower set|upper->ExpressionAst,upper set|step->ExpressionAst,step;;
++RULE_FOR _slice;KIND ExtSlice_kind;ACTIONS create|ExtendedSliceAst set|dims=>SliceAst,dims;;
++RULE_FOR _slice;KIND Index_kind;ACTIONS create|IndexAst set|value->ExpressionAst,value;;
++
++
++RULE_FOR _comprehension;KIND any;ACTIONS create|ComprehensionAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|conditions=>ExpressionAst,ifs;;
++RULE_FOR _excepthandler;KIND ExceptHandler_kind;ACTIONS create|ExceptionHandlerAst set|type->ExpressionAst,type set|name~>name set|body=>Ast,body;;
 +RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs;BEFORE 3.8;;
 +RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs set|posonlyargs=>ArgAst,posonlyargs;SINCE 3.8;;
- RULE_FOR _arg;KIND any;ACTIONS create|ArgAst set|argumentName~>arg set|annotation->ExpressionAst,annotation;;
- RULE_FOR _keyword;KIND any;ACTIONS create|KeywordAst set|argumentName~>arg set|value->ExpressionAst,value;;
- RULE_FOR _alias;KIND any;ACTIONS create|AliasAst set|name~>name set|asName~>asname;;
++RULE_FOR _arg;KIND any;ACTIONS create|ArgAst set|argumentName~>arg set|annotation->ExpressionAst,annotation;;
++RULE_FOR _keyword;KIND any;ACTIONS create|KeywordAst set|argumentName~>arg set|value->ExpressionAst,value;;
++RULE_FOR _alias;KIND any;ACTIONS create|AliasAst set|name~>name set|asName~>asname;;
++RULE_FOR _withitem;KIND any; ACTIONS create|WithItemAst set|contextExpression->ExpressionAst,context_expr set|optionalVars->ExpressionAst,optional_vars;;
 diff --git a/parser/tests/pyasttest.cpp b/parser/tests/pyasttest.cpp
-index 4fd5f4ebd5be2d425d6a321ad0511f7f3d0ddb42..c28f6fce0809f4358a72488e75dc2a7f8e0500c4 100644
+index 4fd5f4e..c28f6fc 100644
 --- a/parser/tests/pyasttest.cpp
 +++ b/parser/tests/pyasttest.cpp
 @@ -238,6 +238,11 @@ void PyAstTest::testExpressions_data()
@@ -525,5 +698,5 @@ index 4fd5f4ebd5be2d425d6a321ad0511f7f3d0ddb42..c28f6fce0809f4358a72488e75dc2a7f
 +    QTest::newRow("positional_params") << "def foo(a, b, /, c, d, *, e): pass";
 +#endif
  }
-
+ 
  void PyAstTest::testCorrectedFuncRanges()

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-07-04  1:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-04  1:00 [rpms/kdevelop-python] f44: Rebase python-3.8 patch Jan Grulich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox