Novidades no MPS 2024.1

O MPS 2024.1 traz uma nova implementação assíncrona do painel Logical View na janela da ferramenta Project , melhorias substanciais no suporte ao Kotlin para várias plataformas e tempos de passagem de teste visivelmente mais rápidos. Você também encontrará forks condicionais em planos de geração, a descontinuação de caminhos de projeto no TestInfo, melhorias na nova interface do usuário e várias atualizações de plataforma.

Confira abaixo a lista detalhada de melhorias.

Suporte aprimorado da plataforma para Kotlin

O suporte ao Kotlin no MPS foi inicialmente projetado para suportar apenas código comum. No entanto, o único caso de uso possível no MPS era a compilação para a JVM, e a distinção entre código comum e código JVM não era clara.

Nesta versão, estamos introduzindo a configuração do conjunto de fontes da plataforma para nós Kotlin. Isso permite que você identifique quais plataformas de destino são compatíveis com um trecho de código e oculte as declarações de código incompatível.

Conjuntos de fontes

Em um projeto Kotlin normal, você pode usar conjuntos de fontes para separar o código direcionado a diferentes plataformas. No MPS, isto foi introduzido no nível da raiz, com a opção de especificar o conjunto de plataformas suportadas para cada nó raiz do Kotlin. Esses conjuntos de fontes podem ser configurados no nível do nó raiz com a ajuda de uma ação de intenção.

Na prática, isso significa que:

  • O código em um determinado conjunto de fontes só pode acessar declarações com plataformas compatíveis. Por exemplo, o código específico da JVM pode acessar somente o código específico da JVM e o código comum direcionado à JVM.
  • Os códigos-fonte gerados são estruturados em diretórios específicos do conjunto de códigos-fonte. Se um diretório não for especificado, ele usará o conjunto de fontes padrão, que corresponde ao padrão do módulo.
  • Agora, há suporte para declarações esperadas e reais.

Por padrão, o código Kotlin sem uma plataforma explícita usa a JVM, mantendo a compatibilidade com versões anteriores.

Carregamento e compilação de stubs

Stubs foram aprimorados para dar suporte a novos casos de uso multiplataforma. No passado, o MPS oferecia opções separadas para stubs Kotlin e Kotlin/JVM, que carregavam stubs comuns e JVM, respectivamente.

Essas duas opções foram unificadas sob a opção de stubs do Kotlin, que agora determina automaticamente se um artefato fornecido expõe código comum, código JVM ou código para outras plataformas.

Como as declarações entre bibliotecas comuns e específicas da plataforma são redundantes (já que ambos os artefatos contêm todas as declarações necessárias), introduzimos um novo mecanismo de filtragem de duplicação para manter os stubs organizados. Quando as bibliotecas específicas da plataforma são declaradas no mesmo módulo, elas podem acessar as declarações comuns, portanto, não é necessário declará-las novamente.

A configuração de dependências é a mesma de antes:

  • As bibliotecas comuns e específicas da plataforma podem ser usadas como stubs.
  • As bibliotecas JVM são necessárias para compilar código comum para a JVM e devem ser declaradas na faceta Java.

Por exemplo, escrever um código comum exige que você use uma biblioteca comum para stubs, usando o conjunto de código-fonte comum, mas você também precisa declarar o artefato Java na faceta Java.

Melhoria da legibilidade do Kotlin sem o sistema de tipos CodeRules

O código Kotlin no MPS costumava gerar muitos erros de escopo e typesystem quando o plug-in Kotlin Typesystem, baseado em CodeRules, não estava disponível. Para melhorar a legibilidade e a capacidade de testes, essas verificações e erros agora são silenciados quando o plug-in de sistema de tipos baseado em CodeRules não está disponível.

Nesses casos, todos os escopos nas linguagens Kotlin são substituídos por um escopo padrão que inclui todos os nós de conceitos compatíveis. Isso elimina qualquer erro falso-positivo, pois todos os nós válidos estão dentro do escopo.

As diretrizes para lidar com o código Kotlin permanecem as mesmas de antes:

  • A escrita e a verificação do código Kotlin devem ser feitas com o CodeRules ativado habilitado o plug-in Kotlin Typesystem instalado.
  • A leitura e a geração do Kotlin podem ser realizadas com segurança sem eles.

Reimplementação do painel Logical View

O painel Logical View agora é baseado em uma arquitetura assíncrona, o que ajuda a manter a IU responsiva e contribui para o desempenho geral do IDE. A nova implementação também permite extensões e modificações mais fáceis. Para obter mais detalhes, consulte nosso artigo na base de conhecimento: ProjectPane implementation on top of ProjectViewTree (Implementação do ProjectPane sobre ProjectViewTree).

Essa nova implementação resultou em algumas mudanças notáveis:

  • Indicadores de erro e aviso não estão mais disponíveis.
  • Erros e avisos encontrados na hierarquia estão sublinhados em vermelho.
  • A opção Show Descriptor Models afeta todos os modelos de descritores.
  • Algumas operações de arrastar e soltar funcionam de maneira diferente.
  • As configurações no painel Logical View foram ligeiramente reorganizadas.

