mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-15 02:59:33 +07:00
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:
File diff suppressed because it is too large
Load Diff
@@ -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,
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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>", "");
|
||||||
|
|||||||
Reference in New Issue
Block a user