This file is indexed.

/usr/share/gps/plug-ins/dispatching.py is in gnat-gps-common 5.0-13.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
"""Highlighting all dispatching calls in the current editor

This package will highlight with a special background color all
dispatching calls found in the current editor. In particular, at such
locations, the cross-references might not lead accurate result (for
instance "go to body"), since the exact subprogram that is called is
not known until run time.
"""


#############################################################################
## No user customization below this line
#############################################################################

import GPS
from GPS import *

Preference ("Plugins/dispatching/onopen").create (
  "Highlight dispatching calls", "boolean",
   """If enabled, highlighting of dispatching calls is done as soon as a file is opened. This can slow down GPS, though, so should be deactivated if opening a file seems slow""", True)

Preference ("Plugins/dispatching/color").create (
  "Highlight color", "color",
   """Background color to use for dispatching calls""",
   "#FFF3C2")

Preference ("Plugins/dispatching/context").create (
  "Search context", "integer",
  """When the cross-reference information is not up-to-date, GPS will search a few lines around the original location for matching entities. This preference indicates how many lines it will search -- the bigger the slower of course, and potentially less precise too""", 5, 0, 50)

try:
   ## If we have PyGTK installed, we'll do the highlighting of the next
   ## matches in the background, which makes the interface more responsive
   import gobject
   has_pygtk = 1
except:
   has_pygtk = 0

context = 0    # Mirror of the preference
insert_overlays_id = 0
to_highlight=[]
current_entities=[]
current_entity=None

def highlight_entity_references (buffer, entity):
  """Highlight all dispatching calls to entity in buffer"""

  global context

  refs = entity.references (kind_in = "dispatching call",
                            in_file = buffer.file())
  n = entity.name().lower()

  if refs:
    for r in refs:
      for c in range (0, context + 1):
        try:
           # Search after original xref line
           cloc = EditorLocation (buffer, r.line() + c, r.column())
           endloc = cloc + len (n) - 1
           if buffer.get_chars (cloc, endloc).lower() == n:
              buffer.apply_overlay (buffer.dispatch_overlay, cloc, endloc)
              break

           # Search before original xref line
           if c != 0:
              cloc = EditorLocation (buffer, r.line() - c, r.column())
              endloc = cloc + len (n) - 1
              if buffer.get_chars (cloc, endloc).lower () == n:
                 buffer.apply_overlay (buffer.dispatch_overlay, cloc, endloc)
                 break

        except:
          # The xref location might no longer be valid, just ignore it
          pass

def highlight_file_idle ():
  """Process the next entity or file to highlight"""
  global to_highlight
  global current_entities
  global current_entity
  global insert_overlays_id

  if to_highlight == []:
     insert_overlays_id = 0
     current_entities=[]
     return False

  buffer = to_highlight[0]

  if current_entities == []:
     try:
        current_entities = buffer.file().entities (local = False)
        current_entity   = current_entities.__iter__()
     except GPS.Exception:
        ## The buffer might have been destroyed. Give up
        return True

  try:
     e = current_entity.next()
     highlight_entity_references (buffer, e)
     return True
  except StopIteration:
     to_highlight.pop (0)
     current_entities=[]
     return True
  except GPS.Exception:
     ## The buffer might have been destroyed. Give up
     to_highlight.pop (0)
     current_entities=[]
     return True


def highlight_dispatching_calls (buffer):
  global insert_overlays_id
  global to_highlight

  if not buffer:
     return

  try:
     buffer.remove_overlay (buffer.dispatch_overlay)
  except:
     buffer.dispatch_overlay = buffer.create_overlay ("dispatchcalls")

  buffer.dispatch_overlay.set_property ("background", Preference ("Plugins/dispatching/color").get())

  if has_pygtk:
     if not buffer in to_highlight:
        to_highlight.append (buffer)
     if insert_overlays_id == 0:
        insert_overlays_id = gobject.idle_add (highlight_file_idle)

  else:
     entities = buffer.file().entities (local = False)
     for e in entities:
        highlight_entity_references (buffer, e)


def on_highlight_dispatching_calls (menu):
  highlight_dispatching_calls (EditorBuffer.get())

def on_file_edited (hook, file):
  highlight_dispatching_calls (EditorBuffer.get (file))

def on_compilation_finished (hook, category, target_name="", mode_name="", status=""):
  # Re-highlight all editors
  for l in EditorBuffer.list():
     highlight_dispatching_calls (l)

hooks_set = 0

def preferences_changed (hook):
  global hooks_set
  global context
  context = Preference ("Plugins/dispatching/context").get ()

  if Preference ("Plugins/dispatching/onopen").get():
     if not hooks_set:
        Hook ("file_edited").add (on_file_edited)
        Hook ("file_changed_on_disk").add (on_file_edited)
        Hook ("compilation_finished").add (on_compilation_finished)
        hooks_set = 1

     # Always redo the highlighting to take into account changes in colors
     on_compilation_finished (hook, "")

  else:
     if hooks_set:
        Hook ("file_edited").remove (on_file_edited)
        Hook ("file_changed_on_disk").remove (on_file_edited)
        Hook ("compilation_finished").remove (on_compilation_finished)
        hooks_set = 0
     for l in EditorBuffer.list():
       try:
          l.remove_overlay (l.dispatch_overlay)
       except:
          pass

Hook ("preferences_changed").add (preferences_changed)
Menu.create ("/Navigate/Highlight Dispatching Calls",
             on_highlight_dispatching_calls,
             ref = "Find All References",
             add_before = False)