Novidades no MPS 2018.3

BaseLanguage

Ícones substituídos/implementados por conceito

O MPS marca conceitos com um ícone substituído/implementado, ajudando você a navegar facilmente até o superconceito ou subconceito do conceito atual.

Pacotes personalizados para classes BaseLanguage

Por um longo tempo, a única maneira de gerenciar pacotes Java de classes geradas era por meio do nome de um modelo que as continha. No entanto, com a nova propriedade de classificador !packageName", você pode gerenciar o pacote Java de uma classe gerada. Essa propriedade também está disponível para classificadores raiz.

Instalações de nova geração para extensões BaseLanguage

A BaseLanguage sempre foi projetada para ser personalizada com várias extensões. No entanto, para algumas extensões, pode ser complicado implementar um gerador adequado. Agora, a BaseLanguage fornece vários novos conceitos de tempo de geração para ajudar a facilitar a gravação dos geradores de extensões.

Geração de expressões Lvalue

Expressões Lvalue são avaliadas para variáveis que podem ser lidas ou gravadas com um valor. Em alguns casos, gerar uma expressão Lvalue é difícil, pois isso pode depender do tipo de contexto em que a expressão é usada. Agora, o novo conceito de tempo de geração de "generic lvalue-expression" pode ser utilizado para tornar um gerador mais simples e sem reconhecimento de contexto.

Felizmente, na nova versão, você pode agrupar uma expressão lvalue arbitrária com a expressão "@byRef". O gerador BaseLanguage transformará a expressão condensada em uma expressão do tipo "Reference <T>", que fornecerá as operações get e set sobre a variável condensada.

Esses dois conceitos de tempo de geração recém-introduzidos são descritos com mais detalhes em neste artigo.

Transforme Lvalues em referências

Algumas expressões agregam outras expressões Lvalue para criar operações compostas com uma variável que é produzida a partir de uma expressão agregada (por exemplo, além de expressões de atribuição ou incremento e obtenção). A introdução de novas expressões com essa semântica não costumava ser viável porque era difícil escrever um gerador adequado para essas construções.

Suporte a métodos padrão na BaseLanguage

Na versão 2018.3, o MPS pode criar os métodos "default" nas interfaces BaseLanguage. A palavra-chave "default" é implementada pelo conceito DefaultModifier, que estende o conceito Modifier na BaseLanguage. O DefaultModifier está localizado na linguagem jetbrains.mps.baseLanguage.jdk8. Isso significa que, para criar um método default na interface, você precisa importar a linguagem jdk8.

Generator

A linguagem de gerador

A macro $INCLUDE$ foi descontinuada, e há uma migração para substituir suas instâncias por $CALL$. A primeira não era compatível com modelos com argumentos e não víamos nenhum motivo para manter os dois mecanismos para invocar um modelo.

As regras de macro e tecelagem $WEAVE$ agora podem chamar modelos com argumentos. Quando um modelo interpretado tece um modelo externo a partir de um gerador "compilado", ele não é mais interpretado, mas o código do modelo compilado ainda é executado. Modelos "compilados" agora podem tecer modelos interpretados.

A reflexão Java não é usada para acessar a coleção de consultas de um modelo, também conhecida como QueriesGenerated.

Interface/experiência do usuário

TouchBar do MacBook

O contexto padrão inclui controles para executar, compilar e depurar o aplicativo, com a capacidade de selecionar ou criar rapidamente uma nova configuração de execução/depuração. Agora, existe uma nova página Touch Bar para personalizar as ações em Preferences | Appearance & Behavior | Menus and Toolbars.

E sim, ela é extensível! Basta adicionar as ações necessárias a um "InterfaceGroup" do MPS especial.

Tema da interface do usuário de alto contraste

Adicionamos suporte para um novo tema de alto contraste, que pode ser acessado usando a lista suspensa nas opções de temas em Preferences -> Appearance & Behavior.

Novas ações para encontrar código obsoleto

A ação Find Usages of Deprecated pode encontrar todos os usos de elementos obsoletos. Agora, o relatório dos usos encontrados agrupa as entradas pela versão esperada da remoção do código, para que seja mais fácil reconhecer a gravidade e priorizar quais eliminar primeiro.

Um novo ícone para métodos de comportamento substituídos ou implementados

Os métodos de comportamento foram equipados com um novo ícone. A captura de tela a seguir mostra uma lista de métodos getPresentation() que substituem ou implementam o método selecionado e isso permitirá que você navegue até eles a partir daí.

Aprimoramentos adicionais de ícones substituídos/implementados

