# Test column numbers in messages. --show-column-numbers is enabled implicitly by test runner.

[case testColumnsSyntaxError]
f()
1 +
[out]
main:2:5: error: invalid syntax

[case testColumnsNestedFunctions]
import typing
def f() -> 'A':
    def g() -> 'B':
        return A() # E:16: Incompatible return value type (got "A", expected "B")
    return B() # E:12: Incompatible return value type (got "B", expected "A")
class A: pass
class B: pass

[case testColumnsMethodDefaultArgumentsAndSignatureAsComment]
import typing
class A:
    def f(self, x = 1, y = 'hello'): # type: (int, str) -> str
        pass
A().f()
A().f(1)
A().f('') # E:7: Argument 1 to "f" of "A" has incompatible type "str"; expected "int"
A().f(1, 1) # E:10: Argument 2 to "f" of "A" has incompatible type "int"; expected "str"
(A().f(1, 'hello', 'hi')) # E:2: Too many arguments for "f" of "A"

[case testColumnsInvalidArgumentType]
# flags: --strict-optional
def f(x: int, y: str) -> None: ...
def g(*x: int) -> None: pass
def h(**x: int) -> None: pass
def ff(x: int) -> None: pass

class A:
    x: str
    def __neg__(self) -> str: pass
    def __add__(self, other: int) -> str: pass
    def __lt__(self, other: int) -> str: pass

f(
 y=0, x=0) # E:4: Argument "y" to "f" has incompatible type "int"; expected "str"
f(x=0,
   y=None) # E:6: Argument "y" to "f" has incompatible type "None"; expected "str"
g(1, '', 2) # E:6: Argument 2 to "g" has incompatible type "str"; expected "int"
aaa: str
h(x=1, y=aaa, z=2) # E:10: Argument "y" to "h" has incompatible type "str"; expected "int"
a: A
ff(a.x) # E:4: Argument 1 to "ff" has incompatible type "str"; expected "int"
ff([1]) # E:4: Argument 1 to "ff" has incompatible type "List[int]"; expected "int"
# TODO: Different column in Python 3.8+
#ff([1 for x in [1]]) # Argument 1 to "ff" has incompatible type "List[int]"; expected "int"
ff({1: 2}) # E:4: Argument 1 to "ff" has incompatible type "Dict[int, int]"; expected "int"
ff(1.1) # E:4: Argument 1 to "ff" has incompatible type "float"; expected "int"
# TODO: Different column in Python 3.8+
#ff( ( 1, 1)) # Argument 1 to "ff" has incompatible type "Tuple[int, int]"; expected "int"
ff(-a) # E:4: Argument 1 to "ff" has incompatible type "str"; expected "int"
ff(a + 1) # E:4: Argument 1 to "ff" has incompatible type "str"; expected "int"
ff(a < 1) # E:4: Argument 1 to "ff" has incompatible type "str"; expected "int"
ff([''][0]) # E:4: Argument 1 to "ff" has incompatible type "str"; expected "int"

class B(A):
    def f(self) -> None:
        ff(super().__neg__()) # E:12: Argument 1 to "ff" has incompatible type "str"; expected "int"
[builtins fixtures/dict.pyi]

[case testColumnsInvalidArgumentTypeVarArgs]
def f(*x: int) -> None: pass
def g(**x: int) -> None: pass

a = ['']
f(*a)  # E:4: Argument 1 to "f" has incompatible type "*List[str]"; expected "int"
b = {'x': 'y'}
g(**b) # E:5: Argument 1 to "g" has incompatible type "**Dict[str, str]"; expected "int"
[builtins fixtures/dict.pyi]

[case testColumnsMultipleStatementsPerLine]
x = 15
y = 'hello'
if int():
    x = 2; y = x; y += 1
[builtins fixtures/primitives.pyi]
[out]
main:4:16: error: Incompatible types in assignment (expression has type "int", variable has type "str")
main:4:24: error: Unsupported operand types for + ("str" and "int")

[case testColumnsAssignment]
class A:
    x = 0

A().x = ''  # E:9: Incompatible types in assignment (expression has type "str", variable has type "int")
a = [0]
a[0] = ''  # E:8: Incompatible types in assignment (expression has type "str", target has type "int")
b = 0
c = 0
b, c = 0, ''  # E:11: Incompatible types in assignment (expression has type "str", variable has type "int")
b, c = '', 0  # E:8: Incompatible types in assignment (expression has type "str", variable has type "int")

t = 0, ''
b, c = t  # E:8: Incompatible types in assignment (expression has type "str", variable has type "int")

class B(A):
    x = ''  # E:9: Incompatible types in assignment (expression has type "str", base class "A" defined the type as "int")
[builtins fixtures/list.pyi]

[case testColumnsAttributeIncompatibleWithBaseClassUsingAnnotation]
class A:
    x: str

class B(A):
    x: int  # E:5: Incompatible types in assignment (expression has type "int", base class "A" defined the type as "str")

