diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java index 963e37911d4..bd9ae176367 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java @@ -22,6 +22,7 @@ import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.lexer.JetToken; import java.util.ArrayList; @@ -59,6 +60,20 @@ public class JetModifierList extends JetElementImpl { return answer != null ? answer : Collections.emptyList(); } + @NotNull + public List getModifierNodes() { + List modifierNodes = new ArrayList(); + + ASTNode node = getNode().getFirstChildNode(); + while (node != null) { + if (node.getElementType() instanceof JetKeywordToken) { + modifierNodes.add(node); + } + node = node.getTreeNext(); + } + return modifierNodes; + } + public boolean hasModifier(JetToken token) { return getModifierNode(token) != null; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 83d2b69e507..4965bcd008c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -19,8 +19,10 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.*; +import com.intellij.lang.ASTNode; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; +import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -29,10 +31,12 @@ import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptorLite; import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.NamespaceLikeBuilder; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.stubs.elements.JetAnnotationElementType; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; +import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.renderer.DescriptorRenderer; import javax.inject.Inject; @@ -88,6 +92,7 @@ public class DeclarationResolver { public void process(@NotNull JetScope rootScope) { + resolveNamespaceHeaders(); resolveAnnotationConstructors(); resolveConstructorHeaders(); resolveAnnotationStubsOnClassesAndConstructors(); @@ -98,6 +103,29 @@ public class DeclarationResolver { checkRedeclarationsInInnerClassNames(); } + private void resolveNamespaceHeaders() { + for (JetFile file : context.getNamespaceDescriptors().keySet()) { + JetNamespaceHeader namespaceHeader = file.getNamespaceHeader(); + + if (namespaceHeader != null) { + PsiElement firstChild = namespaceHeader.getFirstChild(); + + if (firstChild instanceof JetModifierList) { + JetModifierList modifierList = (JetModifierList) firstChild; + + for (JetAnnotationEntry annotationEntry : modifierList.getAnnotationEntries()) { + JetReferenceExpression reference = annotationEntry.getCalleeExpression().getConstructorReferenceExpression(); + trace.report(UNRESOLVED_REFERENCE.on(reference, reference)); + } + + for (ASTNode node : modifierList.getModifierNodes()) { + trace.report(ILLEGAL_MODIFIER.on(node.getPsi(), (JetKeywordToken) node.getElementType())); + } + } + } + } + } + private void resolveAnnotationConstructors() { for (Map.Entry entry : context.getClasses().entrySet()) { MutableClassDescriptor classDescriptor = entry.getValue(); diff --git a/compiler/testData/diagnostics/tests/IllegalModifiers.kt b/compiler/testData/diagnostics/tests/IllegalModifiers.kt index 46bb50f64af..c1639f36585 100644 --- a/compiler/testData/diagnostics/tests/IllegalModifiers.kt +++ b/compiler/testData/diagnostics/tests/IllegalModifiers.kt @@ -1,4 +1,4 @@ -package illegal_modifiers +myAnnotation public package illegal_modifiers abstract class A() { abstract final fun f()