diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 97b40295d95..254532d789d 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -42,9 +42,9 @@ public interface JetNodeTypes { JetNodeType IMPORT_DIRECTIVE = new JetNodeType("IMPORT_DIRECTIVE", JetImportDirective.class); JetNodeType IMPORTED = new JetNodeType("IMPORTED"); JetNodeType NAMESPACE_BODY = new JetNodeType("NAMESPACE_BODY"); - JetNodeType MODIFIER_LIST = new JetNodeType("MODIFIER_LIST"); - JetNodeType ATTRIBUTE_ANNOTATION = new JetNodeType("ATTRIBUTE_ANNOTATION"); - JetNodeType ATTRIBUTE = new JetNodeType("ATTRIBUTE"); + JetNodeType MODIFIER_LIST = new JetNodeType("MODIFIER_LIST", JetModifierList.class); + JetNodeType ATTRIBUTE_ANNOTATION = new JetNodeType("ATTRIBUTE_ANNOTATION", JetAttributeAnnotation.class); + JetNodeType ATTRIBUTE = new JetNodeType("ATTRIBUTE", JetAttribute.class); JetNodeType USER_TYPE = new JetNodeType("USER_TYPE"); JetNodeType TYPE_ARGUMENT_LIST = new JetNodeType("TYPE_ARGUMENT_LIST"); JetNodeType VALUE_ARGUMENT_LIST = new JetNodeType("VALUE_ARGUMENT_LIST"); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetAttribute.java b/idea/src/org/jetbrains/jet/lang/psi/JetAttribute.java new file mode 100644 index 00000000000..8ad6416ad34 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetAttribute.java @@ -0,0 +1,18 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author max + */ +public class JetAttribute extends JetElement { + public JetAttribute(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitAttribute(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetAttributeAnnotation.java b/idea/src/org/jetbrains/jet/lang/psi/JetAttributeAnnotation.java new file mode 100644 index 00000000000..1488d3db220 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetAttributeAnnotation.java @@ -0,0 +1,25 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeTypes; + +import java.util.List; + +/** + * @author max + */ +public class JetAttributeAnnotation extends JetElement { + public JetAttributeAnnotation(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitAttributeAnnotation(this); + } + + public List getAttributes() { + return findChildrenByType(JetNodeTypes.ATTRIBUTE); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetClass.java b/idea/src/org/jetbrains/jet/lang/psi/JetClass.java index d26972841f7..b9c5a013225 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetClass.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetClass.java @@ -1,8 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeTypes; @@ -25,12 +23,7 @@ public class JetClass extends JetNamedDeclaration{ } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitClass(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitClass(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetClassBody.java b/idea/src/org/jetbrains/jet/lang/psi/JetClassBody.java index 6ae2d5cc63d..804952e4b3d 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetClassBody.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetClassBody.java @@ -1,8 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeTypes; @@ -21,12 +19,7 @@ public class JetClassBody extends JetElement { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitClassBody(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitClassBody(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetClassObject.java b/idea/src/org/jetbrains/jet/lang/psi/JetClassObject.java index b4d2c658c6c..c24b46b3b8c 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetClassObject.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetClassObject.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; /** @@ -13,13 +12,8 @@ public class JetClassObject extends JetDeclaration { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitClassObject(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitClassObject(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetConstructor.java b/idea/src/org/jetbrains/jet/lang/psi/JetConstructor.java index e9eb8244ac8..b1011afe66c 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetConstructor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetConstructor.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; /** @@ -13,13 +12,8 @@ public class JetConstructor extends JetDeclaration { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitConstructor(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitConstructor(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetDeclaration.java b/idea/src/org/jetbrains/jet/lang/psi/JetDeclaration.java index eec5ab68aa5..9b6a987e71b 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetDeclaration.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetDeclaration.java @@ -3,6 +3,8 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.JetNodeTypes; /** * @author max @@ -11,4 +13,9 @@ public abstract class JetDeclaration extends JetElement { public JetDeclaration(@NotNull ASTNode node) { super(node); } + + @Nullable + public JetModifierList getModifierList() { + return (JetModifierList) findChildByType(JetNodeTypes.MODIFIER_LIST); + } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetDecomposer.java b/idea/src/org/jetbrains/jet/lang/psi/JetDecomposer.java index de34c84d7a5..244717d4ef9 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetDecomposer.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetDecomposer.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; /** @@ -13,12 +12,7 @@ public class JetDecomposer extends JetNamedDeclaration { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitDecomposer(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitDecomposer(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetElement.java b/idea/src/org/jetbrains/jet/lang/psi/JetElement.java index 5cac4283aa5..b4bd3734fc5 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetElement.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetElement.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.lang.psi; import com.intellij.extapi.psi.ASTWrapperPsiElement; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; +import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.JetLanguage; @@ -24,4 +25,18 @@ public class JetElement extends ASTWrapperPsiElement { public String toString() { return getNode().getElementType().toString(); } + + @Override + public final void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof JetVisitor) { + accept((JetVisitor) visitor); + } + else { + visitor.visitElement(this); + } + } + + public void accept(JetVisitor visitor) { + visitor.visitJetElement(this); + } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetExtension.java b/idea/src/org/jetbrains/jet/lang/psi/JetExtension.java index 166af32d736..1eabdb817dd 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetExtension.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetExtension.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeTypes; @@ -25,12 +24,7 @@ public class JetExtension extends JetNamedDeclaration { @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitExtension(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitExtension(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetFunction.java b/idea/src/org/jetbrains/jet/lang/psi/JetFunction.java index 85e03264044..ad232a0680a 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetFunction.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetFunction.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; /** @@ -13,12 +12,7 @@ public class JetFunction extends JetNamedDeclaration { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitFunction(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitFunction(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetImportDirective.java b/idea/src/org/jetbrains/jet/lang/psi/JetImportDirective.java index d5c53699bf1..ab5d4a903b3 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetImportDirective.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetImportDirective.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; /** @@ -13,12 +12,7 @@ public class JetImportDirective extends JetElement { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitImportDirective(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitImportDirective(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetModifierList.java b/idea/src/org/jetbrains/jet/lang/psi/JetModifierList.java new file mode 100644 index 00000000000..113eb5f7ab5 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetModifierList.java @@ -0,0 +1,46 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lexer.JetToken; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author max + */ +public class JetModifierList extends JetElement { + public JetModifierList(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitModifierList(this); + } + + public List getAttributeAnnotations() { + return findChildrenByType(JetNodeTypes.ATTRIBUTE_ANNOTATION); + } + + public List getAttributes() { + List answer = null; + for (JetAttributeAnnotation annotation : getAttributeAnnotations()) { + if (answer == null) answer = new ArrayList(); + answer.addAll(annotation.getAttributes()); + } + return answer != null ? answer : Collections.emptyList(); + } + + public boolean hasModifier(JetToken token) { + ASTNode node = getNode().getFirstChildNode(); + while (node != null) { + if (node.getElementType() == token) return true; + node = node.getTreeNext(); + } + return false; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetNamespace.java b/idea/src/org/jetbrains/jet/lang/psi/JetNamespace.java index a6943b677d3..cdb1d626c60 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetNamespace.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetNamespace.java @@ -2,7 +2,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeTypes; @@ -18,13 +17,8 @@ public class JetNamespace extends JetDeclaration { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitNamespace(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitNamespace(this); } public List getDeclarations() { diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetProperty.java b/idea/src/org/jetbrains/jet/lang/psi/JetProperty.java index 4976641189f..da882202583 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetProperty.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetProperty.java @@ -1,8 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.PsiNameIdentifierOwner; import org.jetbrains.annotations.NotNull; /** @@ -14,12 +12,7 @@ public class JetProperty extends JetNamedDeclaration { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitProperty(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitProperty(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypedef.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypedef.java index 7ed121d8e81..62a01d380d9 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetTypedef.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypedef.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElementVisitor; import org.jetbrains.annotations.NotNull; /** @@ -13,12 +12,7 @@ public class JetTypedef extends JetNamedDeclaration { } @Override - public void accept(@NotNull PsiElementVisitor visitor) { - if (visitor instanceof JetVisitor) { - ((JetVisitor) visitor).visitTypedef(this); - } - else { - visitor.visitElement(this); - } + public void accept(@NotNull JetVisitor visitor) { + visitor.visitTypedef(this); } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 445c341b6d2..3dd525d433a 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -61,4 +61,16 @@ public class JetVisitor extends PsiElementVisitor { public void visitClassBody(JetClassBody classBody) { visitJetElement(classBody); } + + public void visitModifierList(JetModifierList list) { + visitJetElement(list); + } + + public void visitAttributeAnnotation(JetAttributeAnnotation annotation) { + visitJetElement(annotation); + } + + public void visitAttribute(JetAttribute attribute) { + visitJetElement(attribute); + } }