From 671e76a25f48d3ecdb477948679c44a02115278a Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Sat, 27 Dec 2014 17:45:57 +0300 Subject: [PATCH] fixed PY-14311 IPython Notebook: Statement expected false positive for magic functions entered in just created cells --- .../panels/code/IpnbCodeSourcePanel.java | 7 +------ .../plugins/ipnb/psi/IpnbPyParser.java | 16 +++++++++++++++- .../ipnb/psi/IpnbPyParsingContext.java | 19 +++++++++++-------- .../console/parsing/PyConsoleParser.java | 2 +- .../parsing/PyConsoleParsingContext.java | 4 ++-- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodeSourcePanel.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodeSourcePanel.java index b778b3aa3902..5bd21e27fdee 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodeSourcePanel.java +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodeSourcePanel.java @@ -72,12 +72,7 @@ public class IpnbCodeSourcePanel extends IpnbPanel imp final JPanel panel = new JPanel(new BorderLayout()); panel.setBackground(UIUtil.isUnderDarcula() ? IpnbEditorUtil.getBackground() : Gray._247); - if (mySource.startsWith("%")) { - myEditor = IpnbEditorUtil.createPlainCodeEditor(myProject, mySource); - } - else { - myEditor = IpnbEditorUtil.createPythonCodeEditor(myProject, this); - } + myEditor = IpnbEditorUtil.createPythonCodeEditor(myProject, this); Disposer.register(myParent.getFileEditor(), new Disposable() { @Override public void dispose() { diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParser.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParser.java index 925539c18328..f5946f8763b2 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParser.java +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParser.java @@ -1,14 +1,28 @@ package org.jetbrains.plugins.ipnb.psi; +import com.intellij.lang.ASTNode; import com.intellij.lang.PsiBuilder; +import com.intellij.psi.tree.IElementType; +import com.jetbrains.python.console.parsing.PyConsoleParser; +import com.jetbrains.python.console.parsing.PythonConsoleData; import com.jetbrains.python.parsing.ParsingContext; import com.jetbrains.python.parsing.PyParser; import com.jetbrains.python.parsing.StatementParsing; import com.jetbrains.python.psi.LanguageLevel; +import org.jetbrains.annotations.NotNull; public class IpnbPyParser extends PyParser { + private boolean myIPythonStartSymbol; + @Override protected ParsingContext createParsingContext(PsiBuilder builder, LanguageLevel languageLevel, StatementParsing.FUTURE futureFlag) { - return new IpnbPyParsingContext(builder, languageLevel, futureFlag); + return new IpnbPyParsingContext(builder, languageLevel, futureFlag, myIPythonStartSymbol, new PythonConsoleData()); + } + + @NotNull + @Override + public ASTNode parse(IElementType root, PsiBuilder builder) { + myIPythonStartSymbol = PyConsoleParser.startsWithIPythonSpecialSymbol(builder); + return super.parse(root, builder); } } diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParsingContext.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParsingContext.java index 37e78b18e843..e3e6f708f31c 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParsingContext.java +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/psi/IpnbPyParsingContext.java @@ -3,6 +3,8 @@ package org.jetbrains.plugins.ipnb.psi; import com.intellij.lang.PsiBuilder; import com.intellij.psi.tree.IElementType; import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.console.parsing.PyConsoleParsingContext; +import com.jetbrains.python.console.parsing.PythonConsoleData; import com.jetbrains.python.parsing.ExpressionParsing; import com.jetbrains.python.parsing.FunctionParsing; import com.jetbrains.python.parsing.ParsingContext; @@ -10,16 +12,16 @@ import com.jetbrains.python.parsing.StatementParsing; import com.jetbrains.python.psi.LanguageLevel; import org.jetbrains.annotations.Nullable; -public class IpnbPyParsingContext extends ParsingContext { +public class IpnbPyParsingContext extends PyConsoleParsingContext { private final StatementParsing myStatementParser; private final ExpressionParsing myExpressionParser; private final FunctionParsing myFunctionParser; public IpnbPyParsingContext(final PsiBuilder builder, LanguageLevel languageLevel, - StatementParsing.FUTURE futureFlag) { - super(builder, languageLevel, futureFlag); - myStatementParser = new IpnbPyStatementParsing(this, futureFlag); + StatementParsing.FUTURE futureFlag, boolean startSymbol, PythonConsoleData data) { + super(builder, languageLevel, futureFlag, data, startSymbol); + myStatementParser = new IpnbPyStatementParsing(this, futureFlag, startSymbol, data); myExpressionParser = new IpnbPyExpressionParsing(this); myFunctionParser = new IpnbPyFunctionParsing(this); } @@ -39,7 +41,7 @@ public class IpnbPyParsingContext extends ParsingContext { return myFunctionParser; } - private static class IpnbPyExpressionParsing extends ExpressionParsing { + private static class IpnbPyExpressionParsing extends ConsoleExpressionParsing { public IpnbPyExpressionParsing(ParsingContext context) { super(context); } @@ -64,10 +66,10 @@ public class IpnbPyParsingContext extends ParsingContext { } } - private static class IpnbPyStatementParsing extends StatementParsing { + private static class IpnbPyStatementParsing extends ConsoleStatementParsing { - protected IpnbPyStatementParsing(ParsingContext context, @Nullable FUTURE futureFlag) { - super(context, futureFlag); + protected IpnbPyStatementParsing(ParsingContext context, @Nullable FUTURE futureFlag, boolean startSymbol, PythonConsoleData data) { + super(context, futureFlag, startSymbol, data); } @Override @@ -76,6 +78,7 @@ public class IpnbPyParsingContext extends ParsingContext { } } + private static class IpnbPyFunctionParsing extends FunctionParsing { public IpnbPyFunctionParsing(ParsingContext context) { diff --git a/python/src/com/jetbrains/python/console/parsing/PyConsoleParser.java b/python/src/com/jetbrains/python/console/parsing/PyConsoleParser.java index 5aef0caa95d7..3f30d60aa406 100644 --- a/python/src/com/jetbrains/python/console/parsing/PyConsoleParser.java +++ b/python/src/com/jetbrains/python/console/parsing/PyConsoleParser.java @@ -63,7 +63,7 @@ public class PyConsoleParser extends PyParser{ return builder.getTreeBuilt(); } - private static boolean startsWithIPythonSpecialSymbol(PsiBuilder builder) { + public static boolean startsWithIPythonSpecialSymbol(PsiBuilder builder) { IElementType tokenType = builder.getTokenType(); return builder.getTokenType() == PyConsoleTokenTypes.QUESTION_MARK || tokenType == PyTokenTypes.PERC || tokenType == PyTokenTypes.COMMA || tokenType == PyTokenTypes.SEMICOLON || "/".equals(builder.getTokenText()); diff --git a/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java b/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java index 2a41bbe1d8f2..32e8882b38b7 100644 --- a/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java +++ b/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java @@ -56,7 +56,7 @@ public class PyConsoleParsingContext extends ParsingContext { return expressionParser; } - private static class ConsoleStatementParsing extends StatementParsing { + public static class ConsoleStatementParsing extends StatementParsing { private boolean myStartsWithIPythonSymbol; private PythonConsoleData myPythonConsoleData; @@ -136,7 +136,7 @@ public class PyConsoleParsingContext extends ParsingContext { } } - private static class ConsoleExpressionParsing extends ExpressionParsing { + public static class ConsoleExpressionParsing extends ExpressionParsing { public ConsoleExpressionParsing(ParsingContext context) { super(context); }