Kotlin 1.3.40正式釋出

kotliner發表於2019-06-21

我們很高興地宣佈Kotlin 1.3.40正式版在今天釋出! 除了常規的質量及工具改進外,這個版本更應該去關注下面這幾點:

  • 為Kotlin/JS提供NPM,Yarn和Webpack的Gradle支援
  • 改進了多平臺專案的測試執行器
  • 新的型別推斷
  • Kotlin/Native效能和互操作性的改進

同時,新的函式以實驗的形式加入到了標準庫中

你可以在更新日誌中檢視完整的列表。我們一如既往地感謝這些貢獻者

下面將為你展示這次的更新內容。

標準庫中的實驗函式

我們往標準庫裡引入了幾個實驗性質的函式。都是用於將位元組或字元陣列編/解碼為UTF-8編碼字串的常用函式,包括:

  • ByteArray.decodeToStringString.encodeToByteArray
  • CharArray.concatToStringString.toCharArray

另一個實驗性函式capitalize被新增到JVM上,它以Locale物件作為引數。

它們都不是預設可用的,可以通過註解@UseExperimental(ExperimentalStdlibApi::class)或在編譯器中指定配置項-Xuse-experimental=kotlin.ExperimentalStdlibApi來使用新增的實驗性函式。

img

這個版本中引入的 ExperimentalStdlibApi註解,用以註明那些實驗性質的API。這些API的行為會根據使用者的反饋進行調整,因此並不承諾其相容性。你可以在該 文件中獲取有關實驗性註解的更多資訊。

在JVM上通過反射訪問reified型別

該正式版本新增的另一個實驗性函式是typeOf。如你所見,其能為指定的型別構造一個KType例項:

在需要獲取泛型的型別資訊時,就能體會到好處了。當你對一個已確定型別的泛型T呼叫typeOf()typeOf會返回該泛型的實際型別:

目前來說,typeOf只能用於Kotlin/JVM平臺上,但在未來的版本中,會有類似的函式登陸其他平臺:Kotlin/JS和Kotlin/Native。

對於trimIndent和trimMargin的優化

為了更好的程式碼排版,通常橫跨多行的字串會伴隨著trimIndenttrimMargin方法的呼叫。從該正式版開始,編譯器將會優化trimIndenttrimMargin的呼叫。這並非只是依賴庫函式,而是編譯器在位元組碼中直接生成經過修剪的字串:

目標平臺:執行kotlin v. 1.3.40的JVM

請注意該優化只會針對字串常量表示式,並不適用於字串模版(例如"$x")。

minBymaxBy函式也得到優化,當其呼叫者集合只包含一個元素時,不再呼叫指定的selector函式。如果你依賴於selector函式帶來的副作用,請留意該優化的影響。

在IntelliJ IDEA上使用第三方註解

如果你用到了Java的第三方空檢查註解,IDE現在會對Kotlin中帶該註解Java方法的錯誤呼叫進行警告了。

想象一下你的Java方法標記了第三方的註解。IDEA可以正常顯示該註解,但它實際並不存在於程式碼之中。

annotatedJavaMethod

該註解會被宣告在獨立的annotations.xml檔案中:

從該版本開始,Kotlin中Java方法的錯誤呼叫會被標記為warning:

nullabilityWarning

注意這只是純粹的IDE功能,Kotlin編譯器會忽略警告去編譯相關的程式碼。nullableString(可空的字串)仍然會被編譯器推斷為平臺相關型別String!(不可空的字串),只是IDE會有額外的warning提醒。

新的型別推斷演算法

我們一直致力於完善型別推斷演算法,修復了不同的邊界問題以滿足各種各樣的場合: 完整的問題修復列表讓人激動萬分。在Kotlin的未來版本,新演算法將會取代舊演算法成為預設演算法。

我們非常關心替換新演算法的向後相容性。因此我們在當前版本中對IDE預設開啟了該演算法,以便收集實際使用中的反饋。 請注意可能出現程式碼在IDE中沒有異常但卻無法通過編譯器的情況,這是因為修正了複雜的邊界bug導致的。如果你看到如程式碼在IDE被標紅但卻能通過編譯或反之亦然的不一致情況,請向我們提交issue。如果該模式導致你的專案無法正常執行,在Preferences裡的Kotlin Compiler頁下取消勾選Enable new type inference algorithm for IDE analysis即可(Android Studio下該選項位於其他位置:Preferences | Kotlin Compiler)。

