Fix StrucType.isSubTypeOf() for sub interfaces.

This commit is contained in:
Volker Berlin 2022-09-03 20:47:49 +02:00
parent 6294172dbc
commit 60d24f2feb
No known key found for this signature in database
GPG Key ID: 988423EF815BE4CB

View File

@ -1015,24 +1015,21 @@ public class TypeManager {
try {
ClassFile classFile = manager.classFileLoader.get( name );
if( classFile != null ) {
for( ConstantClass interClass : classFile.getInterfaces() ) {
if( interClass.getName().equals( structType.name ) ) {
return true;
}
String otherTypeName = structType.name;
while( classFile != null ) {
if( isSubTypeOf( classFile, otherTypeName )) {
return true;
}
while( classFile != null ) {
ConstantClass superClass = classFile.getSuperClass();
if( superClass == null ) {
break;
}
String superName = superClass.getName();
if( superName.equals( structType.name ) ) {
return true;
}
classFile = manager.classFileLoader.get( superName );
ConstantClass superClass = classFile.getSuperClass();
if( superClass == null ) {
break;
}
String superName = superClass.getName();
if( superName.equals( otherTypeName ) ) {
return true;
}
classFile = manager.classFileLoader.get( superName );
}
} catch( IOException ex ) {
throw new UncheckedIOException( ex );
@ -1041,6 +1038,30 @@ public class TypeManager {
return false;
}
/**
* Check for sub interface recursively.
*
* @param classFile
* the class file to check
* @param otherTypeName
* the searching interface name
* @return true, if a sub interface
* @throws IOException
* If any I/O error occur
*/
private boolean isSubTypeOf( ClassFile classFile, String otherTypeName ) throws IOException {
for( ConstantClass iface : classFile.getInterfaces() ) {
if( iface.getName().equals( otherTypeName ) ) {
return true;
}
ClassFile iClassFile = manager.classFileLoader.get( iface.getName() );
if( iClassFile != null && isSubTypeOf( iClassFile, otherTypeName ) ) {
return true;
}
}
return false;
}
/**
* Get kind of the StructType
*