{"id":99827,"date":"2020-12-02T14:29:38","date_gmt":"2020-12-02T13:29:38","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=99827"},"modified":"2020-12-02T14:36:16","modified_gmt":"2020-12-02T13:36:16","slug":"lancamento-do-kotlin-1-4-20","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/pt-br\/kotlin\/2020\/12\/lancamento-do-kotlin-1-4-20\/","title":{"rendered":"Lan\u00e7amento do Kotlin 1.4.20"},"content":{"rendered":"<p>O Kotlin 1.4.20 chegou com novos recursos experimentais para voc\u00ea avaliar. Manter-se aberta para o feedback da comunidade \u00e9 um dos princ\u00edpios b\u00e1sicos da equipe do Kotlin, e precisamos de sua opini\u00e3o sobre os prot\u00f3tipos dos novos recursos. <a href=\"#how-to-update\">Experimente-os<\/a> e compartilhe seu feedback no <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (receba um convite <a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up?_ga=2.134077326.1218289669.1605167163-154294388.1603171954\" target=\"_blank\" rel=\"noopener\">aqui<\/a> ou no <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/11\/banners_twitter.png\" alt=\"Kotlin 1.4.20\" \/><\/p>\n<p>Aqui est\u00e3o alguns dos principais destaques:<\/p>\n<ul>\n<li>Suporte para novos recursos de JVM, como concatena\u00e7\u00e3o de strings via invokedynamic.<\/li>\n<li>Melhor desempenho e tratamento de exce\u00e7\u00f5es para projetos KMM.<\/li>\n<li>Extens\u00f5es para JDK Path: <code>Path(\u201cdir\u201d) \/ \u201cfile.txt\u201d<\/code>.<\/li>\n<\/ul>\n<p>Tamb\u00e9m estamos enviando v\u00e1rias corre\u00e7\u00f5es e melhorias de recursos existentes, incluindo aqueles adicionados na vers\u00e3o 1.4.0. Portanto, se voc\u00ea encontrou problemas com qualquer um desses recursos, agora \u00e9 um bom momento para test\u00e1-los novamente.<\/p>\n<p>Continue lendo para saber mais sobre os recursos do Kotlin 1.4.20. Voc\u00ea tamb\u00e9m pode encontrar uma breve vis\u00e3o geral do lan\u00e7amento na p\u00e1gina <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/whatsnew1420.html\" target=\"_blank\" rel=\"noopener\">What\u2019s new in Kotlin 1.4.20<\/a>Novidades no Kotlin 1.4.20<\/a> na documenta\u00e7\u00e3o do Kotlin. A lista completa de altera\u00e7\u00f5es est\u00e1 dispon\u00edvel no <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/blob\/1.4.20\/ChangeLog.md\" target=\"_blank\" rel=\"noopener\">log de altera\u00e7\u00f5es<\/a>.<\/p>\n<p>Como sempre, gostar\u00edamos de agradecer aos nossos <a href=\"#external-contributors\">colaboradores externos<\/a> que nos ajudaram com esse lan\u00e7amento.<\/p>\n<p>Agora vamos mergulhar nos detalhes!<\/p>\n<h2>Kotlin\/JVM<\/h2>\n<p><a name=\"kotlin-jvm\"><\/a><\/p>\n<p>Na JVM, adicionamos o novo destino JVM 15 e nos concentramos principalmente em melhorar a funcionalidade e o desempenho existentes, bem como em corrigir bugs.<\/p>\n<h3>Concatena\u00e7\u00e3o de strings invokedynamic<\/h3>\n<p>Desde o Java 9, a concatena\u00e7\u00e3o de strings na JVM \u00e9 feita por meio da <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/vm\/multiple-language-support.html#invokedynamic\" target=\"_blank\" rel=\"noopener\">invoca\u00e7\u00e3o de m\u00e9todos din\u00e2micos<\/a> (a instru\u00e7\u00e3o <code>invokedynamic<\/code> no bytecode). Isso funciona mais r\u00e1pido e consome menos mem\u00f3ria do que a implementa\u00e7\u00e3o anterior, al\u00e9m de deixar espa\u00e7o para otimiza\u00e7\u00f5es futuras sem exigir altera\u00e7\u00f5es de bytecode.<\/p>\n<p>Come\u00e7amos a implementar esse mecanismo no Kotlin para obter melhor desempenho e agora ele pode compilar concatena\u00e7\u00f5es de strings em invoca\u00e7\u00f5es din\u00e2micas em destinos JVM 9+.<\/p>\n<p>Atualmente, esse recurso \u00e9 experimental e abrange os seguintes casos:<\/p>\n<ul>\n<li><code>String.plus<\/code> no formatos de operador (<code>a + b<\/code>), expl\u00edcito (<code>a.plus(b)<\/code>) e refer\u00eancia (<code>(a::plus)(b)<\/code>).<\/li>\n<li><code>toString<\/code> em classes inline e de dados.<\/li>\n<li>Modelos de string, exceto para aqueles com um \u00fanico argumento n\u00e3o constante (consulte <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-42457\" target=\"_blank\" rel=\"noopener\">KT-42457<\/a>).<\/li>\n<\/ul>\n<p>Para ativar a concatena\u00e7\u00e3o de strings <code>invokedynamic<\/code>, adicione a op\u00e7\u00e3o de compilador <code>-Xstring-concat<\/code> com um dos seguintes valores:<\/p>\n<ul>\n<li><code>indy-with-constants<\/code> para realizar a concatena\u00e7\u00e3o de <code>invokedynamic<\/code> em strings com <a href=\"https:\/\/docs.oracle.com\/javase\/9\/docs\/api\/java\/lang\/invoke\/StringConcatFactory.html#makeConcatWithConstants-java.lang.invoke.MethodHandles.Lookup-java.lang.String-java.lang.invoke.MethodType-java.lang.String-java.lang.Object...-\" target=\"_blank\" rel=\"noopener\">StringConcatFactory.makeConcatWithConstants()<\/a> (planejado para ser o padr\u00e3o para destinos JVM 9+ na vers\u00e3o 1.5).<\/li>\n<li><code>indy<\/code> para realizar a concatena\u00e7\u00e3o <code>invokedynamic<\/code> em strings com <a href=\"https:\/\/docs.oracle.com\/javase\/9\/docs\/api\/java\/lang\/invoke\/StringConcatFactory.html#makeConcat-java.lang.invoke.MethodHandles.Lookup-java.lang.String-java.lang.invoke.MethodType-\" target=\"_blank\" rel=\"noopener\">StringConcatFactory.makeConcat()<\/a>.<\/li>\n<li><code>inline<\/code> para retornar \u00e0 concatena\u00e7\u00e3o cl\u00e1ssica via <code>StringBuilder.append()<\/code>.<\/li>\n<\/ul>\n<h2>Kotlin\/JS<\/h2>\n<p><a name=\"kotlin-js\"><\/a><\/p>\n<p>O Kotlin\/JS continua evoluindo em um ritmo r\u00e1pido, e este lan\u00e7amento traz uma variedade de melhorias, incluindo novos modelos para seu assistente de projeto, DSL aprimorado para melhor controle sobre a configura\u00e7\u00e3o do projeto e muito mais. O novo compilador IR tamb\u00e9m recebeu uma maneira totalmente nova de compilar projetos com erros.<\/p>\n<h3>Altera\u00e7\u00f5es no Gradle DSL<\/h3>\n<p>O Kotlin\/JS Gradle DSL recebeu v\u00e1rias atualiza\u00e7\u00f5es que simplificam a configura\u00e7\u00e3o e a personaliza\u00e7\u00e3o de projetos, incluindo ajustes de configura\u00e7\u00e3o do webpack, modifica\u00e7\u00f5es no arquivo package.json gerado automaticamente e controle aprimorado sobre depend\u00eancias transitivas.<\/p>\n<h4>Ponto \u00fanico para configura\u00e7\u00e3o do webpack<\/h4>\n<p>O Kotlin 1.4.20 apresenta um novo bloco de configura\u00e7\u00e3o para o destino de <code>browser<\/code>, chamado <code>commonWebpackConfig<\/code>. Dentro dele, voc\u00ea pode ajustar as configura\u00e7\u00f5es comuns de um \u00fanico ponto, em vez de duplicar as configura\u00e7\u00f5es para <code>webpackTask<\/code>, <code>runTask<\/code> e <code>testTask<\/code>.<\/p>\n<p>Para habilitar o suporte CSS por padr\u00e3o para todas as tr\u00eas tarefas, voc\u00ea s\u00f3 precisa incluir o seguinte snippet no <code>build.gradle(.kts)<\/code> do seu projeto:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> kotlin { browser { commonWebpackConfig { cssSupport.enabled = true } binaries.executable() } } <\/pre>\n<h4>Personaliza\u00e7\u00e3o de package.json no Gradle<\/h4>\n<p>O arquivo <code>package.json<\/code> geralmente define como um projeto JavaScript deve se comportar, identificando scripts que est\u00e3o dispon\u00edveis para execu\u00e7\u00e3o, depend\u00eancias e muito mais. Ele \u00e9 gerado automaticamente para projetos Kotlin\/JS durante o tempo de compila\u00e7\u00e3o. Como o conte\u00fado de <code>package.json<\/code> varia de caso para caso, recebemos v\u00e1rias solicita\u00e7\u00f5es para uma maneira f\u00e1cil de personalizar esse arquivo.<\/p>\n<p>A partir do Kotlin 1.4.20, voc\u00ea pode adicionar entradas ao arquivo de projeto <code>package.json<\/code> a partir do script de compila\u00e7\u00e3o do Gradle. Para adicionar campos personalizados ao seu <code>package.json<\/code>, use a fun\u00e7\u00e3o <code>customField<\/code> no bloco de compila\u00e7\u00f5es <code>packageJson<\/code>:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> kotlin { js(BOTH) { compilations[&quot;main&quot;].packageJson { customField(&quot;hello&quot;, mapOf(&quot;one&quot; to 1, &quot;two&quot; to 2)) } } } <\/pre>\n<p>Quando voc\u00ea compilar o projeto, isso adicionar\u00e1 o seguinte bloco ao arquivo de configura\u00e7\u00e3o <code>build\/js\/packages\/projectName\/package.json<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">&quot;hello&quot;: {\n  &quot;one&quot;: 1,\n  &quot;two&quot;: 2\n}<\/pre>\n<p>Seja para adicionar um campo de scripts \u00e0 configura\u00e7\u00e3o, facilitando a execu\u00e7\u00e3o do seu projeto na linha de comando, ou para incluir informa\u00e7\u00f5es de outras ferramentas p\u00f3s-processamento, esperamos que voc\u00ea considere \u00fatil essa nova maneira de especificar campos personalizados.<\/p>\n<h4>Resolu\u00e7\u00f5es seletivas de depend\u00eancia yarn (experimental)<\/h4>\n<p>Ao incluir depend\u00eancias npm, h\u00e1 ocasi\u00f5es em que voc\u00ea deseja ter controle refinado sobre suas depend\u00eancias (<em>depend\u00eancias transitivas<\/em>). Existem v\u00e1rios motivos para isso. Voc\u00ea pode querer aplicar um upgrade importante a uma das depend\u00eancias de uma biblioteca que est\u00e1 usando. Ou voc\u00ea pode querer reverter uma atualiza\u00e7\u00e3o de uma depend\u00eancia transitiva que atualmente interrompe sua aplica\u00e7\u00e3o. As <a href=\"https:\/\/classic.yarnpkg.com\/en\/docs\/selective-version-resolutions\/\" target=\"_blank\" rel=\"noopener\">resolu\u00e7\u00f5es seletivas de depend\u00eancias<\/a> do Yarn permitem substituir as depend\u00eancias especificadas pelo autor original, para que voc\u00ea possa continuar desenvolvendo.<\/p>\n<p>Com o Kotlin 1.4.20, oferecemos uma maneira preliminar (experimental) de configurar esse recurso a partir do script de compila\u00e7\u00e3o Gradle de um projeto. Embora ainda estejamos trabalhando em uma perfeita integra\u00e7\u00e3o da API com o restante das op\u00e7\u00f5es do Kotlin\/JS, voc\u00ea j\u00e1 pode usar o recurso por meio do <code>YarnRootExtension<\/code> dentro do <code>YarnPlugin<\/code>. Para afetar a vers\u00e3o resolvida de um pacote para o seu projeto, use a fun\u00e7\u00e3o <code>resolution<\/code>. Em seus argumentos, especifique o seletor de nome do pacote (conforme especificado pelo <a href=\"https:\/\/classic.yarnpkg.com\/en\/docs\/selective-version-resolutions\/\" target=\"_blank\" rel=\"noopener\">Yarn<\/a>) e a vers\u00e3o desejada.<\/p>\n<p>Um exemplo de configura\u00e7\u00e3o para resolu\u00e7\u00e3o seletiva de depend\u00eancias no seu arquivo <code>build.gradle.kts<\/code> seria o seguinte:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> rootProject.plugins.withType(YarnPlugin::class.java) { rootProject.the&lt;YarnRootExtension&gt;().apply { resolution(&quot;react&quot;, &quot;16.0.0&quot;) resolution(&quot;processor\/decamelize&quot;, &quot;3.0.0&quot;) } } <\/pre>\n<p>Aqui, <em>todas<\/em> as suas depend\u00eancias npm que exigem <code>react<\/code> receber\u00e3o a vers\u00e3o <code>16.0.0<\/code>, e <code>processor<\/code> receber\u00e1 sua depend\u00eancia <code>decamelize<\/code> como a vers\u00e3o <code>3.0.0<\/code>. Al\u00e9m disso, voc\u00ea tamb\u00e9m pode transmitir invoca\u00e7\u00f5es <code>include<\/code> e <code>exclude<\/code> ao bloco <code>resolution<\/code>, o que permite especificar restri\u00e7\u00f5es sobre as vers\u00f5es aceit\u00e1veis.<\/p>\n<h4>Desabilitando espa\u00e7os de trabalho granulares (experimental)<\/h4>\n<p>Para acelerar os tempos de compila\u00e7\u00e3o, o plug-in Kotlin\/JS Gradle instala apenas as depend\u00eancias necess\u00e1rias para uma tarefa espec\u00edfica do Gradle. Por exemplo, o pacote <code>webpack-dev-server<\/code> \u00e9 instalado apenas quando voc\u00ea executa uma das tarefas <code>*Run<\/code> e n\u00e3o quando voc\u00ea executa a tarefa <code>assemble<\/code>. Embora isso signifique que downloads desnecess\u00e1rios s\u00e3o evitados, ele pode criar problemas ao executar v\u00e1rios processos Gradle em paralelo. Quando os requisitos de depend\u00eancias entram em conflito, as duas instala\u00e7\u00f5es de pacotes npm podem causar erros.<\/p>\n<p>Para resolver esse problema, o Kotlin 1.4.20 inclui uma nova op\u00e7\u00e3o (experimental) para desabilitar esses chamados <em>espa\u00e7os de trabalho granulares<\/em>. Como o suporte experimental para resolu\u00e7\u00f5es de depend\u00eancia seletiva, esse recurso tamb\u00e9m est\u00e1 acess\u00edvel por meio do <code>YarnRootExtension<\/code>, mas provavelmente ser\u00e1 integrado mais estreitamente com o restante do Kotlin\/JS Gradle DSL. Para us\u00e1-lo, adicione o seguinte snippet ao seu arquivo <code>build.gradle.kts<\/code>:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> rootProject.plugins.withType(YarnPlugin::class.java) { rootProject.the&lt;YarnRootExtension&gt;().disableGranularWorkspaces() } <\/pre>\n<p>Com essa configura\u00e7\u00e3o, o plug-in Kotlin\/JS Gradle instalar\u00e1 todas as depend\u00eancias npm que podem ser usadas pelo seu projeto, incluindo aquelas usadas por tarefas que n\u00e3o est\u00e3o sendo executadas atualmente. Isso significa que a primeira compila\u00e7\u00e3o Gradle pode demorar um pouco mais, mas as depend\u00eancias baixadas estar\u00e3o atualizadas para todas as tarefas que voc\u00ea executar. Dessa forma, voc\u00ea pode evitar conflitos ao executar v\u00e1rios processos Gradle em paralelo.<\/p>\n<h3>Novos modelos de assistente<\/h3>\n<p>Para fornecer maneiras mais convenientes de personalizar seu projeto durante a cria\u00e7\u00e3o, o assistente de projeto para Kotlin acompanha novos modelos ajust\u00e1veis para aplica\u00e7\u00f5es Kotlin\/JS. Existem modelos para os ambientes de tempo de execu\u00e7\u00e3o do navegador e do Node.js. Eles servem como um bom ponto de partida para o seu projeto e possibilitam o ajuste fino da configura\u00e7\u00e3o inicial. Isso inclui configura\u00e7\u00f5es como habilitar o novo compilador IR ou configurar o suporte para bibliotecas adicionais.<\/p>\n<p>Com o Kotlin 1.4.20, existem tr\u00eas modelos dispon\u00edveis:<\/p>\n<ul>\n<li><strong>Browser Application<\/strong>: permite que voc\u00ea configure um projeto Kotlin\/JS Gradle b\u00e1sico que \u00e9 executado no navegador.<\/li>\n<li><strong>React Application<\/strong>: cont\u00e9m tudo o que voc\u00ea precisa para come\u00e7ar a construir uma aplica\u00e7\u00e3o React usando os <a href=\"https:\/\/github.com\/JetBrains\/kotlin-wrappers\" target=\"_blank\" rel=\"noopener\">kotlin-wrappers<\/a> apropriados. Ele fornece op\u00e7\u00f5es para permitir integra\u00e7\u00f5es para folhas de estilo, componentes de navega\u00e7\u00e3o e cont\u00eaineres de estado.<\/li>\n<li><strong>Aplica\u00e7\u00e3o Node.js<\/strong>: pr\u00e9-configura seu projeto para ser executado em um tempo de execu\u00e7\u00e3o Node.js. Ele vem com a op\u00e7\u00e3o de incluir diretamente o pacote experimental <a href=\"https:\/\/github.com\/Kotlin\/kotlinx-nodejs\" target=\"_blank\" rel=\"noopener\">kotlinx-nodejs<\/a>, que apresentamos em um <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-rc-released\/#kotlin-js-node\">post anterior<\/a>.<\/li>\n<\/ul>\n<h3>Ignorar erros de compila\u00e7\u00e3o (experimental)<\/h3>\n<p>Com o Kotlin 1.4.20, tamb\u00e9m estamos entusiasmados em apresentar um novo recurso dispon\u00edvel no <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/js-ir-compiler.html\" target=\"_blank\" rel=\"noopener\">compilador Kotlin\/JS IR<\/a> &#8211; \u2013 <em>ignorar erros de compila\u00e7\u00e3o<\/em>. Esse recurso permite que voc\u00ea experimente sua aplica\u00e7\u00e3o mesmo quando ela est\u00e1 em um estado em que normalmente n\u00e3o compilaria. Por exemplo, quando voc\u00ea est\u00e1 fazendo uma refatora\u00e7\u00e3o complexa ou trabalhando em uma parte do sistema que n\u00e3o est\u00e1 totalmente relacionada a um erro de compila\u00e7\u00e3o. Com esse novo modo de compilador, o compilador ignora qualquer c\u00f3digo incorreto e o substitui por exce\u00e7\u00f5es de tempo de execu\u00e7\u00e3o em vez de se recusar a compilar.<\/p>\n<p>O Kotlin 1.4.20 vem com duas pol\u00edticas de toler\u00e2ncia para ignorar erros de compila\u00e7\u00e3o no seu c\u00f3digo:<\/p>\n<ul>\n<li>No modo <code>SEMANTIC<\/code>, o compilador aceitar\u00e1 um c\u00f3digo sintaticamente correto, mas que n\u00e3o faz sentido semanticamente. Um exemplo para isso seria uma instru\u00e7\u00e3o contendo uma incompatibilidade de tipo (como <code>val x: String = 3<\/code>).<\/li>\n<li>No modo <code>SYNTAX<\/code>, o compilador aceitar\u00e1 todo e qualquer c\u00f3digo, mesmo que contenha erros de sintaxe. Independentemente do que voc\u00ea escrever, o compilador ainda tentar\u00e1 gerar um execut\u00e1vel funcional.<\/li>\n<\/ul>\n<p>Como um recurso experimental, ignorar erros de compila\u00e7\u00e3o requer aceita\u00e7\u00e3o por meio de uma op\u00e7\u00e3o do compilador. Ele est\u00e1 dispon\u00edvel apenas para o compilador Kotlin\/JS IR. Para habilit\u00e1-lo, adicione o seguinte snippet ao seu arquivo <code>build.gradle.kts<\/code>:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> kotlin { js(IR) { compilations.all { compileKotlinTask.kotlinOptions.freeCompilerArgs += listOf(&quot;-Xerror-tolerance-policy=SYNTAX&quot;) } } } <\/pre>\n<p>Esperamos que a compila\u00e7\u00e3o com erros ajude a restringir loops de feedback e aumentar a velocidade de itera\u00e7\u00e3o ao trabalhar em projetos Kotlin\/JS. Tamb\u00e9m esperamos receber seu feedback e quaisquer problemas que voc\u00ea encontrar ao experimentar esse recurso. Para isso, use o nosso <a href=\"http:\/\/kotl.in\/issue\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<p>\u00c0 medida que continuamos a refinar a implementa\u00e7\u00e3o desse recurso, tamb\u00e9m ofereceremos uma integra\u00e7\u00e3o mais profunda para ele com o Kotlin\/JS Gradle DSL e suas tarefas posteriormente.<\/p>\n<h2>Kotlin\/Native<\/h2>\n<p><a name=\"kotlin-native\"><\/a><\/p>\n<p>O desempenho continua sendo uma das principais prioridades do Kotlin\/Native na vers\u00e3o 1.4.20. Um recurso importante nessa \u00e1rea \u00e9 um prot\u00f3tipo do novo mecanismo de an\u00e1lise de escape que planejamos aprimorar e melhorar nos pr\u00f3ximos lan\u00e7amentos. E, claro, tamb\u00e9m h\u00e1 melhorias de desempenho secund\u00e1rias, como verifica\u00e7\u00f5es de intervalo mais r\u00e1pidas (<code>in<\/code>).<\/p>\n<p>Outro aspecto das melhorias no desenvolvimento com Kotlin\/Native na vers\u00e3o 1.4.20 s\u00e3o os aprimoramentos e a corre\u00e7\u00e3o de bugs. Corrigimos uma s\u00e9rie de problemas antigos, bem como aqueles encontrados nos novos recursos da vers\u00e3o 1.4, como o <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-share-on-platforms.html#share-code-on-similar-platforms\" target=\"_blank\" rel=\"noopener\">mecanismo de compartilhamento de c\u00f3digo<\/a>. Um conjunto de melhorias corrige inconsist\u00eancias de comportamento entre o Kotlin\/Native e o Kotlin\/JVM em casos extremos, como inicializa\u00e7\u00e3o de propriedades ou a maneira como <code>equals<\/code> e <code>hashCode<\/code> funcionam em refer\u00eancias funcionais.<\/p>\n<p>Finalmente, estendemos os recursos de interoperabilidade Objective-C com <a href=\"#handling-objective-c-exceptions\">uma op\u00e7\u00e3o para agrupar exce\u00e7\u00f5es Objective-C em exce\u00e7\u00f5es Kotlin<\/a>, tornando poss\u00edvel manipul\u00e1-las no c\u00f3digo Kotlin.<\/p>\n<h3>An\u00e1lise de escape<\/h3>\n<p>A <em>An\u00e1lise de escape<\/em> \u00e9 uma t\u00e9cnica que o compilador usa para decidir se um objeto pode ser alocado na pilha ou se deve \u201cescapar\u201d para o heap. A aloca\u00e7\u00e3o na pilha \u00e9 muito mais r\u00e1pida e n\u00e3o requer coleta de lixo no futuro.<\/p>\n<p>Embora o Kotlin\/Native j\u00e1 tivesse uma an\u00e1lise de escape local, agora estamos introduzindo uma implementa\u00e7\u00e3o de prot\u00f3tipo de uma nova an\u00e1lise de escape global mais eficiente. Ela \u00e9 executada em uma fase de compila\u00e7\u00e3o separada para as compila\u00e7\u00f5es de vers\u00e3o (com a op\u00e7\u00e3o de compilador <code>-opt<\/code>).<\/p>\n<p>Esse prot\u00f3tipo j\u00e1 rendeu alguns resultados promissores, como um aumento m\u00e9dio de desempenho de 10% em nossos referenciais. Estamos pesquisando maneiras de otimizar o algoritmo para que ele encontre mais objetos para aloca\u00e7\u00e3o de pilha e acelere ainda mais o programa.<\/p>\n<p>Enquanto continuamos a trabalhar no prot\u00f3tipo, voc\u00ea pode nos ajudar muito avaliando e compartilhando os resultados que obt\u00e9m nos seus projetos reais.<\/p>\n<p>Se quiser desabilitar a fase de an\u00e1lise de escape, use a op\u00e7\u00e3o de compilador <code>-Xdisable-phases=EscapeAnalysis<\/code>.<\/p>\n<h3>Optar pelo wrapping de exce\u00e7\u00f5es Objective-C<\/h3>\n<p>O objetivo das exce\u00e7\u00f5es no Objective-C \u00e9 bastante diferente daquele no Kotlin. Seu uso \u00e9 normalmente limitado a localizar erros durante o desenvolvimento. Por\u00e9m, tecnicamente, as bibliotecas Objective-C podem lan\u00e7ar exce\u00e7\u00f5es em tempo de execu\u00e7\u00e3o. Anteriormente, n\u00e3o havia a op\u00e7\u00e3o para lidar com essas exce\u00e7\u00f5es no Kotlin\/Native, e encontrar uma <code>NSException<\/code> lan\u00e7ada de uma biblioteca causava o encerramento de todo o programa Kotlin\/Native.<\/p>\n<p>Na vers\u00e3o 1.4.20, adicionamos uma op\u00e7\u00e3o para lidar com essas exce\u00e7\u00f5es em tempo de execu\u00e7\u00e3o, para evitar travamentos do programa. Voc\u00ea pode optar pelo wrapping de <code>NSException<\/code> na <code>ForeignException<\/code> do Kotlin para tratamento posterior no c\u00f3digo Kotlin. Essa <code>ForeignExeption<\/code> cont\u00e9m a refer\u00eancia \u00e0 <code>NSException<\/code> original, que permite obter informa\u00e7\u00f5es sobre a causa raiz.<\/p>\n<p>Para habilitar o wrapping de exce\u00e7\u00f5es Objective-C, especifique a op\u00e7\u00e3o <code>-Xforeign-exception-mode objc-wrap<\/code> na chamada <code>cinterop<\/code> ou adicione a propriedade <code>foreignExceptionMode = objc-wrap<\/code> ao arquivo <code>.def<\/code>. Se voc\u00ea usa a <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/native\/cocoapods.html\" target=\"_blank\" rel=\"noopener\">integra\u00e7\u00e3o com CocoaPods<\/a>, especifique a op\u00e7\u00e3o no bloco de script de compila\u00e7\u00e3o <code>pod {}<\/code> de uma depend\u00eancia como esta:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> pod(&quot;foo&quot;) { extraOpts = listOf(&quot;-Xforeign-exception-mode\u201d, \u201cobjc-wrap&quot;) } <\/pre>\n<p>O comportamento padr\u00e3o permanece inalterado: o programa \u00e9 encerrado quando uma exce\u00e7\u00e3o \u00e9 lan\u00e7ada a partir do c\u00f3digo Objective-C.<\/p>\n<h3>Melhorias no plug-in CocoaPods<\/h3>\n<h4>Melhor execu\u00e7\u00e3o de tarefas<\/h4>\n<p>Neste lan\u00e7amento, melhoramos significativamente o fluxo de execu\u00e7\u00e3o de tarefas. Por exemplo, se voc\u00ea adicionar uma nova depend\u00eancia CocoaPods, as depend\u00eancias existentes n\u00e3o ser\u00e3o reconstru\u00eddas. Adicionar um destino extra tamb\u00e9m n\u00e3o afeta a reconstru\u00e7\u00e3o de depend\u00eancias para destinos existentes.<\/p>\n<h4>DSL estendida<\/h4>\n<p>No lan\u00e7amento 1.4.20, estendemos a DSL para adicionar depend\u00eancias <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/native\/cocoapods.html\" target=\"_blank\" rel=\"noopener\">CocoaPods<\/a> ao seu projeto Kotlin.<\/p>\n<p>Al\u00e9m de Pods e Pods locais do reposit\u00f3rio CocoaPods, voc\u00ea pode adicionar depend\u00eancias pelos seguintes tipos de bibliotecas:<\/p>\n<ul>\n<li>Uma biblioteca de um reposit\u00f3rio de especifica\u00e7\u00f5es personalizadas.<\/li>\n<li>Uma biblioteca remota de um reposit\u00f3rio Git.<\/li>\n<li>Uma biblioteca de um arquivo (tamb\u00e9m dispon\u00edvel por endere\u00e7o HTTP arbitr\u00e1rio).<\/li>\n<li>Uma biblioteca est\u00e1tica.<\/li>\n<li>Uma biblioteca com op\u00e7\u00f5es personalizadas de cinterop.<\/li>\n<\/ul>\n<p>A sintaxe DSL anterior ainda \u00e9 compat\u00edvel.<\/p>\n<p>Vamos examinar algumas mudan\u00e7as de DSL nos exemplos a seguir:<\/p>\n<ul>\n<li>\n<p><strong>Uma depend\u00eancia em uma biblioteca remota de um reposit\u00f3rio Git<\/strong>. Voc\u00ea pode especificar uma tag, submiss\u00e3o ou branch usando palavras-chave correspondentes, por exemplo: <\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> pod(&quot;JSONModel&quot;) { source = git(&quot;https:\/\/github.com\/jsonmodel\/jsonmodel.git&quot;) { branch = &quot;key-mapper-class&quot; } } <\/pre>\n<\/p>\n<p>Voc\u00ea tamb\u00e9m pode combinar essas palavras-chave para obter a vers\u00e3o necess\u00e1ria de um Pod.<\/p>\n<\/li>\n<li>\n<p><strong>Uma depend\u00eancia de uma biblioteca de um reposit\u00f3rio de especifica\u00e7\u00f5es personalizadas<\/strong>. Use o par\u00e2metro especial <code>specRepos<\/code> para ela: <\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> specRepos { url(&quot;https:\/\/github.com\/Kotlin\/kotlin-cocoapods-spec.git&quot;) } pod(&quot;example&quot;) <\/pre>\n<\/p>\n<\/li>\n<\/ul>\n<p>Voc\u00ea pode encontrar mais exemplos na <a href=\"https:\/\/github.com\/Kotlin\/kotlin-with-cocoapods-sample\" target=\"_blank\" rel=\"noopener\">amostra do Kotlin com CocoaPods<\/a>.<\/p>\n<h4>Integra\u00e7\u00e3o atualizada com o Xcode<\/h4>\n<p>Para funcionar corretamente com o Xcode, o Kotlin requer algumas altera\u00e7\u00f5es no Podfile:<\/p>\n<ul>\n<li>\n<p>Se seu Pod Kotlin tiver depend\u00eancias por pods Git, HTTP ou specRepo, voc\u00ea tamb\u00e9m dever\u00e1 especific\u00e1-las no Podfile. Por exemplo, se voc\u00ea adicionar uma depend\u00eancia por <code>AFNetworking<\/code> do reposit\u00f3rio CocoaPods, declare-a tamb\u00e9m no Podfile:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">pod &#039;AFNetworking&#039;<\/pre>\n<\/li>\n<li>\n<p>Ao adicionar uma biblioteca da especifica\u00e7\u00e3o personalizada, voc\u00ea tamb\u00e9m deve especificar a <a href=\"https:\/\/guides.cocoapods.org\/syntax\/podfile.html#source\" target=\"_blank\" rel=\"noopener\">localiza\u00e7\u00e3o<\/a> das especifica\u00e7\u00f5es no in\u00edcio do seu Podfile:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">source &#039;https:\/\/github.com\/Kotlin\/kotlin-cocoapods-spec.git&#039;\n\ntarget &#039;kotlin-cocoapods-xcproj&#039; do\n  \/\/ ... other Pods ...\n  pod &#039;example&#039;\nend<\/pre>\n<\/li>\n<\/ul>\n<p>Agora, os erros de integra\u00e7\u00e3o t\u00eam descri\u00e7\u00f5es detalhadas no IntelliJ IDEA. Portanto, se voc\u00ea tiver qualquer problema com o seu Podfile, receber\u00e1 imediatamente informa\u00e7\u00f5es sobre como corrigi-lo.<\/p>\n<p>D\u00ea uma olhada no branch <code>withXcproject<\/code> da <a href=\"https:\/\/github.com\/Kotlin\/kotlin-with-cocoapods-sample\" target=\"_blank\" rel=\"noopener\">amostra do Kotlin com CocoaPods<\/a>. Ele cont\u00e9m <a href=\"#updated-integration-with-xcode\">um exemplo de integra\u00e7\u00e3o Xcode<\/a> com o projeto Xcode existente denominado <code>kotlin-cocoapods-xcproj<\/code>.<\/p>\n<h3>Suporte para bibliotecas Xcode 12<\/h3>\n<p>Adicionamos suporte para novas bibliotecas fornecidas com o Xcode 12. Sinta-se \u00e0 vontade para us\u00e1-las no seu c\u00f3digo Kotlin!<\/p>\n<h2>Estrutura atualizada de publica\u00e7\u00f5es de bibliotecas multiplataformas<\/h2>\n<p><a name=\"updated-structure-of-multiplatform-library-publications\"><\/a><\/p>\n<p>Antes do Kotlin 1.4.20, <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-publish-lib.html\" target=\"_blank\" rel=\"noopener\">publica\u00e7\u00f5es de bibliotecas multiplataformas<\/a> inclu\u00edam publica\u00e7\u00f5es espec\u00edficas da plataforma e uma publica\u00e7\u00e3o de metadados. No entanto, n\u00e3o havia necessidade de depender exclusivamente da publica\u00e7\u00e3o de metadados e, portanto, esse artefato nunca foi usado explicitamente.<\/p>\n<p>A partir do Kotlin 1.4.20, n\u00e3o h\u00e1 mais uma publica\u00e7\u00e3o separada de metadados. Agora, artefatos de metadados est\u00e3o inclu\u00eddos na publica\u00e7\u00e3o raiz, que representa a biblioteca inteira e \u00e9 resolvida automaticamente para os artefatos espec\u00edficos da plataforma apropriada quando adicionados como uma depend\u00eancia ao conjunto de origem comum.<\/p>\n<p>Observe que voc\u00ea n\u00e3o deve adicionar um artefato vazio sem um classificador ao m\u00f3dulo raiz da sua biblioteca para atender aos requisitos de reposit\u00f3rios como o Maven Central, pois isso resultar\u00e1 em um conflito com artefatos de metadados que agora est\u00e3o inclu\u00eddos nesse m\u00f3dulo.<\/p>\n<h3>Compatibilidade com bibliotecas publicadas no lan\u00e7amento 1.4.20<\/h3>\n<p>Se voc\u00ea habilitou o <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-share-on-platforms.html#share-code-on-similar-platforms\" target=\"_blank\" rel=\"noopener\">suporte para estrutura hier\u00e1rquica de projetos<\/a> e deseja usar uma biblioteca multiplataforma publicada com esse suporte no Kotlin 1.4.20 ou superior, tamb\u00e9m precisar\u00e1 atualizar o Kotlin no seu projeto para a vers\u00e3o 1.4.20 ou superior.<\/p>\n<p>Se voc\u00ea \u00e9 um autor de biblioteca e publica sua biblioteca multiplataforma no Kotlin 1.4.20+ com suporte para a estrutura hier\u00e1rquica de projetos, lembre-se de que os usu\u00e1rios com vers\u00f5es anteriores do Kotlin que tamb\u00e9m t\u00eam suporte habilitado para a estrutura hier\u00e1rquica de projetos n\u00e3o poder\u00e3o usar a sua biblioteca. Eles precisar\u00e3o fazer upgrade do Kotlin para a vers\u00e3o 1.4.20 ou superior.<\/p>\n<p>No entanto, se voc\u00ea ou os usu\u00e1rios da sua biblioteca n\u00e3o habilitarem o suporte para a estrutura hier\u00e1rquica de projetos, aqueles com vers\u00f5es anteriores do Kotlin ainda poder\u00e3o usar a sua biblioteca.<\/p>\n<p>Saiba mais sobre como <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/mpp-publish-lib.html\" target=\"_blank\" rel=\"noopener\">publicar uma biblioteca multiplataforma<\/a>.<\/p>\n<h2>Altera\u00e7\u00f5es na biblioteca padr\u00e3o<\/h2>\n<p><a name=\"standard-library-changes\"><\/a><\/p>\n<h3>Extens\u00f5es para java.nio.file.Path<\/h3>\n<p>A partir da vers\u00e3o 1.4.20, a biblioteca padr\u00e3o fornece extens\u00f5es experimentais para <code>java.nio.file.Path<\/code>.<\/p>\n<p>Trabalhar com a API de arquivo JVM moderna ao estilo idiom\u00e1tico do Kotlin agora \u00e9 semelhante a trabalhar com extens\u00f5es <code>java.io.File<\/code> do pacote <code>kotlin.io<\/code>. N\u00e3o h\u00e1 mais necessidade de chamar m\u00e9todos est\u00e1ticos de <code>Files<\/code>, pois a maioria deles agora est\u00e1 dispon\u00edvel como extens\u00f5es no tipo <code>Path<\/code>.<\/p>\n<p>As extens\u00f5es est\u00e3o localizadas no pacote <code>kotlin.io.path<\/code>. Como o pr\u00f3prio <code>Path<\/code> est\u00e1 dispon\u00edvel no JDK 7 e superior, as extens\u00f5es s\u00e3o colocadas no m\u00f3dulo <code>kotlin-stdlib-jdk7<\/code>. Para us\u00e1-las, voc\u00ea precisa optar pela anota\u00e7\u00e3o experimental <code>ExperimentalPathApi<\/code>.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\"> \/\/ construct path with the div (\/) operator val baseDir = Path(&quot;\/base&quot;) val subDir = baseDir \/ &quot;subdirectory&quot;\r\n\r\n\/\/ list files in a directory val kotlinFiles: List&lt;Path&gt; = Path(&quot;\/home\/user&quot;).listDirectoryEntries(&quot;*.kt&quot;) ``` <\/pre>\n<p>Queremos agradecer especialmente ao nosso contribuidor <a href=\"https:\/\/github.com\/ajalt\" target=\"_blank\" rel=\"noopener\">AJ Alt<\/a> por enviar o PR inicial com essas extens\u00f5es.<\/p>\n<h3>Desempenho aprimorado da fun\u00e7\u00e3o <code>String.replace<\/code><\/h3>\n<p>Sempre ficamos entusiasmados quando a comunidade Kotlin sugere melhorias, como no caso a seguir. Neste lan\u00e7amento, mudamos a implementa\u00e7\u00e3o da fun\u00e7\u00e3o <code>String.replace()<\/code>.<\/p>\n<p>A variante com distin\u00e7\u00e3o entre mai\u00fasculas e min\u00fasculas usa um loop de substitui\u00e7\u00e3o manual baseado em <code>indexOf<\/code>, enquanto a variante sem distin\u00e7\u00e3o entre mai\u00fasculas e min\u00fasculas usa a correspond\u00eancia de express\u00e3o regular.<\/p>\n<p>Esta melhoria acelera a execu\u00e7\u00e3o da fun\u00e7\u00e3o em certos casos.<\/p>\n<h2>Suspens\u00e3o de uso de extens\u00f5es do Kotlin para Android<\/h2>\n<p><a name=\"deprecation-of-kotlin-android-extensions\"><\/a><\/p>\n<p>Desde que criamos as extens\u00f5es do Kotlin para Android, elas t\u00eam desempenhado um papel importante no crescimento da popularidade do Kotlin no ecossistema Android. Com essas extens\u00f5es, fornecemos aos desenvolvedores ferramentas convenientes e eficientes para reduzir o c\u00f3digo boilerplate:<\/p>\n<ul>\n<li>Visualiza\u00e7\u00f5es sint\u00e9ticas (<code>kotlinx.android.synthetics<\/code>) para intera\u00e7\u00e3o com a UI.<\/li>\n<li>Gerador de implementa\u00e7\u00e3o <code>Parcelable<\/code> (<code>@Parcelize<\/code>) para transmitir objetos como <code>Parcel<\/code>.<\/li>\n<\/ul>\n<p>Inicialmente, pensamos em adicionar mais componentes ao <code>kotlin-android-extensions<\/code>. Mas isso n\u00e3o aconteceu e at\u00e9 mesmo recebemos <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-25280\" target=\"_blank\" rel=\"noopener\">solicita\u00e7\u00f5es de usu\u00e1rios<\/a> para dividir o plug-in em partes independentes.<\/p>\n<p>Por outro lado, o ecossistema Android est\u00e1 sempre evoluindo, e os desenvolvedores est\u00e3o obtendo novas ferramentas que facilitam o trabalho. Algumas lacunas que as extens\u00f5es do Kotlin para Android preenchiam foram agora cobertas por mecanismos nativos do Google. Por exemplo, em rela\u00e7\u00e3o \u00e0 sintaxe concisa para intera\u00e7\u00e3o com a UI, agora existe o Android Jetpack, que tem uma <a href=\"https:\/\/developer.android.com\/topic\/libraries\/view-binding\" target=\"_blank\" rel=\"noopener\">associa\u00e7\u00e3o de exibi\u00e7\u00f5es<\/a> que substitui <code>findViewById<\/code>, assim como os sint\u00e9ticos Kotlin.<\/p>\n<p>Considerando esses dois fatores, decidimos retirar os sint\u00e9ticos em favor da associa\u00e7\u00e3o de exibi\u00e7\u00f5es e mover o gerador de implementa\u00e7\u00e3o Parcelable para um plug-in separado.<\/p>\n<p>No lan\u00e7amento 1.4.20, extra\u00edmos o gerador de implementa\u00e7\u00f5es Parcelable de <code>kotlin-android-extensions<\/code> e iniciamos o ciclo de suspens\u00e3o para o restante dele, que atualmente \u00e9 apenas sint\u00e9tico. Por enquanto, eles continuar\u00e3o trabalhando com um aviso de suspens\u00e3o de uso. No futuro, voc\u00ea precisar\u00e1 mudar seu projeto para outra solu\u00e7\u00e3o. Aqui est\u00e3o as <a href=\"https:\/\/goo.gle\/kotlin-android-extensions-deprecation\" target=\"_blank\" rel=\"noopener\">diretrizes<\/a> para migrar projetos do Android de sint\u00e9ticos para visualizar associa\u00e7\u00f5es.<\/p>\n<p>O gerador de implementa\u00e7\u00e3o Parcelable agora est\u00e1 dispon\u00edvel no novo plug-in <a href=\"https:\/\/developer.android.com\/kotlin\/parcelize\" target=\"_blank\" rel=\"noopener\"><code>kotlin-parcelize<\/code><\/a>. Aplique esse plug-in em vez ou al\u00e9m de <code>kotlin-android-extensions<\/code> se decidir continuar usando sint\u00e9ticos. A anota\u00e7\u00e3o <code>@Parcelize<\/code> \u00e9 movida para o pacote <code>kotlinx.parcelize<\/code>.<\/p>\n<h2>Como atualizar<\/h2>\n<p><a name=\"how-to-update\"><\/a><\/p>\n<p>Antes de atualizar seus projetos para a vers\u00e3o mais recente do Kotlin, voc\u00ea pode experimentar a nova linguagem e os recursos da biblioteca padr\u00e3o online em <a href=\"http:\/\/play.kotl.in\/\" target=\"_blank\" rel=\"noopener\">play.kotl.in<\/a>.<\/p>\n<p>No IntelliJ IDEA e no Android Studio, voc\u00ea pode atualizar o plug-in do Kotlin para a vers\u00e3o 1.4.20. Saiba como fazer isso <a href=\"https:\/\/kotlinlang.org\/releases.html#updating-to-a-new-release\" target=\"_blank\" rel=\"noopener\">aqui<\/a>.<\/p>\n<p>Se quiser trabalhar em projetos existentes que foram criados com vers\u00f5es anteriores do Kotlin, use a vers\u00e3o <code>1.4.20<\/code> do Kotlin na sua configura\u00e7\u00e3o de projeto. Para obter mais informa\u00e7\u00f5es, consulte os documentos <a href=\"http:\/\/kotlinlang.org\/docs\/reference\/using-gradle.html\" target=\"_blank\" rel=\"noopener\">para Gradle<\/a> e <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/using-maven.html\" target=\"_blank\" rel=\"noopener\">para Maven<\/a>.<\/p>\n<p>Voc\u00ea pode baixar o compilador de linha de comando na <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.4.20\" target=\"_blank\" rel=\"noopener\">p\u00e1gina de lan\u00e7amento do Github<\/a>.<\/p>\n<p>Voc\u00ea pode usar as seguintes vers\u00f5es de biblioteca com este lan\u00e7amento:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.atomicfu\" target=\"_blank\" rel=\"noopener\">kotlinx.atomicfu<\/a> vers\u00e3o <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.atomicfu\/0.14.4\" target=\"_blank\" rel=\"noopener\">0.14.4<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\" target=\"_blank\" rel=\"noopener\">kotlinx.coroutines<\/a> vers\u00e3o <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.coroutines\/1.4.1\" target=\"_blank\" rel=\"noopener\">1.4.1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\" target=\"_blank\" rel=\"noopener\">kotlinx.serialization<\/a> vers\u00e3o <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.serialization.runtime\/1.0.1\" target=\"_blank\" rel=\"noopener\">1.0.1<\/a><\/li>\n<li><a href=\"https:\/\/ktor.io\/\" target=\"_blank\" rel=\"noopener\">ktor<\/a> vers\u00e3o <a href=\"https:\/\/bintray.com\/kotlin\/ktor\/ktor\/1.4.1\" target=\"_blank\" rel=\"noopener\">1.4.1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.html\" target=\"_blank\" rel=\"noopener\">kotlinx.html<\/a> vers\u00e3o <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.html\/releases\/tag\/0.7.2\" target=\"_blank\" rel=\"noopener\">0.7.2<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx-nodejs\" target=\"_blank\" rel=\"noopener\">kotlinx-nodejs<\/a> vers\u00e3o <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.nodejs\/0.0.6\" target=\"_blank\" rel=\"noopener\">0.0.6<\/a><\/li>\n<\/ul>\n<p>As vers\u00f5es das bibliotecas de <code>kotlin-wrappers<\/code> (<code>kotlin-react<\/code> etc.) podem ser encontradas no <a href=\"https:\/\/github.com\/JetBrains\/kotlin-wrappers\" target=\"_blank\" rel=\"noopener\">reposit\u00f3rio correspondente<\/a>.<\/p>\n<p>Os detalhes do lan\u00e7amento e a lista de bibliotecas compat\u00edveis tamb\u00e9m est\u00e3o dispon\u00edveis <a href=\"https:\/\/kotlinlang.org\/releases.html#release-details\" target=\"_blank\" rel=\"noopener\">aqui<\/a>.<\/p>\n<p>Se tiver problemas com a nova vers\u00e3o, voc\u00ea poder\u00e1 encontrar ajuda no <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (receba um convite <a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up?_ga=2.134077326.1218289669.1605167163-154294388.1603171954\" target=\"_blank\" rel=\"noopener\">aqui <\/a>) e reportar issues no nosso <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<h2>Colaboradores externos<\/h2>\n<p><a name=\"external-contributors\"><\/a><\/p>\n<p>Gostar\u00edamos de agradecer a todos os nossos contribuintes externos cujos pull requests foram inclu\u00eddos neste lan\u00e7amento:<\/p>\n<p><a href=\"https:\/\/github.com\/jsjeon\" target=\"_blank\" rel=\"noopener\">Jinseong Jeon<\/a> <a href=\"https:\/\/github.com\/t-kameyama\" target=\"_blank\" rel=\"noopener\">Toshiaki Kameyama<\/a> <a href=\"https:\/\/github.com\/sfs\" target=\"_blank\" rel=\"noopener\">Steven Sch\u00e4fer<\/a> <a href=\"https:\/\/github.com\/madsager\" target=\"_blank\" rel=\"noopener\">Mads Ager<\/a> <a href=\"https:\/\/github.com\/punzki\" target=\"_blank\" rel=\"noopener\">Mark Punzalan<\/a> <a href=\"https:\/\/github.com\/gavra0\" target=\"_blank\" rel=\"noopener\">Ivan Gavrilovic<\/a> <a href=\"https:\/\/github.com\/pyos\" target=\"_blank\" rel=\"noopener\">pyos<\/a> <a href=\"https:\/\/github.com\/jimgoog\" target=\"_blank\" rel=\"noopener\">Jim Sproch<\/a> <a href=\"https:\/\/github.com\/kandersen\" target=\"_blank\" rel=\"noopener\">Kristoffer Andersen<\/a> <a href=\"https:\/\/github.com\/aleksandrina-streltsova\" target=\"_blank\" rel=\"noopener\">Aleksandrina Streltsova<\/a> <a href=\"https:\/\/github.com\/cketti\" target=\"_blank\" rel=\"noopener\">cketti<\/a> <a href=\"https:\/\/github.com\/kvirolainen\" target=\"_blank\" rel=\"noopener\">Konstantin Virolainen<\/a> <a href=\"https:\/\/github.com\/ajalt\" target=\"_blank\" rel=\"noopener\">AJ Alt<\/a> <a href=\"https:\/\/github.com\/tunedal\" target=\"_blank\" rel=\"noopener\">Henrik Tunedal<\/a> <a href=\"https:\/\/github.com\/juan-chen\" target=\"_blank\" rel=\"noopener\">Juan Chen<\/a> <a href=\"https:\/\/github.com\/kotlinisland\" target=\"_blank\" rel=\"noopener\">KotlinIsland<\/a>, <a href=\"https:\/\/github.com\/valery1707\" target=\"_blank\" rel=\"noopener\">Valeriy Vyrva<\/a> <a href=\"https:\/\/github.com\/achmyr\" target=\"_blank\" rel=\"noopener\">Alex Chmyr<\/a> <a href=\"https:\/\/github.com\/cdracm\" target=\"_blank\" rel=\"noopener\">Alexey Kudravtsev<\/a> <a href=\"https:\/\/github.com\/mano7onam\" target=\"_blank\" rel=\"noopener\">Andrey Matveev<\/a> <a href=\"https:\/\/github.com\/liutikas\" target=\"_blank\" rel=\"noopener\">Aurimas Liutikas<\/a> <a href=\"https:\/\/github.com\/Dattish\" target=\"_blank\" rel=\"noopener\">Dat Trieu<\/a> <a href=\"https:\/\/github.com\/devbridie\" target=\"_blank\" rel=\"noopener\">Dereck Bridie<\/a> <a href=\"https:\/\/github.com\/efemoney\" target=\"_blank\" rel=\"noopener\">Efeturi Money<\/a> <a href=\"https:\/\/github.com\/elijahverdoorn\" target=\"_blank\" rel=\"noopener\">Elijah Verdoorn<\/a> <a href=\"https:\/\/github.com\/43851243+enteerman\" target=\"_blank\" rel=\"noopener\">Enteerman<\/a> <a href=\"https:\/\/github.com\/fee1-dead\" target=\"_blank\" rel=\"noopener\">fee1-dead<\/a> <a href=\"https:\/\/github.com\/fvasco\" target=\"_blank\" rel=\"noopener\">Francesco Vasco<\/a> <a href=\"https:\/\/github.com\/duckladydinh\" target=\"_blank\" rel=\"noopener\">Gia Thuan Lam<\/a> <a href=\"https:\/\/github.com\/gdarmont\" target=\"_blank\" rel=\"noopener\">Guillaume Darmont<\/a> <a href=\"https:\/\/github.com\/JakeWharton\" target=\"_blank\" rel=\"noopener\">Jake Wharton<\/a> <a href=\"https:\/\/github.com\/juliankotrba\" target=\"_blank\" rel=\"noopener\">Julian Kotrba<\/a> <a href=\"https:\/\/github.com\/kevin1e100\" target=\"_blank\" rel=\"noopener\">Kevin Bierhoff<\/a> <a href=\"https:\/\/github.com\/gharrma\" target=\"_blank\" rel=\"noopener\">Matthew Gharrity<\/a> <a href=\"https:\/\/github.com\/Matts966\" target=\"_blank\" rel=\"noopener\">Matts966<\/a> <a href=\"https:\/\/github.com\/rsauciuc\" target=\"_blank\" rel=\"noopener\">Raluca Sauciuc<\/a> <a href=\"https:\/\/github.com\/rnett\" target=\"_blank\" rel=\"noopener\">Ryan Nett<\/a> <a href=\"https:\/\/github.com\/pocmo\" target=\"_blank\" rel=\"noopener\">Sebastian Kaspari<\/a> <a href=\"https:\/\/github.com\/develar\" target=\"_blank\" rel=\"noopener\">Vladimir Krivosheev<\/a> <a href=\"https:\/\/github.com\/n-p-s\" target=\"_blank\" rel=\"noopener\">n-p-s<\/a> <a href=\"https:\/\/github.com\/pavlospt\" target=\"_blank\" rel=\"noopener\">Pavlos-Petros Tournaris<\/a> <a href=\"https:\/\/github.com\/rbares\" target=\"_blank\" rel=\"noopener\">Robert Bares<\/a> <a href=\"https:\/\/github.com\/shiraji\" target=\"_blank\" rel=\"noopener\">Yoshinori Isogai<\/a> <a href=\"https:\/\/github.com\/zekehul\" target=\"_blank\" rel=\"noopener\">Kris<\/a> <a href=\"https:\/\/github.com\/bodin\" target=\"_blank\" rel=\"noopener\">Derek Bodin<\/a> <a href=\"https:\/\/github.com\/Lurker2k\" target=\"_blank\" rel=\"noopener\">Dominik Wuttke<\/a> <a href=\"https:\/\/github.com\/samofcorinth\" target=\"_blank\" rel=\"noopener\">Sam Wang<\/a> <a href=\"https:\/\/github.com\/uzilan\" target=\"_blank\" rel=\"noopener\">Uzi Landsmann<\/a> <a href=\"https:\/\/github.com\/yurano\" target=\"_blank\" rel=\"noopener\">Yuya Urano<\/a> Norbert Nogacki Alexandre Juca<\/p>\n","protected":false},"author":1086,"featured_media":95152,"comment_status":"closed","ping_status":"closed","template":"","categories":[907],"tags":[477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/99827"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=99827"}],"version-history":[{"count":2,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/99827\/revisions"}],"predecessor-version":[{"id":99832,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/99827\/revisions\/99832"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/95152"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=99827"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=99827"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=99827"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=99827"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}