Merge branch 'master' into 7.0.x

This commit is contained in:
Clément Fournier
2020-03-02 22:26:41 +01:00
14 changed files with 234 additions and 33 deletions

View File

@ -935,7 +935,7 @@ void RecordConstructorDeclaration():
modifiers = Modifiers() { jjtThis.setModifiers(modifiers); }
[TypeParameters()]
<IDENTIFIER> { jjtThis.setImage(token.image); }
"{" ( BlockStatement() )* "}"
Block()
}
void TypeParameters():

View File

@ -20,7 +20,7 @@ import net.sourceforge.pmd.annotation.Experimental;
* </pre>
*/
@Experimental
public final class ASTRecordComponent extends AbstractJavaNode {
public final class ASTRecordComponent extends AbstractJavaAnnotatableNode {
private boolean varargs;
ASTRecordComponent(int id) {
@ -49,7 +49,7 @@ public final class ASTRecordComponent extends AbstractJavaNode {
return getFirstChildOfType(ASTType.class);
}
public ASTVariableDeclaratorId getVariableDeclaratorId() {
public ASTVariableDeclaratorId getVarId() {
return getFirstChildOfType(ASTVariableDeclaratorId.class);
}
}

View File

@ -5,6 +5,8 @@
package net.sourceforge.pmd.lang.java.ast;
import java.util.Iterator;
import net.sourceforge.pmd.annotation.Experimental;
/**
@ -17,7 +19,7 @@ import net.sourceforge.pmd.annotation.Experimental;
* </pre>
*/
@Experimental
public final class ASTRecordComponentList extends AbstractJavaNode {
public final class ASTRecordComponentList extends AbstractJavaNode implements Iterable<ASTRecordComponent> {
ASTRecordComponentList(int id) {
super(id);
}
@ -31,4 +33,13 @@ public final class ASTRecordComponentList extends AbstractJavaNode {
public <T> void jjtAccept(SideEffectingVisitor<T> visitor, T data) {
visitor.visit(this, data);
}
public int size() {
return getNumChildren();
}
@Override
public Iterator<ASTRecordComponent> iterator() {
return children(ASTRecordComponent.class).iterator();
}
}

View File

@ -12,12 +12,11 @@ import net.sourceforge.pmd.annotation.Experimental;
*
* <pre class="grammar">
*
* RecordConstructorDeclaration ::= ({@linkplain ASTAnnotation TypeAnnotation})*
* {@linkplain ASTModifierList Modifiers}
* RecordConstructorDeclaration ::= ({@linkplain ASTAnnotation Annotation})*
* RecordModifiers
* {@linkplain ASTTypeParameters TypeParameters}?
* &lt;IDENTIFIER&gt;
* ( "throws" {@linkplain ASTNameList NameList} )?
* "{" ( {@linkplain ASTBlockStatement ASTBlockStatement} )* "}"
* {@link ASTBlock Block}
*
* </pre>
*
@ -47,4 +46,8 @@ public final class ASTRecordConstructorDeclaration extends AbstractJavaAccessNod
public DeclarationKind getKind() {
return DeclarationKind.RECORD_CONSTRUCTOR;
}
public ASTBlock getBody() {
return getFirstChildOfType(ASTBlock.class);
}
}

View File

@ -58,11 +58,7 @@ public final class ASTRecordDeclaration extends AbstractAnyTypeDeclaration {
return isNested();
}
public List<ASTRecordComponent> getRecordComponents() {
return getFirstChildOfType(ASTRecordComponentList.class).findChildrenOfType(ASTRecordComponent.class);
}
public String getName() {
return getImage();
public ASTRecordComponentList getComponentList() {
return getFirstChildOfType(ASTRecordComponentList.class);
}
}

View File

@ -100,8 +100,8 @@ public class Java14PreviewTest {
List<ASTRecordComponent> components = recordDecl.getFirstChildOfType(ASTRecordComponentList.class)
.findChildrenOfType(ASTRecordComponent.class);
Assert.assertEquals(2, components.size());
Assert.assertEquals("x", components.get(0).getVariableDeclaratorId().getImage());
Assert.assertEquals("y", components.get(1).getVariableDeclaratorId().getImage());
Assert.assertEquals("x", components.get(0).getVarId().getImage());
Assert.assertEquals("y", components.get(1).getVarId().getImage());
}
@Test(expected = ParseException.class)
@ -123,21 +123,21 @@ public class Java14PreviewTest {
Assert.assertEquals(7, recordDecls.size());
ASTRecordDeclaration complex = recordDecls.get(0);
Assert.assertEquals("MyComplex", complex.getName());
Assert.assertEquals("MyComplex", complex.getSimpleName());
Assert.assertTrue(complex.isNested());
Assert.assertEquals(0, complex.getRecordComponents().get(0).findChildrenOfType(ASTAnnotation.class).size());
Assert.assertEquals(1, complex.getRecordComponents().get(1).findChildrenOfType(ASTAnnotation.class).size());
Assert.assertEquals(0, getComponent(complex, 0).findChildrenOfType(ASTAnnotation.class).size());
Assert.assertEquals(1, getComponent(complex, 1).findChildrenOfType(ASTAnnotation.class).size());
Assert.assertEquals(2, complex.getDeclarations().size());
Assert.assertTrue(complex.getDeclarations().get(0).getChild(1) instanceof ASTConstructorDeclaration);
Assert.assertTrue(complex.getDeclarations().get(1).getChild(0) instanceof ASTRecordDeclaration);
ASTRecordDeclaration nested = recordDecls.get(1);
Assert.assertEquals("Nested", nested.getName());
Assert.assertEquals("Nested", nested.getSimpleName());
Assert.assertTrue(nested.isNested());
ASTRecordDeclaration range = recordDecls.get(2);
Assert.assertEquals("Range", range.getName());
Assert.assertEquals(2, range.getRecordComponents().size());
Assert.assertEquals("Range", range.getSimpleName());
Assert.assertEquals(2, range.getComponentList().size());
List<ASTRecordConstructorDeclaration> rangeConstructors = range.findDescendantsOfType(ASTRecordConstructorDeclaration.class);
Assert.assertEquals(1, rangeConstructors.size());
Assert.assertEquals("Range", rangeConstructors.get(0).getImage());
@ -145,27 +145,32 @@ public class Java14PreviewTest {
Assert.assertEquals(2, range.getDeclarations().size());
ASTRecordDeclaration varRec = recordDecls.get(3);
Assert.assertEquals("VarRec", varRec.getName());
Assert.assertEquals("x", varRec.getRecordComponents().get(0).getVariableDeclaratorId().getImage());
Assert.assertTrue(varRec.getRecordComponents().get(0).isVarargs());
Assert.assertEquals(2, varRec.getRecordComponents().get(0).findChildrenOfType(ASTAnnotation.class).size());
Assert.assertEquals(1, varRec.getRecordComponents().get(0).getTypeNode().findDescendantsOfType(ASTAnnotation.class).size());
Assert.assertEquals("VarRec", varRec.getSimpleName());
Assert.assertEquals("x", getComponent(varRec, 0).getVarId().getImage());
Assert.assertTrue(getComponent(varRec, 0).isVarargs());
Assert.assertEquals(2, getComponent(varRec, 0).findChildrenOfType(ASTAnnotation.class).size());
Assert.assertEquals(1, getComponent(varRec, 0).getTypeNode().findDescendantsOfType(ASTAnnotation.class).size());
ASTRecordDeclaration arrayRec = recordDecls.get(4);
Assert.assertEquals("ArrayRec", arrayRec.getName());
Assert.assertEquals("x", arrayRec.getRecordComponents().get(0).getVariableDeclaratorId().getImage());
Assert.assertTrue(arrayRec.getRecordComponents().get(0).getVariableDeclaratorId().hasArrayType());
Assert.assertEquals("ArrayRec", arrayRec.getSimpleName());
Assert.assertEquals("x", getComponent(arrayRec, 0).getVarId().getImage());
Assert.assertTrue(getComponent(arrayRec, 0).getVarId().hasArrayType());
ASTRecordDeclaration emptyRec = recordDecls.get(5);
Assert.assertEquals("EmptyRec", emptyRec.getName());
Assert.assertEquals(0, emptyRec.getRecordComponents().size());
Assert.assertEquals("EmptyRec", emptyRec.getSimpleName());
Assert.assertEquals(0, emptyRec.getComponentList().size());
ASTRecordDeclaration personRec = recordDecls.get(6);
Assert.assertEquals("PersonRecord", personRec.getName());
Assert.assertEquals("PersonRecord", personRec.getSimpleName());
ASTImplementsList impl = personRec.getFirstChildOfType(ASTImplementsList.class);
Assert.assertEquals(2, impl.findChildrenOfType(ASTClassOrInterfaceType.class).size());
}
private ASTRecordComponent getComponent(ASTRecordDeclaration arrayRec, int index) {
return (ASTRecordComponent) arrayRec.getComponentList().getChild(index);
}
@Test(expected = ParseException.class)
public void recordIsARestrictedIdentifier() {
java14p.parse("public class record {}");