Add KModifier.VALUE (#1050)

diff --git a/interop/kotlinx-metadata/specs-tests/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/test/KotlinPoetMetadataSpecsTest.kt b/interop/kotlinx-metadata/specs-tests/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/test/KotlinPoetMetadataSpecsTest.kt
index 3caa57e..b0a758b 100644
--- a/interop/kotlinx-metadata/specs-tests/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/test/KotlinPoetMetadataSpecsTest.kt
+++ b/interop/kotlinx-metadata/specs-tests/src/test/kotlin/com/squareup/kotlinpoet/metadata/specs/test/KotlinPoetMetadataSpecsTest.kt
@@ -367,7 +367,7 @@
       """
       @kotlin.jvm.JvmInline
       public inline class InlineClass(
-        public val value: kotlin.String
+        public val `value`: kotlin.String
       )
       """.trimIndent()
     )
@@ -523,7 +523,7 @@
     assertThat(typeSpec.trimmedToString()).isEqualTo(
       """
       public enum class ComplexEnum(
-        public val value: kotlin.String
+        public val `value`: kotlin.String
       ) {
         FOO {
           public override fun toString(): kotlin.String = throw NotImplementedError("Stub!")
@@ -587,7 +587,7 @@
     assertThat(typeSpec.trimmedToString()).isEqualTo(
       """
       public enum class ComplexEnumWithAnnotation(
-        public val value: kotlin.String
+        public val `value`: kotlin.String
       ) {
         FOO {
           public override fun toString(): kotlin.String = throw NotImplementedError("Stub!")
@@ -795,7 +795,7 @@
     assertThat(typeSpec.trimmedToString()).isEqualTo(
       """
       public annotation class MyAnnotation(
-        public val value: kotlin.String
+        public val `value`: kotlin.String
       )
       """.trimIndent()
     )
@@ -894,7 +894,7 @@
         public var setter: kotlin.String? = null
 
         @com.squareup.kotlinpoet.metadata.specs.test.KotlinPoetMetadataSpecsTest.ConstructorAnnotation
-        public constructor(value: kotlin.String)
+        public constructor(`value`: kotlin.String)
 
         @com.squareup.kotlinpoet.metadata.specs.test.KotlinPoetMetadataSpecsTest.FunctionAnnotation
         public fun function(): kotlin.Unit {
diff --git a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/KModifier.kt b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/KModifier.kt
index 936dde0..af2e82a 100644
--- a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/KModifier.kt
+++ b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/KModifier.kt
@@ -54,6 +54,7 @@
 
   ENUM("enum", Target.CLASS),
   ANNOTATION("annotation", Target.CLASS),
+  VALUE("value", Target.CLASS),
   FUN("fun", Target.INTERFACE),
 
   COMPANION("companion", Target.CLASS),
diff --git a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/TypeSpec.kt b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/TypeSpec.kt
index 405e200..44afec0 100644
--- a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/TypeSpec.kt
+++ b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/TypeSpec.kt
@@ -25,8 +25,10 @@
 import com.squareup.kotlinpoet.KModifier.INLINE
 import com.squareup.kotlinpoet.KModifier.INTERNAL
 import com.squareup.kotlinpoet.KModifier.PRIVATE
+import com.squareup.kotlinpoet.KModifier.PROTECTED
 import com.squareup.kotlinpoet.KModifier.PUBLIC
 import com.squareup.kotlinpoet.KModifier.SEALED
+import com.squareup.kotlinpoet.KModifier.VALUE
 import java.lang.reflect.Type
 import javax.lang.model.element.Element
 import kotlin.reflect.KClass
@@ -462,7 +464,8 @@
     internal val isEnum get() = kind == Kind.CLASS && ENUM in modifiers
     internal val isAnnotation get() = kind == Kind.CLASS && ANNOTATION in modifiers
     internal val isCompanion get() = kind == Kind.OBJECT && COMPANION in modifiers
-    internal val isInlineClass get() = kind == Kind.CLASS && INLINE in modifiers
+    internal val isInlineOrValClass get() = kind == Kind.CLASS &&
+      (INLINE in modifiers || VALUE in modifiers)
     internal val isSimpleClass get() = kind == Kind.CLASS && !isEnum && !isAnnotation
     internal val isFunInterface get() = kind == Kind.INTERFACE && FUN in modifiers
 
@@ -530,9 +533,9 @@
           "expected a constructor but was ${primaryConstructor.name}"
         }
 
-        if (isInlineClass) {
+        if (isInlineOrValClass) {
           check(primaryConstructor.parameters.size == 1) {
-            "Inline classes must have 1 parameter in constructor"
+            "value/inline classes must have 1 parameter in constructor"
           }
         }
       }
@@ -549,8 +552,8 @@
       check(isSimpleClass || kind == Kind.OBJECT) {
         "only classes can have super classes, not $kind"
       }
-      check(!isInlineClass) {
-        "Inline classes cannot have super classes"
+      check(!isInlineOrValClass) {
+        "value/inline classes cannot have super classes"
       }
     }
 
@@ -731,8 +734,8 @@
         }
         when {
           kind == Kind.INTERFACE -> {
-            requireNoneOf(funSpec.modifiers, KModifier.INTERNAL, KModifier.PROTECTED)
-            requireNoneOrOneOf(funSpec.modifiers, KModifier.ABSTRACT, KModifier.PRIVATE)
+            requireNoneOf(funSpec.modifiers, INTERNAL, PROTECTED)
+            requireNoneOrOneOf(funSpec.modifiers, ABSTRACT, PRIVATE)
           }
           isAnnotation -> require(funSpec.modifiers == kind.implicitFunctionModifiers(modifiers)) {
             "annotation class $name.${funSpec.name} " +
@@ -751,29 +754,29 @@
         }
       }
 
-      if (isInlineClass) {
+      if (isInlineOrValClass) {
         primaryConstructor?.let {
           check(it.parameters.size == 1) {
-            "Inline classes must have 1 parameter in constructor"
+            "value/inline classes must have 1 parameter in constructor"
           }
         }
 
         check(propertySpecs.size > 0) {
-          "Inline classes must have at least 1 property"
+          "value/inline classes must have at least 1 property"
         }
 
         val constructorParamName = primaryConstructor?.parameters?.firstOrNull()?.name
         constructorParamName?.let { paramName ->
           val underlyingProperty = propertySpecs.find { it.name == paramName }
           requireNotNull(underlyingProperty) {
-            "Inline classes must have a single read-only (val) property parameter."
+            "value/inline classes must have a single read-only (val) property parameter."
           }
           check(!underlyingProperty.mutable) {
-            "Inline classes must have a single read-only (val) property parameter."
+            "value/inline classes must have a single read-only (val) property parameter."
           }
         }
         check(superclass == Any::class.asTypeName()) {
-          "Inline classes cannot have super classes"
+          "value/inline classes cannot have super classes"
         }
       }
 
@@ -815,6 +818,9 @@
     @JvmStatic public fun expectClassBuilder(className: ClassName): Builder =
       expectClassBuilder(className.simpleName)
 
+    @JvmStatic public fun valueClassBuilder(name: String): Builder =
+      Builder(Kind.CLASS, name, VALUE)
+
     @JvmStatic public fun objectBuilder(name: String): Builder = Builder(Kind.OBJECT, name)
 
     @JvmStatic public fun objectBuilder(className: ClassName): Builder =
diff --git a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt
index 2c64f00..728f6c4 100644
--- a/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt
+++ b/kotlinpoet/src/main/java/com/squareup/kotlinpoet/Util.kt
@@ -245,6 +245,7 @@
   "sealed",
   "suspend",
   "tailrec",
+  "value",
   "vararg",
 )
 
diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/AnnotationSpecTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/AnnotationSpecTest.kt
index 704ffe6..11ec928 100644
--- a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/AnnotationSpecTest.kt
+++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/AnnotationSpecTest.kt
@@ -556,7 +556,7 @@
       import kotlin.Unit
 
       public class ExternalClass(
-        public val value: Int
+        public val `value`: Int
       )
 
       public object ExternalClassParceler : Parceler<ExternalClass> {
diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/CrossplatformTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/CrossplatformTest.kt
index b4bd213..9aa71e0 100644
--- a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/CrossplatformTest.kt
+++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/CrossplatformTest.kt
@@ -76,15 +76,15 @@
       |import kotlin.Unit
       |
       |internal expect class AtomicRef<V>(
-      |  value: V
+      |  `value`: V
       |) {
-      |  public val value: V
+      |  public val `value`: V
       |
       |  public fun `get`(): V
       |
-      |  public fun `set`(value: V): Unit
+      |  public fun `set`(`value`: V): Unit
       |
-      |  public fun getAndSet(value: V): V
+      |  public fun getAndSet(`value`: V): V
       |
       |  public fun compareAndSet(`expect`: V, update: V): Boolean
       |}
diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/KotlinPoetTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/KotlinPoetTest.kt
index 7c67136..e816d30 100644
--- a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/KotlinPoetTest.kt
+++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/KotlinPoetTest.kt
@@ -602,7 +602,7 @@
         |    println("getter")
         |    return field
         |  }
-        |  set(value) {
+        |  set(`value`) {
         |    println("setter")
         |    field = value
         |  }
diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/PropertySpecTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/PropertySpecTest.kt
index 3679efb..b72384d 100644
--- a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/PropertySpecTest.kt
+++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/PropertySpecTest.kt
@@ -108,7 +108,7 @@
       """
       |inline var foo: kotlin.String
       |  get() = "foo"
-      |  set(value) {
+      |  set(`value`) {
       |  }
       |""".trimMargin()
     )
diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt
index fd0d6e0..bd03e7e 100644
--- a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt
+++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/TypeSpecTest.kt
@@ -21,7 +21,6 @@
 import com.squareup.kotlinpoet.KModifier.ABSTRACT
 import com.squareup.kotlinpoet.KModifier.DATA
 import com.squareup.kotlinpoet.KModifier.IN
-import com.squareup.kotlinpoet.KModifier.INLINE
 import com.squareup.kotlinpoet.KModifier.INNER
 import com.squareup.kotlinpoet.KModifier.INTERNAL
 import com.squareup.kotlinpoet.KModifier.PRIVATE
@@ -718,7 +717,6 @@
           .build()
       )
       .build()
-    println(toString(taco))
     assertThat(toString(taco)).isEqualTo(
       """
         |package com.squareup.tacos
@@ -729,7 +727,7 @@
         |  contents: String
         |) {
         |  public var contents: String = contents
-        |    set(value) {
+        |    set(`value`) {
         |      println("contents changed!")
         |      field = value
         |    }
@@ -1084,7 +1082,7 @@
         |import kotlin.Int
         |
         |public enum class Sort(
-        |  value: Int
+        |  `value`: Int
         |) {
         |  `open`(0),
         |  closed(1),
@@ -2526,216 +2524,6 @@
     )
   }
 
-  @Test fun validInlineClass() {
-    val guacamole = TypeSpec.classBuilder("Guacamole")
-      .primaryConstructor(
-        FunSpec.constructorBuilder()
-          .addParameter("avacado", String::class)
-          .build()
-      )
-      .addProperty(
-        PropertySpec.builder("avacado", String::class)
-          .initializer("avacado")
-          .build()
-      )
-      .addModifiers(INLINE)
-      .build()
-
-    assertThat(guacamole.toString()).isEqualTo(
-      """
-      |public inline class Guacamole(
-      |  public val avacado: kotlin.String
-      |)
-      |""".trimMargin()
-    )
-  }
-
-  @Test fun inlineClassWithInitBlock() {
-    val guacamole = TypeSpec.classBuilder("Guacamole")
-      .primaryConstructor(
-        FunSpec.constructorBuilder()
-          .addParameter("avacado", String::class)
-          .build()
-      )
-      .addProperty(
-        PropertySpec.builder("avacado", String::class)
-          .initializer("avacado")
-          .build()
-      )
-      .addInitializerBlock(CodeBlock.EMPTY)
-      .addModifiers(INLINE)
-      .build()
-
-    assertThat(guacamole.toString()).isEqualTo(
-      """
-      |public inline class Guacamole(
-      |  public val avacado: kotlin.String
-      |) {
-      |  init {
-      |  }
-      |}
-      |""".trimMargin()
-    )
-  }
-
-  class InlineSuperClass
-
-  @Test fun inlineClassWithSuperClass() {
-    assertThrows<IllegalStateException> {
-      TypeSpec.classBuilder("Guacamole")
-        .primaryConstructor(
-          FunSpec.constructorBuilder()
-            .addParameter("avocado", String::class)
-            .build()
-        )
-        .addProperty(
-          PropertySpec.builder("avocado", String::class)
-            .initializer("avocado")
-            .build()
-        )
-        .superclass(InlineSuperClass::class)
-        .addModifiers(INLINE)
-        .build()
-    }.hasMessageThat().isEqualTo("Inline classes cannot have super classes")
-  }
-
-  interface InlineSuperInterface
-
-  @Test fun inlineClassInheritsFromInterface() {
-    val guacamole = TypeSpec.classBuilder("Guacamole")
-      .primaryConstructor(
-        FunSpec.constructorBuilder()
-          .addParameter("avocado", String::class)
-          .build()
-      )
-      .addProperty(
-        PropertySpec.builder("avocado", String::class)
-          .initializer("avocado")
-          .build()
-      )
-      .addSuperinterface(InlineSuperInterface::class)
-      .addModifiers(INLINE)
-      .build()
-
-    assertThat(guacamole.toString()).isEqualTo(
-      """
-      |public inline class Guacamole(
-      |  public val avocado: kotlin.String
-      |) : com.squareup.kotlinpoet.TypeSpecTest.InlineSuperInterface
-      |""".trimMargin()
-    )
-  }
-
-  @Test fun inlineClassWithoutBackingProperty() {
-    assertThrows<IllegalArgumentException> {
-      TypeSpec.classBuilder("Guacamole")
-        .primaryConstructor(
-          FunSpec.constructorBuilder()
-            .addParameter("avocado", String::class)
-            .build()
-        )
-        .addProperty("garlic", String::class)
-        .addModifiers(INLINE)
-        .build()
-    }.hasMessageThat().isEqualTo("Inline classes must have a single read-only (val) property parameter.")
-  }
-
-  @Test fun inlineClassWithoutProperties() {
-    assertThrows<IllegalStateException> {
-      TypeSpec.classBuilder("Guacamole")
-        .primaryConstructor(
-          FunSpec.constructorBuilder()
-            .addParameter("avocado", String::class)
-            .build()
-        )
-        .addModifiers(INLINE)
-        .build()
-    }.hasMessageThat().isEqualTo("Inline classes must have at least 1 property")
-  }
-
-  @Test fun inlineClassWithMutableProperties() {
-    assertThrows<IllegalStateException> {
-      TypeSpec.classBuilder("Guacamole")
-        .primaryConstructor(
-          FunSpec.constructorBuilder()
-            .addParameter("avocado", String::class)
-            .build()
-        )
-        .addProperty(
-          PropertySpec.builder("avocado", String::class)
-            .initializer("avocado")
-            .mutable()
-            .build()
-        )
-        .addModifiers(INLINE)
-        .build()
-    }.hasMessageThat().isEqualTo("Inline classes must have a single read-only (val) property parameter.")
-  }
-
-  @Test fun inlineClassWithPrivateConstructor() {
-    val guacamole = TypeSpec.classBuilder("Guacamole")
-      .primaryConstructor(
-        FunSpec.constructorBuilder()
-          .addParameter("avocado", String::class)
-          .addModifiers(PRIVATE)
-          .build()
-      )
-      .addProperty(
-        PropertySpec.builder("avocado", String::class)
-          .initializer("avocado")
-          .build()
-      )
-      .addModifiers(INLINE)
-      .build()
-
-    assertThat(guacamole.toString()).isEqualTo(
-      """
-      |public inline class Guacamole private constructor(
-      |  public val avocado: kotlin.String
-      |)
-      |""".trimMargin()
-    )
-  }
-
-  @Test fun inlineEnumClass() {
-    val guacamole = TypeSpec.enumBuilder("Foo")
-      .primaryConstructor(
-        FunSpec.constructorBuilder()
-          .addParameter("x", Int::class)
-          .build()
-      )
-      .addEnumConstant(
-        "A",
-        TypeSpec.anonymousClassBuilder()
-          .addSuperclassConstructorParameter("%L", 1)
-          .build()
-      )
-      .addEnumConstant(
-        "B",
-        TypeSpec.anonymousClassBuilder()
-          .addSuperclassConstructorParameter("%L", 2)
-          .build()
-      )
-      .addProperty(
-        PropertySpec.builder("x", Int::class)
-          .initializer("x")
-          .build()
-      )
-      .addModifiers(INLINE)
-      .build()
-    assertThat(guacamole.toString()).isEqualTo(
-      """
-      |public enum inline class Foo(
-      |  public val x: kotlin.Int
-      |) {
-      |  A(1),
-      |  B(2),
-      |  ;
-      |}
-      |""".trimMargin()
-    )
-  }
-
   @Test fun doublePropertyInitialization() {
     assertThrows<IllegalStateException> {
       PropertySpec.builder("listA", String::class)
diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/ValueTypeSpecTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/ValueTypeSpecTest.kt
new file mode 100644
index 0000000..e385ebf
--- /dev/null
+++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/ValueTypeSpecTest.kt
@@ -0,0 +1,236 @@
+package com.squareup.kotlinpoet
+
+import com.google.common.truth.Truth.assertThat
+import com.squareup.kotlinpoet.KModifier.INLINE
+import com.squareup.kotlinpoet.KModifier.PRIVATE
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+class ValueTypeSpecTest(private val useValue: Boolean) {
+
+  companion object {
+    @JvmStatic
+    @Parameterized.Parameters(name = "value={0}")
+    fun data(): Collection<Array<Any>> {
+      return listOf(
+        arrayOf(true),
+        arrayOf(false)
+      )
+    }
+  }
+
+  private val modifier = if (useValue) KModifier.VALUE else INLINE
+  private val modifierString = modifier.keyword
+
+  private fun classBuilder() = if (useValue) {
+    TypeSpec.valueClassBuilder("Guacamole")
+  } else {
+    TypeSpec.classBuilder("Guacamole")
+      .addModifiers(modifier)
+  }
+
+  @Test fun validInlineClass() {
+    val guacamole = classBuilder()
+      .primaryConstructor(
+        FunSpec.constructorBuilder()
+          .addParameter("avacado", String::class)
+          .build()
+      )
+      .addProperty(
+        PropertySpec.builder("avacado", String::class)
+          .initializer("avacado")
+          .build()
+      )
+      .build()
+
+    assertThat(guacamole.toString()).isEqualTo(
+      """
+      |public $modifierString class Guacamole(
+      |  public val avacado: kotlin.String
+      |)
+      |""".trimMargin()
+    )
+  }
+
+  @Test fun inlineClassWithInitBlock() {
+    val guacamole = classBuilder()
+      .primaryConstructor(
+        FunSpec.constructorBuilder()
+          .addParameter("avacado", String::class)
+          .build()
+      )
+      .addProperty(
+        PropertySpec.builder("avacado", String::class)
+          .initializer("avacado")
+          .build()
+      )
+      .addInitializerBlock(CodeBlock.EMPTY)
+      .build()
+
+    assertThat(guacamole.toString()).isEqualTo(
+      """
+      |public $modifierString class Guacamole(
+      |  public val avacado: kotlin.String
+      |) {
+      |  init {
+      |  }
+      |}
+      |""".trimMargin()
+    )
+  }
+
+  class InlineSuperClass
+
+  @Test fun inlineClassWithSuperClass() {
+    assertThrows<IllegalStateException> {
+      classBuilder()
+        .primaryConstructor(
+          FunSpec.constructorBuilder()
+            .addParameter("avocado", String::class)
+            .build()
+        )
+        .addProperty(
+          PropertySpec.builder("avocado", String::class)
+            .initializer("avocado")
+            .build()
+        )
+        .superclass(InlineSuperClass::class)
+        .build()
+    }.hasMessageThat().isEqualTo("value/inline classes cannot have super classes")
+  }
+
+  interface InlineSuperInterface
+
+  @Test fun inlineClassInheritsFromInterface() {
+    val guacamole = classBuilder()
+      .primaryConstructor(
+        FunSpec.constructorBuilder()
+          .addParameter("avocado", String::class)
+          .build()
+      )
+      .addProperty(
+        PropertySpec.builder("avocado", String::class)
+          .initializer("avocado")
+          .build()
+      )
+      .addSuperinterface(InlineSuperInterface::class)
+      .build()
+
+    assertThat(guacamole.toString()).isEqualTo(
+      """
+      |public $modifierString class Guacamole(
+      |  public val avocado: kotlin.String
+      |) : com.squareup.kotlinpoet.ValueTypeSpecTest.InlineSuperInterface
+      |""".trimMargin()
+    )
+  }
+
+  @Test fun inlineClassWithoutBackingProperty() {
+    assertThrows<IllegalArgumentException> {
+      classBuilder()
+        .primaryConstructor(
+          FunSpec.constructorBuilder()
+            .addParameter("avocado", String::class)
+            .build()
+        )
+        .addProperty("garlic", String::class)
+        .build()
+    }.hasMessageThat().isEqualTo("value/inline classes must have a single read-only (val) property parameter.")
+  }
+
+  @Test fun inlineClassWithoutProperties() {
+    assertThrows<IllegalStateException> {
+      classBuilder()
+        .primaryConstructor(
+          FunSpec.constructorBuilder()
+            .addParameter("avocado", String::class)
+            .build()
+        )
+        .build()
+    }.hasMessageThat().isEqualTo("value/inline classes must have at least 1 property")
+  }
+
+  @Test fun inlineClassWithMutableProperties() {
+    assertThrows<IllegalStateException> {
+      classBuilder()
+        .primaryConstructor(
+          FunSpec.constructorBuilder()
+            .addParameter("avocado", String::class)
+            .build()
+        )
+        .addProperty(
+          PropertySpec.builder("avocado", String::class)
+            .initializer("avocado")
+            .mutable()
+            .build()
+        )
+        .build()
+    }.hasMessageThat().isEqualTo("value/inline classes must have a single read-only (val) property parameter.")
+  }
+
+  @Test
+  fun inlineClassWithPrivateConstructor() {
+    val guacamole = classBuilder()
+      .primaryConstructor(
+        FunSpec.constructorBuilder()
+          .addParameter("avocado", String::class)
+          .addModifiers(PRIVATE)
+          .build()
+      )
+      .addProperty(
+        PropertySpec.builder("avocado", String::class)
+          .initializer("avocado")
+          .build()
+      )
+      .build()
+
+    assertThat(guacamole.toString()).isEqualTo(
+      """
+      |public $modifierString class Guacamole private constructor(
+      |  public val avocado: kotlin.String
+      |)
+      |""".trimMargin()
+    )
+  }
+
+  @Test fun inlineEnumClass() {
+    val guacamole = TypeSpec.enumBuilder("Foo")
+      .addModifiers(modifier)
+      .primaryConstructor(
+        FunSpec.constructorBuilder()
+          .addParameter("x", Int::class)
+          .build()
+      )
+      .addEnumConstant(
+        "A",
+        TypeSpec.anonymousClassBuilder()
+          .addSuperclassConstructorParameter("%L", 1)
+          .build()
+      )
+      .addEnumConstant(
+        "B",
+        TypeSpec.anonymousClassBuilder()
+          .addSuperclassConstructorParameter("%L", 2)
+          .build()
+      )
+      .addProperty(
+        PropertySpec.builder("x", Int::class)
+          .initializer("x")
+          .build()
+      )
+      .build()
+    assertThat(guacamole.toString()).isEqualTo(
+      """
+      |public enum $modifierString class Foo(
+      |  public val x: kotlin.Int
+      |) {
+      |  A(1),
+      |  B(2),
+      |  ;
+      |}
+      |""".trimMargin()
+    )
+  }
+}
diff --git a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/jvm/JvmAnnotationsTest.kt b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/jvm/JvmAnnotationsTest.kt
index 18b7d19..241dfec 100644
--- a/kotlinpoet/src/test/java/com/squareup/kotlinpoet/jvm/JvmAnnotationsTest.kt
+++ b/kotlinpoet/src/test/java/com/squareup/kotlinpoet/jvm/JvmAnnotationsTest.kt
@@ -235,7 +235,7 @@
       |  public companion object {
       |    public var foo: String = "foo"
       |      @JvmStatic
-      |      set(value) {
+      |      set(`value`) {
       |      }
       |  }
       |}
@@ -380,7 +380,7 @@
       |
       |public var foo: String
       |  @Throws(IOException::class)
-      |  set(value) {
+      |  set(`value`) {
       |    print("foo")
       |  }
       |""".trimMargin()
@@ -561,7 +561,7 @@
       |
       |public var foo: String = "foo"
       |  @JvmName("foo")
-      |  set(value) {
+      |  set(`value`) {
       |  }
       |""".trimMargin()
     )
@@ -808,7 +808,7 @@
       |
       |public var foo: String = "foo"
       |  @Synchronized
-      |  set(value) {
+      |  set(`value`) {
       |  }
       |""".trimMargin()
     )
@@ -1043,7 +1043,7 @@
       |
       |public var foo: String
       |  @Strictfp
-      |  set(value) {
+      |  set(`value`) {
       |    print("foo")
       |  }
       |""".trimMargin()