-
Notifications
You must be signed in to change notification settings - Fork 236
/
Copy pathreference.py
141 lines (110 loc) · 4.31 KB
/
reference.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
from .global_vars import *
class Ref:
"""Reference item in the 'Find All Reference' view
A reference to a source file, line, offset; next and prev refer to the
next and previous reference in a view containing references
"""
def __init__(self, filename, line, offset, prev_line):
self.filename = filename
self.line = line
self.offset = offset
self.next_line = None
self.prev_line = prev_line
def set_next_line(self, n):
self.next_line = n
def as_tuple(self):
return self.filename, self.line, self.offset, self.prev_line, self.next_line
class RefInfo:
"""Maps (line in view containing references) to (filename, line, offset) referenced"""
def __init__(self, first_line, ref_id):
self.ref_map = {}
self.current_ref_line = None
self.first_line = first_line
self.last_line = None
self.ref_id = ref_id
def set_last_line(self, last_line):
self.last_line = last_line
def add_mapping(self, line, target):
self.ref_map[line] = target
def contains_mapping(self, line):
return line in self.ref_map
def get_mapping(self, line):
if line in self.ref_map:
return self.ref_map[line]
def get_current_mapping(self):
if self.current_ref_line:
return self.get_mapping(self.current_ref_line)
def set_ref_line(self, line):
self.current_ref_line = line
def get_ref_line(self):
return self.current_ref_line
def get_ref_id(self):
return self.ref_id
def next_ref_line(self):
current_mapping = self.get_current_mapping()
if (not self.current_ref_line) or (not current_mapping):
self.current_ref_line = self.first_line
else:
(filename, l, c, p, n) = current_mapping.as_tuple()
if n:
self.current_ref_line = n
else:
self.current_ref_line = self.first_line
return self.current_ref_line
def prev_ref_line(self):
current_mapping = self.get_current_mapping()
if (not self.current_ref_line) or (not current_mapping):
self.current_ref_line = self.last_line
else:
(filename, l, c, p, n) = current_mapping.as_tuple()
if p:
self.current_ref_line = p
else:
self.current_ref_line = self.last_line
return self.current_ref_line
def as_value(self):
vmap = {}
keys = self.ref_map.keys()
for key in keys:
vmap[key] = self.ref_map[key].as_tuple()
return vmap, self.current_ref_line, self.first_line, self.last_line, self.ref_id
def build_ref(ref_tuple):
"""Build a Ref from a serialized Ref"""
(filename, line, offset, prev_line, next_line) = ref_tuple
ref = Ref(filename, line, offset, prev_line)
ref.set_next_line(next_line)
return ref
def build_ref_info(ref_info_tuple):
"""Build a RefInfo object from a serialized RefInfo"""
(dict, current_line, first_line, last_line, ref_id) = ref_info_tuple
ref_info = RefInfo(first_line, ref_id)
ref_info.set_ref_line(current_line)
ref_info.set_last_line(last_line)
for key in dict.keys():
ref_info.add_mapping(key, build_ref(dict[key]))
return ref_info
def highlight_ids(view, ref_id):
"""Highlight all occurrences of ref_id in view"""
id_regions = view.find_all("(?<=\W)" + ref_id + "(?=\W)")
if id_regions and (len(id_regions) > 0):
if IS_ST2:
view.add_regions("refid", id_regions, "constant.numeric", "", sublime.DRAW_OUTLINED)
else:
view.add_regions("refid", id_regions, "constant.numeric",
flags=sublime.DRAW_NO_FILL | sublime.DRAW_NO_OUTLINE | sublime.DRAW_SOLID_UNDERLINE)
def update_ref_line(ref_info, cur_line, view):
"""Update the given line in reference view
Update the gutter icon
"""
# Todo: make sure the description is right
view.erase_regions("curref")
caret_pos = view.text_point(cur_line, 0)
# sublime 2 doesn't support custom icons
icon = "Packages/" + PLUGIN_NAME + "/icons/arrow-right3.png" if not IS_ST2 else ""
view.add_regions(
"curref",
[sublime.Region(caret_pos, caret_pos + 1)],
"keyword",
icon,
sublime.HIDDEN
)