From 1cf197b3d46f36d09a83174ae159ab9691a697aa Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 10 Jan 2011 21:58:55 +0300 Subject: [PATCH] Type nodes --- idea/src/org/jetbrains/jet/JetNodeTypes.java | 10 +-- .../jet/lang/psi/JetFunctionType.java | 70 +++++++++++++++++++ .../jet/lang/psi/JetModifierList.java | 1 + .../jetbrains/jet/lang/psi/JetSelfType.java | 18 +++++ .../jetbrains/jet/lang/psi/JetTupleType.java | 26 +++++++ .../jet/lang/psi/JetTypeElement.java | 13 ++++ .../jet/lang/psi/JetTypeReference.java | 18 +++++ .../jetbrains/jet/lang/psi/JetUserType.java | 50 +++++++++++++ .../jetbrains/jet/lang/psi/JetVisitor.java | 20 ++++++ 9 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetFunctionType.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetSelfType.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetTupleType.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetTypeElement.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetUserType.java diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 8c723f7f3fe..f1b177e3ed8 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -42,15 +42,17 @@ public interface JetNodeTypes { 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", JetTypeArgumentList.class); JetNodeType VALUE_ARGUMENT_LIST = new JetNodeType("VALUE_ARGUMENT_LIST", JetArgumentList.class); JetNodeType VALUE_ARGUMENT = new JetNodeType("VALUE_ARGUMENT", JetArgument.class); JetNodeType TYPE_REFERENCE = new JetNodeType("TYPE_REFERENCE", JetTypeReference.class); JetNodeType LABELED_TUPLE_ENTRY = new JetNodeType("LABELED_TUPLE_ENTRY"); - JetNodeType TUPLE_TYPE = new JetNodeType("TUPLE_TYPE"); - JetNodeType FUNCTION_TYPE = new JetNodeType("FUNCTION_TYPE"); - JetNodeType SELF_TYPE = new JetNodeType("SELF_TYPE"); + + JetNodeType USER_TYPE = new JetNodeType("USER_TYPE", JetUserType.class); + JetNodeType TUPLE_TYPE = new JetNodeType("TUPLE_TYPE", JetTupleType.class); + JetNodeType FUNCTION_TYPE = new JetNodeType("FUNCTION_TYPE", JetFunctionType.class); + JetNodeType SELF_TYPE = new JetNodeType("SELF_TYPE", JetSelfType.class); + JetNodeType DECOMPOSER_PROPERTY_LIST = new JetNodeType("DECOMPOSER_PROPERTY_LIST", JetDecomposerPropertyList.class); // TODO: review JetNodeType RECEIVER_TYPE_ATTRIBUTES = new JetNodeType("RECEIVER_TYPE_ATTRIBUTES"); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetFunctionType.java b/idea/src/org/jetbrains/jet/lang/psi/JetFunctionType.java new file mode 100644 index 00000000000..ef36e94c79c --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetFunctionType.java @@ -0,0 +1,70 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +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.JetNodeTypes; +import org.jetbrains.jet.lexer.JetTokens; + +import java.util.Collections; +import java.util.List; + +/** + * @author max + */ +public class JetFunctionType extends JetTypeElement { + public JetFunctionType(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitFunctionType(this); + } + + @Nullable + public JetParameterList getParameterList() { + return (JetParameterList) findChildByType(JetNodeTypes.VALUE_PARAMETER_LIST); + } + + @NotNull + public List getParameters() { + JetParameterList list = getParameterList(); + return list != null ? list.getParameters() : Collections.emptyList(); + } + + @Nullable + public JetTypeReference getReceiverTypeRef() { + PsiElement child = getFirstChild(); + while (child != null) { + IElementType tt = child.getNode().getElementType(); + if (tt == JetTokens.LPAR || tt == JetTokens.COLON) break; + if (child instanceof JetTypeReference) { + return (JetTypeReference) child; + } + child = child.getNextSibling(); + } + + return null; + } + + @Nullable + public JetTypeReference getReturnTypeRef() { + boolean colonPassed = false; + PsiElement child = getFirstChild(); + while (child != null) { + IElementType tt = child.getNode().getElementType(); + if (tt == JetTokens.COLON) { + colonPassed = true; + } + if (colonPassed && child instanceof JetTypeReference) { + return (JetTypeReference) child; + } + child = child.getNextSibling(); + } + + return null; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetModifierList.java b/idea/src/org/jetbrains/jet/lang/psi/JetModifierList.java index 113eb5f7ab5..8d8a202f550 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetModifierList.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetModifierList.java @@ -22,6 +22,7 @@ public class JetModifierList extends JetElement { visitor.visitModifierList(this); } + @NotNull public List getAttributeAnnotations() { return findChildrenByType(JetNodeTypes.ATTRIBUTE_ANNOTATION); } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetSelfType.java b/idea/src/org/jetbrains/jet/lang/psi/JetSelfType.java new file mode 100644 index 00000000000..fc373952606 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetSelfType.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 JetSelfType extends JetTypeElement { + public JetSelfType(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitSelfType(this); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTupleType.java b/idea/src/org/jetbrains/jet/lang/psi/JetTupleType.java new file mode 100644 index 00000000000..96186048d71 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTupleType.java @@ -0,0 +1,26 @@ +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 JetTupleType extends JetTypeElement { + public JetTupleType(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitTupleType(this); + } + + @NotNull + public List getComponentTypeRefs() { + return findChildrenByType(JetNodeTypes.TYPE_REFERENCE); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypeElement.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypeElement.java new file mode 100644 index 00000000000..2c90533cd59 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypeElement.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author max + */ +public abstract class JetTypeElement extends JetElement { + public JetTypeElement(@NotNull ASTNode node) { + super(node); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypeReference.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypeReference.java index 63f5e70ab54..372a8f09b5c 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetTypeReference.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypeReference.java @@ -2,6 +2,11 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeTypes; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * @author max @@ -15,4 +20,17 @@ public class JetTypeReference extends JetElement { public void accept(JetVisitor visitor) { visitor.visitTypeReference(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(); + } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetUserType.java b/idea/src/org/jetbrains/jet/lang/psi/JetUserType.java new file mode 100644 index 00000000000..45fb3ee0a04 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetUserType.java @@ -0,0 +1,50 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lexer.JetTokens; + +import java.util.Collections; +import java.util.List; + +/** + * @author max + */ +public class JetUserType extends JetTypeElement { + public JetUserType(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitUserType(this); + } + + @NotNull + public String getReferencedName() { + StringBuilder answer = new StringBuilder(); + ASTNode childNode = getNode().getFirstChildNode(); + while (childNode != null) { + IElementType tt = childNode.getElementType(); + if (tt == JetTokens.IDENTIFIER || tt == JetTokens.DOT || tt == JetTokens.NAMESPACE_KEYWORD) { + answer.append(childNode.getText()); + } + childNode = childNode.getTreeNext(); + } + return answer.toString(); + } + + @Nullable + public JetTypeArgumentList getTypeArgumentList() { + return (JetTypeArgumentList) findChildByType(JetNodeTypes.TYPE_ARGUMENT_LIST); + } + + @NotNull + public List getTypeArguments() { + JetTypeArgumentList list = getTypeArgumentList(); + return list != null ? list.getArguments() : Collections.emptyList(); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index c3ddefc87dd..06b050216e7 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -293,4 +293,24 @@ public class JetVisitor extends PsiElementVisitor { public void visitTypeConstraint(JetTypeConstraint constraint) { visitJetElement(constraint); } + + private void visitTypeElement(JetTypeElement type) { + visitJetElement(type); + } + + public void visitUserType(JetUserType type) { + visitTypeElement(type); + } + + public void visitTupleType(JetTupleType type) { + visitTypeElement(type); + } + + public void visitFunctionType(JetFunctionType type) { + visitTypeElement(type); + } + + public void visitSelfType(JetSelfType type) { + visitTypeElement(type); + } }