void (final PsiBuilder builder) { PsiBuilder.Marker list = builder.mark(); if (!expect(builder, JavaTokenType.LPARENTH)) { done(list, myJavaElementTypeContainer.ANNOTATION_PARAMETER_LIST, myWhiteSpaceAndCommentSetHolder); return; } if (expect(builder, JavaTokenType.RPARENTH)) { done(list, myJavaElementTypeContainer.ANNOTATION_PARAMETER_LIST, myWhiteSpaceAndCommentSetHolder); return; } final boolean isFirstParamNamed = parseAnnotationParameter(builder, true); boolean isFirstParamWarned = false; boolean afterBad = false; while (true) { final IElementType tokenType = builder.getTokenType(); if (tokenType == null) { error(builder, JavaPsiBundle.message("expected.parameter")); break; } else if (expect(builder, JavaTokenType.RPARENTH)) { break; } else if (tokenType == JavaTokenType.COMMA) { final PsiBuilder.Marker errorStart = builder.mark(); final PsiBuilder.Marker errorEnd = builder.mark(); builder.advanceLexer(); final boolean hasParamName = parseAnnotationParameter(builder, false); if (!isFirstParamNamed && hasParamName && !isFirstParamWarned) { errorStart.errorBefore(JavaPsiBundle.message("annotation.name.is.missing"), errorEnd); isFirstParamWarned = true; } else { errorStart.drop(); } errorEnd.drop(); } else if (!afterBad) { error(builder, JavaPsiBundle.message("expected.comma.or.rparen")); builder.advanceLexer(); afterBad = true; } else { afterBad = false; parseAnnotationParameter(builder, false); } } done(list, myJavaElementTypeContainer.ANNOTATION_PARAMETER_LIST, myWhiteSpaceAndCommentSetHolder); }