diff --git a/idea/src/org/jetbrains/jet/JetNodeType.java b/idea/src/org/jetbrains/jet/JetNodeType.java index 1523bafe6c8..45efb206c69 100644 --- a/idea/src/org/jetbrains/jet/JetNodeType.java +++ b/idea/src/org/jetbrains/jet/JetNodeType.java @@ -3,15 +3,46 @@ */ package org.jetbrains.jet; +import com.intellij.extapi.psi.ASTWrapperPsiElement; +import com.intellij.lang.ASTNode; import com.intellij.lang.Language; +import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.JetLanguage; +import org.jetbrains.jet.lang.psi.JetElement; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; public class JetNodeType extends IElementType { + private Constructor myPsiFactory; + public JetNodeType(@NotNull @NonNls String debugName) { + this(debugName, null); + } + + public JetNodeType(@NotNull @NonNls String debugName, Class psiClass) { super(debugName, JetLanguage.INSTANCE); + try { + myPsiFactory = psiClass != null ? psiClass.getConstructor(ASTNode.class) : null; + } catch (NoSuchMethodException e) { + throw new RuntimeException("Must have a constructor with ASTNode"); + } + } + + public JetElement createPsi(ASTNode node) { + assert node.getElementType() == this; + + try { + if (myPsiFactory == null) { + return new JetElement(node); + } + return myPsiFactory.newInstance(node); + } catch (Exception e) { + throw new RuntimeException("Error creating psi element for node", e); + } } } diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index cabdc22451a..a94f8a7607e 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -6,11 +6,12 @@ package org.jetbrains.jet; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IFileElementType; import org.jetbrains.jet.lang.JetLanguage; +import org.jetbrains.jet.lang.psi.JetNamespace; public interface JetNodeTypes { IFileElementType JET_FILE = new IFileElementType(JetLanguage.INSTANCE); - JetNodeType NAMESPACE = new JetNodeType("NAMESPACE"); + JetNodeType NAMESPACE = new JetNodeType("NAMESPACE", JetNamespace.class); JetNodeType CLASS = new JetNodeType("CLASS"); JetNodeType PROPERTY = new JetNodeType("PROPERTY"); JetNodeType FUN = new JetNodeType("FUN"); diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java index 88e207e0b48..317ad356d04 100644 --- a/idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java @@ -15,6 +15,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IFileElementType; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeType; import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lexer.JetLexer; @@ -51,8 +52,7 @@ public class JetParserDefinition implements ParserDefinition { @NotNull public PsiElement createElement(ASTNode astNode) { - // TODO - return new CompositeNode(astNode); + return ((JetNodeType) astNode.getElementType()).createPsi(astNode); } public PsiFile createFile(FileViewProvider fileViewProvider) { @@ -62,15 +62,4 @@ public class JetParserDefinition implements ParserDefinition { public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode astNode, ASTNode astNode1) { return SpaceRequirements.MAY; } - - private static class CompositeNode extends ASTWrapperPsiElement { - private CompositeNode(@NotNull ASTNode node) { - super(node); - } - - @Override - public String toString() { - return getNode().getElementType().toString(); - } - } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetElement.java b/idea/src/org/jetbrains/jet/lang/psi/JetElement.java new file mode 100644 index 00000000000..5cac4283aa5 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetElement.java @@ -0,0 +1,27 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.extapi.psi.ASTWrapperPsiElement; +import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.JetLanguage; + +/** + * @author max + */ +public class JetElement extends ASTWrapperPsiElement { + public JetElement(@NotNull ASTNode node) { + super(node); + } + + @NotNull + @Override + public Language getLanguage() { + return JetLanguage.INSTANCE; + } + + @Override + public String toString() { + return getNode().getElementType().toString(); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetNamespace.java b/idea/src/org/jetbrains/jet/lang/psi/JetNamespace.java new file mode 100644 index 00000000000..b6b26298762 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetNamespace.java @@ -0,0 +1,15 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; + +/** + * @author max + */ +public class JetNamespace extends JetElement { + public JetNamespace(@NotNull ASTNode node) { + super(node); + } + + +} diff --git a/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java b/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java index 913876b4e1b..06235af3242 100644 --- a/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java +++ b/idea/tests/org/jetbrains/jet/parsing/JetParsingTest.java @@ -37,7 +37,7 @@ public class JetParsingTest extends ParsingTestCase { } private static String getHomeDirectory() { - return new File(PathManager.getResourceRoot(JetParsingTest.class, "/")).getParentFile().getParentFile().getParent(); + return new File(PathManager.getResourceRoot(JetParsingTest.class, "/org/jetbrains/jet/parsing/JetParsingTest.class")).getParentFile().getParentFile().getParent(); } @Override