From 4f18686978ebcfa5970dfafdbe5143e0d507bc9f Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 10 Dec 2010 22:03:30 +0300 Subject: [PATCH] Stub parser --- idea/META-INF/plugin.xml | 2 + idea/src/org/jetbrains/jet/JetNodeTypes.java | 12 ++++ .../jetbrains/jet/lang/JetPairMatcher.java | 40 +++++++++++ .../jetbrains/jet/lang/parsing/JetParser.java | 24 +++++++ .../jet/lang/parsing/JetParserDefinition.java | 67 +++++++++++++++++++ .../org/jetbrains/jet/lang/psi/JetFile.java | 26 +++++++ .../org/jetbrains/jet/lexer/JetTokens.java | 8 ++- 7 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 idea/src/org/jetbrains/jet/JetNodeTypes.java create mode 100644 idea/src/org/jetbrains/jet/lang/JetPairMatcher.java create mode 100644 idea/src/org/jetbrains/jet/lang/parsing/JetParser.java create mode 100644 idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java create mode 100644 idea/src/org/jetbrains/jet/lang/psi/JetFile.java diff --git a/idea/META-INF/plugin.xml b/idea/META-INF/plugin.xml index 9584e7bc7b5..83b992dee86 100644 --- a/idea/META-INF/plugin.xml +++ b/idea/META-INF/plugin.xml @@ -18,5 +18,7 @@ + + diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java new file mode 100644 index 00000000000..c5d235fbd0f --- /dev/null +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -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); + +} diff --git a/idea/src/org/jetbrains/jet/lang/JetPairMatcher.java b/idea/src/org/jetbrains/jet/lang/JetPairMatcher.java new file mode 100644 index 00000000000..2171958b1d0 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/JetPairMatcher.java @@ -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; + } + +} diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParser.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParser.java new file mode 100644 index 00000000000..e79dc9454d5 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParser.java @@ -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(); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java b/idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java new file mode 100644 index 00000000000..2cd151087a8 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/parsing/JetParserDefinition.java @@ -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; + } +} diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetFile.java b/idea/src/org/jetbrains/jet/lang/psi/JetFile.java new file mode 100644 index 00000000000..dd68d5c31a9 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/psi/JetFile.java @@ -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; + } +} diff --git a/idea/src/org/jetbrains/jet/lexer/JetTokens.java b/idea/src/org/jetbrains/jet/lexer/JetTokens.java index 283afeaf663..9f989791674 100644 --- a/idea/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/idea/src/org/jetbrains/jet/lexer/JetTokens.java @@ -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); }