API dump: don't include synthetic bridges in the dump

These methods exist to support
- covariant return type overrides;
- generic overrides;
- overrides of `void` methods with methods returning `java/lang/Void` in Kotlin.

Such methods are called only through supertype invocations, and supertypes are already listed in the dump.

The main reason for avoiding these in dumps: Java allows extending a public class `B` from a package-local class `A`.
`B` can override a method of `A` with a covariant return type.
In this case, a synthetic bridge is generated in `B` with the return type from method in `A`.
If the method return type in `A` is also a package-local class `C`, this would mean `C` is leaked by the API surface of `B`.
Instead, we consider such bridges not a part of the API. For a concrete example, see:
`com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPackageLocalClass.packagePrivateMethodWithPackagePrivateReturnType`.

Another reason has the same root cause: Java allows such class inheritance.
A public class `B` which extends package-local class `A` "opens" up _all_ public/protected methods of `A` to the outer world.
In subsequent commits, this is going to be reflected in the dump by copying the API methods of package-local `A` into public `B`.
We don't want to copy the bridges, which a part of `A` and can be only accessed through supertype of `A`,
to avoid false positive leaking API errors.

GitOrigin-RevId: 2aecf62ad18f4ed6458927ccbd86f8066bea4751
This commit is contained in:
Daniil Ovchinnikov
2024-04-04 12:29:42 +02:00
committed by intellij-monorepo-bot
parent f5ca12a94b
commit 57896efa7e
5 changed files with 23 additions and 108 deletions

View File

@@ -96,7 +96,6 @@ f:com.intellij.openapi.util.text.NaturalComparator
- java.util.Comparator
- sf:INSTANCE:java.util.Comparator
- <init>():V
- b:compare(java.lang.Object,java.lang.Object):I
- compare(java.lang.String,java.lang.String):I
f:com.intellij.openapi.util.text.Strings
- sf:EMPTY_CHAR_SEQUENCE:java.lang.CharSequence
@@ -522,7 +521,6 @@ f:com.intellij.util.containers.SoftArrayHashMap
- <init>():V
- clear():V
- clone():com.intellij.util.containers.SoftArrayHashMap
- b:clone():java.lang.Object
- containsKey(java.lang.Object[]):Z
- get(java.lang.Object[]):java.lang.Object
- processLeafEntries(java.util.function.BiPredicate):Z
@@ -680,7 +678,6 @@ f:com.intellij.util.text.SemVer
- <init>(java.lang.String,I,I,I):V
- <init>(java.lang.String,I,I,I,java.lang.String):V
- compareTo(com.intellij.util.text.SemVer):I
- b:compareTo(java.lang.Object):I
- equals(java.lang.Object):Z
- getMajor():I
- getMinor():I

View File

@@ -93,26 +93,18 @@ f:org.apache.commons.lang.builder.EqualsBuilder
- org.apache.commons.lang3.builder.EqualsBuilder
- <init>():V
- append(I,I):org.apache.commons.lang.builder.EqualsBuilder
- b:append(I,I):org.apache.commons.lang3.builder.EqualsBuilder
- append(java.lang.Object,java.lang.Object):org.apache.commons.lang.builder.EqualsBuilder
- b:append(java.lang.Object,java.lang.Object):org.apache.commons.lang3.builder.EqualsBuilder
- append(Z,Z):org.apache.commons.lang.builder.EqualsBuilder
- b:append(Z,Z):org.apache.commons.lang3.builder.EqualsBuilder
- appendSuper(Z):org.apache.commons.lang.builder.EqualsBuilder
- b:appendSuper(Z):org.apache.commons.lang3.builder.EqualsBuilder
- s:reflectionEquals(java.lang.Object,java.lang.Object):Z
f:org.apache.commons.lang.builder.HashCodeBuilder
- org.apache.commons.lang3.builder.HashCodeBuilder
- <init>():V
- <init>(I,I):V
- append(I):org.apache.commons.lang.builder.HashCodeBuilder
- b:append(I):org.apache.commons.lang3.builder.HashCodeBuilder
- append(java.lang.Object):org.apache.commons.lang.builder.HashCodeBuilder
- b:append(java.lang.Object):org.apache.commons.lang3.builder.HashCodeBuilder
- append(Z):org.apache.commons.lang.builder.HashCodeBuilder
- b:append(Z):org.apache.commons.lang3.builder.HashCodeBuilder
- appendSuper(I):org.apache.commons.lang.builder.HashCodeBuilder
- b:appendSuper(I):org.apache.commons.lang3.builder.HashCodeBuilder
- s:reflectionHashCode(java.lang.Object):I
f:org.apache.commons.lang.builder.ReflectionToStringBuilder
- org.apache.commons.lang3.builder.ReflectionToStringBuilder
@@ -135,11 +127,8 @@ f:org.apache.commons.lang.text.StrBuilder
- <init>(I):V
- <init>(java.lang.String):V
- append(I):org.apache.commons.lang.text.StrBuilder
- b:append(I):org.apache.commons.lang3.text.StrBuilder
- append(java.lang.String):org.apache.commons.lang.text.StrBuilder
- b:append(java.lang.String):org.apache.commons.lang3.text.StrBuilder
- appendNewLine():org.apache.commons.lang.text.StrBuilder
- b:appendNewLine():org.apache.commons.lang3.text.StrBuilder
f:org.apache.commons.lang.text.StrSubstitutor
- org.apache.commons.lang3.text.StrSubstitutor
- <init>():V

View File

@@ -12,7 +12,6 @@ c:org.jdom.Attribute
- <init>(java.lang.String,java.lang.String,org.jdom.AttributeType):V
- <init>(java.lang.String,java.lang.String,org.jdom.AttributeType,org.jdom.Namespace):V
- <init>(java.lang.String,java.lang.String,org.jdom.Namespace):V
- b:clone():java.lang.Object
- clone():org.jdom.Attribute
- detach():org.jdom.Attribute
- getAttributeType():org.jdom.AttributeType
@@ -60,27 +59,16 @@ c:org.jdom.CDATA
- <init>(Z,java.lang.String):V
- append(java.lang.String):V
- append(org.jdom.Text):V
- b:clone():java.lang.Object
- clone():org.jdom.CDATA
- b:clone():org.jdom.Content
- b:clone():org.jdom.Text
- detach():org.jdom.CDATA
- b:detach():org.jdom.Content
- b:detach():org.jdom.Text
- p:setParent(org.jdom.Parent):org.jdom.CDATA
- bp:setParent(org.jdom.Parent):org.jdom.Content
- bp:setParent(org.jdom.Parent):org.jdom.Text
- setText(java.lang.String):org.jdom.CDATA
- b:setText(java.lang.String):org.jdom.Text
- toString():java.lang.String
f:org.jdom.Comment
- org.jdom.Content
- <init>(java.lang.String):V
- b:clone():java.lang.Object
- clone():org.jdom.Comment
- b:clone():org.jdom.Content
- detach():org.jdom.Comment
- b:detach():org.jdom.Content
- getText():java.lang.String
- getValue():java.lang.String
- setText(java.lang.String):org.jdom.Comment
@@ -90,7 +78,6 @@ a:org.jdom.Content
- pf:ctype:org.jdom.Content$CType
- p:parent:org.jdom.Parent
- p:<init>(org.jdom.Content$CType):V
- b:clone():java.lang.Object
- clone():org.jdom.Content
- detach():org.jdom.Content
- f:getCType():org.jdom.Content$CType
@@ -154,15 +141,11 @@ f:org.jdom.DocType
- <init>(java.lang.String):V
- <init>(java.lang.String,java.lang.String):V
- <init>(java.lang.String,java.lang.String,java.lang.String):V
- b:clone():java.lang.Object
- b:clone():org.jdom.Content
- clone():org.jdom.DocType
- b:detach():org.jdom.Content
- detach():org.jdom.DocType
- getElementName():java.lang.String
- getInternalSubset():java.lang.String
- getParent():org.jdom.Document
- b:getParent():org.jdom.Parent
- getPublicID():java.lang.String
- getSystemID():java.lang.String
- getValue():java.lang.String
@@ -180,17 +163,11 @@ f:org.jdom.Document
- <init>(org.jdom.Element,org.jdom.DocType):V
- <init>(org.jdom.Element,org.jdom.DocType,java.lang.String):V
- addContent(I,java.util.Collection):org.jdom.Document
- b:addContent(I,java.util.Collection):org.jdom.Parent
- addContent(I,org.jdom.Content):org.jdom.Document
- b:addContent(I,org.jdom.Content):org.jdom.Parent
- addContent(java.util.Collection):org.jdom.Document
- b:addContent(java.util.Collection):org.jdom.Parent
- addContent(org.jdom.Content):org.jdom.Document
- b:addContent(org.jdom.Content):org.jdom.Parent
- canContainContent(org.jdom.Content,I,Z):V
- b:clone():java.lang.Object
- clone():org.jdom.Document
- b:clone():org.jdom.Parent
- cloneContent():java.util.List
- detachRootElement():org.jdom.Element
- equals(java.lang.Object):Z
@@ -231,23 +208,15 @@ c:org.jdom.Element
- <init>(java.lang.String,java.lang.String,java.lang.String):V
- <init>(java.lang.String,org.jdom.Namespace):V
- addContent(I,java.util.Collection):org.jdom.Element
- b:addContent(I,java.util.Collection):org.jdom.Parent
- addContent(I,org.jdom.Content):org.jdom.Element
- b:addContent(I,org.jdom.Content):org.jdom.Parent
- addContent(java.lang.String):org.jdom.Element
- addContent(java.util.Collection):org.jdom.Element
- b:addContent(java.util.Collection):org.jdom.Parent
- addContent(org.jdom.Content):org.jdom.Element
- b:addContent(org.jdom.Content):org.jdom.Parent
- addContent(org.jdom.Element):org.jdom.Element
- addNamespaceDeclaration(org.jdom.Namespace):V
- canContainContent(org.jdom.Content,I,Z):V
- b:clone():java.lang.Object
- b:clone():org.jdom.Content
- clone():org.jdom.Element
- b:clone():org.jdom.Parent
- cloneContent():java.util.List
- b:detach():org.jdom.Content
- detach():org.jdom.Element
- getAdditionalNamespaces():java.util.List
- getAttribute(java.lang.String):org.jdom.Attribute
@@ -324,14 +293,10 @@ f:org.jdom.EntityRef
- <init>(java.lang.String):V
- <init>(java.lang.String,java.lang.String):V
- <init>(java.lang.String,java.lang.String,java.lang.String):V
- b:clone():java.lang.Object
- b:clone():org.jdom.Content
- clone():org.jdom.EntityRef
- b:detach():org.jdom.Content
- detach():org.jdom.EntityRef
- getName():java.lang.String
- getParent():org.jdom.Element
- b:getParent():org.jdom.Parent
- getValue():java.lang.String
- setName(java.lang.String):org.jdom.EntityRef
- setPublicID(java.lang.String):org.jdom.EntityRef
@@ -429,10 +394,7 @@ f:org.jdom.ProcessingInstruction
- <init>(java.lang.String):V
- <init>(java.lang.String,java.lang.String):V
- <init>(java.lang.String,java.util.Map):V
- b:clone():java.lang.Object
- b:clone():org.jdom.Content
- clone():org.jdom.ProcessingInstruction
- b:detach():org.jdom.Content
- detach():org.jdom.ProcessingInstruction
- getData():java.lang.String
- getTarget():java.lang.String
@@ -447,19 +409,14 @@ c:org.jdom.Text
- p:<init>(org.jdom.Content$CType):V
- append(java.lang.String):V
- append(org.jdom.Text):V
- b:clone():java.lang.Object
- b:clone():org.jdom.Content
- clone():org.jdom.Text
- b:detach():org.jdom.Content
- detach():org.jdom.Text
- getParent():org.jdom.Element
- b:getParent():org.jdom.Parent
- getText():java.lang.String
- getTextNormalize():java.lang.String
- getTextTrim():java.lang.String
- getValue():java.lang.String
- s:normalizeString(java.lang.String):java.lang.String
- bp:setParent(org.jdom.Parent):org.jdom.Content
- p:setParent(org.jdom.Parent):org.jdom.Text
- setText(java.lang.String):org.jdom.Text
- toString():java.lang.String
@@ -507,7 +464,6 @@ f:org.jdom.filter2.ElementFilter
- <init>(java.lang.String,org.jdom.Namespace):V
- <init>(org.jdom.Namespace):V
- equals(java.lang.Object):Z
- b:filter(java.lang.Object):java.lang.Object
- filter(java.lang.Object):org.jdom.Element
- hashCode():I
- toString():java.lang.String
@@ -663,7 +619,6 @@ org.jdom.output.EscapeStrategy
- a:shouldEscape(C):Z
f:org.jdom.output.Format
- java.lang.Cloneable
- b:clone():java.lang.Object
- clone():org.jdom.output.Format
- s:compact(java.lang.String):java.lang.String
- s:getCompactFormat():org.jdom.output.Format
@@ -793,7 +748,6 @@ f:org.jdom.xpath.jaxen.JaxenXPathFactory
a:org.jdom.xpath.util.AbstractXPathCompiled
- org.jdom.xpath.XPathExpression
- <init>(java.lang.String,org.jdom.filter2.Filter,java.util.Map,org.jdom.Namespace[]):V
- b:clone():java.lang.Object
- clone():org.jdom.xpath.XPathExpression
- diagnose(java.lang.Object,Z):org.jdom.xpath.XPathDiagnostic
- evaluate(java.lang.Object):java.util.List

