当前位置: 首页 > article >正文

安卓model转鸿蒙ets

现在的android studio提供了java自动转kotlin的实现,非常方便。

那android的java和kotlin有没有可能转成鸿蒙arkts呢。

本质上都是字符串文件,讲道理应该是可行的。

先从最简单的model转换开始,把kotlin的model转成ets。

通过插件的形式把kt/java文件转成ets文件,贴个kt2ets的方法:

fun convertKt2Ets(ktCode: String): String {
        val lines = ktCode.split("\n")
        var inClass = false
        var hasBigQuo = false
        var dataClassName = ""
        val tsLines = mutableListOf<String>()
        for (line in lines) {
            when {
                // class
                line.startsWith("class ") -> {
                    // class content
                    inClass = true
                    // 是个data class
                    if (line.contains("{")) {
                        hasBigQuo = true
                    }
                    dataClassName = line.substringAfter("class").substringBefore("(")
                    if (dataClassName != null) {
                        tsLines.add("export interface ${dataClassName.trim()} {")
                    }
                }
                // fields
                inClass && (line.contains("val") || line.contains("var")) -> {
                    val fields = line.split(",")
                    fields.forEach { field ->
                        val pureCode = field.replace("val", "").replace("var", "")
                        val parts = pureCode.split(":")
                        if (parts.size == 2) {
                            val name = parts[0].trim()
                            val hasQue = parts[1].contains("?")
                            val useQue = if (hasQue) {
                                "?"
                            } else {
                                ""
                            }
                            var type = convertKtType2EtsType(parts[1].replace("?", "").trim())
                            // 数组变量
                            if (type.contains("List<") || type.contains("ArrayList<")) {
                                type = type.replace("List<", "")
                                    .replace("ArrayList<", "")
                                    .replace(">", "")
                                type = "${type}[]"
                            }
                            tsLines.add("    $name${useQue}: $type")
                        } else {
                            println("not format field line")
                        }
                    }
                }
                // fun 2 function
                line.contains("fun ") -> {
                    val functionName = line.substringAfter("fun ").substringBefore("(")
                    val params = line.substringAfter("(").substringBefore(")").split(",").joinToString(", ") {
                        val (paramName, paramType) = it.trim().split(":")
                        "${paramName.trim()}: ${convertKtType2EtsType(paramType.trim())}"
                    }
                    val returnType = convertKtType2EtsType(line.substringAfter("):").substringBefore("{").trim())
                    tsLines.add("function $functionName($params): $returnType {")
                }
                (inClass && line.contains("}")) -> {
                    tsLines.add(line)
                    inClass = false
                    hasBigQuo = false
                }
                (inClass && !hasBigQuo && line.contains(")")) -> {
                    tsLines.add("}")
                    inClass = false
                    hasBigQuo = false
                }
                (line.startsWith("package") || line.startsWith("import ")) -> {
                    // remove line
                }
                 else -> {
                     tsLines.add(line)
                 }
            }
        }
        return tsLines.joinToString("\n")
    }

    private fun convertKtType2EtsType(type: String): String {
        return type.replace("String", "string")
            .replace("Int", "number")
            .replace("Float", "number")
            .replace("Double", "number")
            .replace("Boolean", "boolean")
            .replace("Long", "number")
    }

后续公布源码


http://www.kler.cn/a/288771.html

相关文章:

  • 4.4 软件设计:UML顺序图
  • GxtWaitCursor:Qt下基于RAII的鼠标等待光标类
  • 2411C++,C++26反射示例
  • -1大于4?负数与无符号整数类型:size_t的比较问题(strlen)
  • 系统上线后发现bug,如何回退版本?已经产生的新业务数据怎么办?
  • GaussDB部署架构
  • Centos挂载yum源
  • Spring框架
  • 店铺所有商品接口数据解析,JSON格式的示例
  • 在Spring Boot中实现请求IP白名单拦截
  • python-读取word中的内容
  • 代码随想录第二十天 | 513. 找树左下角的值,路径总和,106. 从中序与后序遍历序列构造二叉树
  • react|useState的异步渲染
  • 【AIGC】ChatGPT 3.5/4.0 新手使用手册
  • 【pyhton】python如何实现将word等文档中的文字转换成语音
  • 如何用Python 下载B站上的视频
  • SQL【2】稍稍进阶
  • 无人机图传通信模组,抗干扰、稳定传输,8公里图传模组原理
  • 最长回文子串:动态规划推导
  • JAVA 手机部件功耗计算
  • 魅力中国:全球消费者 “反向海淘” 首选,淘宝代购集运系统搭建秘籍
  • 趣味算法------单一背包问题(01背包问题)贪心算法解决
  • 安防视频综合管理系统EasyCVR视频汇聚平台集群部署出现状态不同步的情况是什么原因?
  • 遥控器显示分别对应的无人机状态详解!!
  • VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累
  • 使用idea快速创建springbootWeb项目(springboot+springWeb+mybatis-Plus)