From 56b507d14184abe0b5d0d685a9ec7f77303e81ea Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 21 Jul 2017 17:19:33 +0300 Subject: [PATCH] Remove obsolete code from ModifiersChecker Simplify existing code and move closer to usages --- .../kotlin/resolve/ModifiersChecker.java | 73 ++----------------- .../resolve/lazy/data/KtObjectInfo.java | 6 +- .../lazy/descriptors/LazyClassDescriptor.java | 20 ++++- 3 files changed, 26 insertions(+), 73 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index 3d806bdaf29..343f33e8e5d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.resolve; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,73 +26,20 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1; import org.jetbrains.kotlin.extensions.DeclarationAttributeAltererExtension; import org.jetbrains.kotlin.lexer.KtKeywordToken; import org.jetbrains.kotlin.lexer.KtModifierKeywordToken; -import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker; import org.jetbrains.kotlin.resolve.checkers.PublishedApiUsageChecker; import org.jetbrains.kotlin.resolve.checkers.UnderscoreChecker; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; import static org.jetbrains.kotlin.diagnostics.Errors.NESTED_CLASS_NOT_ALLOWED; import static org.jetbrains.kotlin.diagnostics.Errors.NESTED_OBJECT_NOT_ALLOWED; import static org.jetbrains.kotlin.lexer.KtTokens.*; -import static org.jetbrains.kotlin.psi.KtStubbedPsiUtil.getContainingDeclaration; public class ModifiersChecker { - private static final Set MODIFIERS_ILLEGAL_ON_PARAMETERS; - - static { - MODIFIERS_ILLEGAL_ON_PARAMETERS = Sets.newHashSet(); - MODIFIERS_ILLEGAL_ON_PARAMETERS.addAll(Arrays.asList(KtTokens.MODIFIER_KEYWORDS_ARRAY)); - MODIFIERS_ILLEGAL_ON_PARAMETERS.remove(KtTokens.VARARG_KEYWORD); - } - - public static boolean isIllegalInner(@NotNull DeclarationDescriptor descriptor) { - return checkIllegalInner(descriptor) != InnerModifierCheckResult.ALLOWED; - } - - private enum InnerModifierCheckResult { - ALLOWED, - ILLEGAL_POSITION, - IN_INTERFACE, - IN_OBJECT, - } - - - // NOTE: just checks if this is legal context for companion modifier (Companion object descriptor can be created) - // COMPANION_OBJECT_NOT_ALLOWED can be reported later - public static boolean isCompanionModifierAllowed(@NotNull KtDeclaration declaration) { - if (declaration instanceof KtObjectDeclaration) { - KtDeclaration containingDeclaration = getContainingDeclaration(declaration); - if (containingDeclaration instanceof KtClassOrObject) { - return true; - } - } - return false; - } - - @NotNull - private static InnerModifierCheckResult checkIllegalInner(@NotNull DeclarationDescriptor descriptor) { - if (!(descriptor instanceof ClassDescriptor)) return InnerModifierCheckResult.ILLEGAL_POSITION; - ClassDescriptor classDescriptor = (ClassDescriptor) descriptor; - - if (classDescriptor.getKind() != ClassKind.CLASS) return InnerModifierCheckResult.ILLEGAL_POSITION; - - DeclarationDescriptor containingDeclaration = classDescriptor.getContainingDeclaration(); - if (!(containingDeclaration instanceof ClassDescriptor)) return InnerModifierCheckResult.ILLEGAL_POSITION; - - if (DescriptorUtils.isInterface(containingDeclaration)) { - return InnerModifierCheckResult.IN_INTERFACE; - } - else if (DescriptorUtils.isObject(containingDeclaration)) { - return InnerModifierCheckResult.IN_OBJECT; - } - else { - return InnerModifierCheckResult.ALLOWED; - } - } - private static boolean isIllegalNestedClass(@NotNull DeclarationDescriptor descriptor) { if (!(descriptor instanceof ClassDescriptor)) return false; DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); @@ -192,20 +138,11 @@ public class ModifiersChecker { return defaultVisibility; } - public static boolean isInnerClass(@Nullable KtModifierList modifierList) { - return modifierList != null && modifierList.hasModifier(INNER_KEYWORD); - } - public class ModifiersCheckingProcedure { - - @NotNull private final BindingTrace trace; - @NotNull - private final LanguageVersionSettings languageVersionSettings; - private ModifiersCheckingProcedure(@NotNull BindingTrace trace, LanguageVersionSettings languageVersionSettings) { + private ModifiersCheckingProcedure(@NotNull BindingTrace trace) { this.trace = trace; - this.languageVersionSettings = languageVersionSettings; } public void checkParameterHasNoValOrVar( @@ -325,6 +262,6 @@ public class ModifiersChecker { @NotNull public ModifiersCheckingProcedure withTrace(@NotNull BindingTrace trace) { - return new ModifiersCheckingProcedure(trace, languageVersionSettings); + return new ModifiersCheckingProcedure(trace); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtObjectInfo.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtObjectInfo.java index 954be26746d..0be807ff38d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtObjectInfo.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/data/KtObjectInfo.java @@ -19,9 +19,10 @@ package org.jetbrains.kotlin.resolve.lazy.data; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.ClassKind; +import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtObjectDeclaration; +import org.jetbrains.kotlin.psi.KtStubbedPsiUtil; import org.jetbrains.kotlin.psi.KtTypeParameterList; -import org.jetbrains.kotlin.resolve.ModifiersChecker; public class KtObjectInfo extends KtClassOrObjectInfo { @NotNull @@ -45,6 +46,7 @@ public class KtObjectInfo extends KtClassOrObjectInfo { } public boolean isCompanionObject() { - return element.isCompanion() && ModifiersChecker.isCompanionModifierAllowed(element); + return element.isCompanion() && + KtStubbedPsiUtil.getContainingDeclaration(element) instanceof KtClassOrObject; } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index 0d25178a0f2..0d1dbd46b48 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -34,7 +34,10 @@ import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt; import org.jetbrains.kotlin.psi.synthetics.SyntheticClassOrObjectDescriptor; -import org.jetbrains.kotlin.resolve.*; +import org.jetbrains.kotlin.resolve.BindingContext; +import org.jetbrains.kotlin.resolve.BindingTrace; +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; +import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; import org.jetbrains.kotlin.resolve.lazy.LazyClassContext; @@ -63,8 +66,10 @@ import static kotlin.collections.CollectionsKt.firstOrNull; import static org.jetbrains.kotlin.descriptors.Visibilities.PRIVATE; import static org.jetbrains.kotlin.descriptors.Visibilities.PUBLIC; import static org.jetbrains.kotlin.diagnostics.Errors.*; +import static org.jetbrains.kotlin.lexer.KtTokens.INNER_KEYWORD; import static org.jetbrains.kotlin.resolve.BindingContext.TYPE; -import static org.jetbrains.kotlin.resolve.ModifiersChecker.*; +import static org.jetbrains.kotlin.resolve.ModifiersChecker.resolveModalityFromModifiers; +import static org.jetbrains.kotlin.resolve.ModifiersChecker.resolveVisibilityFromModifiers; public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDescriptorWithResolutionScopes, LazyEntity { private static final Function1 VALID_SUPERTYPE = type -> { @@ -158,7 +163,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes } this.visibility = isLocal ? Visibilities.LOCAL : resolveVisibilityFromModifiers(modifierList, defaultVisibility); - this.isInner = isInnerClass(modifierList) && !ModifiersChecker.isIllegalInner(this); + this.isInner = modifierList != null && modifierList.hasModifier(INNER_KEYWORD) && !isIllegalInner(this); this.isData = modifierList != null && modifierList.hasModifier(KtTokens.DATA_KEYWORD); this.isHeader = modifierList != null && modifierList.hasModifier(KtTokens.HEADER_KEYWORD); this.isImpl = modifierList != null && modifierList.hasModifier(KtTokens.IMPL_KEYWORD); @@ -258,6 +263,15 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes this.sealedSubclasses = storageManager.createLazyValue(() -> DescriptorUtilsKt.computeSealedSubclasses(this)); } + private static boolean isIllegalInner(@NotNull DeclarationDescriptor descriptor) { + if (!DescriptorUtils.isClass(descriptor)) return true; + + DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + return !(containingDeclaration instanceof ClassDescriptor) || + DescriptorUtils.isInterface(containingDeclaration) || + DescriptorUtils.isObject(containingDeclaration); + } + @NotNull private DeclarationDescriptor createInitializerScopeParent() { ConstructorDescriptor primaryConstructor = getUnsubstitutedPrimaryConstructor();