FIR IDE: introduce KtFirConstructorDelegationReference

This commit is contained in:
Ilya Kirillov
2020-07-13 15:56:11 +03:00
parent 0870ded054
commit 7d8ef5c7a2
7 changed files with 93 additions and 0 deletions
@@ -441,6 +441,29 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv
}
}
@TestMetadata("idea/testData/resolve/references/constructorDelegatingReference")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class ConstructorDelegatingReference extends AbstractFirReferenceResolveTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInConstructorDelegatingReference() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/resolve/references/constructorDelegatingReference"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
}
@TestMetadata("toPrimary.kt")
public void testToPrimary() throws Exception {
runTest("idea/testData/resolve/references/constructorDelegatingReference/toPrimary.kt");
}
@TestMetadata("toSecondary.kt")
public void testToSecondary() throws Exception {
runTest("idea/testData/resolve/references/constructorDelegatingReference/toSecondary.kt");
}
}
@TestMetadata("idea/testData/resolve/references/delegatedPropertyAccessors")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -18,6 +18,8 @@ import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.util.OperatorNameConventions
import kotlin.reflect.KClass
@@ -63,6 +65,11 @@ fun FirFunctionCall.getCalleeSymbol(): FirBasedSymbol<*>? =
fun FirReference.getResolvedSymbolOfNameReference(): FirBasedSymbol<*>? =
(this as? FirResolvedNamedReference)?.resolvedSymbol
internal fun FirReference.getResolvedKtSymbolOfNameReference(builder: KtSymbolByFirBuilder): KtSymbol? =
(getResolvedSymbolOfNameReference()?.fir as? FirDeclaration)?.let { firDeclaration ->
builder.buildSymbol(firDeclaration)
}
inline fun <reified D> D.unrollFakeOverrides(): D where D : FirDeclaration, D : FirSymbolOwner<*> {
val symbol = symbol
if (symbol !is PossiblyFirFakeOverrideSymbol<*, *>) return this
@@ -14,6 +14,7 @@ class KotlinFirReferenceContributor : KotlinReferenceProviderContributor {
registerProvider(factory = ::KtFirPropertyDelegationMethodsReference)
registerProvider(factory = ::KtFirDestructuringDeclarationReference)
registerProvider(factory = ::KtFirArrayAccessReference)
registerProvider(factory = ::KtFirConstructorDelegationReference)
}
}
}
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.references
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.fir.getResolvedKtSymbolOfNameReference
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.psi.KtConstructorDelegationReferenceExpression
class KtFirConstructorDelegationReference(
expression: KtConstructorDelegationReferenceExpression
) : KtConstructorDelegationReference(expression), KtFirReference {
override fun resolveToSymbols(analysisSession: KtAnalysisSession): Collection<KtSymbol> {
check(analysisSession is KtFirAnalysisSession)
val fir = expression.getOrBuildFirSafe<FirDelegatedConstructorCall>(analysisSession.firResolveState) ?: return emptyList()
return listOfNotNull(fir.calleeReference.getResolvedKtSymbolOfNameReference(analysisSession.firSymbolBuilder))
}
}
@@ -0,0 +1,6 @@
class A(a: Int) {
constructor() : <caret>this(2)
}
// REF: (in A).A(Int)
@@ -0,0 +1,8 @@
class A(a: Int) {
constructor(b: String) : this(2)
constructor() : <caret>this("2")
}
// REF: (in A).A(String)
@@ -441,6 +441,29 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest
}
}
@TestMetadata("idea/testData/resolve/references/constructorDelegatingReference")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class ConstructorDelegatingReference extends AbstractReferenceResolveTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInConstructorDelegatingReference() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/resolve/references/constructorDelegatingReference"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
}
@TestMetadata("toPrimary.kt")
public void testToPrimary() throws Exception {
runTest("idea/testData/resolve/references/constructorDelegatingReference/toPrimary.kt");
}
@TestMetadata("toSecondary.kt")
public void testToSecondary() throws Exception {
runTest("idea/testData/resolve/references/constructorDelegatingReference/toSecondary.kt");
}
}
@TestMetadata("idea/testData/resolve/references/delegatedPropertyAccessors")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)