• Nenhum resultado encontrado

4.4 Linguagem de An´ alise

4.4.2 Extra¸c˜ ao de Informa¸c˜ oes

Express˜oes de verifica¸c˜ao estrutural s˜ao importantes para a identifica¸c˜ao de caracter´ısticas no c´odigo objeto, mas isoladamente n˜ao s˜ao de nenhuma utilidade. Estas express˜oes s˜ao sempre utilizadas em combina¸c˜ao com outros comandos da linguagem para que realmente tenham seu papel na transforma¸c˜ao. J´a vimos que uma possibilidade ´e utiliz´a-las como express˜oes booleanas em comandos de fluxo condicional e pr´e-condi¸c˜oes. No entanto, al´em disto ´e poss´ıvel utiliz´a-las como predicados em comandos de compreens˜ao de conjuntos para extra¸c˜ao de informa¸c˜oes.

Em refatora¸c˜oes ´e comum a necessidade de se extrair informa¸c˜oes espalhadas pelo c´odigo. Na refatora¸c˜ao Extract Method, por exemplo, ´e necess´aria a an´alise do c´odigo para identifica¸c˜ao da lista de parˆametros e do tipo de retorno do m´etodo criado. O

4.4 LINGUAGEM DE AN ´ALISE 69

processo de an´alise inclui:

• Travessia do c´odigo do bloco extra´ıdo para identifica¸c˜ao de referˆencias a vari´aveis declaradas no escopo local do m´etodo de origem. Estas s˜ao candidatas a parˆametros do novo m´etodo;

• Identifica¸c˜ao de vari´aveis declaradas no escopo do m´etodo de origem, por´em, so- mente utilizadas pelo bloco de c´odigo extra´ıdo. Estas devem se tornar vari´aveis locais;

• Verifica¸c˜ao das vari´aveis locais ao escopo do m´etodo de origem para garantia de que n˜ao s˜ao modificadas pelo bloco de c´odigo extra´ıdo e acessadas ap´os este bloco. Caso haja tal vari´avel, deve ser o retorno do novo m´etodo. Caso haja mais de uma, o bloco n˜ao pode ser extra´ıdo.

Em an´alises deste tipo, o ideal ´e que o usu´ario n˜ao precise se preocupar com a l´ogica de travessia da ´arvore, mas sim com a condi¸c˜ao que identifica a informa¸c˜ao que ele deseja extrair. Por isto introduzimos na linguagem o comando de compreens˜ao de conjuntos. Atrav´es dele ´e poss´ıvel se expressar consultas sobre o c´odigo de forma declarativa e independente da estrutura da ´arvore. Por exemplo, as Listagens 4.20 e 4.20 mostram a simplifica¸c˜ao de dois templates utilizados para compor uma transforma¸c˜ao de extra¸c˜ao de m´etodo. Dado que o bloco extra´ıdo ´e mapeado `a vari´avel #codigo, podemos utilizar o seguinte comando para constru¸c˜ao da lista de argumentos #args:

NameList args <- #{ Name :# var | scope [# codigo ]

&& ( dec (# var ) <<+ # params ) || ( dec (# var ) <<+ # contexto ) }#;

onde scope[...] indica o escopo de atua¸c˜ao do predicado. Este recurso funciona como um operador de corte que restringe o espa¸co de atua¸c˜ao das express˜oes que o seguem. Sua declara¸c˜ao ´e opcional, por´em sua posi¸c˜ao de ocorrˆencia deve ser sempre antes das express˜oes de an´alise.

Outra novidade para o leitor ´e a ocorrˆencia da fun¸c˜ao dec(<var>) que retorna o n´o de declara¸c˜ao do nome mapeado `a vari´avel <var>. As fun¸c˜oes pr´e-definidas da linguagem s˜ao apresentadas na Tabela 4.1.

Portanto, a express˜ao do exemplo anterior representa o conjunto de todas as vari´aveis que ocorrem no bloco #codigo (leitura e acesso) e suas declara¸c˜oes estejam na lista de parˆametros ou no corpo (exceto o bloco extra´ıdo) do m´etodo de origem.

4.4 LINGUAGEM DE AN ´ALISE 70

