update copyrights
[fedora-idea.git] / platform / lang-api / src / com / intellij / lexer / DocCommentLexer.java
blobf5072c1b8fd4813879af8c7d4c7f32515d747d05
1 /*
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;
37 private int myState;
38 private IElementType myTokenType;
39 private boolean myAfterLineBreak;
40 private boolean myInLeadingSpace;
42 public AsteriskStripperLexer(final _JavaDocLexer flex, final DocCommentTokenTypes tokenTypes) {
43 myFlex = flex;
44 myTokenTypes = tokenTypes;
47 public final void start(CharSequence buffer, int startOffset, int endOffset, int initialState) {
48 myBuffer = buffer;
49 myBufferIndex = startOffset;
50 myBufferEndOffset = endOffset;
51 myTokenType = null;
52 myTokenEndOffset = startOffset;
53 myFlex.reset(myBuffer, startOffset, endOffset, initialState);
56 public int getState() {
57 return myState;
60 public CharSequence getBufferSequence() {
61 return myBuffer;
64 public int getBufferEnd() {
65 return myBufferEndOffset;
68 public final IElementType getTokenType() {
69 locateToken();
70 return myTokenType;
73 public final int getTokenStart() {
74 locateToken();
75 return myBufferIndex;
78 public final int getTokenEnd() {
79 locateToken();
80 return myTokenEndOffset;
84 public final void advance() {
85 locateToken();
86 myTokenType = null;
89 protected final void locateToken() {
90 if (myTokenType != null) return;
91 _locateToken();
93 if (myTokenType == myTokenTypes.space()) {
94 myAfterLineBreak = CharArrayUtil.containLineBreaks(myBuffer, getTokenStart(), getTokenEnd());
98 private void _locateToken() {
99 if (myTokenEndOffset == myBufferEndOffset) {
100 myTokenType = null;
101 myBufferIndex = myBufferEndOffset;
102 return;
105 myBufferIndex = myTokenEndOffset;
107 if (myAfterLineBreak) {
108 myAfterLineBreak = false;
109 while (myTokenEndOffset < myBufferEndOffset && myBuffer.charAt(myTokenEndOffset) == '*' &&
110 (myTokenEndOffset + 1 >= myBufferEndOffset || myBuffer.charAt(myTokenEndOffset + 1) != '/')) {
111 myTokenEndOffset++;
114 myInLeadingSpace = true;
115 if (myBufferIndex < myTokenEndOffset) {
116 myTokenType = myTokenTypes.commentLeadingAsterisks();
117 return;
121 if (myInLeadingSpace) {
122 myInLeadingSpace = false;
123 boolean lf = false;
124 while (myTokenEndOffset < myBufferEndOffset && Character.isWhitespace(myBuffer.charAt(myTokenEndOffset))) {
125 if (myBuffer.charAt(myTokenEndOffset) == '\n') lf = true;
126 myTokenEndOffset++;
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();
143 return;
147 flexLocateToken();
150 private void flexLocateToken() {
151 try {
152 myState = myFlex.yystate();
153 myFlex.goTo(myBufferIndex);
154 myTokenType = myFlex.advance();
155 myTokenEndOffset = myFlex.getTokenEnd();
157 catch (IOException e) {
158 // Can't be