Os pop-ups com conceitos/classes/métodos substituídos/implementados tornaram-se assíncronos, o que significa que, em segundo plano, o MPS preencherá o pop-up com os resultados da pesquisa. Além disso, agora você pode filtrar usando o nome de objetos de pesquisa.

Alterações em localizadores

Os localizadores distribuídos pelo MPS foram atualizados e otimizados. Para executar um localizador de forma assíncrona, você precisará usar o OnEachNodeFoundByExpression especial, que representa uma chamada simples do localizador com um retorno de chamada que é executado para cada nó encontrado. Consequentemente, as opções de localização de usos para um conceito foram alteradas. As opções foram estendidas com conceitos derivados e ancestrais de conceitos, que produzem a lista de subconceitos e superconceitos, respectivamente. Além disso, as opções de localização de usos para os métodos de comportamento foram estendidas com "Overridden Methods" e "Overriding Methods".

Suprimindo erros específicos

A supressão de erros costumava ser uma ferramenta aproximada para impedir que o MPS mostrasse um erro encontrado incorretamente pelo verificador do sistema de tipos. Se um nó fosse anotado com o atributo "SuppressErrorAnnotation" usando a intenção "Suppress error for node ...", nenhuma mensagem de erro seria mostrada para esse nó ou qualquer um de seus descendentes.

Agora, existe a possibilidade de suprimir apenas mensagens de erro específicas. A mensagem de erro será suprimida para o nó e todos os seus descendentes, mas todas as outras mensagens ainda permanecerão presentes. Para obter mais informações, consulte a documentação.

Editor

Mapas de ação de células reutilizáveis

Itens de mapa de ação da célula de um mapa de ação existente podem ser reutilizados em um novo por meio de importações.

Linguagem de compilação

Dicas e truques

As dicas e truques padrão do MPS agora podem ser personalizados. Isso pode ser feito com o novo conceito de dicas e truques no script de compilação. As dicas podem ser reutilizadas da distribuição geral do MPS ou podem ser importadas de um diretório ou uma solução.

Dicas e truques de uma linguagem

Para importar dicas e truques de uma solução, crie uma solução com um modelo e adicione as linguagens jetbrains.mps.build.tips e jetbrains.mps.core.xml para modelar as linguagens usadas. Em seguida, você pode criar uma instância do conceito MPSTipsAndTricks, em que várias dicas podem ser criadas. Cada dica é um texto formatado em HTML e pode incluir até uma imagem.

Opções de empacotamento de compilações

A opção de empacotamento personalizado em BuildMps_IdeaPlugin foi descontinuada e não deve mais ser usada. Agora, é possível escolher o empacotamento diretamente na construção BuildMpsLayout_Plugin do layout.

Com o empacotamento automático, todas as linguagens e soluções fornecidas são colocadas na pasta 'languages" no diretório raiz do plug-in. O empacotamento manual, por outro lado, implica que o desenvolvedor deve fornecer todo o layout do plug-in por conta própria.

Nova construção na linguagem de compilação

A configuração do módulo de teste na linguagem de compilação foi estendida para especificar plug-ins adicionais do IntelliJ IDEA que devem ser carregados quando testes ant do MPS são executados.

Existem situações em que o teste precisa de um plug-in específico em seu ambiente, que o mecanismo de linguagem de compilação do MPS não pôde deduzir dos módulos que contêm os testes. Agora, você pode garantir que o plug-in necessário esteja presente durante a execução do teste Ant do MPS.

Diversos

Tipos de dados totalmente compilados

Criamos tipos de dados completamente gerados. Todas as informações geradas sobre tipos de dados agora estão disponíveis na API do SModel.

Salvando dados de migração como anotações

Agora, o MPS oferece suporte a um novo mecanismo de transferência de dados de migração, que é altamente recomendável para migrações recém-criadas. O nó produzido que contém dados agora deve estar anexado a qualquer nó que esteja próximo o suficiente do local ao qual os dados estão relacionados.

O script de migração que produz nós com dados deve declarar o conceito desses nós e usar uma construção putData() para inserir cada uma dessas anotações no modelo:

A recuperação de nós que contêm dados é feita da mesma maneira de antes:

Melhor resolução de conflitos

Anteriormente, era impossível aplicar alterações tanto do lado local quanto remoto, pois a aplicação de um lado simplesmente rejeitava as alterações do outro.

Para filhos em várias funções, não é prático se as duas alterações são aplicadas. É por isso que, agora, depois de aplicar as alterações de um lado do conflito, as outras alterações conflitantes são convertidas em uma adição no final do grupo alterado. É necessário aplicá-las ou ignorá-las separadamente.

Depois de aplicar a versão esquerda do conflito, você ainda pode aplicar ou ignorar a linha do lado direito: