diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt index 1afc11ffc95..471e6d6ace3 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt @@ -91,7 +91,7 @@ sealed class KtLightFieldImpl( override fun getModifierList() = _modifierList - override fun hasModifierProperty(@NonNls name: String) = clsDelegate.hasModifierProperty(name) + override fun hasModifierProperty(@NonNls name: String) = (dummyDelegate ?: clsDelegate).hasModifierProperty(name) override fun getText() = kotlinOrigin?.text ?: "" diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt index 071e4e0cc43..6509e952421 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMethod.kt @@ -254,7 +254,7 @@ class KtLightMethodImpl private constructor( override fun getName() = dummyDelegate?.name ?: clsDelegate.name - override fun hasModifierProperty(name: String) = clsDelegate.hasModifierProperty(name) + override fun hasModifierProperty(name: String) = (dummyDelegate ?: clsDelegate).hasModifierProperty(name) override fun getThrowsList() = clsDelegate.throwsList diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.java b/compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.java new file mode 100644 index 00000000000..6e5eb025bc7 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.java @@ -0,0 +1,17 @@ +public final class A { + @kotlin.jvm.Transient + @kotlin.jvm.Volatile + @org.jetbrains.annotations.NotNull + private transient volatile java.lang.String c; + + @kotlin.jvm.Synchronized + @kotlin.jvm.Strictfp + public final synchronized strictfp void f() { /* compiled code */ } + + @org.jetbrains.annotations.NotNull + public final java.lang.String getC() { /* compiled code */ } + + public final void setC(@org.jetbrains.annotations.NotNull java.lang.String p) { /* compiled code */ } + + public A() { /* compiled code */ } +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt b/compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt new file mode 100644 index 00000000000..87271010f8b --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt @@ -0,0 +1,13 @@ +// A + +class A { + @Synchronized + @Strictfp + fun f() { + + } + + @Transient + @Volatile + var c: String = "" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index 596a589c276..53e3fb46638 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -80,6 +80,12 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/compilationErrors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("AnnotationModifiers.kt") + public void testAnnotationModifiers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt"); + doTest(fileName); + } + @TestMetadata("SameName.kt") public void testSameName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/SameName.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt index a6f49920c17..07c63e611a1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.util.io.FileUtilRt -import com.intellij.psi.JavaPsiFacade -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiField -import com.intellij.psi.PsiMethod +import com.intellij.psi.* import com.intellij.psi.impl.java.stubs.PsiJavaFileStub import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiTreeUtil @@ -188,21 +185,28 @@ object LightClassLazinessChecker { } private data class FieldInfo( - val name: String + val name: String, + val modifiers: List ) private fun fieldInfo(field: PsiField) = with(field) { - FieldInfo(name!!) + FieldInfo( + name!!, PsiModifier.MODIFIERS.asList().filter { hasModifierProperty(it) } + ) } private data class MethodInfo( val name: String, + val modifiers: List, val isConstructor: Boolean, val parameterCount: Int ) private fun methodInfo(method: PsiMethod) = with(method) { - MethodInfo(name, isConstructor, method.parameterList.parametersCount) + MethodInfo( + name, PsiModifier.MODIFIERS.asList().filter { hasModifierProperty(it) }, + isConstructor, method.parameterList.parametersCount + ) } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index ea2e2083160..1d7f378367f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -80,6 +80,12 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/compilationErrors"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("AnnotationModifiers.kt") + public void testAnnotationModifiers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt"); + doTest(fileName); + } + @TestMetadata("SameName.kt") public void testSameName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/compilationErrors/SameName.kt");