Change importing rules for objects:

Allow importing classes from object, prohibit import-on-demand from objects
It's unclear what import-on-demand from object should mean so we prohibit it for now
This commit is contained in:
Pavel V. Talanov
2015-02-17 16:39:39 +03:00
parent 2e208c4294
commit 88c5379424
11 changed files with 214 additions and 14 deletions
@@ -100,6 +100,7 @@ public interface Errors {
// Imports
DiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> CANNOT_IMPORT_FROM_ELEMENT = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<JetSimpleNameExpression, ClassDescriptor> CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> CANNOT_BE_IMPORTED = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<JetExpression, String> CONFLICTING_IMPORT = DiagnosticFactory1.create(ERROR);
@@ -166,6 +166,7 @@ public class DefaultErrorMessages {
MAP.put(EXPRESSION_EXPECTED_PACKAGE_FOUND, "Expression expected, but a package name found");
MAP.put(CANNOT_IMPORT_FROM_ELEMENT, "Cannot import from ''{0}''", NAME);
MAP.put(CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON, "Cannot import-on-demand from object ''{0}''", NAME);
MAP.put(CANNOT_BE_IMPORTED, "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME);
MAP.put(CONFLICTING_IMPORT, "Conflicting import, imported name ''{0}'' is ambiguous", STRING);
MAP.put(PLATFORM_CLASS_MAPPED_TO_KOTLIN, "This class shouldn''t be used in Kotlin. Use {0} instead.", CLASSES_OR_SEPARATED);
@@ -34,7 +34,7 @@ public class Importer {
if (descriptor is PackageViewDescriptor) {
allUnderImportScopes.add(NoSubpackagesInPackageScope(descriptor))
}
else if (descriptor is ClassDescriptor && descriptor.getKind() != ClassKind.OBJECT) {
else if (descriptor is ClassDescriptor && QualifiedExpressionResolver.canAllUnderImportFromClass(descriptor)) {
allUnderImportScopes.add(descriptor.getStaticScope())
allUnderImportScopes.add(descriptor.getUnsubstitutedInnerClassesScope())
@@ -54,6 +54,25 @@ public class QualifiedExpressionResolver {
EVERYTHING
}
public static boolean canAllUnderImportFrom(@NotNull Collection<DeclarationDescriptor> descriptors) {
if (descriptors.isEmpty()) {
return true;
}
for (DeclarationDescriptor descriptor : descriptors) {
if (!(descriptor instanceof ClassDescriptor)) {
return true;
}
if (canAllUnderImportFromClass((ClassDescriptor) descriptor)) {
return true;
}
}
return false;
}
public static boolean canAllUnderImportFromClass(@NotNull ClassDescriptor descriptor) {
return !descriptor.getKind().isSingleton();
}
@NotNull
public Collection<DeclarationDescriptor> processImportReference(
@NotNull JetImportDirective importDirective,
@@ -88,6 +107,10 @@ public class QualifiedExpressionResolver {
JetSimpleNameExpression referenceExpression = JetPsiUtil.getLastReference(importedReference);
if (importDirective.isAllUnder()) {
if (!canAllUnderImportFrom(descriptors) && referenceExpression != null) {
trace.report(CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON.on(referenceExpression, (ClassDescriptor) descriptors.iterator().next()));
}
if (referenceExpression == null || !canImportMembersFrom(descriptors, referenceExpression, trace, lookupMode)) {
return Collections.emptyList();
}
@@ -150,7 +173,7 @@ public class QualifiedExpressionResolver {
if (descriptor instanceof PackageViewDescriptor) {
return true;
}
if (descriptor instanceof ClassDescriptor && !((ClassDescriptor) descriptor).getKind().isSingleton()) {
if (descriptor instanceof ClassDescriptor) {
return true;
}
trace.report(CANNOT_IMPORT_FROM_ELEMENT.on(reference, descriptor));