PY-15469 Delimiter "->" in Python is parsed as single token

Thanks to that, pressing enter no longer inserts backslash in the
middle of "->" sequence (and such corrupted code is properly
highlighted now on).
This commit is contained in:
Mikhail Golubev
2015-04-08 15:53:59 +03:00
parent aced4ab039
commit 8f30a5836a
6 changed files with 550 additions and 533 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -138,6 +138,7 @@ public class PyTokenTypes {
public static final PyElementType LTLTEQ = new PyElementType("LTLTEQ");// <<= public static final PyElementType LTLTEQ = new PyElementType("LTLTEQ");// <<=
public static final PyElementType GTGTEQ = new PyElementType("GTGTEQ");// >>= public static final PyElementType GTGTEQ = new PyElementType("GTGTEQ");// >>=
public static final PyElementType EXPEQ = new PyElementType("EXPEQ");// **= public static final PyElementType EXPEQ = new PyElementType("EXPEQ");// **=
public static final PyElementType RARROW = new PyElementType("RARROW");// ->
public static final TokenSet OPERATIONS = TokenSet.create( public static final TokenSet OPERATIONS = TokenSet.create(
PLUS, MINUS, MULT, AT, EXP, DIV, FLOORDIV, PERC, LTLT, GTGT, AND, OR, PLUS, MINUS, MULT, AT, EXP, DIV, FLOORDIV, PERC, LTLT, GTGT, AND, OR,

View File

@@ -178,6 +178,7 @@ return PyTokenTypes.DOCSTRING; }
"==" { return PyTokenTypes.EQEQ; } "==" { return PyTokenTypes.EQEQ; }
"!=" { return PyTokenTypes.NE; } "!=" { return PyTokenTypes.NE; }
"<>" { return PyTokenTypes.NE_OLD; } "<>" { return PyTokenTypes.NE_OLD; }
"->" { return PyTokenTypes.RARROW; }
"+" { return PyTokenTypes.PLUS; } "+" { return PyTokenTypes.PLUS; }
"-" { return PyTokenTypes.MINUS; } "-" { return PyTokenTypes.MINUS; }
"*" { return PyTokenTypes.MULT; } "*" { return PyTokenTypes.MULT; }

View File

@@ -53,18 +53,13 @@ public class FunctionParsing extends Parsing {
} }
public void parseReturnTypeAnnotation() { public void parseReturnTypeAnnotation() {
if (myContext.getLanguageLevel().isPy3K() && myBuilder.getTokenType() == PyTokenTypes.MINUS) { if (myContext.getLanguageLevel().isPy3K() && myBuilder.getTokenType() == PyTokenTypes.RARROW) {
PsiBuilder.Marker maybeReturnAnnotation = myBuilder.mark(); PsiBuilder.Marker maybeReturnAnnotation = myBuilder.mark();
nextToken(); nextToken();
if (matchToken(PyTokenTypes.GT)) { if (!myContext.getExpressionParser().parseSingleExpression(false)) {
if (!myContext.getExpressionParser().parseSingleExpression(false)) { myBuilder.error(message("PARSE.expected.expression"));
myBuilder.error(message("PARSE.expected.expression"));
}
maybeReturnAnnotation.done(PyElementTypes.ANNOTATION);
}
else {
maybeReturnAnnotation.rollbackTo();
} }
maybeReturnAnnotation.done(PyElementTypes.ANNOTATION);
} }
} }

View File

@@ -14,8 +14,7 @@ PyFile:Annotations.py
PsiElement(Py:RPAR)(')') PsiElement(Py:RPAR)(')')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PyAnnotation PyAnnotation
PsiElement(Py:MINUS)('-') PsiElement(Py:RARROW)('->')
PsiElement(Py:GT)('>')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PyReferenceExpression: list PyReferenceExpression: list
PsiElement(Py:IDENTIFIER)('list') PsiElement(Py:IDENTIFIER)('list')

View File

@@ -362,6 +362,20 @@ public class PyEditingTest extends PyTestCase {
}); });
} }
// PY-15469
public void testEnterDoesNotInsertSlashInsideArrow() {
runWithLanguageLevel(LanguageLevel.PYTHON30, new Runnable() {
@Override
public void run() {
doTestEnter("def func() -<caret>> int:\n" +
" pass",
"def func() -\n" +
"> int:\n" +
" pass");
}
});
}
private void doTestEnter(String before, final String after) { private void doTestEnter(String before, final String after) {
int pos = before.indexOf("<caret>"); int pos = before.indexOf("<caret>");
before = before.replace("<caret>", ""); before = before.replace("<caret>", "");