Allow default object to be denoted with 'default' modifier

Report 'default' modifier in illegal positions
This commit is contained in:
Pavel V. Talanov
2015-03-05 16:43:26 +03:00
parent b73d7e19b7
commit 913724f0e9
9 changed files with 337 additions and 3 deletions
@@ -91,7 +91,7 @@ public class JetObjectDeclaration extends JetNamedDeclarationStub<KotlinObjectSt
if (stub != null) {
return stub.isDefault();
}
return getClassKeyword() != null;
return getClassKeyword() != null || hasModifier(JetTokens.DEFAULT_KEYWORD);
}
@Override
@@ -39,6 +39,7 @@ import java.util.*;
import static org.jetbrains.kotlin.diagnostics.Errors.*;
import static org.jetbrains.kotlin.lexer.JetTokens.*;
import static org.jetbrains.kotlin.psi.JetStubbedPsiUtil.getContainingDeclaration;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isDefaultObject;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry;
@@ -141,6 +142,7 @@ public class ModifiersChecker {
}
else {
checkInnerModifier(modifierListOwner, descriptor);
checkDefaultModifier(modifierListOwner);
checkModalityModifiers(modifierListOwner);
checkVisibilityModifiers(modifierListOwner, descriptor);
checkVarianceModifiersOfTypeParameters(modifierListOwner);
@@ -232,6 +234,24 @@ public class ModifiersChecker {
IN_OBJECT,
}
private void checkDefaultModifier(@NotNull JetDeclaration declaration) {
if (declaration.hasModifier(DEFAULT_KEYWORD) && !isDefaultModifierAllowed(declaration)) {
reportIllegalModifiers(declaration, Collections.singletonList(DEFAULT_KEYWORD));
}
}
// NOTE: just checks if this is legal context for default modifier (Default object descriptor can be created)
// DEFAULT_OBJECT_NOT_ALLOWED can be reported later
public static boolean isDefaultModifierAllowed(@NotNull JetDeclaration declaration) {
if (declaration instanceof JetObjectDeclaration) {
JetDeclaration containingDeclaration = getContainingDeclaration(declaration);
if (containingDeclaration instanceof JetClassOrObject) {
return true;
}
}
return false;
}
@NotNull
private static InnerModifierCheckResult checkIllegalInner(DeclarationDescriptor descriptor) {
if (!(descriptor instanceof ClassDescriptor)) return InnerModifierCheckResult.ILLEGAL_POSITION;
@@ -20,9 +20,9 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.name.FqName;
import java.util.Collections;
import java.util.List;
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind;
import org.jetbrains.kotlin.psi.JetObjectDeclaration;
import org.jetbrains.kotlin.psi.JetParameter;
import org.jetbrains.kotlin.psi.JetTypeParameterList;
import org.jetbrains.kotlin.resolve.ModifiersChecker;
import java.util.Collections;
import java.util.List;
@@ -54,6 +55,6 @@ public class JetObjectInfo extends JetClassOrObjectInfo<JetObjectDeclaration> {
}
public boolean isDefaultObject() {
return element.isDefault();
return element.isDefault() && ModifiersChecker.isDefaultModifierAllowed(element);
}
}