test_location.py revision 74bb710e73229ce0ad3bb27c8689c0276e8ec131
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