Listagem 4.20 Exemplo simplificado de extra¸c˜ao de m´etodo (casamento). void # metodo ( ParameterList :# params ) {

ContextDeclaration :# contexto {# codigo }; }

Listagem 4.21 Exemplo simplificado de extra¸c˜ao de m´etodo (gera¸c˜ao). void # metodo ( ParameterList :# params ) {

ContextDeclaration :# contexto { novoMetodo ( NameList :# args ) }; }

void novoMetodo ( ParameterList :# novosParams ) { StatementList :# codigo ;

}

Evidentemente, este exemplo ´e uma simplifica¸c˜ao da solu¸c˜ao ideal para extra¸c˜ao de listas de argumentos. Ele n˜ao leva em considera¸c˜ao, por exemplo, a possibilidade da vari´avel se tornar uma declara¸c˜ao no novo m´etodo. Por´em, o prop´osito aqui foi apenas familiarizar o leitor com os conceitos e a sintaxe da constru¸c˜ao. De fato, a extens˜ao desta solu¸c˜ao para cobrir restri¸c˜oes mais elaboradas pode ser realizada atrav´es da composi¸c˜ao de express˜oes JaTS-AL um pouco mais extensas. No Cap´ıtulo 6 apresentamos constru¸c˜oes mais rebuscadas na solu¸c˜ao da refatora¸c˜ao Extract Method.

Fun¸c˜ao Tipo de retorno Descri¸c˜ao

dec(<jats_var>) N´o da ´arvore Retorna a declara¸c˜ao da vari´avel a que <jats_var> est´a associada.

javaType(<jats_var>) Nome Retorna o tipo Java da vari´avel re-

presentada por <jats_var>.

nodeType(<jats_var>) Nome Retorna o tipo da estrutura repre-

sentada por <jats_var>.

CAP´ITULO 5

ASPECTOS DE IMPLEMENTAC¸ ˜AO

Eu nunca trabalhei um dia na minha vida. Era tudo divers˜ao. —THOMAS EDISON

Todo o sistema JaTS e suas extens˜ao foram implementados em Java [GJSB00]. Nas sub-se¸c˜oes a seguir abordaremos quest˜oes espec´ıficas da implementa¸c˜ao do sis- tema. Para isto, iniciaremos com um breve esclarecimento sobre a arquitetura original do sistema JaTS e, a partir da´ı, detalharemos os procedimentos realizados para imple- menta¸c˜ao das extens˜oes da linguagem de templates e do arcabou¸co desenvolvido para o suporte `a linguagem de meta-programa¸c˜ao e an´alise.

5.1 ARQUITETURA DE JATS

Dois m´odulos principais comp˜oem o sistema JaTS: (i) o m´odulo respons´avel por ati- vidades de entrada e sa´ıda, como parsing e pretty-printer e (ii) o m´odulo respons´avel pela realiza¸c˜ao de transforma¸c˜oes. As transforma¸c˜oes s˜ao realizadas em trˆes etapas: ca- samento, substitui¸c˜ao e processamento, como mostramos no Cap´ıtulo 3. A Figura 5.1 mostra a rela¸c˜ao entre estas entidades.

Um tipo de dado comum, chamado INode, permite o trˆansito de informa¸c˜oes entre os componentes do sistema. Este tipo ´e uma interface que define a estrutura b´asica que todo n´o da ´arvore sint´atica deve atender. Nela est˜ao definidos os servi¸cos b´asicos que permitem a realiza¸c˜ao de transforma¸c˜oes, segundo mostra a Figura 5.2.

As opera¸c˜oes de substitui¸c˜ao de valores e impress˜ao da ´arvores s˜ao implementadas atrav´es do padr˜ao de projeto Visitor [GHJV94]. Por isto a presen¸ca do m´etodo accept na interface INode. J´a as opera¸c˜oes de casamento e processamento s˜ao definidas nos pr´oprios n´os, obedecendo ao padr˜ao Interpreter [GHJV94]. Sua l´ogica de execu¸c˜ao est´a presente nos m´etodos match e process respectivamente.

5.1 ARQUITETURA DE JATS 72

Figura 5.1 Arquitetura de JaTS

5.1 ARQUITETURA DE JATS 73

Documentos relacionados