Skip to content

Commit

Permalink
Merge pull request #237 from gsmet/remove-bridge-methods
Browse files Browse the repository at this point in the history
Remove bridge methods from GitHub API
  • Loading branch information
gsmet authored Dec 14, 2021
2 parents 6dedc57 + 3f39867 commit bbdbe25
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
Expand All @@ -45,7 +46,11 @@
import org.kohsuke.github.GHEventPayload;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GitHub;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

import io.quarkiverse.githubapi.deployment.GitHubApiClassWithBridgeMethodsBuildItem;
import io.quarkiverse.githubapp.GitHubEvent;
import io.quarkiverse.githubapp.deployment.DispatchingConfiguration.EventAnnotation;
import io.quarkiverse.githubapp.deployment.DispatchingConfiguration.EventAnnotationLiteral;
Expand Down Expand Up @@ -73,6 +78,7 @@
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.BytecodeTransformerBuildItem;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
Expand All @@ -90,6 +96,7 @@
import io.quarkus.gizmo.ClassOutput;
import io.quarkus.gizmo.FieldCreator;
import io.quarkus.gizmo.FieldDescriptor;
import io.quarkus.gizmo.Gizmo;
import io.quarkus.gizmo.MethodCreator;
import io.quarkus.gizmo.MethodDescriptor;
import io.quarkus.gizmo.ResultHandle;
Expand Down Expand Up @@ -173,6 +180,25 @@ void additionalBeans(CombinedIndexBuildItem index, BuildProducer<AdditionalBeanB
additionalBeans.produce(additionalBeanBuildItemBuilder.build());
}

/**
* The bridge methods added for binary compatibility in the GitHub API are causing issues with Mockito
* and more specifically with Byte Buddy (see https://github.com/raphw/byte-buddy/issues/1162).
* They don't bring much to the plate for new applications that are regularly updated so let's remove them altogether.
*/
@BuildStep
void removeCompatibilityBridgeMethodsFromGitHubApi(
BuildProducer<BytecodeTransformerBuildItem> bytecodeTransformers,
List<GitHubApiClassWithBridgeMethodsBuildItem> gitHubApiClassesWithBridgeMethods) {
for (GitHubApiClassWithBridgeMethodsBuildItem gitHubApiClassWithBridgeMethods : gitHubApiClassesWithBridgeMethods) {
bytecodeTransformers.produce(new BytecodeTransformerBuildItem.Builder()
.setClassToTransform(gitHubApiClassWithBridgeMethods.getClassName())
.setVisitorFunction((ignored, visitor) -> new RemoveBridgeMethodsClassVisitor(visitor,
gitHubApiClassWithBridgeMethods.getClassName(),
gitHubApiClassWithBridgeMethods.getMethodsWithBridges()))
.build());
}
}

@BuildStep
void generateClasses(CombinedIndexBuildItem combinedIndex, LaunchModeBuildItem launchMode,
BuildProducer<AdditionalBeanBuildItem> additionalBeans,
Expand Down Expand Up @@ -776,4 +802,34 @@ private static void systemOutPrintln(BytecodeCreator bytecodeCreator, ResultHand
bytecodeCreator.invokeVirtualMethod(MethodDescriptor.ofMethod(Object.class, "toString", String.class),
resultHandle));
}

private static class RemoveBridgeMethodsClassVisitor extends ClassVisitor {

private static final Logger LOG = Logger.getLogger(RemoveBridgeMethodsClassVisitor.class);

private final String className;
private final Set<String> methodsWithBridges;

public RemoveBridgeMethodsClassVisitor(ClassVisitor visitor, String className, Set<String> methodsWithBridges) {
super(Gizmo.ASM_API_VERSION, visitor);

this.className = className;
this.methodsWithBridges = methodsWithBridges;
}

@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
if (methodsWithBridges.contains(name) && ((access & Opcodes.ACC_BRIDGE) != 0)
&& ((access & Opcodes.ACC_SYNTHETIC) != 0)) {

LOG.debugf("Class %1$s - Removing method %2$s %3$s(%4$s)", className,
org.objectweb.asm.Type.getReturnType(descriptor), name,
Arrays.toString(org.objectweb.asm.Type.getArgumentTypes(descriptor)));

return null;
}

return super.visitMethod(access, name, descriptor, signature, exceptions);
}
}
}
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
<jandex-plugin.version>1.2.1</jandex-plugin.version>

<quarkus-github-api.version>1.301.1</quarkus-github-api.version>
<quarkus-github-api.version>1.301.2</quarkus-github-api.version>
<okhttp-eventsource.version>2.3.2</okhttp-eventsource.version>

<webjar.fomantic-ui.version>2.8.7</webjar.fomantic-ui.version>
Expand Down

0 comments on commit bbdbe25

Please sign in to comment.