blob: e510423b9c00723d1179a8f1a45a997034818b17 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.jdt.ui;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeHierarchy;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.corext.javadoc.JavaDocCommentReader;
import org.eclipse.jdt.internal.corext.util.MethodOverrideTester;
import org.eclipse.jdt.internal.ui.text.javadoc.JavaDoc2HTMLTextReader;
/**
* Helper needed to get the content of a Javadoc comment.
*
* <p>
* This class is not intended to be subclassed or instantiated by clients.
* </p>
*
* @since 3.1
*/
public class JavadocContentAccess {
private JavadocContentAccess() {
// do not instantiate
}
/**
* Gets a reader for an IMember's Javadoc comment content from the source attachment.
* The content does contain only the text from the comment without the Javadoc leading star characters.
* Returns <code>null</code> if the member does not contain a Javadoc comment or if no source is available.
* @param member The member to get the Javadoc of.
* @param allowInherited For methods with no (Javadoc) comment, the comment of the overridden class
* is returned if <code>allowInherited</code> is <code>true</code>.
* @return Returns a reader for the Javadoc comment content or <code>null</code> if the member
* does not contain a Javadoc comment or if no source is available
* @throws JavaModelException is thrown when the elements javadoc can not be accessed
*/
public static Reader getContentReader(IMember member, boolean allowInherited) throws JavaModelException {
IBuffer buf= member.getOpenable().getBuffer();
if (buf == null) {
return null; // no source attachment found
}
ISourceRange javadocRange= member.getJavadocRange();
if (javadocRange != null) {
JavaDocCommentReader reader= new JavaDocCommentReader(buf, javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength() - 1);
if (!containsOnlyInheritDoc(reader, javadocRange.getLength())) {
reader.reset();
return reader;
}
}
if (allowInherited && (member.getElementType() == IJavaElement.METHOD)) {
return findDocInHierarchy((IMethod) member);
}
return null;
}
/**
* Checks whether the given reader only returns
* the inheritDoc tag.
*
* @param reader the reader
* @param length the length of the underlying content
* @return <code>true</code> if the reader only returns the inheritDoc tag
* @since 3.2
*/
private static boolean containsOnlyInheritDoc(Reader reader, int length) {
char[] content= new char[length];
try {
reader.read(content, 0, length);
} catch (IOException e) {
return false;
}
return new String(content).trim().equals("{@inheritDoc}"); //$NON-NLS-1$
}
/**
* Gets a reader for an IMember's Javadoc comment content from the source attachment.
* and renders the tags in HTML.
* Returns <code>null</code> if the member does not contain a Javadoc comment or if no source is available.
*
* @param member the member to get the Javadoc of.
* @param allowInherited for methods with no (Javadoc) comment, the comment of the overridden
* class is returned if <code>allowInherited</code> is <code>true</code>
* @param useAttachedJavadoc if <code>true</code> Javadoc will be extracted from attached Javadoc
* if there's no source
* @return a reader for the Javadoc comment content in HTML or <code>null</code> if the member
* does not contain a Javadoc comment or if no source is available
* @throws JavaModelException is thrown when the elements Javadoc can not be accessed
* @since 3.2
*/
public static Reader getHTMLContentReader(IMember member, boolean allowInherited, boolean useAttachedJavadoc) throws JavaModelException {
Reader contentReader= getContentReader(member, allowInherited);
if (contentReader != null)
return new JavaDoc2HTMLTextReader(contentReader);
if (useAttachedJavadoc && member.getOpenable().getBuffer() == null) { // only if no source available
String s= member.getAttachedJavadoc(null);
if (s != null)
return new StringReader(s);
}
return null;
}
/**
* Gets a reader for an IMember's Javadoc comment content from the source attachment.
* and renders the tags in HTML.
* Returns <code>null</code> if the member does not contain a Javadoc comment or if no source is available.
*
* @param member The member to get the Javadoc of.
* @param allowInherited For methods with no (Javadoc) comment, the comment of the overridden class
* is returned if <code>allowInherited</code> is <code>true</code>.
* @return Returns a reader for the Javadoc comment content in HTML or <code>null</code> if the member
* does not contain a Javadoc comment or if no source is available
* @throws JavaModelException is thrown when the elements javadoc can not be accessed
* @deprecated As of 3.2, replaced by {@link #getHTMLContentReader(IMember, boolean, boolean)}
*/
public static Reader getHTMLContentReader(IMember member, boolean allowInherited) throws JavaModelException {
return getHTMLContentReader(member, allowInherited, false);
}
private static Reader findDocInHierarchy(IMethod method) throws JavaModelException {
IType type= method.getDeclaringType();
ITypeHierarchy hierarchy= type.newSupertypeHierarchy(null);
MethodOverrideTester tester= new MethodOverrideTester(type, hierarchy);
IType[] superTypes= hierarchy.getAllSupertypes(type);
for (int i= 0; i < superTypes.length; i++) {
IType curr= superTypes[i];
IMethod overridden= tester.findOverriddenMethodInType(curr, method);
if (overridden != null) {
Reader reader= getContentReader(overridden, false);
if (reader != null) {
return reader;
}
}
}
return null;
}
}