我們期待你的反饋!

多平臺專案 (MPP)

Kotlin/Native和Kotlin/JS的測試執行器現在實現了Gradle Test執行器的所有API,其執行方式近似於Kotlin/JVM測試執行器。控制檯會列印帶導航的原始碼錯誤報告。同時Gradle也會生成測試報告。通過標準的Gradle引數支援傳遞測試過濾引數,例如: --tests some.test.ClassName

可以通過Gradle生成一份完整的測試執行報告,包含所有目標平臺上的資訊,這些平臺包括:Kotlin/Native,Kotlin/JS和Kotlin/JVM。

kotlin-1.3.40-test-runner-report

Kotlin/JS

Kotlin/JS的增量編譯效能得到了提升。特別在某些大型專案 和/或 模組有大量依賴的情況下,其編譯較之前縮短了多達30%的時間。

該版本中Kotlin/JS最顯著的變化來自工具方面。我們很高興地介紹Gradle上已經更新的Kotlin/JS外掛,我們將其重新命名為org.jetbrains.kotlin.js,現在可以在Gradle plugin portal上獲取。只需要在build.gradle中通過plugins {}語法啟用即可:

或者在build.gradle.kts檔案中呼叫kotlin函式:

我們正在努力將kotlin-frontend-plugin外掛的所有功能移植到Kotlin/JS外掛和Kotlin/Multiplatform外掛中。部分功能已經在測試中。我們計劃在這項工作完成後棄用kotlin-frontend-plugin

對NPM和Webpack的實驗支援

今天,我們很高興與你分享一些實驗性功能,以幫助簡化採用Node.js,NPM,Yarn或Webpack的JavaScript專案開發。我們在Kotlin/JS和Multiplatform Gradle外掛中新增了一些輔助任務,以簡化整合。該外掛將為你的專案生成一個臨時的package.json,它將下載並使用Yarn自動管理NPM依賴項和node_modules。 Webpack將在後臺啟動,以加入所有依賴項,並根據你的程式碼建立瀏覽器友好的指令碼。

該外掛會將Gradle專案中宣告的所有Kotlin/JS依賴項附加到自動維護的node_modules資料夾中。現在,JS SourceSet的dependencies {}塊中新新增的npm函式可以在Gradle指令碼新增NPM依賴項:

Yarn Workspaces用於多平臺專案的Gradle構建。每個子專案會建立一個工作目錄,並在根專案的目錄下進行配置。這允許Yarn通過提取對根node_modules的公共依賴來減少子專案中的node_modules副本。

Node.js和瀏覽器模式

JavaScript專案的執行和測試始終取決於環境。我們已經新增了對Node.js和瀏覽器執行環境的支援。你可以使用nodejs {}browser {}函式為Kotlin/JS和Multiplatform Gradle外掛配置Kotlin。

該Gradle外掛會下載並安裝(當然是通過Yarn) 所有必要的NPM依賴,包括用於Karma測試的無UI瀏覽器,去測試你的程式碼。Mocha測試框架將用於在Node.js環境中執行測試。測試執行器與Gradle整合,並實現與Kotlin/JVM測試類似的功能。例如,測試失敗將顯示在控制檯中,會生成測試報告,Gradle命令列能接收測試過濾器。

有時很難追溯並改善程式碼中的錯誤,因此我們在Gradle外掛中為所有的這些任務新增了JavaScript原始碼對映的支援。

kotlin-1.3.40-tests

你可以輕鬆地配置適合在不同瀏覽器中執行的瀏覽器測試。外掛為Karma測試執行器配置好NPM依賴項,並使其運作起來。Gradle中可能會用到以下的DSL:

會在Gradle外掛中新增了一個run任務,用於在Node.js或Browser環境中執行Kotlin/JS程式碼。

注意,新的Kotlin/JS構建功能是實驗性的,目前僅支援macOS和Linux。 Windows的支援將在稍後新增。

Kotlin/Native

在記憶體管理器中包含了一些改進以提高Kotlin/Native應用程式的效能。我們從基準測試中觀察到效能提升了將近兩倍。