View File

@@ -2,10 +2,7 @@
package com.intellij.tools.apiDump
import kotlinx.metadata.jvm.JvmFieldSignature
import kotlinx.validation.api.ClassBinarySignature
import kotlinx.validation.api.MEMBER_SORT_ORDER
import kotlinx.validation.api.MemberBinarySignature
import kotlinx.validation.api.loadApiFromJvmClasses
import kotlinx.validation.api.*
import org.objectweb.asm.Opcodes
import org.objectweb.asm.Type
import org.objectweb.asm.tree.AnnotationNode
@@ -30,6 +27,7 @@ class ApiIndex {
val signatures: List<ClassBinarySignature> = classFilePaths
.map { it.inputStream() }
.loadApiFromJvmClasses()
.map { it.removeSyntheticBridges() }
discoverClasses(signatures)
handleAnnotationsAndVisibility(signatures)
@@ -134,28 +132,8 @@ class ApiIndex {
member.access.isStatic
}
}
val privateSignatures = privateSupertypes.flatMap { superType ->
superType.memberSignatures
.filter {
val flags = it.access.access
!flags.isSet(Opcodes.ACC_STATIC)
&& !flags.isSet(Opcodes.ACC_BRIDGE)
&& !flags.isSet(Opcodes.ACC_SYNTHETIC)
}
.map {
it.jvmMember
}
}.toSet()
val withoutBridges = memberSignatures
.filter { signature ->
val flags = signature.access.access
flags.isSet(Opcodes.ACC_STATIC)
|| !flags.isSet(Opcodes.ACC_BRIDGE)
|| !flags.isSet(Opcodes.ACC_SYNTHETIC)
|| signature.jvmMember !in privateSignatures
}
return this.copy(
memberSignatures = withoutBridges + inheritedStaticSignatures,
memberSignatures = memberSignatures + inheritedStaticSignatures,
supertypes = supertypes - privateSupertypes.map { it.name }.toSet()
)
}
@@ -236,6 +214,26 @@ private fun List<AnnotationNode>?.isExperimental(): Boolean {
private typealias ClassResolver = (String) -> ClassBinarySignature?
private fun ClassBinarySignature.removeSyntheticBridges(): ClassBinarySignature {
val withoutBridges = memberSignatures.filterNot {
it is MethodBinarySignature && it.isSyntheticBridge()
}
if (withoutBridges.size == memberSignatures.size) {
return this
}
else {
return copy(memberSignatures = withoutBridges)
}
}
private fun MethodBinarySignature.isSyntheticBridge(): Boolean {
return access.access.let { flags ->
!flags.isSet(Opcodes.ACC_STATIC)
&& flags.isSet(Opcodes.ACC_BRIDGE)
&& flags.isSet(Opcodes.ACC_SYNTHETIC)
}
}
private fun ClassBinarySignature.supertypes(classResolver: ClassResolver): Sequence<ClassBinarySignature> = sequence {
val stack = ArrayDeque<ClassBinarySignature>()
stack.addLast(this@supertypes)

View File

@@ -89,7 +89,6 @@ c:com.intellij.tools.apiDump.testData.JPublicClassInternalInterface
c:com.intellij.tools.apiDump.testData.JPublicClassInternalSuper
- <init>():V
- clone():com.intellij.tools.apiDump.testData.JPublicClassInternalSuper
- b:clone():java.lang.Object
- psf:protectedStaticFinalMethod():V
- ps:protectedStaticMethod():V
- sf:publicStaticFinalMethod():V
@@ -135,7 +134,6 @@ f:com.intellij.tools.apiDump.testData.defaultParameters.KtChildClass
- <init>():V
- function(I,I,I):V
- genericFunction(I,D,I):java.lang.Double
- b:genericFunction(I,java.lang.Object,I):java.lang.Object
com.intellij.tools.apiDump.testData.defaultParameters.KtInterface
- a:function(I,I,I):V
- bs:function$default(com.intellij.tools.apiDump.testData.defaultParameters.KtInterface,I,I,I,I,java.lang.Object):V
@@ -159,19 +157,11 @@ c:com.intellij.tools.apiDump.testData.generics.JGenericChildClass
- com.intellij.tools.apiDump.testData.generics.JGenericMiddleClass
- <init>():V
- acceptingAT(java.lang.Double[]):V
- b:acceptingAT(java.lang.Number[]):V
- b:acceptingAT(java.lang.Object[]):V
- acceptingLT(java.util.List):V
- acceptingT(java.lang.Double):V
- b:acceptingT(java.lang.Number):V
- b:acceptingT(java.lang.Object):V
- returningAT():java.lang.Double[]
- b:returningAT():java.lang.Number[]
- b:returningAT():java.lang.Object[]
- returningLT():java.lang.Iterable
- returningT():java.lang.Double
- b:returningT():java.lang.Number
- b:returningT():java.lang.Object
com.intellij.tools.apiDump.testData.generics.JGenericInterface
- a:acceptingAT(java.lang.Object[]):V
- a:acceptingLT(java.util.List):V
@@ -183,22 +173,16 @@ a:com.intellij.tools.apiDump.testData.generics.JGenericMiddleClass
- com.intellij.tools.apiDump.testData.generics.JGenericInterface
- <init>():V
- acceptingAT(java.lang.Number[]):V
- b:acceptingAT(java.lang.Object[]):V
- acceptingLT(java.util.List):V
- a:acceptingT(java.lang.Number):V
- b:acceptingT(java.lang.Object):V
- returningAT():java.lang.Number[]
- b:returningAT():java.lang.Object[]
- returningLT():java.lang.Iterable
- returningT():java.lang.Number
- b:returningT():java.lang.Object
f:com.intellij.tools.apiDump.testData.generics2.JChildClasses
c:com.intellij.tools.apiDump.testData.generics2.JChildClasses$JChildClassFromMiddleWithAbstractOverride
- com.intellij.tools.apiDump.testData.generics2.JGenericMiddleClassWithAbstractOverride
- <init>():V
- genericMethod(java.lang.Double):java.lang.Double
- b:genericMethod(java.lang.Number):java.lang.Number
- b:genericMethod(java.lang.Object):java.lang.Object
c:com.intellij.tools.apiDump.testData.generics2.JChildClasses$JChildClassFromMiddleWithOverride
- com.intellij.tools.apiDump.testData.generics2.JGenericMiddleClassWithOverride
- <init>():V
@@ -206,13 +190,10 @@ c:com.intellij.tools.apiDump.testData.generics2.JChildClasses$JChildClassFromMid
- com.intellij.tools.apiDump.testData.generics2.JGenericMiddleClass
- <init>():V
- genericMethod(java.lang.Double):java.lang.Double
- b:genericMethod(java.lang.Object):java.lang.Object
c:com.intellij.tools.apiDump.testData.generics2.JChildClasses$JChildClassWithOverrideFromMiddleWithOverride
- com.intellij.tools.apiDump.testData.generics2.JGenericMiddleClassWithOverride
- <init>():V
- genericMethod(java.lang.Double):java.lang.Double
- b:genericMethod(java.lang.Number):java.lang.Number
- b:genericMethod(java.lang.Object):java.lang.Object
com.intellij.tools.apiDump.testData.generics2.JGenericInterface
- a:genericMethod(java.lang.Object):java.lang.Object
a:com.intellij.tools.apiDump.testData.generics2.JGenericMiddleClass
@@ -222,24 +203,20 @@ a:com.intellij.tools.apiDump.testData.generics2.JGenericMiddleClassWithAbstractO
- com.intellij.tools.apiDump.testData.generics2.JGenericInterface
- <init>():V
- a:genericMethod(java.lang.Number):java.lang.Number
- b:genericMethod(java.lang.Object):java.lang.Object
a:com.intellij.tools.apiDump.testData.generics2.JGenericMiddleClassWithOverride
- com.intellij.tools.apiDump.testData.generics2.JGenericInterface
- <init>():V
- genericMethod(java.lang.Number):java.lang.Number
- b:genericMethod(java.lang.Object):java.lang.Object
c:com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPublicClassFromPackageLocalRunnable
- <init>():V
f:com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPublicFinalInheritor
- <init>():V
- b:packagePrivateMethodWithPackagePrivateReturnType():com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPackageLocalClass
- packagePrivateMethodWithPackagePrivateReturnType():com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPublicFinalInheritor
- ps:protectedStaticMethod():V
- s:publicStaticMethod():V
c:com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPublicInheritor
- <init>():V
- p:<init>(B):V
- b:packagePrivateMethodWithPackagePrivateReturnType():com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPackageLocalClass
- packagePrivateMethodWithPackagePrivateReturnType():com.intellij.tools.apiDump.testData.inheritFromPackageLocal.JPublicInheritor
- ps:protectedStaticMethod():V
- s:publicStaticMethod():V