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