@@ -180,28 +180,39 @@ extension SwiftJava.WrapJavaCommand {
180180 // of classes to be translated if they were already specified.
181181 var allClassesToVisit = javaClasses
182182 var currentClassIndex : Int = 0
183- while currentClassIndex < allClassesToVisit. count {
183+ outerClassLoop: while currentClassIndex < allClassesToVisit. count {
184184 defer {
185185 currentClassIndex += 1
186186 }
187187
188- // The current class we're in.
188+ // The current top-level class we're in.
189189 let currentClass = allClassesToVisit [ currentClassIndex]
190+ let currentClassName = currentClass. getName ( )
190191 guard let currentSwiftName = translator. translatedClasses [ currentClass. getName ( ) ] ? . swiftType else {
191192 continue
192193 }
193194
194- // Find all of the nested classes that weren't explicitly translated
195- // already.
196- let nestedClasses : [ JavaClass < JavaObject > ] = currentClass. getClasses ( ) . compactMap { nestedClass in
197- guard let nestedClass else { return nil }
195+ // Find all of the nested classes that weren't explicitly translated already.
196+ let nestedAndSuperclassNestedClasses = currentClass. getClasses ( ) // watch out, this includes nested types from superclasses
197+ let nestedClasses : [ JavaClass < JavaObject > ] = nestedAndSuperclassNestedClasses. compactMap { nestedClass in
198+ guard let nestedClass else {
199+ return nil
200+ }
198201
199202 // If this is a local class, we're done.
200203 let javaClassName = nestedClass. getName ( )
201204 if javaClassName. isLocalJavaClass {
202205 return nil
203206 }
204207
208+ // We only want to visit and import types which are explicitly inside this decl,
209+ // and NOT any of the types contained in the super classes. That would violate our "current class"
210+ // nesting, because those are *actually* nested in the other class, not "the current one" (i.e. in a super class).
211+ guard javaClassName. hasPrefix ( currentClassName) else {
212+ log. trace ( " Skip super-class nested class ' \( javaClassName) ', is not member of \( currentClassName) . Will be visited independently. " )
213+ return nil
214+ }
215+
205216 // If we have an inclusive filter, import only types from it
206217 for include in config. filterInclude ?? [ ] {
207218 guard javaClassName. starts ( with: include) else {
@@ -227,7 +238,9 @@ extension SwiftJava.WrapJavaCommand {
227238 . defaultSwiftNameForJavaClass
228239
229240 let swiftName = " \( currentSwiftName) . \( swiftUnqualifiedName) "
230- translator. translatedClasses [ javaClassName] = SwiftTypeName ( module: nil , name: swiftName)
241+ let translatedSwiftName = SwiftTypeName ( module: nil , name: swiftName)
242+ translator. translatedClasses [ javaClassName] = translatedSwiftName
243+ log. debug ( " Record translated Java class ' \( javaClassName) ' -> \( translatedSwiftName) " )
231244 return nestedClass
232245 }
233246
0 commit comments