Skip to content

Fix record declarations nested in annotation declarations #4460

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,17 @@

package com.github.javaparser.ast.body;

import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.IntegerLiteralExpr;
import com.github.javaparser.ast.expr.SimpleName;
import com.github.javaparser.resolution.Navigator;
import com.github.javaparser.utils.TestParser;
import org.junit.jupiter.api.Test;

import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;

class AnnotationMemberDeclarationTest {
Expand Down Expand Up @@ -62,4 +68,23 @@ void removeDefaultValueWhenDefaultValueIsPresent() {

assertFalse(defaultValue.getParentNode().isPresent());
}

@Test
void annotationDeclarationShouldSupportRecordChild() {
CompilationUnit cu = TestParser.parseCompilationUnit(
ParserConfiguration.LanguageLevel.BLEEDING_EDGE,
"" +
"@interface Foo {\n" +
" record Bar(String s) {}\n" +
"}"
);

RecordDeclaration bar = cu.getAnnotationDeclarationByName("Foo").get().getMember(0).asRecordDeclaration();

assertEquals(1, bar.getParameters().size());

Parameter parameter = bar.getParameter(0);
assertEquals("String", parameter.getTypeAsString());
assertEquals("s", parameter.getNameAsString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,19 @@

package com.github.javaparser.printer.lexicalpreservation.transformations.ast.body;

import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
import com.github.javaparser.ast.body.RecordDeclaration;
import com.github.javaparser.ast.expr.IntegerLiteralExpr;
import com.github.javaparser.ast.expr.Name;
import com.github.javaparser.ast.expr.NormalAnnotationExpr;
import com.github.javaparser.printer.lexicalpreservation.AbstractLexicalPreservingTest;
import com.github.javaparser.utils.LineSeparator;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static com.github.javaparser.ast.Modifier.Keyword.PROTECTED;
Expand All @@ -41,6 +46,18 @@
*/
class AnnotationMemberDeclarationTransformationsTest extends AbstractLexicalPreservingTest {

private static final ParserConfiguration.LanguageLevel storedLanguageLevel = StaticJavaParser.getParserConfiguration().getLanguageLevel();

@BeforeEach
public void setLanguageLevel() {
StaticJavaParser.getParserConfiguration().setLanguageLevel(ParserConfiguration.LanguageLevel.BLEEDING_EDGE);
}

@AfterEach
public void resetLanguageLevel() {
StaticJavaParser.getParserConfiguration().setLanguageLevel(storedLanguageLevel);
}

protected AnnotationMemberDeclaration consider(String code) {
considerCode("@interface AD { " + code + " }");
return cu.getAnnotationDeclarationByName("AD").get().getMember(0).asAnnotationMemberDeclaration();
Expand Down Expand Up @@ -172,4 +189,11 @@ void replacingJavadoc() {
assertTransformedToString("@interface AD { /**Super extra cool this annotation!!!*/ int foo(); }", it.getParentNode().get());
}

@Test
void modifyingRecord() {
considerCode("@interface AD { record Bar(String s) {} }");
RecordDeclaration recordDecl = cu.getAnnotationDeclarationByName("AD").get().getMember(0).asRecordDeclaration();
recordDecl.setName("Baz");
assertTransformedToString("@interface AD { record Baz(String s) {} }", recordDecl.getParentNode().get());
}
}
8 changes: 8 additions & 0 deletions javaparser-core/src/main/javacc/java.jj
Original file line number Diff line number Diff line change
Expand Up @@ -5599,6 +5599,10 @@ NodeList<BodyDeclaration<?>> AnnotationTypeBody():
* (one of)
* Annotation public
* abstract
* ClassDeclaration:
* NormalClassDeclaration
* EnumDeclaration
* RecordDeclaration
* }<pre>
* For Convenience:
* <pre>{@code
Expand All @@ -5614,6 +5618,10 @@ BodyDeclaration<?> AnnotationBodyDeclaration():
{
modifier = Modifiers()
(
// This case must be checked before AnnotationTypeMemberDeclaration since the prefixes are the same
LOOKAHEAD(RecordDeclaration())
ret = RecordDeclaration(modifier)
|
LOOKAHEAD(Type() Identifier() "(")
ret = AnnotationTypeMemberDeclaration(modifier)
|
Expand Down
Loading