diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-28 22:18:09 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-28 22:18:09 +0200 |
commit | 27903c5b8656c796564ef073c1ebe77a2f0154e1 (patch) | |
tree | 2b0a3a14494d7976fb79a7517706e25d2a95d080 /indent/scala.vim | |
parent | d5e38fa97bc50a93a66473d6cd7072fbcbadda57 (diff) | |
download | vim-polyglot-27903c5b8656c796564ef073c1ebe77a2f0154e1.tar.gz vim-polyglot-27903c5b8656c796564ef073c1ebe77a2f0154e1.zip |
Revert inlining basic language packv3.0.0
Diffstat (limited to 'indent/scala.vim')
-rw-r--r-- | indent/scala.vim | 613 |
1 files changed, 0 insertions, 613 deletions
diff --git a/indent/scala.vim b/indent/scala.vim index 78dcf8ad..da6c2f5c 100644 --- a/indent/scala.vim +++ b/indent/scala.vim @@ -1,616 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Scala (http://scala-lang.org/) -" Original Author: Stefan Matthias Aust -" Modifications By: Derek Wyatt -" URL: https://github.com/derekwyatt/vim-scala -" Last Change: 2016 Aug 26 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=GetScalaIndent() -setlocal indentkeys=0{,0},0),!^F,<>>,o,O,e,=case,<CR> - -if exists("*GetScalaIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -let s:defMatcher = '\%(\%(private\|protected\)\%(\[[^\]]*\]\)\?\s\+\|abstract\s\+\|override\s\+\)*\<def\>' -let s:funcNameMatcher = '\w\+' -let s:typeSpecMatcher = '\%(\s*\[\_[^\]]*\]\)' -let s:defArgMatcher = '\%((\_.\{-})\)' -let s:returnTypeMatcher = '\%(:\s*\w\+' . s:typeSpecMatcher . '\?\)' -let g:fullDefMatcher = '^\s*' . s:defMatcher . '\s\+' . s:funcNameMatcher . '\s*' . s:typeSpecMatcher . '\?\s*' . s:defArgMatcher . '\?\s*' . s:returnTypeMatcher . '\?\s*[={]' - -function! scala#ConditionalConfirm(msg) - if 0 - call confirm(a:msg) - endif -endfunction - -function! scala#GetLine(lnum) - let line = substitute(getline(a:lnum), '//.*$', '', '') - let line = substitute(line, '"\(.\|\\"\)\{-}"', '""', 'g') - return line -endfunction - -function! scala#CountBrackets(line, openBracket, closedBracket) - let line = substitute(a:line, '"\(.\|\\"\)\{-}"', '', 'g') - let open = substitute(line, '[^' . a:openBracket . ']', '', 'g') - let close = substitute(line, '[^' . a:closedBracket . ']', '', 'g') - return strlen(open) - strlen(close) -endfunction - -function! scala#CountParens(line) - return scala#CountBrackets(a:line, '(', ')') -endfunction - -function! scala#CountCurlies(line) - return scala#CountBrackets(a:line, '{', '}') -endfunction - -function! scala#LineEndsInIncomplete(line) - if a:line =~ '[.,]\s*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineIsAClosingXML(line) - if a:line =~ '^\s*</\w' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineCompletesXML(lnum, line) - let savedpos = getpos('.') - call setpos('.', [savedpos[0], a:lnum, 0, savedpos[3]]) - let tag = substitute(a:line, '^.*</\([^>]*\)>.*$', '\1', '') - let [lineNum, colnum] = searchpairpos('<' . tag . '>', '', '</' . tag . '>', 'Wbn') - call setpos('.', savedpos) - let pline = scala#GetLine(prevnonblank(lineNum - 1)) - if pline =~ '=\s*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#IsParentCase() - let savedpos = getpos('.') - call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]]) - let [l, c] = searchpos('^\s*\%(' . s:defMatcher . '\|\%(\<case\>\)\)', 'bnW') - let retvalue = -1 - if l != 0 && search('\%' . l . 'l\s*\<case\>', 'bnW') - let retvalue = l - endif - call setpos('.', savedpos) - return retvalue -endfunction - -function! scala#CurlyMatcher() - let matchline = scala#GetLineThatMatchesBracket('{', '}') - if scala#CountParens(scala#GetLine(matchline)) < 0 - let savedpos = getpos('.') - call setpos('.', [savedpos[0], matchline, 9999, savedpos[3]]) - call searchpos('{', 'Wbc') - call searchpos(')', 'Wb') - let [lnum, colnum] = searchpairpos('(', '', ')', 'Wbn') - call setpos('.', savedpos) - let line = scala#GetLine(lnum) - if line =~ '^\s*' . s:defMatcher - return lnum - else - return matchline - endif - else - return matchline - endif -endfunction - -function! scala#GetLineAndColumnThatMatchesCurly() - return scala#GetLineAndColumnThatMatchesBracket('{', '}') -endfunction - -function! scala#GetLineAndColumnThatMatchesParen() - return scala#GetLineAndColumnThatMatchesBracket('(', ')') -endfunction - -function! scala#GetLineAndColumnThatMatchesBracket(openBracket, closedBracket) - let savedpos = getpos('.') - let curline = scala#GetLine(line('.')) - if curline =~ a:closedBracket . '.*' . a:openBracket . '.*' . a:closedBracket - call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]]) - call searchpos(a:closedBracket . '\ze[^' . a:closedBracket . a:openBracket . ']*' . a:openBracket, 'W') - else - call setpos('.', [savedpos[0], savedpos[1], 9999, savedpos[3]]) - call searchpos(a:closedBracket, 'Wbc') - endif - let [lnum, colnum] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn') - call setpos('.', savedpos) - return [lnum, colnum] -endfunction - -function! scala#GetLineThatMatchesCurly() - return scala#GetLineThatMatchesBracket('{', '}') -endfunction - -function! scala#GetLineThatMatchesParen() - return scala#GetLineThatMatchesBracket('(', ')') -endfunction - -function! scala#GetLineThatMatchesBracket(openBracket, closedBracket) - let [lnum, colnum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket) - return lnum -endfunction - -function! scala#NumberOfBraceGroups(line) - let line = substitute(a:line, '[^()]', '', 'g') - if strlen(line) == 0 - return 0 - endif - let line = substitute(line, '^)*', '', 'g') - if strlen(line) == 0 - return 0 - endif - let line = substitute(line, '^(', '', 'g') - if strlen(line) == 0 - return 0 - endif - let c = 1 - let counter = 0 - let groupCount = 0 - while counter < strlen(line) - let char = strpart(line, counter, 1) - if char == '(' - let c = c + 1 - elseif char == ')' - let c = c - 1 - endif - if c == 0 - let groupCount = groupCount + 1 - endif - let counter = counter + 1 - endwhile - return groupCount -endfunction - -function! scala#MatchesIncompleteDefValr(line) - if a:line =~ '^\s*\%(' . s:defMatcher . '\|\<va[lr]\>\).*[=({]\s*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineIsCompleteIf(line) - if scala#CountBrackets(a:line, '{', '}') == 0 && - \ scala#CountBrackets(a:line, '(', ')') == 0 && - \ a:line =~ '^\s*\<if\>\s*([^)]*)\s*\S.*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineCompletesIfElse(lnum, line) - if a:line =~ '^\s*\%(\<if\>\|\%(}\s*\)\?\<else\>\)' - return 0 - endif - let result = search('^\%(\s*\<if\>\s*(.*).*\n\|\s*\<if\>\s*(.*)\s*\n.*\n\)\%(\s*\<else\>\s*\<if\>\s*(.*)\s*\n.*\n\)*\%(\s*\<else\>\s*\n\|\s*\<else\>[^{]*\n\)\?\%' . a:lnum . 'l', 'Wbn') - if result != 0 && scala#GetLine(prevnonblank(a:lnum - 1)) !~ '{\s*$' - return result - endif - return 0 -endfunction - -function! scala#GetPrevCodeLine(lnum) - " This needs to skip comment lines - return prevnonblank(a:lnum - 1) -endfunction - -function! scala#InvertBracketType(openBracket, closedBracket) - if a:openBracket == '(' - return [ '{', '}' ] - else - return [ '(', ')' ] - endif -endfunction - -function! scala#Testhelper(lnum, line, openBracket, closedBracket, iteration) - let bracketCount = scala#CountBrackets(a:line, a:openBracket, a:closedBracket) - " There are more '}' braces than '{' on this line so it may be completing the function definition - if bracketCount < 0 - let [matchedLNum, matchedColNum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket) - if matchedLNum == a:lnum - return -1 - endif - let matchedLine = scala#GetLine(matchedLNum) - if ! scala#MatchesIncompleteDefValr(matchedLine) - let bracketLine = substitute(substitute(matchedLine, '\%' . matchedColNum . 'c.*$', '', ''), '[^{}()]', '', 'g') - if bracketLine =~ '}$' - return scala#Testhelper(matchedLNum, matchedLine, '{', '}', a:iteration + 1) - elseif bracketLine =~ ')$' - return scala#Testhelper(matchedLNum, matchedLine, '(', ')', a:iteration + 1) - else - let prevCodeLNum = scala#GetPrevCodeLine(matchedLNum) - if scala#MatchesIncompleteDefValr(scala#GetLine(prevCodeLNum)) - return prevCodeLNum - else - return -1 - endif - endif - else - " return indent value instead - return matchedLNum - endif - " There's an equal number of '{' and '}' on this line so it may be a single line function definition - elseif bracketCount == 0 - if a:iteration == 0 - let otherBracketType = scala#InvertBracketType(a:openBracket, a:closedBracket) - return scala#Testhelper(a:lnum, a:line, otherBracketType[0], otherBracketType[1], a:iteration + 1) - else - let prevCodeLNum = scala#GetPrevCodeLine(a:lnum) - let prevCodeLine = scala#GetLine(prevCodeLNum) - if scala#MatchesIncompleteDefValr(prevCodeLine) && prevCodeLine !~ '{\s*$' - return prevCodeLNum - else - let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line) - if possibleIfElse != 0 - let defValrLine = prevnonblank(possibleIfElse - 1) - let possibleDefValr = scala#GetLine(defValrLine) - if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$' - return possibleDefValr - else - return -1 - endif - else - return -1 - endif - endif - endif - else - return -1 - endif -endfunction - -function! scala#Test(lnum, line, openBracket, closedBracket) - return scala#Testhelper(a:lnum, a:line, a:openBracket, a:closedBracket, 0) -endfunction - -function! scala#LineCompletesDefValr(lnum, line) - let bracketCount = scala#CountBrackets(a:line, '{', '}') - if bracketCount < 0 - let matchedBracket = scala#GetLineThatMatchesBracket('{', '}') - if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket)) - let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1)) - if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr) - return 1 - else - return 0 - endif - else - return 0 - endif - elseif bracketCount == 0 - let bracketCount = scala#CountBrackets(a:line, '(', ')') - if bracketCount < 0 - let matchedBracket = scala#GetLineThatMatchesBracket('(', ')') - if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket)) - let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1)) - if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr) - return 1 - else - return 0 - endif - else - return 0 - endif - elseif bracketCount == 0 - let possibleDefValr = scala#GetLine(prevnonblank(a:lnum - 1)) - if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$' - return 1 - else - let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line) - if possibleIfElse != 0 - let possibleDefValr = scala#GetLine(prevnonblank(possibleIfElse - 1)) - if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$' - return 2 - else - return 0 - endif - else - return 0 - endif - endif - else - return 0 - endif - endif -endfunction - -function! scala#SpecificLineCompletesBrackets(lnum, openBracket, closedBracket) - let savedpos = getpos('.') - call setpos('.', [savedpos[0], a:lnum, 9999, savedpos[3]]) - let retv = scala#LineCompletesBrackets(a:openBracket, a:closedBracket) - call setpos('.', savedpos) - - return retv -endfunction - -function! scala#LineCompletesBrackets(openBracket, closedBracket) - let savedpos = getpos('.') - let offline = 0 - while offline == 0 - let [lnum, colnum] = searchpos(a:closedBracket, 'Wb') - let [lnumA, colnumA] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn') - if lnum != lnumA - let [lnumB, colnumB] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbnr') - let offline = 1 - endif - endwhile - call setpos('.', savedpos) - if lnumA == lnumB && colnumA == colnumB - return lnumA - else - return -1 - endif -endfunction - -function! GetScalaIndent() - " Find a non-blank line above the current line. - let prevlnum = prevnonblank(v:lnum - 1) - - " Hit the start of the file, use zero indent. - if prevlnum == 0 - return 0 - endif - - let ind = indent(prevlnum) - let originalIndentValue = ind - let prevline = scala#GetLine(prevlnum) - let curlnum = v:lnum - let curline = scala#GetLine(curlnum) - if get(g:, 'scala_scaladoc_indent', 0) - let star_indent = 2 - else - let star_indent = 1 - end - - if prevline =~ '^\s*/\*\*' - if prevline =~ '\*/\s*$' - return ind - else - return ind + star_indent - endif - endif - - if curline =~ '^\s*\*' - return cindent(curlnum) - endif - - " If this line starts with a { then make it indent the same as the previous line - if curline =~ '^\s*{' - call scala#ConditionalConfirm("1") - " Unless, of course, the previous one is a { as well - if prevline !~ '^\s*{' - call scala#ConditionalConfirm("2") - return indent(prevlnum) - endif - endif - - " '.' continuations - if curline =~ '^\s*\.' - if prevline =~ '^\s*\.' - return ind - else - return ind + shiftwidth() - endif - endif - - " Indent html literals - if prevline !~ '/>\s*$' && prevline =~ '^\s*<[a-zA-Z][^>]*>\s*$' - call scala#ConditionalConfirm("3") - return ind + shiftwidth() - endif - - " assumes curly braces around try-block - if curline =~ '^\s*}\s*\<catch\>' - return ind - shiftwidth() - elseif curline =~ '^\s*\<catch\>' - return ind - endif - - " Add a shiftwidth()' after lines that start a block - " If 'if', 'for' or 'while' end with ), this is a one-line block - " If 'val', 'var', 'def' end with =, this is a one-line block - if (prevline =~ '^\s*\<\%(\%(}\?\s*else\s\+\)\?if\|for\|while\)\>.*[)=]\s*$' && scala#NumberOfBraceGroups(prevline) <= 1) - \ || prevline =~ '^\s*' . s:defMatcher . '.*=\s*$' - \ || prevline =~ '^\s*\<va[lr]\>.*[=]\s*$' - \ || prevline =~ '^\s*\%(}\s*\)\?\<else\>\s*$' - \ || prevline =~ '=\s*$' - call scala#ConditionalConfirm("4") - let ind = ind + shiftwidth() - elseif prevline =~ '^\s*\<\%(}\?\s*else\s\+\)\?if\>' && curline =~ '^\s*}\?\s*\<else\>' - return ind - endif - - let lineCompletedBrackets = 0 - let bracketCount = scala#CountBrackets(prevline, '{', '}') - if bracketCount > 0 || prevline =~ '.*{\s*$' - call scala#ConditionalConfirm("5b") - let ind = ind + shiftwidth() - elseif bracketCount < 0 - call scala#ConditionalConfirm("6b") - " if the closing brace actually completes the braces entirely, then we - " have to indent to line that started the whole thing - let completeLine = scala#LineCompletesBrackets('{', '}') - if completeLine != -1 - call scala#ConditionalConfirm("8b") - let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1)) - " However, what actually started this part looks like it was a function - " definition, so we need to indent to that line instead. This is - " actually pretty weak at the moment. - if prevCompleteLine =~ '=\s*$' - call scala#ConditionalConfirm("9b") - let ind = indent(prevnonblank(completeLine - 1)) - else - call scala#ConditionalConfirm("10b") - let ind = indent(completeLine) - endif - else - let lineCompletedBrackets = 1 - endif - endif - - if ind == originalIndentValue - let bracketCount = scala#CountBrackets(prevline, '(', ')') - if bracketCount > 0 || prevline =~ '.*(\s*$' - call scala#ConditionalConfirm("5a") - let ind = ind + shiftwidth() - elseif bracketCount < 0 - call scala#ConditionalConfirm("6a") - " if the closing brace actually completes the braces entirely, then we - " have to indent to line that started the whole thing - let completeLine = scala#LineCompletesBrackets('(', ')') - if completeLine != -1 && prevline !~ '^.*{\s*$' - call scala#ConditionalConfirm("8a") - let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1)) - " However, what actually started this part looks like it was a function - " definition, so we need to indent to that line instead. This is - " actually pretty weak at the moment. - if prevCompleteLine =~ '=\s*$' - call scala#ConditionalConfirm("9a") - let ind = indent(prevnonblank(completeLine - 1)) - else - call scala#ConditionalConfirm("10a") - let ind = indent(completeLine) - endif - else - " This is the only part that's different from from the '{', '}' one below - " Yup... some refactoring is necessary at some point. - let ind = ind + (bracketCount * shiftwidth()) - let lineCompletedBrackets = 1 - endif - endif - endif - - if curline =~ '^\s*}\?\s*\<else\>\%(\s\+\<if\>\s*(.*)\)\?\s*{\?\s*$' && - \ ! scala#LineIsCompleteIf(prevline) && - \ prevline !~ '^.*}\s*$' - let ind = ind - shiftwidth() - endif - - " Subtract a shiftwidth()' on '}' or html - let curCurlyCount = scala#CountCurlies(curline) - if curCurlyCount < 0 - call scala#ConditionalConfirm("14a") - let matchline = scala#CurlyMatcher() - return indent(matchline) - elseif curline =~ '^\s*</[a-zA-Z][^>]*>' - call scala#ConditionalConfirm("14c") - return ind - shiftwidth() - endif - - let prevParenCount = scala#CountParens(prevline) - if prevline =~ '^\s*\<for\>.*$' && prevParenCount > 0 - call scala#ConditionalConfirm("15") - let ind = indent(prevlnum) + 5 - endif - - let prevCurlyCount = scala#CountCurlies(prevline) - if prevCurlyCount == 0 && prevline =~ '^.*\%(=>\|⇒\)\s*$' && prevline !~ '^\s*this\s*:.*\%(=>\|⇒\)\s*$' && curline !~ '^\s*\<case\>' - call scala#ConditionalConfirm("16") - let ind = ind + shiftwidth() - endif - - if ind == originalIndentValue && curline =~ '^\s*\<case\>' - call scala#ConditionalConfirm("17") - let parentCase = scala#IsParentCase() - if parentCase != -1 - call scala#ConditionalConfirm("17a") - return indent(parentCase) - endif - endif - - if prevline =~ '^\s*\*/' - \ || prevline =~ '*/\s*$' - call scala#ConditionalConfirm("18") - let ind = ind - star_indent - endif - - if scala#LineEndsInIncomplete(prevline) - call scala#ConditionalConfirm("19") - return ind - endif - - if scala#LineIsAClosingXML(prevline) - if scala#LineCompletesXML(prevlnum, prevline) - call scala#ConditionalConfirm("20a") - return ind - shiftwidth() - else - call scala#ConditionalConfirm("20b") - return ind - endif - endif - - if ind == originalIndentValue - "let indentMultiplier = scala#LineCompletesDefValr(prevlnum, prevline) - "if indentMultiplier != 0 - " call scala#ConditionalConfirm("19a") - " let ind = ind - (indentMultiplier * shiftwidth()) - let defValrLine = scala#Test(prevlnum, prevline, '{', '}') - if defValrLine != -1 - call scala#ConditionalConfirm("21a") - let ind = indent(defValrLine) - elseif lineCompletedBrackets == 0 - call scala#ConditionalConfirm("21b") - if scala#GetLine(prevnonblank(prevlnum - 1)) =~ '^.*\<else\>\s*\%(//.*\)\?$' - call scala#ConditionalConfirm("21c") - let ind = ind - shiftwidth() - elseif scala#LineCompletesIfElse(prevlnum, prevline) - call scala#ConditionalConfirm("21d") - let ind = ind - shiftwidth() - elseif scala#CountParens(curline) < 0 && curline =~ '^\s*)' && scala#GetLine(scala#GetLineThatMatchesBracket('(', ')')) =~ '.*(\s*$' - " Handles situations that look like this: - " - " val a = func( - " 10 - " ) - " - " or - " - " val a = func( - " 10 - " ).somethingHere() - call scala#ConditionalConfirm("21e") - let ind = ind - shiftwidth() - endif - endif - endif - - call scala#ConditionalConfirm("returning " . ind) - - return ind -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:set sw=2 sts=2 ts=8 et: -" vim600:fdm=marker fdl=1 fdc=0: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1 " Vim indent file |