2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.lexer
;
18 import com
.intellij
.psi
.tree
.IElementType
;
19 import com
.intellij
.psi
.tree
.TokenSet
;
20 import com
.intellij
.util
.text
.CharArrayUtil
;
22 import java
.io
.IOException
;
24 public class DocCommentLexer
extends MergingLexerAdapter
{
25 public DocCommentLexer(final DocCommentTokenTypes tokenTypes
, final boolean isJdk15Enabled
) {
26 super(new AsteriskStripperLexer(new _JavaDocLexer(isJdk15Enabled
, tokenTypes
), tokenTypes
),
27 TokenSet
.create(tokenTypes
.commentData(), tokenTypes
.space()));
30 private static class AsteriskStripperLexer
extends LexerBase
{
31 private final _JavaDocLexer myFlex
;
32 private final DocCommentTokenTypes myTokenTypes
;
33 private CharSequence myBuffer
;
34 private int myBufferIndex
;
35 private int myBufferEndOffset
;
36 private int myTokenEndOffset
;
38 private IElementType myTokenType
;
39 private boolean myAfterLineBreak
;
40 private boolean myInLeadingSpace
;
42 public AsteriskStripperLexer(final _JavaDocLexer flex
, final DocCommentTokenTypes tokenTypes
) {
44 myTokenTypes
= tokenTypes
;
47 public final void start(CharSequence buffer
, int startOffset
, int endOffset
, int initialState
) {
49 myBufferIndex
= startOffset
;
50 myBufferEndOffset
= endOffset
;
52 myTokenEndOffset
= startOffset
;
53 myFlex
.reset(myBuffer
, startOffset
, endOffset
, initialState
);
56 public int getState() {
60 public CharSequence
getBufferSequence() {
64 public int getBufferEnd() {
65 return myBufferEndOffset
;
68 public final IElementType
getTokenType() {
73 public final int getTokenStart() {
78 public final int getTokenEnd() {
80 return myTokenEndOffset
;
84 public final void advance() {
89 protected final void locateToken() {
90 if (myTokenType
!= null) return;
93 if (myTokenType
== myTokenTypes
.space()) {
94 myAfterLineBreak
= CharArrayUtil
.containLineBreaks(myBuffer
, getTokenStart(), getTokenEnd());
98 private void _locateToken() {
99 if (myTokenEndOffset
== myBufferEndOffset
) {
101 myBufferIndex
= myBufferEndOffset
;
105 myBufferIndex
= myTokenEndOffset
;
107 if (myAfterLineBreak
) {
108 myAfterLineBreak
= false;
109 while (myTokenEndOffset
< myBufferEndOffset
&& myBuffer
.charAt(myTokenEndOffset
) == '*' &&
110 (myTokenEndOffset
+ 1 >= myBufferEndOffset
|| myBuffer
.charAt(myTokenEndOffset
+ 1) != '/')) {
114 myInLeadingSpace
= true;
115 if (myBufferIndex
< myTokenEndOffset
) {
116 myTokenType
= myTokenTypes
.commentLeadingAsterisks();
121 if (myInLeadingSpace
) {
122 myInLeadingSpace
= false;
124 while (myTokenEndOffset
< myBufferEndOffset
&& Character
.isWhitespace(myBuffer
.charAt(myTokenEndOffset
))) {
125 if (myBuffer
.charAt(myTokenEndOffset
) == '\n') lf
= true;
129 final int state
= myFlex
.yystate();
130 if (state
== _JavaDocLexer
.COMMENT_DATA
||
131 myTokenEndOffset
< myBufferEndOffset
&& (myBuffer
.charAt(myTokenEndOffset
) == '@' ||
132 myBuffer
.charAt(myTokenEndOffset
) == '{' ||
133 myBuffer
.charAt(myTokenEndOffset
) == '\"' ||
134 myBuffer
.charAt(myTokenEndOffset
) == '<')) {
135 myFlex
.yybegin(_JavaDocLexer
.COMMENT_DATA_START
);
138 if (myBufferIndex
< myTokenEndOffset
) {
139 myTokenType
= lf
|| state
== _JavaDocLexer
.PARAM_TAG_SPACE
|| state
== _JavaDocLexer
.TAG_DOC_SPACE
|| state
== _JavaDocLexer
.INLINE_TAG_NAME
|| state
== _JavaDocLexer
.DOC_TAG_VALUE_IN_PAREN
140 ? myTokenTypes
.space()
141 : myTokenTypes
.commentData();
150 private void flexLocateToken() {
152 myState
= myFlex
.yystate();
153 myFlex
.goTo(myBufferIndex
);
154 myTokenType
= myFlex
.advance();
155 myTokenEndOffset
= myFlex
.getTokenEnd();
157 catch (IOException e
) {