欢迎大家支持原文。

最近在使用 Kotlin 开发一个 IDE 插件,遇到了一些 Kotlin 编译器的 bug ,就在博客里分享一下。

Java 交互问题

首先, Kotlin 编译器在遇到接口自带实现的情况时,会生成一个 DefaultImpls ,大概长这样:

@Metadata(

mv = {1, 1, 9},

bv = {1, 0, 2},

k = 3

)

public static final class DefaultImpls {

@NotNull

public static FShapeQuad getDefaultActiveArea(final FriceGame $this) {

return (FShapeQuad)(new FShapeQuad() { // ... });

}

@NotNull

public static FShapeQuad getBox(FriceGame $this) {

FShapeQuad var10000 = $this.getActiveArea();

if (var10000 == null) {

var10000 = $this.getDefaultActiveArea();

}

return var10000;

}

// ...

然后生成的子类中还是会有这些抽象方法的实现, 只是实现都会调用这个 DefaultImpls 里的方法(也就是说, 它对 Java8 的 default 一无所知

)。

因此,如果有一个 Java 的子类实现这个接口, 那么这些在 Kotlin 里有默认实现的方法其实都还是抽象的, 只是你可以直接在里面写 return DefaultImpls.xxx() 而已。

我遇到这个问题的 case ,是有这样的代码的继承关系:

interface IJuliaSymbol : PsiElement { fun rua() = 233 }

abstract class JuliaSymbolMixin : JuliaSymbol

interface JuliaSymbol extends IJuliaSymbol { }

class JuliaSymbolImpl extends JuliaSymbolMixin { }

我以为 rua 的实现会在 JuliaSymbolMixin 中被自动插入, 于是 JuliaSymbolImpl 就可以使用了。

结果我太年轻,编译器直接抛异常。

错误信息:

Error:Kotlin: [Internal Error] java.lang.AssertionError: Could not generate LightClass for org.ice1000.julia.lang.psi.impl declared in

System: Linux 4.13.0-32-generic Java Runtime: 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12

元数据和实际代码不符的问题

一开始我遇到这个问题是懵逼的,因为我只是调用了一个 inline reified 的方法而已,我犯了什么错呢。

get() = parentOfType() ?: parent

实际上是这样的, Kotlin 在查找方法之类的东西的定义的时候, 是进入类文件的元数据进行查找的, 因此如果元数据和方法本身不匹配的话就可以崩掉编译器。

而这里就是一个道理,生成的类被混淆了,而元数据保持不变, 于是编译器找到的合法定义变得不存在了,就抛异常。

这也是一开始 Alex 没有成功复现这个 bug 的原因,因为在他的电脑里, gradle 是通过下载 IntelliJ Community 的最新版来解决的依赖问题, 而这个就没有被混淆,所以编译正常通过。

错误信息:

e: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Couldn't inline method call 'parentOfType' into

public open val startPoint: com.intellij.psi.PsiElement defined in org.ice1000.julia.lang.psi.impl.JuliaDeclaration

open val startPoint: PsiElement get() = parentOfType() ?: parent

Cause: Not generated

Cause: Couldn't obtain compiled function body for public inline fun com.intellij.psi.PsiElement.parentOfType(): T? defined in com.intellij.psi.util[DeserializedSimpleFunctionDescriptor@676ab4f3]

File being compiled and position: (29,42) in /home/ice1000/git-repos/julia-intellij/src/org/ice1000/julia/lang/psi/impl/julia-psi-mixin.kt

The root cause was thrown at: InlineCodegen.kt:529

希望这些 bug 都早日得到修复。

最后再唾弃一次:

第二次用 Emacs 写这么多中文,感觉好不习惯【x

kotlin编译失败_聊两个 Kotlin 编译器的 bug相关推荐

  1. kotlin编译失败_关于应用Kotlin后的编译速度问题

    2017年 Kotlin 被 Google 钦定为 Android 开发官方语言之一后,便如火如荼.很多团队开始应用了Kotlin,可谓是收益良多,可是也有一些问题,一个比较明显的就是Kotlin应用 ...

  2. kotlin编译失败_Kotlin使用GraalVM开发原生命令行应用

    背景 之前用kotlin开发过一款根据建表DDL语句生成plantuml ER图的应用.被问如何使用,答曰"给你一个jar包,然后执行java -jar ddl2plantuml.jar . ...

  3. kotlin 垂直滚动_在Android的Kotlin中检测点击或滚动

    kotlin 垂直滚动 Build a responsive UI that shows or hides the toolbar in response to user clicks whilst ...

  4. kotlin 构建对象_使用Kotlin,TypeScript和Okta构建安全的Notes应用程序

    kotlin 构建对象 I love my job as a developer advocate at Okta. I get to learn a lot, write interesting b ...

  5. 【错误记录】记录 Android 命令行执行 Java 程序中出现的错误 ( dx 打包 PC 可执行文件报错 | dalvik 命令执行 kotlin 编译的 dex 文件报错 )

    文章目录 前言 一.Android 命令行与 PC 可执行 JAR 文件不兼容 二.Android 命令行使用 dalvik 命令不能直接执行 Kotlin 编译的 dex 文件 前言 尝试在 And ...

  6. Kotlin编译与Intrinsics检查

    在很早的时候,小黑屋就介绍过如何研究Kotlin,其中涉及到了查看字节码和反编译成Java代码的方式,相信很多人研究过的人,都会或多或少遇到过Intrinsics.checkParameterIsNo ...

  7. kotlin 编译时常量_Kotlin程序| 编译时常量示例

    kotlin 编译时常量 编译时常数 (Compile-time Constant) If the value of a read-only (immutable) property is known ...

  8. Kotlin 编译出错 java.lang.ClassNotFoundException: com.sun.tools.javac.util.context

    最近遇到一次命令行执行 gradlew checkcode时报错的问题,某个组件的Kotlin编译出错了,抛出的异常为 compileReleaseKotlin fails with java.lan ...

  9. 【刚好遇见Kotlin】使用Kotlin开发——搭建Kotlin 编译环境

    使用Kotlin开发--搭建Kotlin 编译环境 这篇博文主要帮助大家搭建Kotlin的开发环境. Hello world 当我们准备kotlin的第一个程序HelloWorld时,我们首先要去下载 ...

最新文章

  1. 算法工程师面试必考项:二叉树
  2. 算法必知 --- LRU缓存淘汰算法
  3. 窗体 局部变量转换为全局_Unity 热更新解决方案 学习笔记(12)Lua 全局变量和局部变量...
  4. 异步socket的线程分配(C#)
  5. 关于安徽赛区推广校赛的实施办法
  6. Java调用Matlab
  7. 第5章 批量主机扫描 nmap、ncat
  8. MVC学习笔记2 认识项目的目录结构与核心的DLL
  9. react中实现异步请求的方法一,react-thunk
  10. oracle 获取一周七天,Oracle中求出本礼拜第一天和第七天的日期
  11. 双十一图书大数据:金庸第1,Python第2,学霸们都买了这些书
  12. 看完这篇再不会 View 的动画框架,我跪搓衣板
  13. thinkphp5--多文件入口设置
  14. 应用多开小工具(二次编译)
  15. 最新400多款微信公众号小游戏源码集合 带HTML5自适应首页
  16. 7-28 猴子选大王 (20分)
  17. 史上最详细的WinHex数据恢复大师(六大章节)视频教程
  18. 随笔(一)—2018-1-23-ANU暑期学校-无题
  19. 基于TCP/UDP的NIO服务端/客户端代码实现damo(java)
  20. 安防摄像头无法接入国标GB28181视频平台EasyGBS问题排查与解决方案

热门文章

  1. C语言变量未赋初值时,输出为乱七八糟解释
  2. 部署java项目_企业最看重什么样的Java人才?
  3. 白盒测试 | 用例设计方法之判定覆盖
  4. 迭代器协议、斐波那契数列
  5. Page9:结构分解以及系统内部稳定和BIBO稳定概念及其性质[Linear System Theory]
  6. Docker-容器数据卷
  7. dubbo实现原理之SPI简介
  8. 如何使用django显示一张图片
  9. shell脚本中的条件测试if中的-z到-d的意思
  10. 浅谈android4.0开发之GridLayout布局