/* * annotationEntry * : SimpleName{"."} typeArguments? valueArguments? * ; */ private void parseAnnotationEntry() { assert _at(IDENTIFIER); PsiBuilder.Marker attribute = mark(); PsiBuilder.Marker reference = mark(); PsiBuilder.Marker typeReference = mark(); parseUserType(); typeReference.done(TYPE_REFERENCE); reference.done(CONSTRUCTOR_CALLEE); parseTypeArgumentList(); if (at(LPAR)) { myExpressionParsing.parseValueArgumentList(); } attribute.done(ANNOTATION_ENTRY); }
/* * userType * : ("namespace" ".")? simpleUserType{"."} * ; */ void parseUserType() { PsiBuilder.Marker userType = mark(); if (at(PACKAGE_KEYWORD)) { advance(); // PACKAGE_KEYWORD expect(DOT, "Expecting '.'", TokenSet.create(IDENTIFIER)); } PsiBuilder.Marker reference = mark(); while (true) { if (expect( IDENTIFIER, "Expecting type name", TokenSet.orSet( JetExpressionParsing.EXPRESSION_FIRST, JetExpressionParsing.EXPRESSION_FOLLOW))) { reference.done(REFERENCE_EXPRESSION); } else { reference.drop(); break; } parseTypeArgumentList(); if (!at(DOT)) { break; } if (lookahead(1) == LPAR) { // This may be a receiver for a function type // Int.(Int) -> Int break; } PsiBuilder.Marker precede = userType.precede(); userType.done(USER_TYPE); userType = precede; advance(); // DOT reference = mark(); } userType.done(USER_TYPE); }