Skip to content

Commit

Permalink
Merge pull request #7 from lwj1994/2.0.0
Browse files Browse the repository at this point in the history
2.0.0
  • Loading branch information
lwj1994 authored Mar 11, 2022
2 parents 9df3088 + 6b2c808 commit f9591e6
Show file tree
Hide file tree
Showing 9 changed files with 91 additions and 62 deletions.
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,10 @@ use `@Entity` annotation this class.
prefixKeyWithClassName = "true" // if true, will add className as key's prefix, default false
)
data class UserInfo(
// defValue: the default value
// name: the real key name
// defaultValue: the default value
// enableReset: default true, if false will not reset to defValue in [reset()] function
@ColumnInfo(defValue = "david", enableReset = false)
@ColumnInfo(name = "realKeyName", defaultValue = "david", enableReset = false)
val name: String,
@ColumnInfo(defValue = "12")
val age: Int,
Expand All @@ -102,7 +103,7 @@ build project and we will get a Registry class.
* this class is generated by https://github.com/lwj1994/ormkv for
* [com.lwjlol.ormkv.demo.UserInfo], Please don't modify it!
*/
public object UserRegistry {
public class UserRegistry {
private val kvHandler: OrmKvHandler = com.lwjlol.ormkv.demo.KvStore.sharedPreferencesHandler

private var _name: String? = null
Expand Down Expand Up @@ -188,10 +189,11 @@ public object UserRegistry {
then we can use the Registry class set/get value directly.

```kotlin
UserRegistry.name = "Mike"
val userRegistry = UserRegistry()
userRegistry.name = "Mike"

Log.d(tag, UserRegistry.toString())
Log.d(tag, UserRegistry.name)
Log.d(tag, userRegistry.toString())
Log.d(tag, userRegistry.name)
```

## KSP
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ dependencies {
implementation(project(":sharedPreferences"))
implementation(project(":mmkv"))
implementation(kotlin("stdlib"))
ksp(project(":compiler"))
// kapt(project(":compiler"))
// ksp(project(":compiler"))
kapt(project(":compiler"))
implementation(project(":compiler"))
}

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/lwjlol/ormkv/demo/ConfigModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import com.lwjlol.ormkv.annotation.Ignore
data class ConfigModel(
@Ignore
val value3: ByteArray,
@ColumnInfo(defValue = "22")
@ColumnInfo(defaultValue = "22")
val value4: Long,
@ColumnInfo(defValue = "")
@ColumnInfo(defaultValue = "false")
val v4: Boolean,
val v5: Long,
val v6: Float,
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/java/com/lwjlol/ormkv/demo/Constants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.lwjlol.ormkv.demo;

class Constants {
public static final String PWD = "121312";
}
1 change: 1 addition & 0 deletions app/src/main/java/com/lwjlol/ormkv/demo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
updateText()
val user = User()


// UserSp.name
Expand Down
17 changes: 10 additions & 7 deletions app/src/main/java/com/lwjlol/ormkv/demo/UserModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,25 @@ import com.lwjlol.ormkv.annotation.Ignore
* @author luwenjie on 2019-08-11 20:16:58
*/
@Entity(
prefixKeyWithClassName = true,
handlerCodeReference = "com.lwjlol.ormkv.demo.KvStore.sp"
className = "User",
handlerCodeReference = "com.lwjlol.ormkv.demo.KvStore.sp",
prefixKeyWithClassName = true
)
data class UserModel(
@ColumnInfo(name = "SECNAME_XXD", defaultValue = Constants.PWD)
val secname: String,
@Ignore
// val skip: String,
@ColumnInfo(defValue = "qweqweqe")
@ColumnInfo(defaultValue = "qweqweqe")
val name: String,
@Ignore
@ColumnInfo(defValue = "12")
@ColumnInfo(defaultValue = "12")
val age: Int,
@ColumnInfo(defValue = "12312312", enableReset = false)
@ColumnInfo(defaultValue = "12312312", enableReset = false)
val id: Long,
@ColumnInfo(defValue = "false")
@ColumnInfo(defaultValue = "false")
val isMan: Boolean,
@ColumnInfo(defValue = "1231", enableReset = false)
@ColumnInfo(defaultValue = "1231", enableReset = false)
val temperature: Float

) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class KspOrmkvProcessor(
name = className
}
val fileName = if (classNameArg.isNotEmpty()) name else "${name}${END_FIX}"
val typeSpec = TypeSpec.objectBuilder(fileName)
val typeSpec = TypeSpec.classBuilder(fileName)
.addKdoc("this class is generated by https://github.com/lwj1994/ormkv for [${packageName}.${className}], Please don't modify it!")

if (handlerCodeReferenceArg.isEmpty()) {
Expand Down Expand Up @@ -114,67 +114,74 @@ class KspOrmkvProcessor(
member.annotations.find { it.annotationType.resolve().declaration.qualifiedName?.asString() == Ignore::class.qualifiedName } != null
val columnInfo =
member.annotations.find { it.annotationType.resolve().declaration.qualifiedName?.asString() == ColumnInfo::class.qualifiedName }
var defValue: String = ""
var defaultValue: String = ""
var columnName = member.name?.asString() ?: ""
var enableReset = true
columnInfo?.arguments?.forEach {
if (it.name?.asString() == "defValue") {
defValue = it.value?.toString() ?: ""
if (it.name?.asString() == DEFAULT_VALUE) {
defaultValue = it.value?.toString() ?: ""
}
if (it.name?.asString() == "enableReset") {
if (it.name?.asString() == NAME) {
it.value?.toString()?.apply {
if (isNotEmpty()) columnName = this
}
}
if (it.name?.asString() == ENABLE_RESET) {
enableReset = it.value as Boolean
}
}
val memberTypeName = member.type.resolve().declaration.qualifiedName?.asString() ?: ""
val valueName = "_${member.name?.asString()}"
val propertyName = member.name?.asString() ?: ""
val keyUnitName = columnName.ifEmpty { member.name?.asString() ?: "" }
var getName = ""

val prefix = "$packageName.${className}"
val keyName = if (prefixKeyArg) "${prefix}_$propertyName" else propertyName
val keyName = if (prefixKeyArg) "${prefix}_$keyUnitName" else keyUnitName
when (memberTypeName) {
"kotlin.String" -> {
getName = "get(\"$keyName\", \"\"\"$defValue\"\"\") as String"
getName = "get(\"$keyName\", \"\"\"$defaultValue\"\"\") as String"
}
"kotlin.Float" -> {
defValue = defValue.ifEmpty { "0F" }
if (!defValue.endsWith('F')) {
defValue = "${defValue}F"
defaultValue = defaultValue.ifEmpty { "0F" }
if (!defaultValue.endsWith('F')) {
defaultValue = "${defaultValue}F"
}
getName = "get(\"$keyName\", $defValue) as Float"
getName = "get(\"$keyName\", $defaultValue) as Float"
}
"kotlin.Int" -> {
defValue = defValue.ifEmpty { "0" }
getName = "get(\"$keyName\", $defValue) as Int"
defaultValue = defaultValue.ifEmpty { "0" }
getName = "get(\"$keyName\", $defaultValue) as Int"
}
"kotlin.Long" -> {
defValue = defValue.ifEmpty { "0L" }
if (!defValue.endsWith('L')) {
defValue = "${defValue}L"
defaultValue = defaultValue.ifEmpty { "0L" }
if (!defaultValue.endsWith('L')) {
defaultValue = "${defaultValue}L"
}
getName = "get(\"$keyName\", $defValue) as Long"
getName = "get(\"$keyName\", $defaultValue) as Long"
}
"kotlin.Boolean" -> {
defValue = defValue.ifEmpty { "false" }
getName = "get(\"$keyName\", $defValue) as Boolean"
defaultValue = defaultValue.ifEmpty { "false" }
getName = "get(\"$keyName\", $defaultValue) as Boolean"
}
"kotlin.ByteArray" -> {
defValue = defValue.ifEmpty { "ByteArray(0)" }
defaultValue = defaultValue.ifEmpty { "ByteArray(0)" }
getName = "get(\"$keyName\", ByteArray(0)) as ByteArray"
}
else -> {
defValue = "error"
defaultValue = "error"
}
}
// ignore
if (ignore && !toModelError) {
if (defValue == "error") {
if (defaultValue == "error") {
toModelError = true
return@forEachIndexed
}
if (memberTypeName.contains("String")) {
toModelCode.append("|$propertyName = \"$defValue\", \n")
toModelCode.append("|$propertyName = \"$defaultValue\", \n")
} else {
toModelCode.append("|$propertyName = $defValue, \n")
toModelCode.append("|$propertyName = $defaultValue, \n")
}
return@forEachIndexed
}
Expand Down Expand Up @@ -219,9 +226,9 @@ class KspOrmkvProcessor(
updateCode.append("|$propertyName = model.$propertyName\n")
if (enableReset) {
if (memberTypeName.contains("String")) {
clearCode.append("$propertyName = \"\"\"$defValue\"\"\" \n")
clearCode.append("$propertyName = \"\"\"$defaultValue\"\"\" \n")
} else {
clearCode.append("$propertyName = $defValue \n")
clearCode.append("$propertyName = $defaultValue \n")
}
}
}
Expand Down Expand Up @@ -342,4 +349,7 @@ class KspOrmkvProvider : SymbolProcessorProvider {
private const val END_FIX = "Registry"
private const val LOG = false
private const val HANDLER = "kvHandler"
private const val TAG = "KspOrmkv"
private const val TAG = "KspOrmkv"
private const val DEFAULT_VALUE = "defaultValue"
private const val NAME = "name"
private const val ENABLE_RESET = "enableReset"
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,15 @@ class OrmkvProcessor : AbstractProcessor() {
entity: Entity
) {
var name = entity.className
val prefixKeyWithClassName = entity.prefixKeyWithClassName
val generatePackageName = if (entity.className.contains('.')) {
name = entity.className.substringAfterLast('.')
entity.className.substringBeforeLast('.')
} else {
packageName
}
val fileName = if (entity.className.isNotEmpty()) name else "${name}_${END_FIX}"
val typeSpec = TypeSpec.objectBuilder(fileName)
val typeSpec = TypeSpec.classBuilder(fileName)
.addKdoc("this class is generated by https://github.com/lwj1994/ormkv for [${packageName}.${className}], Please don't modify it!")

typeSpec.addProperty(
Expand All @@ -89,9 +90,10 @@ class OrmkvProcessor : AbstractProcessor() {
var toModelError = false
allMembers.forEachIndexed { _, member ->
if (member.kind.isField && !member.modifiers.contains(Modifier.STATIC)) {
val ignore = member.getAnnotation(Ignore::class.java)
val spColumnInfo = member.getAnnotation(ColumnInfo::class.java)
val defInitValue = spColumnInfo?.defValue ?: ""
val ignore: Ignore? = member.getAnnotation(Ignore::class.java)
val spColumnInfo: ColumnInfo? = member.getAnnotation(ColumnInfo::class.java)
val defInitValue = spColumnInfo?.defaultValue ?: ""
val columnName = spColumnInfo?.name ?: ""
val clear = spColumnInfo?.enableReset ?: true
val memberTypeName = member.asType().asTypeName()
val valueName = "_${member.simpleName}"
Expand All @@ -118,16 +120,16 @@ class OrmkvProcessor : AbstractProcessor() {
paramType.contains("Boolean") -> "${if (defInitValue.isNotEmpty()) defInitValue.toBoolean() else false}"
paramType.contains("Int") -> "${if (defInitValue.isNotEmpty()) defInitValue.toInt() else 0}"
paramType.contains("Long") -> "${if (defInitValue.isNotEmpty()) defInitValue.toLong() else 0}".run {
if (!contains("L")){
if (!contains("L")) {
"${this}L"
}else{
} else {
this
}
}
paramType.contains("ByteArray") -> "ByteArray(0)"
paramType.contains("Float") -> {
val res =
(if (spColumnInfo.defValue.isNotEmpty()) spColumnInfo.defValue.toFloat() else 0F).toString()
(if (spColumnInfo?.defaultValue?.isNotEmpty() == true) spColumnInfo.defaultValue.toFloat() else 0F).toString()
if (!res.contains("F")) {
"${res}F"
} else {
Expand All @@ -148,17 +150,22 @@ class OrmkvProcessor : AbstractProcessor() {
}
return@forEachIndexed
}

val keyUnitName = columnName.ifEmpty { propertyName }
val prefix = "$packageName.${className}"
val keyName = if (prefixKeyWithClassName) "${prefix}_$keyUnitName" else keyUnitName

val getName = when {
paramType.contains("String") -> "get(\"$propertyName\", \"\"\"$defValue\"\"\") as String"
paramType.contains("Boolean") -> "get(\"$propertyName\", $defValue) as Boolean"
paramType.contains("Int") -> "get(\"$propertyName\", $defValue) as Int"
paramType.contains("Long") -> "get(\"$propertyName\", $defValue) as Long"
paramType.contains("Float") -> "get(\"$propertyName\", $defValue) as Float"
paramType.contains("ByteArray") -> "get(\"$propertyName\", ByteArray(0)) as ByteArray"
paramType.contains("String") -> "get(\"$keyName\", \"\"\"$defValue\"\"\") as String"
paramType.contains("Boolean") -> "get(\"$keyName\", $defValue) as Boolean"
paramType.contains("Int") -> "get(\"$keyName\", $defValue) as Int"
paramType.contains("Long") -> "get(\"$keyName\", $defValue) as Long"
paramType.contains("Float") -> "get(\"$keyName\", $defValue) as Float"
paramType.contains("ByteArray") -> "get(\"$keyName\", ByteArray(0)) as ByteArray"
else -> "unsupport"
}

val setName = """put("$propertyName", value)"""
val setName = """put("$keyName", value)"""

typeSpec.addProperty(
PropertySpec.builder(valueName, typeName.copy(true))
Expand Down Expand Up @@ -255,7 +262,7 @@ class OrmkvProcessor : AbstractProcessor() {
private fun TypeSpec.Builder.addUpdate(code: String, typeName: TypeName): TypeSpec.Builder {
return addFunction(
FunSpec.builder("update")
.addParameter(ParameterSpec.builder("model",typeName).build())
.addParameter(ParameterSpec.builder("model", typeName).build())
.addCode(code)
.build()
)
Expand Down
7 changes: 4 additions & 3 deletions core/src/main/java/com/lwjlol/ormkv/annotation/ColumnInfo.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.lwjlol.ormkv.annotation

/**
* @param defValue 默认值
* @param defaultValue 默认值
* @param enableReset 允许恢复默认值
* @param handlerCodeReference
*/
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.SOURCE)
annotation class ColumnInfo(
val defValue: String = "",
val enableReset: Boolean = true
val defaultValue: String = "",
val name: String = "",
val enableReset: Boolean = true,
)

0 comments on commit f9591e6

Please sign in to comment.