Skip to content

Commit

Permalink
Merge pull request #37 from tobrun/kdz-fix-dokka
Browse files Browse the repository at this point in the history
Fixes to make Dokka happy
  • Loading branch information
kiryldz authored Mar 17, 2023
2 parents c100e35 + 31f5b38 commit 591fa0c
Show file tree
Hide file tree
Showing 5 changed files with 262 additions and 149 deletions.
37 changes: 35 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ And you will have to include the required dependencies:

```groovy
dependencies {
implementation 'com.github.tobrun.kotlin-data-compat:annotation:0.5.1'
ksp 'com.github.tobrun.kotlin-data-compat:processor:0.5.1'
implementation 'com.github.tobrun.kotlin-data-compat:annotation:0.5.2'
ksp 'com.github.tobrun.kotlin-data-compat:processor:0.5.2'
}
```

Expand Down Expand Up @@ -62,6 +62,9 @@ annotation class SampleAnnotation
private data class PersonData(
@Default("\"John\" + Date(1580897313933L).toString()")
val name: String,
/**
* Additional comment.
*/
val nickname: String?,
@Default("42")
val age: Int
Expand Down Expand Up @@ -90,20 +93,39 @@ import kotlin.jvm.JvmSynthetic
*/
@SampleAnnotation
public class Person private constructor(
/**
* The full name.
*/
public val name: String,
/**
* The nickname.
* Additional comment.
*/
public val nickname: String?,
/**
* The age.
*/
public val age: Int
) : SampleInterface {
/**
* Overloaded toString function.
*/
public override fun toString() = """Person(name=$name, nickname=$nickname,
age=$age)""".trimIndent()

/**
* Overloaded equals function.
*/
public override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Person
return name == other.name && nickname == other.nickname && age == other.age
}

/**
* Overloaded hashCode function based on all class properties.
*/
public override fun hashCode(): Int = Objects.hash(name, nickname, age)

/**
Expand All @@ -121,12 +143,22 @@ public class Person private constructor(
* @property age The age.
*/
public class Builder {
/**
* The full name.
*/
@set:JvmSynthetic
public var name: String? = "John" + Date(1580897313933L).toString()

/**
* The nickname.
* Additional comment.
*/
@set:JvmSynthetic
public var nickname: String? = null

/**
* The age.
*/
@set:JvmSynthetic
public var age: Int? = 42

Expand All @@ -143,6 +175,7 @@ public class Person private constructor(

/**
* Set the nickname.
* Additional comment.
*
* @param nickname the nickname.
* @return Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ annotation class SampleAnnotation
private data class PersonData(
@Default("\"John\" + Date(1580897313933L).toString()")
val name: String,
/**
* Additional comment.
*/
val nickname: String?,
@Default("42")
val age: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,16 @@ class DataCompatProcessor(
for (entry in propertyMap) {
addProperty(
PropertySpec.builder(entry.key.toString(), entry.value)
.addKdoc(
"""
|${getKDocProperty(kdocPropertyList, entry.key.toString()).replaceFirstChar {
if (it.isLowerCase()) it.titlecase(
Locale.getDefault()
) else it.toString()
}}
|${entry.key.docString?.trimStart(' ', '\n') ?: ""}
""".trimMargin()
)
.initializer(entry.key.toString())
.build()
)
Expand All @@ -191,6 +201,11 @@ class DataCompatProcessor(
addFunction(
FunSpec.builder("toString")
.addModifiers(KModifier.OVERRIDE)
.addKdoc(
"""
Overloaded toString function.
""".trimIndent()
)
// using triple quote for long strings
.addStatement(
propertyMap.keys.joinToString(
Expand All @@ -205,6 +220,11 @@ class DataCompatProcessor(
// Function equals
val equalsBuilder = FunSpec.builder("equals")
.addModifiers(KModifier.OVERRIDE)
.addKdoc(
"""
Overloaded equals function.
""".trimIndent()
)
.addParameter("other", ANY.copy(nullable = true))
.addStatement("if (this === other) return true")
.addStatement("if (javaClass != other?.javaClass) return false")
Expand All @@ -223,6 +243,11 @@ class DataCompatProcessor(
// Function hashCode
addFunction(
FunSpec.builder("hashCode")
.addKdoc(
"""
Overloaded hashCode function based on all class properties.
""".trimIndent()
)
.addModifiers(KModifier.OVERRIDE)
.addStatement(
propertyMap.keys.joinToString(
Expand Down Expand Up @@ -265,15 +290,25 @@ class DataCompatProcessor(
val builderBuilder = TypeSpec.classBuilder("Builder")
for (property in propertyMap) {
val propertyName = property.key.toString()

val nullableType = property.value.copy(nullable = true)
val kDocProperty = getKDocProperty(kdocPropertyList, propertyName)
builderBuilder.addProperty(
PropertySpec.builder(propertyName, nullableType)
.initializer(
CodeBlock.builder()
.add(defaultValuesMap[classDeclaration]?.get(propertyName) ?: "null")
.build()
)
.addKdoc(
"""
|${kDocProperty.replaceFirstChar {
if (it.isLowerCase()) it.titlecase(
Locale.getDefault()
) else it.toString()
}}
|${property.key.docString?.trimStart(' ', '\n') ?: ""}
""".trimMargin()
)
.addAnnotation(
AnnotationSpec.builder(JvmSynthetic::class)
.useSiteTarget(AnnotationSpec.UseSiteTarget.SET)
Expand All @@ -283,16 +318,6 @@ class DataCompatProcessor(
.build()
)

var kDocProperty = kdocPropertyList
.filter { it.startsWith("$propertyName ") }
.joinToString {
it.substringAfter("$propertyName ").lowercase(Locale.getDefault())
}

if (kDocProperty.isEmpty()) {
kDocProperty = propertyName
}

builderBuilder.addFunction(
FunSpec
.builder(
Expand All @@ -303,7 +328,7 @@ class DataCompatProcessor(
.addKdoc(
"""
|Set $kDocProperty
|
|${property.key.docString?.trimStart(' ', '\n') ?: ""}
|@param $propertyName $kDocProperty
|@return Builder
""".trimMargin()
Expand Down Expand Up @@ -356,7 +381,7 @@ class DataCompatProcessor(
|
|${
kdocPropertyList.joinToString(
prefix = "$KDOC_PROPERTY_ANNOTATION ",
prefix = if (kdocPropertyList.isEmpty()) "" else "$KDOC_PROPERTY_ANNOTATION ",
separator = "\n$KDOC_PROPERTY_ANNOTATION "
)
}
Expand Down Expand Up @@ -454,6 +479,19 @@ class DataCompatProcessor(

private fun KSClassDeclaration.isDataClass() = modifiers.contains(Modifier.DATA)

private fun getKDocProperty(kdocPropertyList: List<String>, propertyName: String): String {
var kDocProperty = kdocPropertyList
.filter { it.startsWith("$propertyName ") }
.joinToString {
it.substringAfter("$propertyName ").lowercase(Locale.getDefault())
}

if (kDocProperty.isEmpty()) {
kDocProperty = propertyName
}
return kDocProperty
}

private companion object {
private const val CLASS_NAME_DROP_LAST_CHARACTERS = 4
private const val KDOC_PROPERTY_ANNOTATION = "@property"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ private data class PersonData(
val nickname: String?,
@Default("23")
val age: Int,
/**
* Actually it's a very short description.
*/
val veryLongAndVeryDetailedDescription: String?
) : EmptyInterface, EmptyInterface2
""".trimIndent()
Expand Down
Loading

0 comments on commit 591fa0c

Please sign in to comment.