Prohibit modifiers on initializer #KT-4364 Fixed

This commit is contained in:
Natalia Ukhorskaya
2013-12-31 12:16:47 +04:00
parent 161998d2b8
commit 9fb3a22a39
2 changed files with 30 additions and 2 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.util.containers.Queue; import com.intellij.util.containers.Queue;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -39,6 +40,7 @@ import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lang.types.expressions.DataFlowUtils; import org.jetbrains.jet.lang.types.expressions.DataFlowUtils;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.types.expressions.LabelResolver; import org.jetbrains.jet.lang.types.expressions.LabelResolver;
import org.jetbrains.jet.lexer.JetKeywordToken;
import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.util.Box; import org.jetbrains.jet.util.Box;
import org.jetbrains.jet.util.ReenteringLazyValueComputationException; import org.jetbrains.jet.util.ReenteringLazyValueComputationException;
@@ -364,17 +366,28 @@ public class BodyResolver {
if (primaryConstructor != null) { if (primaryConstructor != null) {
for (JetClassInitializer anonymousInitializer : anonymousInitializers) { for (JetClassInitializer anonymousInitializer : anonymousInitializers) {
expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, context.getOuterDataFlowInfo(), trace); expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, context.getOuterDataFlowInfo(), trace);
annotationResolver.resolveAnnotationsWithArguments(scopeForInitializers, anonymousInitializer.getModifierList(), trace); processModifiersOnInitializer(anonymousInitializer, scopeForInitializers);
} }
} }
else { else {
for (JetClassInitializer anonymousInitializer : anonymousInitializers) { for (JetClassInitializer anonymousInitializer : anonymousInitializers) {
trace.report(ANONYMOUS_INITIALIZER_IN_TRAIT.on(anonymousInitializer)); trace.report(ANONYMOUS_INITIALIZER_IN_TRAIT.on(anonymousInitializer));
annotationResolver.resolveAnnotationsWithArguments(scopeForInitializers, anonymousInitializer.getModifierList(), trace); processModifiersOnInitializer(anonymousInitializer, scopeForInitializers);
} }
} }
} }
private void processModifiersOnInitializer(@NotNull JetModifierListOwner owner, @NotNull JetScope scope) {
JetModifierList modifierList = owner.getModifierList();
if (modifierList == null) return;
annotationResolver.resolveAnnotationsWithArguments(scope, modifierList, trace);
for (ASTNode node : modifierList.getModifierNodes()) {
trace.report(ILLEGAL_MODIFIER.on(node.getPsi(), (JetKeywordToken) node.getElementType()));
}
}
private void resolvePrimaryConstructorParameters() { private void resolvePrimaryConstructorParameters() {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) { for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
if (!(entry.getKey() instanceof JetClass)) continue; if (!(entry.getKey() instanceof JetClass)) continue;
@@ -66,3 +66,18 @@ abstract class IllegalModifiers5() {
try {} catch (annotated("a text") <!ILLEGAL_MODIFIER!>abstract<!> <!ILLEGAL_MODIFIER!>public<!> e: Exception) {} try {} catch (annotated("a text") <!ILLEGAL_MODIFIER!>abstract<!> <!ILLEGAL_MODIFIER!>public<!> e: Exception) {}
} }
} }
//Check illegal modifiers on anonymous initializers
abstract class IllegalModifiers6() {
<!ILLEGAL_MODIFIER!>public<!> {}
<!ILLEGAL_MODIFIER!>private<!> {}
<!ILLEGAL_MODIFIER!>protected<!> {}
<!ILLEGAL_MODIFIER!>vararg<!> {}
<!ILLEGAL_MODIFIER!>abstract<!> {}
<!ILLEGAL_MODIFIER!>open<!> {}
<!ILLEGAL_MODIFIER!>final<!> {}
<!ILLEGAL_MODIFIER!>public<!> annotated {}
<!ILLEGAL_MODIFIER!>private<!> <!NOT_AN_ANNOTATION_CLASS!>IllegalModifiers6()<!> {}
}