[case testColumnsSimpleIsinstance]
import typing
def f(x: object, n: int, s: str) -> None:
    if int():
        n = x # E:13: Incompatible types in assignment (expression has type "object", variable has type "int")
        if isinstance(x, int):
            n = x
            s = x # E:17: Incompatible types in assignment (expression has type "int", variable has type "str")
        n = x # E:13: Incompatible types in assignment (expression has type "object", variable has type "int")
[builtins fixtures/isinstance.pyi]

[case testColumnHasNoAttribute]
import m
if int():
    from m import foobaz # E:5: Module 'm' has no attribute 'foobaz'; maybe "foobar"?
1 .x # E:1: "int" has no attribute "x"
(m.foobaz()) # E:2: Module has no attribute "foobaz"; maybe "foobar"?

[file m.py]
def foobar(): pass

[builtins fixtures/module.pyi]

[case testColumnUnexpectedOrMissingKeywordArg]
def f(): pass
# TODO: Point to "x" instead
(f(x=1)) # E:2: Unexpected keyword argument "x" for "f"
def g(*, x: int) -> None: pass
(g())  # E:2: Missing named argument "x" for "g"

[case testColumnDefinedHere]
class A: pass
if int():
    def f(a: 'A') -> None: pass # N:5: "f" defined here
    (f(b=object())) # E:6: Unexpected keyword argument "b" for "f"

[case testColumnInvalidType]

from typing import Iterable

bad = 0

def f(x: bad): # E:10: Variable "__main__.bad" is not valid as a type \
               # N:10: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
    y: bad # E:8: Variable "__main__.bad" is not valid as a type \
           # N:8: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases

if int():
    def g(x): # E:5: Variable "__main__.bad" is not valid as a type \
              # N:5: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
        # type: (bad) -> None
        y = 0  # type: bad  # E:9: Variable "__main__.bad" is not valid as a type \
                            # N:9: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases

z: Iterable[bad] # E:13: Variable "__main__.bad" is not valid as a type \
                 # N:13: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
h: bad[int] # E:4: Variable "__main__.bad" is not valid as a type \
            # N:4: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases

[case testColumnInvalidType_python2]

from typing import Iterable

bad = 0

if int():
    def g(x): # E:5: Variable "__main__.bad" is not valid as a type \
              # N:5: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
        # type: (bad) -> None
        y = 0  # type: bad  # E:9: Variable "__main__.bad" is not valid as a type \
                            # N:9: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases

    z = ()  # type: Iterable[bad] # E:5: Variable "__main__.bad" is not valid as a type \
                                  # N:5: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases

[case testColumnFunctionMissingTypeAnnotation]
# flags: --disallow-untyped-defs
if int():
    def f(x: int): # E:5: Function is missing a return type annotation
        pass

    def g(x): # E:5: Function is missing a type annotation
        pass

[case testColumnNameIsNotDefined]
((x)) # E:3: Name 'x' is not defined

[case testColumnNeedTypeAnnotation]
if 1:
    x = [] # E:5: Need type annotation for "x" (hint: "x: List[<type>] = ...")
[builtins fixtures/list.pyi]

[case testColumnCallToUntypedFunction]
# flags: --disallow-untyped-calls
def f() -> None:
    (g(1))  # E:6: Call to untyped function "g" in typed context

def g(x):
    pass

[case testColumnInvalidArguments]
def f(x, y): pass
(f()) # E:2: Missing positional arguments "x", "y" in call to "f"
(f(y=1)) # E:2: Missing positional argument "x" in call to "f"

[case testColumnTooFewSuperArgs_python2]
class A:
    def f(self):
        pass
class B(A):
    def f(self):   # type: () -> None
        super().f()  # E:9: Too few arguments for "super"

[case testColumnListOrDictItemHasIncompatibleType]
from typing import List, Dict
x: List[int] = [
    'x',  # E:5: List item 0 has incompatible type "str"; expected "int"
      1.1]  # E:7: List item 1 has incompatible type "float"; expected "int"
y: Dict[int, int] = {
    'x': 1  # E:5: Dict entry 0 has incompatible type "str": "int"; expected "int": "int"
}
[builtins fixtures/dict.pyi]

[case testColumnCannotDetermineType]
(x)  # E:2: Cannot determine type of 'x'
x = None

[case testColumnInvalidIndexing]
from typing import List
([1]['']) # E:6: Invalid index type "str" for "List[int]"; expected type "int"
(1[1]) # E:2: Value of type "int" is not indexable
def f() -> None:
    1[1] = 1 # E:5: Unsupported target for indexed assignment ("int")
[builtins fixtures/list.pyi]

[case testColumnTypedDict]
from typing import TypedDict
class D(TypedDict):
    x: int
t: D = {'x':
    'y'} # E:5: Incompatible types (expression has type "str", TypedDict item "x" has type "int")

if int():
    del t['y'] # E:5: TypedDict "D" has no key "y"
[builtins fixtures/dict.pyi]
[typing fixtures/typing-typeddict.pyi]

[case testColumnSignatureIncompatibleWithSuperType]
class A:
    def f(self, x: int) -> None: pass
