├── SNexample ├── project │ ├── build.properties │ ├── plugins.sbt │ ├── metals.sbt │ ├── project │ │ ├── metals.sbt │ │ ├── project │ │ │ └── metals.sbt │ │ └── .bloop │ │ │ ├── bloop.settings.json │ │ │ └── test-build-build.json │ └── .bloop │ │ └── bloop.settings.json ├── build.sbt └── src │ └── main │ └── scala │ └── main.scala ├── ZoneAllocation ├── project │ ├── build.properties │ ├── plugins.sbt │ ├── metals.sbt │ ├── project │ │ ├── metals.sbt │ │ ├── project │ │ │ └── metals.sbt │ │ └── .bloop │ │ │ └── bloop.settings.json │ └── .bloop │ │ └── bloop.settings.json ├── build.sbt └── src │ └── main │ └── scala │ └── main.scala ├── StackAllocation ├── project │ ├── build.properties │ ├── plugins.sbt │ ├── metals.sbt │ ├── project │ │ ├── metals.sbt │ │ ├── project │ │ │ └── metals.sbt │ │ └── .bloop │ │ │ └── bloop.settings.json │ └── .bloop │ │ └── bloop.settings.json ├── build.sbt └── src │ └── main │ └── scala │ └── main.scala ├── NativeCodeInteroperability ├── project │ ├── build.properties │ ├── plugins.sbt │ ├── metals.sbt │ ├── project │ │ ├── metals.sbt │ │ ├── project │ │ │ └── metals.sbt │ │ └── .bloop │ │ │ └── bloop.settings.json │ └── .bloop │ │ └── bloop.settings.json ├── build.sbt └── src │ ├── resources │ └── scala-native │ │ └── myapi.c │ └── main │ └── scala │ └── main.scala ├── pipeline.jpg ├── .gitignore ├── troubleshooting └── readme.md └── readme.md /SNexample/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.8.0 2 | -------------------------------------------------------------------------------- /ZoneAllocation/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.8.0 2 | -------------------------------------------------------------------------------- /StackAllocation/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.8.0 2 | -------------------------------------------------------------------------------- /NativeCodeInteroperability/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.8.0 2 | -------------------------------------------------------------------------------- /pipeline.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Abdullahsab3/scala-native-intro/HEAD/pipeline.jpg -------------------------------------------------------------------------------- /SNexample/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.11") 2 | -------------------------------------------------------------------------------- /StackAllocation/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.11") 2 | -------------------------------------------------------------------------------- /ZoneAllocation/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.11") 2 | -------------------------------------------------------------------------------- /NativeCodeInteroperability/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.11") 2 | -------------------------------------------------------------------------------- /SNexample/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | 3 | ThisBuild / scalaVersion := "3.2.2" 4 | 5 | lazy val root = (project in file(".")) 6 | .settings( 7 | name := "SNexample" 8 | ) 9 | -------------------------------------------------------------------------------- /SNexample/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /SNexample/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /StackAllocation/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | 3 | ThisBuild / scalaVersion := "3.2.2" 4 | 5 | lazy val root = (project in file(".")) 6 | .settings( 7 | name := "StackAllocation" 8 | ) 9 | -------------------------------------------------------------------------------- /StackAllocation/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /ZoneAllocation/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | 3 | ThisBuild / scalaVersion := "3.2.2" 4 | 5 | lazy val root = (project in file(".")) 6 | .settings( 7 | name := "ZoneAllocation" 8 | ) 9 | -------------------------------------------------------------------------------- /ZoneAllocation/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /ZoneAllocation/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /NativeCodeInteroperability/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /SNexample/project/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /StackAllocation/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /StackAllocation/project/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /ZoneAllocation/project/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /NativeCodeInteroperability/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | 3 | ThisBuild / scalaVersion := "3.2.2" 4 | 5 | lazy val root = (project in file(".")) 6 | .settings( 7 | name := "InteroperabilityExample" 8 | ) 9 | -------------------------------------------------------------------------------- /NativeCodeInteroperability/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /NativeCodeInteroperability/project/project/project/metals.sbt: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT! This file is auto-generated. 2 | 3 | // This file enables sbt-bloop to create bloop config files. 4 | 5 | addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.5.6") 6 | 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /benchOutput/ 2 | /logs/ 3 | /.d8_history 4 | /.ensime 5 | /.metals 6 | /TODO.org 7 | *target/ 8 | /project/project 9 | /project/.bloop 10 | /project/metals.sbt 11 | /.bloop 12 | .ensime_cache 13 | *.dot 14 | *.log 15 | .idea/ 16 | .DS_Store 17 | /target/ 18 | *.csv 19 | *.png 20 | *.svg 21 | /.idea 22 | *.diff 23 | /.vscode 24 | .bsp/sbt.json 25 | code/**/*.semanticdb 26 | *.Rds 27 | .venv 28 | .vimsession.vim 29 | .bsp 30 | out/ 31 | *.dep 32 | *.zo 33 | __pycache__ 34 | stats/ 35 | -------------------------------------------------------------------------------- /SNexample/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /SNexample/project/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /StackAllocation/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /ZoneAllocation/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /StackAllocation/project/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /ZoneAllocation/project/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /NativeCodeInteroperability/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /NativeCodeInteroperability/project/project/.bloop/bloop.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javaSemanticDBVersion": "0.8.13", 3 | "semanticDBVersion": "4.7.1", 4 | "supportedScalaVersions": [ 5 | "2.13.10", 6 | "2.12.17", 7 | "2.12.16", 8 | "2.12.15", 9 | "2.12.14", 10 | "2.13.7", 11 | "2.13.8", 12 | "2.13.9", 13 | "2.11.12", 14 | "2.12.10", 15 | "2.12.11", 16 | "2.12.12", 17 | "2.12.13", 18 | "2.13.3", 19 | "2.13.4", 20 | "2.13.5", 21 | "2.13.6" 22 | ] 23 | } -------------------------------------------------------------------------------- /ZoneAllocation/src/main/scala/main.scala: -------------------------------------------------------------------------------- 1 | import scalanative.unsafe._ 2 | 3 | def updateAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 4 | for(i <- 0 to numberOfAges) 5 | do 6 | !(ages + i) = !(ages + i) + 1 7 | 8 | def updateAge(ages: Ptr[CInt], index: CInt): Unit = 9 | !(ages + index) = !(ages + index) + 1 10 | 11 | def printAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 12 | print("Ages are: ") 13 | for(i <- 0 until numberOfAges) 14 | do 15 | print(s"${!(ages + i)} ") 16 | println() 17 | 18 | def generateAges(numberOfAges: CInt): Unit = 19 | /* Allocate memory in the zone 20 | * All the allocated memory is zeored out. */ 21 | Zone { implicit z => 22 | val ages : Ptr[CInt] = alloc[CInt](numberOfAges) 23 | printAges(ages, numberOfAges) 24 | updateAges(ages, numberOfAges) 25 | printAges(ages, numberOfAges) 26 | updateAge(ages, 4) 27 | printAges(ages, numberOfAges) 28 | } 29 | /* When the execution of the Zone is finished 30 | * the zone allocator will free all the manually 31 | * allocated memory */ 32 | 33 | object Main: 34 | def main(args: Array[String]): Unit = 35 | val numberOfAges = 10 36 | generateAges(numberOfAges) -------------------------------------------------------------------------------- /StackAllocation/src/main/scala/main.scala: -------------------------------------------------------------------------------- 1 | import scalanative.unsafe._ 2 | 3 | // Loop over the allocated memory and increment with 1 4 | def updateAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 5 | for(i <- 0 to numberOfAges) 6 | do 7 | !(ages + i) = !(ages + i) + 1 8 | 9 | /* Increment one element in the allocated memory 10 | * given its index in the allocated array. */ 11 | def updateAge(ages: Ptr[CInt], index: CInt): Unit = 12 | !(ages + index) = !(ages + index) + 1 13 | 14 | def printAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 15 | print("Ages are: ") 16 | for(i <- 0 until numberOfAges) 17 | do 18 | print(s"${!(ages + i)} ") 19 | println() 20 | 21 | def generateAges(numberOfAges: CInt): Unit = 22 | /* Allocate memory on the stack. 23 | * All the allocated memory is zeored out. */ 24 | val ages : Ptr[CInt] = stackalloc[CInt](numberOfAges) 25 | printAges(ages, numberOfAges) 26 | updateAges(ages, numberOfAges) 27 | printAges(ages, numberOfAges) 28 | // increment the 4th element of the array 29 | updateAge(ages, 4) 30 | printAges(ages, numberOfAges) 31 | /* Once the method is finished executing, 32 | * all the allocated stack memory will be freed. */ 33 | 34 | object Main: 35 | def main(args: Array[String]): Unit = 36 | val numberOfAges = 10 37 | generateAges(numberOfAges) 38 | -------------------------------------------------------------------------------- /NativeCodeInteroperability/src/resources/scala-native/myapi.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | typedef struct article { 6 | char *title; 7 | int year; 8 | } Article; 9 | 10 | Article *make_article(char *title, int year) { 11 | Article *new = (Article *)malloc(sizeof(Article)); 12 | new->year = year; 13 | new->title = (char *)malloc(sizeof(char) * (strlen(title) + 1)); 14 | strcpy(new->title, title); 15 | return new; 16 | }; 17 | 18 | void free_article(Article *t) { 19 | free(t->title); 20 | free(t); 21 | } 22 | 23 | void free_articles(Article **articles, int number_of_articles) { 24 | for(int i = 0; i < number_of_articles; i++) { 25 | free_article(articles[i]); 26 | } 27 | } 28 | 29 | Article **read_articles(char *article_titles[], int release_years[], int number_of_articles) { 30 | Article **output = malloc(sizeof(Article *) * number_of_articles); 31 | for(int i = 0; i < number_of_articles; i++) { 32 | output[i] = make_article(article_titles[i], release_years[i]); 33 | } 34 | 35 | return output; 36 | } 37 | 38 | void print_articles(Article **articles, int number_of_articles) { 39 | for(int i = 0; i < number_of_articles; i++) { 40 | Article *article = articles[i]; 41 | printf("Article \"%s\" is published on %d\n", article->title, article->year); 42 | } 43 | } -------------------------------------------------------------------------------- /troubleshooting/readme.md: -------------------------------------------------------------------------------- 1 | # Troubleshooting Errors in Scala Native 2 | 3 | ## Missing Definitions While Linking 4 | 5 | The following error might occur during the linking phase when compiling Scala Native code: 6 | 7 | ``` 8 | [error] Found 1 missing definition while linking 9 | [error] Not found Member(Top(maf.lattice.interfaces.RealLattice)) 10 | [error] Undefined definitions found in reachability phase 11 | [error] (mafNative / Compile / nativeLink) Undefined definitions found in reachability phase 12 | ``` 13 | 14 | There are multiple reasons for this error: 15 | 16 | ### 1. Unreachable Code 17 | 18 | As mentioned before, Scala Native can reach, and thus compile, all the code that is in the `native` folder, and the `shared` folder (in case of cross-platform Scala projects). If you try to import or run code from other folders, such as `jvm` or `js`, the code will not compile and you will probably get an unreachability error during the linking phase. If you happen to have this problem, the only solution would be to refactor your code and remove all imports that are not reachable for Scala Native 19 | 20 | ### 2. Problems With Libraries 21 | 22 | Another potential cause of the unreachability error is that libraries (whether these are external libraries of Javalib libraries[^1]) are not fully implemented and contain some dummy stabbing implementation. Solving this error is unfortunately harder. You will have to look for an alternative implementation for that libary or maybe another library that could offer similar functionality. 23 | 24 | ### 3. All Code Is Provided and Reachable? 25 | 26 | If all the above-mentioned causes are not present and the unreachability error still occurs, you can try to clean the generated files using `sbt clean` if sbt is used. 27 | 28 | ## Fatal error: 'Exception' not found (and/or 'Memory' not found) 29 | 30 | It is not always clear what might cause this issue. Most likely it is a missing dependency. Installing the following dependency might fix the issue on Linux (Ubuntu)[^2]: 31 | 32 | ```sudo apt install libstdc++-12-dev``` 33 | 34 | 35 | 36 | [^1]: 37 | [^2]: 38 | -------------------------------------------------------------------------------- /SNexample/src/main/scala/main.scala: -------------------------------------------------------------------------------- 1 | import scala.scalanative.unsafe._ 2 | // Scala Native has bindings for a core subset of the C Standard Library 3 | import scala.scalanative.libc.stdlib.{malloc, free} 4 | import scala.scalanative.libc.string.{strlen, strcpy} 5 | import scalanative.unsigned.UnsignedRichInt 6 | import java.nio.charset.Charset 7 | 8 | type struct_article = CStruct2[CInt, CString] 9 | 10 | object Struct_factory: 11 | def make_article_pointer(year: CInt, title: CString): Ptr[struct_article] = 12 | /* Dynamically allocate heap memory for the struct and title. 13 | * The pointer returned by malloc needs to be cast to the specific pointer needed, 14 | * in this case a pointer to a struct_article. */ 15 | val new_article: Ptr[struct_article] = 16 | malloc(sizeof[struct_article]).asInstanceOf[Ptr[struct_article]] 17 | 18 | // Allocate heap memory for the string, and copy its contents to the allocated memory. 19 | val stringLength = strlen(title) + 1.toULong 20 | new_article._2 = malloc(stringLength).asInstanceOf[CString] 21 | strcpy(new_article._2, title) 22 | 23 | new_article._1 = year 24 | new_article 25 | 26 | class Article(year: CInt, title: CString): 27 | val struct_pointer = 28 | Struct_factory.make_article_pointer(year, title) 29 | 30 | /* A method to free the allocated memory. 31 | * Pointers need to be cast to a byte pointer. */ 32 | def free_pointer() = 33 | free(struct_pointer._2.asInstanceOf[Ptr[Byte]]) 34 | free(struct_pointer.asInstanceOf[Ptr[Byte]]) 35 | 36 | def article_year: CInt = struct_pointer._1 37 | def article_title: CString = struct_pointer._2 38 | 39 | def update_article(year: CInt, title: CString): Unit = 40 | struct_pointer._1 = year 41 | free(struct_pointer._2.asInstanceOf[Ptr[Byte]]) 42 | val stringLength = strlen(title) + 1.toULong 43 | strcpy(struct_pointer._2, title) 44 | 45 | override def toString(): String = 46 | // fromCString will convert the string saved inside the given pointer to a Scala String. 47 | s"Article \"${fromCString(article_title, Charset.forName("utf-8"))}\" is written in $article_year" 48 | 49 | object Main: 50 | def main(args: Array[String]): Unit = 51 | val article: Article = Article(2022, c"LIFUSO: A Tool for Library Feature Unveiling based on Stack Overflow Posts") 52 | println(article.toString()) 53 | article.update_article(2023, c"Result Invalidation for Incremental Modular Analyses") 54 | println(article.toString()) 55 | article.free_pointer() -------------------------------------------------------------------------------- /NativeCodeInteroperability/src/main/scala/main.scala: -------------------------------------------------------------------------------- 1 | import scalanative.unsafe._ 2 | import scala.scalanative.libc.stdlib.{malloc, free} 3 | import scala.scalanative.libc.string.{strlen, strcpy} 4 | import scalanative.unsigned.{ULong, UnsignedRichInt} 5 | 6 | type struct_article = CStruct2[CString, CInt] 7 | 8 | @extern 9 | object myapi: 10 | def read_articles( 11 | article_titles: Ptr[CString], 12 | release_year: Ptr[CInt], 13 | number_of_articles: CInt): Ptr[Ptr[struct_article]] = extern 14 | def free_articles(articles: Ptr[Ptr[struct_article]], number_of_articles: CInt): Unit = extern 15 | def print_articles(artciles: Ptr[Ptr[struct_article]], number_of_articles: CInt): Unit = extern 16 | 17 | object Main: 18 | def main(args: Array[String]): Unit = 19 | import myapi._ 20 | val number_of_articles: Int = 3 21 | 22 | // Allocate space on the heap for the titles and years. 23 | val article_titles_heap: Ptr[CString] = 24 | malloc(sizeof[CString]).asInstanceOf[Ptr[CString]] 25 | val release_years_heap: Ptr[CInt]= 26 | malloc(sizeof[CInt]*number_of_articles.toULong).asInstanceOf[Ptr[CInt]] 27 | 28 | val article_titles: Array[CString] = 29 | Array[CString]( 30 | c"Result Invalidation for Incremental Modular Analyses", 31 | c"A Delta-Debugging Approach to Assessing the Resilience of Actor Programs through Run-time Test Perturbations", 32 | c"Towards Tracking Thread Interferences during Abstract Interpretation of Concurrent Programs") 33 | val release_years: Array[CInt] = Array[CInt](2022, 2020, 2015) 34 | 35 | // copy the titles and years to the heap. 36 | for(i <- 0 until number_of_articles) 37 | do 38 | val stringLength: ULong = strlen(article_titles(i)) + 1.toULong 39 | article_titles_heap(i) = malloc(stringLength).asInstanceOf[CString] 40 | strcpy(article_titles_heap(i), article_titles(i)) 41 | release_years_heap(i) = release_years(i) 42 | 43 | // pass the pointers of the arrays to the C functions 44 | val articles: Ptr[Ptr[struct_article]] = 45 | read_articles(article_titles_heap, release_years_heap, number_of_articles) 46 | print_articles(articles, number_of_articles) 47 | 48 | // Free all the heap allocated memory. 49 | free_articles(articles, number_of_articles) 50 | for(i <- 0 until number_of_articles) 51 | do 52 | free(article_titles_heap(i).asInstanceOf[Ptr[Byte]]) 53 | free(article_titles_heap.asInstanceOf[Ptr[Byte]]) 54 | free(release_years_heap.asInstanceOf[Ptr[Byte]]) 55 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | General knowledge in programming and Scala is assumed. 2 | 3 | 4 | # A Gentle Introduction to Scala Native 5 | 6 | Scala Native is an ahead-of-time compiler and runtime designed for 7 | Scala. It makes it possible to integrate low-level code with Scala code 8 | and compile them to machine code (using LLVM), which will run natively 9 | on the host machine, instead of running on the JVM. 10 | 11 | The goal of Scala Native is to reduce the memory usage overhead of the 12 | JVM that is the result of the JIT compiler and the dynamic class loading 13 | [^1]. Given that Scala Native compiles code directly 14 | to machine code before its execution and this code gets executed 15 | natively on the host machine, the startup time of Scala Native programs 16 | is significantly lower than Scala programs that run on the JVM. 17 | Scala Native also offers the possibility to interoperate with low-level 18 | languages such as C, which will be discussed later in this guide. 19 | 20 | # The Scala Native Pipeline 21 | 22 | Understanding how Scala Native works allows us to understand the meaning 23 | of the different errors that we might encounter while writing code with 24 | Scala Native which helps us write better 25 | code with Scala Native.[^1] [^2] 26 | 27 | Compiling Scala code with Scala Native to an executable happens in 28 | multiple phases. These 29 | phases are illustrated in the following figure: 30 | 31 | ![Pipeline](pipeline.jpg) 32 | 33 | ### Scala Code Compilation to NIR 34 | 35 | Native Intermediate Representation (NIR) is a representation which 36 | consists of a subset of LLVM IR instructions and values, enriched by 37 | instructions to represent high-level operands, such as classes and 38 | traits, and operations, such as classOf. 39 | 40 | One of the main advantages of NIR is that it is strongly typed. It 41 | stores for example additional information about a given class that is 42 | stored in the memory. This allows the optimiser to perform more 43 | optimisations on the compiled code. 44 | 45 | The first stage of the pipeline is compiling the Scala source code to 46 | NIR. This happens by the `nscplugin`, which is a plugin for Scala Native 47 | that attaches to the Scala compiler. The plugin inspects the abstract 48 | syntax tree of the Scala sources and generates `.nir` files. 49 | 50 | ### Linking the NIR Sources 51 | 52 | After compiling all the Scala sources to NIR, the linker will then join 53 | all the `.nir` files that were produced by the plugin, as well as `.nir` 54 | files of external libraries on which the project depends. 55 | 56 | ### Optimizing The Code 57 | 58 | Once all the NIR sources are linked, the optimizer will optimize them. 59 | An example of these optimisations is partial evaluation, which will 60 | evaluate instructions that have predictable results at compile time. [^3] 61 | 62 | ### Translating NIR Sources to LLVM IR 63 | 64 | After optimizing the NIR code, additional code will be generated, such 65 | as the entry point of the program, which contains the entry point 66 | defined by the user along with the preparation of the context execution, 67 | such as initializing some classes that need to be initialized. virtual 68 | method tables will also be created in the code generation phase. 69 | 70 | After that, the NIR high level instructions will be translated to 71 | low-level instructions that can be understood by the LLVM compiler, and 72 | the LLVM IR headers will be added to the code. 73 | 74 | ### Building an Executable 75 | 76 | Once the Scala code is compiled to LLVM IR, the LLVM compiler will 77 | compile the native sources together with the LLVM IR sources, and will 78 | link them to build the application. 79 | 80 | # Scala Native Memory Management 81 | 82 | Scala Native comes with a garbage collector (Immix by default) that 83 | automatically manages memory for objects. This garbage collector is 84 | built to run natively on the host machine. 85 | 86 | Memory can also be manually allocated for C types[^5]. This could be 87 | useful to interact with external C functions that have pointers as 88 | arguments, or to improve the performance of a Scala Native program by 89 | minimizing the amount of work the garbage collector has to do. The state 90 | of the instances of a class that is frequently used can for example be 91 | encoded in a byte sequence and manually stored in the memory, reducing 92 | the amount of work of the garbage collector, which might improve the 93 | performance of the program. 94 | 95 | This is different than the Scala memory model, which relies on the JVM 96 | memory model. Given that Scala is compiled with the just-in-time 97 | compiler to Java Byte Code which will run on a JVM, the JVM will load 98 | classes dynamically at run time to the heap memory. Generally, the JVM 99 | will store all objects on the heap memory. Variables are references to 100 | those objects, and can be stored on the stack, e.g., when calling a 101 | function which has local variables[^6]. The garbage collection 102 | is taken care of by the JVM. Scala has no way of manually allocating 103 | memory. 104 | 105 | ## Manual Memory Allocation for C Types 106 | 107 | ### Heap Memory Allocation 108 | 109 | Heap memory can be dynamically allocated in Scala Native using the 110 | bindings that Scala Native offers for the C functions that perform 111 | dynamic heap memory manipulation[^5]. These functions are `malloc`, 112 | `free` and `realloc`. Using these functions, memory from the heap can be 113 | dynamically allocated and freed once it is no longer needed. It is the 114 | responsibility of the programmer to free the dynamically allocated heap 115 | memory; the program will have otherwise memory leaks. 116 | 117 | ### Stack Memory Allocation 118 | 119 | It is possible to manually allocate memory on the stack inside a given 120 | method [^5]. This can be useful given than the stack memory is faster 121 | than the heap memory. The allocated stack memory will be freed once the 122 | method in which they are allocated returns.. 123 | 124 | ### Zone Allocation 125 | 126 | Zones are another way to perform memory allocations [^5]. Using zones, 127 | memory can be temporarily allocated for C types on the zone heap, and 128 | once the execution leaves the defined zone, the zone allocator will free 129 | all the memory allocated inside that zone. In other words, using zones, you can have semi-automatic memory management. 130 | 131 | # Features of Scala Native 132 | 133 | ## Low-level Primitives 134 | 135 | Scala Native provides built-in equivalents of most C data types and 136 | pointers. A complete list can be found in the documentation of the 137 | `scala.scalanative.unsafe` package [^8] [^5]. The following table 138 | shows a list of the most popular ones, alongside their Scala Native 139 | equivalent. 140 | 141 | | C Type | Scala Native | 142 | |--------------------- |---------------------------------------------------------| 143 | | `void` | `Unit` | 144 | | `int` | `unsafe.CInt` | 145 | | `int*` | `unsafe.Ptr[unsafe.CInt]` | 146 | | `long` | `unsafe.CLong` | 147 | | `struct {int x, y;}*` | `unsafe.Ptr[unsafe.CStruct2[unsafe.CInt, unsafe.CInt]]` | 148 | 149 | 150 | Scala Native has also support for pointer operations, such as 151 | dereferencing a pointer variable. These operations and their Scala 152 | Native equivalents can be found in the following table: 153 | 154 | | Operation | **C syntax** | **Scala Native syntax** | 155 | |---------------------------------------|--------------------------|-------------------------| 156 | | Load a value from an address | `*ptr` | `!ptr` | 157 | | Store a value to a given address | `*ptr = value` | `!ptr = value` | 158 | | Pointer to an index | `ptr + i; &ptr[i]` | `ptr + i` | 159 | | Load a value from an index | `ptr[i]` | `ptr(i)` | 160 | | Store a value to an index | `ptr[i]` = value` | `ptr(i) = value` | 161 | | Pointer to a field of a struct | `&ptr->name` | `ptr.atN` | 162 | | Load a value from a field of a struct | `ptr->name` | `ptr._N` | 163 | | Store a value to a field of a struct | `ptr->name = value` | `ptr._N = value` | 164 | 165 | N is the index of that field in the struct. 166 | 167 | 168 | Having low-level primitives with pointer operations integrated in Scala 169 | Native allows us to directly write low-level code in Scala code, instead 170 | of relying on an implementation from a low-level language like C. 171 | 172 | ## Native Code Interoperability 173 | 174 | As we have seen from the previous sections, Scala Native offers features 175 | to write low-level code directly in Scala code, such as low-level 176 | primitive types and manual memory management. In Scala Native it is also 177 | possible to interoperate with low-level languages such as C. This could 178 | be useful when using an external C library with Scala Native for 179 | example. 180 | 181 | `extern` objects can be used to declare methods that are defined 182 | elsewhere in a native library in the library path, or in the Scala 183 | Native resources. Inside an `extern` object, the binding of the methods, 184 | with which Scala Native interoperates, should be defined. This binding 185 | is the Scala Native equivalent signature of the signature of that method 186 | in its native implementation. Below is an example of such objects. The 187 | `test` method takes two arguments, a C integer, and a pointer to a 188 | null-terminated C string. This method is defined elsewhere in native 189 | code. 190 | 191 | ``` {.scala language="Scala"} 192 | import scalanative.unsafe._ 193 | 194 | @extern 195 | object myapi { 196 | def test(a: CInt, b: CString): Unit = extern 197 | } 198 | ``` 199 | 200 | # Examples 201 | 202 | ## A Program in Scala Native 203 | 204 | This example demonstrates how low-level primitive types can be used 205 | inside Scala code using Scala Native. `Article` is a class that 206 | represents an article given its title and year. The title and year are 207 | stored dynamically on the heap memory using a C struct. the 208 | `update_article` will update the title and year of that article by 209 | dynamically updating the memory. The goal of this program is to create 210 | an article given its title and release year, print the article, update 211 | the title and the release year, and then free all the heap memory. 212 | 213 | ``` {.scala language="Scala"} 214 | import scala.scalanative.unsafe._ 215 | // Scala Native has bindings for a core subset of the C Standard Library 216 | import scala.scalanative.libc.stdlib.{malloc, free} 217 | import scala.scalanative.libc.string.{strlen, strcpy} 218 | import scalanative.unsigned.UnsignedRichInt 219 | import java.nio.charset.Charset 220 | 221 | type struct_article = CStruct2[CInt, CString] 222 | 223 | object Struct_factory: 224 | def make_article_pointer(year: CInt, title: CString): Ptr[struct_article] = 225 | /* Dynamically allocate heap memory for the struct and title. 226 | * The pointer returned by malloc needs to be cast to the specific pointer needed, 227 | * in this case a pointer to a struct_article. */ 228 | val new_article: Ptr[struct_article] = 229 | malloc(sizeof[struct_article]).asInstanceOf[Ptr[struct_article]] 230 | 231 | // Allocate heap memory for the string, and copy its contents to the allocated memory. 232 | val stringLength = strlen(title) + 1.toULong 233 | new_article._2 = malloc(stringLength).asInstanceOf[CString] 234 | strcpy(new_article._2, title) 235 | 236 | new_article._1 = year 237 | new_article 238 | 239 | class Article(year: CInt, title: CString): 240 | val struct_pointer = 241 | Struct_factory.make_article_pointer(year, title) 242 | 243 | /* A method to free the allocated memory. 244 | * Pointers need to be cast to a byte pointer. */ 245 | def free_pointer() = 246 | free(struct_pointer._2.asInstanceOf[Ptr[Byte]]) 247 | free(struct_pointer.asInstanceOf[Ptr[Byte]]) 248 | 249 | def article_year: CInt = struct_pointer._1 250 | def article_title: CString = struct_pointer._2 251 | 252 | def update_article(year: CInt, title: CString): Unit = 253 | struct_pointer._1 = year 254 | free(struct_pointer._2.asInstanceOf[Ptr[Byte]]) 255 | val stringLength = strlen(title) + 1.toULong 256 | strcpy(struct_pointer._2, title) 257 | 258 | override def toString(): String = 259 | // fromCString will convert the string saved inside the given pointer to a Scala String. 260 | s"Article \"${fromCString(article_title, Charset.forName("utf-8"))}\" is written in $article_year" 261 | 262 | object Main: 263 | def main(args: Array[String]): Unit = 264 | val article: Article = Article(2022, 265 | c"LIFUSO: A Tool for Library Feature Unveiling based on Stack Overflow Posts") 266 | println(article.toString()) 267 | article.update_article(2023, 268 | c"Result Invalidation for Incremental Modular Analyses") 269 | println(article.toString()) 270 | article.free_pointer() 271 | ``` 272 | 273 | Building the program using sbt (by running sbt run) will compile all 274 | classes, link them, generate a binary file, and run that binary. Note 275 | that since a binary file is generated, it does not necessarily need to 276 | run with sbt. 277 | 278 | abdullah@computer:~$ ./program_example--out 279 | Article "LIFUSO: A Tool for Library Feature Unveiling based on Stack Overflow Posts" is written in 2022 280 | Article "Result Invalidation for Incremental Modular Analyses" is written in 2023 281 | 282 | ## A Program with Manual Stack Allocation 283 | 284 | This examples demonstrates how the stack can be manually allocated given 285 | the type of elements which will be stored and the number of elements. In 286 | this example, an array of ages is allocated on stack and incremented by 287 | one. Then, the fourth element is incremented. 288 | 289 | ``` {.scala language="Scala"} 290 | import scalanative.unsafe._ 291 | 292 | // Loop over the allocated memory and increment with 1 293 | def updateAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 294 | for(i <- 0 to numberOfAges) 295 | do 296 | !(ages + i) = !(ages + i) + 1 297 | 298 | /* Increment one element in the allocated memory 299 | * given its index in the allocated array. */ 300 | def updateAge(ages: Ptr[CInt], index: CInt): Unit = 301 | !(ages + index) = !(ages + index) + 1 302 | 303 | def printAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 304 | print("Ages are: ") 305 | for(i <- 0 until numberOfAges) 306 | do 307 | print(s"${!(ages + i)} ") 308 | println() 309 | 310 | def generateAges(numberOfAges: CInt): Unit = 311 | /* Allocate memory on the stack. 312 | * All the allocated memory is zeored out. */ 313 | val ages : Ptr[CInt] = stackalloc[CInt](numberOfAges) 314 | printAges(ages, numberOfAges) 315 | updateAges(ages, numberOfAges) 316 | printAges(ages, numberOfAges) 317 | // increment the 4th element of the array 318 | updateAge(ages, 4) 319 | printAges(ages, numberOfAges) 320 | /* Once the method is finished executing, 321 | * all the allocated stack memory will be freed. */ 322 | 323 | object Main: 324 | def main(args: Array[String]): Unit = 325 | val numberOfAges = 10 326 | generateAges(numberOfAges) 327 | ``` 328 | 329 | Below is the result of executing this example. 330 | 331 | abdullah@computer:~$ ./program_example--out 332 | Ages are: 0 0 0 0 0 0 0 0 0 0 333 | Ages are: 1 1 1 1 1 1 1 1 1 1 334 | Ages are: 1 1 1 1 2 1 1 1 1 1 335 | 336 | ## A program with Zone Allocation 337 | 338 | This example demonstrates how the zone allocation can be used. This is 339 | the same example as the previous one, but the memory is now allocated using zones. 340 | 341 | ``` {.scala language="Scala"} 342 | import scalanative.unsafe._ 343 | 344 | def updateAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 345 | for(i <- 0 to numberOfAges) 346 | do 347 | !(ages + i) = !(ages + i) + 1 348 | 349 | def updateAge(ages: Ptr[CInt], index: CInt): Unit = 350 | !(ages + index) = !(ages + index) + 1 351 | 352 | def printAges(ages: Ptr[CInt], numberOfAges: CInt): Unit = 353 | print("Ages are: ") 354 | for(i <- 0 until numberOfAges) 355 | do 356 | print(s"${!(ages + i)} ") 357 | println() 358 | 359 | def generateAges(numberOfAges: CInt): Unit = 360 | /* Allocate memory in the zone 361 | * All the allocated memory is zeored out. */ 362 | Zone { implicit z => 363 | val ages : Ptr[CInt] = alloc[CInt](numberOfAges) 364 | printAges(ages, numberOfAges) 365 | updateAges(ages, numberOfAges) 366 | printAges(ages, numberOfAges) 367 | updateAge(ages, 4) 368 | printAges(ages, numberOfAges) 369 | } 370 | /* When the execution of the Zone is finished 371 | * the zone allocator will free all the manually 372 | * allocated memory */ 373 | 374 | object Main: 375 | def main(args: Array[String]): Unit = 376 | val numberOfAges = 10 377 | generateAges(numberOfAges) 378 | ``` 379 | 380 | ## A Program with Native Code Interoperability 381 | 382 | This example demonstrates how native code written in C can be called in 383 | Scala code. is the project folder of this example. The C functions are 384 | used to create an array of articles given an array of titles and an 385 | array of strings, and to print an array of articles. In Scala the titles 386 | and years are created and copied to the heap. The pointers of their 387 | respective arrays will then be passed to the C functions that are 388 | declared in the `extern` object and defined elsewhere in a C file. 389 | 390 | `NativeCodeInteroperability/src/resources/scala-native/myapi.c` contains the following code: 391 | 392 | ``` {.C language="C"} 393 | #include 394 | #include 395 | #include 396 | 397 | typedef struct article { 398 | char *title; 399 | int year; 400 | } Article; 401 | 402 | Article *make_article(char *title, int year) { 403 | Article *new = (Article *)malloc(sizeof(Article)); 404 | new->year = year; 405 | new->title = (char *)malloc(sizeof(char) * (strlen(title) + 1)); 406 | strcpy(new->title, title); 407 | return new; 408 | }; 409 | 410 | void free_article(Article *t) { 411 | free(t->title); 412 | free(t); 413 | } 414 | 415 | void free_articles(Article **articles, int number_of_articles) { 416 | for(int i = 0; i < number_of_articles; i++) { 417 | free_article(articles[i]); 418 | } 419 | } 420 | 421 | Article **read_articles(char *article_titles[], int release_years[], int number_of_articles) { 422 | Article **output = malloc(sizeof(Article *) * number_of_articles); 423 | for(int i = 0; i < number_of_articles; i++) { 424 | output[i] = make_article(article_titles[i], release_years[i]); 425 | } 426 | 427 | return output; 428 | } 429 | 430 | void print_articles(Article **articles, int number_of_articles) { 431 | for(int i = 0; i < number_of_articles; i++) { 432 | Article *article = articles[i]; 433 | printf("Article \"%s\" is published on %d\n", article->title, article->year); 434 | } 435 | } 436 | ``` 437 | 438 | `NativeCodeInteroperability/src/main/main.scala` contains the following code: 439 | 440 | ``` {.scala language="Scala"} 441 | import scalanative.unsafe._ 442 | import scala.scalanative.libc.stdlib.{malloc, free} 443 | import scala.scalanative.libc.string.{strlen, strcpy} 444 | import scalanative.unsigned.{ULong, UnsignedRichInt} 445 | 446 | type struct_article = CStruct2[CString, CInt] 447 | 448 | @extern 449 | object myapi: 450 | def read_articles( 451 | article_titles: Ptr[CString], 452 | release_year: Ptr[CInt], 453 | number_of_articles: CInt): Ptr[Ptr[struct_article]] = extern 454 | def free_articles(articles: Ptr[Ptr[struct_article]], number_of_articles: CInt): Unit = extern 455 | def print_articles(artciles: Ptr[Ptr[struct_article]], number_of_articles: CInt): Unit = extern 456 | 457 | object Main: 458 | def main(args: Array[String]): Unit = 459 | import myapi._ 460 | val number_of_articles: Int = 3 461 | 462 | // Allocate space on the heap for the titles and years. 463 | val article_titles_heap: Ptr[CString] = 464 | malloc(sizeof[CString]).asInstanceOf[Ptr[CString]] 465 | val release_years_heap: Ptr[CInt]= 466 | malloc(sizeof[CInt]*number_of_articles.toULong).asInstanceOf[Ptr[CInt]] 467 | 468 | val article_titles: Array[CString] = 469 | Array[CString]( 470 | c"Result Invalidation for Incremental Modular Analyses", 471 | c"A Delta-Debugging Approach to Assessing the Resilience of Actor Programs through Run-time Test Perturbations", 472 | c"Towards Tracking Thread Interferences during Abstract Interpretation of Concurrent Programs") 473 | val release_years: Array[CInt] = Array[CInt](2022, 2020, 2015) 474 | 475 | // copy the titles and years to the heap. 476 | for(i <- 0 until number_of_articles) 477 | do 478 | val stringLength: ULong = strlen(article_titles(i)) + 1.toULong 479 | article_titles_heap(i) = malloc(stringLength).asInstanceOf[CString] 480 | strcpy(article_titles_heap(i), article_titles(i)) 481 | release_years_heap(i) = release_years(i) 482 | 483 | // pass the pointers of the arrays to the C functions 484 | val articles: Ptr[Ptr[struct_article]] = 485 | read_articles(article_titles_heap, release_years_heap, number_of_articles) 486 | print_articles(articles, number_of_articles) 487 | 488 | // Free all the heap allocated memory. 489 | free_articles(articles, number_of_articles) 490 | for(i <- 0 until number_of_articles) 491 | do 492 | free(article_titles_heap(i).asInstanceOf[Ptr[Byte]]) 493 | free(article_titles_heap.asInstanceOf[Ptr[Byte]]) 494 | free(release_years_heap.asInstanceOf[Ptr[Byte]]) 495 | ``` 496 | 497 | Executing the generated binary file will print the titles of the 498 | articles and the release year of each one. 499 | 500 | ``` {.bash language="bash"} 501 | abdullah@computer:~$ ./program_example--out 502 | Article "Result Invalidation for Incremental Modular Analyses" is published on 2022 503 | Article "A Delta-Debugging Approach to Assessing the Resilience of Actor Programs through Run-time Test Perturbations" is published on 2020 504 | Article "Towards Tracking Thread Interferences during Abstract Interpretation of Concurrent Programs" is published on 2015 505 | ``` 506 | 507 | # Project Cross-compilation to Native Code 508 | 509 | Scala projects can be configured to be compiled to different platforms. 510 | That is, the Scala code can be compiled to Java bytecode, but it can 511 | also have additional build options to compile it to JavaScript (using 512 | Scala.js) or to native code (using Scala Native). This is called 513 | cross-compilation. It is possible to cross-compile Scala projects to 514 | Scala Native using `sbt-crossproject` [^9]. In order to do so, the 515 | project settings need to be modified. Here you can see an example on how to do so: 516 | 517 | In `project/plugins` the following needs to be added: 518 | 519 | ``` {.scala language="Scala"} 520 | addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.2.0") 521 | addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.9") 522 | ``` 523 | 524 | In `build.sbt` the following needs to be added or modified: 525 | 526 | ``` {.scala language="Scala"} 527 | lazy val maf = crossProject(JVMPlatform, JSPlatform, NativePlatform) 528 | .Settings(..) 529 | .jvmSettings(..) 530 | .jsSettings(..) 531 | .nativeSettings( 532 | Compile / mainClass := Some("maf.cli.runnables.AnalyzeProgram"), 533 | ) 534 | 535 | lazy val mafNative = maf.native 536 | ``` 537 | 538 | [^1]: [Wojciech Mazur. A Deep Dive into Scala Native Internals. Scala Love conference, 2021.](https://www.youtube.com/watch?v=IejfsO_P5OA&ab_channel=Konfy) 539 | 540 | [^2]: [Wojciech Mazur. Scala Native Internals Overview . Scala 3 Compiler Academy, 2022.](https://www.youtube.com/watch?v=U2GUUjxn5xQ&ab_channel=Scala3CompilerAcademy) 541 | 542 | [^3]: [Denys Shabalin and Martin Odersky. Interflow: Interprocedural Flow-Sensitive Type Inference and Method Duplication. In Proceedings of the 9th ACM SIGPLAN International Symposium on Scala, pages 61–71, 2018](https://dl.acm.org/doi/pdf/10.1145/3241653.3241660?casa_token=kFqsHWbGtvwAAAAA:J3fiYmKADBovxkavN6yc_66rz6AgHQ-apVIT447Y7cWH77mXiv0ETk0E-wIulc3mrNtc5Rofn12VUxg) 543 | 544 | [^4]: [Denys Shabalin et al. Scala Native Documentation, chapter Contributor’s Guide. EPFL, 2022. Release 0.4.9.](https://scala-native.org/en/stable/user/index.html) 545 | 546 | [^5]: [Denys Shabalin et al. Scala Native Documentation, chapter User’s Guide. EPFL, 2022. Release 0.4.9](https://scala-native.org/en/stable/contrib/index.html) 547 | 548 | [^6]: [Tim Lindholm, Frank Yellin, Gilad Bracha, Alex Buckley, and Daniel Smith. The Java Virtual Machine Specification, Java SE 8 Edition, chapter The Structure of the Java Virtual Machine. Oracle, 2022.](https://docs.oracle.com/javase/specs/jvms/se8/html/) 549 | 550 | [^7]: 551 | 552 | [^8]: 553 | 554 | [^9]: 555 | -------------------------------------------------------------------------------- /SNexample/project/project/.bloop/test-build-build.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.4.0", 3 | "project": { 4 | "name": "test-build-build", 5 | "directory": "/media/abdullah/school/BT/test/project/project", 6 | "workspaceDir": "/media/abdullah/school/BT/test/project/project", 7 | "sources": [ 8 | "/media/abdullah/school/BT/test/project/project/src/main/scala", 9 | "/media/abdullah/school/BT/test/project/project/src/main/scala-2.12", 10 | "/media/abdullah/school/BT/test/project/project/src/main/scala-2", 11 | "/media/abdullah/school/BT/test/project/project/src/main/java", 12 | "/media/abdullah/school/BT/test/project/project/src/main/scala-sbt-1.0", 13 | "/media/abdullah/school/BT/test/project/project/target/scala-2.12/sbt-1.0/src_managed/main" 14 | ], 15 | "dependencies": [ 16 | 17 | ], 18 | "classpath": [ 19 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbt/1.8.0/sbt-1.8.0.jar", 20 | "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-library.jar", 21 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/ch/epfl/scala/sbt-bloop_2.12_1.0/1.5.6/sbt-bloop-1.5.6.jar", 22 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.8.0/main_2.12-1.8.0.jar", 23 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.8.0/io_2.12-1.8.0.jar", 24 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/ch/epfl/scala/bloop-config_2.12/1.5.5/bloop-config_2.12-1.5.5.jar", 25 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.8.0/logic_2.12-1.8.0.jar", 26 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.8.0/actions_2.12-1.8.0.jar", 27 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.8.0/main-settings_2.12-1.8.0.jar", 28 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.8.0/run_2.12-1.8.0.jar", 29 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.8.0/command_2.12-1.8.0.jar", 30 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.8.0/collections_2.12-1.8.0.jar", 31 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.8.0/scripted-plugin_2.12-1.8.0.jar", 32 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.8.0/zinc-lm-integration_2.12-1.8.0.jar", 33 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.8.0/util-logging_2.12-1.8.0.jar", 34 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar", 35 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.4.1/launcher-interface-1.4.1.jar", 36 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.8.5/caffeine-2.8.5.jar", 37 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.13/lm-coursier-shaded_2.12-2.0.13.jar", 38 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1.jar", 39 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.1/log4j-core-2.17.1.jar", 40 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.17.1/log4j-slf4j-impl-2.17.1.jar", 41 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.8.0/librarymanagement-core_2.12-1.8.0.jar", 42 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.8.0/librarymanagement-ivy_2.12-1.8.0.jar", 43 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.8.0/compiler-interface-1.8.0.jar", 44 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.8.0/zinc-compile_2.12-1.8.0.jar", 45 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.9/file-tree-views-2.1.9.jar", 46 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.12.0/jna-5.12.0.jar", 47 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.12.0/jna-platform-5.12.0.jar", 48 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.12/2.4.0/jsoniter-scala-core_2.12-2.4.0.jar", 49 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.8.0/util-relation_2.12-1.8.0.jar", 50 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.8.0/completion_2.12-1.8.0.jar", 51 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.8.0/task-system_2.12-1.8.0.jar", 52 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.8.0/tasks_2.12-1.8.0.jar", 53 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.8.0/testing_2.12-1.8.0.jar", 54 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.8.0/util-tracking_2.12-1.8.0.jar", 55 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.9.1/sjson-new-scalajson_2.12-0.9.1.jar", 56 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.19.0/jline-terminal-3.19.0.jar", 57 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.8.0/zinc-classpath_2.12-1.8.0.jar", 58 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.8.0/zinc-apiinfo_2.12-1.8.0.jar", 59 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.8.0/zinc_2.12-1.8.0.jar", 60 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.8.0/core-macros_2.12-1.8.0.jar", 61 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.8.0/util-cache_2.12-1.8.0.jar", 62 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.8.0/util-control_2.12-1.8.0.jar", 63 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.8.0/protocol_2.12-1.8.0.jar", 64 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.9.1/sjson-new-core_2.12-0.9.1.jar", 65 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar", 66 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.8.0/util-position_2.12-1.8.0.jar", 67 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.8.0/zinc-compile-core_2.12-1.8.0.jar", 68 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.8.0/util-interface-1.8.0.jar", 69 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar", 70 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.19.0/jline-terminal-jna-3.19.0.jar", 71 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jansi/3.19.0/jline-terminal-jansi-3.19.0.jar", 72 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar", 73 | "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-reflect.jar", 74 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/checkerframework/checker-qual/3.4.1/checker-qual-3.4.1.jar", 75 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar", 76 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.8.1/scala-collection-compat_2.12-2.8.1.jar", 77 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.3/slf4j-api-2.0.3.jar", 78 | "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-compiler.jar", 79 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar", 80 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.7.0/gigahorse-apache-http_2.12-0.7.0.jar", 81 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e/ivy-2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e.jar", 82 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.19.0/jline-reader-3.19.0.jar", 83 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-builtins/3.19.0/jline-builtins-3.19.0.jar", 84 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-agent/1.8.0/test-agent-1.8.0.jar", 85 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar", 86 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/0.9.1/shaded-jawn-parser_2.12-0.9.1.jar", 87 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar", 88 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.8.0/compiler-bridge_2.12-1.8.0.jar", 89 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.8.0/zinc-classfile_2.12-1.8.0.jar", 90 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.8.0/zinc-core_2.12-1.8.0.jar", 91 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.8.0/zinc-persist_2.12-1.8.0.jar", 92 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.9.1/sjson-new-murmurhash_2.12-0.9.1.jar", 93 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.5.0/ipcsocket-1.5.0.jar", 94 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar", 95 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.10.1/zero-allocation-hashing-0.10.1.jar", 96 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/2.1.0/jansi-2.1.0.jar", 97 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.7.0/gigahorse-core_2.12-0.7.0.jar", 98 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpasyncclient/0.7.0/shaded-apache-httpasyncclient-0.7.0.jar", 99 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-style/3.19.0/jline-style-3.19.0.jar", 100 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.8.0/zinc-persist-core-assembly-1.8.0.jar", 101 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.1/sbinary_2.12-0.5.1.jar", 102 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.6.1/ssl-config-core_2.12-0.6.1.jar", 103 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", 104 | "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/config/1.4.2/config-1.4.2.jar" 105 | ], 106 | "out": "/media/abdullah/school/BT/test/project/project/.bloop/test-build-build", 107 | "classesDir": "/media/abdullah/school/BT/test/project/project/.bloop/test-build-build/scala-2.12/sbt-1.0/classes", 108 | "resources": [ 109 | "/media/abdullah/school/BT/test/project/project/src/main/resources", 110 | "/media/abdullah/school/BT/test/project/project/target/scala-2.12/sbt-1.0/resource_managed/main" 111 | ], 112 | "scala": { 113 | "organization": "org.scala-lang", 114 | "name": "scala-compiler", 115 | "version": "2.12.17", 116 | "options": [ 117 | "-deprecation", 118 | "-Wconf:cat=unused-nowarn:s", 119 | "-Wconf:cat=unused-nowarn:s", 120 | "-Wconf:cat=unused-nowarn:s", 121 | "-Xsource:3" 122 | ], 123 | "jars": [ 124 | "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-library.jar", 125 | "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-reflect.jar", 126 | "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-xml_2.12-2.1.0.jar", 127 | "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-compiler.jar" 128 | ], 129 | "setup": { 130 | "order": "mixed", 131 | "addLibraryToBootClasspath": true, 132 | "addCompilerToClasspath": false, 133 | "addExtraJarsToClasspath": false, 134 | "manageBootClasspath": true, 135 | "filterLibraryFromClasspath": true 136 | } 137 | }, 138 | "java": { 139 | "options": [ 140 | 141 | ] 142 | }, 143 | "sbt": { 144 | "sbtVersion": "1.8.0", 145 | "autoImports": [ 146 | "import _root_.scala.xml.{TopScope=>$scope}", 147 | "import _root_.sbt._", 148 | "import _root_.sbt.Keys._", 149 | "import _root_.sbt.nio.Keys._", 150 | "import _root_.sbt.ScriptedPlugin.autoImport._, _root_.sbt.plugins.JUnitXmlReportPlugin.autoImport._, _root_.sbt.plugins.MiniDependencyTreePlugin.autoImport._, _root_.bloop.integrations.sbt.BloopPlugin.autoImport._", 151 | "import _root_.sbt.plugins.IvyPlugin, _root_.sbt.plugins.JvmPlugin, _root_.sbt.plugins.CorePlugin, _root_.sbt.ScriptedPlugin, _root_.sbt.plugins.SbtPlugin, _root_.sbt.plugins.SemanticdbPlugin, _root_.sbt.plugins.JUnitXmlReportPlugin, _root_.sbt.plugins.Giter8TemplatePlugin, _root_.sbt.plugins.MiniDependencyTreePlugin, _root_.bloop.integrations.sbt.BloopPlugin" 152 | ] 153 | }, 154 | "test": { 155 | "frameworks": [ 156 | { 157 | "names": [ 158 | "org.scalacheck.ScalaCheckFramework" 159 | ] 160 | }, 161 | { 162 | "names": [ 163 | "org.specs2.runner.Specs2Framework", 164 | "org.specs2.runner.SpecsFramework" 165 | ] 166 | }, 167 | { 168 | "names": [ 169 | "org.specs.runner.SpecsFramework" 170 | ] 171 | }, 172 | { 173 | "names": [ 174 | "org.scalatest.tools.Framework", 175 | "org.scalatest.tools.ScalaTestFramework" 176 | ] 177 | }, 178 | { 179 | "names": [ 180 | "com.novocode.junit.JUnitFramework" 181 | ] 182 | }, 183 | { 184 | "names": [ 185 | "munit.Framework" 186 | ] 187 | }, 188 | { 189 | "names": [ 190 | "zio.test.sbt.ZTestFramework" 191 | ] 192 | } 193 | ], 194 | "options": { 195 | "excludes": [ 196 | 197 | ], 198 | "arguments": [ 199 | 200 | ] 201 | } 202 | }, 203 | "platform": { 204 | "name": "jvm", 205 | "config": { 206 | "home": "/home/abdullah/.cache/coursier/arc/https/github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_hotspot_8u292b10.tar.gz/jdk8u292-b10/jre", 207 | "options": [ 208 | "-Duser.dir=/media/abdullah/school/BT/test/project/project" 209 | ] 210 | }, 211 | "mainClass": [ 212 | 213 | ] 214 | }, 215 | "resolution": { 216 | "modules": [ 217 | { 218 | "organization": "ch.epfl.scala", 219 | "name": "sbt-bloop", 220 | "version": "1.5.6", 221 | "configurations": "default", 222 | "artifacts": [ 223 | { 224 | "name": "sbt-bloop", 225 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/ch/epfl/scala/sbt-bloop_2.12_1.0/1.5.6/sbt-bloop-1.5.6.jar" 226 | }, 227 | { 228 | "name": "sbt-bloop", 229 | "classifier": "sources", 230 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/ch/epfl/scala/sbt-bloop_2.12_1.0/1.5.6/sbt-bloop-1.5.6-sources.jar" 231 | } 232 | ] 233 | }, 234 | { 235 | "organization": "ch.epfl.scala", 236 | "name": "bloop-config_2.12", 237 | "version": "1.5.5", 238 | "configurations": "default", 239 | "artifacts": [ 240 | { 241 | "name": "bloop-config_2.12", 242 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/ch/epfl/scala/bloop-config_2.12/1.5.5/bloop-config_2.12-1.5.5.jar" 243 | }, 244 | { 245 | "name": "bloop-config_2.12", 246 | "classifier": "sources", 247 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/ch/epfl/scala/bloop-config_2.12/1.5.5/bloop-config_2.12-1.5.5-sources.jar" 248 | } 249 | ] 250 | }, 251 | { 252 | "organization": "com.github.plokhotnyuk.jsoniter-scala", 253 | "name": "jsoniter-scala-core_2.12", 254 | "version": "2.4.0", 255 | "configurations": "default", 256 | "artifacts": [ 257 | { 258 | "name": "jsoniter-scala-core_2.12", 259 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.12/2.4.0/jsoniter-scala-core_2.12-2.4.0.jar" 260 | }, 261 | { 262 | "name": "jsoniter-scala-core_2.12", 263 | "classifier": "sources", 264 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.12/2.4.0/jsoniter-scala-core_2.12-2.4.0-sources.jar" 265 | } 266 | ] 267 | }, 268 | { 269 | "organization": "org.scala-lang", 270 | "name": "scala-library", 271 | "version": "2.12.17", 272 | "configurations": "default", 273 | "artifacts": [ 274 | { 275 | "name": "scala-library", 276 | "path": "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-library.jar" 277 | }, 278 | { 279 | "name": "scala-library", 280 | "classifier": "sources", 281 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.17/scala-library-2.12.17-sources.jar" 282 | } 283 | ] 284 | }, 285 | { 286 | "organization": "org.scala-sbt", 287 | "name": "sbt", 288 | "version": "1.8.0", 289 | "configurations": "default", 290 | "artifacts": [ 291 | { 292 | "name": "sbt", 293 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbt/1.8.0/sbt-1.8.0.jar" 294 | }, 295 | { 296 | "name": "sbt", 297 | "classifier": "sources", 298 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbt/1.8.0/sbt-1.8.0-sources.jar" 299 | } 300 | ] 301 | }, 302 | { 303 | "organization": "org.scala-sbt", 304 | "name": "main_2.12", 305 | "version": "1.8.0", 306 | "configurations": "default", 307 | "artifacts": [ 308 | { 309 | "name": "main_2.12", 310 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.8.0/main_2.12-1.8.0.jar" 311 | }, 312 | { 313 | "name": "main_2.12", 314 | "classifier": "sources", 315 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.8.0/main_2.12-1.8.0-sources.jar" 316 | } 317 | ] 318 | }, 319 | { 320 | "organization": "org.scala-sbt", 321 | "name": "io_2.12", 322 | "version": "1.8.0", 323 | "configurations": "default", 324 | "artifacts": [ 325 | { 326 | "name": "io_2.12", 327 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.8.0/io_2.12-1.8.0.jar" 328 | }, 329 | { 330 | "name": "io_2.12", 331 | "classifier": "sources", 332 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.8.0/io_2.12-1.8.0-sources.jar" 333 | } 334 | ] 335 | }, 336 | { 337 | "organization": "org.scala-sbt", 338 | "name": "logic_2.12", 339 | "version": "1.8.0", 340 | "configurations": "default", 341 | "artifacts": [ 342 | { 343 | "name": "logic_2.12", 344 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.8.0/logic_2.12-1.8.0.jar" 345 | }, 346 | { 347 | "name": "logic_2.12", 348 | "classifier": "sources", 349 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.8.0/logic_2.12-1.8.0-sources.jar" 350 | } 351 | ] 352 | }, 353 | { 354 | "organization": "org.scala-sbt", 355 | "name": "actions_2.12", 356 | "version": "1.8.0", 357 | "configurations": "default", 358 | "artifacts": [ 359 | { 360 | "name": "actions_2.12", 361 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.8.0/actions_2.12-1.8.0.jar" 362 | }, 363 | { 364 | "name": "actions_2.12", 365 | "classifier": "sources", 366 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.8.0/actions_2.12-1.8.0-sources.jar" 367 | } 368 | ] 369 | }, 370 | { 371 | "organization": "org.scala-sbt", 372 | "name": "main-settings_2.12", 373 | "version": "1.8.0", 374 | "configurations": "default", 375 | "artifacts": [ 376 | { 377 | "name": "main-settings_2.12", 378 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.8.0/main-settings_2.12-1.8.0.jar" 379 | }, 380 | { 381 | "name": "main-settings_2.12", 382 | "classifier": "sources", 383 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.8.0/main-settings_2.12-1.8.0-sources.jar" 384 | } 385 | ] 386 | }, 387 | { 388 | "organization": "org.scala-sbt", 389 | "name": "run_2.12", 390 | "version": "1.8.0", 391 | "configurations": "default", 392 | "artifacts": [ 393 | { 394 | "name": "run_2.12", 395 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.8.0/run_2.12-1.8.0.jar" 396 | }, 397 | { 398 | "name": "run_2.12", 399 | "classifier": "sources", 400 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.8.0/run_2.12-1.8.0-sources.jar" 401 | } 402 | ] 403 | }, 404 | { 405 | "organization": "org.scala-sbt", 406 | "name": "command_2.12", 407 | "version": "1.8.0", 408 | "configurations": "default", 409 | "artifacts": [ 410 | { 411 | "name": "command_2.12", 412 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.8.0/command_2.12-1.8.0.jar" 413 | }, 414 | { 415 | "name": "command_2.12", 416 | "classifier": "sources", 417 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.8.0/command_2.12-1.8.0-sources.jar" 418 | } 419 | ] 420 | }, 421 | { 422 | "organization": "org.scala-sbt", 423 | "name": "collections_2.12", 424 | "version": "1.8.0", 425 | "configurations": "default", 426 | "artifacts": [ 427 | { 428 | "name": "collections_2.12", 429 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.8.0/collections_2.12-1.8.0.jar" 430 | }, 431 | { 432 | "name": "collections_2.12", 433 | "classifier": "sources", 434 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.8.0/collections_2.12-1.8.0-sources.jar" 435 | } 436 | ] 437 | }, 438 | { 439 | "organization": "org.scala-sbt", 440 | "name": "scripted-plugin_2.12", 441 | "version": "1.8.0", 442 | "configurations": "default", 443 | "artifacts": [ 444 | { 445 | "name": "scripted-plugin_2.12", 446 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.8.0/scripted-plugin_2.12-1.8.0.jar" 447 | }, 448 | { 449 | "name": "scripted-plugin_2.12", 450 | "classifier": "sources", 451 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.8.0/scripted-plugin_2.12-1.8.0-sources.jar" 452 | } 453 | ] 454 | }, 455 | { 456 | "organization": "org.scala-sbt", 457 | "name": "zinc-lm-integration_2.12", 458 | "version": "1.8.0", 459 | "configurations": "default", 460 | "artifacts": [ 461 | { 462 | "name": "zinc-lm-integration_2.12", 463 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.8.0/zinc-lm-integration_2.12-1.8.0.jar" 464 | }, 465 | { 466 | "name": "zinc-lm-integration_2.12", 467 | "classifier": "sources", 468 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.8.0/zinc-lm-integration_2.12-1.8.0-sources.jar" 469 | } 470 | ] 471 | }, 472 | { 473 | "organization": "org.scala-sbt", 474 | "name": "util-logging_2.12", 475 | "version": "1.8.0", 476 | "configurations": "default", 477 | "artifacts": [ 478 | { 479 | "name": "util-logging_2.12", 480 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.8.0/util-logging_2.12-1.8.0.jar" 481 | }, 482 | { 483 | "name": "util-logging_2.12", 484 | "classifier": "sources", 485 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.8.0/util-logging_2.12-1.8.0-sources.jar" 486 | } 487 | ] 488 | }, 489 | { 490 | "organization": "org.scala-lang.modules", 491 | "name": "scala-xml_2.12", 492 | "version": "2.1.0", 493 | "configurations": "default", 494 | "artifacts": [ 495 | { 496 | "name": "scala-xml_2.12", 497 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0.jar" 498 | }, 499 | { 500 | "name": "scala-xml_2.12", 501 | "classifier": "sources", 502 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.1.0/scala-xml_2.12-2.1.0-sources.jar" 503 | } 504 | ] 505 | }, 506 | { 507 | "organization": "org.scala-sbt", 508 | "name": "launcher-interface", 509 | "version": "1.4.1", 510 | "configurations": "default", 511 | "artifacts": [ 512 | { 513 | "name": "launcher-interface", 514 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.4.1/launcher-interface-1.4.1.jar" 515 | }, 516 | { 517 | "name": "launcher-interface", 518 | "classifier": "sources", 519 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.4.1/launcher-interface-1.4.1-sources.jar" 520 | } 521 | ] 522 | }, 523 | { 524 | "organization": "com.github.ben-manes.caffeine", 525 | "name": "caffeine", 526 | "version": "2.8.5", 527 | "configurations": "default", 528 | "artifacts": [ 529 | { 530 | "name": "caffeine", 531 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.8.5/caffeine-2.8.5.jar" 532 | }, 533 | { 534 | "name": "caffeine", 535 | "classifier": "sources", 536 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.8.5/caffeine-2.8.5-sources.jar" 537 | } 538 | ] 539 | }, 540 | { 541 | "organization": "io.get-coursier", 542 | "name": "lm-coursier-shaded_2.12", 543 | "version": "2.0.13", 544 | "configurations": "default", 545 | "artifacts": [ 546 | { 547 | "name": "lm-coursier-shaded_2.12", 548 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.13/lm-coursier-shaded_2.12-2.0.13.jar" 549 | }, 550 | { 551 | "name": "lm-coursier-shaded_2.12", 552 | "classifier": "sources", 553 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.0.13/lm-coursier-shaded_2.12-2.0.13-sources.jar" 554 | } 555 | ] 556 | }, 557 | { 558 | "organization": "org.apache.logging.log4j", 559 | "name": "log4j-api", 560 | "version": "2.17.1", 561 | "configurations": "default", 562 | "artifacts": [ 563 | { 564 | "name": "log4j-api", 565 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1.jar" 566 | }, 567 | { 568 | "name": "log4j-api", 569 | "classifier": "sources", 570 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1-sources.jar" 571 | } 572 | ] 573 | }, 574 | { 575 | "organization": "org.apache.logging.log4j", 576 | "name": "log4j-core", 577 | "version": "2.17.1", 578 | "configurations": "default", 579 | "artifacts": [ 580 | { 581 | "name": "log4j-core", 582 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.1/log4j-core-2.17.1.jar" 583 | }, 584 | { 585 | "name": "log4j-core", 586 | "classifier": "sources", 587 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.1/log4j-core-2.17.1-sources.jar" 588 | } 589 | ] 590 | }, 591 | { 592 | "organization": "org.apache.logging.log4j", 593 | "name": "log4j-slf4j-impl", 594 | "version": "2.17.1", 595 | "configurations": "default", 596 | "artifacts": [ 597 | { 598 | "name": "log4j-slf4j-impl", 599 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.17.1/log4j-slf4j-impl-2.17.1.jar" 600 | }, 601 | { 602 | "name": "log4j-slf4j-impl", 603 | "classifier": "sources", 604 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.17.1/log4j-slf4j-impl-2.17.1-sources.jar" 605 | } 606 | ] 607 | }, 608 | { 609 | "organization": "org.scala-sbt", 610 | "name": "librarymanagement-core_2.12", 611 | "version": "1.8.0", 612 | "configurations": "default", 613 | "artifacts": [ 614 | { 615 | "name": "librarymanagement-core_2.12", 616 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.8.0/librarymanagement-core_2.12-1.8.0.jar" 617 | }, 618 | { 619 | "name": "librarymanagement-core_2.12", 620 | "classifier": "sources", 621 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.8.0/librarymanagement-core_2.12-1.8.0-sources.jar" 622 | } 623 | ] 624 | }, 625 | { 626 | "organization": "org.scala-sbt", 627 | "name": "librarymanagement-ivy_2.12", 628 | "version": "1.8.0", 629 | "configurations": "default", 630 | "artifacts": [ 631 | { 632 | "name": "librarymanagement-ivy_2.12", 633 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.8.0/librarymanagement-ivy_2.12-1.8.0.jar" 634 | }, 635 | { 636 | "name": "librarymanagement-ivy_2.12", 637 | "classifier": "sources", 638 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.8.0/librarymanagement-ivy_2.12-1.8.0-sources.jar" 639 | } 640 | ] 641 | }, 642 | { 643 | "organization": "org.scala-sbt", 644 | "name": "compiler-interface", 645 | "version": "1.8.0", 646 | "configurations": "default", 647 | "artifacts": [ 648 | { 649 | "name": "compiler-interface", 650 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.8.0/compiler-interface-1.8.0.jar" 651 | }, 652 | { 653 | "name": "compiler-interface", 654 | "classifier": "sources", 655 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.8.0/compiler-interface-1.8.0-sources.jar" 656 | } 657 | ] 658 | }, 659 | { 660 | "organization": "org.scala-sbt", 661 | "name": "zinc-compile_2.12", 662 | "version": "1.8.0", 663 | "configurations": "default", 664 | "artifacts": [ 665 | { 666 | "name": "zinc-compile_2.12", 667 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.8.0/zinc-compile_2.12-1.8.0.jar" 668 | }, 669 | { 670 | "name": "zinc-compile_2.12", 671 | "classifier": "sources", 672 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.8.0/zinc-compile_2.12-1.8.0-sources.jar" 673 | } 674 | ] 675 | }, 676 | { 677 | "organization": "com.swoval", 678 | "name": "file-tree-views", 679 | "version": "2.1.9", 680 | "configurations": "default", 681 | "artifacts": [ 682 | { 683 | "name": "file-tree-views", 684 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.9/file-tree-views-2.1.9.jar" 685 | }, 686 | { 687 | "name": "file-tree-views", 688 | "classifier": "sources", 689 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.9/file-tree-views-2.1.9-sources.jar" 690 | } 691 | ] 692 | }, 693 | { 694 | "organization": "net.java.dev.jna", 695 | "name": "jna", 696 | "version": "5.12.0", 697 | "configurations": "default", 698 | "artifacts": [ 699 | { 700 | "name": "jna", 701 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.12.0/jna-5.12.0.jar" 702 | }, 703 | { 704 | "name": "jna", 705 | "classifier": "sources", 706 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.12.0/jna-5.12.0-sources.jar" 707 | } 708 | ] 709 | }, 710 | { 711 | "organization": "net.java.dev.jna", 712 | "name": "jna-platform", 713 | "version": "5.12.0", 714 | "configurations": "default", 715 | "artifacts": [ 716 | { 717 | "name": "jna-platform", 718 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.12.0/jna-platform-5.12.0.jar" 719 | }, 720 | { 721 | "name": "jna-platform", 722 | "classifier": "sources", 723 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.12.0/jna-platform-5.12.0-sources.jar" 724 | } 725 | ] 726 | }, 727 | { 728 | "organization": "org.scala-sbt", 729 | "name": "util-relation_2.12", 730 | "version": "1.8.0", 731 | "configurations": "default", 732 | "artifacts": [ 733 | { 734 | "name": "util-relation_2.12", 735 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.8.0/util-relation_2.12-1.8.0.jar" 736 | }, 737 | { 738 | "name": "util-relation_2.12", 739 | "classifier": "sources", 740 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.8.0/util-relation_2.12-1.8.0-sources.jar" 741 | } 742 | ] 743 | }, 744 | { 745 | "organization": "org.scala-sbt", 746 | "name": "completion_2.12", 747 | "version": "1.8.0", 748 | "configurations": "default", 749 | "artifacts": [ 750 | { 751 | "name": "completion_2.12", 752 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.8.0/completion_2.12-1.8.0.jar" 753 | }, 754 | { 755 | "name": "completion_2.12", 756 | "classifier": "sources", 757 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.8.0/completion_2.12-1.8.0-sources.jar" 758 | } 759 | ] 760 | }, 761 | { 762 | "organization": "org.scala-sbt", 763 | "name": "task-system_2.12", 764 | "version": "1.8.0", 765 | "configurations": "default", 766 | "artifacts": [ 767 | { 768 | "name": "task-system_2.12", 769 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.8.0/task-system_2.12-1.8.0.jar" 770 | }, 771 | { 772 | "name": "task-system_2.12", 773 | "classifier": "sources", 774 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.8.0/task-system_2.12-1.8.0-sources.jar" 775 | } 776 | ] 777 | }, 778 | { 779 | "organization": "org.scala-sbt", 780 | "name": "tasks_2.12", 781 | "version": "1.8.0", 782 | "configurations": "default", 783 | "artifacts": [ 784 | { 785 | "name": "tasks_2.12", 786 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.8.0/tasks_2.12-1.8.0.jar" 787 | }, 788 | { 789 | "name": "tasks_2.12", 790 | "classifier": "sources", 791 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.8.0/tasks_2.12-1.8.0-sources.jar" 792 | } 793 | ] 794 | }, 795 | { 796 | "organization": "org.scala-sbt", 797 | "name": "testing_2.12", 798 | "version": "1.8.0", 799 | "configurations": "default", 800 | "artifacts": [ 801 | { 802 | "name": "testing_2.12", 803 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.8.0/testing_2.12-1.8.0.jar" 804 | }, 805 | { 806 | "name": "testing_2.12", 807 | "classifier": "sources", 808 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.8.0/testing_2.12-1.8.0-sources.jar" 809 | } 810 | ] 811 | }, 812 | { 813 | "organization": "org.scala-sbt", 814 | "name": "util-tracking_2.12", 815 | "version": "1.8.0", 816 | "configurations": "default", 817 | "artifacts": [ 818 | { 819 | "name": "util-tracking_2.12", 820 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.8.0/util-tracking_2.12-1.8.0.jar" 821 | }, 822 | { 823 | "name": "util-tracking_2.12", 824 | "classifier": "sources", 825 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.8.0/util-tracking_2.12-1.8.0-sources.jar" 826 | } 827 | ] 828 | }, 829 | { 830 | "organization": "com.eed3si9n", 831 | "name": "sjson-new-scalajson_2.12", 832 | "version": "0.9.1", 833 | "configurations": "default", 834 | "artifacts": [ 835 | { 836 | "name": "sjson-new-scalajson_2.12", 837 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.9.1/sjson-new-scalajson_2.12-0.9.1.jar" 838 | }, 839 | { 840 | "name": "sjson-new-scalajson_2.12", 841 | "classifier": "sources", 842 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.9.1/sjson-new-scalajson_2.12-0.9.1-sources.jar" 843 | } 844 | ] 845 | }, 846 | { 847 | "organization": "org.jline", 848 | "name": "jline-terminal", 849 | "version": "3.19.0", 850 | "configurations": "default", 851 | "artifacts": [ 852 | { 853 | "name": "jline-terminal", 854 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.19.0/jline-terminal-3.19.0.jar" 855 | }, 856 | { 857 | "name": "jline-terminal", 858 | "classifier": "sources", 859 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal/3.19.0/jline-terminal-3.19.0-sources.jar" 860 | } 861 | ] 862 | }, 863 | { 864 | "organization": "org.scala-sbt", 865 | "name": "zinc-classpath_2.12", 866 | "version": "1.8.0", 867 | "configurations": "default", 868 | "artifacts": [ 869 | { 870 | "name": "zinc-classpath_2.12", 871 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.8.0/zinc-classpath_2.12-1.8.0.jar" 872 | }, 873 | { 874 | "name": "zinc-classpath_2.12", 875 | "classifier": "sources", 876 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.8.0/zinc-classpath_2.12-1.8.0-sources.jar" 877 | } 878 | ] 879 | }, 880 | { 881 | "organization": "org.scala-sbt", 882 | "name": "zinc-apiinfo_2.12", 883 | "version": "1.8.0", 884 | "configurations": "default", 885 | "artifacts": [ 886 | { 887 | "name": "zinc-apiinfo_2.12", 888 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.8.0/zinc-apiinfo_2.12-1.8.0.jar" 889 | }, 890 | { 891 | "name": "zinc-apiinfo_2.12", 892 | "classifier": "sources", 893 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.8.0/zinc-apiinfo_2.12-1.8.0-sources.jar" 894 | } 895 | ] 896 | }, 897 | { 898 | "organization": "org.scala-sbt", 899 | "name": "zinc_2.12", 900 | "version": "1.8.0", 901 | "configurations": "default", 902 | "artifacts": [ 903 | { 904 | "name": "zinc_2.12", 905 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.8.0/zinc_2.12-1.8.0.jar" 906 | }, 907 | { 908 | "name": "zinc_2.12", 909 | "classifier": "sources", 910 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.8.0/zinc_2.12-1.8.0-sources.jar" 911 | } 912 | ] 913 | }, 914 | { 915 | "organization": "org.scala-sbt", 916 | "name": "core-macros_2.12", 917 | "version": "1.8.0", 918 | "configurations": "default", 919 | "artifacts": [ 920 | { 921 | "name": "core-macros_2.12", 922 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.8.0/core-macros_2.12-1.8.0.jar" 923 | }, 924 | { 925 | "name": "core-macros_2.12", 926 | "classifier": "sources", 927 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.8.0/core-macros_2.12-1.8.0-sources.jar" 928 | } 929 | ] 930 | }, 931 | { 932 | "organization": "org.scala-sbt", 933 | "name": "util-cache_2.12", 934 | "version": "1.8.0", 935 | "configurations": "default", 936 | "artifacts": [ 937 | { 938 | "name": "util-cache_2.12", 939 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.8.0/util-cache_2.12-1.8.0.jar" 940 | }, 941 | { 942 | "name": "util-cache_2.12", 943 | "classifier": "sources", 944 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.8.0/util-cache_2.12-1.8.0-sources.jar" 945 | } 946 | ] 947 | }, 948 | { 949 | "organization": "org.scala-sbt", 950 | "name": "util-control_2.12", 951 | "version": "1.8.0", 952 | "configurations": "default", 953 | "artifacts": [ 954 | { 955 | "name": "util-control_2.12", 956 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.8.0/util-control_2.12-1.8.0.jar" 957 | }, 958 | { 959 | "name": "util-control_2.12", 960 | "classifier": "sources", 961 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.8.0/util-control_2.12-1.8.0-sources.jar" 962 | } 963 | ] 964 | }, 965 | { 966 | "organization": "org.scala-sbt", 967 | "name": "protocol_2.12", 968 | "version": "1.8.0", 969 | "configurations": "default", 970 | "artifacts": [ 971 | { 972 | "name": "protocol_2.12", 973 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.8.0/protocol_2.12-1.8.0.jar" 974 | }, 975 | { 976 | "name": "protocol_2.12", 977 | "classifier": "sources", 978 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.8.0/protocol_2.12-1.8.0-sources.jar" 979 | } 980 | ] 981 | }, 982 | { 983 | "organization": "com.eed3si9n", 984 | "name": "sjson-new-core_2.12", 985 | "version": "0.9.1", 986 | "configurations": "default", 987 | "artifacts": [ 988 | { 989 | "name": "sjson-new-core_2.12", 990 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.9.1/sjson-new-core_2.12-0.9.1.jar" 991 | }, 992 | { 993 | "name": "sjson-new-core_2.12", 994 | "classifier": "sources", 995 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.9.1/sjson-new-core_2.12-0.9.1-sources.jar" 996 | } 997 | ] 998 | }, 999 | { 1000 | "organization": "org.scala-sbt", 1001 | "name": "template-resolver", 1002 | "version": "0.1", 1003 | "configurations": "default", 1004 | "artifacts": [ 1005 | { 1006 | "name": "template-resolver", 1007 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar" 1008 | }, 1009 | { 1010 | "name": "template-resolver", 1011 | "classifier": "sources", 1012 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1-sources.jar" 1013 | } 1014 | ] 1015 | }, 1016 | { 1017 | "organization": "org.scala-sbt", 1018 | "name": "util-position_2.12", 1019 | "version": "1.8.0", 1020 | "configurations": "default", 1021 | "artifacts": [ 1022 | { 1023 | "name": "util-position_2.12", 1024 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.8.0/util-position_2.12-1.8.0.jar" 1025 | }, 1026 | { 1027 | "name": "util-position_2.12", 1028 | "classifier": "sources", 1029 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.8.0/util-position_2.12-1.8.0-sources.jar" 1030 | } 1031 | ] 1032 | }, 1033 | { 1034 | "organization": "org.scala-sbt", 1035 | "name": "zinc-compile-core_2.12", 1036 | "version": "1.8.0", 1037 | "configurations": "default", 1038 | "artifacts": [ 1039 | { 1040 | "name": "zinc-compile-core_2.12", 1041 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.8.0/zinc-compile-core_2.12-1.8.0.jar" 1042 | }, 1043 | { 1044 | "name": "zinc-compile-core_2.12", 1045 | "classifier": "sources", 1046 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.8.0/zinc-compile-core_2.12-1.8.0-sources.jar" 1047 | } 1048 | ] 1049 | }, 1050 | { 1051 | "organization": "org.scala-sbt", 1052 | "name": "util-interface", 1053 | "version": "1.8.0", 1054 | "configurations": "default", 1055 | "artifacts": [ 1056 | { 1057 | "name": "util-interface", 1058 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.8.0/util-interface-1.8.0.jar" 1059 | }, 1060 | { 1061 | "name": "util-interface", 1062 | "classifier": "sources", 1063 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.8.0/util-interface-1.8.0-sources.jar" 1064 | } 1065 | ] 1066 | }, 1067 | { 1068 | "organization": "org.scala-sbt.jline", 1069 | "name": "jline", 1070 | "version": "2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493", 1071 | "configurations": "default", 1072 | "artifacts": [ 1073 | { 1074 | "name": "jline", 1075 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493.jar" 1076 | }, 1077 | { 1078 | "name": "jline", 1079 | "classifier": "sources", 1080 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493/jline-2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493-sources.jar" 1081 | } 1082 | ] 1083 | }, 1084 | { 1085 | "organization": "org.jline", 1086 | "name": "jline-terminal-jna", 1087 | "version": "3.19.0", 1088 | "configurations": "default", 1089 | "artifacts": [ 1090 | { 1091 | "name": "jline-terminal-jna", 1092 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.19.0/jline-terminal-jna-3.19.0.jar" 1093 | }, 1094 | { 1095 | "name": "jline-terminal-jna", 1096 | "classifier": "sources", 1097 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.19.0/jline-terminal-jna-3.19.0-sources.jar" 1098 | } 1099 | ] 1100 | }, 1101 | { 1102 | "organization": "org.jline", 1103 | "name": "jline-terminal-jansi", 1104 | "version": "3.19.0", 1105 | "configurations": "default", 1106 | "artifacts": [ 1107 | { 1108 | "name": "jline-terminal-jansi", 1109 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jansi/3.19.0/jline-terminal-jansi-3.19.0.jar" 1110 | }, 1111 | { 1112 | "name": "jline-terminal-jansi", 1113 | "classifier": "sources", 1114 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-terminal-jansi/3.19.0/jline-terminal-jansi-3.19.0-sources.jar" 1115 | } 1116 | ] 1117 | }, 1118 | { 1119 | "organization": "com.lmax", 1120 | "name": "disruptor", 1121 | "version": "3.4.2", 1122 | "configurations": "default", 1123 | "artifacts": [ 1124 | { 1125 | "name": "disruptor", 1126 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar" 1127 | }, 1128 | { 1129 | "name": "disruptor", 1130 | "classifier": "sources", 1131 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2-sources.jar" 1132 | } 1133 | ] 1134 | }, 1135 | { 1136 | "organization": "org.scala-lang", 1137 | "name": "scala-reflect", 1138 | "version": "2.12.17", 1139 | "configurations": "default", 1140 | "artifacts": [ 1141 | { 1142 | "name": "scala-reflect", 1143 | "path": "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-reflect.jar" 1144 | }, 1145 | { 1146 | "name": "scala-reflect", 1147 | "classifier": "sources", 1148 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.17/scala-reflect-2.12.17-sources.jar" 1149 | } 1150 | ] 1151 | }, 1152 | { 1153 | "organization": "org.checkerframework", 1154 | "name": "checker-qual", 1155 | "version": "3.4.1", 1156 | "configurations": "default", 1157 | "artifacts": [ 1158 | { 1159 | "name": "checker-qual", 1160 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/checkerframework/checker-qual/3.4.1/checker-qual-3.4.1.jar" 1161 | }, 1162 | { 1163 | "name": "checker-qual", 1164 | "classifier": "sources", 1165 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/checkerframework/checker-qual/3.4.1/checker-qual-3.4.1-sources.jar" 1166 | } 1167 | ] 1168 | }, 1169 | { 1170 | "organization": "com.google.errorprone", 1171 | "name": "error_prone_annotations", 1172 | "version": "2.4.0", 1173 | "configurations": "default", 1174 | "artifacts": [ 1175 | { 1176 | "name": "error_prone_annotations", 1177 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar" 1178 | }, 1179 | { 1180 | "name": "error_prone_annotations", 1181 | "classifier": "sources", 1182 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0-sources.jar" 1183 | } 1184 | ] 1185 | }, 1186 | { 1187 | "organization": "org.scala-lang.modules", 1188 | "name": "scala-collection-compat_2.12", 1189 | "version": "2.8.1", 1190 | "configurations": "default", 1191 | "artifacts": [ 1192 | { 1193 | "name": "scala-collection-compat_2.12", 1194 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.8.1/scala-collection-compat_2.12-2.8.1.jar" 1195 | }, 1196 | { 1197 | "name": "scala-collection-compat_2.12", 1198 | "classifier": "sources", 1199 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.8.1/scala-collection-compat_2.12-2.8.1-sources.jar" 1200 | } 1201 | ] 1202 | }, 1203 | { 1204 | "organization": "org.slf4j", 1205 | "name": "slf4j-api", 1206 | "version": "2.0.3", 1207 | "configurations": "default", 1208 | "artifacts": [ 1209 | { 1210 | "name": "slf4j-api", 1211 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.3/slf4j-api-2.0.3.jar" 1212 | }, 1213 | { 1214 | "name": "slf4j-api", 1215 | "classifier": "sources", 1216 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.3/slf4j-api-2.0.3-sources.jar" 1217 | } 1218 | ] 1219 | }, 1220 | { 1221 | "organization": "org.scala-lang", 1222 | "name": "scala-compiler", 1223 | "version": "2.12.17", 1224 | "configurations": "default", 1225 | "artifacts": [ 1226 | { 1227 | "name": "scala-compiler", 1228 | "path": "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-compiler.jar" 1229 | }, 1230 | { 1231 | "name": "scala-compiler", 1232 | "classifier": "sources", 1233 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.17/scala-compiler-2.12.17-sources.jar" 1234 | } 1235 | ] 1236 | }, 1237 | { 1238 | "organization": "com.jcraft", 1239 | "name": "jsch", 1240 | "version": "0.1.54", 1241 | "configurations": "default", 1242 | "artifacts": [ 1243 | { 1244 | "name": "jsch", 1245 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar" 1246 | }, 1247 | { 1248 | "name": "jsch", 1249 | "classifier": "sources", 1250 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54-sources.jar" 1251 | } 1252 | ] 1253 | }, 1254 | { 1255 | "organization": "com.eed3si9n", 1256 | "name": "gigahorse-apache-http_2.12", 1257 | "version": "0.7.0", 1258 | "configurations": "default", 1259 | "artifacts": [ 1260 | { 1261 | "name": "gigahorse-apache-http_2.12", 1262 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.7.0/gigahorse-apache-http_2.12-0.7.0.jar" 1263 | }, 1264 | { 1265 | "name": "gigahorse-apache-http_2.12", 1266 | "classifier": "sources", 1267 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.7.0/gigahorse-apache-http_2.12-0.7.0-sources.jar" 1268 | } 1269 | ] 1270 | }, 1271 | { 1272 | "organization": "org.scala-sbt.ivy", 1273 | "name": "ivy", 1274 | "version": "2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e", 1275 | "configurations": "default", 1276 | "artifacts": [ 1277 | { 1278 | "name": "ivy", 1279 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e/ivy-2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e.jar" 1280 | }, 1281 | { 1282 | "name": "ivy", 1283 | "classifier": "sources", 1284 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e/ivy-2.3.0-sbt-a8f9eb5bf09d0539ea3658a2c2d4e09755b5133e-sources.jar" 1285 | } 1286 | ] 1287 | }, 1288 | { 1289 | "organization": "org.jline", 1290 | "name": "jline-reader", 1291 | "version": "3.19.0", 1292 | "configurations": "default", 1293 | "artifacts": [ 1294 | { 1295 | "name": "jline-reader", 1296 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.19.0/jline-reader-3.19.0.jar" 1297 | }, 1298 | { 1299 | "name": "jline-reader", 1300 | "classifier": "sources", 1301 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-reader/3.19.0/jline-reader-3.19.0-sources.jar" 1302 | } 1303 | ] 1304 | }, 1305 | { 1306 | "organization": "org.jline", 1307 | "name": "jline-builtins", 1308 | "version": "3.19.0", 1309 | "configurations": "default", 1310 | "artifacts": [ 1311 | { 1312 | "name": "jline-builtins", 1313 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-builtins/3.19.0/jline-builtins-3.19.0.jar" 1314 | }, 1315 | { 1316 | "name": "jline-builtins", 1317 | "classifier": "sources", 1318 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-builtins/3.19.0/jline-builtins-3.19.0-sources.jar" 1319 | } 1320 | ] 1321 | }, 1322 | { 1323 | "organization": "org.scala-sbt", 1324 | "name": "test-agent", 1325 | "version": "1.8.0", 1326 | "configurations": "default", 1327 | "artifacts": [ 1328 | { 1329 | "name": "test-agent", 1330 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-agent/1.8.0/test-agent-1.8.0.jar" 1331 | }, 1332 | { 1333 | "name": "test-agent", 1334 | "classifier": "sources", 1335 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-agent/1.8.0/test-agent-1.8.0-sources.jar" 1336 | } 1337 | ] 1338 | }, 1339 | { 1340 | "organization": "org.scala-sbt", 1341 | "name": "test-interface", 1342 | "version": "1.0", 1343 | "configurations": "default", 1344 | "artifacts": [ 1345 | { 1346 | "name": "test-interface", 1347 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar" 1348 | }, 1349 | { 1350 | "name": "test-interface", 1351 | "classifier": "sources", 1352 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0-sources.jar" 1353 | } 1354 | ] 1355 | }, 1356 | { 1357 | "organization": "com.eed3si9n", 1358 | "name": "shaded-jawn-parser_2.12", 1359 | "version": "0.9.1", 1360 | "configurations": "default", 1361 | "artifacts": [ 1362 | { 1363 | "name": "shaded-jawn-parser_2.12", 1364 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/0.9.1/shaded-jawn-parser_2.12-0.9.1.jar" 1365 | }, 1366 | { 1367 | "name": "shaded-jawn-parser_2.12", 1368 | "classifier": "sources", 1369 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/0.9.1/shaded-jawn-parser_2.12-0.9.1-sources.jar" 1370 | } 1371 | ] 1372 | }, 1373 | { 1374 | "organization": "com.eed3si9n", 1375 | "name": "shaded-scalajson_2.12", 1376 | "version": "1.0.0-M4", 1377 | "configurations": "default", 1378 | "artifacts": [ 1379 | { 1380 | "name": "shaded-scalajson_2.12", 1381 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar" 1382 | }, 1383 | { 1384 | "name": "shaded-scalajson_2.12", 1385 | "classifier": "sources", 1386 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4-sources.jar" 1387 | } 1388 | ] 1389 | }, 1390 | { 1391 | "organization": "org.scala-sbt", 1392 | "name": "compiler-bridge_2.12", 1393 | "version": "1.8.0", 1394 | "configurations": "default", 1395 | "artifacts": [ 1396 | { 1397 | "name": "compiler-bridge_2.12", 1398 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.8.0/compiler-bridge_2.12-1.8.0.jar" 1399 | }, 1400 | { 1401 | "name": "compiler-bridge_2.12", 1402 | "classifier": "sources", 1403 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.8.0/compiler-bridge_2.12-1.8.0-sources.jar" 1404 | } 1405 | ] 1406 | }, 1407 | { 1408 | "organization": "org.scala-sbt", 1409 | "name": "zinc-classfile_2.12", 1410 | "version": "1.8.0", 1411 | "configurations": "default", 1412 | "artifacts": [ 1413 | { 1414 | "name": "zinc-classfile_2.12", 1415 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.8.0/zinc-classfile_2.12-1.8.0.jar" 1416 | }, 1417 | { 1418 | "name": "zinc-classfile_2.12", 1419 | "classifier": "sources", 1420 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.8.0/zinc-classfile_2.12-1.8.0-sources.jar" 1421 | } 1422 | ] 1423 | }, 1424 | { 1425 | "organization": "org.scala-sbt", 1426 | "name": "zinc-core_2.12", 1427 | "version": "1.8.0", 1428 | "configurations": "default", 1429 | "artifacts": [ 1430 | { 1431 | "name": "zinc-core_2.12", 1432 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.8.0/zinc-core_2.12-1.8.0.jar" 1433 | }, 1434 | { 1435 | "name": "zinc-core_2.12", 1436 | "classifier": "sources", 1437 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.8.0/zinc-core_2.12-1.8.0-sources.jar" 1438 | } 1439 | ] 1440 | }, 1441 | { 1442 | "organization": "org.scala-sbt", 1443 | "name": "zinc-persist_2.12", 1444 | "version": "1.8.0", 1445 | "configurations": "default", 1446 | "artifacts": [ 1447 | { 1448 | "name": "zinc-persist_2.12", 1449 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.8.0/zinc-persist_2.12-1.8.0.jar" 1450 | }, 1451 | { 1452 | "name": "zinc-persist_2.12", 1453 | "classifier": "sources", 1454 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.8.0/zinc-persist_2.12-1.8.0-sources.jar" 1455 | } 1456 | ] 1457 | }, 1458 | { 1459 | "organization": "com.eed3si9n", 1460 | "name": "sjson-new-murmurhash_2.12", 1461 | "version": "0.9.1", 1462 | "configurations": "default", 1463 | "artifacts": [ 1464 | { 1465 | "name": "sjson-new-murmurhash_2.12", 1466 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.9.1/sjson-new-murmurhash_2.12-0.9.1.jar" 1467 | }, 1468 | { 1469 | "name": "sjson-new-murmurhash_2.12", 1470 | "classifier": "sources", 1471 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.9.1/sjson-new-murmurhash_2.12-0.9.1-sources.jar" 1472 | } 1473 | ] 1474 | }, 1475 | { 1476 | "organization": "org.scala-sbt.ipcsocket", 1477 | "name": "ipcsocket", 1478 | "version": "1.5.0", 1479 | "configurations": "default", 1480 | "artifacts": [ 1481 | { 1482 | "name": "ipcsocket", 1483 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.5.0/ipcsocket-1.5.0.jar" 1484 | }, 1485 | { 1486 | "name": "ipcsocket", 1487 | "classifier": "sources", 1488 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.5.0/ipcsocket-1.5.0-sources.jar" 1489 | } 1490 | ] 1491 | }, 1492 | { 1493 | "organization": "org.scala-lang.modules", 1494 | "name": "scala-parser-combinators_2.12", 1495 | "version": "1.1.2", 1496 | "configurations": "default", 1497 | "artifacts": [ 1498 | { 1499 | "name": "scala-parser-combinators_2.12", 1500 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar" 1501 | }, 1502 | { 1503 | "name": "scala-parser-combinators_2.12", 1504 | "classifier": "sources", 1505 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2-sources.jar" 1506 | } 1507 | ] 1508 | }, 1509 | { 1510 | "organization": "net.openhft", 1511 | "name": "zero-allocation-hashing", 1512 | "version": "0.10.1", 1513 | "configurations": "default", 1514 | "artifacts": [ 1515 | { 1516 | "name": "zero-allocation-hashing", 1517 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.10.1/zero-allocation-hashing-0.10.1.jar" 1518 | }, 1519 | { 1520 | "name": "zero-allocation-hashing", 1521 | "classifier": "sources", 1522 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.10.1/zero-allocation-hashing-0.10.1-sources.jar" 1523 | } 1524 | ] 1525 | }, 1526 | { 1527 | "organization": "org.fusesource.jansi", 1528 | "name": "jansi", 1529 | "version": "2.1.0", 1530 | "configurations": "default", 1531 | "artifacts": [ 1532 | { 1533 | "name": "jansi", 1534 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/2.1.0/jansi-2.1.0.jar" 1535 | }, 1536 | { 1537 | "name": "jansi", 1538 | "classifier": "sources", 1539 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/fusesource/jansi/jansi/2.1.0/jansi-2.1.0-sources.jar" 1540 | } 1541 | ] 1542 | }, 1543 | { 1544 | "organization": "com.eed3si9n", 1545 | "name": "gigahorse-core_2.12", 1546 | "version": "0.7.0", 1547 | "configurations": "default", 1548 | "artifacts": [ 1549 | { 1550 | "name": "gigahorse-core_2.12", 1551 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.7.0/gigahorse-core_2.12-0.7.0.jar" 1552 | }, 1553 | { 1554 | "name": "gigahorse-core_2.12", 1555 | "classifier": "sources", 1556 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.7.0/gigahorse-core_2.12-0.7.0-sources.jar" 1557 | } 1558 | ] 1559 | }, 1560 | { 1561 | "organization": "com.eed3si9n", 1562 | "name": "shaded-apache-httpasyncclient", 1563 | "version": "0.7.0", 1564 | "configurations": "default", 1565 | "artifacts": [ 1566 | { 1567 | "name": "shaded-apache-httpasyncclient", 1568 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpasyncclient/0.7.0/shaded-apache-httpasyncclient-0.7.0.jar" 1569 | }, 1570 | { 1571 | "name": "shaded-apache-httpasyncclient", 1572 | "classifier": "sources", 1573 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpasyncclient/0.7.0/shaded-apache-httpasyncclient-0.7.0-sources.jar" 1574 | } 1575 | ] 1576 | }, 1577 | { 1578 | "organization": "org.jline", 1579 | "name": "jline-style", 1580 | "version": "3.19.0", 1581 | "configurations": "default", 1582 | "artifacts": [ 1583 | { 1584 | "name": "jline-style", 1585 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-style/3.19.0/jline-style-3.19.0.jar" 1586 | }, 1587 | { 1588 | "name": "jline-style", 1589 | "classifier": "sources", 1590 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/jline/jline-style/3.19.0/jline-style-3.19.0-sources.jar" 1591 | } 1592 | ] 1593 | }, 1594 | { 1595 | "organization": "org.scala-sbt", 1596 | "name": "zinc-persist-core-assembly", 1597 | "version": "1.8.0", 1598 | "configurations": "default", 1599 | "artifacts": [ 1600 | { 1601 | "name": "zinc-persist-core-assembly", 1602 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.8.0/zinc-persist-core-assembly-1.8.0.jar" 1603 | }, 1604 | { 1605 | "name": "zinc-persist-core-assembly", 1606 | "classifier": "sources", 1607 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.8.0/zinc-persist-core-assembly-1.8.0-sources.jar" 1608 | } 1609 | ] 1610 | }, 1611 | { 1612 | "organization": "org.scala-sbt", 1613 | "name": "sbinary_2.12", 1614 | "version": "0.5.1", 1615 | "configurations": "default", 1616 | "artifacts": [ 1617 | { 1618 | "name": "sbinary_2.12", 1619 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.1/sbinary_2.12-0.5.1.jar" 1620 | }, 1621 | { 1622 | "name": "sbinary_2.12", 1623 | "classifier": "sources", 1624 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.1/sbinary_2.12-0.5.1-sources.jar" 1625 | } 1626 | ] 1627 | }, 1628 | { 1629 | "organization": "com.typesafe", 1630 | "name": "ssl-config-core_2.12", 1631 | "version": "0.6.1", 1632 | "configurations": "default", 1633 | "artifacts": [ 1634 | { 1635 | "name": "ssl-config-core_2.12", 1636 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.6.1/ssl-config-core_2.12-0.6.1.jar" 1637 | }, 1638 | { 1639 | "name": "ssl-config-core_2.12", 1640 | "classifier": "sources", 1641 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.6.1/ssl-config-core_2.12-0.6.1-sources.jar" 1642 | } 1643 | ] 1644 | }, 1645 | { 1646 | "organization": "org.reactivestreams", 1647 | "name": "reactive-streams", 1648 | "version": "1.0.3", 1649 | "configurations": "default", 1650 | "artifacts": [ 1651 | { 1652 | "name": "reactive-streams", 1653 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar" 1654 | }, 1655 | { 1656 | "name": "reactive-streams", 1657 | "classifier": "sources", 1658 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar" 1659 | } 1660 | ] 1661 | }, 1662 | { 1663 | "organization": "com.typesafe", 1664 | "name": "config", 1665 | "version": "1.4.2", 1666 | "configurations": "default", 1667 | "artifacts": [ 1668 | { 1669 | "name": "config", 1670 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/config/1.4.2/config-1.4.2.jar" 1671 | }, 1672 | { 1673 | "name": "config", 1674 | "classifier": "sources", 1675 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/com/typesafe/config/1.4.2/config-1.4.2-sources.jar" 1676 | } 1677 | ] 1678 | }, 1679 | { 1680 | "organization": "org.scala-lang", 1681 | "name": "scala-compiler", 1682 | "version": "2.12.17", 1683 | "configurations": "optional", 1684 | "artifacts": [ 1685 | { 1686 | "name": "scala-compiler", 1687 | "path": "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-compiler.jar" 1688 | }, 1689 | { 1690 | "name": "scala-compiler", 1691 | "classifier": "sources", 1692 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.17/scala-compiler-2.12.17-sources.jar" 1693 | } 1694 | ] 1695 | }, 1696 | { 1697 | "organization": "org.scala-lang", 1698 | "name": "scala-library", 1699 | "version": "2.12.17", 1700 | "configurations": "optional", 1701 | "artifacts": [ 1702 | { 1703 | "name": "scala-library", 1704 | "path": "/home/abdullah/.sbt/boot/scala-2.12.17/lib/scala-library.jar" 1705 | }, 1706 | { 1707 | "name": "scala-library", 1708 | "classifier": "sources", 1709 | "path": "/home/abdullah/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.17/scala-library-2.12.17-sources.jar" 1710 | } 1711 | ] 1712 | } 1713 | ] 1714 | }, 1715 | "tags": [ 1716 | "library" 1717 | ] 1718 | } 1719 | } --------------------------------------------------------------------------------