為Linux新增了ARM x64(ARM / AArch64)的支援。 CoreLocation框架是預載入並已包含在macOS上。我們改進了Kotlin/Native編譯器對日誌記錄和錯誤訊息的顯示。

FreezableAtomicReference是Kotlin/Native中包含的新實驗性,用於幫助處理多執行緒和併發。它的作用類似於“AtomicReference”類,而不論它是否被凍結。

kotlin-platform-native已被棄用。請遷移到kotlin-multiplatform Gradle外掛。檢視文件以瞭解遷移指南和更多資訊。

我們還刪除了kotlin-multiplatform Gradle外掛中之前被棄用的用以配置Kotlin/Native的API。從1.3.40開始,不再支援compilations.outputKinds,請使用binaries API。

互操作性

該版本已包含對Kotlin/Native生成的框架的實驗性泛型支援。它將通用引數的型別資訊新增到Objective-C/Swift生成的Kotlin/Native泛型類中。該功能預設是關閉的,要啟用它,將-Xobjc-generics作為命令列引數傳遞給編譯器,或將這堆東西新增到Gradle專案配置中:

In addition to this, the Kotlin type Unit will turn into Void in the produced frameworks. Kotlin/Native method names will not clash with Objective-C declarations, because we’ve improved the way method names are generated. Variadic Objective-C functions are now supported in the interop.

現在和C的互操作中已支援可空的字串了。我們使用自定義的異常鉤子修復了該問題;現在,你可以在程式碼中使用setUnhandledExceptionHook {}函式來捕獲未被處理的Kotlin異常。

Kotlin/Native中的測試

我們為Kotlin/Native測試新增了一個單獨的二進位制型別。現在更容易指引build去建立Native的測試可執行檔案:

Kotlin/Native測試執行器現在已與Gradle整合,並實現了類似於Kotlin/JVM上測試執行器的功能,例如,控制檯會顯示測試失敗,並生成測試報告,同時你可以將測試過濾器傳遞給Gradle命令列。

現在,使用binaries.getTest函式通過Gradle API獲取測試二進位制檔案更加容易。而查詢測試可執行檔案的舊方法,例如`binaries.getExecutable(“test”,“DEBUG”)將不再有用,請使用新的API:binaries.getTest(“DEBUG”)

如何升級

像往常一樣,你可以在play.kotl.in線上體驗Kotlin

  • 對於Maven, Gradle, 和npm:配置編譯器及標準庫的版本為1.3.40 請參考文件.
  • 對於IntelliJ IDEAAndroid Studio:要將Kotlin升級到1.3.40。開啟Tools | Kotlin | Configure Kotlin Plugin Updates並點選“Check for updates now” 按鈕。
  • 對於Eclipse:在Marketplace安裝Kotlin外掛。
  • 對於命令列編譯器Github release page可以下載獲取。

如果你在新版本遇到任何問題,歡迎在Slack上的論壇上尋求幫助(這裡獲取邀請),或在問題跟蹤器提交問題。

請盡情享受Kotlin!

其餘貢獻者

我們特別感謝Kevin Galligan他的貢獻adding support of generics in Kotlin/Native produced frameworks.

我們非常感謝提交了PR並被合併到該正式版中的其他貢獻者:

  • Dimach
  • Toshiaki Kameyama
  • pyos
  • Mark Punzalan
  • Ivan Gavrilovic
  • Ting-Yuan Huang
  • Steven Schäfer
  • Burak Eregar
  • Dereck Bridie
  • Jake Wharton
  • Mads Ager
  • Kirill Knize
  • gcx11
  • Austaon
  • Ryan
  • Jan Gerling
  • Harry Billinis
  • Georgios Andrianakis
  • George Gastaldi
  • Eduard Wolf
  • Caleb Brinkman
  • Wil
  • Benjamin Orsini
  • Yanis Batura
  • ilgonmic
  • Kenji Tomita
  • Matthew Runo
  • Kirill Rakhman
  • Kevin Galligan
  • Kevin Peek
  • Kerooker
  • Juan Chen
  • Nikolay Kasyanov
  • Jorge Antonio Díaz-Benito Soriano
  • Pavel Nikitin
  • Peter Xu
  • Rene Groeschke
  • Jiaxiang Chen

相關文章