diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionContext.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionContext.java index 5df4c1820d4..6863f55ba40 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionContext.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolutionContext.java @@ -24,15 +24,27 @@ public class TypeResolutionContext { public final BindingTrace trace; public final boolean checkBounds; public final boolean allowBareTypes; + public final boolean forceResolveLazyTypes; public TypeResolutionContext(@NotNull JetScope scope, @NotNull BindingTrace trace, boolean checkBounds, boolean allowBareTypes) { + this(scope, trace, checkBounds, allowBareTypes, allowBareTypes); + } + + private TypeResolutionContext( + @NotNull JetScope scope, + @NotNull BindingTrace trace, + boolean checkBounds, + boolean allowBareTypes, + boolean forceResolveLazyTypes + ) { this.scope = scope; this.trace = trace; this.checkBounds = checkBounds; this.allowBareTypes = allowBareTypes; + this.forceResolveLazyTypes = forceResolveLazyTypes; } public TypeResolutionContext noBareTypes() { - return new TypeResolutionContext(scope, trace, checkBounds, false); + return new TypeResolutionContext(scope, trace, checkBounds, false, forceResolveLazyTypes); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 2b75d9a8e9a..6ce212a77e4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -78,7 +78,7 @@ public class TypeResolver( return type(debugType) } - if (!c.allowBareTypes && lazinessToken.isLazy()) { + if (!c.allowBareTypes && !c.forceResolveLazyTypes && lazinessToken.isLazy()) { // Bare types can be allowed only inside expressions; lazy type resolution is only relevant for declarations class LazyKotlinType : DelegatingType(), LazyEntity { private val _delegate = storageManager.createLazyValue { doResolvePossiblyBareType(c, typeReference).getActualType() } diff --git a/idea/testData/checker/ResolveTypeInAnnotationArgumentRuntime.kt b/idea/testData/checker/ResolveTypeInAnnotationArgumentRuntime.kt new file mode 100644 index 00000000000..53547204104 --- /dev/null +++ b/idea/testData/checker/ResolveTypeInAnnotationArgumentRuntime.kt @@ -0,0 +1,5 @@ +import kotlin.reflect.KClass + +annotation class Ann(val value: KClass<*>) + +@Ann(Array<String123>::class) class A diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JetPsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JetPsiCheckerTestGenerated.java index c3240f98feb..58c8a0ae17b 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JetPsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JetPsiCheckerTestGenerated.java @@ -283,6 +283,12 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { doTest(fileName); } + @TestMetadata("ResolveTypeInAnnotationArgumentRuntime.kt") + public void testResolveTypeInAnnotationArgumentRuntime() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/ResolveTypeInAnnotationArgumentRuntime.kt"); + doTest(fileName); + } + @TestMetadata("ReturnTypeMismatchOnOverride.kt") public void testReturnTypeMismatchOnOverride() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/ReturnTypeMismatchOnOverride.kt");