Avoid creating fake PSI for default imports

#KT-13860 Fixed
This commit is contained in:
Denis Zharkov
2018-07-09 15:05:15 +03:00
parent acf0bb349c
commit ec23695f77
8 changed files with 200 additions and 106 deletions
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.psi.stubs.KotlinImportDirectiveStub;
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
import org.jetbrains.kotlin.resolve.ImportPath;
public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveStub> {
public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveStub> implements KtImportInfo {
public KtImportDirective(@NotNull ASTNode node) {
super(node);
@@ -59,12 +59,14 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
return getStubOrPsiChild(KtStubElementTypes.IMPORT_ALIAS);
}
@Override
@Nullable
public String getAliasName() {
KtImportAlias alias = getAlias();
return alias != null ? alias.getName() : null;
}
@Override
public boolean isAllUnder() {
KotlinImportDirectiveStub stub = getStub();
if (stub != null) {
@@ -73,6 +75,21 @@ public class KtImportDirective extends KtElementImplStub<KotlinImportDirectiveSt
return getNode().findChildByType(KtTokens.MUL) != null;
}
@Nullable
@Override
public ImportContent getImportContent() {
KtExpression reference = getImportedReference();
if (reference == null) return null;
return new ImportContent.ExpressionBased(reference);
}
@Nullable
@Override
public Name getImportedName() {
return KtImportInfo.DefaultImpls.getImportedName(this);
}
@Override
@Nullable
@IfNotParsed
public FqName getImportedFqName() {
@@ -0,0 +1,37 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.psi
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
interface KtImportInfo {
sealed class ImportContent {
class ExpressionBased(val expression: KtExpression) : ImportContent()
class FqNameBased(val fqName: FqName) : ImportContent()
}
val isAllUnder: Boolean
val importContent: ImportContent?
val importedFqName: FqName?
val aliasName: String?
val importedName: Name?
get() {
return computeNameAsString()?.takeIf(CharSequence::isNotEmpty)?.let(Name::identifier)
}
private fun computeNameAsString(): String? {
if (isAllUnder) return null
aliasName?.let { return it }
val importContent = importContent
return when (importContent) {
is ImportContent.ExpressionBased -> KtPsiUtil.getLastReference(importContent.expression)?.getReferencedName()
is ImportContent.FqNameBased -> importContent.fqName.takeUnless(FqName::isRoot)?.shortName()?.asString()
null -> null
}
}
}
@@ -30,7 +30,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.KtNodeTypes;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.kdoc.psi.api.KDocElement;
import org.jetbrains.kotlin.lexer.KtToken;
import org.jetbrains.kotlin.lexer.KtTokens;
@@ -224,24 +223,6 @@ public class KtPsiUtil {
return null;
}
@Nullable
public static Name getAliasName(@NotNull KtImportDirective importDirective) {
if (importDirective.isAllUnder()) {
return null;
}
String aliasName = importDirective.getAliasName();
KtExpression importedReference = importDirective.getImportedReference();
if (importedReference == null) {
return null;
}
KtSimpleNameExpression referenceExpression = getLastReference(importedReference);
if (aliasName == null) {
aliasName = referenceExpression != null ? referenceExpression.getReferencedName() : null;
}
return aliasName != null && !aliasName.isEmpty() ? Name.identifier(aliasName) : null;
}
@Nullable
public static KtSimpleNameExpression getLastReference(@NotNull KtExpression importedReference) {
KtElement selector = KtPsiUtilKt.getQualifiedElementSelector(importedReference);