class B(A):
    def f(self, x: str) -> None: pass # E:5: Argument 1 of "f" is incompatible with supertype "A"; supertype defines the argument type as "int" \
                                      # N:5: This violates the Liskov substitution principle \
                                      # N:5: See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
class C(A):
    def f(self, x: int) -> int: pass # E:5: Return type "int" of "f" incompatible with return type "None" in supertype "A"
class D(A):
    def f(self) -> None: pass # E:5: Signature of "f" incompatible with supertype "A"

[case testColumnMissingTypeParameters]
# flags: --disallow-any-generics
from typing import List, Callable
def f(x: List) -> None: pass # E:10: Missing type parameters for generic type "List"
def g(x: list) -> None: pass # E:10: Implicit generic "Any". Use "typing.List" and specify generic parameters
if int():
    c: Callable # E:8: Missing type parameters for generic type "Callable"
[builtins fixtures/list.pyi]

[case testColumnIncompatibleDefault]
if int():
    def f(x: int = '') -> None: # E:20: Incompatible default for argument "x" (default has type "str", argument has type "int")
        pass

[case testColumnMissingProtocolMember]
from typing import Protocol

class P(Protocol):
    x: int
    y: int

class C:
    x: int

p: P
if int():
    p = C() # E:9: Incompatible types in assignment (expression has type "C", variable has type "P") \
      # N:9: "C" is missing following "P" protocol member: \
      # N:9:     y

[case testColumnRedundantCast]
# flags: --warn-redundant-casts
from typing import cast
y = 1
x = cast(int, y) # E:5: Redundant cast to "int"

[case testColumnTypeSignatureHasTooFewArguments]
if int():
    def f(x, y): # E:5: Type signature has too few arguments
        # type: (int) -> None
        pass

[case testColumnTypeSignatureHasTooFewArguments_python2]
if int():
    def f(x, y): # E:5: Type signature has too few arguments
        # type: (int) -> None
        pass

[case testColumnRevealedType]
if int():
    reveal_type(1) # N:17: Revealed type is 'Literal[1]?'

[case testColumnNonOverlappingEqualityCheck]
# flags: --strict-equality
if 1 == '': # E:4: Non-overlapping equality check (left operand type: "Literal[1]", right operand type: "Literal['']")
    pass
[builtins fixtures/bool.pyi]

[case testColumnValueOfTypeVariableCannotBe]

from typing import TypeVar, Generic

T = TypeVar('T', int, str)

class C(Generic[T]):
    pass

def f(c: C[object]) -> None: pass # E:10: Value of type variable "T" of "C" cannot be "object"
(C[object]()) # E:2: Value of type variable "T" of "C" cannot be "object"

[case testColumnSyntaxErrorInTypeAnnotation]
if int():
    def f(x # type: int,
          ):
        pass
[out]
main:2:11: error: Syntax error in type annotation
main:2:11: note: Suggestion: Is there a spurious trailing comma?

[case testColumnSyntaxErrorInTypeAnnotation2]
if int():
    # TODO: It would be better to point to the type comment
    xyz = 0  # type: blurbnard blarb
[out]
main:3:5: error: syntax error in type comment 'blurbnard blarb'

[case testColumnProperty]
class A:
    @property
    def x(self) -> int: pass

    @x.setter
    def x(self, x: int) -> None: pass

class B(A):
    @property  # E:6: Read-only property cannot override read-write property
    def x(self) -> int: pass
[builtins fixtures/property.pyi]

[case testColumnProperty_python2]
class A:
    @property
    def x(self): # type: () -> int
        pass

    @x.setter
    def x(self, x): # type: (int) -> None
        pass

class B(A):
    @property  # E:5: Read-only property cannot override read-write property
    def x(self): # type: () -> int
        pass
[builtins_py2 fixtures/property_py2.pyi]

[case testColumnOverloaded]
from typing import overload, Any
class A:
    @overload # E:6: An overloaded function outside a stub file must have an implementation
    def f(self, x: int) -> int: pass
    @overload
    def f(self, x: str) -> str: pass

[case testColumnFunctionWithTypeVarValues]
from typing import TypeVar, List

T = TypeVar('T', int, str)

def g(x): pass

def f(x: T) -> T:
    (x.bad) # E:6: "int" has no attribute "bad" \
            # E:6: "str" has no attribute "bad"
    g(y=x) # E:5: Unexpected keyword argument "y" for "g"
    y: List[int, str] # E:8: "list" expects 1 type argument, but 2 given
    del 1[0] # E:5: "int" has no attribute "__delitem__"
    bb: List[int] = [''] # E:22: List item 0 has incompatible type "str"; expected "int"
    # XXX: Disabled because the column differs in 3.8
    # aa: List[int] = ['' for x in [1]] # :22: List comprehension has incompatible type List[str]; expected List[int]
    cc = 1 .bad # E:10: "int" has no attribute "bad"
    n: int = '' # E:14: Incompatible types in assignment (expression has type "str", variable has type "int")
    return x
[builtins fixtures/list.pyi]

[case testColumnReturnValueExpected]
def f() -> int:
    return  # E:5: Return value expected
