1- From c1e8f17846cb69ef2a3768dee7cfadb40858d279 Mon Sep 17 00:00:00 2001
1+ From c2a2bf2cf1a84c4f4c98eaec369fa425b45fd00e Mon Sep 17 00:00:00 2001
22From: Akash Yadav <akashyadav@appdevforall.org>
33Date: Thu, 26 Mar 2026 14:35:40 +0530
44Subject: [PATCH 6/9] feat: add android-shims module
@@ -12,7 +12,7 @@ Signed-off-by: Akash Yadav <akashyadav@appdevforall.org>
1212---
1313 build.gradle.kts | 1 +
1414 gradle/verification-metadata.xml | 5 +
15- .../build.gradle.kts | 5 +-
15+ .../build.gradle.kts | 6 +-
1616 .../android-shims/build.gradle.kts | 80 ++++++++++
1717 .../benmanes/caffeine/base/UnsafeAccess.java | 52 +++++++
1818 .../benmanes/caffeine/cache/UnsafeAccess.java | 85 ++++++++++
@@ -21,14 +21,15 @@ Signed-off-by: Akash Yadav <akashyadav@appdevforall.org>
2121 .../com/intellij/util/containers/Unsafe.java | 138 +++++++++++++++++
2222 .../java/com/android/java/awt/Component.java | 6 +
2323 .../java/com/android/java/awt/Graphics.java | 101 ++++++++++++
24+ .../com/android/java/lang/ClassValue.java | 74 +++++++++
2425 .../java/com/android/javax/swing/Icon.java | 65 ++++++++
2526 .../android/javax/swing/SwingUtilities.java | 145 ++++++++++++++++++
2627 .../openapi/util/LowMemoryWatcherAccess.java | 8 +
2728 .../src/main/java/gnu/trove/Equality.java | 53 +++++++
2829 .../gnu/trove/TObjectHashingStrategy.java | 64 ++++++++
2930 .../internal/intellij/IntellijCoroutines.kt | 29 ++++
3031 settings.gradle | 3 +-
31- 18 files changed, 981 insertions(+), 2 deletions(-)
32+ 19 files changed, 1056 insertions(+), 2 deletions(-)
3233 create mode 100644 prepare/ide-plugin-dependencies/android-shims/build.gradle.kts
3334 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/com/github/benmanes/caffeine/base/UnsafeAccess.java
3435 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/com/github/benmanes/caffeine/cache/UnsafeAccess.java
@@ -37,6 +38,7 @@ Signed-off-by: Akash Yadav <akashyadav@appdevforall.org>
3738 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/com/intellij/util/containers/Unsafe.java
3839 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/java/awt/Component.java
3940 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/java/awt/Graphics.java
41+ create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/java/lang/ClassValue.java
4042 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/javax/swing/Icon.java
4143 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/javax/swing/SwingUtilities.java
4244 create mode 100644 prepare/ide-plugin-dependencies/android-shims/src/main/java/com/intellij/openapi/util/LowMemoryWatcherAccess.java
@@ -73,16 +75,17 @@ index 49b8f09b6ab5..3dcb79b69065 100644
7375 <artifact name="lz4-java-1.7.1.jar">
7476 <md5 value="d56d86823662a663a4d614dd5e117eff" origin="Generated by Gradle"/>
7577diff --git a/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts b/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts
76- index a1dffb3abc9f..08f359c3060b 100644
78+ index a1dffb3abc9f..1226e3714ed1 100644
7779--- a/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts
7880+++ b/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts
79- @@ -59,7 +59,10 @@ val classesToReplaceInComIntellij = mapOf(
81+ @@ -59,7 +59,11 @@ val classesToReplaceInComIntellij = mapOf(
8082 val classesToReplace = mapOf(
8183 "com.github.benmanes.caffeine.base.UnsafeAccess" to "com.android.",
8284 "com.github.benmanes.caffeine.cache.UnsafeAccess" to "com.android.",
8385- "javax.swing.SwingUtilities" to "com.android."
8486+ "java.awt.Component" to "com.android.",
8587+ "java.awt.Graphics" to "com.android.",
88+ + "java.lang.ClassValue" to "com.android.",
8689+ "javax.swing.Icon" to "com.android.",
8790+ "javax.swing.SwingUtilities" to "com.android.",
8891 )
@@ -744,6 +747,86 @@ index 000000000000..70dd08df8208
744747+ // COTG-changed: stub class
745748+ }
746749\ No newline at end of file
750+ diff --git a/prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/java/lang/ClassValue.java b/prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/java/lang/ClassValue.java
751+ new file mode 100644
752+ index 000000000000..b8d51a16101e
753+ --- /dev/null
754+ +++ b/prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/java/lang/ClassValue.java
755+ @@ -0,0 +1,74 @@
756+ + package com.android.java.lang;
757+ +
758+ + import android.os.Build;
759+ + import org.jetbrains.annotations.NotNull;
760+ +
761+ + import java.util.Map;
762+ + import java.util.concurrent.ConcurrentHashMap;
763+ + import java.util.function.Function;
764+ +
765+ + public abstract class ClassValue<T> {
766+ +
767+ + private static final boolean HAS_CLASS_VALUE = Build.VERSION.SDK_INT >= 34;
768+ + private final Impl<T> impl = HAS_CLASS_VALUE ? new Api34Impl<>(this::computeValue) : new Api33Impl<>(this::computeValue);
769+ +
770+ + protected ClassValue() {
771+ + }
772+ +
773+ + protected abstract T computeValue(Class<?> type);
774+ +
775+ + public T get(Class<?> type) {
776+ + return impl.get(type);
777+ + }
778+ +
779+ + public void remove(Class<?> type) {
780+ + impl.remove(type);
781+ + }
782+ +
783+ + private interface Impl<T> {
784+ + T get(Class<?> type);
785+ + void remove(Class<?> type);
786+ + }
787+ +
788+ + private static class Api34Impl<T> implements Impl<T> {
789+ + private final java.lang.ClassValue<T> delegate;
790+ +
791+ + private Api34Impl(Function<Class<?>, T> compute) {
792+ + this.delegate = new java.lang.ClassValue<T>() {
793+ + @Override
794+ + protected T computeValue(@NotNull Class<?> type) {
795+ + return compute.apply(type);
796+ + }
797+ + };
798+ + }
799+ +
800+ + @Override
801+ + public T get(Class<?> type) {
802+ + return delegate.get(type);
803+ + }
804+ +
805+ + @Override
806+ + public void remove(Class<?> type) {
807+ + delegate.remove(type);
808+ + }
809+ + }
810+ +
811+ + private static class Api33Impl<T> implements Impl<T> {
812+ + private final Map<Class<?>, T> cache = new ConcurrentHashMap<>();
813+ + private final Function<Class<?>, T> compute;
814+ +
815+ + private Api33Impl(Function<Class<?>, T> compute) {
816+ + this.compute = compute;
817+ + }
818+ +
819+ + @Override
820+ + public T get(Class<?> type) {
821+ + return cache.computeIfAbsent(type, compute);
822+ + }
823+ +
824+ + @Override
825+ + public void remove(Class<?> type) {
826+ + cache.remove(type);
827+ + }
828+ + }
829+ + }
747830diff --git a/prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/javax/swing/Icon.java b/prepare/ide-plugin-dependencies/android-shims/src/main/java/com/android/javax/swing/Icon.java
748831new file mode 100644
749832index 000000000000..928d914a0652
0 commit comments