xref: /vim-8.2.3635/runtime/indent/java.vim (revision b982ca5c)
1071d4279SBram Moolenaar" Vim indent file
2071d4279SBram Moolenaar" Language:	Java
33fdfa4a9SBram Moolenaar" Maintainer:	Toby Allsopp <[email protected]> (resigned)
4*b982ca5cSBram Moolenaar" Last Change:	2005 Mar 28
5071d4279SBram Moolenaar
6071d4279SBram Moolenaar" Only load this indent file when no other was loaded.
7071d4279SBram Moolenaarif exists("b:did_indent")
8071d4279SBram Moolenaar  finish
9071d4279SBram Moolenaarendif
10071d4279SBram Moolenaarlet b:did_indent = 1
11071d4279SBram Moolenaar
12071d4279SBram Moolenaar" Indent Java anonymous classes correctly.
13*b982ca5cSBram Moolenaarsetlocal cindent cinoptions& cinoptions+=j1
14071d4279SBram Moolenaar
15071d4279SBram Moolenaar" The "extends" and "implements" lines start off with the wrong indent.
16071d4279SBram Moolenaarsetlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements
17071d4279SBram Moolenaar
18071d4279SBram Moolenaar" Set the function to do the work.
19071d4279SBram Moolenaarsetlocal indentexpr=GetJavaIndent()
20071d4279SBram Moolenaar
21*b982ca5cSBram Moolenaarlet b:undo_indent = "set cin< cino< indentkeys< indentexpr<"
22*b982ca5cSBram Moolenaar
23071d4279SBram Moolenaar" Only define the function once.
24071d4279SBram Moolenaarif exists("*GetJavaIndent")
25071d4279SBram Moolenaar  finish
26071d4279SBram Moolenaarendif
27071d4279SBram Moolenaar
28071d4279SBram Moolenaarfunction! SkipJavaBlanksAndComments(startline)
29071d4279SBram Moolenaar  let lnum = a:startline
30071d4279SBram Moolenaar  while lnum > 1
31071d4279SBram Moolenaar    let lnum = prevnonblank(lnum)
32071d4279SBram Moolenaar    if getline(lnum) =~ '\*/\s*$'
33071d4279SBram Moolenaar      while getline(lnum) !~ '/\*' && lnum > 1
34071d4279SBram Moolenaar        let lnum = lnum - 1
35071d4279SBram Moolenaar      endwhile
36071d4279SBram Moolenaar      if getline(lnum) =~ '^\s*/\*'
37071d4279SBram Moolenaar        let lnum = lnum - 1
38071d4279SBram Moolenaar      else
39071d4279SBram Moolenaar        break
40071d4279SBram Moolenaar      endif
41071d4279SBram Moolenaar    elseif getline(lnum) =~ '^\s*//'
42071d4279SBram Moolenaar      let lnum = lnum - 1
43071d4279SBram Moolenaar    else
44071d4279SBram Moolenaar      break
45071d4279SBram Moolenaar    endif
46071d4279SBram Moolenaar  endwhile
47071d4279SBram Moolenaar  return lnum
48071d4279SBram Moolenaarendfunction
49071d4279SBram Moolenaar
50071d4279SBram Moolenaarfunction GetJavaIndent()
51071d4279SBram Moolenaar
52071d4279SBram Moolenaar  " Java is just like C; use the built-in C indenting and then correct a few
53071d4279SBram Moolenaar  " specific cases.
54071d4279SBram Moolenaar  let theIndent = cindent(v:lnum)
55071d4279SBram Moolenaar
56071d4279SBram Moolenaar  " If we're in the middle of a comment then just trust cindent
57071d4279SBram Moolenaar  if getline(v:lnum) =~ '^\s*\*'
58071d4279SBram Moolenaar    return theIndent
59071d4279SBram Moolenaar  endif
60071d4279SBram Moolenaar
61071d4279SBram Moolenaar  " find start of previous line, in case it was a continuation line
62071d4279SBram Moolenaar  let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
63071d4279SBram Moolenaar  let prev = lnum
64071d4279SBram Moolenaar  while prev > 1
65071d4279SBram Moolenaar    let next_prev = SkipJavaBlanksAndComments(prev - 1)
66071d4279SBram Moolenaar    if getline(next_prev) !~ ',\s*$'
67071d4279SBram Moolenaar      break
68071d4279SBram Moolenaar    endif
69071d4279SBram Moolenaar    let prev = next_prev
70071d4279SBram Moolenaar  endwhile
71071d4279SBram Moolenaar
72071d4279SBram Moolenaar  " Try to align "throws" lines for methods and "extends" and "implements" for
73071d4279SBram Moolenaar  " classes.
74071d4279SBram Moolenaar  if getline(v:lnum) =~ '^\s*\(extends\|implements\)\>'
75071d4279SBram Moolenaar        \ && getline(lnum) !~ '^\s*\(extends\|implements\)\>'
76071d4279SBram Moolenaar    let theIndent = theIndent + &sw
77071d4279SBram Moolenaar  endif
78071d4279SBram Moolenaar
79071d4279SBram Moolenaar  " correct for continuation lines of "throws", "implements" and "extends"
80071d4279SBram Moolenaar  let cont_kw = matchstr(getline(prev),
81071d4279SBram Moolenaar        \ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$')
82071d4279SBram Moolenaar  if strlen(cont_kw) > 0
83071d4279SBram Moolenaar    let amount = strlen(cont_kw) + 1
84071d4279SBram Moolenaar    if getline(lnum) !~ ',\s*$'
85071d4279SBram Moolenaar      let theIndent = theIndent - (amount + &sw)
86071d4279SBram Moolenaar      if theIndent < 0
87071d4279SBram Moolenaar        let theIndent = 0
88071d4279SBram Moolenaar      endif
89071d4279SBram Moolenaar    elseif prev == lnum
90071d4279SBram Moolenaar      let theIndent = theIndent + amount
91071d4279SBram Moolenaar      if cont_kw ==# 'throws'
92071d4279SBram Moolenaar        let theIndent = theIndent + &sw
93071d4279SBram Moolenaar      endif
94071d4279SBram Moolenaar    endif
95071d4279SBram Moolenaar  elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>'
96071d4279SBram Moolenaar        \ && (getline(prev) =~ '{\s*$'
97071d4279SBram Moolenaar        \  || getline(v:lnum) =~ '^\s*{\s*$')
98071d4279SBram Moolenaar    let theIndent = theIndent - &sw
99071d4279SBram Moolenaar  endif
100071d4279SBram Moolenaar
101071d4279SBram Moolenaar  " When the line starts with a }, try aligning it with the matching {,
102071d4279SBram Moolenaar  " skipping over "throws", "extends" and "implements" clauses.
103071d4279SBram Moolenaar  if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$'
104071d4279SBram Moolenaar    call cursor(v:lnum, 1)
105071d4279SBram Moolenaar    silent normal %
106071d4279SBram Moolenaar    let lnum = line('.')
107071d4279SBram Moolenaar    if lnum < v:lnum
108071d4279SBram Moolenaar      while lnum > 1
109071d4279SBram Moolenaar        let next_lnum = SkipJavaBlanksAndComments(lnum - 1)
110071d4279SBram Moolenaar        if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
111071d4279SBram Moolenaar              \ && getline(next_lnum) !~ ',\s*$'
112071d4279SBram Moolenaar          break
113071d4279SBram Moolenaar        endif
114071d4279SBram Moolenaar        let lnum = prevnonblank(next_lnum)
115071d4279SBram Moolenaar      endwhile
116071d4279SBram Moolenaar      return indent(lnum)
117071d4279SBram Moolenaar    endif
118071d4279SBram Moolenaar  endif
119071d4279SBram Moolenaar
120071d4279SBram Moolenaar  " Below a line starting with "}" never indent more.  Needed for a method
121071d4279SBram Moolenaar  " below a method with an indented "throws" clause.
122071d4279SBram Moolenaar  let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
123071d4279SBram Moolenaar  if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent
124071d4279SBram Moolenaar    let theIndent = indent(lnum)
125071d4279SBram Moolenaar  endif
126071d4279SBram Moolenaar
127071d4279SBram Moolenaar  return theIndent
128071d4279SBram Moolenaarendfunction
129071d4279SBram Moolenaar
130071d4279SBram Moolenaar" vi: sw=2 et
131