| /* |
| * Copyright 2000-2013 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.lexer; |
| |
| import com.intellij.psi.tree.IElementType; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| /** |
| * Interface for breaking a file into a sequence of tokens. |
| * @see LexerBase for certain methods' implementation |
| */ |
| public abstract class Lexer { |
| |
| /** |
| * Prepare for lexing character data from <code>buffer</code> passed. Internal lexer state is supposed to be <code>initialState</code>. It is guaranteed |
| * that the value of initialState has been returned by {@link #getState()} method of this <code>Lexer</code> at condition <code>startOffset=getTokenStart()</code> |
| * This method is used to incrementally relex changed characters using lexing data acquired from this particular lexer sometime in the past. |
| * |
| * @param buffer character data for lexing. |
| * @param startOffset offset to start lexing from |
| * @param endOffset offset to stop lexing at |
| * @param initialState the initial state of the lexer. |
| * @since IDEA 7 |
| */ |
| public abstract void start(@NotNull CharSequence buffer, int startOffset, int endOffset, int initialState); |
| |
| public final void start(@NotNull CharSequence buf, int start, int end) { |
| start(buf, start, end, 0); |
| } |
| |
| public final void start(@NotNull CharSequence buf) { |
| start(buf, 0, buf.length(), 0); |
| } |
| |
| @NotNull |
| public CharSequence getTokenSequence() { |
| return getBufferSequence().subSequence(getTokenStart(), getTokenEnd()); |
| } |
| |
| @NotNull |
| public String getTokenText() { |
| return getTokenSequence().toString(); |
| } |
| |
| /** |
| * Returns the current state of the lexer. |
| * |
| * @return the lexer state. |
| */ |
| public abstract int getState(); |
| |
| /** |
| * Returns the token at the current position of the lexer or <code>null</code> if lexing is finished. |
| * |
| * @return the current token. |
| */ |
| @Nullable |
| public abstract IElementType getTokenType(); |
| |
| /** |
| * Returns the start offset of the current token. |
| * |
| * @return the current token start offset. |
| */ |
| public abstract int getTokenStart(); |
| |
| /** |
| * Returns the end offset of the current token. |
| * |
| * @return the current token end offset. |
| */ |
| |
| public abstract int getTokenEnd(); |
| |
| /** |
| * Advances the lexer to the next token. |
| */ |
| public abstract void advance(); |
| |
| /** |
| * Returns the current position and state of the lexer. |
| * |
| * @return the lexer position and state. |
| */ |
| @NotNull |
| public abstract LexerPosition getCurrentPosition(); |
| |
| /** |
| * Restores the lexer to the specified state and position. |
| * |
| * @param position the state and position to restore to. |
| */ |
| public abstract void restore(@NotNull LexerPosition position); |
| |
| /** |
| * Returns the buffer sequence over which the lexer is running. This method should return the |
| * same buffer instance which was passed to the <code>start()</code> method. |
| * @return the lexer buffer. |
| * @since IDEA 7 |
| */ |
| @NotNull |
| public abstract CharSequence getBufferSequence(); |
| |
| /** |
| * Returns the offset at which the lexer will stop lexing. This method should return |
| * the length of the buffer or the value passed in the <code>endOffset</code> parameter |
| * to the <code>start()</code> method. |
| * |
| * @return the lexing end offset |
| */ |
| public abstract int getBufferEnd(); |
| } |