Knowledge base: Warsaw University of Technology

Settings and your account

Back

Augmenting and Extending Java Language Using Annotation Processing API and AST Transformations During Compilation

Arkadiusz Ryszewski

Abstract

In this research we examine internal implementation details of javac compiler, exploring opportunities to augment Java language and introduce completely new functionalities, utilizing special annotations combined with extraordinary use of compilation phase known as Annotation Processing. Business analysis starts with problem introduction followed by case study in which we inspect typical boilerplate code example - injecting fields through constructor parameters. We propose a solution that automatically generates field and creates assignment of parameter to generated field, whenever constructor parameter is annotated with one of annotations specifically designed for this purpose. Our feature allows for constructor injection in the most compact form, drastically increasing programmer's convenience and code clarity. Executive summary contains overview of our product named Kendal, its purpose, use cases and method of operation. Later on we define requirements regarding extensibility, compatibility, constraints validation, documentation and auxiliary tool in a form of plugin enhancing the most popular Java IDE - IntelliJ IDEA. Technical analysis contains comprehensive explanation of compilation process in javac compiler, with special attention to aspects on which project Kendal is based. We describe internal APIs, compiler classes and concept of AST tree. As a conclusion, minimal code sample allowing us to bootstrap AST modification framework is presented. We establish architecture of the framework and present Kendal API, serving as extension point to create custom features with minimal knowledge of compilation process. Regarding testing, we show how to ensure complete coverage of numerous types of scenarios using jtreg - testing framework used to test entire JDK, offering advanced compilation testing capabilities. Ecosystem of IntelliJ platform plugins is introduced and elements useful for Kendal support identified. In post-development analysis we extensively present essential implementation details, adjustments of final product relative to original ideas, unexpected problems, framework and plugin release model and most importantly set of valuable features contained within the framework. Features include: TypeScript fields - feature allowing automatic field and value assignment generation, based on annotation put on constructor parameter; @Clone - building abstraction layers on top of existing methods, flexibly separating additional logic and implicitly reusing existing code in order to generate new methods with minimal effort; String interpolation - strings literals promoted with unary plus (our interpolation operator) may contain any expression inside ${}, which results in replacing expression substring with actual value of the expression; annotation inheritance - extension to Java annotations, allowing parameters and Kendal handlers to be inherited as well as getting past the restriction on types of arguments, including possibility to construct value depending on other arguments. Conclusions chapter investigates future perspectives for the project. Framework is easily extensible. We outlined two examples of features: default parameters and yield functions returning multiple values. Support for wider range of Java versions and compilers would be also desirable, since we support only javac and Java 8. Finally, plugin supports all key functionalities, but numerous "nice to have" features would still improve the experience. Most useful resource from practical point of view is user manual, available as appendix to thesis paper and as HTML webpage hosted on GitHub Pages. Contents include simple tutorial demonstrating how to include Kendal in a project, how to implement custom handler and how to use our features. Every feature has a description and code samples exemplifying how to achieve the same result in vanilla Java versus in Java boosted by Kendal.
Diploma type
Engineer's / Bachelor of Science
Diploma type
Engineer's thesis
Author
Arkadiusz Ryszewski (FMIS) Arkadiusz Ryszewski,, Faculty of Mathematics and Information Science (FMIS)
Title in Polish
Modyfikowanie oraz rozszerzanie języka Java poprzez procesowanie adnotacji i transformacje drzewa AST w trakcie kompilacji
Supervisor
Agnieszka Jastrzębska (FMIS/DSMKP) Agnieszka Jastrzębska,, Department of Structural Methods for Knowledge Processing (FMIS/DSMKP)Faculty of Mathematics and Information Science (FMIS)
Certifying unit
Faculty of Mathematics and Information Science (FMIS)
Affiliation unit
Department of Structural Methods for Knowledge Processing (FMIS/DSMKP)
Study subject / specialization
, Informatyka (Computer Science)
Language
(en) English
Status
Finished
Defense Date
07-02-2019
Issue date (year)
2019
Reviewers
Marcin Luckner (FMIS/DSMKP) Marcin Luckner,, Department of Structural Methods for Knowledge Processing (FMIS/DSMKP)Faculty of Mathematics and Information Science (FMIS) Marcin Luckner (FMIS/DSMKP) Marcin Luckner,, Department of Structural Methods for Knowledge Processing (FMIS/DSMKP)Faculty of Mathematics and Information Science (FMIS) Agnieszka Jastrzębska (FMIS/DSMKP) Agnieszka Jastrzębska,, Department of Structural Methods for Knowledge Processing (FMIS/DSMKP)Faculty of Mathematics and Information Science (FMIS) Agnieszka Jastrzębska (FMIS/DSMKP) Agnieszka Jastrzębska,, Department of Structural Methods for Knowledge Processing (FMIS/DSMKP)Faculty of Mathematics and Information Science (FMIS)
Keywords in Polish
Java, javac, adnotacja, kompilacja, framework, AST, kod, boilerplate, narzędzie
Keywords in English
Java, javac, annotation, compilation, framework, AST, code, boilerplate, tool
Abstract in Polish
W niniejszej pracy rozważamy wewnętrzne szczegóły implementacyjne kompilatora javac, badając możliwości rozszerzania języka Java i wprowadzania funkcjonalności za pomocą specjalnych adnotacji oraz nietypowego wykorzystania fazy kompilacji znanej jako Procesowanie Adnotacji. Analiza biznesowa zawiera wstęp do problemu, po czym w studium przypadku weryfikujemy typowy przypadek zjawiska boilerplate code - wstrzykiwanie pól przez parametry konstruktora. Proponujemy rozwiązanie, które automatycznie generuje pole oraz tworzy przypisanie parametru do wygenerowanego pola, ilekroć parametr konstruktora jest oznaczony jedną ze specjalnie w tym celu zaprojektowanych adnotacji. Nasza funkcjonalność pozwala wstrzykiwać pola przez konstruktor w najbardziej zwięzłej formie, drastycznie podnosząc wygodę programisty i przejrzystość kodu. Streszczenie wykonawcze zawiera przegląd naszego produktu o nazwie Kendal, celów, przypadków użycia i sposobu działania. Następnie definiujemy wymagania dotyczące rozszerzalności, kompatybilności, walidacji użycia, dokumentacji i narzędzia pomocniczego w formie pluginu usprawniającego pracę z najpopularniejszym IDE do języka Java - IntelliJ IDEA. Analiza techniczna zawiera obszerne wyjaśnienie procesu kompilacji w javac ze szczególną uwagą poświęconą aspektom, na których bazuje projekt Kendal. Opisujemy wewnętrzne API, klasy kompilatora i koncepcję drzewa AST. Jako konkluzję, prezentujemy przykład kodu pozwalający uruchomić framework modyfikujący AST. Ustanawiamy architekturę frameworku i prezentujemy Kendal API, służące za punkt wyjścia do tworzenia własnych funkcjonalności, w sposób nie wymagający szczegółowej znajomości kompilatora. Odnośnie testów, pokazujemy jak zapewnić kompletne pokrycie licznych typów scenariuszy używając jtreg - frameworku stworzonego do testowania JDK, oferującego zaawansowane możliwości testowania kompilacji. Przedstawiamy ekosystem pluginów do platformy IntelliJ i identyfikujemy elementy potrzebne do naszych celów. W analizie powykonawczej wyczerpująco prezentujemy szczegóły implementacyjne, poprawki finalnego produktu względem oryginalnych planów, nieoczekiwane problemy, sposób publikowania frameworku oraz pluginu i zbiór wartościowych funkcjonalności, w tym: TypeScript Fields - automatyczne generowanie pól, w oparciu o adnotację umieszczoną na parametrze konstruktora; @Clone - budowanie warstwy abstrakcji nad istniejącymi metodami, separując dodatkową logikę i niejawnie wykorzystując istniejący kod w celu wygenerowania nowych metod małym wysiłkiem; Interpolacja - dosłowne ciągi znaków oznaczone unarnym operatorem plus mogą zawierać wyrażenia wewnątrz ${}, co powoduje zastąpienie podciągu z wyrażeniem wartością wyrażenia; dziedziczenie adnotacji - rozszerzenie systemu adnotacji, pozwalające na dziedziczenie parametrów i handlerów frameworku Kendal, a także ominięcie ograniczenia na typy argumentów i umożliwienie definiowania argumentów w oparciu o wartości innych argumentów. We wnioskach badamy przyszłe perspektywy rozwoju. Framework jest łatwo rozszerzalny. Nakreśliliśmy dwa pomysły: domyślne parametry i generatory - funkcje zwracające wiele wartości. Wsparcie dla szerszego zakresu wersji Javy oraz kompilatorów byłoby również pożądane, gdyż wspieramy tylko javac i Javę 8. Plugin wspiera wszystkie kluczowe funkcjonalności, natomiast są możliwe pomniejsze usprawnienia, które jeszcze bardziej poprawiłyby komfort pracy. Najbardziej pomocnym zasobem dla użytkownika jest instrukcja, dostępna jako appendix oraz jako strona HTML hostowana w usłudze GitHub Pages. Instrukcja zawiera prosty tutorial demonstrujący jak dodać framework Kendal do projektu, jak stworzyć własny handler i jak korzystać z naszych funkcjonalności. Każda funkcjonalność ma opis i przykłady użycia, pokazujące jak otrzymać ten sam efekt za pomocą czystej Javy oraz Javy ulepszonej przez Kendal.
File
  • File: 1
    BSc_Thesis.pdf
Request a WCAG compliant version
Local fields
Identyfikator pracy APD: 29750

Uniform Resource Identifier
https://repo.pw.edu.pl/info/bachelor/WUT7c1dbbbf676a4b8194c1dffef55fca26/
URN
urn:pw-repo:WUT7c1dbbbf676a4b8194c1dffef55fca26

Confirmation
Are you sure?
Report incorrect data on this page