diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedOnInlineMethodChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedOnInlineMethodChecker.kt new file mode 100644 index 00000000000..dae9e265b2b --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedOnInlineMethodChecker.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.jvm.checkers + +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext +import org.jetbrains.kotlin.resolve.jvm.annotations.findSynchronizedAnnotation +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm + +object SynchronizedOnInlineMethodChecker : DeclarationChecker { + override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { + if (descriptor is FunctionDescriptor && descriptor.isInline) { + val annotation = descriptor.findSynchronizedAnnotation() + if (annotation != null) { + val reportOn = DescriptorToSourceUtils.getSourceFromAnnotation(annotation) ?: declaration + context.trace.report(ErrorsJvm.SYNCHRONIZED_ON_INLINE.on(reportOn)) + } + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index 2e697dde6cb..c7c9c44934d 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -57,6 +57,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(VOLATILE_ON_VALUE, "'@Volatile' annotation cannot be used on immutable properties"); MAP.put(VOLATILE_ON_DELEGATE, "'@Volatile' annotation cannot be used on delegated properties"); MAP.put(SYNCHRONIZED_ON_ABSTRACT, "'@Synchronized' annotation cannot be used on abstract functions"); + MAP.put(SYNCHRONIZED_ON_INLINE, "'@Synchronized' annotation has no effect on inline functions"); MAP.put(EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT, "External declaration can not be abstract"); MAP.put(EXTERNAL_DECLARATION_CANNOT_HAVE_BODY, "External declaration can not have a body"); MAP.put(EXTERNAL_DECLARATION_IN_INTERFACE, "Members of interfaces can not be external"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index 136fe8376c1..a27d81bf3c8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -48,6 +48,7 @@ public interface ErrorsJvm { DiagnosticFactory0 VOLATILE_ON_VALUE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 VOLATILE_ON_DELEGATE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 SYNCHRONIZED_ON_ABSTRACT = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 SYNCHRONIZED_ON_INLINE = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 OVERLOADS_ABSTRACT = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt index 06d7e7b8b05..f67244b9d21 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt @@ -37,7 +37,8 @@ object JvmPlatformConfigurator : PlatformConfiguratorBase( ExpectedActualDeclarationChecker(listOf(JavaActualAnnotationArgumentExtractor())), JvmAnnotationsTargetNonExistentAccessorChecker(), BadInheritedJavaSignaturesChecker, - JvmMultifileClassStateChecker + JvmMultifileClassStateChecker, + SynchronizedOnInlineMethodChecker ), additionalCallCheckers = listOf( diff --git a/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt b/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt new file mode 100644 index 00000000000..c4b037fafaa --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt @@ -0,0 +1,16 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +@Synchronized +inline fun foo(f: () -> Unit): Unit = f() + +var bar: String + @Synchronized + inline get() = "" + @Synchronized + inline set(value) {} + +inline var baz: String + @Synchronized + get() = "" + @Synchronized + set(value) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.txt b/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.txt new file mode 100644 index 00000000000..81b22ed4e52 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.txt @@ -0,0 +1,5 @@ +package + +@get:kotlin.jvm.Synchronized @set:kotlin.jvm.Synchronized public var bar: kotlin.String +@get:kotlin.jvm.Synchronized @set:kotlin.jvm.Synchronized public var baz: kotlin.String +@kotlin.jvm.Synchronized public inline fun foo(/*0*/ f: () -> kotlin.Unit): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index ad861babfbc..6e58a2da659 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -2736,6 +2736,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW public void testInlineOnlySuppressesNothingToInline() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inline/inlineOnlySuppressesNothingToInline.kt"); } + + @TestMetadata("synchronizedOnInline.kt") + public void testSynchronizedOnInline() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt"); + } } @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/java") diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index a37da7316b1..a37a0c19656 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -2736,6 +2736,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno public void testInlineOnlySuppressesNothingToInline() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inline/inlineOnlySuppressesNothingToInline.kt"); } + + @TestMetadata("synchronizedOnInline.kt") + public void testSynchronizedOnInline() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt"); + } } @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/java")