diff --git a/compiler/testData/diagnostics/tests/dynamicTypes/callableReferences.kt b/compiler/testData/diagnostics/tests/dynamicTypes/callableReferences.kt new file mode 100644 index 00000000000..c2c85270a3b --- /dev/null +++ b/compiler/testData/diagnostics/tests/dynamicTypes/callableReferences.kt @@ -0,0 +1,12 @@ +// !DIAGNOSTICS: -REFLECTION_TYPES_NOT_LOADED -UNUSED_EXPRESSION + +// MODULE[js]: m1 +// FILE: k.kt + +fun test() { + dynamic::foo +} + +class dynamic { + fun foo() {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dynamicTypes/callableReferences.txt b/compiler/testData/diagnostics/tests/dynamicTypes/callableReferences.txt new file mode 100644 index 00000000000..519af8f4f1e --- /dev/null +++ b/compiler/testData/diagnostics/tests/dynamicTypes/callableReferences.txt @@ -0,0 +1,11 @@ +package + +internal fun test(): kotlin.Unit + +internal final class dynamic { + public constructor dynamic() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal final fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/psi/DynamicSoftKeyword.kt b/compiler/testData/psi/DynamicSoftKeyword.kt index 9f76d2facc0..617940f2001 100644 --- a/compiler/testData/psi/DynamicSoftKeyword.kt +++ b/compiler/testData/psi/DynamicSoftKeyword.kt @@ -1,5 +1,6 @@ dynamic class dynamic(dynamic: dynamic) : dynamic { [dynamic] fun dynamic() { val dynamic = 1 + dynamic::foo } } \ No newline at end of file diff --git a/compiler/testData/psi/DynamicSoftKeyword.txt b/compiler/testData/psi/DynamicSoftKeyword.txt index 6492ef7aa09..a8eb19f46cb 100644 --- a/compiler/testData/psi/DynamicSoftKeyword.txt +++ b/compiler/testData/psi/DynamicSoftKeyword.txt @@ -71,6 +71,15 @@ JetFile: DynamicSoftKeyword.kt PsiWhiteSpace(' ') INTEGER_CONSTANT PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + CALLABLE_REFERENCE_EXPRESSION + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dynamic') + PsiElement(COLONCOLON)('::') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') PsiWhiteSpace('\n ') PsiElement(RBRACE)('}') PsiWhiteSpace('\n') diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 52d8b07b51e..6ed1bb5edd6 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3728,6 +3728,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("callableReferences.kt") + public void testCallableReferences() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dynamicTypes/callableReferences.kt"); + doTest(fileName); + } + @TestMetadata("dynamicCalls.kt") public void testDynamicCalls() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/dynamicTypes/dynamicCalls.kt"); diff --git a/spec-docs/dynamic-types.md b/spec-docs/dynamic-types.md index 7fea4286fe3..6f9b5e85845 100644 --- a/spec-docs/dynamic-types.md +++ b/spec-docs/dynamic-types.md @@ -46,6 +46,7 @@ type "dynamic" is a *soft keyword*: - if it occurs in a non-type context, it's an identifier - in a type context, when followed by a dot (except for a dot that separates a receiver type from a function/property name) or an angle bracket `<`, it's an identifier +- on the left-hand-side of `::` in a callable reference: `dynamic::foo` implies that `dynamic` there is a normal identifier ## Representation