mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
jsp el lexer level editing features
This commit is contained in:
@@ -28,6 +28,7 @@ import com.intellij.psi.html.HtmlTag;
|
||||
import com.intellij.psi.impl.source.xml.XmlTokenImpl;
|
||||
import com.intellij.psi.jsp.*;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import com.intellij.psi.tree.java.IJavaElementType;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.xml.*;
|
||||
@@ -70,7 +71,102 @@ public class TypedHandler implements TypedActionHandler {
|
||||
registerQuoteHandler(StdFileTypes.HTML, quoteHandler);
|
||||
registerQuoteHandler(StdFileTypes.XHTML, quoteHandler);
|
||||
registerQuoteHandler(StdFileTypes.JSP, new HtmlQuoteHandler(new JavaQuoteHandler()));
|
||||
registerQuoteHandler(StdFileTypes.JSPX, new HtmlQuoteHandler(new JavaQuoteHandler()));
|
||||
registerQuoteHandler(StdFileTypes.JSPX, new JspxQuoteHandler(new JavaQuoteHandler()));
|
||||
}
|
||||
|
||||
public static class SimpleTokenSetQuoteHandler implements QuoteHandler {
|
||||
private TokenSet myLiteralTokenSet;
|
||||
|
||||
public SimpleTokenSetQuoteHandler(TokenSet _literalTokenSet) {
|
||||
myLiteralTokenSet = _literalTokenSet;
|
||||
}
|
||||
|
||||
public boolean isClosingQuote(HighlighterIterator iterator, int offset) {
|
||||
final IElementType tokenType = iterator.getTokenType();
|
||||
|
||||
if (myLiteralTokenSet.isInSet(tokenType)){
|
||||
int start = iterator.getStart();
|
||||
int end = iterator.getEnd();
|
||||
return end - start >= 1 && offset == end - 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isOpeningQuote(HighlighterIterator iterator, int offset) {
|
||||
if (myLiteralTokenSet.isInSet(iterator.getTokenType())){
|
||||
int start = iterator.getStart();
|
||||
return offset == start;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean hasNonClosedLiteral(Editor editor, HighlighterIterator iterator, int offset) {
|
||||
try {
|
||||
Document doc = editor.getDocument();
|
||||
CharSequence chars = doc.getCharsSequence();
|
||||
int lineEnd = doc.getLineEndOffset(doc.getLineNumber(offset));
|
||||
|
||||
while (!iterator.atEnd() && iterator.getStart() < lineEnd) {
|
||||
IElementType tokenType = iterator.getTokenType();
|
||||
|
||||
if (myLiteralTokenSet.isInSet(tokenType)) {
|
||||
if (iterator.getStart() >= iterator.getEnd() - 1 ||
|
||||
chars.charAt(iterator.getEnd() - 1) != '\"' && chars.charAt(iterator.getEnd() - 1) != '\'') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
iterator.advance();
|
||||
}
|
||||
}
|
||||
finally {
|
||||
while(iterator.atEnd() || iterator.getStart() != offset) iterator.retreat();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isInsideLiteral(HighlighterIterator iterator) {
|
||||
return myLiteralTokenSet.isInSet(iterator.getTokenType());
|
||||
}
|
||||
}
|
||||
|
||||
public static class JspxQuoteHandler extends HtmlQuoteHandler {
|
||||
private SimpleTokenSetQuoteHandler myElHandler;
|
||||
|
||||
public JspxQuoteHandler(QuoteHandler _baseHandler) {
|
||||
super(_baseHandler);
|
||||
|
||||
myElHandler = new SimpleTokenSetQuoteHandler(
|
||||
TokenSet.create(new IElementType[] {JspTokenType.JSP_EL_STRING_LITERAL})
|
||||
);
|
||||
}
|
||||
|
||||
public boolean isClosingQuote(HighlighterIterator iterator, int offset) {
|
||||
if (myElHandler.isClosingQuote(iterator, offset)){
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.isClosingQuote(iterator, offset);
|
||||
}
|
||||
|
||||
public boolean isOpeningQuote(HighlighterIterator iterator, int offset) {
|
||||
if (myElHandler.isOpeningQuote(iterator, offset)) return true;
|
||||
|
||||
return super.isOpeningQuote(iterator, offset);
|
||||
}
|
||||
|
||||
public boolean hasNonClosedLiteral(Editor editor, HighlighterIterator iterator, int offset) {
|
||||
if (myElHandler.isInsideLiteral(iterator)) return true;
|
||||
|
||||
return super.hasNonClosedLiteral(editor, iterator,offset);
|
||||
}
|
||||
|
||||
public boolean isInsideLiteral(HighlighterIterator iterator) {
|
||||
if (myElHandler.isInsideLiteral(iterator)) return true;
|
||||
return super.isInsideLiteral(iterator);
|
||||
}
|
||||
}
|
||||
|
||||
public static class HtmlQuoteHandler implements QuoteHandler {
|
||||
@@ -168,55 +264,9 @@ public class TypedHandler implements TypedActionHandler {
|
||||
}
|
||||
}
|
||||
|
||||
static class JavaQuoteHandler implements QuoteHandler {
|
||||
public boolean isClosingQuote(HighlighterIterator iterator, int offset) {
|
||||
final IElementType tokenType = iterator.getTokenType();
|
||||
|
||||
if (tokenType == JavaTokenType.STRING_LITERAL ||
|
||||
tokenType == JavaTokenType.CHARACTER_LITERAL){
|
||||
int start = iterator.getStart();
|
||||
int end = iterator.getEnd();
|
||||
return end - start >= 1 && offset == end - 1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isOpeningQuote(HighlighterIterator iterator, int offset) {
|
||||
final IElementType tokenType = iterator.getTokenType();
|
||||
|
||||
if (tokenType == JavaTokenType.STRING_LITERAL || tokenType == JavaTokenType.CHARACTER_LITERAL){
|
||||
int start = iterator.getStart();
|
||||
return offset == start;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean hasNonClosedLiteral(Editor editor, HighlighterIterator iterator, int offset) {
|
||||
try {
|
||||
Document doc = editor.getDocument();
|
||||
CharSequence chars = doc.getCharsSequence();
|
||||
int lineEnd = doc.getLineEndOffset(doc.getLineNumber(offset));
|
||||
|
||||
while (!iterator.atEnd() && iterator.getStart() < lineEnd) {
|
||||
IElementType tokenType = iterator.getTokenType();
|
||||
if (tokenType == JavaTokenType.STRING_LITERAL || tokenType == JavaTokenType.CHARACTER_LITERAL) {
|
||||
if (iterator.getStart() >= iterator.getEnd() - 1 ||
|
||||
chars.charAt(iterator.getEnd() - 1) != '\"' && chars.charAt(iterator.getEnd() - 1) != '\'') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
iterator.advance();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
finally {
|
||||
while(iterator.atEnd() || iterator.getStart() != offset) iterator.retreat();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isInsideLiteral(HighlighterIterator iterator) {
|
||||
IElementType tokenType = iterator.getTokenType();
|
||||
return tokenType == JavaTokenType.STRING_LITERAL || tokenType == JavaTokenType.CHARACTER_LITERAL;
|
||||
static class JavaQuoteHandler extends SimpleTokenSetQuoteHandler {
|
||||
public JavaQuoteHandler() {
|
||||
super(TokenSet.create(new IElementType[] { JavaTokenType.STRING_LITERAL, JavaTokenType.CHARACTER_LITERAL}));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -243,12 +243,21 @@ public class BraceMatchingUtil {
|
||||
}
|
||||
|
||||
public IElementType getTokenType(char ch, HighlighterIterator iterator) {
|
||||
if (ch == '}') return JavaTokenType.RBRACE;
|
||||
if (ch == '{') return JavaTokenType.LBRACE;
|
||||
if (ch == ']') return JavaTokenType.RBRACKET;
|
||||
if (ch == '[') return JavaTokenType.LBRACKET;
|
||||
if (ch == ')') return JavaTokenType.RPARENTH;
|
||||
if (ch == '(') return JavaTokenType.LPARENTH;
|
||||
final IElementType tokenType = iterator.getTokenType();
|
||||
|
||||
if(tokenType instanceof IJavaElementType) {
|
||||
if (ch == '}') return JavaTokenType.RBRACE;
|
||||
if (ch == '{') return JavaTokenType.LBRACE;
|
||||
if (ch == ']') return JavaTokenType.RBRACKET;
|
||||
if (ch == '[') return JavaTokenType.LBRACKET;
|
||||
if (ch == ')') return JavaTokenType.RPARENTH;
|
||||
if (ch == '(') return JavaTokenType.LPARENTH;
|
||||
} else if(tokenType instanceof IJspElementType) {
|
||||
if (ch == ']') return JspTokenType.JSP_EL_RBRACKET;
|
||||
if (ch == '[') return JspTokenType.JSP_EL_LBRACKET;
|
||||
if (ch == ')') return JspTokenType.JSP_EL_RPARENTH;
|
||||
if (ch == '(') return JspTokenType.JSP_EL_LPARENTH;
|
||||
}
|
||||
|
||||
return null; //TODO: add more here!
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user