@@ -34,12 +34,12 @@ internal fun JarFile.classEntries() = Sequence { entries().iterator() }.filter {
3434}
3535
3636internal fun getBinaryAPI (jar : JarFile , visibilityFilter : (String ) -> Boolean = { true }): List <ClassBinarySignature > =
37- getBinaryAPI(jar.classEntries().map { entry -> jar.getInputStream(entry) }, visibilityFilter)
37+ getBinaryAPI(jar.classEntries().map { entry -> jar.getInputStream(entry) }, visibilityFilter = visibilityFilter )
3838
39- internal fun getBinaryAPI (classes : Set <File >, visibilityFilter : (String ) -> Boolean = { true }): List <ClassBinarySignature > =
40- getBinaryAPI(classes.asSequence().map { it.inputStream() }, visibilityFilter)
39+ internal fun getBinaryAPI (classes : Set <File >, sourceFiles : Set < File >, visibilityFilter : (String ) -> Boolean = { true }): List <ClassBinarySignature > =
40+ getBinaryAPI(classes.asSequence().map { it.inputStream() }, sourceFiles, visibilityFilter)
4141
42- internal fun getBinaryAPI (classStreams : Sequence <InputStream >, visibilityFilter : (String ) -> Boolean = { true }): List <ClassBinarySignature > {
42+ internal fun getBinaryAPI (classStreams : Sequence <InputStream >, sourceFiles : Set < File > = emptySet(), visibilityFilter : (String ) -> Boolean = { true }): List <ClassBinarySignature > {
4343 val classNodes = classStreams.map {
4444 it.use { stream ->
4545 val classNode = ClassNode ()
@@ -53,6 +53,10 @@ internal fun getBinaryAPI(classStreams: Sequence<InputStream>, visibilityFilter:
5353
5454 val visibilityMapNew = classNodes.readKotlinVisibilities().filterKeys(visibilityFilter)
5555
56+ val sourceFilePackageReversedBySourceFile = sourceFiles.associateWith {
57+ it.parentFile.invariantSeparatorsPath.split(' /' ).reversed()
58+ }
59+
5660 return classNodes
5761 .filter { it != moduleInfo }
5862 .map { clazz ->
@@ -112,6 +116,21 @@ internal fun getBinaryAPI(classStreams: Sequence<InputStream>, visibilityFilter:
112116 // Strip out JDK classes
113117 .filterNotToSet { it.startsWith(" Ljava/lang" ) }
114118
119+ val sourceFileName = clazz.sourceFile ? : " ${clazz.name.substringAfterLast(' /' )} ."
120+ val clazzPackageReversed = clazz.name.substringBeforeLast(' /' ).split(' /' ).reversed()
121+ val sourceFile = sourceFilePackageReversedBySourceFile
122+ .filterKeys { it.name.startsWith(sourceFileName) }
123+ .maxByOrNull { (_, sourceFilePackageReversed) ->
124+ sourceFilePackageReversed
125+ .asSequence()
126+ .zip(clazzPackageReversed.asSequence())
127+ .takeWhile { (sourceFilePart, clazzPart) -> sourceFilePart == clazzPart }
128+ .count()
129+ }
130+ ?.key
131+ ?.invariantSeparatorsPath
132+ ? : sourceFileName
133+
115134 ClassBinarySignature (
116135 name = name,
117136 superName = superName,
@@ -124,7 +143,7 @@ internal fun getBinaryAPI(classStreams: Sequence<InputStream>, visibilityFilter:
124143 isNotUsedWhenEmpty = metadata.isFileOrMultipartFacade() || isDefaultImpls(metadata),
125144 annotations = visibleAnnotations.annotationTypes(),
126145 invisibleAnnotations = invisibleAnnotations.annotationTypes(),
127- sourceFile = clazz. sourceFile
146+ sourceFile = sourceFile
128147 )
129148 }
130149 }
0 commit comments