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.
Os testes no MPS agora são gerados como testes JUnit 5. Suporte limitado para JUnit 4 ainda é fornecido.
BTestCase
NodeTestCase
EditorTestCase
MigrationTestCase
PatternTest
GeneratorTest
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.
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. |
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.
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
.
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.
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:
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.
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.
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).
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:
var myList = new arraylist<> {myInitialValue}
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<>>
.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
.
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.
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.
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 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).
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.
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.
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.