Minor: prettify code in ImportDirectiveProcessor
This commit is contained in:
@@ -41,26 +41,26 @@ public class ImportDirectiveProcessor(
|
|||||||
trace.report(Errors.UNSUPPORTED.on(importDirective, "TypeHierarchyResolver")) // TODO
|
trace.report(Errors.UNSUPPORTED.on(importDirective, "TypeHierarchyResolver")) // TODO
|
||||||
return JetScope.Empty
|
return JetScope.Empty
|
||||||
}
|
}
|
||||||
|
|
||||||
val importedReference = importDirective.getImportedReference() ?: return JetScope.Empty
|
val importedReference = importDirective.getImportedReference() ?: return JetScope.Empty
|
||||||
|
|
||||||
val descriptors: Collection<DeclarationDescriptor>
|
val descriptors = if (importedReference is JetQualifiedExpression) {
|
||||||
if (importedReference is JetQualifiedExpression) {
|
|
||||||
//store result only when we find all descriptors, not only classes on the second phase
|
//store result only when we find all descriptors, not only classes on the second phase
|
||||||
descriptors = qualifiedExpressionResolver.lookupDescriptorsForQualifiedExpression(
|
qualifiedExpressionResolver.lookupDescriptorsForQualifiedExpression(
|
||||||
importedReference, scope, scopeToCheckVisibility, trace, lookupMode, lookupMode == QualifiedExpressionResolver.LookupMode.EVERYTHING
|
importedReference, scope, scopeToCheckVisibility, trace, lookupMode, lookupMode.isEverything()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert(importedReference is JetSimpleNameExpression)
|
assert(importedReference is JetSimpleNameExpression)
|
||||||
descriptors = qualifiedExpressionResolver.lookupDescriptorsForSimpleNameReference(
|
qualifiedExpressionResolver.lookupDescriptorsForSimpleNameReference(
|
||||||
importedReference as JetSimpleNameExpression, scope, scopeToCheckVisibility, trace, lookupMode, true, lookupMode == QualifiedExpressionResolver.LookupMode.EVERYTHING
|
importedReference as JetSimpleNameExpression, scope, scopeToCheckVisibility, trace, lookupMode, true, lookupMode.isEverything()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val referenceExpression = JetPsiUtil.getLastReference(importedReference)
|
val referenceExpression = JetPsiUtil.getLastReference(importedReference)
|
||||||
if (importDirective.isAllUnder()) {
|
if (importDirective.isAllUnder()) {
|
||||||
if (!canAllUnderImportFrom(descriptors) && referenceExpression != null) {
|
if (!canAllUnderImportFrom(descriptors) && referenceExpression != null) {
|
||||||
val toReportOn = descriptors.filterIsInstance<ClassDescriptor>().iterator().next()
|
val toReportOn = descriptors.filterIsInstance<ClassDescriptor>().first()
|
||||||
trace.report(Errors.CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON.on(referenceExpression, toReportOn))
|
trace.report(Errors.CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON.on(referenceExpression, toReportOn))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,8 +75,7 @@ public class ImportDirectiveProcessor(
|
|||||||
return importsScope
|
return importsScope
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val aliasName = JetPsiUtil.getAliasName(importDirective)
|
val aliasName = JetPsiUtil.getAliasName(importDirective) ?: return JetScope.Empty
|
||||||
if (aliasName == null) return JetScope.Empty
|
|
||||||
return SingleImportScope(aliasName, descriptors)
|
return SingleImportScope(aliasName, descriptors)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,34 +85,27 @@ public class ImportDirectiveProcessor(
|
|||||||
if (descriptors.isEmpty()) {
|
if (descriptors.isEmpty()) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for (descriptor in descriptors) {
|
return descriptors.any { it !is ClassDescriptor || canAllUnderImportFromClass(it) }
|
||||||
if (descriptor !is ClassDescriptor) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if (canAllUnderImportFromClass(descriptor)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun canAllUnderImportFromClass(descriptor: ClassDescriptor): Boolean {
|
public fun canAllUnderImportFromClass(descriptor: ClassDescriptor): Boolean = !descriptor.getKind().isSingleton()
|
||||||
return !descriptor.getKind().isSingleton()
|
|
||||||
}
|
|
||||||
|
|
||||||
platformStatic public fun canImportMembersFrom(descriptors: Collection<DeclarationDescriptor>, reference: JetSimpleNameExpression, trace: BindingTrace, lookupMode: QualifiedExpressionResolver.LookupMode): Boolean {
|
platformStatic public fun canImportMembersFrom(
|
||||||
if (lookupMode == QualifiedExpressionResolver.LookupMode.ONLY_CLASSES_AND_PACKAGES) {
|
descriptors: Collection<DeclarationDescriptor>,
|
||||||
|
reference: JetSimpleNameExpression,
|
||||||
|
trace: BindingTrace,
|
||||||
|
lookupMode: QualifiedExpressionResolver.LookupMode
|
||||||
|
): Boolean {
|
||||||
|
if (lookupMode.isOnlyClassesAndPackages()) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptors.size() == 1) {
|
descriptors.singleOrNull()?.let { return canImportMembersFrom(it, reference, trace, lookupMode) }
|
||||||
return canImportMembersFrom(descriptors.iterator().next(), reference, trace, lookupMode)
|
|
||||||
}
|
|
||||||
|
|
||||||
val temporaryTrace = TemporaryBindingTrace.create(trace, "trace to find out if members can be imported from", reference)
|
val temporaryTrace = TemporaryBindingTrace.create(trace, "trace to find out if members can be imported from", reference)
|
||||||
var canImport = false
|
var canImport = false
|
||||||
for (descriptor in descriptors) {
|
for (descriptor in descriptors) {
|
||||||
canImport = canImport or canImportMembersFrom(descriptor, reference, temporaryTrace, lookupMode)
|
canImport = canImport || canImportMembersFrom(descriptor, reference, temporaryTrace, lookupMode)
|
||||||
}
|
}
|
||||||
if (!canImport) {
|
if (!canImport) {
|
||||||
temporaryTrace.commit()
|
temporaryTrace.commit()
|
||||||
@@ -121,16 +113,21 @@ public class ImportDirectiveProcessor(
|
|||||||
return canImport
|
return canImport
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun canImportMembersFrom(descriptor: DeclarationDescriptor, reference: JetSimpleNameExpression, trace: BindingTrace, lookupMode: QualifiedExpressionResolver.LookupMode): Boolean {
|
private fun canImportMembersFrom(
|
||||||
assert(lookupMode == QualifiedExpressionResolver.LookupMode.EVERYTHING)
|
descriptor: DeclarationDescriptor,
|
||||||
if (descriptor is PackageViewDescriptor) {
|
reference: JetSimpleNameExpression,
|
||||||
return true
|
trace: BindingTrace,
|
||||||
}
|
lookupMode: QualifiedExpressionResolver.LookupMode
|
||||||
if (descriptor is ClassDescriptor) {
|
): Boolean {
|
||||||
|
assert(lookupMode.isEverything())
|
||||||
|
if (descriptor is PackageViewDescriptor || descriptor is ClassDescriptor) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
trace.report(Errors.CANNOT_IMPORT_FROM_ELEMENT.on(reference, descriptor))
|
trace.report(Errors.CANNOT_IMPORT_FROM_ELEMENT.on(reference, descriptor))
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun QualifiedExpressionResolver.LookupMode.isEverything() = this == QualifiedExpressionResolver.LookupMode.EVERYTHING
|
||||||
|
private fun QualifiedExpressionResolver.LookupMode.isOnlyClassesAndPackages() = this == QualifiedExpressionResolver.LookupMode.ONLY_CLASSES_AND_PACKAGES
|
||||||
Reference in New Issue
Block a user