Novidades no MPS 2023.2

O MPS 2023.2 traz melhorias para geração de lambdas do BaseLanguage, suporte para JUnit 5, sobreposição de regras de inferência de sistema de tipos e muito mais.

Suporte para JUnit 5

JUnit 5

Os testes no MPS agora são gerados como testes JUnit 5. Suporte limitado para JUnit 4 ainda é fornecido.

  • Qualquer classe Java apropriadamente anotada pode ser executada como um teste.
  • Ambas as opções de execução de testes MPS - em processo e gerados - estão disponíveis.
  • As raízes de teste existentes são geradas com anotações da JUP Jupiter API:
    • BTestCase
    • NodeTestCase
    • EditorTestCase
    • MigrationTestCase
    • PatternTest
    • GeneratorTest

Tarefa Ant para iniciar testes de módulos com JUnit 5

Uma nova tarefa launchtests do Ant está disponível com suporte para os seguintes elementos:

  • library
  • macro
  • plug-in
  • testmodules

Ela oferece suporte à execução de todos os artefatos de teste, com exceção do JUnit 3, e serve como o novo alvo para a parte de build da configuração de teste.

Execução de testes a partir do MPS

  • Qualquer classe Java devidamente anotada pode ser executada como um teste.
  • Agora, há apenas suporte limitado para JUnit 4.
  • São possíveis execuções em processo e geradas.

API da plataforma de teste

Essa API permite que você amplie os tipos de testes disponíveis no MPS, bem como implemente ouvintes para sessões de teste.

Classes em jetbrains.mps.baseLanguage.unitTest.platform formam a API da plataforma de teste do MPS:

TestPlatform Define a API para a plataforma de teste do MPS.
TestDescriptor Representa um único teste na plataforma de teste do MPS.
TestSource Representa a fonte do teste, como um SNode.
TestSession Representa uma sessão de teste.
TestDiscoveryParticipant Permite ingressar no processo de descoberta de testes.
TestSessionListener Possibilita o recebimento de notificações da sessão de teste.

Suporte experimental para mecanismos de teste personalizados

O JUnit 5 introduz, entre outras coisas, suporte para a implementação de testes que são executados com um mecanismo personalizado. Um exemplo popular desse tipo de mecanismo é o jqwik – um framework de teste baseado em propriedades.

Suporte aprimorado para sobrepor regras de sistemas de tipos
Patrocinado pelo cliente

Sobreposição do sistema de tipos

Recentemente, adicionamos um recurso que permite que as regras do sistema de tipos sobreponham as regras definidas em superconceitos. Isso pode ser feito nos casos em que os subconceitos são definidos numa linguagem que estende a linguagem que contém o superconceito. Este recurso pode ser usado em regras do tipo Inference.

Melhorias em BaseLanguage

Em uma atualização anterior, o MPS recebeu suporte aprimorado para referências de métodos e a conversão de closures em lambdas Java. Ampliamos esse suporte com vários recursos menores e correções de bugs.

Lambdas

Geração de closures como lambdas

Os closures usados em operações de coleções agora são gerados como lambdas Java, que inicialmente estavam disponíveis apenas para chamadas de função regulares que usavam interfaces Java. Para manter a compatibilidade com versões anteriores, há situações em que um closure ainda será gerado como uma classe anônima:

  • Quando o nome de uma variável entra em conflito com uma variável externa, um aviso agora é exibido sugerindo que ela seja renomeada.
  • Quando a versão alvo do Java for 8 ou inferior.
  • Quando tipos brutos são usados (eles não funcionam bem com lambdas Java).

Geralmente, isso resulta na melhoria da qualidade do código gerado, pois lambdas, além de serem mais legíveis, têm menos probabilidade de serem gerados incorretamente. Por outro lado, o MPS permite recursos com tipos brutos que o Java não permitiria, já que detectar tais instâncias ainda é um desafio. Como resultado, em locais onde tipos brutos são empregados, a geração pode falhar.

Parâmetro de closure

Parâmetros de um closure

