From 4b68a6e51ac3ff10ee817808db9964487337531b Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 10 Jan 2011 18:16:19 +0300 Subject: [PATCH] Additional constraints on type parameters --- idea/src/org/jetbrains/jet/JetNodeTypes.java | 4 +- .../jet/lang/psi/JetTypeConstraint.java | 54 +++++++++++++++++++ .../jet/lang/psi/JetTypeConstraintList.java | 26 +++++++++ .../jet/lang/psi/JetTypeParameterList.java | 13 +++++ .../jetbrains/jet/lang/psi/JetVisitor.java | 8 +++ 5 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraint.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraintList.java diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 7d918688f59..320cc56daa4 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -57,8 +57,8 @@ public interface JetNodeTypes { JetNodeType PROPERTY_ACCESSOR = new JetNodeType("PROPERTY_ACCESSOR", JetPropertyAccessor.class); JetNodeType INITIALIZER_LIST = new JetNodeType("INITIALIZER_LIST", JetInitializerList.class); JetNodeType THIS_CALL = new JetNodeType("THIS_CALL", JetDelegatorToThisCall.class); - JetNodeType TYPE_CONSTRAINT_LIST = new JetNodeType("TYPE_CONSTRAINT_LIST"); - JetNodeType TYPE_CONSTRAINT = new JetNodeType("TYPE_CONSTRAINT"); + JetNodeType TYPE_CONSTRAINT_LIST = new JetNodeType("TYPE_CONSTRAINT_LIST", JetTypeConstraintList.class); + JetNodeType TYPE_CONSTRAINT = new JetNodeType("TYPE_CONSTRAINT", JetTypeConstraint.class); // TODO: Not sure if we need separate NT for each kind of constants JetNodeType NULL = new JetNodeType("NULL", JetConstantExpression.class); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraint.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraint.java new file mode 100644 index 00000000000..9fab67b143a --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraint.java @@ -0,0 +1,54 @@ +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; + +/** + * @author max + */ +public class JetTypeConstraint extends JetElement { + public JetTypeConstraint(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitTypeConstraint(this); + } + + public boolean isClassObjectContraint() { + return findChildByType(JetTokens.CLASS_KEYWORD) != null && + findChildByType(JetTokens.OBJECT_KEYWORD) != null; + } + + @Nullable + public JetTypeReference getSubjectTypeReference() { + ASTNode node = getNode().getFirstChildNode(); + while (node != null) { + IElementType tt = node.getElementType(); + if (tt == JetTokens.COLON) break; + if (tt == JetNodeTypes.TYPE_REFERENCE) return (JetTypeReference) node.getPsi(); + node = node.getTreeNext(); + } + + return null; + } + + @Nullable + public JetTypeReference getExtendsTypeReference() { + boolean passedColon = false; + ASTNode node = getNode().getFirstChildNode(); + while (node != null) { + IElementType tt = node.getElementType(); + if (tt == JetTokens.COLON) passedColon = true; + if (passedColon && tt == JetNodeTypes.TYPE_REFERENCE) return (JetTypeReference) node.getPsi(); + node = node.getTreeNext(); + } + + return null; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraintList.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraintList.java new file mode 100644 index 00000000000..4ad8ebf2d93 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypeConstraintList.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 JetTypeConstraintList extends JetElement { + public JetTypeConstraintList(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(JetVisitor visitor) { + visitor.visitTypeConstraintList(this); + } + + @NotNull + public List getConstraints() { + return findChildrenByType(JetNodeTypes.TYPE_CONSTRAINT); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypeParameterList.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypeParameterList.java index 8f32e66e2ae..8135266b93a 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetTypeParameterList.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypeParameterList.java @@ -2,8 +2,10 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; +import java.util.Collections; import java.util.List; /** @@ -18,6 +20,17 @@ public class JetTypeParameterList extends JetElement { return findChildrenByType(JetNodeTypes.TYPE_PARAMETER); } + @Nullable + public JetTypeConstraintList getTypeConstraintList() { + return (JetTypeConstraintList) findChildByType(JetNodeTypes.TYPE_CONSTRAINT_LIST); + } + + @NotNull + public List getAdditionalConstraints() { + JetTypeConstraintList list = getTypeConstraintList(); + return list != null ? list.getConstraints() : Collections.emptyList(); + } + @Override public void accept(JetVisitor visitor) { visitor.visitTypeParameterList(this); diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 628c8d0683d..c3ddefc87dd 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -285,4 +285,12 @@ public class JetVisitor extends PsiElementVisitor { public void visitPropertyAccessor(JetPropertyAccessor accessor) { visitDeclaration(accessor); } + + public void visitTypeConstraintList(JetTypeConstraintList list) { + visitJetElement(list); + } + + public void visitTypeConstraint(JetTypeConstraint constraint) { + visitJetElement(constraint); + } }