diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java index b21a7f10a51..0dec14446cc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.scopes.MemberScope; +import org.jetbrains.kotlin.serialization.ProtoBuf; import org.jetbrains.kotlin.types.*; import java.util.Collection; @@ -85,6 +86,10 @@ public class ForceResolveUtil { forceResolveAllContents(callableDescriptor.getReturnType()); forceResolveAllContents(callableDescriptor.getAnnotations()); } + else if (object instanceof TypeAliasDescriptor) { + TypeAliasDescriptor typeAliasDescriptor = (TypeAliasDescriptor) object; + forceResolveAllContents(typeAliasDescriptor.getUnderlyingType()); + } } @Nullable diff --git a/compiler/testData/diagnostics/tests/typealias/aliasesOnly.kt b/compiler/testData/diagnostics/tests/typealias/aliasesOnly.kt index bbac0dd21f7..61663d1776a 100644 --- a/compiler/testData/diagnostics/tests/typealias/aliasesOnly.kt +++ b/compiler/testData/diagnostics/tests/typealias/aliasesOnly.kt @@ -1 +1,6 @@ -typealias S = String \ No newline at end of file +typealias S = String + +class C { + typealias SS = String + typealias SF = (T) -> String +} diff --git a/compiler/testData/diagnostics/tests/typealias/aliasesOnly.txt b/compiler/testData/diagnostics/tests/typealias/aliasesOnly.txt index 6911f7f0e7c..39376966797 100644 --- a/compiler/testData/diagnostics/tests/typealias/aliasesOnly.txt +++ b/compiler/testData/diagnostics/tests/typealias/aliasesOnly.txt @@ -1,3 +1,12 @@ package public typealias S = kotlin.String + +public final class C { + public typealias SF = (T) -> kotlin.String + public typealias SS = kotlin.String + public constructor C() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt index 496b87aba01..ba937b0bfed 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinResolveCache.kt @@ -121,7 +121,8 @@ private object KotlinResolveDataProvider { KtTypeConstraint::class.java, KtSuperTypeList::class.java, KtTypeParameter::class.java, - KtParameter::class.java + KtParameter::class.java, + KtTypeAlias::class.java ) fun findAnalyzableParent(element: KtElement): KtElement { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index 41093c29126..e608ece0318 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -217,7 +217,8 @@ class ResolveElementCache( KtTypeParameter::class.java, KtTypeConstraint::class.java, KtPackageDirective::class.java, - KtCodeFragment::class.java) as KtElement? + KtCodeFragment::class.java, + KtTypeAlias::class.java) as KtElement? when (elementOfAdditionalResolve) { null -> { @@ -306,6 +307,8 @@ class ResolveElementCache( is KtClass -> constructorAdditionalResolve(resolveSession, resolveElement, file) + is KtTypeAlias -> typealiasAdditionalResolve(resolveSession, resolveElement) + is KtTypeParameter -> typeParameterAdditionalResolve(resolveSession, resolveElement) is KtTypeConstraint -> typeConstraintAdditionalResolve(resolveSession, resolveElement) @@ -503,6 +506,14 @@ class ResolveElementCache( return trace } + private fun typealiasAdditionalResolve(resolveSession: ResolveSession, typeAlias: KtTypeAlias): BindingTrace { + val trace = createDelegatingTrace(typeAlias) + val typeAliasDescriptor = resolveSession.resolveToDescriptor(typeAlias) + ForceResolveUtil.forceResolveAllContents(typeAliasDescriptor) + forceResolveAnnotationsInside(typeAlias) + return trace + } + private fun initializerAdditionalResolve(resolveSession: ResolveSession, anonymousInitializer: KtAnonymousInitializer, file: KtFile, statementFilter: StatementFilter): BindingTrace { val trace = createDelegatingTrace(anonymousInitializer) diff --git a/idea/testData/resolve/references/TypeAlias.kt b/idea/testData/resolve/references/TypeAlias.kt new file mode 100644 index 00000000000..f252541eca0 --- /dev/null +++ b/idea/testData/resolve/references/TypeAlias.kt @@ -0,0 +1,9 @@ +package test + +class C + +typealias CA = C + +val x: CA = CA() + +// REF: typealias CA = C diff --git a/idea/testData/resolve/references/TypeAliasRHS.kt b/idea/testData/resolve/references/TypeAliasRHS.kt new file mode 100644 index 00000000000..9167ad16055 --- /dev/null +++ b/idea/testData/resolve/references/TypeAliasRHS.kt @@ -0,0 +1,7 @@ +package test + +class C + +typealias CA = C + +// REF: (test).C diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java index f550879b0f1..3d7a325d64f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java @@ -383,6 +383,18 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest(fileName); } + @TestMetadata("TypeAlias.kt") + public void testTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/references/TypeAlias.kt"); + doTest(fileName); + } + + @TestMetadata("TypeAliasRHS.kt") + public void testTypeAliasRHS() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/references/TypeAliasRHS.kt"); + doTest(fileName); + } + @TestMetadata("TypeArgumentBeforeDot.kt") public void testTypeArgumentBeforeDot() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/references/TypeArgumentBeforeDot.kt");