diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
index 742fcbe..ba5bb31 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/EnterExitTransition.kt
@@ -943,7 +943,6 @@
 private val DefaultAlpha = mutableStateOf(1f)
 private val DefaultAlphaAndScaleSpring = spring<Float>(stiffness = Spring.StiffnessMediumLow)
 
-@Suppress("ModifierInspectorInfo")
 private fun Modifier.slideInOut(
     transition: Transition<EnterExitState>,
     slideIn: State<Slide?>,
@@ -1025,7 +1024,6 @@
     }
 }
 
-@Suppress("ModifierInspectorInfo")
 private fun Modifier.shrinkExpand(
     transition: Transition<EnterExitState>,
     expand: State<ChangeSize?>,
diff --git a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt
index 62833e4..9a9e20d 100644
--- a/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt
+++ b/compose/foundation/foundation-layout/src/androidMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.android.kt
@@ -241,7 +241,7 @@
         mandatorySystemGestures
     }
 
-@Suppress("NOTHING_TO_INLINE", "ModifierInspectorInfo")
+@Suppress("NOTHING_TO_INLINE")
 @Stable
 private inline fun Modifier.windowInsetsPadding(
     noinline inspectorInfo: InspectorInfo.() -> Unit,
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
index 71c9444..a088418 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AlignmentLine.kt
@@ -144,7 +144,6 @@
  * @sample androidx.compose.foundation.layout.samples.PaddingFromBaselineSampleDp
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.paddingFromBaseline(top: Dp = Dp.Unspecified, bottom: Dp = Dp.Unspecified) = this
     .then(
         if (top != Dp.Unspecified) {
@@ -178,7 +177,6 @@
  * @sample androidx.compose.foundation.layout.samples.PaddingFromBaselineSampleTextUnit
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.paddingFromBaseline(
     top: TextUnit = TextUnit.Unspecified,
     bottom: TextUnit = TextUnit.Unspecified
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
index c56f33c..3fd65398 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
@@ -456,7 +456,6 @@
  * @sample androidx.compose.foundation.layout.samples.FillHalfWidthModifier
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.fillMaxWidth(/*@FloatRange(from = 0.0, to = 1.0)*/ fraction: Float = 1f) =
     this.then(if (fraction == 1f) FillWholeMaxWidth else FillElement.width(fraction))
 
@@ -477,7 +476,6 @@
  * @sample androidx.compose.foundation.layout.samples.FillHalfHeightModifier
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.fillMaxHeight(/*@FloatRange(from = 0.0, to = 1.0)*/ fraction: Float = 1f) =
     this.then(if (fraction == 1f) FillWholeMaxHeight else FillElement.height(fraction))
 
@@ -502,7 +500,6 @@
  * @sample androidx.compose.foundation.layout.samples.FillHalfSizeModifier
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.fillMaxSize(/*@FloatRange(from = 0.0, to = 1.0)*/ fraction: Float = 1f) =
     this.then(if (fraction == 1f) FillWholeMaxSize else FillElement.size(fraction))
 
@@ -521,7 +518,6 @@
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentHorizontallyAlignedModifier
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.wrapContentWidth(
     align: Alignment.Horizontal = Alignment.CenterHorizontally,
     unbounded: Boolean = false
@@ -551,7 +547,6 @@
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentVerticallyAlignedModifier
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.wrapContentHeight(
     align: Alignment.Vertical = Alignment.CenterVertically,
     unbounded: Boolean = false
@@ -581,7 +576,6 @@
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentAlignedModifier
  */
 @Stable
-@Suppress("ModifierInspectorInfo")
 fun Modifier.wrapContentSize(
     align: Alignment = Alignment.Center,
     unbounded: Boolean = false
@@ -608,7 +602,6 @@
  * Example usage:
  * @sample androidx.compose.foundation.layout.samples.DefaultMinSizeSample
  */
-@Suppress("ModifierInspectorInfo")
 @Stable
 fun Modifier.defaultMinSize(
     minWidth: Dp = Dp.Unspecified,
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt
index abf9a58..76af273 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsSize.kt
@@ -45,7 +45,6 @@
  *
  * @sample androidx.compose.foundation.layout.samples.insetsStartWidthSample
  */
-@Suppress("ModifierInspectorInfo")
 @Stable
 fun Modifier.windowInsetsStartWidth(insets: WindowInsets) = this.then(
     DerivedWidthModifier(insets, debugInspectorInfo {
@@ -71,7 +70,6 @@
  *
  * @sample androidx.compose.foundation.layout.samples.insetsEndWidthSample
  */
-@Suppress("ModifierInspectorInfo")
 @Stable
 fun Modifier.windowInsetsEndWidth(insets: WindowInsets) = this.then(
     DerivedWidthModifier(insets, debugInspectorInfo {
@@ -95,7 +93,6 @@
  *
  * @sample androidx.compose.foundation.layout.samples.insetsTopHeightSample
  */
-@Suppress("ModifierInspectorInfo")
 @Stable
 fun Modifier.windowInsetsTopHeight(insets: WindowInsets) = this.then(
     DerivedHeightModifier(insets, debugInspectorInfo {
@@ -115,7 +112,6 @@
  *
  * @sample androidx.compose.foundation.layout.samples.insetsBottomHeightSample
  */
-@Suppress("ModifierInspectorInfo")
 @Stable
 fun Modifier.windowInsetsBottomHeight(insets: WindowInsets) = this.then(
     DerivedHeightModifier(insets, debugInspectorInfo {
diff --git a/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/AndroidSelectionHandles.android.kt b/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/AndroidSelectionHandles.android.kt
index ab50488..50a2e51 100644
--- a/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/AndroidSelectionHandles.android.kt
+++ b/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/AndroidSelectionHandles.android.kt
@@ -102,7 +102,6 @@
     )
 }
 
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.drawSelectionHandle(
     isStartHandle: Boolean,
     direction: ResolvedTextDirection,
diff --git a/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionManager.android.kt b/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionManager.android.kt
index 7a7e170..fa0d056 100644
--- a/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionManager.android.kt
+++ b/compose/foundation/foundation-newtext/src/androidMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionManager.android.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.foundation.newtext.text.copypasta.selection
 
-import android.annotation.SuppressLint
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.MagnifierStyle
 import androidx.compose.foundation.magnifier
@@ -36,7 +35,6 @@
 
 // We use composed{} to read a local, but don't provide inspector info because the underlying
 // magnifier modifier provides more meaningful inspector info.
-@SuppressLint("ModifierInspectorInfo")
 @OptIn(ExperimentalFoundationApi::class)
 internal actual fun Modifier.selectionMagnifier(manager: SelectionManager): Modifier {
     // Avoid tracking animation state on older Android versions that don't support magnifiers.
diff --git a/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionMagnifier.kt b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionMagnifier.kt
index 2817f3e..1f7a00c 100644
--- a/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionMagnifier.kt
+++ b/compose/foundation/foundation-newtext/src/commonMain/kotlin/androidx/compose/foundation/newtext/text/copypasta/selection/SelectionMagnifier.kt
@@ -60,7 +60,6 @@
  * The text magnifier follows horizontal dragging exactly, but is vertically clamped to the current
  * line, so when it changes lines we animate it.
  */
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.animatedSelectionMagnifier(
     magnifierCenter: () -> Offset,
     platformMagnifier: (animatedCenter: () -> Offset) -> Modifier
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt
index e1375ef..925b531 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.foundation
 
-import android.annotation.SuppressLint
 import android.os.Build
 import android.widget.Magnifier
 import androidx.annotation.ChecksSdkIntAtLeast
@@ -261,7 +260,6 @@
 @OptIn(ExperimentalFoundationApi::class)
 // The InspectorInfo this modifier reports is for the above public overload, and intentionally
 // doesn't include the platformMagnifierFactory parameter.
-@SuppressLint("ModifierInspectorInfo")
 @RequiresApi(28)
 internal fun Modifier.magnifier(
     sourceCenter: Density.() -> Offset,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt
index 5d3a11a..9cd3f60 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/AndroidCursorHandle.android.kt
@@ -59,7 +59,6 @@
     Spacer(modifier.size(CursorHandleWidth, CursorHandleHeight).drawCursorHandle())
 }
 
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.drawCursorHandle() = composed {
     val handleColor = LocalTextSelectionColors.current.handleColor
     this.then(
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
index 2e36f5e..70000af 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
@@ -105,7 +105,6 @@
     )
 }
 
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.drawSelectionHandle(
     isStartHandle: Boolean,
     direction: ResolvedTextDirection,
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt
index fb8c947..2227609 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.android.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.foundation.text.selection
 
-import android.annotation.SuppressLint
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.MagnifierStyle
 import androidx.compose.foundation.magnifier
@@ -37,7 +36,6 @@
 
 // We use composed{} to read a local, but don't provide inspector info because the underlying
 // magnifier modifier provides more meaningful inspector info.
-@SuppressLint("ModifierInspectorInfo")
 @OptIn(ExperimentalFoundationApi::class)
 internal actual fun Modifier.selectionMagnifier(manager: SelectionManager): Modifier {
     // Avoid tracking animation state on older Android versions that don't support magnifiers.
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt
index af9d356..e750b21 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.android.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.foundation.text.selection
 
-import android.annotation.SuppressLint
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.MagnifierStyle
 import androidx.compose.foundation.magnifier
@@ -35,7 +34,6 @@
 
 // We use composed{} to read a local, but don't provide inspector info because the underlying
 // magnifier modifier provides more meaningful inspector info.
-@SuppressLint("ModifierInspectorInfo")
 @OptIn(ExperimentalFoundationApi::class)
 internal actual fun Modifier.textFieldMagnifier(manager: TextFieldSelectionManager): Modifier {
     // Avoid tracking animation state on older Android versions that don't support magnifiers.
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
index 1e56270..9e43e1c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutSemantics.kt
@@ -35,7 +35,7 @@
 import kotlinx.coroutines.launch
 
 @OptIn(ExperimentalFoundationApi::class)
-@Suppress("ComposableModifierFactory", "ModifierInspectorInfo")
+@Suppress("ComposableModifierFactory")
 @Composable
 internal fun Modifier.lazyLayoutSemantics(
     itemProvider: LazyLayoutItemProvider,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt
index 69c0ab3..703aa24 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldCursor.kt
@@ -36,7 +36,6 @@
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.withContext
 
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.cursor(
     state: TextFieldState,
     value: TextFieldValue,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
index 10bdc6d..37db2fe 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldKeyInput.kt
@@ -232,7 +232,6 @@
     }
 }
 
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.textFieldKeyInput(
     state: TextFieldState,
     manager: TextFieldSelectionManager,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt
index 24af865..dbb23d8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldPressGestureFilter.kt
@@ -33,7 +33,6 @@
 /**
  * Required for the press and tap [MutableInteractionSource] consistency for TextField.
  */
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.tapPressTextFieldModifier(
     interactionSource: MutableInteractionSource?,
     enabled: Boolean = true,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
index 62f03bc..124fdb7 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldSize.kt
@@ -35,7 +35,6 @@
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.textFieldMinSize(style: TextStyle) = composed {
     val density = LocalDensity.current
     val fontFamilyResolver = LocalFontFamilyResolver.current
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt
index 531f018..604a5c3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMagnifier.kt
@@ -60,7 +60,6 @@
  * The text magnifier follows horizontal dragging exactly, but is vertically clamped to the current
  * line, so when it changes lines we animate it.
  */
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.animatedSelectionMagnifier(
     magnifierCenter: () -> Offset,
     platformMagnifier: (animatedCenter: () -> Offset) -> Modifier
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
index 29098a8..34632df 100644
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
+++ b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ComposeIssueRegistry.kt
@@ -29,7 +29,6 @@
     override val issues get(): List<Issue> {
         return listOf(
             ListIteratorDetector.ISSUE,
-            ModifierInspectorInfoDetector.ISSUE,
             UnnecessaryLambdaCreationDetector.ISSUE,
         )
     }
diff --git a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ModifierInspectorInfoDetector.kt b/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ModifierInspectorInfoDetector.kt
deleted file mode 100644
index 7cb8923..0000000
--- a/compose/lint/internal-lint-checks/src/main/java/androidx/compose/lint/ModifierInspectorInfoDetector.kt
+++ /dev/null
@@ -1,695 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("UnstableApiUsage")
-
-package androidx.compose.lint
-
-import com.android.tools.lint.client.api.UElementHandler
-import com.android.tools.lint.detector.api.Category
-import com.android.tools.lint.detector.api.Detector
-import com.android.tools.lint.detector.api.Implementation
-import com.android.tools.lint.detector.api.Issue
-import com.android.tools.lint.detector.api.JavaContext
-import com.android.tools.lint.detector.api.Scope
-import com.android.tools.lint.detector.api.Severity
-import com.android.tools.lint.detector.api.SourceCodeScanner
-import com.android.tools.lint.detector.api.TextFormat
-import com.intellij.psi.PsiField
-import com.intellij.psi.PsiJavaFile
-import com.intellij.psi.PsiMethod
-import com.intellij.psi.PsiType
-import com.intellij.psi.PsiWildcardType
-import com.intellij.psi.impl.source.PsiClassReferenceType
-import com.intellij.psi.util.InheritanceUtil
-import org.jetbrains.kotlin.asJava.classes.KtLightClass
-import org.jetbrains.kotlin.asJava.elements.KtLightField
-import org.jetbrains.kotlin.asJava.elements.KtLightParameter
-import org.jetbrains.kotlin.name.FqName
-import org.jetbrains.kotlin.psi.KtFile
-import org.jetbrains.kotlin.psi.KtParameter
-import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes.VALUE_PARAMETER
-import org.jetbrains.uast.UBinaryExpression
-import org.jetbrains.uast.UBlockExpression
-import org.jetbrains.uast.UCallExpression
-import org.jetbrains.uast.UElement
-import org.jetbrains.uast.UExpression
-import org.jetbrains.uast.UExpressionList
-import org.jetbrains.uast.UIfExpression
-import org.jetbrains.uast.ULambdaExpression
-import org.jetbrains.uast.UMethod
-import org.jetbrains.uast.UObjectLiteralExpression
-import org.jetbrains.uast.UQualifiedReferenceExpression
-import org.jetbrains.uast.UReturnExpression
-import org.jetbrains.uast.USimpleNameReferenceExpression
-import org.jetbrains.uast.USwitchClauseExpression
-import org.jetbrains.uast.USwitchClauseExpressionWithBody
-import org.jetbrains.uast.USwitchExpression
-import org.jetbrains.uast.UYieldExpression
-import org.jetbrains.uast.kotlin.KotlinStringTemplateUPolyadicExpression
-import org.jetbrains.uast.kotlin.KotlinStringULiteralExpression
-import org.jetbrains.uast.kotlin.KotlinUArrayAccessExpression
-import org.jetbrains.uast.kotlin.KotlinUFunctionCallExpression
-import org.jetbrains.uast.kotlin.KotlinUQualifiedReferenceExpression
-import org.jetbrains.uast.kotlin.KotlinUSimpleReferenceExpression
-import org.jetbrains.uast.visitor.AbstractUastVisitor
-
-private const val ModifierClass = "androidx.compose.ui.Modifier"
-private const val ModifierCompanionClass = "androidx.compose.ui.Modifier.Companion"
-private const val ModifierFile = "Modifier.kt"
-private const val ComposedModifierFile = "ComposedModifier.kt"
-private const val InspectableValueFile = "InspectableValue.kt"
-private const val LambdaFunction = "kotlin.jvm.functions.Function1"
-private const val InspectorInfoClass = "androidx.compose.ui.platform.InspectorInfo"
-private const val InspectorValueInfoClass = "androidx.compose.ui.platform.InspectorValueInfo"
-private const val UnitClass = "kotlin.Unit"
-private const val DebugInspectorInfoFunction = "debugInspectorInfo"
-private const val ThenMethodName = "then"
-private const val ComposedMethodName = "composed"
-private const val RememberMethodName = "remember"
-private const val InspectableMethodName = "inspectable"
-private const val ComposedMethodPackage = "androidx.compose.ui"
-private const val RememberMethodPackage = "androidx.compose.runtime"
-private val DemosPackageRegEx = "androidx\\.compose\\..+\\.demos\\..+".toRegex()
-private val UiPackage = FqName("androidx.compose.ui")
-private val PlatformPackage = FqName("androidx.compose.ui.platform")
-
-/**
- * Lint [Detector] to ensure that we are creating debug information for the layout inspector on
- * all modifiers. For example in:
- * ```
- *   fun Modifier.width(width: Dp) = this.then(SizeModifier(width))
- * ```
- *
- * The layout inspector will not know that the name is `width` and the `width` member
- * may not be a field in SizeModifier that we can see via reflection.
- *
- * To supply debug information to the layout inspector include an InspectorInfo lambda like this:
- * ```
- *   fun Modifier.width(width: Dp) = this.then(
- *      SizeModifier(
- *          width = width,
- *          inspectorInfo = debugInspectorInfo {
- *              name = "width",
- *              value = width,
- *          )
- *      )
- *  )
- * ```
- *
- * The `debugInspectorInfo' lambda will be stripped from release builds.
- *
- * If the modifier has multiple parameters use the `properties` specifier instead:
- * ```
- *   fun Modifier.size(width: Dp, height: Dp) = this.then(
- *      SizeModifier(
- *          width = width,
- *          inspectorInfo = debugInspectorInfo {
- *              name = "width",
- *              properties["width"] = width
- *              properties["height"] = height
- *          )
- *      )
- *  )
- * ```
- *
- * This inspector only applies to Modifiers implemented prior to Modifier.Node. For the
- * corresponding Modifier.Node inspection, see `ModifierNodeInspectablePropertiesDetector` in
- * `:compose:ui:ui-lint`.
- */
-class ModifierInspectorInfoDetector : Detector(), SourceCodeScanner {
-    override fun createUastHandler(context: JavaContext): UElementHandler = ModifierHandler(context)
-
-    override fun getApplicableUastTypes() = listOf(UMethod::class.java)
-
-    /**
-     * This handler visits every method and determines if this is a Modifier definition with a
-     * `then` construct, and reports an issue for any of the following problems:
-     *
-     * 1. The modifier implementation is not a function call
-     * 2. The modifier implementation does not have an InspectorInfo lambda as last parameter
-     * 3. The lambda is not surrounded by a call to `debugInspectorInfo`
-     * 4. The modifier name is missing from the lambda or specified incorrectly
-     * 5. A modifier value is specified that doesn't match an actual modifier argument
-     * 6. A modifier argument is specified that doesn't match an actual modifier argument
-     * 7. An actual modifier argument is missing
-     */
-    private class ModifierHandler(private val context: JavaContext) : UElementHandler() {
-        private val returnVisitor = ReturnVisitor()
-        private val builderVisitor = ModifierBuilderVisitor()
-        private val modifierVisitor = ModifierVisitor()
-        private val debugInspectorVisitor = DebugInspectorVisitor()
-        private val lambdaVisitor = InspectorLambdaVisitor()
-        private var methodInfo: MethodInfo? = null
-
-        override fun visitMethod(node: UMethod) {
-            if (node.isInFile(ModifierFile, UiPackage) ||
-                node.isInFile(ComposedModifierFile, UiPackage) ||
-                node.isInFile(InspectableValueFile, PlatformPackage) ||
-                firstParameterType(node) != ModifierClass ||
-                node.returnType?.canonicalText != ModifierClass ||
-                DemosPackageRegEx.matches(node.containingClass?.qualifiedName ?: "")
-            ) {
-                // Ignore the method if it isn't a method on Modifier returning a Modifier,
-                // or if the method is defined in Modifier.kt or ComposedModifier.kt
-                return
-            }
-            methodInfo = MethodInfo(node)
-            node.uastBody?.accept(returnVisitor)
-            methodInfo = null
-        }
-
-        private fun UMethod.isInFile(fileName: String, packageName: FqName): Boolean {
-            val file = containingFile as? KtFile ?: return false
-            return file.name == fileName && file.packageFqName == packageName
-        }
-
-        private fun firstParameterType(method: UMethod): String? =
-            (method.parameters.firstOrNull() as? KtLightParameter)?.type?.canonicalText
-
-        private fun isModifierType(type: PsiType?): Boolean =
-            InheritanceUtil.isInheritor(type, ModifierClass)
-
-        // Disregard the mangled part of a method with inline class parameters.
-        // TODO: change this to an API call when a demangle function is available
-        private fun name(method: PsiMethod): String =
-            method.name.substringBefore('-')
-
-        private fun wildcardType(type: PsiType?): String? =
-            (type as? PsiWildcardType)?.bound?.canonicalText
-
-        private fun isThenFunctionCall(node: UQualifiedReferenceExpression): Boolean {
-            if (!isModifierType(node.receiver.getExpressionType())) return false
-            val then = node.selector as? KotlinUFunctionCallExpression ?: return false
-            return then.methodName == ThenMethodName &&
-                then.valueArguments.size == 1 &&
-                isModifierType(then.valueArguments.first().getExpressionType())
-        }
-
-        private fun isComposeFunctionCall(node: UCallExpression): Boolean =
-            node.methodName == ComposedMethodName &&
-                node.receiverType?.canonicalText == ModifierClass &&
-                node.returnType?.canonicalText == ModifierClass &&
-                methodPackageName(node) == ComposedMethodPackage
-
-        private fun isRememberFunctionCall(node: UCallExpression): Boolean =
-            node.methodName == RememberMethodName &&
-                node.receiver == null &&
-                isModifierType(node.returnType) &&
-                methodPackageName(node) == RememberMethodPackage
-
-        private fun isInspectableModifier(node: UCallExpression): Boolean =
-            node.methodName == InspectableMethodName &&
-                node.receiverType?.canonicalText in listOf(ModifierClass, ModifierCompanionClass) &&
-                node.returnType?.canonicalText == ModifierClass &&
-                methodPackageName(node) == PlatformPackage.asString()
-
-        // Return true if this is a lambda expression of the type: "InspectorInfo.() -> Unit"
-        private fun isInspectorInfoLambdaType(type: PsiType?): Boolean {
-            val referenceType = type as? PsiClassReferenceType ?: return false
-            return referenceType.rawType().canonicalText == LambdaFunction &&
-                referenceType.parameterCount == 2 &&
-                wildcardType(referenceType.parameters[0]) == InspectorInfoClass &&
-                wildcardType(referenceType.parameters[1]) !== UnitClass
-        }
-
-        private fun isDebugInspectorInfoCall(node: UCallExpression): Boolean =
-            node.methodName == DebugInspectorInfoFunction &&
-                node.valueArgumentCount == 1 &&
-                isInspectorInfoLambdaType(node.valueArguments.first().getExpressionType()) &&
-                isInspectorInfoLambdaType(node.returnType)
-
-        private fun methodPackageName(node: UCallExpression): String? =
-            (node.resolve()?.containingFile as? PsiJavaFile)?.packageName
-
-        private fun wrongLambda(element: UElement) =
-            report(element, ISSUE.getBriefDescription(TextFormat.TEXT))
-
-        private fun missingDebugInfoCall(element: UElement) =
-            report(element, message = "Expected debugInspectorInfo call")
-
-        private fun reportMissing(missingVariables: Set<String>, element: UElement) = report(
-            element = element,
-            message = "These lambda arguments are missing in the InspectorInfo: " +
-                "`${missingVariables.sorted().joinToString("`, `")}`"
-        )
-
-        private fun wrongName(expectedName: String, unexpected: UElement) = report(
-            element = unexpected,
-            message = "Expected name of the modifier: `\"name\" = \"${expectedName}\"`"
-        )
-
-        private fun wrongArgument(args: Collection<String>, unexpected: UElement) {
-            val message = when (args.size) {
-                0 -> "Unexpected, modifier has no arguments"
-                1 -> "Expected the variable: \"${args.first()}\""
-                else -> "Expected one of the variables: ${args.joinToString(", ", "\"", "\"")}"
-            }
-            report(unexpected, message = message)
-        }
-
-        private fun wrongArgumentForIndex(indexName: String, value: UElement) =
-            report(value, message = "The value should match the index name: `$indexName`")
-
-        private fun unexpected(element: UElement) =
-            report(element, message = "Unexpected element found")
-
-        private fun report(element: UElement, message: String) {
-            context.report(
-                ISSUE,
-                element,
-                context.getNameLocation(element),
-                message
-            )
-            methodInfo?.foundError = true
-        }
-
-        /**
-         * Method related data for checking the inspector lambda against the modifier method.
-         *
-         * The inspector lambda normally holds a `properties["name"] = name` expression for each
-         * of the parameters of the modifier. However if the modifier has exactly one parameter,
-         * and that parameter is an instance of a data class, then the arguments of the data class
-         * can be used in the lambda instead of the modifier parameters.
-         *
-         * See the test existingInspectorInfoWithDataClassMemberValues as an example.
-         */
-        private inner class MethodInfo(method: UMethod) {
-            val name = name(method)
-            val methodArguments = Arguments(findMethodArguments(method))
-            val dataClassArguments = Arguments(findDataClassMembers(method))
-            var foundName = false
-            var foundError = false
-
-            fun checkName(value: UExpression) {
-                if (name == literal(value)) {
-                    foundName = true
-                } else if (!foundError) {
-                    wrongName(name, value)
-                }
-            }
-
-            fun checkValue(value: UExpression, inConditional: Boolean) {
-                val (arguments, variable) = variable(value)
-                if (variable != null && arguments.expected.contains(variable)) {
-                    arguments.found.add(variable)
-                } else if (!foundError && !(inConditional && isArgumentReceiver(value))) {
-                    wrongArgument(arguments.expected, value)
-                }
-            }
-
-            /**
-             * Check an array from an Inspector lambda.
-             *
-             * A Inspector lambda may contain expressions of the form:
-             * `  properties["name"] = value
-             *
-             * Check the name and value against the known parameters of the modifier.
-             */
-            fun checkArray(
-                keyExpr: KotlinUArrayAccessExpression,
-                value: UExpression,
-                inConditional: Boolean
-            ) {
-                if (foundError) {
-                    return
-                }
-                val index = keyExpr.indices.singleOrNull()
-                val key = literal(index)
-                val (arguments, variable) = variable(value)
-                when {
-                    key != null && arguments.expected.contains(key) && key == variable ->
-                        arguments.found.add(variable)
-                    inConditional && isArgumentReceiver(value) ->
-                        {} // ignore extra information
-                    key == null || !arguments.expected.contains(key) ->
-                        wrongArgument(arguments.expected, index ?: keyExpr)
-                    else ->
-                        wrongArgumentForIndex(key, value)
-                }
-            }
-
-            fun checkComplete(lambda: UExpression) {
-                if (foundError) {
-                    return
-                } else if (!foundName) {
-                    wrongName(name, lambda)
-                } else {
-                    val arguments =
-                        if (dataClassArguments.found.isNotEmpty()) dataClassArguments
-                        else methodArguments
-                    val absentVariables = arguments.expected.minus(arguments.found)
-                    if (absentVariables.isNotEmpty()) {
-                        reportMissing(absentVariables, lambda)
-                    }
-                }
-            }
-
-            private fun literal(expr: UExpression?): String? = when (expr) {
-                is KotlinStringULiteralExpression,
-                is KotlinStringTemplateUPolyadicExpression -> expr.evaluate() as? String
-                else -> null
-            }
-
-            private fun isArgumentReceiver(value: UExpression): Boolean {
-                val reference = value as? KotlinUQualifiedReferenceExpression ?: return false
-                val (arguments, variable) = variable(reference.receiver)
-                return arguments.expected.contains(variable)
-            }
-
-            /**
-             * Return the name of the variable that the [expr] represents.
-             *
-             * This can be a simple parameter variable from the modifier.\
-             * Example: `width` from `fun Modifier.width(width: Int)`
-             *
-             * Or it can be a selector from a data class parameter variable from the modifier.\
-             * Example: `values.start` from `fun Modifier.border(values: Borders)`
-             *
-             * where `Borders` is a data class with `start` as one of the value parameters.
-             */
-            private fun variable(expr: UExpression?): Pair<Arguments, String?> {
-                return when (expr) {
-                    is KotlinUSimpleReferenceExpression ->
-                        Pair(methodArguments, expr.identifier)
-                    is KotlinUQualifiedReferenceExpression -> {
-                        val receiver = identifier(expr.receiver)
-                        if (methodArguments.expected.contains(receiver)) {
-                            Pair(dataClassArguments, identifier(expr.selector))
-                        } else {
-                            Pair(methodArguments, null)
-                        }
-                    }
-                    else -> Pair(methodArguments, null)
-                }
-            }
-
-            private fun identifier(expr: UExpression?): String? =
-                (expr as? KotlinUSimpleReferenceExpression)?.identifier
-
-            private fun findMethodArguments(method: UMethod): Set<String> =
-                method.parameters.asSequence().drop(1).mapNotNull { it.name }.toSet()
-
-            /**
-             * Return all the names of the value parameters of a data class.
-             *
-             * We don't actually know if a class is a data class, but we can see if all the
-             * parameters of the main constructor are value parameter fields.
-             */
-            private fun findDataClassMembers(method: UMethod): Set<String> {
-                val singleParameter = method.parameters.asSequence().drop(1).singleOrNull()
-                val type = (singleParameter?.type as? PsiClassReferenceType)?.reference?.resolve()
-                val klass = type as? KtLightClass ?: return emptySet()
-                val mainConstructor = klass.constructors.firstOrNull() ?: return emptySet()
-                val valueParameters = klass.fields.asSequence()
-                    .filter { isValueParameter(it) }.map { it.name }.toSet()
-                val constructorParameters = mainConstructor.parameters.asSequence()
-                    .map { it.name }.toSet()
-                if (constructorParameters != valueParameters) {
-                    return emptySet()
-                }
-                return valueParameters
-            }
-
-            private fun isValueParameter(field: PsiField): Boolean {
-                val kotlinField = field as? KtLightField
-                val kotlinParameter =
-                    kotlinField?.lightMemberOrigin?.originalElement as? KtParameter
-                return kotlinParameter?.elementType == VALUE_PARAMETER
-            }
-        }
-
-        private class Arguments(val expected: Set<String>) {
-            val found = mutableSetOf<String>()
-        }
-
-        /**
-         * Finds all return expressions, ignores all other elements.
-         */
-        private inner class ReturnVisitor : AbstractUastVisitor() {
-            override fun visitReturnExpression(node: UReturnExpression): Boolean {
-                node.returnExpression?.accept(builderVisitor)
-                return true
-            }
-
-            // Ignore returns from a lambda expression
-            override fun visitLambdaExpression(node: ULambdaExpression): Boolean = true
-        }
-
-        /**
-         * Find and check known Modifier builder expressions.
-         *
-         * The expression is known to be the return expression from a return statement.
-         *
-         * Currently the only check the following expressions:
-         * - Modifier.then(Modifier)
-         * - Modifier.composed(InspectorInfoLambda,factory)
-         * - everything else is ignored
-         */
-        private inner class ModifierBuilderVisitor : AbstractUastVisitor() {
-            override fun visitQualifiedReferenceExpression(
-                node: UQualifiedReferenceExpression
-            ): Boolean {
-                if (isThenFunctionCall(node)) {
-                    node.receiver.accept(this)
-                    val then = node.selector as KotlinUFunctionCallExpression
-                    then.valueArguments.first().accept(modifierVisitor)
-                    return true
-                }
-                return super.visitQualifiedReferenceExpression(node)
-            }
-
-            override fun visitCallExpression(node: UCallExpression): Boolean {
-                if (isComposeFunctionCall(node)) {
-                    val inspectorInfo = node.valueArguments
-                        .find { isInspectorInfoLambdaType(it.getExpressionType()) }
-                    if (inspectorInfo == null) {
-                        wrongLambda(node)
-                    } else {
-                        inspectorInfo.accept(debugInspectorVisitor)
-                    }
-                    return true
-                }
-                return super.visitCallExpression(node)
-            }
-        }
-
-        /**
-         * Find and check the Modifier constructor.
-         *
-         * The expression is known to be inside one of the Modifier builder expressions accepted
-         * by [ModifierBuilderVisitor].
-         *
-         * Currently the only accepted expressions are of the form:
-         * - SomeClassExtendingModifier(p1,p2,p3,p4,inspectorInfoLambda)
-         * - SomeClass.InnerModifier(p1,p2,p3,p4,inspectorInfoLambda)
-         * - object : Modifier, InspectorValueInfoClass(inspectorInfoLambda)
-         * - remember { }
-         * - Modifier
-         * - if-then-else (with a modifier constructor in both then and else)
-         * - when (with a modifier constructor in each of the when clauses)
-         * All other expressions are considered errors.
-         */
-        private inner class ModifierVisitor : UnexpectedVisitor({ wrongLambda(it) }) {
-            override fun visitCallExpression(node: UCallExpression): Boolean {
-                val info: UExpression? = node.valueArguments.firstOrNull {
-                    isInspectorInfoLambdaType(it.getExpressionType())
-                }
-                if (info != null) {
-                    info.accept(debugInspectorVisitor)
-                    return true
-                }
-                if (isRememberFunctionCall(node)) {
-                    val lambda = node.valueArguments.singleOrNull() as? ULambdaExpression
-                    val body = lambda?.body as? UBlockExpression
-                    val ret = body?.expressions?.firstOrNull() as? UReturnExpression
-                    val definition = ret?.returnExpression ?: return super.visitCallExpression(node)
-                    definition.accept(this)
-                    return true
-                }
-                if (isModifierType(node.receiverType) && isModifierType(node.returnType)) {
-                    // For now accept all other calls. Assume that the method being called
-                    // will add inspector information.
-                    return true
-                }
-                return super.visitCallExpression(node)
-            }
-
-            override fun visitQualifiedReferenceExpression(
-                node: UQualifiedReferenceExpression
-            ): Boolean {
-                node.selector.accept(this)
-                return true
-            }
-
-            override fun visitObjectLiteralExpression(node: UObjectLiteralExpression): Boolean {
-                if (node.valueArgumentCount == 1 &&
-                    node.declaration.uastSuperTypes.any {
-                        it.getQualifiedName() == InspectorValueInfoClass
-                    }
-                ) {
-                    node.valueArguments.first().accept(debugInspectorVisitor)
-                    return true
-                }
-                return super.visitObjectLiteralExpression(node)
-            }
-
-            override fun visitSimpleNameReferenceExpression(
-                node: USimpleNameReferenceExpression
-            ): Boolean {
-                // Accept any variable including Modifier
-                return true
-            }
-
-            override fun visitIfExpression(node: UIfExpression): Boolean {
-                node.thenExpression?.accept(this)
-                node.elseExpression?.accept(this)
-                return true
-            }
-
-            override fun visitSwitchExpression(node: USwitchExpression): Boolean {
-                node.body.accept(this)
-                return true
-            }
-
-            override fun visitSwitchClauseExpression(node: USwitchClauseExpression): Boolean {
-                (node as? USwitchClauseExpressionWithBody)?.let {
-                    it.body.expressions.last().accept(this)
-                    return true
-                }
-                return super.visitSwitchClauseExpression(node)
-            }
-
-            override fun visitYieldExpression(node: UYieldExpression): Boolean {
-                return false
-            }
-
-            override fun visitExpressionList(node: UExpressionList): Boolean {
-                return false
-            }
-
-            override fun visitBlockExpression(node: UBlockExpression): Boolean {
-                node.expressions.lastOrNull()?.accept(this)
-                return true
-            }
-        }
-
-        /**
-         * Expect debugInspectorInfo factory method:
-         * - debugInspectorInfo { inspectorInfoLambda }
-         * For all other expressions: complain about the missing debugInspectorInfo call.
-         */
-        private inner class DebugInspectorVisitor :
-            UnexpectedVisitor({ missingDebugInfoCall(it) }) {
-
-            override fun visitCallExpression(node: UCallExpression): Boolean {
-                if (isDebugInspectorInfoCall(node)) {
-                    node.valueArguments.single().accept(lambdaVisitor)
-                    return true
-                }
-                return super.visitCallExpression(node)
-            }
-        }
-
-        /**
-         * Find and check the InspectorInfo lambda.
-         *
-         * The expression is known to be a InspectorInfo lambda found inside a debugInspectorInfo
-         * call from one of the modifier constructors accepted by [ModifierVisitor].
-         *
-         * Check the name, value, and properties against the original modifier definition expressed
-         * by [methodInfo] found by [ModifierHandler] above. After the lambda expression check that
-         * all the elements of [methodInfo] was found.
-         */
-        private inner class InspectorLambdaVisitor : UnexpectedVisitor({ unexpected(it) }) {
-            // We allow alternate values inside conditionals.
-            // Example see the test: existingInspectorInfoWffithConditionals.
-            var inConditional = false
-
-            override fun visitBinaryExpression(node: UBinaryExpression): Boolean {
-                val left = node.leftOperand
-                val right = node.rightOperand
-                when {
-                    left is KotlinUSimpleReferenceExpression && left.identifier == "name" ->
-                        methodInfo?.checkName(right)
-                    left is KotlinUSimpleReferenceExpression && left.identifier == "value" ->
-                        methodInfo?.checkValue(right, inConditional)
-                    left is KotlinUArrayAccessExpression ->
-                        methodInfo?.checkArray(left, right, inConditional)
-                    else ->
-                        unexpected(left)
-                }
-                return true
-            }
-
-            override fun visitLambdaExpression(node: ULambdaExpression): Boolean {
-                // accept, and recurse
-                return false
-            }
-
-            override fun visitIfExpression(node: UIfExpression): Boolean {
-                inConditional = true
-                try {
-                    node.thenExpression?.accept(this)
-                    node.elseExpression?.accept(this)
-                } finally {
-                    inConditional = false
-                }
-                return true
-            }
-
-            override fun visitBlockExpression(node: UBlockExpression): Boolean {
-                // accept, and recurse
-                return false
-            }
-
-            override fun afterVisitLambdaExpression(node: ULambdaExpression) {
-                methodInfo?.checkComplete(node)
-            }
-        }
-
-        private abstract inner class UnexpectedVisitor(
-            private val error: (node: UElement) -> Unit
-        ) : AbstractUastVisitor() {
-
-            override fun visitElement(node: UElement): Boolean {
-                error(node)
-                return true
-            }
-        }
-    }
-
-    companion object {
-        val ISSUE = Issue.create(
-            id = "ModifierInspectorInfo",
-            briefDescription = "Modifier missing inspectorInfo",
-            explanation =
-                """
-                The Layout Inspector will see an instance of the usually private modifier class \
-                where the modifier name is gone, and the fields may not reflect directly on what \
-                was specified for the modifier. Instead specify the `inspectorInfo` directly on \
-                the modifier. See example here:
-                `androidx.compose.ui.samples.InspectorInfoInComposedModifierSample`.""",
-            category = Category.PRODUCTIVITY,
-            priority = 5,
-            severity = Severity.ERROR,
-            implementation = Implementation(
-                ModifierInspectorInfoDetector::class.java,
-                Scope.JAVA_FILE_SCOPE
-            )
-        )
-    }
-}
diff --git a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/ModifierInspectorInfoDetectorTest.kt b/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/ModifierInspectorInfoDetectorTest.kt
deleted file mode 100644
index 25fa03f..0000000
--- a/compose/lint/internal-lint-checks/src/test/java/androidx/compose/lint/ModifierInspectorInfoDetectorTest.kt
+++ /dev/null
@@ -1,1440 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("UnstableApiUsage")
-
-package androidx.compose.lint
-
-import androidx.compose.lint.test.Stubs
-import com.android.tools.lint.checks.infrastructure.LintDetectorTest
-import com.android.tools.lint.checks.infrastructure.TestMode
-import com.android.tools.lint.detector.api.Detector
-import com.android.tools.lint.detector.api.Issue
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-/* ktlint-disable max-line-length */
-@RunWith(JUnit4::class)
-class ModifierInspectorInfoDetectorTest : LintDetectorTest() {
-    override fun getDetector(): Detector = ModifierInspectorInfoDetector()
-
-    override fun getIssues(): List<Issue> = listOf(ModifierInspectorInfoDetector.ISSUE)
-
-    private val inspectableInfoStub = kotlin(
-        """
-        package androidx.compose.ui.platform
-
-        import androidx.compose.ui.Modifier
-
-        val NoInspectorInfo: InspectorInfo.() -> Unit = {}
-        val DebugInspectorInfo = false
-
-        interface InspectableValue {
-            val inspectableElements: Sequence<ValueElement>
-                get() = emptySequence()
-
-            val nameFallback: String?
-                get() = null
-
-            val valueOverride: Any?
-                get() = null
-        }
-
-        data class ValueElement(val name: String, val value: Any?)
-
-        class InspectorInfo {
-            var name: String? = null
-            var value: Any? = null
-            val properties = ValueElementSequence()
-        }
-
-        class ValueElementSequence : Sequence<ValueElement> {
-            private val elements = mutableListOf<ValueElement>()
-
-            override fun iterator(): Iterator<ValueElement> = elements.iterator()
-
-            operator fun set(name: String, value: Any?) {
-                elements.add(ValueElement(name, value))
-            }
-        }
-
-        abstract class InspectorValueInfo(
-            private val info: InspectorInfo.() -> Unit
-        ) : InspectableValue {
-            private var _values: InspectorInfo? = null
-
-            private val values: InspectorInfo
-                get() {
-                    val valueInfo = _values ?: InspectorInfo().apply { info() }
-                    _values = valueInfo
-                    return valueInfo
-                }
-
-            override val nameFallback: String?
-                get() = values.name
-
-            override val valueOverride: Any?
-                get() = values.value
-
-            override val inspectableElements: Sequence<ValueElement>
-                get() = values.properties
-        }
-
-        inline fun debugInspectorInfo(
-            crossinline definitions: InspectorInfo.() -> Unit
-        ): InspectorInfo.() -> Unit =
-            if (DebugInspectorInfo) ({ definitions() }) else NoInspectorInfo
-
-        fun Modifier.inspectable(
-            inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo,
-            wrapped: Modifier
-        ): Modifier = this.then(InspectableModifierImpl(inspectorInfo, wrapped))
-
-        /**
-         * Interface for a [Modifier] wrapped for inspector purposes.
-         */
-        interface InspectableModifier {
-            val wrapped: Modifier
-        }
-
-        private class InspectableModifierImpl(
-            inspectorInfo: InspectorInfo.() -> Unit,
-            override val wrapped: Modifier
-        ) : Modifier.Element, InspectableModifier, InspectorValueInfo(inspectorInfo) {
-            override fun <R> foldIn(initial: R, operation: (R, Modifier.Element) -> R): R =
-                wrapped.foldIn(operation(initial, this), operation)
-
-            override fun <R> foldOut(initial: R, operation: (Modifier.Element, R) -> R): R =
-                operation(this, wrapped.foldOut(initial, operation))
-
-            override fun any(predicate: (Modifier.Element) -> Boolean): Boolean =
-                wrapped.any(predicate)
-
-            override fun all(predicate: (Modifier.Element) -> Boolean): Boolean =
-                wrapped.all(predicate)
-        }
-        """
-    ).indented()
-
-    private val composedStub = kotlin(
-        """
-        package androidx.compose.ui
-
-        import androidx.compose.ui.platform.InspectorInfo
-        import androidx.compose.ui.platform.InspectorValueInfo
-
-        fun Modifier.composed(
-            inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo,
-            factory: Modifier.() -> Modifier
-        ): Modifier = this.then(ComposedModifier(inspectorInfo, factory))
-
-        private class ComposedModifier(
-            inspectorInfo: InspectorInfo.() -> Unit,
-            val factory: Modifier.() -> Modifier
-        ) : Modifier.Element, InspectorValueInfo(inspectorInfo)
-        """
-    ).indented()
-
-    @Test
-    fun existingInspectorInfo() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                inline class Dp(val value: Float)
-
-                fun Modifier.width1(width: Dp) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        properties["width"] = width
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo)
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoWithStatementsBeforeDefinition() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                inline class Dp(val value: Float)
-
-                inline fun require(value: Boolean, lazyMessage: () -> String) {
-                    if (!value) {
-                        val message = lazyMessage()
-                        throw IllegalArgumentException(message)
-                    }
-                }
-
-                fun Modifier.width1(width: Dp): Modifier {
-                    require(width.value > 0.0f) { return "sds" }
-
-                    val x = width.value.toInt() * 2
-                    for (i in 0..4) {
-                        println("x = " + x)
-                    }
-
-                    return this.then(SizeModifier1(x, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        properties["width"] = width
-                    }))
-                }
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo)
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoWithValue() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width2(width: Int) =
-                    this.then(SizeModifier2(width, inspectorInfo = debugInspectorInfo {
-                        name = "width2"
-                        value = width
-                    }))
-
-                private class SizeModifier2(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoViaSynonym() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                inline class Dp(val value: Float)
-
-                fun Modifier.width1(width: Dp) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        properties["width"] = width
-                    }))
-
-                fun Modifier.width2(width: Dp) = width1(width)
-
-                fun Modifier.width20() = width1(Dp(20.0f))
-
-                fun Modifier.preferredIconWidth(x: Int) = this.then(
-                    if (x == 7) DefaultIconSizeModifier else Modifier
-                )
-
-                private val DefaultIconSizeModifier = Modifier.width1(Dp(24.0f))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo)
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoWithAnonymousClass() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.drawBehind() = this.then(
-                  object : Modifier,
-                           InspectorValueInfo(debugInspectorInfo { name = "drawBehind" }) {}
-                )
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoWithDataClassMemberValues() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.border(values: Borders) =
-                    this.then(BorderModifier(values, inspectorInfo = debugInspectorInfo {
-                        name = "border"
-                        properties["start"] = values.start
-                        properties["top"] = values.top
-                        properties["end"] = values.end
-                        properties["bottom"] = values.bottom
-                    }))
-
-                fun Modifier.border2(start: Int, top: Int, end: Int, bottom: Int) =
-                    this.then(
-                        BorderModifier2(
-                            start, top, end, bottom, inspectorInfo = debugInspectorInfo {
-                                name = "border2"
-                                properties["start"] = start
-                                properties["top"] = top
-                                properties["end"] = end
-                                properties["bottom"] = bottom
-                            }))
-
-                fun Modifier.border2(values: Borders) =
-                    border2(values.start, values.top, values.end, values.bottom)
-
-                fun Modifier.border3(corner1: Location, corner2: Location) =
-                    border2(corner1.x, corner1.y, corner2.x, corner2.y)
-
-                private class BorderModifier(
-                    val values: Borders,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                private class BorderModifier2(
-                    val start: Int,
-                    val top: Int,
-                    val end: Int,
-                    val bottom: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                data class Borders(val start: Int, val top: Int, val end: Int, val bottom: Int) {
-                    constructor(all: Int) : this(all, all, all, all)
-                }
-
-                data class Location(val x: Int, val y: Int)
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoWithConditional() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.padding(size: Int) =
-                    this.then(
-                        if (size >= 10) {
-                            PaddingModifier(
-                                paddingSize = size,
-                                inspectorInfo = debugInspectorInfo {
-                                    name = "padding"
-                                    properties["size"] = size
-                                }
-                            )
-                        } else {
-                            Modifier
-                        }
-                    )
-
-                fun Modifier.paddingFromBaseline(top: Int, bottom: Int) = this
-                    .then(if (bottom > 0) padding(bottom) else Modifier)
-                    .then(if (top > 0) padding(top) else Modifier)
-
-                fun Modifier.paddingFromBaseline2(top: Int, bottom: Int) =
-                    this.padding(bottom).padding(top)
-
-                private class PaddingModifier(
-                    paddingSize: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoWithWhen() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.border(painter: Painter) =
-                    this.then(
-                        when (painter.size) {
-                            0 -> Modifier
-                            1 -> BorderModifier(inspectorInfo = debugInspectorInfo {
-                                    name = "border"
-                                    properties["painter"] = painter
-                                 })
-                            else -> Modifier
-                        }
-                    )
-
-                private class BorderModifier(
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                class Painter(val size: Int)
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun existingInspectorInfoWithConditionals() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                class Brush
-
-                class SolidColor(val color: Int): Brush()
-
-                fun Modifier.border(width: Int, brush: Brush, shape: Shape): Modifier = composed(
-                    factory = { BorderModifier(shape, width, brush) },
-                    inspectorInfo = debugInspectorInfo {
-                        name = "border"
-                        properties["width"] = width
-                        if (brush is SolidColor) {
-                            properties["color"] = brush.value
-                            value = brush.value
-                        } else {
-                            properties["brush"] = brush
-                        }
-                        properties["shape"] = shape
-                    }
-                )
-
-                fun Modifier.border2(width: Int, color: Int, shape: Shape): Modifier =
-                    if (width > 0) {
-                        composed(
-                            inspectorInfo = debugInspectorInfo {
-                                name = "border2"
-                                properties["width"] = width
-                                properties["color"] = color
-                                properties["shape"] = shape
-                            }
-                        ) {
-                            border(width, SolidColor(color), shape)
-                        }
-                    } else {
-                        this
-                    }
-
-                private class BorderModifier(shape: Shape, width: Int, brush: Brush)
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun composedModifierWithInspectorInfo() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.border(width: Int): Modifier = composed(
-                    inspectorInfo = debugInspectorInfo {
-                        name = "border"
-                        properties["width"] = width
-                    },
-                    factory = { this.then(BorderModifier(width)) }
-                )
-
-                fun Modifier.border2(width: Int): Modifier = composed(
-                    factory = { this.then(BorderModifier(width)) },
-                    inspectorInfo = debugInspectorInfo {
-                        name = "border2"
-                        properties["width"] = width
-                    }
-                )
-
-                private class BorderModifier(private val width: Int): Modifier.Element {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun rememberModifierInfo() {
-        lint().files(
-            Stubs.Composable,
-            Stubs.Modifier,
-            composedStub,
-            Stubs.Remember,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.runtime.*
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width1(width: Int) = this.then(
-                    remember {
-                        SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                            name = "width1"
-                            properties["width"] = width
-                        })
-                    }
-                )
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo)
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun emptyModifier() {
-        lint().files(
-            Stubs.Composable,
-            Stubs.Modifier,
-            Stubs.Remember,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.runtime.*
-                import androidx.compose.ui.Modifier
-
-                internal actual fun Modifier.width1(width: Int): Modifier = this
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun acceptMissingInspectorInfoInSamples() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui.demos.whatever
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width2(width: Int) = this.then(SizeModifier2(width))
-
-                private data class SizeModifier2(
-                    val width: Int,
-                ): Modifier.Element
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun missingInspectorInfo() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.preferredWidth2(width: Int) = this.then(SizeModifier2(width))
-
-                private data class SizeModifier2(
-                    val width: Int,
-                ): Modifier.Element
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier2.kt:8: Error: Modifier missing inspectorInfo [ModifierInspectorInfo]
-                    fun Modifier.preferredWidth2(width: Int) = this.then(SizeModifier2(width))
-                                                                         ~~~~~~~~~~~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun composedModifierWithMissingInspectorInfo() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.border(width: Int): Modifier =
-                    composed { this.then(BorderModifier(width)) }
-
-                private class BorderModifier(private val width: Int): Modifier.Element {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/BorderModifier.kt:9: Error: Modifier missing inspectorInfo [ModifierInspectorInfo]
-                        composed { this.then(BorderModifier(width)) }
-                        ~~~~~~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun missingInspectorInfoFromInnerClassImplementation() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                /**
-                 * Documentation
-                 */
-                fun Modifier.size(width: Int) =
-                    this.then(SizeModifier.WithOption(width))
-
-                internal sealed class SizeModifier : Modifier.Element {
-                    internal data class WithOption(val width: Int) : SizeModifier() {
-                    }
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier.kt:12: Error: Modifier missing inspectorInfo [ModifierInspectorInfo]
-                        this.then(SizeModifier.WithOption(width))
-                                               ~~~~~~~~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithWrongName() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width1(width: Int) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "otherName"
-                        value = width
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier1.kt:10: Error: Expected name of the modifier: "name" = "width1" [ModifierInspectorInfo]
-                            name = "otherName"
-                                    ~~~~~~~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithWrongValue() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width1(width: Int) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        value = 3.4
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier1.kt:11: Error: Expected the variable: "width" [ModifierInspectorInfo]
-                            value = 3.4
-                                    ~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithWrongValueWhenMultipleAreAvailable() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width1(width: Int, height: Int) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        value = "oldWidth"
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier1.kt:11: Error: Expected one of the variables: "width, height" [ModifierInspectorInfo]
-                            value = "oldWidth"
-                                     ~~~~~~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithWrongParameterNameInProperties() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width1(width: Int, height: Int) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        properties["width"] = width
-                        properties["other"] = height
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier1.kt:12: Error: Expected one of the variables: "width, height" [ModifierInspectorInfo]
-                            properties["other"] = height
-                                        ~~~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithMismatchInProperties() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width1(width: Int, height: Int) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        properties["height"] = width
-                        properties["width"] = height
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier1.kt:11: Error: The value should match the index name: height [ModifierInspectorInfo]
-                            properties["height"] = width
-                                                   ~~~~~
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithMissingDebugSelector() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-
-                fun Modifier.width1(width: Int, height: Int) =
-                    this.then(SizeModifier1(width, height, inspectorInfo = {
-                        name = "width1"
-                        properties["width"] = width
-                        properties["height"] = height
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    val height: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier1.kt:8: Error: Expected debugInspectorInfo call [ModifierInspectorInfo]
-                        this.then(SizeModifier1(width, height, inspectorInfo = {
-                                                                               ^
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithMissingName() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.width1(width: Int) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        value = width
-                    }))
-
-                private class SizeModifier1(
-                    val width: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/SizeModifier1.kt:9: Error: Expected name of the modifier: "name" = "width1" [ModifierInspectorInfo]
-                        this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                                                                                          ^
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithMissingVariables() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.border(start: Int, top: Int, end: Int, bottom: Int) =
-                    this.then(
-                        BorderModifier(
-                            start, top, end, bottom, debugInspectorInfo {
-                                name = "border"
-                                properties["start"] = start
-                            }
-                        ))
-
-                private class BorderModifier(
-                    val start: Int,
-                    val top: Int,
-                    val end: Int,
-                    bottom: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/BorderModifier.kt:11: Error: These lambda arguments are missing in the InspectorInfo: bottom, end, top [ModifierInspectorInfo]
-                                start, top, end, bottom, debugInspectorInfo {
-                                                                            ^
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun inspectorInfoWithMissingDataClassMemberValues() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.border(values: Borders) =
-                    this.then(BorderModifier(values, inspectorInfo = debugInspectorInfo {
-                        name = "border"
-                        value = values.start
-                        properties["top"] = values.top
-                    }))
-
-                private class BorderModifier(
-                    val values: Borders,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo) {
-                }
-
-                data class Borders(val start: Int, val top: Int, val end: Int, val bottom: Int) {
-                    constructor(all: Int) : this(all, all, all, all)
-                }
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/BorderModifier.kt:9: Error: These lambda arguments are missing in the InspectorInfo: bottom, end [ModifierInspectorInfo]
-                        this.then(BorderModifier(values, inspectorInfo = debugInspectorInfo {
-                                                                                            ^
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun missingInfoInConditionals() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                class Brush
-
-                class SolidColor(val color: Int): Brush()
-
-                fun Modifier.border(width: Int): Modifier = composed(
-                    inspectorInfo = debugInspectorInfo {
-                        name = "border"
-                        value = width
-                    }
-                ) {
-                    BorderModifier(shape, width, brush)
-                }
-
-                fun Modifier.border2(width: Int): Modifier =
-                    if (width > 0) {
-                        border(width)
-                    } else {
-                        composed { BorderModifier(shape, width, brush) }
-                    }
-
-                fun Modifier.border3(width: Int): Modifier =
-                    when {
-                        width < 0 -> this
-                        width < 2 -> border(width)
-                        width < 3 -> composed { BorderModifier(shape, width, brush) }
-                        else -> this
-                    }
-
-                fun Modifier.border4(width: Int): Modifier =
-                    when {
-                        width < 0 -> this
-                        width < 2 -> border(width)
-                        else -> this.then(BorderModifier(shape, width, brush))
-                    }
-
-                private class BorderModifier(shape: Shape, width: Int, brush: Brush): Modifier
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/androidx/compose/ui/Brush.kt:25: Error: Modifier missing inspectorInfo [ModifierInspectorInfo]
-                            composed { BorderModifier(shape, width, brush) }
-                            ~~~~~~~~
-                    src/androidx/compose/ui/Brush.kt:32: Error: Modifier missing inspectorInfo [ModifierInspectorInfo]
-                            width < 3 -> composed { BorderModifier(shape, width, brush) }
-                                         ~~~~~~~~
-                    src/androidx/compose/ui/Brush.kt:40: Error: Modifier missing inspectorInfo [ModifierInspectorInfo]
-                            else -> this.then(BorderModifier(shape, width, brush))
-                                              ~~~~~~~~~~~~~~
-                    3 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun testInspectable() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package mypackage
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.inspectable
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.background(color: Int): Modifier = this.then(
-                    Background(color, inspectorInfo = debugInspectorInfo {
-                        name = "background"
-                        value = color
-                    })
-                )
-
-                fun Modifier.border(width: Int, color: Int): Modifier = this.then(
-                    BorderModifier(width, color, inspectorInfo = debugInspectorInfo {
-                        name = "border"
-                        properties["width"] = width
-                        properties["color"] = color
-                    })
-                )
-
-                fun Modifier.frame(color: Int) = this.then(
-                    Modifier.inspectable(
-                        inspectorInfo = debugInspectorInfo {
-                            name = "frame"
-                            value = color
-                        },
-                        wrapped = Modifier.background(color).border(width = 5, color = color)
-                    )
-                )
-
-                private class BackgroundModifier(
-                    color: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier
-
-                private class BorderModifier(
-                    width: Int,
-                    color: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-
-    @Test
-    fun testInspectableWithMissingParameter() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package mypackage
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.inspectable
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                fun Modifier.background(color: Int): Modifier = this.then(
-                    Background(color, inspectorInfo = debugInspectorInfo {
-                        name = "background"
-                        value = color
-                    })
-                )
-
-                fun Modifier.border(width: Int, color: Int): Modifier = this.then(
-                    BorderModifier(width, color, inspectorInfo = debugInspectorInfo {
-                        name = "border"
-                        properties["width"] = width
-                        properties["color"] = color
-                    })
-                )
-
-                fun Modifier.frame(color: Int) = this.then(
-                    Modifier.inspectable(
-                        inspectorInfo = debugInspectorInfo {
-                            name = "frame"
-                        },
-                        wrapped = Modifier.background(color).border(width = 5, color = color)
-                    )
-                )
-
-                private class BackgroundModifier(
-                    color: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier
-
-                private class BorderModifier(
-                    width: Int,
-                    color: Int,
-                    inspectorInfo: InspectorInfo.() -> Unit
-                ): Modifier
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expect(
-                """
-                    src/mypackage/BackgroundModifier.kt:26: Error: These lambda arguments are missing in the InspectorInfo: color [ModifierInspectorInfo]
-                            inspectorInfo = debugInspectorInfo {
-                                                               ^
-                    1 errors, 0 warnings
-                """
-            )
-    }
-
-    @Test
-    fun passInspectorInfoAtSecondLastParameter() {
-        lint().files(
-            Stubs.Modifier,
-            composedStub,
-            inspectableInfoStub,
-            kotlin(
-                """
-                package androidx.compose.ui
-
-                import androidx.compose.ui.Modifier
-                import androidx.compose.ui.platform.InspectorInfo
-                import androidx.compose.ui.platform.InspectorValueInfo
-                import androidx.compose.ui.platform.debugInspectorInfo
-
-                inline class Dp(val value: Float)
-
-                fun Modifier.width1(width: Dp, height: Dp) =
-                    this.then(SizeModifier1(width, inspectorInfo = debugInspectorInfo {
-                        name = "width1"
-                        properties["width"] = width
-                        properties["height"] = height
-                    }, height))
-
-                private class SizeModifier1(
-                    val width: Dp,
-                    inspectorInfo: InspectorInfo.() -> Unit,
-                    val height: Dp
-                ): Modifier.Element, InspectorValueInfo(inspectorInfo)
-
-                """
-            ).indented()
-        )
-            .testModes(TestMode.DEFAULT)
-            .run()
-            .expectClean()
-    }
-}
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt
index 220666b..87ad9ab 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/InteractiveComponentSize.kt
@@ -44,7 +44,6 @@
  * sure there is adequate space for touch target expansion.
  */
 @OptIn(ExperimentalMaterialApi::class)
-@Suppress("ModifierInspectorInfo")
 fun Modifier.minimumInteractiveComponentSize(): Modifier = composed(
     inspectorInfo = debugInspectorInfo {
         name = "minimumInteractiveComponentSize"
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt
index 4597f577..31e307b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/InteractiveComponentSize.kt
@@ -44,7 +44,6 @@
  * sure there is adequate space for touch target expansion.
  */
 @OptIn(ExperimentalMaterial3Api::class)
-@Suppress("ModifierInspectorInfo")
 fun Modifier.minimumInteractiveComponentSize(): Modifier = composed(
     inspectorInfo = debugInspectorInfo {
         name = "minimumInteractiveComponentSize"
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt
index ec9a575..3829477 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/CancelFocusDemo.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.ui.demos.focus
 
-import android.annotation.SuppressLint
 import androidx.compose.foundation.border
 import androidx.compose.foundation.focusable
 import androidx.compose.foundation.layout.Arrangement.SpaceEvenly
@@ -76,7 +75,6 @@
     }
 }
 
-@SuppressLint("ModifierInspectorInfo")
 private fun Modifier.focusableWithBorder() = composed {
     var color by remember { mutableStateOf(Black) }
     Modifier
diff --git a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/layout/LazyLayoutSemantics.kt b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/layout/LazyLayoutSemantics.kt
index 2d6def9..5058a26 100644
--- a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/layout/LazyLayoutSemantics.kt
+++ b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/layout/LazyLayoutSemantics.kt
@@ -35,7 +35,7 @@
 import kotlinx.coroutines.launch
 
 @OptIn(ExperimentalFoundationApi::class)
-@Suppress("ComposableModifierFactory", "ModifierInspectorInfo")
+@Suppress("ComposableModifierFactory")
 @Composable
 internal fun Modifier.lazyLayoutSemantics(
     itemProvider: LazyLayoutItemProvider,
diff --git a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazySemantics.kt b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazySemantics.kt
index 067b94a..fb8cb87 100644
--- a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazySemantics.kt
+++ b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazySemantics.kt
@@ -22,7 +22,7 @@
 import androidx.tv.foundation.lazy.layout.LazyLayoutSemanticState
 
 // TODO (b/233188423): Address IllegalExperimentalApiUsage before moving to beta
-@Suppress("ComposableModifierFactory", "ModifierInspectorInfo", "IllegalExperimentalApiUsage")
+@Suppress("ComposableModifierFactory", "IllegalExperimentalApiUsage")
 @ExperimentalFoundationApi
 @Composable
 internal fun rememberLazyListSemanticState(
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PickerGroup.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PickerGroup.kt
index 114c40e..a9be263 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PickerGroup.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PickerGroup.kt
@@ -320,7 +320,6 @@
     return maxChildrenHeight.coerceIn(constraints.minHeight, constraints.maxHeight)
 }
 
-@Suppress("ModifierInspectorInfo")
 internal fun Modifier.autoCenteringTarget() = this.then(
     object : ParentDataModifier {
         override fun Density.modifyParentData(parentData: Any?) = AutoCenteringRowParentData()
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt
index 184e824..424101c 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/PositionIndicator.kt
@@ -1097,7 +1097,6 @@
 // Sets the size of this element, but lets the child measure using the constraints
 // of the element containing this.
 private fun Modifier.transparentSizeModifier(size: Density.() -> IntSize): Modifier = this.then(
-    @Suppress("ModifierInspectorInfo")
     object : LayoutModifier {
         override fun MeasureScope.measure(
             measurable: Measurable,
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScrollAway.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScrollAway.kt
index b725fb2..d577f3e 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScrollAway.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScrollAway.kt
@@ -133,7 +133,6 @@
 
 private fun Modifier.scrollAway(scrollFn: Density.() -> ScrollParams): Modifier =
     this.then(
-        @Suppress("ModifierInspectorInfo")
         object : LayoutModifier {
             override fun MeasureScope.measure(
                 measurable: Measurable,
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt
index c6be1c3..e0b1320 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoApp.kt
@@ -16,7 +16,6 @@
 
 package androidx.wear.compose.integration.demos
 
-import android.annotation.SuppressLint
 import androidx.compose.foundation.MutatePriority
 import androidx.compose.foundation.focusable
 import androidx.compose.foundation.gestures.FlingBehavior
@@ -185,7 +184,6 @@
 
 internal data class TimestampedDelta(val time: Long, val delta: Float)
 
-@SuppressLint("ModifierInspectorInfo")
 @OptIn(ExperimentalComposeUiApi::class)
 @Suppress("ComposableModifierFactory")
 @Composable
