Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2009, 2012 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.internal.core;
 
 
 public class JavadocContents {
 	private static final int[] UNKNOWN_FORMAT = new int[0]; 
 	
 	private BinaryType type;
 	private char[] content;
 	
 	private int childrenStart;
 	
 	private boolean hasComputedChildrenSections = false;
 	private int indexOfFieldDetails;
 	private int indexOfConstructorDetails;
 	private int indexOfMethodDetails;
 	private int indexOfEndOfClassData;
 	
 	private int indexOfFieldsBottom;
 	private int indexOfAllMethodsTop;
 	private int indexOfAllMethodsBottom;
 	
 	private int[] typeDocRange;
 	
 	private int[] fieldAnchorIndexes;
 	private int fieldAnchorIndexesCount;
 	private int fieldLastAnchorFoundIndex;
 	private int[] methodAnchorIndexes;
 	private int methodAnchorIndexesCount;
 	private int[] unknownFormatAnchorIndexes;
 	private int[] tempAnchorIndexes;
 	private int tempAnchorIndexesCount;
 	private int tempLastAnchorFoundIndex;
 	
 	public JavadocContents(BinaryType typeString content) {
 		this(content);
 		this. = type;
 	}
 	
 	public JavadocContents(String content) {
 		this. = content != null ? content.toCharArray() : null;
 	}
 	/*
 	 * Returns the part of the javadoc that describe the type
 	 */
 	public String getTypeDoc() throws JavaModelException {
 		if (this. == nullreturn null;
 		
 		synchronized (this) {
 			if (this. == null) {
 			}
 		}
 		
 		if (this. != null) {
 			return String.valueOf(CharOperation.subarray(this.this.[0], this.[1]));
 		}
 		return null;
 	}
 	
 	public String getPackageDoc() throws JavaModelException {
 		if (this. == nullreturn null;
 		int[] range = null;
 		int index = CharOperation.indexOf(.this.false, 0);
 		if (index == -1) return null;
 		index = CharOperation.indexOf(.this.falseindex);
 		if (index == -1) return null;
 		
 		int start = CharOperation.indexOf(.this.falseindex);
 		if (start != -1) {
 			start = CharOperation.indexOf(.this.falsestart);
 			if (start != -1) index = start + .;
 		}
		if (index != -1) {
			int end = CharOperation.indexOf(.this.falseindex);
			if (end == -1) end = this..length -1;
			range = new int[]{indexend};
			return String.valueOf(CharOperation.subarray(this.range[0], range[1]));
		}
		return null;
	}
	/*
	 * Returns the part of the javadoc that describe a field of the type
	 */
	public String getFieldDoc(IField childthrows JavaModelException {
		if (this. == nullreturn null;
		int[] range = null;
		synchronized (this) {
			if (this. == null) {
else {
				range = this..get(child);
			}
			if (range == null) {
				range = computeFieldRange(child);
				this..put(childrange);
			}
		}
		if (range != null) {
			return String.valueOf(CharOperation.subarray(this.range[0], range[1]));
		}
		return null;
	}
	/*
	 * Returns the part of the javadoc that describe a method of the type
	 */
	public String getMethodDoc(IMethod childthrows JavaModelException {
		if (this. == nullreturn null;
		int[] range = null;
		synchronized (this) {
			if (this. == null) {
else {
				range = this..get(child);
			}
			if (range == null) {
				range = computeMethodRange(child);
				this..put(childrange);
			}
		}
		if (range != null) {
			if (range == ) {
			}
			return String.valueOf(CharOperation.subarray(this.range[0], range[1]));
		}
		return null;
	}
	/*
	 * Compute the ranges of the parts of the javadoc that describe each method of the type
	 */
	private int[] computeChildRange(char[] anchorint indexOfSectionBottomthrows JavaModelException {
		// checks each known anchor locations
		if (this. > 0) {
			for (int i = 0; i < this.i++) {
				int anchorEndStart = this.[i];
				if (anchorEndStart != -1 && CharOperation.prefixEquals(anchorthis.falseanchorEndStart)) {
					this.[i] = -1;
					return computeChildRange(anchorEndStartanchorindexOfSectionBottom);
				}
			}
		}
		int fromIndex = this.;
		int index;
		// check each next unknown anchor locations
		while ((index = CharOperation.indexOf(.this.falsefromIndex)) != -1 && (index < indexOfSectionBottom || indexOfSectionBottom == -1)) {
			fromIndex = index + 1;
			int anchorEndStart = index + .;
			this. = anchorEndStart;
			if (CharOperation.prefixEquals(anchorthis.falseanchorEndStart)) {
				return computeChildRange(anchorEndStartanchorindexOfSectionBottom);
else {
				if (this..length == this.) {
					System.arraycopy(this., 0, this. = new int[this. + 20], 0, this.);
				}
				this.[this.++] = anchorEndStart;
			}
		}
		return null;
	}
	private int[] computeChildRange(int anchorEndStartchar[] anchorint indexOfBottom) {
		int[] range = null;
		// try to find the bottom of the section
		if (indexOfBottom != -1) {
			// try to find the end of the anchor
			int indexOfEndLink = CharOperation.indexOf(.this.falseanchorEndStart + anchor.length);
			if (indexOfEndLink != -1) {
				// try to find the next anchor
				int indexOfNextElement = CharOperation.indexOf(.this.falseindexOfEndLink);
				int javadocStart = indexOfEndLink + .;
				int javadocEnd = indexOfNextElement == -1 ? indexOfBottom : Math.min(indexOfNextElementindexOfBottom);
				range = new int[]{javadocStartjavadocEnd};
else {
				// the anchor has no suffix
				range = ;
			}
else {
			// the detail section has no bottom
			range = ;
		}
		return range;
	}
	private void computeChildrenSections() {
		// try to find the next separator part
		int lastIndex = CharOperation.indexOf(.this.falsethis.);
		lastIndex = lastIndex == -1 ? this. : lastIndex;
		// try to find field detail start
		this. = CharOperation.indexOf(.this.falselastIndex);
		lastIndex = this. == -1 ? lastIndex : this.;
		// try to find constructor detail start
		this. = CharOperation.indexOf(.this.falselastIndex);
		lastIndex = this. == -1 ? lastIndex : this.;
		// try to find method detail start
		this. = CharOperation.indexOf(.this.falselastIndex);
		lastIndex = this. == -1 ? lastIndex : this.;
		// we take the end of class data
		this. = CharOperation.indexOf(.this.falselastIndex);
		// try to find the field detail end
	}
	/*
	 * Compute the ranges of the parts of the javadoc that describe each child of the type (fields, methods)
	 */
	private int[] computeFieldRange(IField fieldthrows JavaModelException {
		}
		StringBuffer buffer = new StringBuffer(field.getElementName());
		char[] anchor = String.valueOf(buffer).toCharArray();
		int[] range = null;
		if (this. == -1 || this. == -1) {
			// the detail section has no top or bottom, so the doc has an unknown format
			if (this. == null) {
				this. = new int[this..getChildren().length];
			}
			range = computeChildRange(anchorthis.);
else {
			if (this. == null) {
				this. = new int[this..getFields().length];
			}
			range = computeChildRange(anchorthis.);
		}
		return range;
	}
	/*
	 * Compute the ranges of the parts of the javadoc that describe each method of the type
	 */
	private int[] computeMethodRange(IMethod methodthrows JavaModelException {
		}
		int[] range = null;
		if (this. == -1 || this. == -1) {
			// the detail section has no top or bottom, so the doc has an unknown format
			if (this. == null) {
				this. = new int[this..getChildren().length];
			}
			range = computeChildRange(anchorthis.);
else {			
			if (this. == null) {
				this. = new int[this..getFields().length];
			}
		}
		return range;
	}
		String typeQualifiedName = null;
		if (this..isMember()) {
			IType currentType = this.;
			StringBuffer buffer = new StringBuffer();
			while (currentType != null) {
				buffer.insert(0, currentType.getElementName());
				currentType = currentType.getDeclaringType();
				if (currentType != null) {
					buffer.insert(0, '.');
				}
			}
			typeQualifiedName = new String(buffer.toString());
else {
			typeQualifiedName = this..getElementName();
		}
		String methodName = method.getElementName();
		if (method.isConstructor()) {
			methodName = typeQualifiedName;
		}
		char[] genericSignature = info.getGenericSignature();
		String anchor = null;
		if (genericSignature != null) {
			genericSignature = CharOperation.replaceOnCopy(genericSignature'/''.');
			anchor = Util.toAnchor(0, genericSignaturemethodName, Flags.isVarargs(method.getFlags()));
			if (anchor == nullthrow new JavaModelException(new JavaModelStatus(.method));
else {
			anchor = Signature.toString(method.getSignature().replace('/''.'), methodNamenulltruefalse, Flags.isVarargs(method.getFlags()));
		}
		IType declaringType = this.;
		if (declaringType.isMember()) {
			// might need to remove a part of the signature corresponding to the synthetic argument (only for constructor)
			if (method.isConstructor() && !Flags.isStatic(declaringType.getFlags())) {
				int indexOfOpeningParen = anchor.indexOf('(');
				if (indexOfOpeningParen == -1) {
					// should not happen as this is a method signature
					return null;
				}
				int index = indexOfOpeningParen;
				indexOfOpeningParen++;
				int indexOfComma = anchor.indexOf(','index);
				if (indexOfComma != -1) {
					index = indexOfComma + 2;
else {
					// no argument, but a synthetic argument
					index = anchor.indexOf(')'index);
				}
				anchor = anchor.substring(0, indexOfOpeningParen) + anchor.substring(index);
			}
		}
	}
	/*
	 * Compute the range of the part of the javadoc that describe the type
	 */
	private void computeTypeRange() throws JavaModelException {
		final int indexOfStartOfClassData = CharOperation.indexOf(.this.false);
		if (indexOfStartOfClassData == -1) {
			return;
		}
		int indexOfNextSeparator = CharOperation.indexOf(.this.falseindexOfStartOfClassData);
		if (indexOfNextSeparator == -1) {
			return;
		}
		int indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
		if (indexOfNextSummary == -1 && this..isEnum()) {
			// try to find enum constant summary start
			indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
		}
		if (indexOfNextSummary == -1 && this..isAnnotation()) {
			// try to find required enum constant summary start
			indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
			if (indexOfNextSummary == -1) {
				// try to find optional enum constant summary start
				indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
			}
		}
		if (indexOfNextSummary == -1) {
			// try to find field summary start
			indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
		}
		if (indexOfNextSummary == -1) {
			// try to find constructor summary start
			indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
		}
		if (indexOfNextSummary == -1) {
			// try to find method summary start
			indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
		}
		if (indexOfNextSummary == -1) {
			// we take the end of class data
			indexOfNextSummary = CharOperation.indexOf(.this.falseindexOfNextSeparator);
else {
			// improve performance of computation of children ranges
			this. = indexOfNextSummary + 1;
		}
		if (indexOfNextSummary == -1) {
			return;
		}
		/*
		 * Check out to cut off the hierarchy see 119844
		 * We remove what the contents between the start of class data and the first <P>
		 */
		int start = indexOfStartOfClassData + .;
		int indexOfFirstParagraph = CharOperation.indexOf("<P>".toCharArray(), this.falsestart); //$NON-NLS-1$
		if (indexOfFirstParagraph != -1 && indexOfFirstParagraph < indexOfNextSummary) {
			start = indexOfFirstParagraph;
		}
		this. = new int[]{startindexOfNextSummary};
	}
New to GrepCode? Check out our FAQ X