diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt index 5b783f1b27c..c7f8a13d9f6 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt @@ -79,6 +79,7 @@ private class KtLightMemberModifierList( ) : KtLightModifierList>(owner) { override fun hasModifierProperty(name: String) = when { name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false + // pretend this method behaves like a default method name == PsiModifier.DEFAULT && isImplementationInInterface() -> true dummyDelegate != null -> { when { @@ -90,6 +91,10 @@ private class KtLightMemberModifierList( else -> clsDelegate.hasModifierProperty(name) } + override fun hasExplicitModifier(name: String) = + // kotlin methods can't be truly default atm, that way we can avoid being reported on by diagnostics, namely android lint + if (name == PsiModifier.DEFAULT) false else super.hasExplicitModifier(name) + private fun isMethodOverride() = owner is KtLightMethod && owner.kotlinOrigin?.hasModifier(KtTokens.OVERRIDE_KEYWORD) ?: false private fun isImplementationInInterface() diff --git a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt index 663840e3bd6..3f2a583119e 100644 --- a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt @@ -1,5 +1,6 @@ package org.jetbrains.uast.test.kotlin +import com.intellij.psi.PsiModifier import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.kotlin.psi.psiUtil.getParentOfType @@ -53,4 +54,12 @@ class KotlinUastApiTest : AbstractKotlinUastTest() { assertEquals(file.psi, xyzzy.nameIdentifier!!.containingFile) } } + + @Test fun testInterfaceMethodWithBody() { + doTest("DefaultImpls") { _, file -> + val bar = file.findElementByText("fun bar() = \"Hello!\"") + assertFalse(bar.containingFile.text!!, bar.psi.modifierList.hasExplicitModifier(PsiModifier.DEFAULT)) + assertTrue(bar.containingFile.text!!, bar.psi.modifierList.hasModifierProperty(PsiModifier.DEFAULT)) + } + } }