diff --git a/.directory b/.directory
new file mode 100644
index 0000000000..5c63501398
--- /dev/null
+++ b/.directory
@@ -0,0 +1,7 @@
+[Dolphin]
+Timestamp=2025,1,23,9,58,31.491
+Version=4
+ViewMode=1
+
+[Settings]
+HiddenFilesShown=true
diff --git a/.gitmodules b/.gitmodules
index 47da7742a4..e22b4175e1 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,3 @@
-[submodule "external/core"]
+[submodule "packages/external/core"]
path = packages/external/core
url = https://github.com/realm/realm-core.git
- branch = su/c-api
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19f4386c27..3f968a9e44 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,28 @@
+## 3.2.2
+
+* set Android targetSDK to 35
+* included the publishing scripts from @PavelFedoseev https://github.com/realm/realm-kotlin/issues/1857#issuecomment-2621494944
+
+## 3.2.1
+
+* fixed local publishing errors (for jvm and Android)
+
+## 3.2.0
+
+* changed project structure to make Intellij IDE work, buildSrc is moved out of scope io.realm
+* gradlew should be run in the root directory rather than packages
+* testing are on dev versions, not supporting testing maven artifacts yet
+* updated a few dependencies
+
+## 3.1.0
+
+* updated to work with Kotlin 2.1.0
+* Coroutines tested with 1.10.1
+* Gradle version 8.12
+* Android Gradle Plugin version 8.7.3
+* Minimum Android SDK: 21
+* R8 version 8.7.18
+
## 3.0.0-SNAPSHOT (YYYY-MM-DD)
### Breaking Changes
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0cd3db7f53..70953fec40 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -35,7 +35,7 @@ The repository can be built on Windows, although only for the JVM and Android ta
### Linux support
-This repository does currently not support building on Linux from the source code.
+This repository can now be built in the same way as on the Mac.
### Building and running tests
@@ -45,19 +45,17 @@ be developed and tested as a single project. For details on publishing and runni
Maven artifacts see the [Running tests against Maven artifacts](#running-tests-against-maven-artifacts)-section.
The tests are triggered from the IDE or by triggering the specific test tasks across the various
-platforms with:
+platforms with (in the root directory):
```sh
-cd packages
-./gradlew :test-base:jvmTest :test-base:connectedAndroidTest :test-base:macosTest :test-base:iosTest
+./gradlew :packages:test-base:jvmTest :packages:test-base:connectedAndroidTest :packages:test-base:macosTest :packages:test-base:iosTest
# Note that running the test-sync suite requires running a local server
# (see `tools/sync_test_server/start_local_server.sh` and `tools/sync_test_server/stop_local_server.sh`)
-./gradlew :test-sync:jvmTest :test-sync:connectedAndroidTest :test-sync:macosTest :test-sync:iosTest
+./gradlew :packages:test-sync:jvmTest :packages:test-sync:connectedAndroidTest :packages:test-sync:macosTest :packages:test-sync:iosTest
```
You can also the test across all modules on the various platforms with
```sh
-cd packages
./gradlew jvmTest connectedAndroidTest macosTest iosTest
```
But this will also trigger tests in the SDK modules.
@@ -91,7 +89,6 @@ repository in a local folder using the default local and test against these usin
commands:
```sh
-cd packages
./gradlew publishAllPublicationsToTestRepository
./gradlew -PincludeSdkModules=false jvmTest connectedAndroidTest macosTest iosTest
```
diff --git a/README.md b/README.md
index 83478678f9..58301aa0cf 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,32 @@
+### This fork of Realm Kotlin SDK is to make it compatible with Kotlin 2.1.0 while updating various dependencies
+
+JVM has been tested to work the same as with builds with Kotlin 2.0.x. Android is being tested. Testing iOS and MacOS will depend on other contributors.
+
+Unlike the forked repo, this one can be built from source on Linux.
+
+Project structure is changed to make Intellij IDE work. gradlew needs to be run from the root directory rather than packages.
+
+Testing are performed on the dev versions. Maven artifacts can be published (tested locally), but can not be tested upon yet.
+
+#### This project is rebranded for publishing on maven central, and is no longer maintained. The new project is [here](https://github.com/XilinJia/krdb)
+
+------------------------------------
+
+> [!WARNING]
+> We announced the deprecation of Atlas Device Sync + Realm SDKs in September 2024. For more information please see:
+> - [SDK Deprecation](https://www.mongodb.com/docs/atlas/device-sdks/deprecation/)
+> - [Device Sync Deprecation](https://www.mongodb.com/docs/atlas/app-services/sync/device-sync-deprecation/)
+>
+> For a version of Realm Kotlin without sync features, install version `3.0.0+` or see the `community` git branch.
+
+
-[](https://plugins.gradle.org/plugin/io.realm.kotlin)
-[](https://search.maven.org/artifact/io.realm.kotlin/gradle-plugin)
+[](https://plugins.gradle.org/plugin/io.realm.kotlin)
+[](https://search.maven.org/artifact/io.realm.kotlin/gradle-plugin)
[](http://kotlinlang.org)
[](https://github.com/realm/realm-kotlin/blob/master/LICENSE)
diff --git a/benchmarks/gradle/wrapper/gradle-wrapper.properties b/benchmarks/gradle/wrapper/gradle-wrapper.properties
index f42e62f372..d6e308a637 100644
--- a/benchmarks/gradle/wrapper/gradle-wrapper.properties
+++ b/benchmarks/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/benchmarks/jvmApp/build.gradle.kts b/benchmarks/jvmApp/build.gradle.kts
index 3244a5ee05..1e2369533b 100644
--- a/benchmarks/jvmApp/build.gradle.kts
+++ b/benchmarks/jvmApp/build.gradle.kts
@@ -20,5 +20,5 @@ jmh {
}
tasks.withType {
- kotlinOptions.jvmTarget = "11"
+ kotlinOptions.jvmTarget = "1.8"
}
diff --git a/build.gradle.kts b/build.gradle.kts
index 5637bdb1d0..5a3f204d61 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,3 +1,6 @@
+import org.jetbrains.kotlin.config.JvmTarget
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget.Companion.fromTarget
+
/*
* Copyright 2020 Realm Inc.
*
@@ -19,6 +22,9 @@ buildscript {
repositories {
jcenter()
}
+ dependencies {
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.0")
+ }
}
// Find property in either System environment or Gradle properties.
@@ -64,8 +70,19 @@ fun copyProperties(action: GradleBuild) {
}
}
-tasks {
+//allprojects {
+// version = Realm.version
+// group = Realm.group
+//
+// // Define JVM bytecode target for all Kotlin targets
+// tasks.withType {
+// compilerOptions {
+// jvmTarget.set(fromTarget(Versions.kotlinJvmTarget))
+// }
+// }
+//}
+tasks {
register("ktlintCheck") {
description = "Runs ktlintCheck on all projects."
group = "Verification"
@@ -112,8 +129,8 @@ tasks {
// TODO Verify we can actually use these debug symbols
val archiveDebugSymbols by register("archiveDebugSymbols", Zip::class) {
- archiveName = "realm-kotlin-jni-libs-unstripped-${currentVersion}.zip"
- destinationDir = releaseMetaDataDir
+// archiveName = "realm-kotlin-jni-libs-unstripped-${currentVersion}.zip"
+// destinationDir = releaseMetaDataDir
from("${rootDir}/packages/cinterop/build/intermediates/merged_native_libs/release/out/lib") {
include("**/*.so")
}
@@ -175,4 +192,119 @@ tasks {
description = "Upload release metadata to S3 (Native debug symbols, version files)"
dependsOn.addAll(listOf(uploadDebugSymbols, updateS3VersionFile))
}
+
+ register("publishCIPackages") {
+ group = "Publishing"
+ description = "Publish packages that has been configured for this CI node. See `gradle.properties`."
+
+ // Figure out which targets are configured. This will impact which sub modules will be published
+ val availableTargets = setOf(
+ "iosArm64",
+ "iosX64",
+ "jvm",
+ "macosX64",
+ "macosArm64",
+ "android",
+ "metadata",
+ "compilerPlugin",
+ "gradlePlugin"
+ )
+
+ val mainHostTarget: Set = setOf("metadata") // "kotlinMultiplatform"
+
+ val isMainHost: Boolean = project.properties["realm.kotlin.mainHost"]?.let { it == "true" } ?: false
+
+ // Find user configured platforms (if any)
+ val userTargets: Set? = (project.properties["realm.kotlin.targets"] as String?)
+ ?.split(",")
+ ?.map { it.trim() }
+ ?.filter { it.isNotEmpty() }
+ ?.toSet()
+
+ userTargets?.forEach {
+ if (!availableTargets.contains(it)) {
+ project.logger.error("Unknown publication: $it")
+ throw IllegalArgumentException("Unknown publication: $it")
+ }
+ }
+
+ // Configure which platforms publications we do want to publish
+ val publicationTargets = (userTargets ?: availableTargets).let {
+ when (isMainHost) {
+ true -> it + mainHostTarget
+ false -> it - mainHostTarget
+ }
+ }
+
+ publicationTargets.forEach { target: String ->
+ when (target) {
+ "iosArm64" -> {
+ dependsOn(
+ ":packages:cinterop:publishIosArm64PublicationToTestRepository",
+ ":packages:cinterop:publishIosSimulatorArm64PublicationToTestRepository",
+ ":packages:library-base:publishIosArm64PublicationToTestRepository",
+ ":packages:library-base:publishIosSimulatorArm64PublicationToTestRepository",
+ ":packages:library-sync:publishIosArm64PublicationToTestRepository",
+ ":packages:library-sync:publishIosSimulatorArm64PublicationToTestRepository",
+ )
+ }
+ "iosX64" -> {
+ dependsOn(
+ ":packages:cinterop:publishIosX64PublicationToTestRepository",
+ ":packages:library-base:publishIosX64PublicationToTestRepository",
+ ":packages:library-sync:publishIosX64PublicationToTestRepository",
+ )
+ }
+ "jvm" -> {
+ dependsOn(
+ ":packages:jni-swig-stub:publishAllPublicationsToTestRepository",
+ ":packages:cinterop:publishJvmPublicationToTestRepository",
+ ":packages:library-base:publishJvmPublicationToTestRepository",
+ ":packages:library-sync:publishJvmPublicationToTestRepository",
+ )
+ }
+ "macosX64" -> {
+ dependsOn(
+ ":packages:cinterop:publishMacosX64PublicationToTestRepository",
+ ":packages:library-base:publishMacosX64PublicationToTestRepository",
+ ":packages:library-sync:publishMacosX64PublicationToTestRepository",
+ )
+ }
+ "macosArm64" -> {
+ dependsOn(
+ ":packages:cinterop:publishMacosArm64PublicationToTestRepository",
+ ":packages:library-base:publishMacosArm64PublicationToTestRepository",
+ ":packages:library-sync:publishMacosArm64PublicationToTestRepository",
+ )
+ }
+ "android" -> {
+ dependsOn(
+ ":packages:jni-swig-stub:publishAllPublicationsToTestRepository",
+ ":packages:cinterop:publishAndroidReleasePublicationToTestRepository",
+ ":packages:library-base:publishAndroidReleasePublicationToTestRepository",
+ ":packages:library-sync:publishAndroidReleasePublicationToTestRepository",
+ )
+ }
+ "metadata" -> {
+ dependsOn(
+ ":packages:cinterop:publishKotlinMultiplatformPublicationToTestRepository",
+ ":packages:library-base:publishKotlinMultiplatformPublicationToTestRepository",
+ ":packages:library-sync:publishKotlinMultiplatformPublicationToTestRepository",
+ )
+ }
+ "compilerPlugin" -> {
+ dependsOn(
+ ":packages:plugin-compiler:publishAllPublicationsToTestRepository",
+ ":packages:plugin-compiler-shaded:publishAllPublicationsToTestRepository"
+ )
+ }
+ "gradlePlugin" -> {
+ dependsOn(":packages:gradle-plugin:publishAllPublicationsToTestRepository")
+ }
+ else -> {
+ throw IllegalArgumentException("Unsupported target: $target")
+ }
+ }
+ }
+ }
}
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index 9989e916f2..a16eb27b2d 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -18,14 +18,19 @@
plugins {
`kotlin-dsl`
`kotlin-dsl-precompiled-script-plugins`
+ kotlin("jvm") version Versions.kotlin
}
gradlePlugin {
plugins {
register("realm-publisher") {
id = "realm-publisher"
- implementationClass = "io.realm.kotlin.RealmPublishPlugin"
+ implementationClass = "org.realm.kotlin.RealmPublishPlugin"
}
+// create("realm-compiler") { // Plugin name (used internally)
+// id = "io.realm.kotlin.plugin-compiler" // Plugin ID (used to apply)
+// implementationClass = "io.realm.kotlin.compiler.Registrar"
+// }
}
}
@@ -44,6 +49,7 @@ repositories {
buildscript {
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}")
+ classpath("org.jetbrains.dokka:dokka-gradle-plugin:${Versions.dokka}") // Use the latest version
}
}
@@ -51,9 +57,13 @@ buildscript {
// These seem to propagate to all projects including the buildSrc/ directory, which also means
// they are not allowed to set the version. It can only be set from here.
dependencies {
+ implementation(kotlin("gradle-plugin", version = Versions.kotlin))
implementation("io.github.gradle-nexus:publish-plugin:${Versions.nexusPublishPlugin}")
implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:${Versions.detektPlugin}")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}")
+ implementation("org.jetbrains.kotlin:kotlin-compiler-embeddable:${Versions.kotlin}")
+ implementation("org.gradle.kotlin:gradle-kotlin-dsl-plugins:5.1.2")
+ implementation("org.jetbrains.dokka:dokka-gradle-plugin:${Versions.dokka}")
implementation("com.android.tools:r8:${Versions.Android.r8}")
implementation("com.android.tools.build:gradle:${Versions.Android.buildTools}")
implementation(kotlin("script-runtime"))
diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt
index efa281582d..58d765de8d 100644
--- a/buildSrc/src/main/kotlin/Config.kt
+++ b/buildSrc/src/main/kotlin/Config.kt
@@ -62,7 +62,7 @@ val HOST_OS: OperatingSystem = findHostOs()
object Realm {
val ciBuild = (System.getenv("CI") != null)
- const val version = "3.0.0-SNAPSHOT"
+ const val version = "3.2.1-SNAPSHOT"
const val group = "io.realm.kotlin"
const val projectUrl = "https://realm.io"
const val pluginPortalId = "io.realm.kotlin"
@@ -97,47 +97,49 @@ object Realm {
object Versions {
object Android {
- const val minSdk = 16
- const val targetSdk = 33
- const val compileSdkVersion = 33
- const val buildToolsVersion = "33.0.0"
- const val buildTools = "7.3.1" // https://maven.google.com/web/index.html?q=gradle#com.android.tools.build:gradle
- const val ndkVersion = "23.2.8568313"
- const val r8 = "8.3.37" // See https://developer.android.com/build/kotlin-support
+ const val minSdk = 21
+ const val targetSdk = 35
+ const val compileSdkVersion = 35
+ const val buildToolsVersion = "35.0.0"
+ const val buildTools = "8.7.3" // https://maven.google.com/web/index.html?q=gradle#com.android.tools.build:gradle
+ const val ndkVersion = "27.0.12077973"
+ const val r8 = "8.7.18" // See https://developer.android.com/build/kotlin-support
}
- const val androidxBenchmarkPlugin = "1.2.0-alpha12" // https://maven.google.com/web/index.html#androidx.benchmark:androidx.benchmark.gradle.plugin
- const val androidxStartup = "1.1.1" // https://maven.google.com/web/index.html?q=startup#androidx.startup:startup-runtime
- const val androidxJunit = "1.1.3" // https://maven.google.com/web/index.html#androidx.test.ext:junit
- const val androidxTest = "1.4.0" // https://maven.google.com/web/index.html#androidx.test:rules
+ const val androidxBenchmarkPlugin = "1.3.3" // https://maven.google.com/web/index.html#androidx.benchmark:androidx.benchmark.gradle.plugin
+ const val androidxStartup = "1.2.0" // https://maven.google.com/web/index.html?q=startup#androidx.startup:startup-runtime
+ const val androidxJunit = "1.2.1" // https://maven.google.com/web/index.html#androidx.test.ext:junit
+ const val androidxTest = "1.6.1" // https://maven.google.com/web/index.html#androidx.test:rules
+
// Must be built with same (major.minor!?) kotlin version as 'kotlin' variable below, to be binary compatible with kotlin
- const val atomicfu = "0.18.5" // https://github.com/Kotlin/kotlinx.atomicfu
+ const val atomicfu = "0.26.1" // https://github.com/Kotlin/kotlinx.atomicfu
+ const val atomicfuPlugin = "0.27.0" // https://github.com/Kotlin/kotlinx.atomicfu
const val autoService = "1.0" // https://mvnrepository.com/artifact/com.google.auto.service/auto-service
const val buildkonfig = "0.13.3" // https://github.com/yshrsmz/BuildKonfig
- const val coroutines = "1.7.0" // https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core
- const val datetime = "0.4.0" // https://github.com/Kotlin/kotlinx-datetime
+ const val coroutines = "1.10.1" // https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core
+ const val datetime = "0.6.1" // https://github.com/Kotlin/kotlinx-datetime
const val detektPlugin = "1.23.6" // https://github.com/detekt/detekt
- const val dokka = "1.9.0" // https://github.com/Kotlin/dokka
+ const val dokka = "2.0.0" // https://github.com/Kotlin/dokka
const val gradlePluginPublishPlugin = "0.15.0" // https://plugins.gradle.org/plugin/com.gradle.plugin-publish
const val jmh = "1.34" // https://github.com/openjdk/jmh
const val jmhPlugin = "0.6.6" // https://github.com/melix/jmh-gradle-plugin
const val junit = "4.13.2" // https://mvnrepository.com/artifact/junit/junit
const val kbson = "0.4.0" // https://github.com/mongodb/kbson
// When updating the Kotlin version, also remember to update /examples/min-android-sample/build.gradle.kts
- const val kotlin = "2.0.20" // https://github.com/JetBrains/kotlin and https://kotlinlang.org/docs/releases.html#release-details
- const val kotlinJvmTarget = "1.8" // Which JVM bytecode version is kotlin compiled to.
- const val latestKotlin = "2.0.20" // https://kotlinlang.org/docs/eap.html#build-details
- const val kotlinCompileTesting = "0.5.1" // https://github.com/zacsweers/kotlin-compile-testing
- const val ktlint = "0.45.2" // https://github.com/pinterest/ktlint
+ const val kotlin = "2.1.0" // https://github.com/JetBrains/kotlin and https://kotlinlang.org/docs/releases.html#release-details
+ const val kotlinJvmTarget = "17" // Which JVM bytecode version is kotlin compiled to.
+ const val latestKotlin = "2.1.0" // https://kotlinlang.org/docs/eap.html#build-details
+ const val kotlinCompileTesting = "0.7.0" // https://github.com/zacsweers/kotlin-compile-testing
+ const val ktlint = "1.5.0" // https://github.com/pinterest/ktlint
const val ktor = "2.3.12" // https://github.com/ktorio/ktor
const val multidex = "2.0.1" // https://developer.android.com/jetpack/androidx/releases/multidex
const val nexusPublishPlugin = "1.3.0" // https://github.com/gradle-nexus/publish-plugin
- const val okio = "3.9.0" // https://square.github.io/okio/#releases
+ const val okio = "3.10.2" // https://square.github.io/okio/#releases
const val relinker = "1.4.5" // https://github.com/KeepSafe/ReLinker
- const val serialization = "1.7.1" // https://kotlinlang.org/docs/releases.html#release-details
- const val shadowJar = "6.1.0" // https://mvnrepository.com/artifact/com.github.johnrengelman.shadow/com.github.johnrengelman.shadow.gradle.plugin?repo=gradle-plugins
+ const val serialization = "1.8.0" // https://kotlinlang.org/docs/releases.html#release-details
+ const val shadowJar = "8.1.0" // https://mvnrepository.com/artifact/com.github.johnrengelman.shadow/com.github.johnrengelman.shadow.gradle.plugin?repo=gradle-plugins
const val snakeYaml = "1.33" // https://github.com/snakeyaml/snakeyaml
- val sourceCompatibilityVersion = JavaVersion.VERSION_1_8 // Language level of any Java source code.
- val targetCompatibilityVersion = JavaVersion.VERSION_1_8 // Version of generated JVM bytecode from Java files.
+ val sourceCompatibilityVersion = JavaVersion.VERSION_17 // Language level of any Java source code.
+ val targetCompatibilityVersion = JavaVersion.VERSION_17 // Version of generated JVM bytecode from Java files.
}
// Could be actual Dependency objects
diff --git a/buildSrc/src/main/kotlin/io/realm/RealmPublishPlugin.kt b/buildSrc/src/main/kotlin/org/realm/kotlin/RealmPublishPlugin.kt
similarity index 99%
rename from buildSrc/src/main/kotlin/io/realm/RealmPublishPlugin.kt
rename to buildSrc/src/main/kotlin/org/realm/kotlin/RealmPublishPlugin.kt
index 3c8de8c3e4..94f58cc06b 100644
--- a/buildSrc/src/main/kotlin/io/realm/RealmPublishPlugin.kt
+++ b/buildSrc/src/main/kotlin/org/realm/kotlin/RealmPublishPlugin.kt
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package io.realm.kotlin
+package org.realm.kotlin
import Realm
import io.github.gradlenexus.publishplugin.NexusPublishExtension
diff --git a/examples/kmm-sample/gradle/wrapper/gradle-wrapper.properties b/examples/kmm-sample/gradle/wrapper/gradle-wrapper.properties
index f42e62f372..d6e308a637 100644
--- a/examples/kmm-sample/gradle/wrapper/gradle-wrapper.properties
+++ b/examples/kmm-sample/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/examples/min-android-sample/build.gradle.kts b/examples/min-android-sample/build.gradle.kts
index a5bacf7088..69baecb838 100644
--- a/examples/min-android-sample/build.gradle.kts
+++ b/examples/min-android-sample/build.gradle.kts
@@ -15,8 +15,8 @@ buildscript {
maven(url = "https://oss.sonatype.org/content/repositories/snapshots")
}
dependencies {
- classpath("com.android.tools.build:gradle:7.1.3")
- classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.20")
+ classpath("com.android.tools.build:gradle:8.7.3")
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.0")
classpath("io.realm.kotlin:gradle-plugin:${rootProject.extra["realmVersion"]}")
}
}
diff --git a/examples/min-android-sample/gradle/wrapper/gradle-wrapper.properties b/examples/min-android-sample/gradle/wrapper/gradle-wrapper.properties
index a0f7639f7d..d6e308a637 100644
--- a/examples/min-android-sample/gradle/wrapper/gradle-wrapper.properties
+++ b/examples/min-android-sample/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/examples/realm-java-compatibility/app/build.gradle b/examples/realm-java-compatibility/app/build.gradle
index da72b4e451..fad3802631 100644
--- a/examples/realm-java-compatibility/app/build.gradle
+++ b/examples/realm-java-compatibility/app/build.gradle
@@ -24,7 +24,7 @@ plugins {
apply plugin: "realm-android"
android {
- compileSdkVersion = 31
+ compileSdkVersion = 35
defaultConfig {
applicationId "io.realm.kotlin.demo.javacompatibility"
diff --git a/examples/realm-java-compatibility/gradle/wrapper/gradle-wrapper.properties b/examples/realm-java-compatibility/gradle/wrapper/gradle-wrapper.properties
index f42e62f372..d6e308a637 100644
--- a/examples/realm-java-compatibility/gradle/wrapper/gradle-wrapper.properties
+++ b/examples/realm-java-compatibility/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000..d94cac9b2f
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,100 @@
+#
+# Copyright 2020 Realm Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+# or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.gradle.jvmargs=-Xms512m -Xmx2048m
+kotlin.mpp.stability.nowarn=true
+
+kotlin.code.style=official
+android.useAndroidX=true
+
+# See https://kotlinlang.org/docs/whatsnew18.html#configuration-and-setup
+kotlin.mpp.androidSourceSetLayoutVersion=2
+
+# Realm Kotlin build options
+#
+# See https://kotlinlang.org/docs/multiplatform-publish-lib.html
+# The main host is responsible for publishing the KMP metadata needed to lookup platform specific
+# artifacts. During a publishing process, one host is _required_ to be the main host.
+#
+# If this property is commented out, the build will publish all publications regardless of what
+# `realm.kotlin.targets` is.
+realm.kotlin.mainHost=true
+
+# Which publications to publish. Allowed values are:
+# - iosArm64
+# - iosSimulatorArm64
+# - iosX64
+# - jvm
+# - macos
+# - macosArm64
+# - android
+# - gradlePlugin
+# - compilerPlugin
+#
+# If not set, all publications will be published. `metadata` is also a publication but
+# is controlled independently by the `realm.kotlin.mainHost` property.
+#
+# realm.kotlin.targets=
+
+# Whether or not to build Realm Core on the platform running the build.
+# This can be used to prevent certain targets transentively starting a
+# native build, which can easily take 30+ minutes. This is e.g. relevant
+# when only building docs or compiler/gradle plugins.
+realm.kotlin.buildRealmCore=true
+
+# Comma-seperated list of pre-built JVM native files that should be copied into place, making them
+# ready to run or package into the final JVM JARs.
+#
+# If the list is empty, no files are copied, and must instead be built locally.
+#
+# The following options are allowed and will copy the prebuilt file if it is placed in the defined location.
+# If a platform is enabled, but the file doesn't exist, then the build will crash.
+#
+# - macos: /packages/cinterop/build/realmMacOsBuild/librealmc.dylib
+# - linux: /packages/cinterop/build/realmWindowsBuild/librealmc.so
+# - windows: /packages/cinterop/build/realmWindowsBuild/Release/realmc.dll
+realm.kotlin.copyNativeJvmLibs=
+
+# See https://kotlinlang.org/docs/mpp-publish-lib.html#publish-an-android-library
+# Allow the default dependency name to match the client debug build type. Otherwise the client project has to
+# explicitly specify the debug variant (ex: implementation("io.realm.kotlin:library-base-debug:0.8.0"))
+kotlin.android.buildTypeAttribute.keep=false
+
+# Project setup - See './CONTRIBUTING.md' for description of the project structure and various options.
+# includeSdkModules=true
+# includeTestModules=true
+# Test repository path must be a relative path to the `packages` folder and defined with Linux line seperators.
+testRepository=build/m2-buildrepo/
+# Must either be `debug` or `debugMinified`
+testBuildType=debug
+
+# Properties controlling which test server to run sync tests against. Default is a local
+# test server that has been started by calling `/tools/sync_test_server/start_local_server.sh`
+syncTestUrl=http://localhost:9090
+syncTestAppNamePrefix=test-app
+syncTestLoginEmail=unique_user@domain.com
+syncTestLoginPassword=password
+
+# If the public/private apiKey is set, it will take precedence when logging into the Admin API that controls the app
+# syncTestUrl=https://realm-qa.mongodb.com
+# syncTestLoginPublicApiKey=replace-with-value
+# synctestLoginPrivateApiKey=replace-with-value
+# syncTestClusterName=replace-with-value
+
+# The option 'android.disableAutomaticComponentCreation' is deprecated.
+# It was removed in version 8.0 of the Android Gradle plugin.
+#android.disableAutomaticComponentCreation=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f42e62f372..d6e308a637 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/integration-tests/README.md b/integration-tests/README.md
index 6c332e0f83..9d51aa84c7 100644
--- a/integration-tests/README.md
+++ b/integration-tests/README.md
@@ -10,3 +10,5 @@ This folder holds the various integration test projects.
There are various project with specific Gradle versions that has been proven troublesome with
regards to collecting analytics data and a `current` project that will use the versions used to
build the SDK.
+
+# TODO: will configure later
\ No newline at end of file
diff --git a/integration-tests/gradle/current/gradle/wrapper/gradle-wrapper.properties b/integration-tests/gradle/current/gradle/wrapper/gradle-wrapper.properties
index f42e62f372..d6e308a637 100644
--- a/integration-tests/gradle/current/gradle/wrapper/gradle-wrapper.properties
+++ b/integration-tests/gradle/current/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/integration-tests/gradle/gradle85-test/single-platform/build.gradle.kts b/integration-tests/gradle/gradle85-test/single-platform/build.gradle.kts
index 70fdfc5a71..2defadac36 100644
--- a/integration-tests/gradle/gradle85-test/single-platform/build.gradle.kts
+++ b/integration-tests/gradle/gradle85-test/single-platform/build.gradle.kts
@@ -22,7 +22,7 @@ plugins {
}
android {
- compileSdk = 33
+ compileSdk = 35
namespace = "io.realm.test.singleplatform"
diff --git a/packages/build.gradle.kts b/packages/build.gradle.kts
deleted file mode 100644
index 3af7043487..0000000000
--- a/packages/build.gradle.kts
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright 2020 Realm Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import io.realm.kotlin.getPropertyValue
-import org.jetbrains.kotlin.gradle.dsl.JvmTarget
-
-plugins {
- id("com.android.library") apply false
- id("realm-lint")
- `java-gradle-plugin`
- id("realm-publisher")
- id("org.jetbrains.dokka") version Versions.dokka
-}
-
-allprojects {
- version = Realm.version
- group = Realm.group
-
- // Define JVM bytecode target for all Kotlin targets
- tasks.withType {
- compilerOptions {
- jvmTarget.set(JvmTarget.fromTarget(Versions.kotlinJvmTarget))
- }
- }
-}
-
-/**
- * Task that will build and publish the defined packages to /packages/build/m2-buildrepo`.
- * This is mostly suited for CI jobs that wants to build select publications on specific runners.
- *
- *
- * See `gradle.properties` for specific configuration options available to this task.
- *
- * For local development, using:
- *
- * ```
- * > ./gradlew publishAllPublicationsToTestRepository
- * ```
- *
- * will build and publish all targets available to the builder platform.
- */
-tasks.register("publishCIPackages") {
- group = "Publishing"
- description = "Publish packages that has been configured for this CI node. See `gradle.properties`."
-
- // Figure out which targets are configured. This will impact which sub modules will be published
- val availableTargets = setOf(
- "iosArm64",
- "iosX64",
- "jvm",
- "macosX64",
- "macosArm64",
- "android",
- "metadata",
- "compilerPlugin",
- "gradlePlugin"
- )
-
- val mainHostTarget: Set = setOf("metadata") // "kotlinMultiplatform"
-
- val isMainHost: Boolean = project.properties["realm.kotlin.mainHost"]?.let { it == "true" } ?: false
-
- // Find user configured platforms (if any)
- val userTargets: Set? = (project.properties["realm.kotlin.targets"] as String?)
- ?.split(",")
- ?.map { it.trim() }
- ?.filter { it.isNotEmpty() }
- ?.toSet()
-
- userTargets?.forEach {
- if (!availableTargets.contains(it)) {
- project.logger.error("Unknown publication: $it")
- throw IllegalArgumentException("Unknown publication: $it")
- }
- }
-
- // Configure which platforms publications we do want to publish
- val publicationTargets = (userTargets ?: availableTargets).let {
- when (isMainHost) {
- true -> it + mainHostTarget
- false -> it - mainHostTarget
- }
- }
-
- publicationTargets.forEach { target: String ->
- when(target) {
- "iosArm64" -> {
- dependsOn(
- ":cinterop:publishIosArm64PublicationToTestRepository",
- ":cinterop:publishIosSimulatorArm64PublicationToTestRepository",
- ":library-base:publishIosArm64PublicationToTestRepository",
- ":library-base:publishIosSimulatorArm64PublicationToTestRepository",
- ":library-sync:publishIosArm64PublicationToTestRepository",
- ":library-sync:publishIosSimulatorArm64PublicationToTestRepository",
- )
- }
- "iosX64" -> {
- dependsOn(
- ":cinterop:publishIosX64PublicationToTestRepository",
- ":library-base:publishIosX64PublicationToTestRepository",
- ":library-sync:publishIosX64PublicationToTestRepository",
- )
- }
- "jvm" -> {
- dependsOn(
- ":jni-swig-stub:publishAllPublicationsToTestRepository",
- ":cinterop:publishJvmPublicationToTestRepository",
- ":library-base:publishJvmPublicationToTestRepository",
- ":library-sync:publishJvmPublicationToTestRepository",
- )
- }
- "macosX64" -> {
- dependsOn(
- ":cinterop:publishMacosX64PublicationToTestRepository",
- ":library-base:publishMacosX64PublicationToTestRepository",
- ":library-sync:publishMacosX64PublicationToTestRepository",
- )
- }
- "macosArm64" -> {
- dependsOn(
- ":cinterop:publishMacosArm64PublicationToTestRepository",
- ":library-base:publishMacosArm64PublicationToTestRepository",
- ":library-sync:publishMacosArm64PublicationToTestRepository",
- )
- }
- "android" -> {
- dependsOn(
- ":jni-swig-stub:publishAllPublicationsToTestRepository",
- ":cinterop:publishAndroidReleasePublicationToTestRepository",
- ":library-base:publishAndroidReleasePublicationToTestRepository",
- ":library-sync:publishAndroidReleasePublicationToTestRepository",
- )
- }
- "metadata" -> {
- dependsOn(
- ":cinterop:publishKotlinMultiplatformPublicationToTestRepository",
- ":library-base:publishKotlinMultiplatformPublicationToTestRepository",
- ":library-sync:publishKotlinMultiplatformPublicationToTestRepository",
- )
- }
- "compilerPlugin" -> {
- dependsOn(
- ":plugin-compiler:publishAllPublicationsToTestRepository",
- ":plugin-compiler-shaded:publishAllPublicationsToTestRepository"
- )
- }
- "gradlePlugin" -> {
- dependsOn(":gradle-plugin:publishAllPublicationsToTestRepository")
- }
- else -> {
- throw IllegalArgumentException("Unsupported target: $target")
- }
- }
- }
-}
-
-tasks.register("uploadDokka") {
- dependsOn("dokkaHtmlMultiModule")
- group = "Release"
- description = "Upload SDK docs to S3"
- doLast {
- val awsAccessKey = getPropertyValue(this.project, "SDK_DOCS_AWS_ACCESS_KEY")
- val awsSecretKey = getPropertyValue(this.project, "SDK_DOCS_AWS_SECRET_KEY")
-
- // Failsafe check, ensuring that we catch if the path ever changes, which it might since it is an
- // implementation detail of the Kotlin Gradle Plugin
- val dokkaDir = File("$rootDir/build/dokka/htmlMultiModule/")
- if (!dokkaDir.exists() || !dokkaDir.isDirectory || dokkaDir.listFiles().isEmpty()) {
- throw GradleException("Could not locate dir with dokka files in: ${dokkaDir.path}")
- }
-
- // Upload two copies, to 'latest' and a versioned folder for posterity.
- // Symlinks would have been safer and faster, but this is not supported by S3.
- listOf(Realm.version, "latest").forEach { version: String ->
- exec {
- commandLine = listOf(
- "s3cmd",
- "put",
- "--no-mime-magic",
- "--guess-mime-type",
- "--recursive",
- "--acl-public",
- "--access_key=$awsAccessKey",
- "--secret_key=$awsSecretKey",
- "${dokkaDir.absolutePath}/", // Add / to only upload content of the folder, not the folder itself.
- "s3://realm-sdks/docs/realm-sdks/kotlin/$version/"
- )
- }
- }
- }
-}
diff --git a/packages/cinterop/build.gradle.kts b/packages/cinterop/build.gradle.kts
index 32a61dd7ca..df62540026 100644
--- a/packages/cinterop/build.gradle.kts
+++ b/packages/cinterop/build.gradle.kts
@@ -23,15 +23,9 @@ plugins {
id("org.jetbrains.kotlin.multiplatform")
id("com.android.library")
id("realm-publisher")
+ id("org.jetbrains.kotlinx.atomicfu") version Versions.atomicfuPlugin
}
-buildscript {
- dependencies {
- classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:${Versions.atomicfu}")
- }
-}
-
-apply(plugin = "kotlinx-atomicfu")
// AtomicFu cannot transform JVM code. Throws
// ClassCastException: org.objectweb.asm.tree.InsnList cannot be cast to java.lang.Iterable
project.extensions.configure(kotlinx.atomicfu.plugin.gradle.AtomicFUPluginExtension::class) {
@@ -71,7 +65,7 @@ fun checkIfBuildingNativeLibs(task: Task, action: Task.() -> Unit) {
}
val corePath = "external/core"
-val absoluteCorePath = "$rootDir/$corePath"
+val absoluteCorePath = "$rootDir/packages/$corePath"
val jvmJniPath = "src/jvmMain/resources/jni"
fun includeBinaries(binaries: List): List {
@@ -236,7 +230,7 @@ kotlin {
val jvm by creating {
dependsOn(commonMain)
dependencies {
- api(project(":jni-swig-stub"))
+ api(project(":packages:jni-swig-stub"))
}
}
val jvmMain by getting {
@@ -426,7 +420,8 @@ val buildJVMSharedLibs: TaskProvider by tasks.registering {
} else if (HOST_OS.isWindows()) {
buildSharedLibrariesForJVMWindows()
} else {
- throw IllegalStateException("Building JVM libraries on this platform is not supported: $HOST_OS")
+ buildSharedLibrariesForJVMLinux()
+// throw IllegalStateException("Building JVM libraries on this platform is not supported: $HOST_OS")
}
}
@@ -540,6 +535,42 @@ fun Task.buildSharedLibrariesForJVMMacOs() {
outputs.file(project.file("$jvmJniPath/macos/librealmc.dylib"))
}
+fun Task.buildSharedLibrariesForJVMLinux() {
+ group = "Build"
+ description = "Compile dynamic libraries loaded by the JVM fat jar for supported platforms."
+ val directory = "$buildDir/realmLinuxBuild"
+
+ doLast {
+ exec {
+ commandLine("mkdir", "-p", directory)
+ }
+ exec {
+ workingDir(project.file(directory))
+ commandLine(
+ "cmake",
+ *getSharedCMakeFlags(BuildType.RELEASE),
+ "-DCPACK_PACKAGE_DIRECTORY=..",
+ project.file("src/jvm/")
+ )
+ }
+ exec {
+ workingDir(project.file(directory))
+ commandLine("cmake", "--build", ".", "-j8")
+ }
+
+ // copy files (macos)
+ exec {
+ commandLine("mkdir", "-p", project.file("$jvmJniPath/linux"))
+ }
+ File("$directory/librealmc.so")
+ .copyTo(project.file("$jvmJniPath/linux/librealmc.so"), overwrite = true)
+ }
+
+ inputs.dir(project.file("src/jvm"))
+ inputs.dir(project.file("$absoluteCorePath/src"))
+ outputs.file(project.file("$jvmJniPath/linux/librealmc.so"))
+}
+
fun Task.buildSharedLibrariesForJVMWindows() {
group = "Build"
description = "Compile dynamic libraries loaded by the JVM fat jar for supported platforms."
@@ -709,10 +740,10 @@ afterEvaluate {
// the cpp file as it somehow processes the CMakeList.txt-file, but haven't dug up the
// actuals
tasks.named("generateJsonModelDebug") {
- inputs.files(tasks.getByPath(":jni-swig-stub:realmWrapperJvm").outputs)
+ inputs.files(tasks.getByPath(":packages:jni-swig-stub:realmWrapperJvm").outputs)
}
tasks.named("generateJsonModelRelease") {
- inputs.files(tasks.getByPath(":jni-swig-stub:realmWrapperJvm").outputs)
+ inputs.files(tasks.getByPath(":packages:jni-swig-stub:realmWrapperJvm").outputs)
}
}
@@ -817,4 +848,10 @@ abstract class CmakeVersionProvider : ValueSource {
diff --git a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/IrUtils.kt b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/IrUtils.kt
index 8c8d6d617b..9663faa9c9 100644
--- a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/IrUtils.kt
+++ b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/IrUtils.kt
@@ -226,7 +226,7 @@ val FirClassSymbol<*>.isBaseRealmObject: Boolean
)
}
// After SUPERTYPES stage
- is FirResolvedTypeRef -> typeRef.type.classId in realmObjectClassIds
+ is FirResolvedTypeRef -> typeRef.coneType.classId in realmObjectClassIds
else -> false
}
}
@@ -424,7 +424,7 @@ data class SchemaProperty(
companion object {
fun getPersistedName(declaration: IrProperty): String {
@Suppress("UNCHECKED_CAST")
- return (declaration.getAnnotation(PERSISTED_NAME_ANNOTATION.asSingleFqName()).getValueArgument(0)!! as IrConstImpl).value
+ return (declaration.getAnnotation(PERSISTED_NAME_ANNOTATION.asSingleFqName()).getValueArgument(0)!! as IrConstImpl).value?.toString() ?: ""
}
}
}
@@ -446,22 +446,22 @@ internal fun buildOf(
type = containerType.typeWith(elementType),
symbol = function,
typeArgumentsCount = 1,
- valueArgumentsCount = 1,
+// valueArgumentsCount = 1,
origin = null,
- superQualifierSymbol = null
- ).apply {
- putTypeArgument(index = 0, type = elementType)
- putValueArgument(
- index = 0,
- valueArgument = IrVarargImpl(
- UNDEFINED_OFFSET,
- UNDEFINED_OFFSET,
- context.irBuiltIns.arrayClass.typeWith(elementType),
- type,
- args.toList()
+ superQualifierSymbol = null)
+ .apply {
+ putTypeArgument(index = 0, type = elementType)
+ putValueArgument(
+ index = 0,
+ valueArgument = IrVarargImpl(
+ UNDEFINED_OFFSET,
+ UNDEFINED_OFFSET,
+ context.irBuiltIns.arrayClass.typeWith(elementType),
+ type,
+ args.toList()
+ )
)
- )
- }
+ }
}
internal fun buildSetOf(
@@ -593,11 +593,16 @@ fun IrBlockBuilder.createSafeCallConstruction(
statements += receiverVariable
statements += IrWhenImpl(startOffset, endOffset, resultType).apply {
val condition = IrCallImpl(
- startOffset, endOffset, context.irBuiltIns.booleanType,
- context.irBuiltIns.eqeqSymbol,
- valueArgumentsCount = 2,
+ startOffset = startOffset, endOffset = endOffset,
+ type = context.irBuiltIns.booleanType,
+ symbol = context.irBuiltIns.eqeqSymbol,
typeArgumentsCount = 0,
origin = IrStatementOrigin.EQEQ
+// startOffset, endOffset, context.irBuiltIns.booleanType,
+// context.irBuiltIns.eqeqSymbol,
+// valueArgumentsCount = 2,
+// typeArgumentsCount = 0,
+// origin = IrStatementOrigin.EQEQ
).apply {
putValueArgument(0, IrGetValueImpl(startOffset, endOffset, receiverVariableSymbol))
putValueArgument(
@@ -684,7 +689,7 @@ fun getLinkingObjectPropertyName(backingField: IrField): String {
fun getSchemaClassName(clazz: IrClass): String {
return if (clazz.hasAnnotation(PERSISTED_NAME_ANNOTATION)) {
@Suppress("UNCHECKED_CAST")
- return (clazz.getAnnotation(PERSISTED_NAME_ANNOTATION.asSingleFqName()).getValueArgument(0)!! as IrConstImpl).value
+ return (clazz.getAnnotation(PERSISTED_NAME_ANNOTATION.asSingleFqName()).getValueArgument(0)!! as IrConstImpl).value?.toString() ?: ""
} else {
clazz.name.identifier
}
diff --git a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelDefaultMethodGeneration.kt b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelDefaultMethodGeneration.kt
index 71b741a572..9ed91f828c 100644
--- a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelDefaultMethodGeneration.kt
+++ b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelDefaultMethodGeneration.kt
@@ -76,7 +76,7 @@ class RealmModelDefaultMethodGeneration(private val pluginContext: IrPluginConte
type = pluginContext.irBuiltIns.booleanType,
symbol = realmEquals.symbol,
typeArgumentsCount = 0,
- valueArgumentsCount = 2
+// valueArgumentsCount = 2
).apply {
dispatchReceiver = irGetObject(realmObjectHelper.symbol)
putValueArgument(0, irGet(function.dispatchReceiverParameter!!.type, function.dispatchReceiverParameter!!.symbol))
@@ -96,7 +96,7 @@ class RealmModelDefaultMethodGeneration(private val pluginContext: IrPluginConte
type = pluginContext.irBuiltIns.intType,
symbol = realmHashCode.symbol,
typeArgumentsCount = 0,
- valueArgumentsCount = 1
+// valueArgumentsCount = 1
).apply {
dispatchReceiver = irGetObject(realmObjectHelper.symbol)
putValueArgument(0, irGet(function.dispatchReceiverParameter!!.type, function.dispatchReceiverParameter!!.symbol))
@@ -115,7 +115,7 @@ class RealmModelDefaultMethodGeneration(private val pluginContext: IrPluginConte
type = pluginContext.irBuiltIns.stringType,
symbol = realmToString.symbol,
typeArgumentsCount = 0,
- valueArgumentsCount = 1
+// valueArgumentsCount = 1
).apply {
dispatchReceiver = irGetObject(realmObjectHelper.symbol)
putValueArgument(0, irGet(function.dispatchReceiverParameter!!.type, function.dispatchReceiverParameter!!.symbol))
diff --git a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelLoweringExtension.kt b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelLoweringExtension.kt
index 91e726f159..6aa453e61e 100644
--- a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelLoweringExtension.kt
+++ b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelLoweringExtension.kt
@@ -32,10 +32,13 @@ import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
+import org.jetbrains.kotlin.ir.expressions.impl.fromSymbolOwner
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
+import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.types.starProjectedType
+import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.companionObject
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.isAnonymousObject
@@ -118,11 +121,14 @@ private class RealmModelLowering(private val pluginContext: IrPluginContext) : C
// able to resolve the companion object during runtime due to absence of
// kotlin.reflect.full.companionObjectInstance
if (pluginContext.platform.isNative()) {
+ val type = modelObjectAnnotationClass.defaultType as? IrType ?: throw IllegalStateException("defaultType is not an IrType")
+ val primaryConstructor = modelObjectAnnotationClass.primaryConstructor ?: throw IllegalStateException("primaryConstructor is null")
+ val constructorSymbol = primaryConstructor.symbol as? IrConstructorSymbol ?: throw IllegalStateException("symbol is not an IrConstructorSymbol")
val modelObjectAnnotation = IrConstructorCallImpl.fromSymbolOwner(
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
- type = modelObjectAnnotationClass.defaultType,
- constructorSymbol = modelObjectAnnotationClass.primaryConstructor!!.symbol
+ type = type,
+ constructorSymbol = constructorSymbol
).apply {
putValueArgument(
0,
diff --git a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelSyntheticPropertiesGeneration.kt b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelSyntheticPropertiesGeneration.kt
index 0ce7399497..e922bda1ae 100644
--- a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelSyntheticPropertiesGeneration.kt
+++ b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/RealmModelSyntheticPropertiesGeneration.kt
@@ -92,6 +92,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetEnumValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrPropertyReferenceImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
+import org.jetbrains.kotlin.ir.expressions.impl.fromSymbolOwner
import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
@@ -303,7 +304,7 @@ class RealmModelSyntheticPropertiesGeneration(private val pluginContext: IrPlugi
type = companionFieldsType,
symbol = mapOf,
typeArgumentsCount = 2,
- valueArgumentsCount = 1,
+// valueArgumentsCount = 1,
origin = null,
superQualifierSymbol = null
).apply {
@@ -333,15 +334,14 @@ class RealmModelSyntheticPropertiesGeneration(private val pluginContext: IrPlugi
symbol = propertyElementType.classOrNull!!,
classType = propertyElementType.classOrNull!!.defaultType,
)
- val objectPropertyType = if (it.value.isComputed) realmObjectPropertyType else
- realmObjectMutablePropertyType
+ val objectPropertyType = if (it.value.isComputed) realmObjectPropertyType else realmObjectMutablePropertyType
val elementType = pairClass.typeWith(pluginContext.irBuiltIns.kClassClass.typeWith(), objectPropertyType)
// Pair>>()
IrConstructorCallImpl.fromSymbolOwner(
startOffset = startOffset,
endOffset = endOffset,
- type = elementType,
- constructorSymbol = pairCtor
+ type = elementType as IrType,
+ constructorSymbol = pairCtor as org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
).apply {
putTypeArgument(0, pluginContext.irBuiltIns.stringType)
putTypeArgument(1, elementType)
@@ -359,8 +359,8 @@ class RealmModelSyntheticPropertiesGeneration(private val pluginContext: IrPlugi
IrConstructorCallImpl.fromSymbolOwner(
startOffset = startOffset,
endOffset = endOffset,
- type = elementType,
- constructorSymbol = pairCtor
+ type = elementType as IrType,
+ constructorSymbol = pairCtor as org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
).apply {
putTypeArgument(
0,
@@ -507,7 +507,7 @@ class RealmModelSyntheticPropertiesGeneration(private val pluginContext: IrPlugi
type = classInfoClass.defaultType,
symbol = classInfoCreateMethod.symbol,
typeArgumentsCount = 0,
- valueArgumentsCount = 5
+// valueArgumentsCount = 5
).apply {
dispatchReceiver = irGetObject(classInfoClass.companionObject()!!.symbol)
var arg = 0
@@ -714,7 +714,7 @@ class RealmModelSyntheticPropertiesGeneration(private val pluginContext: IrPlugi
} ?: irNull(pluginContext.irBuiltIns.kClassClass.typeWith(typedRealmObjectInterface.defaultType).makeNullable())
// Define the link target. Empty string if there is none.
- val linkPropertyName: IrConst = if (type == linkingObjectType) {
+ val linkPropertyName: IrConst = if (type == linkingObjectType) {
val targetPropertyName = getLinkingObjectPropertyName(backingField)
irString(targetPropertyName)
} else {
@@ -727,7 +727,7 @@ class RealmModelSyntheticPropertiesGeneration(private val pluginContext: IrPlugi
type = propertyClass.defaultType,
symbol = propertyCreateMethod,
typeArgumentsCount = 0,
- valueArgumentsCount = 10
+// valueArgumentsCount = 10
).apply {
var arg = 0
// Persisted name
diff --git a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/SyncLoweringExtension.kt b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/SyncLoweringExtension.kt
index d5a11767f2..fa95ccbe1e 100644
--- a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/SyncLoweringExtension.kt
+++ b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/SyncLoweringExtension.kt
@@ -140,7 +140,7 @@ private class SyncLowering(private val pluginContext: IrPluginContext, private v
type = expression.type,
symbol = target.symbol,
typeArgumentsCount = 0,
- valueArgumentsCount = target.valueParameters.size,
+// valueArgumentsCount = target.valueParameters.size,
origin = null,
superQualifierSymbol = null
).apply {
diff --git a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/CompanionExtension.kt b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/CompanionExtension.kt
index 0ec41e8eb7..0e5b672285 100644
--- a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/CompanionExtension.kt
+++ b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/CompanionExtension.kt
@@ -66,7 +66,7 @@ class CompanionExtension(session: FirSession) : FirDeclarationGenerationExtensio
classSymbol: FirClassSymbol<*>,
context: MemberGenerationContext
): Set {
- if (classSymbol.isCompanion && (classSymbol.getContainingClassSymbol(session) as? FirClassSymbol<*>)?.isBaseRealmObject == true) {
+ if (classSymbol.isCompanion && (classSymbol.getContainingClassSymbol() as? FirClassSymbol<*>)?.isBaseRealmObject == true) {
return setOf(
Names.REALM_OBJECT_COMPANION_SCHEMA_METHOD,
Names.REALM_OBJECT_COMPANION_NEW_INSTANCE_METHOD,
@@ -88,7 +88,7 @@ class CompanionExtension(session: FirSession) : FirDeclarationGenerationExtensio
owner,
RealmPluginGeneratorKey,
callableId.callableName,
- session.builtinTypes.anyType.type,
+ session.builtinTypes.anyType.coneType,
).symbol
)
@@ -98,7 +98,7 @@ class CompanionExtension(session: FirSession) : FirDeclarationGenerationExtensio
owner,
RealmPluginGeneratorKey,
callableId.callableName,
- session.builtinTypes.anyType.type
+ session.builtinTypes.anyType.coneType
).symbol
)
diff --git a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/ObjectExtension.kt b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/ObjectExtension.kt
index 6869c6243f..358b8bcfda 100644
--- a/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/ObjectExtension.kt
+++ b/packages/plugin-compiler/src/main/kotlin/io/realm/kotlin/compiler/fir/model/ObjectExtension.kt
@@ -67,7 +67,7 @@ class ObjectExtension(session: FirSession) : FirDeclarationGenerationExtension(s
owner,
RealmPluginGeneratorKey,
callableId.callableName,
- session.builtinTypes.stringType.type,
+ session.builtinTypes.stringType.coneType,
) {
modality = Modality.OPEN
}.symbol
@@ -78,10 +78,10 @@ class ObjectExtension(session: FirSession) : FirDeclarationGenerationExtension(s
owner,
RealmPluginGeneratorKey,
callableId.callableName,
- session.builtinTypes.booleanType.type,
+ session.builtinTypes.booleanType.coneType,
) {
modality = Modality.OPEN
- valueParameter(Name.identifier("other"), session.builtinTypes.nullableAnyType.type)
+ valueParameter(Name.identifier("other"), session.builtinTypes.nullableAnyType.coneType)
}.symbol
)
Names.REALM_OBJECT_HASH_CODE ->
@@ -90,7 +90,7 @@ class ObjectExtension(session: FirSession) : FirDeclarationGenerationExtension(s
owner,
RealmPluginGeneratorKey,
callableId.callableName,
- session.builtinTypes.intType.type,
+ session.builtinTypes.intType.coneType,
) {
modality = Modality.OPEN
}.symbol
diff --git a/packages/settings.gradle.kts b/packages/settings.gradle.kts
index 6ea6605fde..e95bc1544e 100644
--- a/packages/settings.gradle.kts
+++ b/packages/settings.gradle.kts
@@ -35,20 +35,20 @@ fun getPropertyValue(propertyName: String): String? {
return systemValue
}
-(getPropertyValue("includeSdkModules")?.let { it.toBoolean() } ?: true).let {
- if (it) {
- include(":gradle-plugin")
- include(":plugin-compiler")
- include(":plugin-compiler-shaded")
- include(":library-base")
- include(":library-sync")
- include(":cinterop")
- include(":jni-swig-stub")
- }
-}
-(getPropertyValue("includeTestModules")?.let { it.toBoolean() } ?: true).let {
- if (it) {
- include(":test-base")
- include(":test-sync")
- }
-}
+//(getPropertyValue("includeSdkModules")?.let { it.toBoolean() } ?: true).let {
+// if (it) {
+// include(":gradle-plugin")
+// include(":plugin-compiler")
+// include(":plugin-compiler-shaded")
+// include(":library-base")
+// include(":library-sync")
+// include(":cinterop")
+// include(":jni-swig-stub")
+// }
+//}
+//(getPropertyValue("includeTestModules")?.let { it.toBoolean() } ?: true).let {
+// if (it) {
+// include(":test-base")
+// include(":test-sync")
+// }
+//}
diff --git a/packages/test-base/build.gradle.kts b/packages/test-base/build.gradle.kts
index 3fc4722ce4..4f884fd129 100644
--- a/packages/test-base/build.gradle.kts
+++ b/packages/test-base/build.gradle.kts
@@ -18,7 +18,6 @@
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithSimulatorTests
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
-import kotlin.math.min
plugins {
id("org.jetbrains.kotlin.multiplatform")
@@ -32,7 +31,9 @@ plugins {
// Test relies on the compiler plugin, but we cannot apply our full plugin from within the same
// gradle run, so we just apply the compiler plugin directly
dependencies {
- kotlinCompilerPluginClasspath("io.realm.kotlin:plugin-compiler:${Realm.version}")
+ implementation(project(":packages:library-base"))
+// kotlinCompilerPluginClasspath("io.realm.kotlin:plugin-compiler:${Realm.version}")
+ kotlinCompilerPluginClasspath(project(":packages:plugin-compiler"))
kotlinNativeCompilerPluginClasspath("io.realm.kotlin:plugin-compiler-shaded:${Realm.version}")
kotlinCompilerClasspath("org.jetbrains.kotlin:kotlin-compiler-embeddable:${Versions.kotlin}")
kotlinCompilerClasspath("org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:${Versions.kotlin}")
@@ -43,10 +44,10 @@ dependencies {
configurations.all {
resolutionStrategy.dependencySubstitution {
rootProject.allprojects
- .filter { it != project && it != rootProject }
+ .filter { it != project && it != rootProject && it.name != "packages"}
.forEach { subproject: Project ->
substitute(module("io.realm.kotlin:${subproject.name}:${Realm.version}")).using(
- project(":${subproject.name}")
+ if (subproject.name != "packages") project(":packages:${subproject.name}") else project(":${subproject.name}")
)
}
}
@@ -81,13 +82,13 @@ kotlin {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutines}")
// FIXME AUTO-SETUP Removed automatic dependency injection to ensure observability of
// requirements for now
- implementation("io.realm.kotlin:library-base:${Realm.version}")
+ implementation(project(":packages:library-base"))
// FIXME API-SCHEMA We currently have some tests that verified injection of
// interfaces, uses internal representation for property meta data, etc. Can
// probably be replaced when schema information is exposed in the public API
// Our current compiler plugin tests only runs on JVM, so makes sense to keep them
// for now, but ideally they should go to the compiler plugin tests.
- implementation("io.realm.kotlin:cinterop:${Realm.version}")
+ implementation(project(":packages:cinterop"))
implementation("org.jetbrains.kotlinx:atomicfu:${Versions.atomicfu}")
implementation("com.squareup.okio:okio:${Versions.okio}")
implementation("org.jetbrains.kotlinx:kotlinx-datetime:${Versions.datetime}")
@@ -100,7 +101,9 @@ kotlin {
dependencies {
// TODO AtomicFu doesn't work on the test project due to
// https://github.com/Kotlin/kotlinx.atomicfu/issues/90#issuecomment-597872907
- implementation("co.touchlab:stately-concurrency:1.2.0")
+
+ implementation("co.touchlab:stately-concurrency:2.1.0")
+ implementation(kotlin("test"))
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.coroutines}")
@@ -188,6 +191,7 @@ kotlin {
// Realm dependencies must be converted to -jvm variants here.
// This is currently done using dependency substitution in `build.gradle`.
// See https://kotlinlang.slack.com/archives/C19FD9681/p1685089661499199
+ implementation(kotlin("test"))
}
}
val androidInstrumentedTest by getting {
@@ -215,7 +219,8 @@ kotlin {
dependencies {
// TODO AtomicFu doesn't work on the test project due to
// https://github.com/Kotlin/kotlinx.atomicfu/issues/90#issuecomment-597872907
- implementation("co.touchlab:stately-concurrency:1.2.0")
+ implementation("co.touchlab:stately-concurrency:2.1.0")
+ implementation(kotlin("test"))
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.coroutines}")
@@ -229,7 +234,7 @@ kotlin {
sourceSets {
val jvmMain by getting {
dependencies {
- implementation("io.realm.kotlin:plugin-compiler:${Realm.version}")
+ implementation(project(":packages:plugin-compiler"))
implementation("org.jetbrains.kotlin:kotlin-compiler-embeddable:${Versions.kotlin}")
implementation("dev.zacsweers.kctfork:core:${Versions.kotlinCompileTesting}")
}
diff --git a/packages/test-base/src/jvmTest/kotlin/io/realm/kotlin/test/compiler/BacklinksTests.kt b/packages/test-base/src/jvmTest/kotlin/io/realm/kotlin/test/compiler/BacklinksTests.kt
index 04e299fe5b..ae92a16f99 100644
--- a/packages/test-base/src/jvmTest/kotlin/io/realm/kotlin/test/compiler/BacklinksTests.kt
+++ b/packages/test-base/src/jvmTest/kotlin/io/realm/kotlin/test/compiler/BacklinksTests.kt
@@ -42,11 +42,15 @@ class BacklinksTests {
fun `unsupported types`() {
unsupportedTypes.forEach { entry ->
val (type, value) = entry
+ println("Testing type: $type, value: $value")
val result = createFileAndCompile(
"unsupportedTypes.kt",
TARGET_INVALID_TYPE.format(type, value)
)
+ println("Exit code: ${result.exitCode}")
+ println("Messages: ${result.messages}")
+
assertEquals(KotlinCompilation.ExitCode.COMPILATION_ERROR, result.exitCode)
assertContains(
result.messages,
diff --git a/packages/test-sync/build.gradle.kts b/packages/test-sync/build.gradle.kts0
similarity index 100%
rename from packages/test-sync/build.gradle.kts
rename to packages/test-sync/build.gradle.kts0
diff --git a/settings.gradle.kts b/settings.gradle.kts
index de30f48a8e..14610f20bf 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -17,3 +17,38 @@
rootProject.name = "realm-kotlin-root"
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ mavenCentral()
+ }
+ resolutionStrategy {
+ eachPlugin {
+// if (requested.id.id.startsWith("org.example.buildsrc")) {
+// useModule("org.example:buildSrc:${pluginManagement.version}")
+// }
+ if (requested.id.id == "kotlinx-atomicfu") {
+ useModule("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.27.0")
+ }
+ }
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+include(":packages:gradle-plugin")
+include(":packages:plugin-compiler")
+include(":packages:plugin-compiler-shaded")
+include(":packages:library-base")
+include(":packages:library-sync")
+include(":packages:cinterop")
+include(":packages:jni-swig-stub")
+
+include(":packages:test-base")
+include(":packages:test-sync")
diff --git a/widgets.qss b/widgets.qss
new file mode 100644
index 0000000000..9af680993f
--- /dev/null
+++ b/widgets.qss
@@ -0,0 +1,604 @@
+/*
+ * SPDX-FileCopyrightText: 2022-2024 Megan Conkle
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/******************************************************************************/
+/* Scrollbars */
+/******************************************************************************/
+
+ghostwriter--MarkdownEditor QAbstractScrollArea::corner,
+ghostwriter--HtmlPreview QAbstractScrollArea::corner,
+ghostwriter--Sidebar QAbstractScrollArea::corner {
+ background: transparent;
+}
+
+ghostwriter--MarkdownEditor QAbstractScrollArea,
+ghostwriter--HtmlPreview QAbstractScrollArea,
+ghostwriter--Sidebar QAbstractScrollArea {
+ padding: 3px 3px 0px 3px;
+ margin: 0
+}
+
+ghostwriter--Sidebar MarkdownEditor::horizontal,
+ghostwriter--Sidebar HtmlPreview::horizontal,
+ghostwriter--Sidebar QScrollBar::horizontal {
+ height: 16px;
+ margin: 5px;
+ border: 0;
+ background: transparent;
+}
+
+ghostwriter--MarkdownEditor QScrollBar::vertical,
+ghostwriter--HtmlPreview QScrollBar::vertical,
+ghostwriter--Sidebar QScrollBar::vertical {
+ width: 16px;
+ margin: 5px;
+ border: 0;
+ background: transparent;
+}
+
+
+ghostwriter--MarkdownEditor QScrollBar::horizontal:hover,
+ghostwriter--HtmlPreview QScrollBar::horizontal:hover,
+ghostwriter--Sidebar QScrollBar::horizontal:hover {
+ background-color: #202325;
+ border-radius: 3px;
+}
+
+ghostwriter--MarkdownEditor QScrollBar::vertical:hover,
+ghostwriter--HtmlPreview QScrollBar::vertical:hover,
+ghostwriter--Sidebar QScrollBar::vertical:hover {
+ background-color: #202325;
+ border-radius: 3px;
+}
+
+ghostwriter--MarkdownEditor QScrollBar::handle:horizontal,
+ghostwriter--HtmlPreview QScrollBar::handle:horizontal,
+ghostwriter--Sidebar QScrollBar::handle:horizontal {
+ min-width: 50px;
+ border: 0;
+ background: #444749;
+ border-radius: 3px;
+
+}
+
+ghostwriter--MarkdownEditor QScrollBar::handle:horizontal,
+ghostwriter--HtmlPreview QScrollBar::handle:horizontal,
+ghostwriter--Sidebar QScrollBar::handle:horizontal {
+ min-width: 50px;
+ border: 0;
+ background: #444749;
+ border-radius: 3px;
+}
+
+ghostwriter--MarkdownEditor QScrollBar::handle:vertical,
+ghostwriter--HtmlPreview QScrollBar::handle:vertical,
+ghostwriter--Sidebar QScrollBar::handle:vertical {
+ min-height: 50px;
+ border: 0;
+ background: #444749;
+ border-radius: 3px;
+}
+
+ghostwriter--MarkdownEditor QScrollBar::handle:horizontal:hover,
+ghostwriter--HtmlPreview QScrollBar::handle:horizontal:hover,
+ghostwriter--Sidebar QScrollBar::handle:horizontal:hover {
+ background: #3daee9;
+}
+
+ghostwriter--MarkdownEditor QScrollBar::handle:vertical:hover,
+ghostwriter--HtmlPreview QScrollBar::handle:vertical:hover,
+ghostwriter--Sidebar QScrollBar::handle:vertical:hover {
+ background: #3daee9;
+}
+
+ghostwriter--MarkdownEditor QScrollBar::add-line,
+ghostwriter--HtmlPreview QScrollBar::add-line,
+ghostwriter--Sidebar QScrollBar::add-line,
+ghostwriter--MarkdownEditor QScrollBar::sub-line,
+ghostwriter--HtmlPreview QScrollBar::sub-line,
+ghostwriter--Sidebar QScrollBar::sub-line,
+ghostwriter--MarkdownEditor QScrollBar::add-page,
+ghostwriter--HtmlPreview QScrollBar::add-page,
+ghostwriter--Sidebar QScrollBar::add-page,
+ghostwriter--MarkdownEditor QScrollBar::sub-page,
+ghostwriter--HtmlPreview QScrollBar::sub-page,
+ghostwriter--Sidebar QScrollBar::sub-page,
+ghostwriter--MarkdownEditor QScrollBar::down-arrow,
+ghostwriter--HtmlPreview QScrollBar::down-arrow,
+ghostwriter--Sidebar QScrollBar::down-arrow,
+ghostwriter--MarkdownEditor QScrollBar::right-arrow,
+ghostwriter--HtmlPreview QScrollBar::right-arrow,
+ghostwriter--Sidebar QScrollBar::right-arrow {
+ background: transparent;
+ border: 0
+}
+
+/******************************************************************************/
+/* Menu Bar */
+/******************************************************************************/
+
+QMainWindow QMenuBar {
+ color: #bdc3c7;
+ background-color: #151719;
+ font-size: 10pt;
+ spacing: 2px;
+ border: 0px;
+ border-bottom: 1px;
+ border-color: #2c2f31;
+ border-style: solid;
+ padding: 1px 0px 1px 0px;
+}
+
+QMainWindow QMenuBar::item {
+ padding: 2px 7px 2px 7px;
+ border: 0px;
+ margin: 2px;
+ border-radius: 5px;
+}
+
+QMainWindow QMenuBar::item:selected {
+ background-color: #25282c;
+}
+
+QMainWindow QMenuBar::item:hover {
+ background-color: #373d42;
+}
+
+QMainWindow QMenuBar::item:pressed {
+ background-color: #1f2225;
+}
+
+/******************************************************************************/
+/* Popup menus */
+/******************************************************************************/
+
+QMainWindow QMenu,
+QMenuBar QMenu {
+ color: #bdc3c7;
+ background-color: #1a1d1f;
+ border: 0px;
+ padding: 7px 0px 7px 0px;
+}
+
+QMainWindow QMenu::item,
+QMenuBar QMenu::item {
+ background-color: transparent;
+ padding: 5px 10px 5px 10px;
+ margin: 0px 0px 0px 0px;
+}
+
+QMainWindow QMenu::indicator,
+QMenuBar QMenu::indicator {
+ width: 16px;
+ height: 16px;
+ background-color: #25282c;
+ padding: 0px 5px 0px 5px;
+ margin: 0px 5px 0px 5px;
+}
+
+QMainWindow QMenu::indicator::unchecked,
+QMenuBar QMenu::indicator::unchecked {
+ width: 16px;
+ height: 16px;
+ background-color: #25282c;
+ border-radius: 2px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #bdc3c7;
+ margin: 0px 5px 0px 5px;
+}
+
+QMainWindow QMenu::indicator::checked,
+QMenuBar QMenu::indicator::checked {
+ width: 16px;
+ height: 16px;
+ background-color: #074051;
+ border-radius: 2px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #bdc3c7;
+ margin: 0px 5px 0px 5px;
+}
+
+QMainWindow QMenu::item:selected,
+QMenuBar QMenu::item::selected {
+ background-color: #074051;
+ color: #bdc3c7;
+}
+
+QMainWindow QMenu::icon,
+QMenuBar QMenu::icon {
+ border-radius: 2px;
+ border-width: 0px;
+ padding: 1px 3px 1px 3px;
+ margin: 0px 3px 0px 3px;
+}
+
+QMainWindow QMenu::icon::checked,
+QMenuBar QMenu::icon::checked {
+ background-color: #373d42;
+}
+
+/******************************************************************************/
+/* Editor */
+/******************************************************************************/
+
+QMainWindow QPlainTextEdit {
+ border: 0;
+ margin: 0;
+ padding: 5px;
+ background-color: #151719;
+ color: #bdc3c7;
+ selection-color: #bdc3c7;
+ selection-background-color: #074051;
+ font-family: Noto Sans Mono;
+ font-size: 16pt;
+}
+
+QMainWindow QSplitter::handle {
+ border: 0;
+ padding: 0;
+ margin: 0;
+ background-color: #2c2f31;
+}
+
+QMainWindow QSplitter::handle:vertical {
+ height: 1px;
+}
+
+QMainWindow QSplitter::handle:horizontal {
+ width: 1px;
+}
+
+/******************************************************************************/
+/* Sidebar and Activity Bar */
+/******************************************************************************/
+
+/* Sidebar */
+QMainWindow ghostwriter--Sidebar,
+QSplitter ghostwriter--Sidebar {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ background-color: #151719;
+}
+
+ghostwriter--Sidebar QStackedWidget {
+ border: 0;
+ padding: 1;
+ margin: 0;
+ background-color: #151719;
+ border-width: 0px;
+}
+
+/* Activity bar tabs */
+ghostwriter--Sidebar QPushButton[checkable="true"] {
+ icon-size: 22px;
+ min-width: 40px;
+ max-width: 40px;
+ height: 40px;
+ outline: none;
+ margin: 0;
+ padding: 0;
+ border: 0;
+ background-color: transparent;
+ color: #8b8f92;
+ border-width: 0px;
+ border-left-width: 3px;
+ border-style: solid;
+ border-color: transparent;
+ border-radius: 0px;
+}
+
+ghostwriter--Sidebar QPushButton:checked {
+ border-color: #3daee9;
+ color: #bdc3c7;
+ background-color: #202325;
+}
+
+ghostwriter--Sidebar QPushButton:hover {
+ background-color: #202325;
+}
+
+ghostwriter--Sidebar QPushButton:checked:hover {
+ border-color: #3daee9;
+ color: #bdc3c7;
+ background-color: #202325;
+}
+
+/* Activity bar buttons */
+ghostwriter--Sidebar QPushButton[checkable="false"] {
+ icon-size: 22px;
+ padding: 0;
+ margin: 0;
+ border: 0;
+ border-radius: 5px;
+ background-color: transparent;
+ color: #8b8f92;
+ width: 40px;
+ height: 40px;
+}
+
+ghostwriter--Sidebar QPushButton[checkable="false"]:hover {
+ color: #bdc3c7;
+ background-color: #202325;
+}
+
+ghostwriter--Sidebar QPushButton[checkable="false"]:pressed {
+ color: #bdc3c7;
+ background-color: transparent;
+}
+
+/* Stacked widgets inside sidebar pane */
+
+ghostwriter--Sidebar QListWidget {
+ outline: none;
+ border: 0;
+ padding: 1;
+ background-color: #151719;
+ color: #bdc3c7;
+ font-size: 11pt;
+ font-weight: normal
+}
+
+ghostwriter--Sidebar QListWidget::item {
+ border: 0;
+ padding: 1 0 1 0;
+ margin: 0;
+ background-color: #151719;
+ color: #bdc3c7;
+ font-weight: normal
+}
+
+ghostwriter--Sidebar QListWidget::item:selected {
+ border-radius: 0px;
+ color: #bdc3c7;
+ background-color: #074051;
+}
+
+ghostwriter--Sidebar QLabel {
+ border: 0;
+ padding: 0;
+ margin: 0;
+ background-color: transparent;
+ font-size: 11pt;
+ color: #bdc3c7;
+}
+
+/******************************************************************************/
+/* Status bar */
+/******************************************************************************/
+
+QStatusBar {
+ margin: 0;
+ padding: 0;
+ border-top: 1px solid #2c2f31;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+ background: #151719;
+ color: #8b8f92;
+}
+
+QStatusBar QLabel {
+ font-size: 11pt;
+ margin: 0px;
+ padding: 5px;
+ border: 0;
+ background: transparent;
+ color: #8b8f92;
+}
+
+QStatusBar QToolButton {
+ padding: 5 5 5 5;
+ margin: 0;
+ border: 0;
+ border-radius: 5px;
+ color: #8b8f92;
+ background-color: transparent;
+ font-size: 16px;
+ width: 32px;
+ height: 16px;
+}
+
+QStatusBar QToolButton:hover,
+QStatusBar QToolButton:checked:hover {
+ background-color: #373d42;
+}
+
+QStatusBar QToolButton:pressed,
+QStatusBar QToolButton:checked:pressed {
+ color: #73777a;
+ background-color: #1f2225;
+}
+
+QStatusBar QToolButton:flat,
+QStatusBar QToolButton:checked {
+ background-color: #25282c;
+}
+
+QStatusBar QComboBox {
+ height: 22px;
+ border: 0px;
+ margin: 0;
+ padding: 0;
+ color: #8b8f92;
+ background-color: #151719;
+ font-size: 11pt;
+}
+
+QStatusBar QComboBox:hover {
+ border-bottom: 2px solid #3daee9;
+}
+
+QStatusBar QListView {
+ padding: 7px 0px 7px 0px;
+ margin: 0px;
+ color: #bdc3c7;
+ background-color: #151719;
+}
+
+QStatusBar QListView::item {
+ background-color: transparent;
+ padding: 5px 10px 5px 10px;
+ margin: 0px;
+}
+
+QStatusBar QListView::item:selected {
+ background-color: #074051;
+ color: #bdc3c7;
+}
+
+QStatusBar QComboBox::drop-down {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ height: 20px;
+ width: 20px;
+}
+
+QStatusBar QComboBox::down-arrow {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ height: 14px;
+ width: 14px;
+ image: url(/tmp/KbaWnf.png)
+}
+
+QStatusBar QComboBox::drop-down:hover {
+ border-radius: 10px;
+ background-color: #373d42;
+}
+
+QStatusBar #leftStatusBarWidget,
+QStatusBar #midStatusBarWidget,
+QStatusBar #rightStatusBarWidget {
+ border: 0;
+ margin: 0;
+ padding: 0;
+}
+
+/******************************************************************************/
+/* Find and Replace Pane */
+/******************************************************************************/
+
+ghostwriter--FindReplace QLabel {
+ font-size: 11pt;
+ margin: 0px;
+ padding: 5px;
+ border: 0;
+ background: transparent;
+ color: #8b8f92;
+}
+
+ghostwriter--FindReplace QPushButton {
+ font-size: 16px;
+ padding: 5 5 5 5;
+ margin: 0;
+ border: 0;
+ border-radius: 5px;
+ color: #8b8f92;
+ background-color: transparent;
+ min-width: 16px;
+}
+
+ghostwriter--FindReplace QPushButton:pressed {
+ color: #9da2a6;
+ background-color: transparent;
+}
+
+ghostwriter--FindReplace QPushButton:hover {
+ color: #ffffff;
+ background-color: transparent;
+}
+
+ghostwriter--FindReplace QPushButton:disabled {
+ color: #adb3b6;
+ background-color: transparent;
+}
+
+ghostwriter--FindReplace QPushButton[checkable="true"] {
+ color: #8b8f92;
+ background-color: transparent;
+ min-width: 32px;
+ height: 16px;
+}
+
+ghostwriter--FindReplace QPushButton[checkable="true"]:disabled,
+ghostwriter--FindReplace QPushButton:flat:disabled {
+ color: #adb3b6;
+ background-color: #272a2e;
+}
+
+ghostwriter--FindReplace QPushButton[checkable="true"]:hover,
+ghostwriter--FindReplace QPushButton:checked:hover {
+ background-color: #d0d7db;
+ background-color: #373d42;
+}
+
+ghostwriter--FindReplace QPushButton[checkable="true"]:pressed,
+ghostwriter--FindReplace QPushButton:checked:pressed {
+ color: #73777a;
+ background-color: #1f2225;
+}
+
+ghostwriter--FindReplace QPushButton:checked {
+ background-color: #25282c;
+}
+
+ghostwriter--FindReplace QPushButton:flat {
+ color: #8b8f92;
+ background-color: #25282c;
+ font-weight: bold;
+}
+
+ghostwriter--FindReplace QPushButton:flat:hover {
+ color: #d0d7db;
+ background-color: #373d42;
+}
+
+ghostwriter--FindReplace QPushButton:flat:pressed {
+ color: #73777a;
+ background-color: #1f2225;
+}
+
+ghostwriter--FindReplace QPushButton:flat:disabled {
+ color: #adb3b6;
+ background-color: #272a2e;
+}
+
+ghostwriter--FindReplace QPushButton#matchCaseButton,
+ghostwriter--FindReplace QPushButton#regexButton {
+ font-size: 16px;
+ font-family: default;
+ font-weight: bold;
+}
+
+ghostwriter--FindReplace QPushButton#replaceButton,
+ghostwriter--FindReplace QPushButton#replaceAllButton {
+ font-size: 11pt;
+ font-family: default;
+}
+
+ghostwriter--FindReplace QPushButton#findReplaceCloseButton {
+ padding: 0;
+ margin: 0;
+ icon-size: 16px;
+}
+
+ghostwriter--FindReplace QLineEdit {
+ color: #bdc3c7;
+ background-color: #202325;
+ border: 0px;
+ border-radius: 3px;
+ selection-color: #bdc3c7;
+ selection-background-color: #074051;
+}
+
+ghostwriter--FindReplace QLineEdit:focus {
+ border: 1px solid #1d2022;
+}