mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 22:51:17 +07:00
True, False and None are keywords in Python 3
This commit is contained in:
@@ -75,6 +75,8 @@ public interface PyElementTypes {
|
|||||||
PyElementType FLOAT_LITERAL_EXPRESSION = new PyElementType("FLOAT_LITERAL_EXPRESSION", PyNumericLiteralExpressionImpl.class);
|
PyElementType FLOAT_LITERAL_EXPRESSION = new PyElementType("FLOAT_LITERAL_EXPRESSION", PyNumericLiteralExpressionImpl.class);
|
||||||
PyElementType IMAGINARY_LITERAL_EXPRESSION = new PyElementType("IMAGINARY_LITERAL_EXPRESSION", PyNumericLiteralExpressionImpl.class);
|
PyElementType IMAGINARY_LITERAL_EXPRESSION = new PyElementType("IMAGINARY_LITERAL_EXPRESSION", PyNumericLiteralExpressionImpl.class);
|
||||||
PyElementType STRING_LITERAL_EXPRESSION = new PyElementType("STRING_LITERAL_EXPRESSION", PyStringLiteralExpressionImpl.class);
|
PyElementType STRING_LITERAL_EXPRESSION = new PyElementType("STRING_LITERAL_EXPRESSION", PyStringLiteralExpressionImpl.class);
|
||||||
|
PyElementType NONE_LITERAL_EXPRESSION = new PyElementType("NONE_LITERAL_EXPRESSION", PyNoneLiteralExpressionImpl.class);
|
||||||
|
PyElementType BOOL_LITERAL_EXPRESSION = new PyElementType("BOOL_LITERAL_EXPRESSION", PyBoolLiteralExpressionImpl.class);
|
||||||
PyElementType PARENTHESIZED_EXPRESSION = new PyElementType("PARENTHESIZED_EXPRESSION", PyParenthesizedExpressionImpl.class);
|
PyElementType PARENTHESIZED_EXPRESSION = new PyElementType("PARENTHESIZED_EXPRESSION", PyParenthesizedExpressionImpl.class);
|
||||||
PyElementType SUBSCRIPTION_EXPRESSION = new PyElementType("SUBSCRIPTION_EXPRESSION", PySubscriptionExpressionImpl.class);
|
PyElementType SUBSCRIPTION_EXPRESSION = new PyElementType("SUBSCRIPTION_EXPRESSION", PySubscriptionExpressionImpl.class);
|
||||||
PyElementType SLICE_EXPRESSION = new PyElementType("SLICE_EXPRESSION", PySliceExpressionImpl.class);
|
PyElementType SLICE_EXPRESSION = new PyElementType("SLICE_EXPRESSION", PySliceExpressionImpl.class);
|
||||||
|
|||||||
@@ -52,6 +52,11 @@ public class PyTokenTypes {
|
|||||||
public static final PyElementType WHILE_KEYWORD = new PyElementType("WHILE_KEYWORD");
|
public static final PyElementType WHILE_KEYWORD = new PyElementType("WHILE_KEYWORD");
|
||||||
public static final PyElementType YIELD_KEYWORD = new PyElementType("YIELD_KEYWORD");
|
public static final PyElementType YIELD_KEYWORD = new PyElementType("YIELD_KEYWORD");
|
||||||
|
|
||||||
|
// new keywords in Python 3
|
||||||
|
public static final PyElementType NONE_KEYWORD = new PyElementType("NONE_KEYWORD");
|
||||||
|
public static final PyElementType TRUE_KEYWORD = new PyElementType("TRUE_KEYWORD");
|
||||||
|
public static final PyElementType FALSE_KEYWORD = new PyElementType("FALSE_KEYWORD");
|
||||||
|
|
||||||
public static final TokenSet KEYWORDS = TokenSet.create(
|
public static final TokenSet KEYWORDS = TokenSet.create(
|
||||||
AND_KEYWORD, AS_KEYWORD, ASSERT_KEYWORD, BREAK_KEYWORD, CLASS_KEYWORD,
|
AND_KEYWORD, AS_KEYWORD, ASSERT_KEYWORD, BREAK_KEYWORD, CLASS_KEYWORD,
|
||||||
CONTINUE_KEYWORD, DEF_KEYWORD, DEL_KEYWORD, ELIF_KEYWORD, ELSE_KEYWORD,
|
CONTINUE_KEYWORD, DEF_KEYWORD, DEL_KEYWORD, ELIF_KEYWORD, ELSE_KEYWORD,
|
||||||
@@ -60,7 +65,8 @@ public class PyTokenTypes {
|
|||||||
GLOBAL_KEYWORD, IF_KEYWORD, IMPORT_KEYWORD, IN_KEYWORD, IS_KEYWORD,
|
GLOBAL_KEYWORD, IF_KEYWORD, IMPORT_KEYWORD, IN_KEYWORD, IS_KEYWORD,
|
||||||
LAMBDA_KEYWORD, NOT_KEYWORD, OR_KEYWORD, PASS_KEYWORD, PRINT_KEYWORD,
|
LAMBDA_KEYWORD, NOT_KEYWORD, OR_KEYWORD, PASS_KEYWORD, PRINT_KEYWORD,
|
||||||
RAISE_KEYWORD, RETURN_KEYWORD, TRY_KEYWORD, WITH_KEYWORD, WHILE_KEYWORD,
|
RAISE_KEYWORD, RETURN_KEYWORD, TRY_KEYWORD, WITH_KEYWORD, WHILE_KEYWORD,
|
||||||
YIELD_KEYWORD);
|
YIELD_KEYWORD,
|
||||||
|
NONE_KEYWORD, TRUE_KEYWORD, FALSE_KEYWORD);
|
||||||
|
|
||||||
public static final PyElementType INTEGER_LITERAL = new PyElementType("INTEGER_LITERAL");
|
public static final PyElementType INTEGER_LITERAL = new PyElementType("INTEGER_LITERAL");
|
||||||
public static final PyElementType FLOAT_LITERAL = new PyElementType("FLOAT_LITERAL");
|
public static final PyElementType FLOAT_LITERAL = new PyElementType("FLOAT_LITERAL");
|
||||||
|
|||||||
@@ -25,6 +25,12 @@ public class PythonHighlightingLexer extends PythonLexer {
|
|||||||
final String tokenText = getTokenText();
|
final String tokenText = getTokenText();
|
||||||
if (tokenText.equals("print")) return PyTokenTypes.PRINT_KEYWORD;
|
if (tokenText.equals("print")) return PyTokenTypes.PRINT_KEYWORD;
|
||||||
}
|
}
|
||||||
|
if (myLanguageLevel.isPy3K()) {
|
||||||
|
final String tokenText = getTokenText();
|
||||||
|
if (tokenText.equals("None")) return PyTokenTypes.NONE_KEYWORD;
|
||||||
|
if (tokenText.equals("True")) return PyTokenTypes.TRUE_KEYWORD;
|
||||||
|
if (tokenText.equals("False")) return PyTokenTypes.FALSE_KEYWORD;
|
||||||
|
}
|
||||||
return super.getTokenType();
|
return super.getTokenType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,14 @@ public class ExpressionParsing extends Parsing {
|
|||||||
buildTokenElement(PyElementTypes.IMAGINARY_LITERAL_EXPRESSION, builder);
|
buildTokenElement(PyElementTypes.IMAGINARY_LITERAL_EXPRESSION, builder);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (firstToken == PyTokenTypes.NONE_KEYWORD) {
|
||||||
|
buildTokenElement(PyElementTypes.NONE_LITERAL_EXPRESSION, builder);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (firstToken == PyTokenTypes.TRUE_KEYWORD || firstToken == PyTokenTypes.FALSE_KEYWORD) {
|
||||||
|
buildTokenElement(PyElementTypes.BOOL_LITERAL_EXPRESSION, builder);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if (firstToken == PyTokenTypes.STRING_LITERAL) {
|
else if (firstToken == PyTokenTypes.STRING_LITERAL) {
|
||||||
final PsiBuilder.Marker marker = builder.mark();
|
final PsiBuilder.Marker marker = builder.mark();
|
||||||
while (builder.getTokenType() == PyTokenTypes.STRING_LITERAL) {
|
while (builder.getTokenType() == PyTokenTypes.STRING_LITERAL) {
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper {
|
|||||||
@NonNls protected static final String TOK_WITH = "with";
|
@NonNls protected static final String TOK_WITH = "with";
|
||||||
@NonNls protected static final String TOK_AS = "as";
|
@NonNls protected static final String TOK_AS = "as";
|
||||||
@NonNls protected static final String TOK_PRINT = "print";
|
@NonNls protected static final String TOK_PRINT = "print";
|
||||||
|
@NonNls protected static final String TOK_NONE = "None";
|
||||||
|
@NonNls protected static final String TOK_TRUE = "True";
|
||||||
|
@NonNls protected static final String TOK_FALSE = "False";
|
||||||
|
|
||||||
protected enum Phase {NONE, FROM, FUTURE, IMPORT} // 'from __future__ import' phase
|
protected enum Phase {NONE, FROM, FUTURE, IMPORT} // 'from __future__ import' phase
|
||||||
private Phase myFutureImportPhase = Phase.NONE;
|
private Phase myFutureImportPhase = Phase.NONE;
|
||||||
@@ -745,6 +748,17 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper {
|
|||||||
isWordAtPosition(text, start, end, TOK_PRINT)) {
|
isWordAtPosition(text, start, end, TOK_PRINT)) {
|
||||||
return PyTokenTypes.PRINT_KEYWORD;
|
return PyTokenTypes.PRINT_KEYWORD;
|
||||||
}
|
}
|
||||||
|
else if (myContext.getLanguageLevel().isPy3K() && source == PyTokenTypes.IDENTIFIER) {
|
||||||
|
if (isWordAtPosition(text, start, end, TOK_NONE)) {
|
||||||
|
return PyTokenTypes.NONE_KEYWORD;
|
||||||
|
}
|
||||||
|
if (isWordAtPosition(text, start, end, TOK_TRUE)) {
|
||||||
|
return PyTokenTypes.TRUE_KEYWORD;
|
||||||
|
}
|
||||||
|
if (isWordAtPosition(text, start, end, TOK_FALSE)) {
|
||||||
|
return PyTokenTypes.FALSE_KEYWORD;
|
||||||
|
}
|
||||||
|
}
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.jetbrains.python.psi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yole
|
||||||
|
*/
|
||||||
|
public interface PyBoolLiteralExpression extends PyLiteralExpression {
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.jetbrains.python.psi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yole
|
||||||
|
*/
|
||||||
|
public interface PyNoneLiteralExpression extends PyLiteralExpression {
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.jetbrains.python.psi.impl;
|
||||||
|
|
||||||
|
import com.intellij.lang.ASTNode;
|
||||||
|
import com.jetbrains.python.psi.PyBoolLiteralExpression;
|
||||||
|
import com.jetbrains.python.psi.types.PyType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yole
|
||||||
|
*/
|
||||||
|
public class PyBoolLiteralExpressionImpl extends PyElementImpl implements PyBoolLiteralExpression {
|
||||||
|
public PyBoolLiteralExpressionImpl(ASTNode astNode) {
|
||||||
|
super(astNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PyType getType() {
|
||||||
|
// TODO
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.jetbrains.python.psi.impl;
|
||||||
|
|
||||||
|
import com.intellij.lang.ASTNode;
|
||||||
|
import com.jetbrains.python.psi.PyNoneLiteralExpression;
|
||||||
|
import com.jetbrains.python.psi.types.PyNoneType;
|
||||||
|
import com.jetbrains.python.psi.types.PyType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yole
|
||||||
|
*/
|
||||||
|
public class PyNoneLiteralExpressionImpl extends PyElementImpl implements PyNoneLiteralExpression {
|
||||||
|
public PyNoneLiteralExpressionImpl(ASTNode astNode) {
|
||||||
|
super(astNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PyType getType() {
|
||||||
|
return PyNoneType.INSTANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,8 +20,8 @@ PyFile:KeywordOnlyArgument.py
|
|||||||
PyNamedParameter('key')
|
PyNamedParameter('key')
|
||||||
PsiElement(Py:IDENTIFIER)('key')
|
PsiElement(Py:IDENTIFIER)('key')
|
||||||
PsiElement(Py:EQ)('=')
|
PsiElement(Py:EQ)('=')
|
||||||
PyReferenceExpression: None
|
PyNoneLiteralExpression
|
||||||
PsiElement(Py:IDENTIFIER)('None')
|
PsiElement(Py:NONE_KEYWORD)('None')
|
||||||
PsiElement(Py:RPAR)(')')
|
PsiElement(Py:RPAR)(')')
|
||||||
PsiElement(Py:COLON)(':')
|
PsiElement(Py:COLON)(':')
|
||||||
PsiWhiteSpace(' ')
|
PsiWhiteSpace(' ')
|
||||||
|
|||||||
3
python/testData/psi/Py3KKeywords.py
Normal file
3
python/testData/psi/Py3KKeywords.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
None
|
||||||
|
True
|
||||||
|
False
|
||||||
12
python/testData/psi/Py3KKeywords.txt
Normal file
12
python/testData/psi/Py3KKeywords.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
PyFile:Py3KKeywords.py
|
||||||
|
PyExpressionStatement
|
||||||
|
PyNoneLiteralExpression
|
||||||
|
PsiElement(Py:NONE_KEYWORD)('None')
|
||||||
|
PsiWhiteSpace('\n')
|
||||||
|
PyExpressionStatement
|
||||||
|
PyBoolLiteralExpression
|
||||||
|
PsiElement(Py:TRUE_KEYWORD)('True')
|
||||||
|
PsiWhiteSpace('\n')
|
||||||
|
PyExpressionStatement
|
||||||
|
PyBoolLiteralExpression
|
||||||
|
PsiElement(Py:FALSE_KEYWORD)('False')
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.jetbrains.python;
|
package com.jetbrains.python;
|
||||||
|
|
||||||
import com.intellij.testFramework.ParsingTestCase;
|
import com.intellij.testFramework.ParsingTestCase;
|
||||||
|
import com.intellij.testFramework.TestDataPath;
|
||||||
import com.jetbrains.python.fixtures.PyLightFixtureTestCase;
|
import com.jetbrains.python.fixtures.PyLightFixtureTestCase;
|
||||||
import com.jetbrains.python.psi.LanguageLevel;
|
import com.jetbrains.python.psi.LanguageLevel;
|
||||||
import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher;
|
import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher;
|
||||||
@@ -8,6 +9,7 @@ import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher;
|
|||||||
/**
|
/**
|
||||||
* @author yole
|
* @author yole
|
||||||
*/
|
*/
|
||||||
|
@TestDataPath("$CONTENT_ROOT/../testData/psi/")
|
||||||
public class PythonParsingTest extends ParsingTestCase {
|
public class PythonParsingTest extends ParsingTestCase {
|
||||||
public PythonParsingTest() {
|
public PythonParsingTest() {
|
||||||
super("", "py");
|
super("", "py");
|
||||||
@@ -120,6 +122,10 @@ public class PythonParsingTest extends ParsingTestCase {
|
|||||||
doTest(LanguageLevel.PYTHON30);
|
doTest(LanguageLevel.PYTHON30);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testPy3KKeywords() throws Exception {
|
||||||
|
doTest(LanguageLevel.PYTHON30);
|
||||||
|
}
|
||||||
|
|
||||||
public void doTest() throws Exception {
|
public void doTest() throws Exception {
|
||||||
doTest(LanguageLevel.PYTHON25);
|
doTest(LanguageLevel.PYTHON25);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user