From 9fb3a22a3964fced0a4a4108d1ff137d531c9fdf Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Tue, 31 Dec 2013 12:16:47 +0400 Subject: [PATCH] Prohibit modifiers on initializer #KT-4364 Fixed --- .../jet/lang/resolve/BodyResolver.java | 17 +++++++++++++++-- .../diagnostics/tests/IllegalModifiers.kt | 15 +++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index 2c09faf6d2a..28c3940aecd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.util.containers.Queue; 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.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.LabelResolver; +import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.util.Box; import org.jetbrains.jet.util.ReenteringLazyValueComputationException; @@ -364,17 +366,28 @@ public class BodyResolver { if (primaryConstructor != null) { for (JetClassInitializer anonymousInitializer : anonymousInitializers) { expressionTypingServices.getType(scopeForInitializers, anonymousInitializer.getBody(), NO_EXPECTED_TYPE, context.getOuterDataFlowInfo(), trace); - annotationResolver.resolveAnnotationsWithArguments(scopeForInitializers, anonymousInitializer.getModifierList(), trace); + processModifiersOnInitializer(anonymousInitializer, scopeForInitializers); } } else { for (JetClassInitializer anonymousInitializer : anonymousInitializers) { 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() { for (Map.Entry entry : context.getClasses().entrySet()) { if (!(entry.getKey() instanceof JetClass)) continue; diff --git a/compiler/testData/diagnostics/tests/IllegalModifiers.kt b/compiler/testData/diagnostics/tests/IllegalModifiers.kt index c1639f36585..9c0beb257a6 100644 --- a/compiler/testData/diagnostics/tests/IllegalModifiers.kt +++ b/compiler/testData/diagnostics/tests/IllegalModifiers.kt @@ -66,3 +66,18 @@ abstract class IllegalModifiers5() { try {} catch (annotated("a text") abstract public e: Exception) {} } } + +//Check illegal modifiers on anonymous initializers +abstract class IllegalModifiers6() { + public {} + private {} + protected {} + vararg {} + abstract {} + open {} + final {} + + public annotated {} + + private IllegalModifiers6() {} +} \ No newline at end of file