Skip to content

Commit

Permalink
Implemented code review feedback.
Browse files Browse the repository at this point in the history
* Documented private methods in class name validity checker with links to JVM spec.
* Cleaned up array type checking code.
* Added test to ensure that empty class names are rejected.
  • Loading branch information
studro committed Dec 20, 2021
1 parent 103c203 commit 7ba6ff1
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 7 deletions.
31 changes: 24 additions & 7 deletions spotbugs/src/main/java/edu/umd/cs/findbugs/util/ClassName.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,12 +175,18 @@ public static String extractSimpleName(@DottedClassName String className) {
* @return true if it's a valid class name, false otherwise
*/
public static boolean isValidClassName(String className) {
return isValidBinaryClassName(className) ||
isValidDottedClassName(className) ||
isValidArrayFieldDescriptor(className) ||
isValidClassFieldDescriptor(className);
return !className.isEmpty() &&
(isValidBinaryClassName(className) ||
isValidDottedClassName(className) ||
isValidArrayFieldDescriptor(className) ||
isValidClassFieldDescriptor(className));
}

/**
* @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.2.1">
* JVMS (Java SE 8 Edition) 4.2.1. Binary Class and Interface Names
* </a>
*/
private static boolean isValidBinaryClassName(String className) {
return className.indexOf('.') == -1 &&
className.indexOf('[') == -1 &&
Expand All @@ -193,11 +199,22 @@ private static boolean isValidDottedClassName(String className) {
className.indexOf(';') == -1;
}

/**
* Determines whether a class name is a valid array field descriptor as per
* <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.3.2">
* JVMS (Java SE 8 Edition) 4.3.2</a>
*
* @param className a class name to test for validity - must be non-{@code null} and non-empty.
* @return {@code true} if {@code className} is a valid array field descriptor as
* per JVMS 4.3.2, otherwise {@code false}
* @throws IndexOutOfBoundsException if {@code className} is {@code null} or empty.
*/
private static boolean isValidArrayFieldDescriptor(String className) {
String tail = className.substring(1);
return className.startsWith("[") &&
(isValidArrayFieldDescriptor(className.substring(1))) ||
isValidClassFieldDescriptor(className.substring(1)) ||
isValidBaseTypeFieldDescriptor(className.substring(1));
(isValidArrayFieldDescriptor(tail) ||
isValidClassFieldDescriptor(tail) ||
isValidBaseTypeFieldDescriptor(tail));

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,9 @@ public void testBinaryClassNameContainingDisallowedSpecialCharactersIsInvalidCla
assertFalse(ClassName.isValidClassName("com/bla/Parent$function;$variable$1"));
assertFalse(ClassName.isValidClassName("com/bla/Parent$function[$variable$1"));
}

@Test
public void testEmptyStringIsInvalidClassName() {
assertFalse(ClassName.isValidClassName(("")));
}
}

0 comments on commit 7ba6ff1

Please sign in to comment.