--- /dev/null
+"""
+A Deoplete source for ALE completion via tsserver and LSP.
+"""
+__author__ = 'Joao Paulo, w0rp'
+
+try:
+ from deoplete.source.base import Base
+except ImportError:
+ # Mock the Base class if deoplete isn't available, as mock isn't available
+ # in the Docker image.
+ class Base(object):
+ def __init__(self, vim):
+ pass
+
+
+# Make sure this code is valid in Python 2, used for running unit tests.
+class Source(Base):
+
+ def __init__(self, vim):
+ super(Source, self).__init__(vim)
+
+ self.name = 'ale'
+ self.mark = '[L]'
+ self.rank = 1000
+ self.is_bytepos = True
+ self.min_pattern_length = 1
+ self.is_volatile = True
+ # Do not forget to update s:trigger_character_map in completion.vim in
+ # updating entries in this map.
+ self.input_patterns = {
+ '_': r'\.\w*$',
+ 'rust': r'(\.|::)\w*$',
+ 'typescript': r'(\.|\'|")\w*$',
+ 'cpp': r'(\.|::|->)\w*$',
+ 'c': r'(\.|->)\w*$',
+ }
+
+ # Returns an integer for the start position, as with omnifunc.
+ def get_complete_position(self, context):
+ return self.vim.call(
+ 'ale#completion#GetCompletionPositionForDeoplete', context['input']
+ )
+
+ def gather_candidates(self, context):
+ # Stop early if ALE can't provide completion data for this buffer.
+ if not self.vim.call('ale#completion#CanProvideCompletions'):
+ return None
+
+ event = context.get('event')
+
+ if event == 'Async':
+ result = self.vim.call('ale#completion#GetCompletionResult')
+
+ return result or []
+
+ if context.get('is_refresh'):
+ self.vim.command(
+ "call ale#completion#GetCompletions('ale-callback', "
+ + "{'callback': {completions -> deoplete#auto_complete() }})"
+ )
+
+ return []