Stub parser

This commit is contained in:
Maxim Shafirov
2010-12-10 22:03:30 +03:00
parent a7919fdc1d
commit 4f18686978
7 changed files with 178 additions and 1 deletions
+2
View File
@@ -18,5 +18,7 @@
<extensions defaultExtensionNs="com.intellij">
<fileTypeFactory implementation="org.jetbrains.jet.lang.JetFileFactory"/>
<lang.braceMatcher language="jet" implementationClass="org.jetbrains.jet.lang.JetPairMatcher"/>
<lang.parserDefinition language="jet" implementationClass="org.jetbrains.jet.lang.parsing.JetParserDefinition"/>
</extensions>
</idea-plugin>
@@ -0,0 +1,12 @@
/*
* @author max
*/
package org.jetbrains.jet;
import com.intellij.psi.tree.IFileElementType;
import org.jetbrains.jet.lang.JetLanguage;
public interface JetNodeTypes {
IFileElementType JET_FILE_NODE = new IFileElementType(JetLanguage.INSTANCE);
}
@@ -0,0 +1,40 @@
/*
* @author max
*/
package org.jetbrains.jet.lang;
import com.intellij.lang.BracePair;
import com.intellij.lang.PairedBraceMatcher;
import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
public class JetPairMatcher implements PairedBraceMatcher {
private final BracePair[] pairs = new BracePair[]{
new BracePair(JetTokens.LPAR, JetTokens.RPAR, false),
new BracePair(JetTokens.LBRACE, JetTokens.RBRACE, true),
new BracePair(JetTokens.LBRACKET, JetTokens.RBRACKET, false)
};
public BracePair[] getPairs() {
return pairs;
}
public boolean isPairedBracesAllowedBeforeType(@NotNull final IElementType lbraceType, @Nullable final IElementType contextType) {
return JetTokens.WHITE_SPACE_OR_COMMENT_BIT_SET.contains(contextType)
|| contextType == JetTokens.SEMICOLON
|| contextType == JetTokens.COMMA
|| contextType == JetTokens.RPAR
|| contextType == JetTokens.RBRACKET
|| contextType == JetTokens.RBRACE
|| contextType == JetTokens.LBRACE;
}
public int getCodeConstructStart(final PsiFile file, final int openingBraceOffset) {
return openingBraceOffset;
}
}
@@ -0,0 +1,24 @@
/*
* @author max
*/
package org.jetbrains.jet.lang.parsing;
import com.intellij.lang.ASTNode;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiParser;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetNodeTypes;
public class JetParser implements PsiParser {
@NotNull
public ASTNode parse(IElementType iElementType, PsiBuilder psiBuilder) {
PsiBuilder.Marker mark = psiBuilder.mark();
while (!psiBuilder.eof()) {
psiBuilder.advanceLexer();
}
mark.done(JetNodeTypes.JET_FILE_NODE);
return psiBuilder.getTreeBuilt();
}
}
@@ -0,0 +1,67 @@
/*
* @author max
*/
package org.jetbrains.jet.lang.parsing;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.lang.ParserDefinition;
import com.intellij.lang.PsiParser;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.project.Project;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.TokenType;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lexer.JetLexer;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
public class JetParserDefinition implements ParserDefinition {
@NotNull
public Lexer createLexer(Project project) {
return new JetLexer();
}
public PsiParser createParser(Project project) {
return new JetParser();
}
public IFileElementType getFileNodeType() {
return JetNodeTypes.JET_FILE_NODE;
}
@NotNull
public TokenSet getWhitespaceTokens() {
return JetTokens.WHITESPACES;
}
@NotNull
public TokenSet getCommentTokens() {
return JetTokens.COMMENTS;
}
@NotNull
public TokenSet getStringLiteralElements() {
return JetTokens.STRINGS;
}
@NotNull
public PsiElement createElement(ASTNode astNode) {
// TODO
return new ASTWrapperPsiElement(astNode);
}
public PsiFile createFile(FileViewProvider fileViewProvider) {
return new JetFile(fileViewProvider);
}
public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode astNode, ASTNode astNode1) {
return SpaceRequirements.MAY;
}
}
@@ -0,0 +1,26 @@
/*
* @author max
*/
package org.jetbrains.jet.lang.psi;
import com.intellij.extapi.psi.PsiFileBase;
import com.intellij.lang.Language;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.JetFileType;
import org.jetbrains.jet.lang.JetLanguage;
public class JetFile extends PsiFileBase {
public JetFile(FileViewProvider viewProvider) {
super(viewProvider, JetLanguage.INSTANCE);
}
@NotNull
public FileType getFileType() {
return JetFileType.INSTANCE;
}
}
@@ -13,7 +13,7 @@ import java.util.Set;
public interface JetTokens {
JetToken BLOCK_COMMENT = new JetToken("BLOCK_COMMENT");
JetToken DOC_COMMENT = new JetToken("DOC_COMMENT");
JetToken DOC_COMMENT = new JetToken("DOC_COMMENT");
JetToken EOL_COMMENT = new JetToken("EOL_COMMENT");
IElementType WHITE_SPACE = TokenType.WHITE_SPACE;
@@ -129,4 +129,10 @@ public interface JetTokens {
OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD,
REF_KEYWORD
);
TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT);
TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE);
TokenSet COMMENTS = TokenSet.create(EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT);
TokenSet STRINGS = TokenSet.create(CHARACTER_LITERAL, STRING_LITERAL, RAW_STRING_LITERAL);
}