aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java
diff options
context:
space:
mode:
authorGravatar cnsun <cnsun@google.com>2018-03-19 13:20:30 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-19 13:21:48 -0700
commitc7a25ca14a105f65dcef1fe3f9879d425f181f5f (patch)
treedaa7fe90f6e725f5355edcccf140d675944f2983 /src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java
parentbff4ac081bd80f227cc0c3027f67e306d35699fa (diff)
1) Fixes a bug in the checking of missing members. Before, MemberInfo contains
both the owner and the name. However, this is wrong, as the field reference or method call may reference the same member with a different owner (e.g., subclass). 2) The type in ASM may refer to internal names, but also may refer to array descriptor. And arrays have methods such as clone(). Before, I just assume that a type can only be internal names. RELNOTES: None. PiperOrigin-RevId: 189630806
Diffstat (limited to 'src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java')
-rw-r--r--src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java52
1 files changed, 41 insertions, 11 deletions
diff --git a/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java b/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java
index 8c4b1cee69..de5bdac7c0 100644
--- a/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java
+++ b/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/DepsCheckerClassVisitor.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.importdeps;
+import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import com.google.common.collect.ImmutableSet;
@@ -91,17 +92,28 @@ public class DepsCheckerClassVisitor extends ClassVisitor {
}
private void checkMember(String owner, String name, String desc) {
- checkDescriptor(desc);
- AbstractClassEntryState state = checkInternalName(owner);
+ try {
+ if (checkInternalNameOrArrayDescriptor(owner)) {
+ // The owner is an array descriptor.
+ return; // Assume all methods of arrays exist by default.
+ }
+ checkDescriptor(desc);
+ AbstractClassEntryState state = checkInternalName(owner);
- Optional<ClassInfo> classInfo = state.classInfo();
- if (!classInfo.isPresent()) {
- checkState(state.isMissingState(), "The state should be MissingState. %s", state);
- return; // The class is already missing.
- }
- MemberInfo member = MemberInfo.create(owner, name, desc);
- if (!classInfo.get().containsMember(member)) {
- resultCollector.addMissingMember(member);
+ Optional<ClassInfo> classInfo = state.classInfo();
+ if (!classInfo.isPresent()) {
+ checkState(state.isMissingState(), "The state should be MissingState. %s", state);
+ return; // The class is already missing.
+ }
+ MemberInfo member = MemberInfo.create(name, desc);
+ if (!classInfo.get().containsMember(member)) {
+ resultCollector.addMissingMember(owner, member);
+ }
+ } catch (RuntimeException e) {
+ System.err.printf(
+ "A runtime exception occurred when checking the member: owner=%s, name=%s, desc=%s\n",
+ owner, name, desc);
+ throw e;
}
}
@@ -138,7 +150,25 @@ public class DepsCheckerClassVisitor extends ClassVisitor {
}
}
+ /**
+ * Checks the type, and returns {@literal true} if the type is an array descriptor, otherwise
+ * {@literal false}
+ */
+ private boolean checkInternalNameOrArrayDescriptor(String type) {
+ if (type.charAt(0) == '[') {
+ checkDescriptor(type);
+ return true;
+ } else {
+ checkInternalName(type);
+ return false;
+ }
+ }
+
private AbstractClassEntryState checkInternalName(String internalName) {
+ checkArgument(
+ internalName.length() > 0 && Character.isJavaIdentifierStart(internalName.charAt(0)),
+ "The internal name is invalid. %s",
+ internalName);
AbstractClassEntryState state = classCache.getClassState(internalName);
if (state.isMissingState()) {
resultCollector.addMissingOrIncompleteClass(internalName, state);
@@ -267,7 +297,7 @@ public class DepsCheckerClassVisitor extends ClassVisitor {
@Override
public void visitTypeInsn(int opcode, String type) {
- checkInternalName(type);
+ checkInternalNameOrArrayDescriptor(type);
super.visitTypeInsn(opcode, type);
}