Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
add kpoet. replace extensions with kpoet extensions. some more fixes.
  • Loading branch information
fuzzagrosner committed Apr 7, 2017
1 parent 124c3a9 commit 3baef72
Show file tree
Hide file tree
Showing 12 changed files with 265 additions and 263 deletions.
1 change: 1 addition & 0 deletions build.gradle
Expand Up @@ -14,6 +14,7 @@ buildscript {
allprojects {
repositories {
jcenter()
maven { url "https://www.jitpack.io" }
}
}

Expand Down
7 changes: 4 additions & 3 deletions dbflow-processor/build.gradle
Expand Up @@ -3,14 +3,15 @@ apply plugin: 'kotlin'

project.ext.artifactId = bt_name

targetCompatibility = JavaVersion.VERSION_1_7
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_1_8

dependencies {
compile project("${dbflow_project_prefix}dbflow-core")
compile 'com.squareup:javapoet:1.8.0'
compile 'com.github.agrosner:KPoet:1.0.0'
compile 'com.google.auto.service:auto-service:1.0-rc2'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"

testCompile 'junit:junit:4.12'

Expand Down
@@ -1,14 +1,17 @@
package com.raizlabs.android.dbflow.processor.definition

import com.google.common.collect.Lists
import com.grosner.kpoet.*
import com.raizlabs.android.dbflow.annotation.provider.ContentProvider
import com.raizlabs.android.dbflow.annotation.provider.ContentUri
import com.raizlabs.android.dbflow.annotation.provider.Notify
import com.raizlabs.android.dbflow.annotation.provider.TableEndpoint
import com.raizlabs.android.dbflow.processor.ClassNames
import com.raizlabs.android.dbflow.processor.ProcessorManager
import com.raizlabs.android.dbflow.processor.TableEndpointValidator
import com.raizlabs.android.dbflow.processor.utils.*
import com.raizlabs.android.dbflow.processor.utils.`override fun`
import com.raizlabs.android.dbflow.processor.utils.controlFlow
import com.raizlabs.android.dbflow.processor.utils.isNullOrEmpty
import com.squareup.javapoet.*
import javax.lang.model.element.*
import javax.lang.model.type.MirroredTypeException
Expand Down Expand Up @@ -393,18 +396,15 @@ class ContentProviderDefinition(typeElement: Element, processorManager: Processo
var code = 0
for (endpointDefinition in endpointDefinitions) {
endpointDefinition.contentUriDefinitions.forEach {
field(TypeName.INT name it.name modifiers listOf(Modifier.STATIC, Modifier.FINAL)) {
initializer(code.toString())
}
`private static final field`(TypeName.INT, it.name) { `=`(code.toString()) }
code++
}
}

field(ClassNames.URI_MATCHER name URI_MATCHER modifiers privateFinal) {
initializer("new \$T(\$T.NO_MATCH)", ClassNames.URI_MATCHER, ClassNames.URI_MATCHER)
}
`private final field`(ClassNames.URI_MATCHER, URI_MATCHER) { `=`("new \$T(\$T.NO_MATCH)", ClassNames.URI_MATCHER, ClassNames.URI_MATCHER) }

overrideMethod("onCreate" returns TypeName.BOOLEAN modifiers publicFinal) {
`override fun`(TypeName.BOOLEAN, "onCreate") {
modifiers(public, final)
addStatement("final \$T $AUTHORITY = \$L", String::class.java,
if (authority.contains("R.string."))
"getContext().getString($authority)"
Expand All @@ -427,26 +427,26 @@ class ContentProviderDefinition(typeElement: Element, processorManager: Processo
addStatement("return super.onCreate()")
}

overrideMethod("getDatabaseName" returns String::class modifiers publicFinal) {
addStatement("return \$S", databaseNameString)
`override fun`(String::class, "getDatabaseName") {
modifiers(public, final)
`return`(databaseNameString.S)
}

method("getType" returns String::class modifiers publicFinal) {
addParameter(ClassNames.URI, "uri")

`override fun`(String::class, "getType", param(ClassNames.URI, "uri")) {
modifiers(public, final)
code {
addStatement("\$T type = null", ClassName.get(String::class.java))
statement("\$T type = null", ClassName.get(String::class.java))
controlFlow("switch(\$L.match(uri))", URI_MATCHER) {
endpointDefinitions.flatMap { it.contentUriDefinitions }
.forEach { uri ->
controlFlow("case \$L:", uri.name) {
addStatement("type = \$S", uri.type)
addStatement("break")
statement("type = \$S", uri.type)
`break`()
}
}
appendDefault(this)
}
addStatement("return type")
`return`("type")
}
}
}
Expand Down
@@ -1,14 +1,15 @@
package com.raizlabs.android.dbflow.processor.definition

import com.grosner.kpoet.*
import com.raizlabs.android.dbflow.annotation.ConflictAction
import com.raizlabs.android.dbflow.annotation.Database
import com.raizlabs.android.dbflow.processor.*
import com.raizlabs.android.dbflow.processor.utils.*
import com.raizlabs.android.dbflow.processor.utils.`override fun`
import com.raizlabs.android.dbflow.processor.utils.isNullOrEmpty
import com.squareup.javapoet.*
import java.util.*
import java.util.regex.Pattern
import javax.lang.model.element.Element
import javax.lang.model.element.Modifier

/**
* Description: Writes [Database] definitions,
Expand Down Expand Up @@ -51,7 +52,7 @@ class DatabaseDefinition(manager: ProcessorManager, element: Element) : BaseDefi
}
if (!isValidDatabaseName(databaseName)) {
throw Error("Database name [ " + databaseName + " ] is not valid. It must pass [A-Za-z_$]+[a-zA-Z0-9_$]* " +
"regex so it can't start with a number or contain any special character except '$'. Especially a dot character is not allowed!")
"regex so it can't start with a number or contain any special character except '$'. Especially a dot character is not allowed!")
}

consistencyChecksEnabled = database.consistencyCheckEnabled
Expand Down Expand Up @@ -125,28 +126,27 @@ class DatabaseDefinition(manager: ProcessorManager, element: Element) : BaseDefi

private fun writeConstructor(builder: TypeSpec.Builder) {

builder.constructor {
modifiers(Modifier.PUBLIC)
addParameter(ClassNames.DATABASE_HOLDER, "holder")
builder.constructor(param(ClassNames.DATABASE_HOLDER, "holder")) {
modifiers(public)
val elementClassName = this@DatabaseDefinition.elementClassName
if (elementClassName != null) {
for (tableDefinition in manager.getTableDefinitions(elementClassName)) {
addStatement("holder.putDatabaseForTable(\$T.class, this)", tableDefinition.elementClassName)
addStatement("\$L.put(\$S, \$T.class)", DatabaseHandler.MODEL_NAME_MAP, tableDefinition.tableName, tableDefinition.elementClassName)
addStatement("\$L.put(\$T.class, new \$T(holder, this))", DatabaseHandler.MODEL_ADAPTER_MAP_FIELD_NAME,
tableDefinition.elementClassName, tableDefinition.outputClassName)
statement("holder.putDatabaseForTable(\$T.class, this)", tableDefinition.elementClassName)
statement("\$L.put(\$S, \$T.class)", DatabaseHandler.MODEL_NAME_MAP, tableDefinition.tableName, tableDefinition.elementClassName)
statement("\$L.put(\$T.class, new \$T(holder, this))", DatabaseHandler.MODEL_ADAPTER_MAP_FIELD_NAME,
tableDefinition.elementClassName, tableDefinition.outputClassName)
}

for (modelViewDefinition in manager.getModelViewDefinitions(elementClassName)) {
addStatement("holder.putDatabaseForTable(\$T.class, this)", modelViewDefinition.elementClassName)
addStatement("\$L.put(\$T.class, new \$T(holder, this))", DatabaseHandler.MODEL_VIEW_ADAPTER_MAP_FIELD_NAME,
modelViewDefinition.elementClassName, modelViewDefinition.outputClassName)
statement("holder.putDatabaseForTable(\$T.class, this)", modelViewDefinition.elementClassName)
statement("\$L.put(\$T.class, new \$T(holder, this))", DatabaseHandler.MODEL_VIEW_ADAPTER_MAP_FIELD_NAME,
modelViewDefinition.elementClassName, modelViewDefinition.outputClassName)
}

for (queryModelDefinition in manager.getQueryModelDefinitions(elementClassName)) {
addStatement("holder.putDatabaseForTable(\$T.class, this)", queryModelDefinition.elementClassName)
addStatement("\$L.put(\$T.class, new \$T(holder, this))", DatabaseHandler.QUERY_MODEL_ADAPTER_MAP_FIELD_NAME,
queryModelDefinition.elementClassName, queryModelDefinition.outputClassName)
statement("holder.putDatabaseForTable(\$T.class, this)", queryModelDefinition.elementClassName)
statement("\$L.put(\$T.class, new \$T(holder, this))", DatabaseHandler.QUERY_MODEL_ADAPTER_MAP_FIELD_NAME,
queryModelDefinition.elementClassName, queryModelDefinition.outputClassName)
}

val migrationDefinitionMap = manager.getMigrationsForDatabase(elementClassName)
Expand All @@ -157,49 +157,58 @@ class DatabaseDefinition(manager: ProcessorManager, element: Element) : BaseDefi
val migrationDefinitions = migrationDefinitionMap[version]
migrationDefinitions?.let {
Collections.sort(migrationDefinitions, { o1, o2 -> Integer.valueOf(o2.priority)!!.compareTo(o1.priority) })
addStatement("\$T migrations\$L = new \$T()", ParameterizedTypeName.get(ClassName.get(List::class.java), ClassNames.MIGRATION),
version, ParameterizedTypeName.get(ClassName.get(ArrayList::class.java), ClassNames.MIGRATION))
addStatement("\$L.put(\$L, migrations\$L)", DatabaseHandler.MIGRATION_FIELD_NAME,
version, version)
statement("\$T migrations\$L = new \$T()", ParameterizedTypeName.get(ClassName.get(List::class.java), ClassNames.MIGRATION),
version, ParameterizedTypeName.get(ClassName.get(ArrayList::class.java), ClassNames.MIGRATION))
statement("\$L.put(\$L, migrations\$L)", DatabaseHandler.MIGRATION_FIELD_NAME,
version, version)
for (migrationDefinition in migrationDefinitions) {
addStatement("migrations\$L.add(new \$T\$L)", version, migrationDefinition.elementClassName,
migrationDefinition.constructorName)
statement("migrations\$L.add(new \$T\$L)", version, migrationDefinition.elementClassName,
migrationDefinition.constructorName)
}
}
}
}
}
this
}

}

private fun writeGetters(typeBuilder: TypeSpec.Builder) {
typeBuilder.apply {
overrideMethod("getAssociatedDatabaseClassFile" returns ParameterizedTypeName.get(ClassName.get(Class::class.java),
WildcardTypeName.subtypeOf(Any::class.java)) modifiers publicFinal) {
addStatement("return \$T.class", elementTypeName)
`override fun`(ParameterizedTypeName.get(ClassName.get(Class::class.java), WildcardTypeName.subtypeOf(Any::class.java)),
"getAssociatedDatabaseClassFile") {
modifiers(public, final)
`return`("\$T.class", elementTypeName)
}
overrideMethod("isForeignKeysSupported" returns TypeName.BOOLEAN modifiers publicFinal) {
addStatement("return \$L", foreignKeysSupported)
`override fun`(TypeName.BOOLEAN, "isForeignKeysSupported") {
modifiers(public, final)
`return`(foreignKeysSupported.L)
}
overrideMethod("isInMemory" returns TypeName.BOOLEAN modifiers publicFinal) {
addStatement("return \$L", isInMemory)
`override fun`(TypeName.BOOLEAN, "isInMemory") {
modifiers(public, final)
`return`(isInMemory.L)
}
overrideMethod("backupEnabled" returns TypeName.BOOLEAN modifiers publicFinal) {
addStatement("return \$L", backupEnabled)
`override fun`(TypeName.BOOLEAN, "backupEnabled") {
modifiers(public, final)
`return`(backupEnabled.L)
}
overrideMethod("areConsistencyChecksEnabled" returns TypeName.BOOLEAN modifiers publicFinal) {
addStatement("return \$L", consistencyChecksEnabled)
`override fun`(TypeName.BOOLEAN, "areConsistencyChecksEnabled") {
modifiers(public, final)
`return`(consistencyChecksEnabled.L)
}
overrideMethod("getDatabaseVersion" returns TypeName.INT modifiers publicFinal) {
addStatement("return \$L", databaseVersion)
`override fun`(TypeName.INT, "getDatabaseVersion") {
modifiers(public, final)
`return`(databaseVersion.L)
}
overrideMethod("getDatabaseName" returns String::class modifiers publicFinal) {
addStatement("return \$S", databaseName)
`override fun`(String::class, "getDatabaseName") {
modifiers(public, final)
`return`(databaseName.S)
}
if (!databaseExtensionName.isNullOrBlank()) {
overrideMethod("getDatabaseExtensionName" returns String::class modifiers publicFinal) {
addStatement("return \$S", databaseExtensionName)
`override fun`(String::class, "getDatabaseExtensionName") {
modifiers(public, final)
`return`(databaseExtensionName.S)
}
}
}
Expand Down
@@ -1,16 +1,19 @@
package com.raizlabs.android.dbflow.processor.definition

import com.grosner.kpoet.*
import com.raizlabs.android.dbflow.annotation.ForeignKey
import com.raizlabs.android.dbflow.annotation.ManyToMany
import com.raizlabs.android.dbflow.annotation.PrimaryKey
import com.raizlabs.android.dbflow.annotation.Table
import com.raizlabs.android.dbflow.processor.ClassNames
import com.raizlabs.android.dbflow.processor.ProcessorManager
import com.raizlabs.android.dbflow.processor.utils.*
import com.raizlabs.android.dbflow.processor.utils.capitalizeFirstLetter
import com.raizlabs.android.dbflow.processor.utils.isNullOrEmpty
import com.raizlabs.android.dbflow.processor.utils.lower
import com.raizlabs.android.dbflow.processor.utils.toTypeElement
import com.squareup.javapoet.AnnotationSpec
import com.squareup.javapoet.TypeName
import com.squareup.javapoet.TypeSpec
import javax.lang.model.element.Modifier
import javax.lang.model.element.TypeElement
import javax.lang.model.type.MirroredTypeException
import javax.lang.model.type.TypeMirror
Expand Down Expand Up @@ -53,7 +56,7 @@ class ManyToManyDefinition @JvmOverloads constructor(element: TypeElement, proce
}

if (!thisColumnName.isNullOrEmpty() && !referencedColumnName.isNullOrEmpty()
&& thisColumnName == referencedColumnName) {
&& thisColumnName == referencedColumnName) {
manager.logError(ManyToManyDefinition::class, "The thisTableColumnName and referenceTableColumnName" + "cannot be the same")
}
}
Expand All @@ -74,19 +77,18 @@ class ManyToManyDefinition @JvmOverloads constructor(element: TypeElement, proce

override fun onWriteDefinition(typeBuilder: TypeSpec.Builder) {
typeBuilder.addAnnotation(AnnotationSpec.builder(Table::class.java)
.addMember("database", "\$T.class", databaseTypeName).build())
.addMember("database", "\$T.class", databaseTypeName).build())

val referencedDefinition = manager.getTableDefinition(databaseTypeName, referencedTable)
val selfDefinition = manager.getTableDefinition(databaseTypeName, elementTypeName)

if (generateAutoIncrement) {
typeBuilder.apply {
field(TypeName.LONG name "_id") {
annotation(PrimaryKey::class, "autoincrement", "true")
}
addField(field(`@`(PrimaryKey::class) { this["autoincrement"] = "true" }, TypeName.LONG, "_id").build())

method("getId" returns TypeName.LONG modifiers listOf(Modifier.PUBLIC, Modifier.FINAL)) {
addStatement("return \$L", "_id")
`fun`(TypeName.LONG, "getId") {
modifiers(public, final)
`return`("_id")
}
}
}
Expand All @@ -110,20 +112,20 @@ class ManyToManyDefinition @JvmOverloads constructor(element: TypeElement, proce
}

typeBuilder.apply {
field(referencedDefinition.elementClassName name fieldName) {
`field`(referencedDefinition.elementClassName!!, fieldName) {
if (!generateAutoIncrement) {
annotation(PrimaryKey::class)
`@`(PrimaryKey::class)
}
annotation(ForeignKey::class, "saveForeignKeyModel", saveForeignKeyModels.toString())
`@`(ForeignKey::class) { member("saveForeignKeyModel", saveForeignKeyModels.toString()) }
}
method("get${fieldName.capitalizeFirstLetter()}" returns
referencedDefinition.elementClassName modifiers publicFinal) {
addStatement("return \$L", fieldName)
`fun`(referencedDefinition.elementClassName!!, "get${fieldName.capitalizeFirstLetter()}") {
modifiers(public, final)
`return`(fieldName.L)
}
method("set${fieldName.capitalizeFirstLetter()}" returns
TypeName.VOID modifiers publicFinal) {
addParameter(referencedDefinition.elementClassName, "param")
addStatement("\$L = param", fieldName)
`fun`(TypeName.VOID, "set${fieldName.capitalizeFirstLetter()}",
param(referencedDefinition.elementClassName!!, "param")) {
modifiers(public, final)
statement("$fieldName = param")
}
}
}
Expand Down

0 comments on commit 3baef72

Please sign in to comment.