Os parâmetros de um closure anteriormente tinham várias formas possíveis: ~param, <type> param, param e var param. Adicionar parâmetros ignorando o tipo era complicado. Neste lançamento, descontinuamos o formato ~param em favor do parâmetro simples sem tipo, que agora é inserido por padrão. Além disso, quando um closure é inserido numa chamada de função, os parâmetros padrão serão inseridos a partir do tipo de função esperado. Por último, se o seu tipo for omitido no código-fonte, os parâmetros gerados agora omitirão o tipo, melhorando ainda mais a qualidade da compilação.

Streams

Interoperabilidade de streams

Embora as sequências sejam amplamente utilizadas no MPS, há ocasiões em que os streams Java também devem ser usados. Esta atualização oferece inferência aprimorada para atenuar os problemas do sistema de tipos relacionados a métodos complexos que a API Stream pode usar. Adicionamos duas operações para unir streams e sequências:

  • <stream>.asSequence converterá uma sequência num stream.
  • <sequence>.toStream(parallel=…) fará o contrário.

Além de permitir que você escolha qual API usar, isso permite que você combine os benefícios das sequências (repetibilidade) com os dos streams (vários coletores, mais operadores).

Melhorias para coleções

Anteriormente, introduzimos o operador diamante (new ArrayList<>()) para construtores BaseLanguage, mas os criadores de coleções foram excluídos dessa melhoria. Nesta atualização, agora você pode omitir parâmetros de tipo de novas coleções, simplificando o processo de escrita de código:

  • Tipo inferido dos valores iniciais: var myList = new arraylist<> {myInitialValue}
  • Tipo inferido da declaração de variável: map<int, string> myMap = new hashmap<>

Além disso, aprimoramos o suporte a variância em coleções. Por exemplo, não é mais possível atribuir uma notação ? extends Number. No entanto, o sistema de tipos não se oporá mais ao uso desses tipos limitados quando eles forem válidos. O tipo sequence<> permanecerá covariante por padrão, pois não resultará em nenhuma consequência insegura, já que você não pode inseri-lo numa sequência de elementos que não sejam do seu tipo. Isto pode trazer novos problemas de verificação de tipo onde códigos inseguros anteriormente não eram detectados. Eles podem ser resolvidos com tipos limitados list<? extends node<>> ou tipos de sequência sequence<node<>>.

Definições de configuração

Disable Make

Disable Make On Startup

Adicionamos uma nova opção, Disable Make On Startup, que está disponível em Settings | Project Settings | Make. Quando essa opção for selecionada, o MPS não criará todos os módulos do projeto ao inicializar. Isso pode ser útil se você quiser aumentar a velocidade de inicialização em situações em que o processo de criação inicial demora muito ou pode falhar, pois a configuração manual é necessária antes que o projeto possa ser criado com sucesso.

Editar biblioteca

Editar os caminhos das fontes e das bibliotecas nas propriedades Java do módulo

Uma nova opção Edit foi adicionada à aba Java da caixa de diálogo de propriedades do módulo. É difícil de detectar, mas muito conveniente. Quando você precisar alterar o conjunto de bibliotecas jar do seu módulo, basta usar essa nova opção, e você não terá que realizar uma sequência tediosa de remoção de uma entrada seguida de uma adição.

Outros

Comentário TODO

A capacidade TODO para comentários personalizados

A extensão do conceito IGenericComment permite que conceitos que representam comentários em linguagens personalizadas participem da funcionalidade TODO do MPS. Os comentários que representam TODOs serão coletados pelo TODO Finder, listados no TODO Viewer e verificados durante o processo de commit.

Aspectos da linguagem: gestão de ações Create New

Para criar instâncias em um modelo de aspecto, o MPS até agora seguia uma lógica geral que envolvia conceitos não abstratos enraizáveis, ordenados por nome ou sinalizador. Agora, a configuração opcional pode ser especificada junto com uma declaração de aspecto, permitindo que os designers de linguagem controlem quais conceitos são apresentados ao usuário, bem como seu agrupamento e sua ordem.

Verificação “Please re-export dependency…” agora obsoleta

Esse aviso confuso costumava ser mostrado quando um ClassConcept estendia ou de outra forma expunha seu uso de um ClassConcept de outro módulo. Antes da versão 2023.2, o MPS dependia das dependências do módulo especificadas nos descritores do módulo para criar o grafo de dependências. Agora que o MPS cria as informações de dependência com base nos geradores e linguagens reais envolvidos na transformação de um modelo, você não precisa mais especificar essas dependências explicitamente, portanto, não há mais necessidade de verificar.

