[go: nahoru, domu]

Improve stable/static analysis

Change-Id: Id201bd133d3fc0628b827f1118f9bf29e0ed7505
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt
index 602ff48..a2c0497 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/AlignmentLine.kt
@@ -17,6 +17,7 @@
 package androidx.ui.layout
 
 import androidx.compose.Composable
+import androidx.compose.Stable
 
 import androidx.ui.core.AlignmentLine
 import androidx.ui.core.Constraints
@@ -112,6 +113,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.RelativePaddingFromSample
  */
+@Stable
 fun Modifier.relativePaddingFrom(
     alignmentLine: AlignmentLine,
     before: Dp = 0.dp,
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt
index bf55656..47db576 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Column.kt
@@ -18,6 +18,8 @@
 
 import androidx.annotation.FloatRange
 import androidx.compose.Composable
+import androidx.compose.Immutable
+import androidx.compose.Stable
 import androidx.ui.core.Alignment
 import androidx.ui.core.Measured
 import androidx.ui.core.Modifier
@@ -79,6 +81,7 @@
  * Scope for the children of [Column].
  */
 @LayoutScopeMarker
+@Immutable
 object ColumnScope {
     /**
      * Position the element horizontally within the [Column] according to [align].
@@ -86,6 +89,7 @@
      * Example usage:
      * @sample androidx.ui.layout.samples.SimpleGravityInColumn
      */
+    @Stable
     fun Modifier.gravity(align: Alignment.Horizontal) = this + GravityModifier(align)
 
     /**
@@ -104,6 +108,7 @@
      * Example usage:
      * @sample androidx.ui.layout.samples.SimpleRelativeToSiblingsInColumn
      */
+    @Stable
     fun Modifier.alignWithSiblings(alignmentLine: VerticalAlignmentLine) =
         this + SiblingsAlignedModifier.WithAlignmentLine(alignmentLine)
 
@@ -117,6 +122,7 @@
      *
      * @sample androidx.ui.layout.samples.SimpleColumn
      */
+    @Stable
     fun Modifier.weight(
         @FloatRange(from = 0.0, fromInclusive = false) weight: Float,
         fill: Boolean = true
@@ -142,6 +148,7 @@
      * Example usage:
      * @sample androidx.ui.layout.samples.SimpleRelativeToSiblings
      */
+    @Stable
     fun Modifier.alignWithSiblings(
         alignmentLineBlock: (Measured) -> IntPx
     ) = this + SiblingsAlignedModifier.WithAlignmentLineBlock(alignmentLineBlock)
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/DpConstraints.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/DpConstraints.kt
index 76e6aa5..fcdbe26 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/DpConstraints.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/DpConstraints.kt
@@ -17,6 +17,7 @@
 package androidx.ui.layout
 
 import androidx.compose.Immutable
+import androidx.compose.Stable
 import androidx.ui.core.Constraints
 import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
@@ -30,9 +31,13 @@
  */
 @Immutable
 data class DpConstraints(
+    @Stable
     val minWidth: Dp = 0.dp,
+    @Stable
     val maxWidth: Dp = Dp.Infinity,
+    @Stable
     val minHeight: Dp = 0.dp,
+    @Stable
     val maxHeight: Dp = Dp.Infinity
 ) {
     init {
@@ -58,11 +63,13 @@
         /**
          * Creates constraints tight in both dimensions.
          */
+        @Stable
         fun fixed(width: Dp, height: Dp) = DpConstraints(width, width, height, height)
 
         /**
          * Creates constraints with tight width and loose height.
          */
+        @Stable
         fun fixedWidth(width: Dp) = DpConstraints(
             minWidth = width,
             maxWidth = width,
@@ -73,6 +80,7 @@
         /**
          * Creates constraints with tight height and loose width.
          */
+        @Stable
         fun fixedHeight(height: Dp) = DpConstraints(
             minWidth = 0.dp,
             maxWidth = Dp.Infinity,
@@ -86,38 +94,45 @@
  * Whether or not the upper bound on the maximum height.
  * @see hasBoundedWidth
  */
+@Stable
 val DpConstraints.hasBoundedHeight get() = maxHeight.isFinite()
 
 /**
  * Whether or not the upper bound on the maximum width.
  * @see hasBoundedHeight
  */
+@Stable
 val DpConstraints.hasBoundedWidth get() = maxWidth.isFinite()
 
 /**
  * Whether there is exactly one width value that satisfies the constraints.
  */
+@Stable
 val DpConstraints.hasFixedWidth get() = maxWidth == minWidth
 
 /**
  * Whether there is exactly one height value that satisfies the constraints.
  */
+@Stable
 val DpConstraints.hasFixedHeight get() = maxHeight == minHeight
 
 /**
  * Whether the area of a component respecting these constraints will definitely be 0.
  * This is true when at least one of maxWidth and maxHeight are 0.
  */
+@Stable
 val DpConstraints.isZero get() = maxWidth == 0.dp || maxHeight == 0.dp
 
 /**
  * Whether there is any size that satisfies the current constraints.
  */
+@Stable
 val DpConstraints.satisfiable get() = minWidth <= maxWidth && minHeight <= maxHeight
 
 /**
  * Returns the result of coercing the current constraints in a different set of constraints.
  */
+@Stable
 fun DpConstraints.enforce(otherConstraints: DpConstraints) = DpConstraints(
     minWidth = minWidth.coerceIn(otherConstraints.minWidth, otherConstraints.maxWidth),
     maxWidth = maxWidth.coerceIn(otherConstraints.minWidth, otherConstraints.maxWidth),
@@ -128,6 +143,7 @@
 /**
  * Returns the DpConstraints obtained by offsetting the current instance with the given values.
  */
+@Stable
 fun DpConstraints.offset(horizontal: Dp = 0.dp, vertical: Dp = 0.dp) = DpConstraints(
     (minWidth + horizontal).coerceAtLeast(0.dp),
     (maxWidth + horizontal).coerceAtLeast(0.dp),
@@ -138,6 +154,7 @@
 /**
  * Creates the [Constraints] corresponding to the current [DpConstraints].
  */
+@Stable
 fun Density.Constraints(dpConstraints: DpConstraints) = Constraints(
     minWidth = dpConstraints.minWidth.toIntPx(),
     maxWidth = dpConstraints.maxWidth.toIntPx(),
@@ -148,6 +165,7 @@
 /**
  * Creates the [DpConstraints] corresponding to the current [Constraints].
  */
+@Stable
 fun Density.DpConstraints(constraints: Constraints) = DpConstraints(
     minWidth = constraints.minWidth.toDp(),
     maxWidth = constraints.maxWidth.toDp(),
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Intrinsic.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Intrinsic.kt
index 2c6843e..4826d78 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Intrinsic.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Intrinsic.kt
@@ -17,6 +17,7 @@
 package androidx.ui.layout
 
 import androidx.compose.Composable
+import androidx.compose.Stable
 import androidx.ui.core.Constraints
 import androidx.ui.core.IntrinsicMeasurable
 import androidx.ui.core.IntrinsicMeasureScope
@@ -45,6 +46,7 @@
  * Example usage for max intrinsic:
  * @sample androidx.ui.layout.samples.SameWidthTextBoxes
  */
+@Stable
 fun Modifier.preferredWidth(intrinsicSize: IntrinsicSize) = when (intrinsicSize) {
     IntrinsicSize.Min -> this + PreferredMinIntrinsicWidthModifier
     IntrinsicSize.Max -> this + PreferredMaxIntrinsicWidthModifier
@@ -64,6 +66,7 @@
  * Example usage for max intrinsic:
  * @sample androidx.ui.layout.samples.MatchParentDividerForAspectRatio
  */
+@Stable
 fun Modifier.preferredHeight(intrinsicSize: IntrinsicSize) = when (intrinsicSize) {
     IntrinsicSize.Min -> this + PreferredMinIntrinsicHeightModifier
     IntrinsicSize.Max -> this + PreferredMaxIntrinsicHeightModifier
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutAspectRatio.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutAspectRatio.kt
index c687157..3704381 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutAspectRatio.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutAspectRatio.kt
@@ -17,6 +17,7 @@
 package androidx.ui.layout
 
 import androidx.annotation.FloatRange
+import androidx.compose.Stable
 import androidx.ui.core.Constraints
 import androidx.ui.core.IntrinsicMeasurable
 import androidx.ui.core.IntrinsicMeasureScope
@@ -42,6 +43,7 @@
  *
  * @param ratio the desired width/height positive ratio
  */
+@Stable
 fun Modifier.aspectRatio(
     @FloatRange(from = 0.0, fromInclusive = false)
     ratio: Float
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutOffset.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutOffset.kt
index 9870f58..b135c8e 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutOffset.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutOffset.kt
@@ -16,6 +16,7 @@
 
 package androidx.ui.layout
 
+import androidx.compose.Stable
 import androidx.compose.State
 import androidx.compose.mutableStateOf
 import androidx.ui.core.Constraints
@@ -34,6 +35,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.LayoutOffsetModifier
  */
+@Stable
 fun Modifier.offset(x: Dp = 0.dp, y: Dp = 0.dp) = this + OffsetModifier(x, y)
 
 /**
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt
index 72431f8..b6a7f67 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutPadding.kt
@@ -17,6 +17,7 @@
 package androidx.ui.layout
 
 import androidx.compose.Immutable
+import androidx.compose.Stable
 import androidx.ui.core.Constraints
 import androidx.ui.core.LayoutDirection
 import androidx.ui.core.Modifier
@@ -38,6 +39,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.PaddingModifier
  */
+@Stable
 fun Modifier.padding(
     start: Dp = 0.dp,
     top: Dp = 0.dp,
@@ -62,6 +64,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SymmetricPaddingModifier
  */
+@Stable
 fun Modifier.padding(
     horizontal: Dp = 0.dp,
     vertical: Dp = 0.dp
@@ -83,6 +86,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.PaddingAllModifier
  */
+@Stable
 fun Modifier.padding(all: Dp) =
     this + PaddingModifier(start = all, top = all, end = all, bottom = all, rtlAware = true)
 
@@ -116,6 +120,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.AbsolutePaddingModifier
  */
+@Stable
 fun Modifier.absolutePadding(
     left: Dp = 0.dp,
     top: Dp = 0.dp,
@@ -171,9 +176,13 @@
  */
 @Immutable
 data class InnerPadding(
+    @Stable
     val start: Dp = 0.dp,
+    @Stable
     val top: Dp = 0.dp,
+    @Stable
     val end: Dp = 0.dp,
+    @Stable
     val bottom: Dp = 0.dp
 ) {
     constructor(all: Dp) : this(all, all, all, all)
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt
index 9439791..026a18c 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/LayoutSize.kt
@@ -16,6 +16,7 @@
 
 package androidx.ui.layout
 
+import androidx.compose.Stable
 import androidx.ui.core.Alignment
 import androidx.ui.core.Constraints
 import androidx.ui.core.IntrinsicMeasurable
@@ -48,6 +49,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimplePreferredWidthModifier
  */
+@Stable
 fun Modifier.preferredWidth(width: Dp) = preferredSizeIn(minWidth = width, maxWidth = width)
 
 /**
@@ -61,6 +63,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimplePreferredHeightModifier
  */
+@Stable
 fun Modifier.preferredHeight(height: Dp) = preferredSizeIn(minHeight = height, maxHeight = height)
 
 /**
@@ -74,6 +77,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimplePreferredSizeModifier
  */
+@Stable
 fun Modifier.preferredSize(size: Dp) = preferredSizeIn(size, size, size, size)
 
 /**
@@ -88,6 +92,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimplePreferredSizeModifier
  */
+@Stable
 fun Modifier.preferredSize(width: Dp, height: Dp) = preferredSizeIn(
     minWidth = width,
     maxWidth = width,
@@ -101,6 +106,7 @@
  * the requested size will obey the incoming constraints and attempt to be as close as possible
  * to the preferred size.
  */
+@Stable
 fun Modifier.preferredWidthIn(
     minWidth: Dp = Dp.Unspecified,
     maxWidth: Dp = Dp.Unspecified
@@ -112,6 +118,7 @@
  * the requested size will obey the incoming constraints and attempt to be as close as possible
  * to the preferred size.
  */
+@Stable
 fun Modifier.preferredHeightIn(
     minHeight: Dp = Dp.Unspecified,
     maxHeight: Dp = Dp.Unspecified
@@ -123,6 +130,7 @@
  * requested size will obey the incoming constraints and attempt to be as close as possible to
  * the preferred size.
  */
+@Stable
 fun Modifier.preferredSizeIn(constraints: DpConstraints) = preferredSizeIn(
     constraints.minWidth,
     constraints.minHeight,
@@ -136,6 +144,7 @@
  * measurement [Constraints]. If the incoming constraints are more restrictive the requested size
  * will obey the incoming constraints and attempt to be as close as possible to the preferred size.
  */
+@Stable
 fun Modifier.preferredSizeIn(
     minWidth: Dp = Dp.Unspecified,
     minHeight: Dp = Dp.Unspecified,
@@ -158,6 +167,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleWidthModifier
  */
+@Stable
 fun Modifier.width(width: Dp) = sizeIn(minWidth = width, maxWidth = width)
 
 /**
@@ -175,6 +185,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleHeightModifier
  */
+@Stable
 fun Modifier.height(height: Dp) = sizeIn(minHeight = height, maxHeight = height)
 
 /**
@@ -192,6 +203,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleSizeModifier
  */
+@Stable
 fun Modifier.size(size: Dp) = sizeIn(size, size, size, size)
 
 /**
@@ -209,6 +221,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleWidthModifier
  */
+@Stable
 fun Modifier.size(width: Dp, height: Dp) = sizeIn(
     minWidth = width,
     maxWidth = width,
@@ -223,6 +236,7 @@
  * of the content will be automatically offset to be centered on the space assigned to
  * the child by the parent layout under the assumption that [Constraints] were respected.
  */
+@Stable
 fun Modifier.widthIn(
     minWidth: Dp = Dp.Unspecified,
     maxWidth: Dp = Dp.Unspecified
@@ -235,6 +249,7 @@
  * of the content will be automatically offset to be centered on the space assigned to
  * the child by the parent layout under the assumption that [Constraints] were respected.
  */
+@Stable
 fun Modifier.heightIn(
     minHeight: Dp = Dp.Unspecified,
     maxHeight: Dp = Dp.Unspecified
@@ -247,6 +262,7 @@
  * of the content will be automatically offset to be centered on the space assigned to
  * the child by the parent layout under the assumption that [Constraints] were respected.
  */
+@Stable
 fun Modifier.sizeIn(constraints: DpConstraints) = sizeIn(
     constraints.minWidth,
     constraints.minHeight,
@@ -262,6 +278,7 @@
  * of the content will be automatically offset to be centered on the space assigned to
  * the child by the parent layout under the assumption that [Constraints] were respected.
  */
+@Stable
 fun Modifier.sizeIn(
     minWidth: Dp = Dp.Unspecified,
     minHeight: Dp = Dp.Unspecified,
@@ -278,6 +295,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleFillWidthModifier
  */
+@Stable
 fun Modifier.fillMaxWidth() = this + FillModifier(Direction.Horizontal)
 
 /**
@@ -289,6 +307,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleFillHeightModifier
  */
+@Stable
 fun Modifier.fillMaxHeight() = this + FillModifier(Direction.Vertical)
 
 /**
@@ -301,6 +320,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleFillModifier
  */
+@Stable
 fun Modifier.fillMaxSize() = this + FillModifier(Direction.Both)
 
 /**
@@ -311,6 +331,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleWrapContentHorizontallyAlignedModifier
  */
+@Stable
 // TODO(popam): avoid recreating modifier for common align
 fun Modifier.wrapContentWidth(align: Alignment.Horizontal = Alignment.CenterHorizontally) = this +
         AlignmentModifier(Direction.Horizontal) { size, layoutDirection ->
@@ -326,6 +347,7 @@
  * @sample androidx.ui.layout.samples.SimpleWrapContentVerticallyAlignedModifier
  */
 // TODO(popam): avoid recreating modifier for common align
+@Stable
 fun Modifier.wrapContentHeight(align: Alignment.Vertical = Alignment.CenterVertically) =
     this + AlignmentModifier(Direction.Vertical) { size, _ ->
         IntPxPosition(0.ipx, align.align(size.height))
@@ -340,6 +362,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.SimpleWrapContentAlignedModifier
  */
+@Stable
 fun Modifier.wrapContentSize(align: Alignment = Alignment.Center) =
     this + AlignmentModifier(Direction.Both) { size, layoutDirection ->
         align.align(size, layoutDirection)
@@ -355,6 +378,7 @@
  * Example usage:
  * @sample androidx.ui.layout.samples.DefaultMinSizeConstraintsSample
  */
+@Stable
 fun Modifier.defaultMinSizeConstraints(
     minWidth: Dp = Dp.Unspecified,
     minHeight: Dp = Dp.Unspecified
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt
index b58ef9d..c140688 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Row.kt
@@ -18,6 +18,8 @@
 
 import androidx.annotation.FloatRange
 import androidx.compose.Composable
+import androidx.compose.Immutable
+import androidx.compose.Stable
 import androidx.ui.core.Alignment
 import androidx.ui.core.HorizontalAlignmentLine
 import androidx.ui.core.Measured
@@ -77,6 +79,7 @@
  * Scope for the children of [Row].
  */
 @LayoutScopeMarker
+@Immutable
 object RowScope {
     /**
      * Position the element vertically within the [Row] according to [align].
@@ -84,6 +87,7 @@
      * Example usage:
      * @sample androidx.ui.layout.samples.SimpleGravityInRow
      */
+    @Stable
     fun Modifier.gravity(align: Alignment.Vertical) = this + GravityModifier(align)
 
     /**
@@ -104,6 +108,7 @@
      * Example usage:
      * @sample androidx.ui.layout.samples.SimpleRelativeToSiblingsInRow
      */
+    @Stable
     fun Modifier.alignWithSiblings(alignmentLine: HorizontalAlignmentLine) =
         this + SiblingsAlignedModifier.WithAlignmentLine(alignmentLine)
 
@@ -115,6 +120,7 @@
      * Otherwise, the element is allowed to be smaller - this will result in [Row] being smaller,
      * as the unused allocated width will not be redistributed to other siblings.
      */
+    @Stable
     fun Modifier.weight(
         @FloatRange(from = 0.0, fromInclusive = false) weight: Float,
         fill: Boolean = true
@@ -140,6 +146,7 @@
      * Example usage:
      * @sample androidx.ui.layout.samples.SimpleRelativeToSiblings
      */
+    @Stable
     fun Modifier.alignWithSiblings(
         alignmentLineBlock: (Measured) -> IntPx
     ) = this + SiblingsAlignedModifier.WithAlignmentLineBlock(alignmentLineBlock)
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt
index 3e0beef..153fa40 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/RowColumnImpl.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.Composable
 import androidx.compose.Immutable
+import androidx.compose.Stable
 import androidx.ui.core.Alignment
 import androidx.ui.core.AlignmentLine
 import androidx.ui.core.Constraints
@@ -558,6 +559,7 @@
  * Used to specify the alignment of a layout's children, in cross axis direction.
  */
 // TODO(popam): refine this API surface with modifiers - add type safety for alignment orientation.
+@Immutable
 class CrossAxisAlignment private constructor(
     internal val alignmentLineProvider: AlignmentLineProvider? = null
 ) {
@@ -565,16 +567,19 @@
         /**
          * Place children such that their center is in the middle of the cross axis.
          */
+        @Stable
         val Center = CrossAxisAlignment(null)
         /**
          * Place children such that their start edge is aligned to the start edge of the cross
          * axis. TODO(popam): Consider rtl directionality.
          */
+        @Stable
         val Start = CrossAxisAlignment(null)
         /**
          * Place children such that their end edge is aligned to the end edge of the cross
          * axis. TODO(popam): Consider rtl directionality.
          */
+        @Stable
         val End = CrossAxisAlignment(null)
         /**
          * Align children by their baseline.
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt
index 8420164..b20a19e 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Stack.kt
@@ -17,6 +17,8 @@
 package androidx.ui.layout
 
 import androidx.compose.Composable
+import androidx.compose.Immutable
+import androidx.compose.Stable
 import androidx.ui.core.Alignment
 import androidx.ui.core.Constraints
 import androidx.ui.core.Layout
@@ -97,10 +99,12 @@
  * A StackScope provides a scope for the children of a [Stack].
  */
 @LayoutScopeMarker
+@Immutable
 class StackScope {
     /**
      * Pull the content element to a specific [Alignment] within the [Stack].
      */
+    @Stable
     fun Modifier.gravity(align: Alignment) = this + StackGravityModifier(align)
 
     /**
@@ -115,9 +119,11 @@
      * using it for an element inside a [Stack] will make the [Stack] itself always fill the
      * available space.
      */
+    @Stable
     fun Modifier.matchParentSize() = this + StretchGravityModifier
 
     internal companion object {
+        @Stable
         val StretchGravityModifier: ParentDataModifier =
             StackGravityModifier(Alignment.Center, true)
     }