/******************************************************************************* * Copyright (c) 2000, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.jsdt.internal.corext.javadoc; import org.eclipse.wst.jsdt.core.IBuffer; import org.eclipse.wst.jsdt.core.formatter.IndentManipulation; import org.eclipse.wst.jsdt.internal.ui.text.html.SingleCharReader; /** * Reads a java doc comment from a java doc comment. Skips star-character * on begin of line */ public class JavaDocCommentReader extends SingleCharReader { private IBuffer fBuffer; private int fCurrPos; private int fStartPos; private int fEndPos; private boolean fWasNewLine; public JavaDocCommentReader(IBuffer buf, int start, int end) { fBuffer= buf; fStartPos= start + 3; fEndPos= end - 2; reset(); } public JavaDocCommentReader(IBuffer buf, int end) { fBuffer= buf; fStartPos = fEndPos = end; fStartPos = rewind(); if (fStartPos >= 0) reset(); else fCurrPos = fEndPos; } /** * @see java.io.Reader#read() */ public int read() { if (fCurrPos < fEndPos) { char ch; if (fWasNewLine) { do { ch= fBuffer.getChar(fCurrPos++); } while (fCurrPos < fEndPos && Character.isWhitespace(ch)); if (ch == '*') { if (fCurrPos < fEndPos) { do { ch= fBuffer.getChar(fCurrPos++); } while (ch == '*'); } else { return -1; } } } else { ch= fBuffer.getChar(fCurrPos++); } fWasNewLine= IndentManipulation.isLineDelimiterChar(ch); return ch; } return -1; } /** * @see java.io.Reader#close() */ public void close() { fBuffer= null; } /** * @see java.io.Reader#reset() */ public void reset() { fCurrPos= fStartPos; fWasNewLine= true; } private int rewind() { if (fEndPos > 4) { char ch; // skip whitespace before the name do { ch = fBuffer.getChar(fStartPos--); } while (fStartPos > 4 && Character.isWhitespace(ch)); // skip keyword if present if (ch != 'r' && ch != '/') return -1; ch = fBuffer.getChar(fStartPos--); if (ch != 'a' && ch != '*') return -1; if (ch == '*') fStartPos += 2; else { ch = fBuffer.getChar(fStartPos--); if (ch != 'v') return -1; } // skip before any trailing whitespace do { ch = fBuffer.getChar(fStartPos--); } while (fStartPos > 4 && Character.isWhitespace(ch)); // found a possible block comment end if (fStartPos > 4) { if (ch == '/' && fBuffer.getChar(fStartPos) == '*') { fEndPos = fStartPos - 1; while (fStartPos > 2 && (fBuffer.getChar(fStartPos - 1) != '/' || fBuffer.getChar(fStartPos) != '*')) { fStartPos--; } if (fBuffer.getChar(fStartPos - 1) == '/' || fBuffer.getChar(fStartPos) == '*') { return fStartPos; } } } } return -1; } /** * Returns the offset of the last read character in the passed buffer. */ public int getOffset() { return fCurrPos; } }