Células de espaço reservado

Introduzimos um novo estilo em BaseLanguage que permite que células constantes sirvam como espaços reservados se houver um valor ausente (um nó filho ou uma referência). Por exemplo, quando nenhum construtor está presente numa classe, uma célula de espaço reservado poderá ser exibida <no default constructor>. O estilo faz com que as células constantes exibam o comportamento que você esperaria dessas células de espaço reservado. O cursor só pode ser colocado na primeira posição, e não é possível editar o valor. Somente as modificações fornecidas pelos menus de transformação anexados são permitidas.

Alterações na linguagem de build

A opção booleana doNotCompile dos módulos na linguagem de build foi substituída por um enum Java para distinguir melhor os casos em que:

  • O módulo não contém código.
  • O módulo contém código, mas o código é compilado por ferramentas diferentes do MPS.

Esses dois casos costumavam ser representados pelo valor true.

A nova enum Java tem três valores possíveis:

  • compile in MPS
  • compile externally
  • no code

Ao migrar para 2024.1, o valor original false de doNotCompile será migrado para compile in MPS, enquanto o valor true de doNotCompile será migrado para compile externally.

Forks condicionais em planos de geração

Um pequeno recurso experimental permite que você adicione um fork para um plano de geração sem modificar o plano original que está recebendo fork. Um plano de geração pode ser marcado como um fork de outro plano de geração. O plano marcado será tratado como se fosse referenciado explicitamente com a instrução padrão fork inserida no início do plano de geração com fork.

Além disso, ao definir um fork, você pode usar um modificador de string que servirá como gatilho. O fork só ocorrerá se o modelo que estiver sendo gerado for de propriedade de um módulo que tenha uma faceta de destino de geração com um ID de faceta que corresponda ao gatilho de string.

Relatórios XML do JUnit5 no MPS

Testes JUnit no MPS agora podem gerar relatórios de teste não apenas nos formatos Vintage e Jupiter, mas também no formato Open Test Reporting. Uma nova opção está disponível nas opções de teste da linguagem de build para controlar se o relatório Open Test está incluído nos relatórios gerados. Se a opção for definida como true, os arquivos de relatório denominados junit-platform-events*-$BUILD_NAME$.xml serão criados no diretório do projeto.

Se a opção for definida como false, serão criados os relatórios antigos para os mecanismos Vintage e Jupiter.

Anotação JUnit5 @DisplayName propagada para relatórios de teste

Os relatórios de teste MPS agora respeitam a anotação JUnit @DisplayName e propagam o nome para os relatórios exibidos na janela da ferramenta de relatório de teste.

Melhorias no tempo de execução de testes

Ao executar um teste de nó ou editor, o MPS costumava copiar todo o modelo de teste em modelos transitórios e fazer cópias adicionais de cada nó de caso de teste (começando na raiz NodeTestCase ou EditorTestCase). Para modelos de teste grandes, isso tende a ter um impacto notável no desempenho. Isso também resultava em uma configuração bastante estranha com nós de teste duplicados. No MPS 2024.1, os modelos com testes não serão mais copiados; somente os filhos TestNode de NodeTestCase ou EditorTestCase serão, junto com seus respectivos nós de ambiente (os alvos de suas referências).

O caminho do projeto no TestInfo não é mais necessário

As declarações TestInfo não são mais necessárias para testes que precisam de um projeto MPS para serem abertos. Isso se aplica a todas as abordagens de execução dos testes JUnit:

  • Se o teste for executado a partir do IDE, em processo ou fora de processo, será usado o projeto aberto no momento.
  • Se o teste for executado com a tarefa <launchtests>, o project path poderá ser especificado como uma opção adicional de caminho de projeto da tarefa. Se não for especificado, ${basedir} será usado, o que corresponde ao diretório inicial do projeto atual.
  • Para casos especiais em que nenhuma das abordagens acima pode ser usada, você pode especificar o local do projeto por meio da propriedade do sistema -Dmps.test.project.path .

As declarações existentes TestInfo ainda são compatíveis e podem ser mantidas.

Revisão completa do carregamento de classes de módulos

Em nosso esforço para separar o carregamento da classe do acesso ao modelo e a depreciação de ReloadableSModule, alteramos a forma como o carregamento da classe funciona para os módulos. Embora tenhamos nos esforçado muito para evitar alterações perceptíveis para os usuários finais, as atualizações podem levar a problemas de carregamento de classes que não existiam anteriormente.

Como parte dessa reformulação, o MPS agora adere às dependências declaradas em module.xml para módulos implantados, sem tentar calculá-las na inicialização com base em informações dispersas nos arquivos de módulo. Durante a fase de projeto, as dependências são derivadas das informações coletadas durante a fase de transformação do modelo e também não são recalculadas aqui. A lógica antiga que analisa as dependências de módulos de arquivos .mpl ou .msd ainda segue como alternativa caso o novo método falhe.

Essas alterações fazem parte de um esforço contínuo para aprimorar as facetas de módulos Java e as facetas de módulos em geral.

