Android studio 4.1, Kotlin 1.4.20-RC, incorrect import syntax 错误显示
Android studio 4.1, Kotlin 1.4.20-RC, incorrect import syntax error display
Android Studio 4.1 (AS)
在一个 kotlin 项目中,模块具有 android()、jvm() 和 ios() 多平台目标,我在 commonMain 源集中有一个预期的 class在 androidMain 和 jvmMain 中有实际的 class 实现。 androidMain 实际 class 在 AS 中显示 java 导入错误:
import java.text.DecimalFormat
import java.text.NumberFormat
import java.util.Currency
每一行的“java”是红色的,好像IDE看不到解决这个问题的依赖。因此,当然,所有使用这些导入的相关来源也会在 IDE 中显示为错误。 IDE 显示的错误是错误的,因为 androidMain 源集和 jvmMain 源集所需的依赖项在 build.gradle.kts 中,并且它们在 [=31= 期间解析得很好] 建造。
有趣的是,jvmMain sourseset 中的实际 class 与 AndroidMain 中的来源完全相同,在 AS 中没有显示任何错误。因此 AS 仅在 android 主源集中显示不正确的语法错误。
我只在 kotlin 多平台模块上看到过这个。任何人看到这个并知道如何解决?我不知道 IDE 做了什么可能会导致它错误地解析 gradle 依赖项。
提前感谢任何help/info。
这里是相关模块的 gradle:
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
id("com.android.library")
id(SrcLibraries.spotless)
}
val moduleName = "monayCommon"
group = App.appId
version = App.appVersionName
kotlin {
jvm()
android()
iosX64("ios") {
binaries {
framework {
baseName = moduleName
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(project(":ioCommon"))
implementation(kotlin("stdlib-common"))
implementation("com.oldguy.kmpsc:kmp-sc:0.5.0-SNAPSHOT")
implementation(SrcLibraries.klock)
implementation(SrcLibraries.bigDecimal)
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependsOn(commonMain)
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation(SrcLibraries.androidxCoreKtx)
}
}
val androidTest by getting {
dependsOn(commonMain)
dependsOn(androidMain)
dependencies {
implementation(Kotest.junit5)
implementation(Kotest.junit5Runtime)
implementation(Kotest.core)
implementation(Kotest.assertions)
}
}
val jvmMain by getting {
dependsOn(commonMain)
dependencies {
implementation(kotlin("stdlib-jdk8"))
}
}
val jvmTest by getting {
dependsOn(commonMain)
dependsOn(jvmMain)
dependencies {
implementation(Kotest.junit5)
implementation(Kotest.junit5Runtime)
implementation(Kotest.core)
implementation(Kotest.assertions)
}
}
val iosMain by getting {
dependsOn(commonMain)
dependencies {
implementation(kotlin("stdlib"))
}
}
val iosTest by getting {
dependsOn(commonMain)
dependsOn(iosMain)
}
all {
languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
}
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
android {
compileSdkVersion(AndroidSDK.compile)
buildToolsVersion = AndroidSDK.buildToolsVersion
defaultConfig {
minSdkVersion(AndroidSDK.min)
targetSdkVersion(AndroidSDK.compile)
versionCode = App.appVersion
versionName = App.appVersionName
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
packagingOptions.exclude("META-INF/LICENSE.md")
packagingOptions.exclude("META-INF/LICENSE-notice.md")
sourceSets {
getByName("androidTest") {
setRoot("src\androidAndroidTest")
manifest.srcFile("src\androidMain\AndroidManifest.xml")
java.srcDirs("src\androidAndroidTest\kotlin")
}
getByName("test") {
setRoot("src\androidTest")
java.srcDirs("src\androidTest\kotlin")
}
getByName("main") {
setRoot("src\androidMain")
manifest.srcFile("src\androidMain\AndroidManifest.xml")
java.srcDirs("src\androidMain\kotlin")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
val packForXcode by tasks.creating(Sync::class) {
group = "build"
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets.getByName<KotlinNativeTarget>("ios").binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
val targetDir = File(buildDir, "xcode-frameworks")
from({ framework.outputDirectory })
into(targetDir)
}
tasks.getByName("build").dependsOn(packForXcode)
通过添加
解决了这个问题
kotlin.mpp.enableGranularSourceSetsMetadata=true
到gradle.properties
Android Studio 4.1 (AS)
在一个 kotlin 项目中,模块具有 android()、jvm() 和 ios() 多平台目标,我在 commonMain 源集中有一个预期的 class在 androidMain 和 jvmMain 中有实际的 class 实现。 androidMain 实际 class 在 AS 中显示 java 导入错误:
import java.text.DecimalFormat
import java.text.NumberFormat
import java.util.Currency
每一行的“java”是红色的,好像IDE看不到解决这个问题的依赖。因此,当然,所有使用这些导入的相关来源也会在 IDE 中显示为错误。 IDE 显示的错误是错误的,因为 androidMain 源集和 jvmMain 源集所需的依赖项在 build.gradle.kts 中,并且它们在 [=31= 期间解析得很好] 建造。
有趣的是,jvmMain sourseset 中的实际 class 与 AndroidMain 中的来源完全相同,在 AS 中没有显示任何错误。因此 AS 仅在 android 主源集中显示不正确的语法错误。
我只在 kotlin 多平台模块上看到过这个。任何人看到这个并知道如何解决?我不知道 IDE 做了什么可能会导致它错误地解析 gradle 依赖项。
提前感谢任何help/info。
这里是相关模块的 gradle:
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
id("com.android.library")
id(SrcLibraries.spotless)
}
val moduleName = "monayCommon"
group = App.appId
version = App.appVersionName
kotlin {
jvm()
android()
iosX64("ios") {
binaries {
framework {
baseName = moduleName
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(project(":ioCommon"))
implementation(kotlin("stdlib-common"))
implementation("com.oldguy.kmpsc:kmp-sc:0.5.0-SNAPSHOT")
implementation(SrcLibraries.klock)
implementation(SrcLibraries.bigDecimal)
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependsOn(commonMain)
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation(SrcLibraries.androidxCoreKtx)
}
}
val androidTest by getting {
dependsOn(commonMain)
dependsOn(androidMain)
dependencies {
implementation(Kotest.junit5)
implementation(Kotest.junit5Runtime)
implementation(Kotest.core)
implementation(Kotest.assertions)
}
}
val jvmMain by getting {
dependsOn(commonMain)
dependencies {
implementation(kotlin("stdlib-jdk8"))
}
}
val jvmTest by getting {
dependsOn(commonMain)
dependsOn(jvmMain)
dependencies {
implementation(Kotest.junit5)
implementation(Kotest.junit5Runtime)
implementation(Kotest.core)
implementation(Kotest.assertions)
}
}
val iosMain by getting {
dependsOn(commonMain)
dependencies {
implementation(kotlin("stdlib"))
}
}
val iosTest by getting {
dependsOn(commonMain)
dependsOn(iosMain)
}
all {
languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
}
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
android {
compileSdkVersion(AndroidSDK.compile)
buildToolsVersion = AndroidSDK.buildToolsVersion
defaultConfig {
minSdkVersion(AndroidSDK.min)
targetSdkVersion(AndroidSDK.compile)
versionCode = App.appVersion
versionName = App.appVersionName
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
packagingOptions.exclude("META-INF/LICENSE.md")
packagingOptions.exclude("META-INF/LICENSE-notice.md")
sourceSets {
getByName("androidTest") {
setRoot("src\androidAndroidTest")
manifest.srcFile("src\androidMain\AndroidManifest.xml")
java.srcDirs("src\androidAndroidTest\kotlin")
}
getByName("test") {
setRoot("src\androidTest")
java.srcDirs("src\androidTest\kotlin")
}
getByName("main") {
setRoot("src\androidMain")
manifest.srcFile("src\androidMain\AndroidManifest.xml")
java.srcDirs("src\androidMain\kotlin")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
val packForXcode by tasks.creating(Sync::class) {
group = "build"
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets.getByName<KotlinNativeTarget>("ios").binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
val targetDir = File(buildDir, "xcode-frameworks")
from({ framework.outputDirectory })
into(targetDir)
}
tasks.getByName("build").dependsOn(packForXcode)
通过添加
解决了这个问题kotlin.mpp.enableGranularSourceSetsMetadata=true
到gradle.properties