kotlin-orm/ktorm-ksp

生成代码中使用的局部变量、表类型名称引用 可能会跟参数名、表类型扩展成员名称冲突

lookup-cat opened this issue · 9 comments

实体类型

@Table(tableClassName = "entity")
public data class Entity(
    @PrimaryKey
    public var id: Int?
)

生成表类型代码

public object entity : BaseTable<Entity>(tableName = "entity", entityClass = Entity::class) {
    public val id: Column<Int> = int("id").primaryKey()

    public override fun doCreateEntity(row: QueryRowSet, withReferences: Boolean): Entity {
         return Entity(
            id = row[this.id],
        )
    }
}

这个entity表名可能会跟多处生成代码发生冲突

  • 生成的序列扩展名称和类型名冲突
    image
    考虑把sequenceOf的参数改成全限定类名,可以解决此问题(除非这个表类型的包名是空的)
  • 和生成的addupdate方法参数冲突
    image
    参数名和表类型名称都是entity导致报错,在其他生成方法也会出现这种情况,需要考虑将其参数改成不容易发生冲突的名称

我觉得不应该让用户指定 tableClassName,在这个例子里面,实体类是 Entity,表对象的名字就应该是 Entities,sequence 的名字是 entities,这不仅可以解决命名冲突的问题,而且可以限定用户的命名风格

Entity --> Entities --> entities

这是 Ktorm 推荐的命名风格,我们提供 tableClassName 这种配置,就会存在很多不符合我们命名规范的情况出现

Entity --> Entities --> entities

这是 Ktorm 推荐的命名风格,我们提供 tableClassName 这种配置,就会存在很多不符合我们命名规范的情况出现

现有的tableClassName自动生成方式,可能无法满足一些情况。例如child的复数应该是children,但是目前的逻辑只会自动转换成childs,如果不能自定义tableClassName的话其实也挺奇怪的

#4 这个PR 可以自定义生成的序列扩展名称

而且我认为命名只要在符合编程语言要求的范围内,就应该是约定俗成的而不是强制约束。毕竟语言层面都允许这种小写字母开头的类名。我们应该尽可能在默认配置下生成符合规范的命名,同时尽可能做到更多的可自定义配置

@lookup-cat child --> children 的问题很好解决,github 上有一些现成的英语名词复数转换的库,比如 atteo/evo-inflector,另外我注意到现在代码里面复数转换是自己写的,建议可以改成使用类库提高转换的准确性

问题是使用类库来转换名词复数也不是 100% 准确的,这个我同意你的观点,可以提供让用户自己指定

但是我坚持要统一命名风格的观点,即使我们允许用户自己指定名字,当他给出的名字不符合命名规范时,我们需要进行检查,并且给出警告

刚想可能需要做一个自动分配变量名称避免命名冲突的逻辑,结果发现kotlinpoet是有做这个功能的(这么有用的功能竟然没放到官方文档里
https://github.com/square/kotlinpoet/blob/master/kotlinpoet/src/main/java/com/squareup/kotlinpoet/NameAllocator.kt

v1.0.0-RC3已修复