This repository was archived by the owner on Feb 23, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHyperclickProviderDispatcher.coffee
110 lines (86 loc) · 2.86 KB
/
HyperclickProviderDispatcher.coffee
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
{Point, Range} = require 'atom'
AbstractProvider = require './AbstractProvider'
module.exports =
##*
# Dispatches a hyperclick request to the correct provider.
#
# Hyperclick only supports a single provider per package, so we have to figure out dispatching the request to the
# correct provider on our own.
##
class HyperclickProviderDispatcher extends AbstractProvider
###*
* @var {Array}
###
providers: null
###*
* @var {Object}
###
service: null
###*
* @var {Object}
###
cachingScopeDescriptorHelper: null
###*
* @var {WeakMap}
###
editorChangeSubscriptions: null
###*
* Constructor.
*
* @param {Object} cachingScopeDescriptorHelper
###
constructor: (@cachingScopeDescriptorHelper) ->
@providers = []
@editorChangeSubscriptions = new WeakMap()
###*
* @param {AbstractProvider} provider
###
addProvider: (provider) ->
@providers.push(provider)
provider.setService(@service)
###*
* @param {Object} service
###
setService: (service) ->
@service = service
for provider in @providers
provider.setService(service)
###*
* @param {TextEditor} editor
* @param {Point} bufferPosition
###
getSuggestion: (editor, bufferPosition) ->
rangeToHighlight = null
interestedProviderInfoList = []
@registerEditorListenersIfNeeded(editor)
for provider in @providers
if provider.canProvideForBufferPosition(editor, bufferPosition)
range = provider.getRangeForBufferPosition(editor, bufferPosition)
interestedProviderInfoList.push({
range : range
provider : provider
})
# TODO: Expand range to always be that of the widest (or shortest) provider if there are multiple?
rangeToHighlight = range
return null if not rangeToHighlight?
return {
range : rangeToHighlight
callback : () =>
for interestedProviderInfo in interestedProviderInfoList
continue if not interestedProviderInfo.range?
text = editor.getTextInBufferRange(interestedProviderInfo.range)
interestedProviderInfo.provider.handleNavigation(editor, interestedProviderInfo.range, text)
}
###*
* @param {TextEditor} editor
###
registerEditorListenersIfNeeded: (editor) ->
if not @editorChangeSubscriptions.has(editor)
@registerEditorListeners(editor)
###*
* @param {TextEditor} editor
###
registerEditorListeners: (editor) ->
onChangeDisposable = editor.onDidStopChanging () =>
@cachingScopeDescriptorHelper.clearCache()
@editorChangeSubscriptions.set(editor, onChangeDisposable)