summaryrefslogtreecommitdiff
path: root/autoload
diff options
context:
space:
mode:
authorNathan Henrie <n8henrie@users.noreply.github.com>2022-08-07 01:27:17 -0600
committerGitHub <noreply@github.com>2022-08-07 16:27:17 +0900
commit5063804d44fe149ed39149848f92b5960f4f7164 (patch)
treecab553ae5166a556ab5b2a57d81f86c29a97e707 /autoload
parente10fcf22dcc0441da3c984e26ae2e467b0ae554f (diff)
downloadale-5063804d44fe149ed39149848f92b5960f4f7164.zip
Add openscad and sca2d support (#4205)
Diffstat (limited to 'autoload')
-rw-r--r--autoload/ale/handlers/openscad.vim73
1 files changed, 73 insertions, 0 deletions
diff --git a/autoload/ale/handlers/openscad.vim b/autoload/ale/handlers/openscad.vim
new file mode 100644
index 00000000..33eee31c
--- /dev/null
+++ b/autoload/ale/handlers/openscad.vim
@@ -0,0 +1,73 @@
+scriptencoding utf-8LE
+" Description: This file defines a handler function for linting OpenSCAD files
+" with SCA2D
+
+function! ale#handlers#openscad#SCA2D_callback(buffer, lines) abort
+ " Example output::
+ " foo.scad:3:1: W2001: Variable `unused` overwritten within scope.
+ " foo.scad:1:1: F0001: Cannot read file due to syntax error:
+ " - No terminal matches '}' in the current parser context, at line 1 col 36
+ let l:filename_re = '^\([^:]*\):'
+ let l:linenum_re = '\([0-9]*\):'
+ let l:colnum_re = '\([0-9]*\):'
+ let l:err_id = '\([IWEFU][0-9]\+\):'
+ let l:err_msg = '\(.*\)'
+ let l:pattern = filename_re .
+ \ linenum_re .
+ \ colnum_re .
+ \ ' ' .
+ \ err_id .
+ \ ' ' .
+ \ err_msg
+
+ let l:result = []
+ let l:idx = 0
+
+ for l:line in a:lines
+ let l:matches = matchlist(line, pattern)
+
+ if len(matches) > 0
+ " option: Info, Warning, Error, Fatal, Unknown
+ if index(['I', 'W'], matches[4][0]) >= 0
+ let l:type = 'W'
+ else
+ let l:type = 'E'
+ endif
+
+ let l:lnum = matches[2]
+ let l:col = matches[3]
+ let l:text = matches[5]
+
+ " Better locations for some syntax errors
+ if matches[4][0] is# 'F'
+ let l:syntax_error_re = '^\(.*\), at line \([0-9]\+\) col \([0-9]\+\)$'
+ let l:next_line = a:lines[idx+1]
+ let l:syn_err_matches = matchlist(l:next_line, l:syntax_error_re)
+
+ if len(syn_err_matches) > 0
+ let l:text = l:text . l:syn_err_matches[1]
+ let l:lnum = l:syn_err_matches[2]
+ let l:col = l:syn_err_matches[3]
+ else
+ let l:text = l:next_line
+ endif
+ endif
+
+ let l:element = {
+ \ 'lnum': str2nr(l:lnum),
+ \ 'col': str2nr(l:col),
+ \ 'text': l:text,
+ \ 'detail': l:matches[4] . ': ' . l:text,
+ \ 'filename': fnamemodify(matches[1], ':p'),
+ \ 'type': l:type
+ \ }
+
+ call add(l:result, l:element)
+ endif
+
+ let l:idx += 1
+ endfor
+
+ return result
+
+endfun