Avoid creating fake PSI for default imports
#KT-13860 Fixed
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user