Excluir nós comentados dos escopos (também disponível na versão 2022.3.2)

Ao confiar no cálculo de escopo padrão, os nós de destino em potencial comentados agora são automaticamente excluídos do escopo.

Outros

  • Um literal longo hexadecimal foi introduzido em BaseLanguage.
  • Quando um projeto requer migração e há incompatibilidades de versão de módulo/modelo (por exemplo, se o módulo menciona uma versão de linguagem diferente da versão mencionada num modelo), uma janela de notificação pop-up é exibida com uma ação que mostra todos os módulos com incompatibilidades. Isso é útil quando você está fazendo merge de código migrado, pois garante que o estado final reflita as versões corretas de linguagem e módulo.
  • Os módulos em um devkit no painel Logical View são mostrados como nós de referência de módulo. Isso é semelhante à maneira como os módulos de tempo de execução em um módulo de linguagem são apresentados.

Diversas correções de bugs

  • Como de costume, essa versão corrige alguns bugs. Você pode encontrar uma lista completa de todos os problemas que corrigimos aqui.

Atualizações da plataforma

Novo terminal na nova interface do usuário

Beta

O MPS 2024.1 traz um terminal reformulado com melhorias visuais e funcionais para agilizar tarefas de linha de comando. Essa atualização dá uma nova aparência para a nossa conhecida ferramenta, com comandos separados em blocos distintos, juntamente com um conjunto expandido de recursos, como navegação suave entre blocos, complementação de comandos e fácil acesso ao histórico de comandos. Saiba mais nesta postagem no blog.

Opção para reduzir as dimensões de todo o IDE

Agora você pode reduzir o tamanho do IDE para 90%, 80% ou 70%, com a flexibilidade de aumentar ou diminuir o tamanho dos elementos do IDE.

Atualização do suporte a versões do Gradle

A partir dessa versão, o MPS não oferece mais suporte a projetos que usam versões do Gradle anteriores à 4.5, e o IDE não executará a sincronização do Gradle para projetos com versões não suportadas do Gradle.

Diversos recursos do VCS

Opção para exibir alterações de branch de revisão em uma aba Log

O MPS 2024.1 agiliza o workflow de revisão de código, oferecendo uma visão dedicada das alterações relacionadas ao branch. Para GitHub, GitLab e Space, agora é possível ver alterações em um determinado branch em uma aba Log separada dentro da janela de ferramentas Git. Para fazer isso, clique no nome do branch na janela de ferramentas Pull Requests e escolha Show in Git Log no menu.

Suporte para reações em comentários de revisão de código

O MPS 2024.1 traz suporte para postar reações em comentários de revisão para solicitações pull do GitHub e solicitações merge do GitLab, com um conjunto de emojis já disponíveis para você escolher.

Criação de solicitações pull/merge a partir de notificações por push

Depois de fazer push com sucesso de suas alterações no sistema de controle de versão, o IDE alertará com uma única notificação informando sobre o sucesso do push e sugerindo uma ação para criar uma solicitação pull/merge.

Indicadores visuais de atualizações pendentes no GitHub

Introduzimos indicadores visuais para informar você sobre atualizações pendentes no seu workflow de revisão de código. Quando houver alterações que exigem sua atenção, um ponto aparecerá no ícone da janela de ferramentas. Solicitações pull invisíveis também serão marcadas com um ponto azul, garantindo que você não perca atualizações no seu processo de revisão de código.

Evitando commits de arquivos grandes em repositórios

Para ajudar você a evitar rejeições de controle de versão devido a arquivos grandes, o IDE agora inclui uma verificação de pré-commit que impede que se faça commit desses arquivos e que notifica você sobre a restrição.

Filtro de branch para a aba History na janela de ferramentas Git

Na janela de ferramentas Git, o botão Show all branches foi substituído por um filtro de branch, permitindo revisar alterações feitas em um arquivo dentro de um branch designado. Também ajustamos a orientação da barra de ferramentas, posicionando-a na horizontal para maior facilidade de uso.

Pesquisa aprimorada no pop-up Branches

No pop-up Branches, agora você pode filtrar os resultados da pesquisa por ações e repositórios para uma navegação mais rápida e precisa dentro do seu sistema de controle de versão.

Opção de merge Allow unrelated histories

A caixa de diálogo Merge into agora tem uma opção Allow unrelated histories no menu suspenso. Quando selecionado, permite o merge de duas branches mesmo que elas não tenham histórico em comum.

Opção para excluir pastas e arquivos da comparação

No visualizador diff, agora você pode especificar pastas e arquivos a serem ignorados durante o processo de comparação para se concentrar apenas nas alterações relevantes. Basta clicar com o botão direito em qualquer arquivo ou pasta que você não deseja que apareça nos resultados da comparação e selecionar Exclude from results no menu de contexto.

Guia de Migração

Para cada lançamento principal, preparamos instruções sobre como migrar de versões mais antigas do MPS para garantir que tudo corra bem. Veja-os em detalhes no Guia de Migração atualizado.