diff --git a/README.md b/README.md index 133cd58..4c097de 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,64 @@ # GumTree -The implementation of GumTree algorithm in Kotlin. +[![codecov](https://codecov.io/github/Xanonymous-GitHub/gumtree/graph/badge.svg?token=APHSDWWVC4)](https://codecov.io/github/Xanonymous-GitHub/gumtree) + +**Description:** + +GumTree is a Kotlin library for implementing the GumTree algorithm. + +The origin paper can be found at [here](https://doi.org/10.1145/2642937.2642982) + +**Getting Started** + +1. **Prerequisites:** + * **JDK:** Gumtree requires JDK 21 to build and run. + +2. **Clone the Repository:** + ```bash + git clone git@github.com:Xanonymous-GitHub/gumtree.git + ``` + +3. **Build the Project:** + ```bash + ./gradlew build + ``` + +> [!NOTE] +> This also runs the tests. + +4. **Run Unit Tests:** + ```bash + ./gradlew test + ``` + +> [!TIP] +> Human-readable unit tests report generated by Kover can be found in `build/reports/kover/html/index.html`. +> The build folder is generated in each Gradle subproject after running the `test` task. + +**Usages** + +This project currently supports converting ANTLR's parse tree to `GumTree`. +Assume we have a file, and `UrlLexer` and `UrlParser` are the lexer and parser for URLs. +Then we can convert the file to a `GumTree` as follows: + +```kotlin +// This API is defined in the `antlr-bridge` module. + +val file = File("src/test/kotlin/data/urls.txt") +val inputStream = file.inputStream() +runBlocking { + GumTreeConverter.convertFrom(inputStream, ::UrlLexer, ::UrlParser, UrlParser::url) +} +``` + +You can use the `DiffCalculator` class to compute the edit script between two `GumTree`s. + +```kotlin +val (tree1, tree2) = treePair +val calculator = DiffCalculator() + +runBlocking { + val editScript = calculator.computeEditScriptFrom(tree1 to tree2) + assertEquals(7, editScript.size) +} +```