New JSP Java parser (yet inactive)

This commit is contained in:
Roman Shevchenko
2011-01-17 16:03:41 +01:00
parent 295297108e
commit bbdc88804d
5 changed files with 105 additions and 37 deletions
@@ -174,7 +174,7 @@ public class DeclarationParser {
}
}
private static void parseClassBodyDeclarations(final PsiBuilder builder, final boolean isAnnotation) {
public static void parseClassBodyDeclarations(final PsiBuilder builder, final boolean isAnnotation) {
final Context context = isAnnotation ? Context.ANNOTATION_INTERFACE : Context.CLASS;
PsiBuilder.Marker invalidElements = null;
@@ -20,7 +20,9 @@ import com.intellij.lang.*;
import com.intellij.lang.java.JavaParserDefinition;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.JavaTokenType;
@@ -43,6 +45,8 @@ import java.util.List;
public class JavaParserUtil {
private static final Key<LanguageLevel> LANG_LEVEL_KEY = Key.create("JavaParserUtil.LanguageLevel");
private static final Key<Boolean> DEEP_PARSE_BLOCKS_IN_STATEMENTS = Key.create("JavaParserUtil.ParserExtender");
private static final Key<ParserExtender> PARSER_EXTENDER_KEY = Key.create("JavaParserUtil.ParserExtender");
public interface ParserWrapper {
void parse(PsiBuilder builder);
@@ -52,6 +56,10 @@ public class JavaParserUtil {
@Nullable PsiBuilder.Marker parse(PsiBuilder builder);
}
public interface ParserExtender extends MarkingParserWrapper {
boolean enroll(PsiBuilder builder);
}
public static final WhitespacesAndCommentsBinder GREEDY_RIGHT_EDGE_PROCESSOR = new WhitespacesAndCommentsBinder() {
public int getEdgePosition(final List<IElementType> tokens, final boolean atStreamEdge, final TokenTextGetter getter) {
return tokens.size();
@@ -145,6 +153,24 @@ public class JavaParserUtil {
return level;
}
public static void setParseStatementCodeBlocksDeep(final PsiBuilder builder, final boolean deep) {
builder.putUserDataUnprotected(DEEP_PARSE_BLOCKS_IN_STATEMENTS, deep);
}
public static boolean isParseStatementCodeBlocksDeep(final PsiBuilder builder) {
return Boolean.TRUE.equals(builder.getUserDataUnprotected(DEEP_PARSE_BLOCKS_IN_STATEMENTS));
}
public static void setParserExtender(final PsiBuilder builder, final ParserExtender extender) {
builder.putUserDataUnprotected(PARSER_EXTENDER_KEY, extender);
}
@Nullable
public static ParserExtender getParserExtender(final PsiBuilder builder) {
final ParserExtender extender = builder.getUserDataUnprotected(PARSER_EXTENDER_KEY);
return extender != null && extender.enroll(builder) ? extender : null;
}
@NotNull
public static PsiBuilder createBuilder(final ASTNode chameleon) {
final PsiElement psi = chameleon.getPsi();
@@ -291,6 +317,22 @@ public class JavaParserUtil {
};
}
public static PsiBuilder stoppingBuilder(final PsiBuilder builder, final Condition<Pair<IElementType, String>> condition) {
return new PsiBuilderAdapter(builder) {
@Override
public IElementType getTokenType() {
final Pair<IElementType, String> input = Pair.create(builder.getTokenType(), builder.getTokenText());
return condition.value(input) ? null : super.getTokenType();
}
@Override
public boolean eof() {
final Pair<IElementType, String> input = Pair.create(builder.getTokenType(), builder.getTokenText());
return condition.value(input) || super.eof();
}
};
}
public static class PsiBuilderAdapter implements PsiBuilder {
protected final PsiBuilder myDelegate;
@@ -298,23 +340,27 @@ public class JavaParserUtil {
myDelegate = delegate;
}
@Override
public Project getProject() {
return myDelegate.getProject();
}
@Override
public CharSequence getOriginalText() {
return myDelegate.getOriginalText();
}
@Override
public void advanceLexer() {
myDelegate.advanceLexer();
}
@Nullable
@Override @Nullable
public IElementType getTokenType() {
return myDelegate.getTokenType();
}
@Override
public void setTokenTypeRemapper(final ITokenTypeRemapper remapper) {
myDelegate.setTokenTypeRemapper(remapper);
}
@@ -344,53 +390,62 @@ public class JavaParserUtil {
return myDelegate.rawTokenTypeStart(steps);
}
@Nullable @NonNls
@Override @Nullable @NonNls
public String getTokenText() {
return myDelegate.getTokenText();
}
@Override
public int getCurrentOffset() {
return myDelegate.getCurrentOffset();
}
@Override
public Marker mark() {
return myDelegate.mark();
}
@Override
public void error(final String messageText) {
myDelegate.error(messageText);
}
@Override
public boolean eof() {
return myDelegate.eof();
}
@Override
public ASTNode getTreeBuilt() {
return myDelegate.getTreeBuilt();
}
@Override
public FlyweightCapableTreeStructure<LighterASTNode> getLightTree() {
return myDelegate.getLightTree();
}
@Override
public void setDebugMode(final boolean dbgMode) {
myDelegate.setDebugMode(dbgMode);
}
@Override
public void enforceCommentTokens(final TokenSet tokens) {
myDelegate.enforceCommentTokens(tokens);
}
@Nullable
@Override @Nullable
public LighterASTNode getLatestDoneMarker() {
return myDelegate.getLatestDoneMarker();
}
@Nullable
@Override @Nullable
public <T> T getUserData(@NotNull final Key<T> key) {
return myDelegate.getUserData(key);
}
@Override
public <T> void putUserData(@NotNull final Key<T> key, @Nullable final T value) {
myDelegate.putUserData(key, value);
}
@@ -401,7 +456,7 @@ public class JavaParserUtil {
}
@Override
public <T> void putUserDataUnprotected(@NotNull Key<T> key, @Nullable T value) {
public <T> void putUserDataUnprotected(@NotNull final Key<T> key, @Nullable final T value) {
myDelegate.putUserDataUnprotected(key, value);
}
}
@@ -34,8 +34,6 @@ import static com.intellij.lang.java.parser.JavaParserUtil.*;
public class StatementParser {
private static final boolean DEEP_PARSE_BLOCKS_IN_STATEMENTS = false;
private enum BraceMode {
TILL_FIRST, TILL_LAST
}
@@ -46,8 +44,13 @@ public class StatementParser {
@Nullable
public static PsiBuilder.Marker parseCodeBlock(final PsiBuilder builder) {
return parseCodeBlock(builder, false);
}
@Nullable
public static PsiBuilder.Marker parseCodeBlock(final PsiBuilder builder, final boolean isStatement) {
if (builder.getTokenType() != JavaTokenType.LBRACE) return null;
else if (DEEP_PARSE_BLOCKS_IN_STATEMENTS) return parseCodeBlockDeep(builder, false);
else if (isStatement && isParseStatementCodeBlocksDeep(builder)) return parseCodeBlockDeep(builder, false);
final PsiBuilder.Marker codeBlock = builder.mark();
builder.advanceLexer();
@@ -166,10 +169,10 @@ public class StatementParser {
@Nullable
public static PsiBuilder.Marker parseStatement(final PsiBuilder builder) {
final ParserExtender extender = getParserExtender(builder);
if (extender != null) return extender.parse(builder);
final IElementType tokenType = builder.getTokenType();
// todo: custom parsers (?)
if (tokenType == JavaTokenType.IF_KEYWORD) {
return parseIfStatement(builder);
}
@@ -507,7 +510,7 @@ public class StatementParser {
return statement;
}
final PsiBuilder.Marker body = parseCodeBlock(builder);
final PsiBuilder.Marker body = parseCodeBlock(builder, true);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
@@ -595,7 +598,7 @@ public class StatementParser {
return statement;
}
final PsiBuilder.Marker body = parseCodeBlock(builder);
final PsiBuilder.Marker body = parseCodeBlock(builder, true);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
@@ -609,7 +612,7 @@ public class StatementParser {
final PsiBuilder.Marker statement = builder.mark();
builder.advanceLexer();
final PsiBuilder.Marker tryBlock = parseCodeBlock(builder);
final PsiBuilder.Marker tryBlock = parseCodeBlock(builder, true);
if (tryBlock == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
done(statement, JavaElementType.TRY_STATEMENT);
@@ -627,7 +630,7 @@ public class StatementParser {
}
if (expect(builder, JavaTokenType.FINALLY_KEYWORD)) {
final PsiBuilder.Marker finallyBlock = parseCodeBlock(builder);
final PsiBuilder.Marker finallyBlock = parseCodeBlock(builder, true);
if (finallyBlock == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
}
@@ -659,7 +662,7 @@ public class StatementParser {
return false;
}
final PsiBuilder.Marker body = parseCodeBlock(builder);
final PsiBuilder.Marker body = parseCodeBlock(builder, true);
if (body == null) {
error(builder, JavaErrorMessages.message("expected.lbrace"));
done(section, JavaElementType.CATCH_SECTION);
@@ -699,7 +702,7 @@ public class StatementParser {
@NotNull
private static PsiBuilder.Marker parseBlockStatement(final PsiBuilder builder) {
final PsiBuilder.Marker statement = builder.mark();
parseCodeBlock(builder);
parseCodeBlock(builder, true);
done(statement, JavaElementType.BLOCK_STATEMENT);
return statement;
}
@@ -15,27 +15,32 @@
*/
package com.intellij.psi.jsp;
import com.intellij.lang.StdLanguages;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.jsp.IJspElementType;
/**
* @author peter
* todo[r.sh] replace usages with JspElementTypeEx in implementation modules
*/
public interface JspElementType extends JspTokenType /*extends BaseJspElementType, ELElementType*/ {
IElementType HOLDER_TEMPLATE_DATA = new IJspElementType("HOLDER_TEMPLATE_DATA");
public interface JspElementType extends JspTokenType {
enum Kind {
HOLDER_TEMPLATE_DATA, JSP_TEMPLATE_EXPRESSION, HOLDER_METHOD, JSP_TEMPLATE_STATEMENT, JSP_CLASS_LEVEL_DECLARATION_STATEMENT,
JSP_CODE_BLOCK, JSP_WHILE_STATEMENT, JSP_BLOCK_STATEMENT, JSP_CLASS, JSP_METHOD_CALL, JSP_EXPRESSION, JSP_SCRIPTLET
}
IElementType JSP_TEMPLATE_EXPRESSION = new IElementType("JSP_TEMPLATE_EXPRESSION", StdLanguages.JAVA);
IElementType HOLDER_METHOD = new IJspElementType("HOLDER_METHOD");
IElementType HOLDER_TEMPLATE_DATA = JspSpiUtil.getJspElementType(Kind.HOLDER_TEMPLATE_DATA);
IElementType JSP_TEMPLATE_EXPRESSION = JspSpiUtil.getJspElementType(Kind.JSP_TEMPLATE_EXPRESSION);
IElementType HOLDER_METHOD = JspSpiUtil.getJspElementType(Kind.HOLDER_METHOD);
IElementType JSP_TEMPLATE_STATEMENT = new IElementType("JSP_TEMPLATE_STATEMENT", StdLanguages.JAVA);
IElementType JSP_CLASS_LEVEL_DECLARATION_STATEMENT = new IElementType("JSP_CLASS_LEVEL_DECLARATION_STATEMENT", StdLanguages.JAVA);
IElementType JSP_CODE_BLOCK = new IElementType("JSP_CODE_BLOCK", StdLanguages.JAVA);
IElementType JSP_WHILE_STATEMENT = new IElementType("JSP_DO_WHILE_STATEMENT", StdLanguages.JAVA);
IElementType JSP_BLOCK_STATEMENT = new IElementType("JSP_BLOCK_STATEMENT", StdLanguages.JAVA);
IElementType JSP_TEMPLATE_STATEMENT = JspSpiUtil.getJspElementType(Kind.JSP_TEMPLATE_STATEMENT);
IElementType JSP_CLASS_LEVEL_DECLARATION_STATEMENT = JspSpiUtil.getJspElementType(Kind.JSP_CLASS_LEVEL_DECLARATION_STATEMENT);
IElementType JSP_CODE_BLOCK = JspSpiUtil.getJspElementType(Kind.JSP_CODE_BLOCK);
IElementType JSP_WHILE_STATEMENT = JspSpiUtil.getJspElementType(Kind.JSP_WHILE_STATEMENT);
IElementType JSP_BLOCK_STATEMENT = JspSpiUtil.getJspElementType(Kind.JSP_BLOCK_STATEMENT);
IElementType JSP_CLASS = JspSpiUtil.getJspElementType(Kind.JSP_CLASS);
IElementType JSP_METHOD_CALL = JspSpiUtil.getJspElementType(Kind.JSP_METHOD_CALL);
IElementType JSP_CLASS = new IJspElementType("JSP_CLASS");
IElementType JSP_METHOD_CALL = new IElementType("JSP_METHOD_CALL", StdLanguages.JAVA);
IElementType JSP_EXPRESSION = JspSpiUtil.getJspExpressionType();
IElementType JSP_SCRIPTLET = JspSpiUtil.getJspScriptletType();
}
@@ -217,16 +217,21 @@ public abstract class JspSpiUtil {
}
}
@Nullable
public static IElementType getJspElementType(@NotNull final JspElementType.Kind kind) {
final JspSpiUtil spiUtil = getJspSpiUtil();
return spiUtil != null ? spiUtil._getJspElementType(kind) : null;
}
@Nullable
public static IElementType getJspScriptletType() {
JspSpiUtil spiUtil = getJspSpiUtil();
return spiUtil != null ? spiUtil._getJspScriptletType():null;
return getJspElementType(JspElementType.Kind.JSP_SCRIPTLET);
}
@Nullable
public static IElementType getJspExpressionType() {
JspSpiUtil spiUtil = getJspSpiUtil();
return spiUtil != null ? spiUtil._getJspExpressionType():null;
return getJspElementType(JspElementType.Kind.JSP_EXPRESSION);
}
protected abstract IElementType _getJspExpressionType();
protected abstract IElementType _getJspScriptletType();
protected abstract IElementType _getJspElementType(@NotNull final JspElementType.Kind kind);
}