From 14434b6e025309d769fa160826ace32a46d860f2 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 3 Oct 2024 18:31:36 +0800 Subject: [PATCH] support pep695 --- pyrightconfig.json | 3 ++- src/compiler/compiler.c | 21 +++++++++++++++++++++ tests/30_import.py | 9 +++++++++ tests/96_pep695_py312.py | 17 +++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tests/96_pep695_py312.py diff --git a/pyrightconfig.json b/pyrightconfig.json index d6deb199..d08b4f98 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -2,5 +2,6 @@ "stubPath": "include/typings", "reportMissingModuleSource": "none", "reportArgumentType": "none", - "pythonVersion": "3.10" + "reportWildcardImportFromLibrary": "none", + "pythonVersion": "3.12" } diff --git a/src/compiler/compiler.c b/src/compiler/compiler.c index 6b6acc1b..57473ed7 100644 --- a/src/compiler/compiler.c +++ b/src/compiler/compiler.c @@ -2224,12 +2224,26 @@ static Error* _compile_f_args(Compiler* self, FuncDecl* decl, bool enable_type_h return NULL; } +static Error* consume_pep695_py312(Compiler* self) { + // https://peps.python.org/pep-0695/ + Error* err; + if(match(TK_LBRACKET)) { + consume(TK_ID); + if(match(TK_COLON)){ + check(consume_type_hints(self)); + } + consume(TK_RBRACKET); + } + return NULL; +} + static Error* compile_function(Compiler* self, int decorators) { Error* err; consume(TK_ID); c11_sv decl_name_sv = Token__sv(prev()); int decl_index; FuncDecl_ decl = push_f_context(self, decl_name_sv, &decl_index); + consume_pep695_py312(self); consume(TK_LPAREN); if(!match(TK_RPAREN)) { check(_compile_f_args(self, decl, true)); @@ -2281,6 +2295,7 @@ static Error* compile_class(Compiler* self, int decorators) { consume(TK_ID); py_Name name = py_namev(Token__sv(prev())); bool has_base = false; + consume_pep695_py312(self); if(match(TK_LPAREN)) { if(is_expression(self, false)) { check(EXPR(self)); @@ -2405,7 +2420,9 @@ __EAT_DOTS_END: return NULL; } + bool has_bracket = match(TK_LPAREN); do { + if(has_bracket) match_newlines(); Ctx__emit_(ctx(), OP_DUP_TOP, BC_NOARG, BC_KEEPLINE); consume(TK_ID); c11_sv name = Token__sv(prev()); @@ -2416,6 +2433,10 @@ __EAT_DOTS_END: } Ctx__emit_store_name(ctx(), name_scope(self), py_namev(name), prev()->line); } while(match(TK_COMMA)); + if(has_bracket) { + match_newlines(); + consume(TK_RPAREN); + } Ctx__emit_(ctx(), OP_POP_TOP, BC_NOARG, BC_KEEPLINE); consume_end_stmt(); return NULL; diff --git a/tests/30_import.py b/tests/30_import.py index 58690cf2..ce880027 100644 --- a/tests/30_import.py +++ b/tests/30_import.py @@ -34,3 +34,12 @@ f() from math import * assert pi > 3 + +from math import (pi, pow, sin, cos) + +from math import ( + pi, + pow, + sin, + cos +) \ No newline at end of file diff --git a/tests/96_pep695_py312.py b/tests/96_pep695_py312.py new file mode 100644 index 00000000..cf605dd2 --- /dev/null +++ b/tests/96_pep695_py312.py @@ -0,0 +1,17 @@ + +class Test[T]: + def __init__(self, value: T): + self.value = value + + def get_value(self) -> T: + return self.value + + +def add[T: int|str|float](a: T, b: T) -> T: + return a + b # type: ignore + +res = add(1, 2) +assert res == 3 + +test = Test(1) +assert test.get_value() == 1 \ No newline at end of file