public class A {
	private void updateAnnotation() {
		while (this.astLengthPtr >= 0) {
			// Starting with the stack top, so get references (eg. Expression) coming from @see declarations
			if (this.astLengthPtr == 2) {
				int size = this.astLengthStack[this.astLengthPtr--];
			}
			// Then continuing with class names (eg. TypeReference) coming from @throw/@exception declarations
			else if (this.astLengthPtr == 1) {
				int size = this.astLengthStack[this.astLengthPtr--];
				if (size > 0) {
					this.annotation.thrownExceptions = new TypeReference[size];
					for (int i = (size - 1); i >= 0; i--) {
						this.annotation.thrownExceptions[i] = (TypeReference) this.astStack[astPtr--];
					}
				}
			}
			// Finally, finishing with parameters nales (ie. Argument) coming from @param declaration
			else if (this.astLengthPtr == 0) {
				int size = this.astLengthStack[this.astLengthPtr--];
				if (size > 0) {
					this.annotation.parameters = new AnnotationArgument[size];
					for (int i = (size - 1); i >= 0; i--) {
						this.annotation.parameters[i] = (AnnotationArgument) this.astStack[astPtr--];
					}
				}
			}
			// Flag all nodes got from other ast length stack pointer values as invalid....
			// TODO: (frederic) To be changed when mixed tags declaration will be accepted 
			else {
				int size = this.astLengthStack[this.astLengthPtr--];
				if (size > 0) {
					for (int i = 0; i < size; i++) {
						AstNode node = this.astStack[astPtr--];
						this.sourceParser.problemReporter()
								.annotationUnexpectedTag(node.sourceStart,
										node.sourceEnd);
					}
				}
			}
		}
	}
}