public AnnotationVisitor visitParameterAnnotation(final int parameter,
			final String desc, final boolean visible) {
		if (!ClassReader.ANNOTATIONS) {
			return null;
		}
		ByteVector bv = new ByteVector();
		if ("Ljava/lang/Synthetic;".equals(desc)) {
			// workaround for a bug in javac with synthetic parameters
			// see ClassReader.readParameterAnnotations
			synthetics = Math.max(synthetics, parameter + 1);
			return new AnnotationWriter(cw, false, bv, null, 0);
		}
		// write type, and reserve space for values count
		bv.putShort(cw.newUTF8(desc)).putShort(0);
		AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
		if (visible) {
			if (panns == null) {
				panns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
			}
			aw.next = panns[parameter];
			panns[parameter] = aw;
		} else {
			if (ipanns == null) {
				ipanns = new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
			}
			aw.next = ipanns[parameter];
			ipanns[parameter] = aw;
		}
		return aw;
	}