FieldDeclaration implements QualifiableNode

This commit is contained in:
oowekyala
2017-05-23 21:18:20 +02:00
parent a99f0c276d
commit ded6dc670b
3 changed files with 89 additions and 54 deletions

View File

@ -5,7 +5,7 @@
package net.sourceforge.pmd.lang.java.ast;
public class ASTFieldDeclaration extends AbstractJavaAccessTypeNode implements Dimensionable {
public class ASTFieldDeclaration extends AbstractJavaAccessTypeNode implements Dimensionable, QualifiableNode {
public ASTFieldDeclaration(int id) {
super(id);
@ -137,4 +137,11 @@ public class ASTFieldDeclaration extends AbstractJavaAccessTypeNode implements D
}
return null;
}
@Override
public QualifiedName getQualifiedName() {
QualifiedName parent = getFirstParentOfType(ASTClassOrInterfaceDeclaration.class).getQualifiedName();
return QualifiedName.makeFieldOf(parent, getVariableName());
}
}

View File

@ -11,6 +11,8 @@ import java.util.Arrays;
*/
public interface QualifiableNode {
// non canonical symbols but probably better for regex parsing if need be
// anyway can be changed
char LEFT_CLASS_SEP = '$';
char METHOD_SEP = '#';
char NESTED_CLASS_SEP = ':';
@ -18,23 +20,28 @@ public interface QualifiableNode {
char RIGHT_PARAM_SEP = ')';
char PARAMLIST_SEP = ',';
char PACKAGE_SEP = '.';
char FIELD_SEP = '!';
QualifiedName getQualifiedName();
class QualifiedName {
private String[] packages = null; // unnamed package
private String[] classes = new String[1];
private String operation = null;
/** Either method name or field name */
private String suffix = null;
private boolean isField = false;
public QualifiedName() {
}
public static QualifiedName makeOperationOf(QualifiedName parentClass, String operationName, String[] paramTypes) {
public static QualifiedName makeOperationOf(QualifiedName parentClass, String operationName,
String[] paramTypes) {
QualifiedName qname = new QualifiedName();
qname.packages = parentClass.packages;
qname.classes = parentClass.classes;
qname.setOperation(operationName, paramTypes);
qname.suffix = getMethodNameOf(operationName, paramTypes);
qname.isField = false;
return qname;
}
@ -51,44 +58,24 @@ public interface QualifiableNode {
return qname;
}
public boolean isClass() {
return classes[0] != null && operation == null;
public static QualifiedName makeFieldOf(QualifiedName parentClass, String fieldName) {
QualifiedName qname = new QualifiedName();
qname.packages = parentClass.packages;
qname.classes = parentClass.classes;
qname.suffix = fieldName;
qname.isField = true;
return qname;
}
public void setClass(String className) {
classes[0] = className;
}
public boolean isNestedClass() {
return classes.length > 1 && operation == null;
}
public boolean isOperation() {
return operation != null;
}
public String[] getPackages() {
return packages;
}
public void setPackages(String[] packs) {
packages = packs;
}
public String[] getClasses() {
return classes;
}
public void setClasses(String[] classes) {
this.classes = classes;
}
public String getOperation() {
return operation;
}
public void setOperation(String methodName, String[] paramTypes) {
/**
* Returns a normalized method name based on parameter types and method name.
*
* @param methodName Name of the method.
* @param paramTypes Type of parameters.
*
* @return Normalized method name.
*/
public static String getMethodNameOf(String methodName, String[] paramTypes) {
StringBuilder sb = new StringBuilder();
sb.append(methodName);
sb.append(LEFT_PARAM_SEP);
@ -104,7 +91,48 @@ public interface QualifiableNode {
sb.append(RIGHT_PARAM_SEP);
this.operation = sb.toString();
return sb.toString();
}
public boolean isClass() {
return classes[0] != null && suffix == null;
}
public void setClass(String className) {
classes[0] = className;
}
public boolean isNestedClass() {
return classes.length > 1 && suffix == null;
}
public boolean isOperation() {
return suffix != null && !isField;
}
public boolean isField() {
return suffix != null && isField;
}
public void setField(String fieldName) {
suffix = fieldName;
isField = true;
}
public String[] getPackages() {
return packages;
}
public void setPackages(String[] packages) {
this.packages = packages;
}
public String[] getClasses() {
return classes;
}
public String getSuffix() {
return suffix;
}
@Override
@ -130,9 +158,9 @@ public interface QualifiableNode {
sb.append(classes[last]);
if (operation != null) {
sb.append(METHOD_SEP);
sb.append(operation);
if (suffix != null) {
sb.append(isField ? FIELD_SEP : METHOD_SEP);
sb.append(suffix);
}
return sb.toString();
@ -162,8 +190,8 @@ public interface QualifiableNode {
hash += p.hashCode();
}
}
if (operation != null)
hash += operation.hashCode();
if (suffix != null)
hash += suffix.hashCode();
return hash;
}
}

View File

@ -37,7 +37,7 @@ public class QualifiedNameTest extends ParserTst {
assertEquals(LEFT_CLASS_SEP + "Foo", qname.toString());
assertNull(qname.getPackages());
assertEquals(1, qname.getClasses().length);
assertNull(qname.getOperation());
assertNull(qname.getSuffix());
}
}
@ -52,7 +52,7 @@ public class QualifiedNameTest extends ParserTst {
assertEquals("foo" + PACKAGE_SEP + "bar" + LEFT_CLASS_SEP + "Bzaz", qname.toString());
assertEquals(2, qname.getPackages().length);
assertEquals(1, qname.getClasses().length);
assertNull(qname.getOperation());
assertNull(qname.getSuffix());
}
}
@ -116,8 +116,8 @@ public class QualifiedNameTest extends ParserTst {
assertEquals("bar" + LEFT_CLASS_SEP
+ "Bzaz" + METHOD_SEP + "foo" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP,
qname.toString());
assertNotNull(qname.getOperation());
assertEquals("foo" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP, qname.getOperation());
assertNotNull(qname.getSuffix());
assertEquals("foo" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP, qname.getSuffix());
}
}
@ -135,8 +135,8 @@ public class QualifiedNameTest extends ParserTst {
assertEquals("bar" + LEFT_CLASS_SEP
+ "Bzaz" + METHOD_SEP + "Bzaz" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP,
qname.toString());
assertNotNull(qname.getOperation());
assertEquals("Bzaz" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP, qname.getOperation());
assertNotNull(qname.getSuffix());
assertEquals("Bzaz" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP, qname.getSuffix());
}
}
@ -154,8 +154,8 @@ public class QualifiedNameTest extends ParserTst {
assertEquals("bar" + LEFT_CLASS_SEP
+ "Bzaz" + METHOD_SEP + "Bzaz" + LEFT_PARAM_SEP + "int" + PARAMLIST_SEP + "String" + RIGHT_PARAM_SEP,
qname.toString());
assertNotNull(qname.getOperation());
assertEquals("Bzaz" + LEFT_PARAM_SEP + "int" + PARAMLIST_SEP + "String" + RIGHT_PARAM_SEP, qname.getOperation());
assertNotNull(qname.getSuffix());
assertEquals("Bzaz" + LEFT_PARAM_SEP + "int" + PARAMLIST_SEP + "String" + RIGHT_PARAM_SEP, qname.getSuffix());
}
}