langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java
Print this page
*** 140,149 ****
--- 140,158 ----
public static Finder getAPIFinder(int access) {
return new APIDependencyFinder(access);
}
/**
+ * Get a finder to do class dependency analysis.
+ *
+ * @return a Class dependency finder
+ */
+ public static Finder getClassDependencyFinder() {
+ return new ClassDependencyFinder();
+ }
+
+ /**
* Get the finder used to locate the dependencies for a class.
* @return the finder
*/
public Finder getFinder() {
if (finder == null)
*** 244,255 ****
};
findAllDependencies(classFinder, rootClassNames, transitiveClosure, r);
return results;
}
-
-
/**
* Find the dependencies of a class, using the current
* {@link Dependencies#getFinder finder} and
* {@link Dependencies#getFilter filter}.
* The search may optionally include the transitive closure of all the
--- 253,262 ----
*** 304,345 ****
/**
* A location identifying a class.
*/
static class SimpleLocation implements Location {
! public SimpleLocation(String className) {
! this.className = className;
}
! /**
! * Get the name of the class being depended on. This name will be used to
! * locate the class file for transitive dependency analysis.
! * @return the name of the class being depended on
! */
public String getClassName() {
return className;
}
@Override
public boolean equals(Object other) {
if (this == other)
return true;
if (!(other instanceof SimpleLocation))
return false;
! return (className.equals(((SimpleLocation) other).className));
}
@Override
public int hashCode() {
! return className.hashCode();
}
@Override
public String toString() {
! return className;
}
private String className;
}
/**
* A dependency of one class on another.
--- 311,358 ----
/**
* A location identifying a class.
*/
static class SimpleLocation implements Location {
! public SimpleLocation(String name) {
! this.name = name;
! this.className = name.replace('/', '.').replace('$', '.');
}
! public String getName() {
! return name;
! }
!
public String getClassName() {
return className;
}
+ public String getPackageName() {
+ int i = name.lastIndexOf('/');
+ return (i > 0) ? name.substring(0, i).replace('/', '.') : "";
+ }
+
@Override
public boolean equals(Object other) {
if (this == other)
return true;
if (!(other instanceof SimpleLocation))
return false;
! return (name.equals(((SimpleLocation) other).name));
}
@Override
public int hashCode() {
! return name.hashCode();
}
@Override
public String toString() {
! return name;
}
+ private String name;
private String className;
}
/**
* A dependency of one class on another.
*** 429,441 ****
this.packageNames = packageNames;
this.matchSubpackages = matchSubpackages;
}
public boolean accepts(Dependency dependency) {
! String cn = dependency.getTarget().getClassName();
! int lastSep = cn.lastIndexOf("/");
! String pn = (lastSep == -1 ? "" : cn.substring(0, lastSep));
if (packageNames.contains(pn))
return true;
if (matchSubpackages) {
for (String n: packageNames) {
--- 442,452 ----
this.packageNames = packageNames;
this.matchSubpackages = matchSubpackages;
}
public boolean accepts(Dependency dependency) {
! String pn = dependency.getTarget().getPackageName();
if (packageNames.contains(pn))
return true;
if (matchSubpackages) {
for (String n: packageNames) {
*** 449,469 ****
private final Set<String> packageNames;
private final boolean matchSubpackages;
}
-
-
/**
* This class identifies class names directly or indirectly in the constant pool.
*/
static class ClassDependencyFinder extends BasicDependencyFinder {
public Iterable<? extends Dependency> findDependencies(ClassFile classfile) {
Visitor v = new Visitor(classfile);
for (CPInfo cpInfo: classfile.constant_pool.entries()) {
v.scan(cpInfo);
}
return v.deps;
}
}
/**
--- 460,498 ----
private final Set<String> packageNames;
private final boolean matchSubpackages;
}
/**
* This class identifies class names directly or indirectly in the constant pool.
*/
static class ClassDependencyFinder extends BasicDependencyFinder {
public Iterable<? extends Dependency> findDependencies(ClassFile classfile) {
Visitor v = new Visitor(classfile);
for (CPInfo cpInfo: classfile.constant_pool.entries()) {
v.scan(cpInfo);
}
+ try {
+ v.addClass(classfile.super_class);
+ v.addClasses(classfile.interfaces);
+ v.scan(classfile.attributes);
+
+ for (Field f : classfile.fields) {
+ v.scan(f.descriptor, f.attributes);
+ }
+ for (Method m : classfile.methods) {
+ v.scan(m.descriptor, m.attributes);
+ Exceptions_attribute e =
+ (Exceptions_attribute)m.attributes.get(Attribute.Exceptions);
+ if (e != null) {
+ v.addClasses(e.exception_index_table);
+ }
+ }
+ } catch (ConstantPoolException e) {
+ throw new ClassFileError(e);
+ }
+
return v.deps;
}
}
/**
*** 556,568 ****
}
void scan(Descriptor d, Attributes attrs) {
try {
scan(new Signature(d.index).getType(constant_pool));
! Signature_attribute sa = (Signature_attribute) attrs.get(Attribute.Signature);
! if (sa != null)
! scan(new Signature(sa.signature_index).getType(constant_pool));
} catch (ConstantPoolException e) {
throw new ClassFileError(e);
}
}
--- 585,595 ----
}
void scan(Descriptor d, Attributes attrs) {
try {
scan(new Signature(d.index).getType(constant_pool));
! scan(attrs);
} catch (ConstantPoolException e) {
throw new ClassFileError(e);
}
}
*** 572,581 ****
--- 599,645 ----
void scan(Type t) {
t.accept(this, null);
}
+ void scan(Attributes attrs) {
+ try {
+ Signature_attribute sa = (Signature_attribute)attrs.get(Attribute.Signature);
+ if (sa != null)
+ scan(sa.getParsedSignature().getType(constant_pool));
+
+ scan((RuntimeVisibleAnnotations_attribute)
+ attrs.get(Attribute.RuntimeVisibleAnnotations));
+ scan((RuntimeVisibleParameterAnnotations_attribute)
+ attrs.get(Attribute.RuntimeVisibleParameterAnnotations));
+ } catch (ConstantPoolException e) {
+ throw new ClassFileError(e);
+ }
+ }
+
+ private void scan(RuntimeAnnotations_attribute attr) throws ConstantPoolException {
+ if (attr == null) {
+ return;
+ }
+ for (int i = 0; i < attr.annotations.length; i++) {
+ int index = attr.annotations[i].type_index;
+ scan(new Signature(index).getType(constant_pool));
+ }
+ }
+
+ private void scan(RuntimeParameterAnnotations_attribute attr) throws ConstantPoolException {
+ if (attr == null) {
+ return;
+ }
+ for (int param = 0; param < attr.parameter_annotations.length; param++) {
+ for (int i = 0; i < attr.parameter_annotations[param].length; i++) {
+ int index = attr.parameter_annotations[param][i].type_index;
+ scan(new Signature(index).getType(constant_pool));
+ }
+ }
+ }
+
void addClass(int index) throws ConstantPoolException {
if (index != 0) {
String name = constant_pool.getClassInfo(index).getBaseName();
if (name != null)
addDependency(name);
*** 696,705 ****
--- 760,770 ----
public Void visitMethodType(MethodType type, Void p) {
findDependencies(type.paramTypes);
findDependencies(type.returnType);
findDependencies(type.throwsTypes);
+ findDependencies(type.typeParamTypes);
return null;
}
public Void visitClassSigType(ClassSigType type, Void p) {
findDependencies(type.superclassType);
*** 707,717 ****
return null;
}
public Void visitClassType(ClassType type, Void p) {
findDependencies(type.outerType);
! addDependency(type.name);
findDependencies(type.typeArgs);
return null;
}
public Void visitTypeParamType(TypeParamType type, Void p) {
--- 772,782 ----
return null;
}
public Void visitClassType(ClassType type, Void p) {
findDependencies(type.outerType);
! addDependency(type.getBinaryName());
findDependencies(type.typeArgs);
return null;
}
public Void visitTypeParamType(TypeParamType type, Void p) {