Remove obsolete code from ModifiersChecker

Simplify existing code and move closer to usages
This commit is contained in:
Alexander Udalov
2017-07-21 17:19:33 +03:00
parent 3a2d93f73e
commit 56b507d141
3 changed files with 26 additions and 73 deletions
@@ -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<KtModifierKeywordToken> 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);
}
}
@@ -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<KtObjectDeclaration> {
@NotNull
@@ -45,6 +46,7 @@ public class KtObjectInfo extends KtClassOrObjectInfo<KtObjectDeclaration> {
}
public boolean isCompanionObject() {
return element.isCompanion() && ModifiersChecker.isCompanionModifierAllowed(element);
return element.isCompanion() &&
KtStubbedPsiUtil.getContainingDeclaration(element) instanceof KtClassOrObject;
}
}
@@ -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<KotlinType, Boolean> 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();