blob: 534967b1edbf1fbe20c9616ad089a09e9f6a6a9a [file] [log] [blame] [edit]
[case testFastParseSyntaxError]
1 + # E: invalid syntax
[case testFastParseTypeCommentSyntaxError]
x = None # type: a : b # E: Syntax error in type comment "a : b"
[case testFastParseInvalidTypeComment]
x = None # type: a + b # E: Invalid type comment or annotation
-- Function type comments are attributed to the function def line.
-- This happens in both parsers.
[case testFastParseFunctionAnnotationSyntaxError]
def f(): # E: Syntax error in type comment "None -> None" # N: Suggestion: wrap argument types in parentheses
# type: None -> None
pass
[case testFastParseFunctionAnnotationSyntaxErrorSpaces]
def f(): # E: Syntax error in type comment "None -> None" # N: Suggestion: wrap argument types in parentheses
# type: None -> None
pass
[case testFastParseInvalidFunctionAnnotation]
def f(x): # E: Invalid type comment or annotation
# type: (a + b) -> None
pass
[case testFastParseInvalidTypes3]
# All of these should not crash
from typing import Callable, Tuple, Iterable
x: Tuple[int, str].x # E: Invalid type comment or annotation
a: Iterable[x].x # E: Invalid type comment or annotation
b: Tuple[x][x] # E: Invalid type comment or annotation
c: Iterable[x][x] # E: Invalid type comment or annotation
d: Callable[..., int][x] # E: Invalid type comment or annotation
e: Callable[..., int].x # E: Invalid type comment or annotation
f = None # type: Tuple[int, str].x # E: Invalid type comment or annotation
g = None # type: Iterable[x].x # E: Invalid type comment or annotation
h = None # type: Tuple[x][x] # E: Invalid type comment or annotation
i = None # type: Iterable[x][x] # E: Invalid type comment or annotation
j = None # type: Callable[..., int][x] # E: Invalid type comment or annotation
k = None # type: Callable[..., int].x # E: Invalid type comment or annotation
def f1(x: Tuple[int, str].x) -> None: pass # E: Invalid type comment or annotation
def f2(x: Iterable[x].x) -> None: pass # E: Invalid type comment or annotation
def f3(x: Tuple[x][x]) -> None: pass # E: Invalid type comment or annotation
def f4(x: Iterable[x][x]) -> None: pass # E: Invalid type comment or annotation
def f5(x: Callable[..., int][x]) -> None: pass # E: Invalid type comment or annotation
def f6(x: Callable[..., int].x) -> None: pass # E: Invalid type comment or annotation
[case testFastParseTypeWithIgnore]
def f(x, # type: x # type: ignore
):
# type: (...) -> None
pass
[case testFastParseVariableTypeWithIgnore]
x = 1 # type: str # type: ignore
[case testFastParseVariableTypeWithIgnoreNoSpace]
x = 1 # type: str #type:ignore
[case testFastParseVariableTypeWithIgnoreAndComment]
x = 1 # type: str # type: ignore # comment
[case testFastParseTypeWithIgnoreWithStmt]
with open('test', 'r') as f: # type: int # type: ignore
pass
[case testFastParseTypeWithIgnoreForStmt]
for i in (1, 2, 3, 100): # type: str # type: ignore
pass
[builtins fixtures/tuple.pyi]
[case testFastParseVariableCommentThenIgnore]
a="test" # type: int #comment # type: ignore # E: Incompatible types in assignment (expression has type "str", variable has type "int")
[case testFastParseProperty]
class C:
@property
def x(self) -> str: pass
@x.setter
def x(self, value: str) -> None: pass
[builtins fixtures/property.pyi]
[case testFastParseConditionalProperty]
class C:
if bool():
@property
def x(self) -> str: pass
@x.setter
def x(self, value: str) -> None: pass
[builtins fixtures/property.pyi]
[case testFastParsePerArgumentAnnotations]
# flags: --implicit-optional
class A: pass
class B: pass
class C: pass
class D: pass
class E: pass
class F: pass
def f(a, # type: A
b = None, # type: B
*args, # type: C
d = None, # type: D
e, # type: E
**kwargs # type: F
):
reveal_type(a) # N: Revealed type is "__main__.A"
reveal_type(b) # N: Revealed type is "Union[__main__.B, None]"
reveal_type(args) # N: Revealed type is "builtins.tuple[__main__.C, ...]"
reveal_type(d) # N: Revealed type is "Union[__main__.D, None]"
reveal_type(e) # N: Revealed type is "__main__.E"
reveal_type(kwargs) # N: Revealed type is "builtins.dict[builtins.str, __main__.F]"
[builtins fixtures/dict.pyi]
[out]
[case testFastParsePerArgumentAnnotationsWithReturn]
# flags: --implicit-optional
class A: pass
class B: pass
class C: pass
class D: pass
class E: pass
class F: pass
def f(a, # type: A
b = None, # type: B
*args, # type: C
d = None, # type: D
e, # type: E
**kwargs # type: F
):
# type: (...) -> int
reveal_type(a) # N: Revealed type is "__main__.A"
reveal_type(b) # N: Revealed type is "Union[__main__.B, None]"
reveal_type(args) # N: Revealed type is "builtins.tuple[__main__.C, ...]"
reveal_type(d) # N: Revealed type is "Union[__main__.D, None]"
reveal_type(e) # N: Revealed type is "__main__.E"
reveal_type(kwargs) # N: Revealed type is "builtins.dict[builtins.str, __main__.F]"
return "not an int" # E: Incompatible return value type (got "str", expected "int")
[builtins fixtures/dict.pyi]
[out]
[case testFastParsePerArgumentAnnotationsWithAnnotatedBareStar]
def f(*, # type: int # E: bare * has associated type comment
x # type: str
):
# type: (...) -> int
pass
[builtins fixtures/dict.pyi]
[out]
[case testFastParsePerArgumentAnnotationsWithReturnAndBareStar]
def f(*,
x # type: str
):
# type: (...) -> int
reveal_type(x) # N: Revealed type is "builtins.str"
return "not an int" # E: Incompatible return value type (got "str", expected "int")
[builtins fixtures/dict.pyi]
[out]
[case testFasterParseTooManyArgumentsAnnotation]
def f(): # E: Type signature has too many arguments
# type: (int) -> None
pass
f()
f(1) # E: Too many arguments for "f"
[case testFasterParseTooFewArgumentsAnnotation]
def f(x, y): # E: Type signature has too few arguments
# type: (int) -> None
x()
y()
f(1, 2)
f(1) # E: Missing positional argument "y" in call to "f"
[case testFasterParseTypeErrorCustom]
from typing import TypeVar, Generic
T = TypeVar('T')
class Foo(Generic[T]):
pass
def f(a: Foo(int)) -> int:
pass
[out]
main:7: error: Invalid type comment or annotation
main:7: note: Suggestion: use Foo[...] instead of Foo(...)
[case testFastParseMatMul]
from typing import Any
x = None # type: Any
x @ 1
x @= 1
[case testFastParserShowsMultipleErrors]
def f(x): # E: Type signature has too few arguments
# type: () -> None
pass
def g(): # E: Type signature has too many arguments
# type: (int) -> None
pass
[case testFastParseMalformedAssert]
assert 1, 2
assert (1, 2) # E: Assertion is always true, perhaps remove parentheses?
assert (1, 2), 3 # E: Assertion is always true, perhaps remove parentheses?
assert (1,) # E: Assertion is always true, perhaps remove parentheses?
assert ()
[builtins fixtures/tuple.pyi]
[case testFastParseAssertMessage]
assert 1
assert 1, 2
assert 1, 1+2
assert 1, 1+'test' # E: Unsupported operand types for + ("int" and "str")
assert 1, f() # E: Name "f" is not defined
[case testFastParserConsistentFunctionTypes]
def f(x, y, z):
# type: (int, int, int) -> int
pass
def f(x, # type: int # E: Function has duplicate type signatures
y, # type: int
z # type: int
):
# type: (int, int, int) -> int
pass
def f(x, # type: int
y, # type: int
z # type: int
):
# type: (...) -> int
pass
def f(x, y, z):
# type: (int, int, int) -> int
pass
def f(x) -> int: # E: Function has duplicate type signatures
# type: (int) -> int
pass
def f(x: int, y: int, z: int):
# type: (...) -> int
pass
def f(x: int): # E: Function has duplicate type signatures
# type: (int) -> int
pass
[case testFastParserDuplicateNames]
def f(x, y, z):
pass
def g(x, y, x): # E: Duplicate argument "x" in function definition
pass
def h(x, y, *x): # E: Duplicate argument "x" in function definition
pass
def i(x, y, *z, **z): # E: Duplicate argument "z" in function definition
pass
def j(x: int, y: int, *, x: int = 3): # E: Duplicate argument "x" in function definition
pass
def k(*, y, z, y): # E: Duplicate argument "y" in function definition
pass
lambda x, y, x: ... # E: Duplicate argument "x" in function definition
[case testNoCrashOnImportFromStar]
from pack import *
[file pack/__init__.py]
from . import *
[case testNoCrashOnImportFromStarNested]
import blamodule
[file blamodule/__init__.py]
from . import command
from . import backends
[file blamodule/backends/__init__.py]
from .Bla import Bla
Bla().method()
[file blamodule/backends/Bla.py]
from .. import *
class Bla:
def method(self) -> str:
return command.call()
[file blamodule/command.py]
def call() -> str: pass
[builtins fixtures/module.pyi]