summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/inko/inko.vim33
-rw-r--r--autoload/ale/handlers/inko.vim37
-rw-r--r--autoload/ale/linter.vim1
-rw-r--r--doc/ale-inko.txt22
-rw-r--r--doc/ale-supported-languages-and-tools.txt2
-rw-r--r--doc/ale.txt3
-rw-r--r--supported-tools.md2
-rw-r--r--test/command_callback/inko_paths/test.inko0
-rw-r--r--test/command_callback/inko_paths/tests/test/test_foo.inko0
-rw-r--r--test/command_callback/test_inko_inko_callbacks.vader20
-rw-r--r--test/handler/test_inko_handler.vader54
11 files changed, 174 insertions, 0 deletions
diff --git a/ale_linters/inko/inko.vim b/ale_linters/inko/inko.vim
new file mode 100644
index 00000000..11558897
--- /dev/null
+++ b/ale_linters/inko/inko.vim
@@ -0,0 +1,33 @@
+" Author: Yorick Peterse <yorick@yorickpeterse.com>
+" Description: linting of Inko source code using the Inko compiler
+
+call ale#Set('inko_inko_executable', 'inko')
+
+function! ale_linters#inko#inko#GetCommand(buffer) abort
+ let l:include = ''
+
+ " Include the tests source directory, but only for test files.
+ if expand('#' . a:buffer . ':p') =~? '\vtests[/\\]test[/\\]'
+ let l:test_dir = ale#path#FindNearestDirectory(a:buffer, 'tests')
+
+ if isdirectory(l:test_dir)
+ let l:include = '--include ' . ale#Escape(l:test_dir)
+ endif
+ endif
+
+ " We use %s instead of %t so the compiler determines the correct module
+ " names for the file being edited. Not doing so may lead to errors in
+ " certain cases.
+ return '%e build --check --format=json'
+ \ . ale#Pad(l:include)
+ \ . ' %s'
+endfunction
+
+call ale#linter#Define('inko', {
+\ 'name': 'inko',
+\ 'executable': {b -> ale#Var(b, 'inko_inko_executable')},
+\ 'command': function('ale_linters#inko#inko#GetCommand'),
+\ 'callback': 'ale#handlers#inko#Handle',
+\ 'output_stream': 'stderr',
+\ 'lint_file': 1
+\})
diff --git a/autoload/ale/handlers/inko.vim b/autoload/ale/handlers/inko.vim
new file mode 100644
index 00000000..73f06871
--- /dev/null
+++ b/autoload/ale/handlers/inko.vim
@@ -0,0 +1,37 @@
+" Author: Yorick Peterse <yorick@yorickpeterse.com>
+" Description: output handlers for the Inko JSON format
+
+function! ale#handlers#inko#GetType(severity) abort
+ if a:severity is? 'warning'
+ return 'W'
+ endif
+
+ return 'E'
+endfunction
+
+function! ale#handlers#inko#Handle(buffer, lines) abort
+ try
+ let l:errors = json_decode(join(a:lines, ''))
+ catch
+ return []
+ endtry
+
+ if empty(l:errors)
+ return []
+ endif
+
+ let l:output = []
+ let l:dir = expand('#' . a:buffer . ':p:h')
+
+ for l:error in l:errors
+ call add(l:output, {
+ \ 'filename': ale#path#GetAbsPath(l:dir, l:error['file']),
+ \ 'lnum': l:error['line'],
+ \ 'col': l:error['column'],
+ \ 'text': l:error['message'],
+ \ 'type': ale#handlers#inko#GetType(l:error['level']),
+ \})
+ endfor
+
+ return l:output
+endfunction
diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim
index 645c25f9..ba11e1eb 100644
--- a/autoload/ale/linter.vim
+++ b/autoload/ale/linter.vim
@@ -43,6 +43,7 @@ let s:default_ale_linters = {
\ 'go': ['gofmt', 'golint', 'go vet'],
\ 'hack': ['hack'],
\ 'help': [],
+\ 'inko': ['inko'],
\ 'perl': ['perlcritic'],
\ 'perl6': [],
\ 'python': ['flake8', 'mypy', 'pylint', 'pyright'],
diff --git a/doc/ale-inko.txt b/doc/ale-inko.txt
new file mode 100644
index 00000000..5ca14af6
--- /dev/null
+++ b/doc/ale-inko.txt
@@ -0,0 +1,22 @@
+===============================================================================
+ALE Inko Integration *ale-inko-options*
+ *ale-integration-inko*
+
+===============================================================================
+Integration Information
+
+ Currently, the only supported linter for Inko is the Inko compiler itself.
+
+===============================================================================
+inko *ale-inko-inko*
+
+g:ale_inko_inko_executable *g:ale_inko_inko_executable*
+ *b:ale_inko_inko_executable*
+ Type: |String|
+ Default: `'inko'`
+
+ This variable can be modified to change the executable path for `inko`.
+
+
+===============================================================================
+ vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt
index 4844d0aa..b0efb2bb 100644
--- a/doc/ale-supported-languages-and-tools.txt
+++ b/doc/ale-supported-languages-and-tools.txt
@@ -215,6 +215,8 @@ Notes:
* `idris`
* Ink
* `ink-language-server`
+* Inko
+ * `inko` !!
* ISPC
* `ispc`!!
* Java
diff --git a/doc/ale.txt b/doc/ale.txt
index d23e6fb6..767d000d 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -1531,6 +1531,7 @@ g:ale_linters *g:ale_linters*
\ 'go': ['gofmt', 'golint', 'go vet'],
\ 'hack': ['hack'],
\ 'help': [],
+ \ 'inko': ['inko'],
\ 'perl': ['perlcritic'],
\ 'perl6': [],
\ 'python': ['flake8', 'mypy', 'pylint', 'pyright'],
@@ -2708,6 +2709,8 @@ documented in additional help files.
idris.................................|ale-idris-idris|
ink.....................................|ale-ink-options|
ink-language-server...................|ale-ink-language-server|
+ inko....................................|ale-inko-options|
+ inko..................................|ale-inko-inko|
ispc....................................|ale-ispc-options|
ispc..................................|ale-ispc-ispc|
java....................................|ale-java-options|
diff --git a/supported-tools.md b/supported-tools.md
index 9d70b6b2..9e3e5087 100644
--- a/supported-tools.md
+++ b/supported-tools.md
@@ -224,6 +224,8 @@ formatting.
* [idris](http://www.idris-lang.org/)
* Ink
* [ink-language-server](https://github.com/ephread/ink-language-server)
+* Inko
+ * [inko](https://inko-lang.org/) :floppy_disk:
* ISPC
* [ispc](https://ispc.github.io/) :floppy_disk:
* Java
diff --git a/test/command_callback/inko_paths/test.inko b/test/command_callback/inko_paths/test.inko
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/inko_paths/test.inko
diff --git a/test/command_callback/inko_paths/tests/test/test_foo.inko b/test/command_callback/inko_paths/tests/test/test_foo.inko
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/inko_paths/tests/test/test_foo.inko
diff --git a/test/command_callback/test_inko_inko_callbacks.vader b/test/command_callback/test_inko_inko_callbacks.vader
new file mode 100644
index 00000000..93295c91
--- /dev/null
+++ b/test/command_callback/test_inko_inko_callbacks.vader
@@ -0,0 +1,20 @@
+Before:
+ call ale#assert#SetUpLinterTest('inko', 'inko')
+ call ale#test#SetFilename('inko_paths/test.inko')
+
+After:
+ call ale#assert#TearDownLinterTest()
+
+Execute(The default executable path should be correct):
+ AssertLinter 'inko', ale#Escape('inko') . ' build --check --format=json %s'
+
+Execute(The inko callback should include tests/ for test paths):
+ call ale#engine#Cleanup(bufnr(''))
+ noautocmd e! inko_paths/tests/test/test_foo.inko
+ call ale#engine#InitBufferInfo(bufnr(''))
+
+ AssertLinter 'inko',
+ \ ale#Escape('inko')
+ \ . ' build --check --format=json --include '
+ \ . ale#Escape(ale#path#Simplify(g:dir . '/inko_paths/tests/'))
+ \ . ' %s'
diff --git a/test/handler/test_inko_handler.vader b/test/handler/test_inko_handler.vader
new file mode 100644
index 00000000..6621d2d6
--- /dev/null
+++ b/test/handler/test_inko_handler.vader
@@ -0,0 +1,54 @@
+Before:
+ runtime ale_linters/inko/inko.vim
+
+After:
+ call ale#linter#Reset()
+
+Execute(The inko handler should parse errors correctly):
+ AssertEqual
+ \ [
+ \ {
+ \ 'filename': ale#path#Simplify('/tmp/foo.inko'),
+ \ 'lnum': 4,
+ \ 'col': 5,
+ \ 'text': 'this is an error',
+ \ 'type': 'E',
+ \ }
+ \ ],
+ \ ale#handlers#inko#Handle(bufnr(''), [
+ \ '[',
+ \ ' {',
+ \ ' "file": "/tmp/foo.inko",',
+ \ ' "line": 4,',
+ \ ' "column": 5,',
+ \ ' "message": "this is an error",',
+ \ ' "level": "error"',
+ \ ' }',
+ \ ']'
+ \ ])
+
+Execute(The inko handler should parse warnings correctly):
+ AssertEqual
+ \ [
+ \ {
+ \ 'filename': ale#path#Simplify('/tmp/foo.inko'),
+ \ 'lnum': 4,
+ \ 'col': 5,
+ \ 'text': 'this is a warning',
+ \ 'type': 'W',
+ \ }
+ \ ],
+ \ ale#handlers#inko#Handle(bufnr(''), [
+ \ '[',
+ \ ' {',
+ \ ' "file": "/tmp/foo.inko",',
+ \ ' "line": 4,',
+ \ ' "column": 5,',
+ \ ' "message": "this is a warning",',
+ \ ' "level": "warning"',
+ \ ' }',
+ \ ']'
+ \ ])
+
+Execute(The inko handler should handle empty output):
+ AssertEqual [], ale#handlers#inko#Handle(bufnr(''), [])