11f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom clang.cindex import Cursor
21f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom clang.cindex import File
31f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom clang.cindex import SourceLocation
41f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom clang.cindex import SourceRange
51f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_cursor
61f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_tu
76b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
86b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios KyrtzidisbaseInput="int one;\nint two;\n"
96b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
106b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidisdef assert_location(loc, line, column, offset):
116b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis    assert loc.line == line
126b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis    assert loc.column == column
136b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis    assert loc.offset == offset
146b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
156b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidisdef test_location():
161f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu(baseInput)
171f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    one = get_cursor(tu, 'one')
181f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    two = get_cursor(tu, 'two')
196b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
201f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert one is not None
211f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert two is not None
221f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
231f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(one.location,line=1,column=5,offset=4)
241f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(two.location,line=2,column=5,offset=13)
256b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
266b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis    # adding a linebreak at top should keep columns same
271f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu('\n' + baseInput)
281f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    one = get_cursor(tu, 'one')
291f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    two = get_cursor(tu, 'two')
301f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
311f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert one is not None
321f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert two is not None
336b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
341f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(one.location,line=2,column=5,offset=5)
351f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(two.location,line=3,column=5,offset=14)
366b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
376b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis    # adding a space should affect column on first line only
381f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu(' ' + baseInput)
391f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    one = get_cursor(tu, 'one')
401f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    two = get_cursor(tu, 'two')
416b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
421f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(one.location,line=1,column=6,offset=5)
431f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(two.location,line=2,column=5,offset=14)
446b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidis
4558ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser    # define the expected location ourselves and see if it matches
4658ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser    # the returned location
471f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu(baseInput)
4858ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser
4958ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser    file = File.from_name(tu, 't.c')
5058ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser    location = SourceLocation.from_position(tu, file, 1, 5)
5158ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser    cursor = Cursor.from_location(tu, location)
5258ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser
531f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    one = get_cursor(tu, 'one')
541f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert one is not None
551f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert one == cursor
5658ba8c9f182c94553c8871086bf68e336a14a527Tobias Grosser
5774858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    # Ensure locations referring to the same entity are equivalent.
5874858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    location2 = SourceLocation.from_position(tu, file, 1, 5)
5974858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    assert location == location2
6074858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    location3 = SourceLocation.from_position(tu, file, 1, 4)
6174858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    assert location2 != location3
6274858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser
6374bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc    offset_location = SourceLocation.from_offset(tu, file, 5)
6474bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc    cursor = Cursor.from_location(tu, offset_location)
6574bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc    verified = False
6674bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc    for n in [n for n in tu.cursor.get_children() if n.spelling == 'one']:
6774bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc        assert n == cursor
6874bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc        verified = True
6974bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc
7074bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc    assert verified
7174bb710e73229ce0ad3bb27c8689c0276e8ec131Gregory Szorc
726b04623bcc64a5091a47fb18cd40af5e93b773adArgyrios Kyrtzidisdef test_extent():
731f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    tu = get_tu(baseInput)
741f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    one = get_cursor(tu, 'one')
751f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    two = get_cursor(tu, 'two')
761f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
771f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(one.extent.start,line=1,column=1,offset=0)
781f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(one.extent.end,line=1,column=8,offset=7)
791f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert baseInput[one.extent.start.offset:one.extent.end.offset] == "int one"
801f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc
811f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(two.extent.start,line=2,column=1,offset=9)
821f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert_location(two.extent.end,line=2,column=8,offset=16)
831f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorc    assert baseInput[two.extent.start.offset:two.extent.end.offset] == "int two"
8474858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser
8574858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    file = File.from_name(tu, 't.c')
8674858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    location1 = SourceLocation.from_position(tu, file, 1, 1)
8774858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    location2 = SourceLocation.from_position(tu, file, 1, 8)
8874858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser
8974858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    range1 = SourceRange.from_locations(location1, location2)
9074858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    range2 = SourceRange.from_locations(location1, location2)
9174858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    assert range1 == range2
9274858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser
9374858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    location3 = SourceLocation.from_position(tu, file, 1, 6)
9474858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    range3 = SourceRange.from_locations(location1, location3)
9574858335a1a5205b3e1c89ecf9221cea839c0b0bTobias Grosser    assert range1 != range3
96