psi nodes, initial

This commit is contained in:
Maxim Shafirov
2011-01-03 18:14:23 +03:00
parent 8c15476cf3
commit fce7277439
6 changed files with 78 additions and 15 deletions
@@ -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<? extends JetElement> myPsiFactory;
public JetNodeType(@NotNull @NonNls String debugName) {
this(debugName, null);
}
public JetNodeType(@NotNull @NonNls String debugName, Class<? extends JetElement> 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);
}
}
}
+2 -1
View File
@@ -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");
@@ -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();
}
}
}
@@ -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();
}
}
@@ -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);
}
}
@@ -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