Recursos patrocinados pelo cliente portados de versões mais antigas

Compartilhar é uma característica útil de qualquer comunidade. Os recursos a seguir foram implementados com base nas solicitações dos usuários comerciais do MPS que patrocinaram nosso desenvolvimento. Agora, você também pode aproveitar ao máximo essas adições úteis.

Verificador de modelos paralelos

O verificador de modelos agora pode utilizar efetivamente hardware paralelo, acelerando assim o processo de verificação de modelos. Dependendo das configurações em Settings | Tools | Model Checker, ele pode gerar vários threads ao iniciar esse processo.

Melhor desempenho da persistência File-per-root

O método FilePerRootDataSource.getStreamByName() foi otimizado para melhorar o desempenho do carregamento de dados do modelo. Se você usa a persistência File-per-root para armazenar modelos grandes, essa alteração será perceptível.

Caixa de diálogo Find

Suporte aprimorado para Find text in project

A ação existente Find text in project foi melhorada, e agora também procura referências de nós nomeados, trazendo resultados adicionais relevantes. Foi adicionado um painel de visualização que permite ver os resultados diretamente na caixa de diálogo de pesquisa. O texto com conteúdo HTML agora é renderizado como texto simples nos resultados e não como HTML, como nas versões anteriores.

Ignorar a migração de dependências em tarefas Ant

Ao migrar um projeto usando tarefas Ant fornecidas pelo MPS, as dependências podem não ser migradas adequadamente. Adicionamos um sinalizador para continuar a migração de um projeto mesmo nesses casos. Interromper o processo de migração assim que uma dependência não migrada é descoberta continua sendo o comportamento padrão. Para usar esse sinalizador, adicione haltOnDependencyError="false" à sua tarefa Ant migrate.

Atualizações da plataforma

Zoom em todo o IDE

Na versão 2023.2, é possível ampliar e reduzir totalmente o zoom do IDE, aumentando ou diminuindo o tamanho de todos os elementos da IU de uma só vez. No menu principal, selecione View | Appearance e ajuste o zoom do IDE. Além disso, você pode atribuir atalhos personalizados para chamar essas ações em Settings/Preferences | Keymap | Main Menu | View | Appearance.

Nova configuração Remember size for each tool window

No MPS 2023.2, introduzimos uma nova opção de layout que permite unificar a largura das janelas de ferramentas laterais ou manter a capacidade de ajustar livremente seus tamanhos conforme você personaliza seu layout. A nova caixa de seleção Remember size for each tool window está disponível em Settings/Preferences | Appearance & Behavior | Appearance | Tool Windows. Saiba como essa configuração funciona para a nova e a antiga IU nesta postagem do nosso blog.

Realce de sintaxe em descrições de inspeções

Realce de sintaxe em descrições de inspeções

Em Settings / Preferences | Editor | Inspections, amostras de código agora incluem realce de sintaxe, o que torna mais fácil entender o que aciona uma inspeção e decidir se você deseja que ela fique ativa ou inativa.

Ação Fill Paragraph para arquivos Markdown

Ação Fill Paragraph para arquivos Markdown

A ação do editor Fill Paragraph agora é compatível com arquivos Markdown, permitindo que você quebre textos longos em várias linhas do mesmo comprimento. Para fazer isso, defina o cursor dentro do parágrafo que você deseja editar e procure o comando Fill Paragraph usando Find Action (Ctrl+Shift+A).

Pop-up Branches aprimorado

Pop-up Branches aprimorado

Melhoramos a usabilidade do pop-up Branches. Por exemplo, ficou mais fácil navegar entre branches, pois eles são agrupados e armazenados em listas expansíveis.

Complementação automática no pop-up Create New Branch

Complementação automática no pop-up Create New Branch

O MPS 2023.2 fornece complementação automática no pop-up Create New Branch. Assim que você começa a digitar um nome para seu novo branch, o IDE sugere prefixos relevantes com base nos nomes dos branches locais existentes.

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. Por favor, revise-as com cuidado.