From 4f6e10a834842c52ce27347ecae05346c381ccaa Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 28 Aug 2013 13:04:44 +0400 Subject: [PATCH 01/26] Python plugin update layout fixed --- python/layout.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/python/layout.xml b/python/layout.xml index b4386857b114..2b35430d16b3 100644 --- a/python/layout.xml +++ b/python/layout.xml @@ -15,6 +15,7 @@ + From 9a1c7fe63259892838954574ae35162d0f454045 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 16:47:50 +0400 Subject: [PATCH 02/26] Updated javadoc --- python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java b/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java index f5537c7d0c44..870ca00a8a62 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java +++ b/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java @@ -5,10 +5,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** - * PSI element that (re)defnies names in following namespace, e.g. as assignment statement does. + * PSI element that (re)defines names in following namespace, e.g. as assignment statement does. * * NOTE: When declaring additional elements as name definers, please also adjust the token set via - * {@link PythonDialectsTokenSetContributor#getNameDefinerTokens()}. + * {@link com.jetbrains.python.PythonDialectsTokenSetContributor#getNameDefinerTokens()}. * * @author dcheryasov */ From 789d18607e4c912cc05db18f077c40fcd57fa3ff Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 16:58:28 +0400 Subject: [PATCH 03/26] Name definers collected in ScopeImpl made PyImportedNameDefiner instances --- .../jetbrains/python/psi/PyImportElement.java | 2 +- .../python/psi/PyImportedNameDefiner.java | 9 +++++++ .../python/psi/PyStarImportElement.java | 2 +- .../codeInsight/dataflow/scope/Scope.java | 4 ++-- .../dataflow/scope/impl/ScopeImpl.java | 24 +++++++++---------- .../python/psi/resolve/PyResolveUtil.java | 2 +- 6 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 python/psi-api/src/com/jetbrains/python/psi/PyImportedNameDefiner.java diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyImportElement.java b/python/psi-api/src/com/jetbrains/python/psi/PyImportElement.java index d53f5f2f93a9..b0ba10eced94 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyImportElement.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyImportElement.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.Nullable; /** * @author yole */ -public interface PyImportElement extends PyElement, NameDefiner, StubBasedPsiElement { +public interface PyImportElement extends PyElement, PyImportedNameDefiner, StubBasedPsiElement { @Nullable PyReferenceExpression getImportReferenceExpression(); diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyImportedNameDefiner.java b/python/psi-api/src/com/jetbrains/python/psi/PyImportedNameDefiner.java new file mode 100644 index 000000000000..8081d0fd38d9 --- /dev/null +++ b/python/psi-api/src/com/jetbrains/python/psi/PyImportedNameDefiner.java @@ -0,0 +1,9 @@ +package com.jetbrains.python.psi; + +/** + * Name definer that defines names imported somehow from other modules. + * + * @author vlan + */ +public interface PyImportedNameDefiner extends NameDefiner { +} diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyStarImportElement.java b/python/psi-api/src/com/jetbrains/python/psi/PyStarImportElement.java index 1f91048da631..1a00a21c17d9 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyStarImportElement.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyStarImportElement.java @@ -5,5 +5,5 @@ package com.jetbrains.python.psi; * User: dcheryasov * Date: Jul 28, 2008 */ -public interface PyStarImportElement extends PyElement, NameDefiner { +public interface PyStarImportElement extends PyElement, PyImportedNameDefiner { } diff --git a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java index d4aeb3f752c8..4882c509e157 100644 --- a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java +++ b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java @@ -3,7 +3,7 @@ package com.jetbrains.python.codeInsight.dataflow.scope; import com.intellij.codeInsight.dataflow.DFALimitExceededException; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNamedElement; -import com.jetbrains.python.psi.NameDefiner; +import com.jetbrains.python.psi.PyImportedNameDefiner; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,7 +27,7 @@ public interface Scope { boolean containsDeclaration(String name); @NotNull - List getNameDefiners(); + List getImportedNameDefiners(); @Nullable PsiNamedElement getNamedElement(String name); diff --git a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java index 68ce31d527be..ab86fac9b9bb 100644 --- a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java +++ b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java @@ -6,7 +6,6 @@ import com.intellij.codeInsight.dataflow.map.DFAMap; import com.intellij.codeInsight.dataflow.map.DFAMapEngine; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNamedElement; -import com.jetbrains.cython.psi.CythonIncludeStatement; import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache; import com.jetbrains.python.codeInsight.controlflow.ScopeOwner; import com.jetbrains.python.codeInsight.dataflow.PyReachingDefsDfaInstance; @@ -31,7 +30,7 @@ public class ScopeImpl implements Scope { private volatile List myNestedScopes; private final ScopeOwner myFlowOwner; private volatile Map myNamedElements; - private volatile List myNameDefiners; // declarations which declare unknown set of names, such as 'from ... import *' + private volatile List myImportedNameDefiners; // Declarations which declare unknown set of imported names private volatile Set myAugAssignments; public ScopeImpl(final ScopeOwner flowOwner) { @@ -97,7 +96,7 @@ public class ScopeImpl implements Scope { } public boolean containsDeclaration(final String name) { - if (myNamedElements == null || myNameDefiners == null) { + if (myNamedElements == null || myImportedNameDefiners == null) { collectDeclarations(); } if (isNonlocal(name)) { @@ -109,7 +108,7 @@ public class ScopeImpl implements Scope { if (isAugAssignment(name)) { return true; } - for (NameDefiner definer : getNameDefiners()) { + for (NameDefiner definer : getImportedNameDefiners()) { if (definer.getElementNamed(name) != null) { return true; } @@ -119,11 +118,11 @@ public class ScopeImpl implements Scope { @NotNull @Override - public List getNameDefiners() { - if (myNameDefiners == null) { + public List getImportedNameDefiners() { + if (myImportedNameDefiners == null) { collectDeclarations(); } - return myNameDefiners; + return myImportedNameDefiners; } @Nullable @@ -158,7 +157,7 @@ public class ScopeImpl implements Scope { private void collectDeclarations() { final Map namedElements = new HashMap(); - final List nameDefiners = new ArrayList(); + final List importedNameDefiners = new ArrayList(); final List nestedScopes = new ArrayList(); final Set globals = new HashSet(); final Set nonlocals = new HashSet(); @@ -214,9 +213,8 @@ public class ScopeImpl implements Scope { if (node instanceof PsiNamedElement && !(node instanceof PyKeywordArgument)) { namedElements.put(node.getName(), (PsiNamedElement)node); } - // TODO: Cython-specific code - if (node instanceof PyStarImportElement || node instanceof PyImportElement || node instanceof CythonIncludeStatement) { - nameDefiners.add((NameDefiner)node); + if (node instanceof PyImportedNameDefiner) { + importedNameDefiners.add((PyImportedNameDefiner)node); } if (node instanceof ScopeOwner) { final Scope scope = ControlFlowCache.getScope((ScopeOwner)node); @@ -228,7 +226,7 @@ public class ScopeImpl implements Scope { } }); - Collections.sort(nameDefiners, new Comparator() { + Collections.sort(importedNameDefiners, new Comparator() { @Override public int compare(NameDefiner d1, NameDefiner d2) { return getPriority(d2) - getPriority(d1); @@ -243,7 +241,7 @@ public class ScopeImpl implements Scope { }); myNamedElements = namedElements; - myNameDefiners = nameDefiners; + myImportedNameDefiners = importedNameDefiners; myNestedScopes = nestedScopes; myGlobals = globals; myNonlocals = nonlocals; diff --git a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java index c39173f7a531..3d490f57d71f 100644 --- a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java @@ -125,7 +125,7 @@ public class PyResolveUtil { } } } - for (NameDefiner definer : scope.getNameDefiners()) { + for (NameDefiner definer : scope.getImportedNameDefiners()) { if (!processor.execute(definer, ResolveState.initial())) { found = true; break; From 9b0c92d278545692da3d444e4708f420e42695e4 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 17:03:01 +0400 Subject: [PATCH 04/26] Low-rate import resolve results generalized as PyImportedNameDefiners --- .../python/psi/impl/references/PyReferenceImpl.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java index d6597cdd84fe..66107c7ffe13 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -16,8 +16,6 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PlatformIcons; import com.intellij.util.ProcessingContext; -import com.jetbrains.cython.CythonLanguageDialect; -import com.jetbrains.cython.psi.CythonIncludeStatement; import com.jetbrains.cython.psi.CythonNamedElement; import com.jetbrains.cython.psi.CythonVariable; import com.jetbrains.python.PyNames; @@ -373,10 +371,7 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference public static int getRate(PsiElement elt) { int rate; - if (CythonLanguageDialect.isInsideCythonFile(elt) && elt instanceof CythonIncludeStatement) { - rate = RatedResolveResult.RATE_LOW; - } - else if (elt instanceof PyImportElement || elt instanceof PyStarImportElement || elt instanceof PyReferenceExpression) { + if (elt instanceof PyImportedNameDefiner || elt instanceof PyReferenceExpression) { rate = RatedResolveResult.RATE_LOW; } else if (elt instanceof PyFile) { From 2069d45aebc9eb76caafd707f7eb8bf6f228f0bf Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 17:27:17 +0400 Subject: [PATCH 05/26] Removed unnecessary Cython check Cython-related resolve logic has been already extracted into CythonReferenceResolveProvider. --- .../python/psi/impl/references/PyReferenceImpl.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java index 66107c7ffe13..91409ed4d160 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -16,7 +16,6 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PlatformIcons; import com.intellij.util.ProcessingContext; -import com.jetbrains.cython.psi.CythonNamedElement; import com.jetbrains.cython.psi.CythonVariable; import com.jetbrains.python.PyNames; import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache; @@ -277,7 +276,7 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference definers = processor.getDefiners(); } } - else if (!isCythonLevel(myElement)) { + else { uexpr = null; } } @@ -327,10 +326,6 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference return ret; } - private static boolean isCythonLevel(@Nullable PsiElement element) { - return PsiTreeUtil.getParentOfType(element, CythonNamedElement.class) != null; - } - private PsiElement findResolveRoof(String referencedName, PsiElement realContext) { if (PyUtil.isClassPrivateName(referencedName)) { // a class-private name; limited by either class or this file From 5b63ca94f1f7bc996827a051f474ac94e587c7e4 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 15:24:43 +0200 Subject: [PATCH 06/26] decouple QualifiedNameResolver from DjangoFacetType --- .../jetbrains/python/buildout/BuildoutFacet.java | 5 +++++ .../python/facet/PythonPathContributingFacet.java | 1 + .../psi/resolve/QualifiedNameResolverImpl.java | 13 +++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/buildout/BuildoutFacet.java b/python/src/com/jetbrains/python/buildout/BuildoutFacet.java index 5fae6a5be5f7..fb543e974811 100644 --- a/python/src/com/jetbrains/python/buildout/BuildoutFacet.java +++ b/python/src/com/jetbrains/python/buildout/BuildoutFacet.java @@ -236,6 +236,11 @@ public class BuildoutFacet extends Facet implements return cfg.getPaths(); } + @Override + public boolean acceptRootAsTopLevelPackage() { + return false; + } + @Nullable public static BuildoutFacet getInstance(Module module) { return FacetManager.getInstance(module).getFacetByType(BuildoutFacetType.ID); diff --git a/python/src/com/jetbrains/python/facet/PythonPathContributingFacet.java b/python/src/com/jetbrains/python/facet/PythonPathContributingFacet.java index 7bba6c11715b..2e97f4489b56 100644 --- a/python/src/com/jetbrains/python/facet/PythonPathContributingFacet.java +++ b/python/src/com/jetbrains/python/facet/PythonPathContributingFacet.java @@ -7,4 +7,5 @@ import java.util.List; */ public interface PythonPathContributingFacet { List getAdditionalPythonPath(); + boolean acceptRootAsTopLevelPackage(); } diff --git a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java index 8805c46f333e..4be01fc8b508 100644 --- a/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java +++ b/python/src/com/jetbrains/python/psi/resolve/QualifiedNameResolverImpl.java @@ -2,6 +2,7 @@ package com.jetbrains.python.psi.resolve; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.intellij.facet.Facet; import com.intellij.facet.FacetManager; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; @@ -12,9 +13,9 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.jetbrains.django.facet.DjangoFacetType; import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil; import com.jetbrains.python.console.PydevConsoleRunner; +import com.jetbrains.python.facet.PythonPathContributingFacet; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.impl.PyImportResolver; import com.jetbrains.python.psi.impl.PyQualifiedName; @@ -86,7 +87,15 @@ public class QualifiedNameResolverImpl implements RootVisitor, QualifiedNameReso private boolean isAcceptRootAsTopLevelPackage() { Module module = myContext.getModule(); - return module != null && FacetManager.getInstance(module).getFacetByType(DjangoFacetType.ID) != null; + if (module != null) { + Facet[] facets = FacetManager.getInstance(module).getAllFacets(); + for (Facet facet : facets) { + if (facet instanceof PythonPathContributingFacet && ((PythonPathContributingFacet)facet).acceptRootAsTopLevelPackage()) { + return true; + } + } + } + return false; } @Override From 7f0743bef37a40bedd12a5c1938248c9d13760e6 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 15:46:53 +0200 Subject: [PATCH 07/26] update until-build according to new branch number --- python/pluginSrc/META-INF/plugin.xml | 2 +- python/rest/resources/META-INF/plugin.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/pluginSrc/META-INF/plugin.xml b/python/pluginSrc/META-INF/plugin.xml index d14b1e7f6070..9cb63c8f57a3 100644 --- a/python/pluginSrc/META-INF/plugin.xml +++ b/python/pluginSrc/META-INF/plugin.xml @@ -4,7 +4,7 @@ Pythonid Python - + Smart editing for Python scripts 2.11 com.intellij.modules.ultimate diff --git a/python/rest/resources/META-INF/plugin.xml b/python/rest/resources/META-INF/plugin.xml index d80ed0ea468e..5a75d1bd0033 100644 --- a/python/rest/resources/META-INF/plugin.xml +++ b/python/rest/resources/META-INF/plugin.xml @@ -4,7 +4,7 @@ This plugin enables support for reStructuredText files (*.rst) JetBrains 130.SNAPSHOT - + com.intellij.modules.lang From d09a7bc76fc12ba70549f56a849873e0164f4da0 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 18:23:41 +0400 Subject: [PATCH 08/26] Don't use resolvesToSameLocal() shortcut for Cython elements We rely on resolve() for Cython unqualified names. --- .../jetbrains/python/psi/impl/references/PyReferenceImpl.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java index 91409ed4d160..25561a0d8288 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -16,7 +16,6 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PlatformIcons; import com.intellij.util.ProcessingContext; -import com.jetbrains.cython.psi.CythonVariable; import com.jetbrains.python.PyNames; import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache; import com.jetbrains.python.codeInsight.controlflow.ReadWriteInstruction; @@ -433,8 +432,7 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference if (!haveQualifiers(element)) { final ScopeOwner ourScopeOwner = ScopeUtil.getScopeOwner(getElement()); final ScopeOwner theirScopeOwner = ScopeUtil.getScopeOwner(element); - // TODO: Cython-dependent code without CythonLanguageDialect.isInsideCythonFile() check - if (element instanceof PyParameter || element instanceof PyTargetExpression || element instanceof CythonVariable) { + if (element instanceof PyParameter || element instanceof PyTargetExpression) { // Check if the reference is in the same or inner scope of the element scope, not shadowed by an intermediate declaration if (resolvesToSameLocal(element, elementName, ourScopeOwner, theirScopeOwner)) { return true; From c0f5b5afe311f238b3493fb1955978406d09b72e Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 18:33:30 +0400 Subject: [PATCH 09/26] No need to check for CythonStructType in canQualifyAnImplicitName() It is invoked only for unknown types. --- .../python/psi/impl/references/PyQualifiedReference.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java index 68285124ba00..8e860e05fcfd 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java @@ -18,7 +18,6 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.PlatformIcons; import com.intellij.util.ProcessingContext; import com.intellij.util.indexing.FileBasedIndex; -import com.jetbrains.cython.types.CythonStructType; import com.jetbrains.python.PyNames; import com.jetbrains.python.codeInsight.controlflow.ScopeOwner; import com.jetbrains.python.psi.*; @@ -199,10 +198,6 @@ public class PyQualifiedReference extends PyReferenceImpl { } } } - // TODO: Cython-specific code without CythonLanguageDialect.isInsideCythonFile() check - if (qualType instanceof CythonStructType) { - return false; - } return true; } From 77a675e29ec4579442e77536407e924cc6e7d286 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 18:49:04 +0400 Subject: [PATCH 10/26] Moved 'cppclass' in PyNamedParameterImpl.isSelf() to CythonNamedParameter --- .../com/jetbrains/python/psi/impl/PyNamedParameterImpl.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java index f9f175265e56..05cd3ccc91db 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java @@ -12,7 +12,6 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PlatformIcons; import com.intellij.util.Processor; -import com.jetbrains.cython.psi.CythonClass; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyTokenTypes; @@ -310,9 +309,6 @@ public class PyNamedParameterImpl extends PyPresentableElementImpl Date: Wed, 28 Aug 2013 16:11:46 +0200 Subject: [PATCH 11/26] rename UnusedLocalFilter to PyInspectionExtension, added method for ignoring missing docstrings --- .../inspections/PyInspectionExtension.java | 20 +++++++++++++++++++ python/src/META-INF/python-plugin-common.xml | 4 ++-- .../inspections/PyDocstringInspection.java | 17 ++++++++++------ .../PyUnusedLocalInspectionVisitor.java | 4 ++-- .../python/inspections/UnusedLocalFilter.java | 13 ------------ 5 files changed, 35 insertions(+), 23 deletions(-) create mode 100644 python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java delete mode 100644 python/src/com/jetbrains/python/inspections/UnusedLocalFilter.java diff --git a/python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java b/python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java new file mode 100644 index 000000000000..e553676d1b69 --- /dev/null +++ b/python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java @@ -0,0 +1,20 @@ +package com.jetbrains.python.inspections; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiElement; +import com.jetbrains.python.psi.PyDocStringOwner; + +/** + * @author yole + */ +public abstract class PyInspectionExtension { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("Pythonid.inspectionExtension"); + + public boolean ignoreUnused(PsiElement local) { + return false; + } + + public boolean ignoreMissingDocstring(PyDocStringOwner docStringOwner) { + return false; + } +} diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index 19cef71a95a3..cccdce5c8079 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -892,7 +892,7 @@ - + @@ -945,7 +945,7 @@ - + diff --git a/python/src/com/jetbrains/python/inspections/PyDocstringInspection.java b/python/src/com/jetbrains/python/inspections/PyDocstringInspection.java index d417a01e66a3..277f7493350b 100644 --- a/python/src/com/jetbrains/python/inspections/PyDocstringInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyDocstringInspection.java @@ -8,16 +8,15 @@ import com.intellij.codeInspection.LocalInspectionToolSession; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.codeInspection.SuppressIntentionAction; import com.intellij.lang.ASTNode; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.util.PsiTreeUtil; -import com.jetbrains.django.model.DjangoMeta; -import com.jetbrains.django.model.DjangoModel; import com.jetbrains.python.PyBundle; import com.jetbrains.python.PyNames; -import com.jetbrains.python.documentation.*; +import com.jetbrains.python.documentation.DocStringUtil; import com.jetbrains.python.inspections.quickfix.DocstringQuickFix; import com.jetbrains.python.inspections.quickfix.PySuppressInspectionFix; import com.jetbrains.python.psi.*; @@ -76,9 +75,15 @@ public class PyDocstringInspection extends PyInspection { public void visitPyClass(PyClass node) { if (PythonUnitTestUtil.isUnitTestCaseClass(node)) return; final String name = node.getName(); - final PyClass outerClass = PsiTreeUtil.getParentOfType(node, PyClass.class); - final boolean isDjangoMeta = DjangoModel.isDjangoModelDescendant(outerClass) && DjangoMeta.isMetaClass(node); - if (name != null && !name.startsWith("_") && !isDjangoMeta) checkDocString(node); + if (name == null || name.startsWith("_")) { + return; + } + for (PyInspectionExtension extension : Extensions.getExtensions(PyInspectionExtension.EP_NAME)) { + if (extension.ignoreMissingDocstring(node)) { + return; + } + } + checkDocString(node); } private void checkDocString(PyDocStringOwner node) { diff --git a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java index 601f3ee1d592..e2d5989bdcdf 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java +++ b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java @@ -211,7 +211,7 @@ public class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor { } void registerProblems() { - final UnusedLocalFilter[] filters = Extensions.getExtensions(UnusedLocalFilter.EP_NAME); + final PyInspectionExtension[] filters = Extensions.getExtensions(PyInspectionExtension.EP_NAME); // Register problems final Set functionsWithInheritors = new HashSet(); @@ -219,7 +219,7 @@ public class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor { for (PsiElement element : myUnusedElements) { boolean ignoreUnused = false; - for (UnusedLocalFilter filter : filters) { + for (PyInspectionExtension filter : filters) { if (filter.ignoreUnused(element)) { ignoreUnused = true; } diff --git a/python/src/com/jetbrains/python/inspections/UnusedLocalFilter.java b/python/src/com/jetbrains/python/inspections/UnusedLocalFilter.java deleted file mode 100644 index e977fac541d7..000000000000 --- a/python/src/com/jetbrains/python/inspections/UnusedLocalFilter.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jetbrains.python.inspections; - -import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.psi.PsiElement; - -/** - * @author yole - */ -public interface UnusedLocalFilter { - ExtensionPointName EP_NAME = ExtensionPointName.create("Pythonid.unusedLocalFilter"); - - boolean ignoreUnused(PsiElement local); -} From bbd463af5265f0700a61d270374c3e97e7599dbb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 16:24:00 +0200 Subject: [PATCH 12/26] decouple AddFunctionQuickFix from Django --- .../inspections/PyInspectionExtension.java | 6 ++++ .../quickfix/AddFunctionQuickFix.java | 34 +++++++++++-------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java b/python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java index e553676d1b69..635cf96ccbc9 100644 --- a/python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java +++ b/python/psi-api/src/com/jetbrains/python/inspections/PyInspectionExtension.java @@ -4,6 +4,8 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.psi.PsiElement; import com.jetbrains.python.psi.PyDocStringOwner; +import java.util.List; + /** * @author yole */ @@ -17,4 +19,8 @@ public abstract class PyInspectionExtension { public boolean ignoreMissingDocstring(PyDocStringOwner docStringOwner) { return false; } + + public List getFunctionParametersFromUsage(PsiElement elt) { + return null; + } } diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java index cc67a715a211..bd588ba40e4d 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java @@ -6,18 +6,20 @@ import com.intellij.codeInsight.template.TemplateBuilder; import com.intellij.codeInsight.template.TemplateBuilderFactory; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; -import com.jetbrains.django.facet.DjangoFacet; import com.jetbrains.python.PyBundle; +import com.jetbrains.python.inspections.PyInspectionExtension; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.ParamHelper; import com.jetbrains.python.psi.impl.PyFunctionBuilder; import org.jetbrains.annotations.NotNull; +import java.util.List; + import static com.jetbrains.python.psi.PyUtil.sure; /** @@ -29,10 +31,10 @@ import static com.jetbrains.python.psi.PyUtil.sure; */ public class AddFunctionQuickFix implements LocalQuickFix { - private String myIdentifier; + private final String myIdentifier; private PyFile myPyFile; - public AddFunctionQuickFix(String identifier, PyFile module) { + public AddFunctionQuickFix(@NotNull String identifier, PyFile module) { myIdentifier = identifier; myPyFile = module; } @@ -52,15 +54,14 @@ public class AddFunctionQuickFix implements LocalQuickFix { // descriptor points to the unresolved identifier // there can be no name clash, else the name would have resolved, and it hasn't. PsiElement problem_elt = descriptor.getPsiElement().getParent(); // id -> ref expr - String item_name = myIdentifier; - sure(myPyFile); sure(item_name); + sure(myPyFile); sure(FileModificationService.getInstance().preparePsiElementForWrite(myPyFile)); // try to at least match parameter count // TODO: get parameter style from code style - PyFunctionBuilder builder = new PyFunctionBuilder(item_name); - PsiElement problem_parent = problem_elt.getParent(); - if (problem_parent instanceof PyCallExpression) { - PyArgumentList arglist = ((PyCallExpression)problem_parent).getArgumentList(); + PyFunctionBuilder builder = new PyFunctionBuilder(myIdentifier); + PsiElement problemParent = problem_elt.getParent(); + if (problemParent instanceof PyCallExpression) { + PyArgumentList arglist = ((PyCallExpression)problemParent).getArgumentList(); sure(arglist); final PyExpression[] args = arglist.getArguments(); for (PyExpression arg : args) { @@ -76,10 +77,15 @@ public class AddFunctionQuickFix implements LocalQuickFix { } } } - else if (problem_parent != null) { - PsiFile source_file = problem_parent.getContainingFile(); - if (source_file != null && "urls.py".equals(source_file.getName()) && DjangoFacet.isPresent(source_file)) { - builder.parameter("request"); // specifically for mentions in urlpatterns + else if (problemParent != null) { + for (PyInspectionExtension extension : Extensions.getExtensions(PyInspectionExtension.EP_NAME)) { + List params = extension.getFunctionParametersFromUsage(problem_elt); + if (params != null) { + for (String param : params) { + builder.parameter(param); + } + break; + } } } // else: no arglist, use empty args From 31896f9d06642048a5d438a8ae21d2d43891f6b1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 17:01:42 +0200 Subject: [PATCH 13/26] PyRemoteInterpreterManager moved to python-community --- .../remote/PyRemoteSdkAdditionalData.java | 2 +- .../python/remote/PyRemoteSdkData.java | 25 +++++++++++++++++++ .../PythonRemoteInterpreterManager.java | 10 +++----- .../python/remote/RemoteProjectSettings.java | 23 +++++++++++++++++ .../python/sdk/InterpreterPathChooser.java | 4 ++- 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 python/src/com/jetbrains/python/remote/PyRemoteSdkData.java create mode 100644 python/src/com/jetbrains/python/remote/RemoteProjectSettings.java diff --git a/python/src/com/jetbrains/python/remote/PyRemoteSdkAdditionalData.java b/python/src/com/jetbrains/python/remote/PyRemoteSdkAdditionalData.java index 713c56f319d0..b94b29a781e5 100644 --- a/python/src/com/jetbrains/python/remote/PyRemoteSdkAdditionalData.java +++ b/python/src/com/jetbrains/python/remote/PyRemoteSdkAdditionalData.java @@ -19,7 +19,7 @@ import java.util.List; /** * @author traff */ -public final class PyRemoteSdkAdditionalData extends PythonSdkAdditionalData implements RemoteSdkAdditionalData { +public final class PyRemoteSdkAdditionalData extends PythonSdkAdditionalData implements RemoteSdkAdditionalData, PyRemoteSdkData { private static final String HELPERS_DIR = ".pycharm_helpers"; private final static String SKELETONS_PATH = "SKELETONS_PATH"; diff --git a/python/src/com/jetbrains/python/remote/PyRemoteSdkData.java b/python/src/com/jetbrains/python/remote/PyRemoteSdkData.java new file mode 100644 index 000000000000..ea2f8dfe6c7c --- /dev/null +++ b/python/src/com/jetbrains/python/remote/PyRemoteSdkData.java @@ -0,0 +1,25 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.python.remote; + +import com.intellij.remotesdk.RemoteSdkData; + +/** + * @author yole + */ +public interface PyRemoteSdkData extends RemoteSdkData { + String getSkeletonsPath(); +} diff --git a/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java b/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java index 585c069c5b57..67efe23ba160 100644 --- a/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java +++ b/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java @@ -13,12 +13,10 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.remotesdk.RemoteInterpreterException; import com.intellij.remotesdk.RemoteSdkData; -import com.intellij.remotesdk.RemoteSdkFactory; import com.intellij.remotesdk.RemoteSshProcess; import com.intellij.util.NullableConsumer; import com.intellij.util.PathMappingSettings; import com.jetbrains.python.PythonHelpersLocator; -import com.jetbrains.python.remote.ui.RemoteProjectSettings; import com.jetbrains.python.sdk.skeletons.PySkeletonGenerator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -30,21 +28,21 @@ import java.util.List; /** * @author traff */ -public abstract class PythonRemoteInterpreterManager implements RemoteSdkFactory { +public abstract class PythonRemoteInterpreterManager { public final static ExtensionPointName EP_NAME = ExtensionPointName.create("Pythonid.remoteInterpreterManager"); public static final String WEB_DEPLOYMENT_PLUGIN_IS_DISABLED = "Remote interpreter can't be executed. Please enable the Remote Hosts Access plugin."; public abstract ProcessHandler startRemoteProcess(@Nullable Project project, - @NotNull PyRemoteSdkAdditionalData data, + @NotNull PyRemoteSdkData data, @NotNull GeneralCommandLine commandLine, @Nullable PathMappingSettings mappingSettings) throws RemoteInterpreterException; public abstract ProcessHandler startRemoteProcessWithPid(@Nullable Project project, - @NotNull PyRemoteSdkAdditionalData data, + @NotNull PyRemoteSdkData data, @NotNull GeneralCommandLine commandLine, @Nullable PathMappingSettings mappingSettings) @@ -120,7 +118,7 @@ public abstract class PythonRemoteInterpreterManager implements RemoteSdkFactory } public abstract PathMappingSettings setupMappings(@Nullable Project project, - @NotNull PyRemoteSdkAdditionalData data, + @NotNull PyRemoteSdkData data, @Nullable PathMappingSettings mappingSettings); public static class PyRemoteInterpreterExecutionException extends ExecutionException { diff --git a/python/src/com/jetbrains/python/remote/RemoteProjectSettings.java b/python/src/com/jetbrains/python/remote/RemoteProjectSettings.java new file mode 100644 index 000000000000..c2fc5a4b0ccf --- /dev/null +++ b/python/src/com/jetbrains/python/remote/RemoteProjectSettings.java @@ -0,0 +1,23 @@ +package com.jetbrains.python.remote; + +/** +* @author traff +*/ +public class RemoteProjectSettings { + private String myDeploymentName; + private String myRemoteRoot; + + + public RemoteProjectSettings(String deploymentName, String remoteRoot) { + myDeploymentName = deploymentName; + myRemoteRoot = remoteRoot; + } + + public String getDeploymentName() { + return myDeploymentName; + } + + public String getRemoteRoot() { + return myRemoteRoot; + } +} diff --git a/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java b/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java index fdd356a85a04..7be161979cd2 100644 --- a/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java +++ b/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java @@ -72,7 +72,9 @@ public class InterpreterPathChooser extends BaseListPopupStep { paths.add(FileUtil.getLocationRelativeToUserHome(sdkHome)); } paths.add(LOCAL); - paths.add(REMOTE); + if (PythonRemoteInterpreterManager.getInstance() != null) { + paths.add(REMOTE); + } if (showVirtualEnv) { paths.add(VIRTUALENV); } From 6f39dc2cef17b47442db1855654db45d95cd1ef6 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 17:14:19 +0200 Subject: [PATCH 14/26] decouple debugger from PyRemotePositionConverter; replace some usages of PyRemoteSdkAdditionalData with PyRemoteSdkData --- .../python/debugger/PyPositionConverter.java | 2 ++ .../python/console/RunPythonConsoleAction.java | 4 ++-- .../jetbrains/python/debugger/PyDebugProcess.java | 13 ++++--------- .../python/debugger/PyLocalPositionConverter.java | 5 +++++ .../remote/RemoteDebuggableProcessHandler.java | 12 ++++++++++++ .../python/run/PyRemoteProcessStarter.java | 4 ++-- 6 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 python/src/com/jetbrains/python/remote/RemoteDebuggableProcessHandler.java diff --git a/python/pydevSrc/com/jetbrains/python/debugger/PyPositionConverter.java b/python/pydevSrc/com/jetbrains/python/debugger/PyPositionConverter.java index 2b44f9d9ff99..8fcdc5664e0e 100644 --- a/python/pydevSrc/com/jetbrains/python/debugger/PyPositionConverter.java +++ b/python/pydevSrc/com/jetbrains/python/debugger/PyPositionConverter.java @@ -15,4 +15,6 @@ public interface PyPositionConverter { @Nullable XSourcePosition convertFromPython(@NotNull final PySourcePosition position); + + PySignature convertSignature(PySignature signature); } diff --git a/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java b/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java index 8475a98bcbe7..26125ae3f533 100644 --- a/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java +++ b/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java @@ -20,7 +20,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PathMappingSettings; import com.jetbrains.python.buildout.BuildoutFacet; -import com.jetbrains.python.remote.PyRemoteSdkAdditionalData; +import com.jetbrains.python.remote.PyRemoteSdkData; import com.jetbrains.python.remote.PythonRemoteInterpreterManager; import com.jetbrains.python.run.PythonCommandLineState; import com.jetbrains.python.sdk.PySdkUtil; @@ -138,7 +138,7 @@ public class RunPythonConsoleAction extends AnAction implements DumbAware { PythonRemoteInterpreterManager instance = PythonRemoteInterpreterManager.getInstance(); if (instance != null) { mappingSettings = - instance.setupMappings(project, (PyRemoteSdkAdditionalData)sdk.getSdkAdditionalData(), null); + instance.setupMappings(project, (PyRemoteSdkData)sdk.getSdkAdditionalData(), null); } } return mappingSettings; diff --git a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java index ac414246fa4e..d09b3269c80f 100644 --- a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java +++ b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java @@ -31,7 +31,7 @@ import com.jetbrains.django.util.DjangoUtil; import com.jetbrains.python.console.pydev.PydevCompletionVariant; import com.jetbrains.python.debugger.django.DjangoTemplateLineBreakpointType; import com.jetbrains.python.debugger.pydev.*; -import com.jetbrains.python.debugger.remote.vfs.PyRemotePositionConverter; +import com.jetbrains.python.remote.RemoteDebuggableProcessHandler; import com.jetbrains.python.run.PythonProcessHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -99,8 +99,8 @@ public class PyDebugProcess extends XDebugProcess implements IPyDebugProcess, Pr if (myProcessHandler != null) { myProcessHandler.addProcessListener(this); } - if (processHandler instanceof RemoteProcessHandlerBase) { - myPositionConverter = new PyRemotePositionConverter(this, ((RemoteProcessHandlerBase)processHandler).getMappingSettings()); + if (processHandler instanceof RemoteDebuggableProcessHandler) { + myPositionConverter = ((RemoteDebuggableProcessHandler) processHandler).createPositionConverter(this); } else { myPositionConverter = new PyLocalPositionConverter(); @@ -264,12 +264,7 @@ public class PyDebugProcess extends XDebugProcess implements IPyDebugProcess, Pr @Override public void recordSignature(PySignature signature) { - if (myPositionConverter instanceof PyRemotePositionConverter) { - String localPath = ((PyRemotePositionConverter)myPositionConverter).getPathMappingSettings().convertToLocal(signature.getFile()); - signature = new PySignature(localPath, signature.getFunctionName()).addAllArgs(signature); - } - - PySignatureCacheManager.getInstance(getSession().getProject()).recordSignature(signature); + PySignatureCacheManager.getInstance(getSession().getProject()).recordSignature(myPositionConverter.convertSignature(signature)); } protected void afterConnect() { diff --git a/python/src/com/jetbrains/python/debugger/PyLocalPositionConverter.java b/python/src/com/jetbrains/python/debugger/PyLocalPositionConverter.java index 509fdf25b20b..c725730de10f 100644 --- a/python/src/com/jetbrains/python/debugger/PyLocalPositionConverter.java +++ b/python/src/com/jetbrains/python/debugger/PyLocalPositionConverter.java @@ -89,6 +89,11 @@ public class PyLocalPositionConverter implements PyPositionConverter { return createXSourcePosition(getVirtualFile(position.getFile()), position.getLine()); } + @Override + public PySignature convertSignature(PySignature signature) { + return signature; + } + public VirtualFile getVirtualFile(String path) { VirtualFile vFile = getLocalFileSystem().findFileByPath(path); diff --git a/python/src/com/jetbrains/python/remote/RemoteDebuggableProcessHandler.java b/python/src/com/jetbrains/python/remote/RemoteDebuggableProcessHandler.java new file mode 100644 index 000000000000..57a89dd62db9 --- /dev/null +++ b/python/src/com/jetbrains/python/remote/RemoteDebuggableProcessHandler.java @@ -0,0 +1,12 @@ +package com.jetbrains.python.remote; + +import com.intellij.remotesdk.RemoteProcessHandlerBase; +import com.jetbrains.python.debugger.PyDebugProcess; +import com.jetbrains.python.debugger.PyPositionConverter; + +/** + * @author yole + */ +public interface RemoteDebuggableProcessHandler extends RemoteProcessHandlerBase { + PyPositionConverter createPositionConverter(PyDebugProcess debugProcess); +} diff --git a/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java b/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java index 3fd92bedd43c..ceccd1e5f79b 100644 --- a/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java +++ b/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java @@ -10,7 +10,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.Messages; import com.intellij.util.PathMappingSettings; -import com.jetbrains.python.remote.PyRemoteSdkAdditionalData; +import com.jetbrains.python.remote.PyRemoteSdkData; import com.jetbrains.python.remote.PythonRemoteInterpreterManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,7 +59,7 @@ public class PyRemoteProcessStarter { @Nullable PathMappingSettings settings) throws ExecutionException { - return manager.startRemoteProcess(project, (PyRemoteSdkAdditionalData)sdk.getSdkAdditionalData(), commandLine, + return manager.startRemoteProcess(project, (PyRemoteSdkData)sdk.getSdkAdditionalData(), commandLine, settings); } } From abe323d71154355bac81398634d70219ef4cb3d1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 17:32:31 +0200 Subject: [PATCH 15/26] decouple PythonSdkType from PyRemoteSdkAdditionalData --- .../python/remote/PythonRemoteInterpreterManager.java | 4 ++++ .../src/com/jetbrains/python/sdk/PythonSdkType.java | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java b/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java index 67efe23ba160..d7cd45e7ffd5 100644 --- a/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java +++ b/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java @@ -8,6 +8,7 @@ import com.intellij.execution.process.ProcessOutput; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.SdkAdditionalData; import com.intellij.openapi.projectRoots.SdkModificator; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -18,6 +19,7 @@ import com.intellij.util.NullableConsumer; import com.intellij.util.PathMappingSettings; import com.jetbrains.python.PythonHelpersLocator; import com.jetbrains.python.sdk.skeletons.PySkeletonGenerator; +import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -121,6 +123,8 @@ public abstract class PythonRemoteInterpreterManager { @NotNull PyRemoteSdkData data, @Nullable PathMappingSettings mappingSettings); + public abstract SdkAdditionalData loadRemoteSdkData(Sdk sdk, Element additional); + public static class PyRemoteInterpreterExecutionException extends ExecutionException { public PyRemoteInterpreterExecutionException() { diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index 60dca0173455..8f266af4d084 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -51,7 +51,7 @@ import com.jetbrains.python.facet.PythonFacetSettings; import com.jetbrains.python.psi.LanguageLevel; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.search.PyProjectScopeBuilder; -import com.jetbrains.python.remote.PyRemoteSdkAdditionalData; +import com.jetbrains.python.remote.PythonRemoteInterpreterManager; import com.jetbrains.python.sdk.flavors.CPythonSdkFlavor; import com.jetbrains.python.sdk.flavors.PythonSdkFlavor; import com.jetbrains.python.sdk.skeletons.PySkeletonRefresher; @@ -390,11 +390,12 @@ public class PythonSdkType extends SdkType { @Override public SdkAdditionalData loadAdditionalData(final Sdk currentSdk, final Element additional) { if (RemoteSdkDataHolder.isRemoteSdk(currentSdk.getHomePath())) { - return PyRemoteSdkAdditionalData.loadRemote(currentSdk, additional); - } - else { - return PythonSdkAdditionalData.load(currentSdk, additional); + PythonRemoteInterpreterManager manager = PythonRemoteInterpreterManager.getInstance(); + if (manager != null) { + return manager.loadRemoteSdkData(currentSdk, additional); + } } + return PythonSdkAdditionalData.load(currentSdk, additional); } private boolean switchPathToInterpreter(Sdk currentSdk, String... variants) { From 771dae3da810c9e02515ae0b5b499b48130b4e43 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 19:55:01 +0400 Subject: [PATCH 16/26] Added Cython lexer test --- python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java | 1 + 1 file changed, 1 insertion(+) diff --git a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java index d9cb855f6ac9..1cab27895f8a 100644 --- a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java +++ b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java @@ -25,6 +25,7 @@ public class PythonAllTestsSuite { public static final Class[] tests = { PythonLexerTest.class, PyStringLiteralLexerTest.class, + CythonLexerTest.class, PyStringFormatParserTest.class, PyEncodingTest.class, PythonParsingTest.class, From 8fec120fa48992a7712900b4067bc100c506e2e8 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 20:29:05 +0400 Subject: [PATCH 17/26] Get unbalanced braces recovery tokens via PythonDialectsTokenSetProvider --- .../PythonDialectsTokenSetContributor.java | 1 + .../python/PythonDialectsTokenSetProvider.java | 8 ++++++++ .../python/PythonTokenSetContributor.java | 6 ++++++ .../python/lexer/PythonIndentingProcessor.java | 10 ++-------- .../com/jetbrains/python/PythonParsingTest.java | 2 +- .../python/fixtures/PyLexerTestCase.java | 16 ++++++++++++++-- 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java b/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java index 5a7ef32790ba..ce5f560b56d9 100644 --- a/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java +++ b/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java @@ -15,4 +15,5 @@ public interface PythonDialectsTokenSetContributor { TokenSet getKeywordTokens(); TokenSet getParameterTokens(); TokenSet getFunctionDeclarationTokens(); + TokenSet getUnbalancedBracesRecoveryTokens(); } diff --git a/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java b/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java index 73375523ad99..469f6206a549 100644 --- a/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java +++ b/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java @@ -15,6 +15,7 @@ public class PythonDialectsTokenSetProvider { private final TokenSet myKeywordTokens; private final TokenSet myParameterTokens; private final TokenSet myFunctionDeclarationTokens; + private final TokenSet myUnbalancedBracesRecoveryTokens; private PythonDialectsTokenSetProvider() { TokenSet stmts = TokenSet.EMPTY; @@ -23,6 +24,7 @@ public class PythonDialectsTokenSetProvider { TokenSet keywords = TokenSet.EMPTY; TokenSet parameters = TokenSet.EMPTY; TokenSet functionDeclarations = TokenSet.EMPTY; + TokenSet recoveryTokens = TokenSet.EMPTY; for(PythonDialectsTokenSetContributor contributor: Extensions.getExtensions(PythonDialectsTokenSetContributor.EP_NAME)) { stmts = TokenSet.orSet(stmts, contributor.getStatementTokens()); exprs = TokenSet.orSet(exprs, contributor.getExpressionTokens()); @@ -30,6 +32,7 @@ public class PythonDialectsTokenSetProvider { keywords = TokenSet.orSet(keywords, contributor.getKeywordTokens()); parameters = TokenSet.orSet(parameters, contributor.getParameterTokens()); functionDeclarations = TokenSet.orSet(functionDeclarations, contributor.getFunctionDeclarationTokens()); + recoveryTokens = TokenSet.orSet(recoveryTokens, contributor.getUnbalancedBracesRecoveryTokens()); } myStatementTokens = stmts; myExpressionTokens = exprs; @@ -37,6 +40,7 @@ public class PythonDialectsTokenSetProvider { myKeywordTokens = keywords; myParameterTokens = parameters; myFunctionDeclarationTokens = functionDeclarations; + myUnbalancedBracesRecoveryTokens = recoveryTokens; } public TokenSet getStatementTokens() { @@ -62,4 +66,8 @@ public class PythonDialectsTokenSetProvider { public TokenSet getFunctionDeclarationTokens() { return myFunctionDeclarationTokens; } + + public TokenSet getUnbalancedBracesRecoveryTokens() { + return myUnbalancedBracesRecoveryTokens; + } } diff --git a/python/src/com/jetbrains/python/PythonTokenSetContributor.java b/python/src/com/jetbrains/python/PythonTokenSetContributor.java index 4e1165a77868..e47eec8bfa07 100644 --- a/python/src/com/jetbrains/python/PythonTokenSetContributor.java +++ b/python/src/com/jetbrains/python/PythonTokenSetContributor.java @@ -64,4 +64,10 @@ public class PythonTokenSetContributor implements PythonDialectsTokenSetContribu public TokenSet getFunctionDeclarationTokens() { return TokenSet.create(FUNCTION_DECLARATION); } + + @Override + public TokenSet getUnbalancedBracesRecoveryTokens() { + return TokenSet.create(DEF_KEYWORD, CLASS_KEYWORD, RETURN_KEYWORD, WITH_KEYWORD, WHILE_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, + RAISE_KEYWORD, TRY_KEYWORD, EXCEPT_KEYWORD, FINALLY_KEYWORD); + } } diff --git a/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java b/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java index 4ad93f840490..2cac358435f3 100644 --- a/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java +++ b/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java @@ -5,8 +5,8 @@ import com.intellij.lexer.FlexLexer; import com.intellij.lexer.MergingLexerAdapter; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; -import com.jetbrains.cython.parser.CythonTokenTypes; import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.PythonDialectsTokenSetProvider; import gnu.trove.TIntStack; import org.jetbrains.annotations.Nullable; @@ -21,13 +21,7 @@ public class PythonIndentingProcessor extends MergingLexerAdapter { private int myCurrentNewLineIndent = 0; private static final boolean DUMP_TOKENS = false; - private static final TokenSet RECOVERY_TOKENS = - TokenSet.create(PyTokenTypes.DEF_KEYWORD, PyTokenTypes.CLASS_KEYWORD, PyTokenTypes.RETURN_KEYWORD, PyTokenTypes.WITH_KEYWORD, - PyTokenTypes.WHILE_KEYWORD, PyTokenTypes.BREAK_KEYWORD, PyTokenTypes.CONTINUE_KEYWORD, PyTokenTypes.RAISE_KEYWORD, - PyTokenTypes.TRY_KEYWORD, PyTokenTypes.EXCEPT_KEYWORD, PyTokenTypes.FINALLY_KEYWORD, - // TODO: Cython dependency. Collect these tokens via the PythonDialectsTokenSetProvider (requires setting up the - // "Pythonid.dialectsTokenSetContributor" extension point in all the tests. - CythonTokenTypes.CDEF_KEYWORD, CythonTokenTypes.CPDEF_KEYWORD, CythonTokenTypes.CTYPEDEF_KEYWORD); + private final TokenSet RECOVERY_TOKENS = PythonDialectsTokenSetProvider.INSTANCE.getUnbalancedBracesRecoveryTokens(); public PythonIndentingProcessor(FlexLexer lexer, TokenSet tokens) { super(new FlexAdapter(lexer), tokens); diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java index 53687856cf7a..75da8f3d51c5 100644 --- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java @@ -16,12 +16,12 @@ public class PythonParsingTest extends ParsingTestCase { public PythonParsingTest() { super("psi", "py", new PythonParserDefinition()); - PyTestCase.initPlatformPrefix(); } @Override protected void setUp() throws Exception { super.setUp(); + PyTestCase.initPlatformPrefix(); registerExtensionPoint(PythonDialectsTokenSetContributor.EP_NAME, PythonDialectsTokenSetContributor.class); registerExtension(PythonDialectsTokenSetContributor.EP_NAME, new PythonTokenSetContributor()); registerExtension(PythonDialectsTokenSetContributor.EP_NAME, new CythonTokenSetContributor()); diff --git a/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java b/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java index 9e3a0f16e01d..40ddfaf84fc3 100644 --- a/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java +++ b/python/testSrc/com/jetbrains/python/fixtures/PyLexerTestCase.java @@ -1,12 +1,24 @@ package com.jetbrains.python.fixtures; import com.intellij.lexer.Lexer; -import junit.framework.TestCase; +import com.intellij.testFramework.PlatformLiteFixture; +import com.jetbrains.cython.CythonTokenSetContributor; +import com.jetbrains.python.PythonDialectsTokenSetContributor; +import com.jetbrains.python.PythonTokenSetContributor; /** * @author yole */ -public abstract class PyLexerTestCase extends TestCase { +public abstract class PyLexerTestCase extends PlatformLiteFixture { + @Override + protected void setUp() throws Exception { + super.setUp(); + PyTestCase.initPlatformPrefix(); + registerExtensionPoint(PythonDialectsTokenSetContributor.EP_NAME, PythonDialectsTokenSetContributor.class); + registerExtension(PythonDialectsTokenSetContributor.EP_NAME, new PythonTokenSetContributor()); + registerExtension(PythonDialectsTokenSetContributor.EP_NAME, new CythonTokenSetContributor()); + } + public static void doLexerTest(String text, Lexer lexer, String... expectedTokens) { lexer.start(text); int idx = 0; From 904d0f9c28c47830403f17dc23ab777824b484ec Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 20:42:48 +0400 Subject: [PATCH 18/26] Removed explicit references to REFERENCE_EXPRESSION --- .../python/console/parsing/PyConsoleParsingContext.java | 2 +- python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java | 2 +- .../jetbrains/python/psi/impl/PyFromImportStatementImpl.java | 3 +-- .../src/com/jetbrains/python/psi/impl/PyImportElementImpl.java | 2 +- .../python/psi/impl/stubs/PyTargetExpressionElementType.java | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java b/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java index bd2ffb22d7e4..ba6eaae70527 100644 --- a/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java +++ b/python/src/com/jetbrains/python/console/parsing/PyConsoleParsingContext.java @@ -138,7 +138,7 @@ public class PyConsoleParsingContext extends ParsingContext { if (myBuilder.getTokenType() == PyTokenTypes.IDENTIFIER) { myBuilder.advanceLexer(); - command.done(PyElementTypes.REFERENCE_EXPRESSION); + command.done(getReferenceType()); } else { expr.drop(); diff --git a/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java b/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java index 05bee8401122..cb48d7fba867 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java @@ -47,7 +47,7 @@ public class PyDecoratorImpl extends StubBasedPsiElementBase im } public boolean isBuiltin() { - ASTNode node = getNode().findChildByType(PyElementTypes.REFERENCE_EXPRESSION); + ASTNode node = getNode().findChildByType(PyElementTypes.REFERENCE_EXPRESSION_SET); if (node != null) { PyReferenceExpression ref = (PyReferenceExpression)node.getPsi(); PsiElement target = ref.getReference().resolve(); diff --git a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java index f887dece66af..6601f24d47b1 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java @@ -4,7 +4,6 @@ import com.intellij.lang.ASTNode; import com.intellij.psi.*; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.stubs.IStubElementType; -import com.intellij.psi.tree.TokenSet; import com.intellij.util.ArrayFactory; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyNames; @@ -50,7 +49,7 @@ public class PyFromImportStatementImpl extends PyBaseElementImpl @Nullable public PyReferenceExpression getImportReferenceExpression() { - final ASTNode node = getNode().findChildByType(PyElementTypes.REFERENCE_EXPRESSION); + final ASTNode node = getNode().findChildByType(PyElementTypes.REFERENCE_EXPRESSION_SET); return node == null ? null : (PyReferenceExpression) node.getPsi(); } diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java index 205211190414..6c61d3ffd357 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java @@ -118,7 +118,7 @@ public class PyTargetExpressionElementType extends PyStubElementType Date: Wed, 28 Aug 2013 17:49:06 +0200 Subject: [PATCH 19/26] rename PyConsoleOptionsProvider to PyConsoleOptions --- python/src/META-INF/python-plugin-common.xml | 2 +- ...nsoleOptionsProvider.java => PyConsoleOptions.java} | 8 ++++---- .../python/console/PyConsoleOptionsConfigurable.java | 10 +++++----- .../python/console/PyConsoleSpecificOptionsPanel.java | 6 +++--- .../jetbrains/python/console/PythonConsoleView.java | 2 +- .../python/console/PythonDebugLanguageConsoleView.java | 2 +- .../python/console/RunPythonConsoleAction.java | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) rename python/src/com/jetbrains/python/console/{PyConsoleOptionsProvider.java => PyConsoleOptions.java} (94%) diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index cccdce5c8079..7d68a887364b 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -455,7 +455,7 @@ - + diff --git a/python/src/com/jetbrains/python/console/PyConsoleOptionsProvider.java b/python/src/com/jetbrains/python/console/PyConsoleOptions.java similarity index 94% rename from python/src/com/jetbrains/python/console/PyConsoleOptionsProvider.java rename to python/src/com/jetbrains/python/console/PyConsoleOptions.java index 76d39e7410c5..20f7daf9318d 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleOptionsProvider.java +++ b/python/src/com/jetbrains/python/console/PyConsoleOptions.java @@ -21,13 +21,13 @@ import java.util.Map; @Storage(file = StoragePathMacros.WORKSPACE_FILE) } ) -public class PyConsoleOptionsProvider implements PersistentStateComponent { +public class PyConsoleOptions implements PersistentStateComponent { private State myState = new State(); @NotNull private final Project myProject; - public PyConsoleOptionsProvider(@NotNull Project project) { + public PyConsoleOptions(@NotNull Project project) { myProject = project; myState.setProject(project); } @@ -57,8 +57,8 @@ public class PyConsoleOptionsProvider implements PersistentStateComponent pythonPath = PythonCommandLineState.collectPythonPath(module, settingsProvider.addContentRoots(), settingsProvider.addSourceRoots()); @@ -148,7 +148,7 @@ public class RunPythonConsoleAction extends AnAction implements DumbAware { private static Pair findPythonSdkAndModule(Project project, Module contextModule) { Sdk sdk = null; Module module = null; - PyConsoleOptionsProvider.PyConsoleSettings settings = PyConsoleOptionsProvider.getInstance(project).getPythonConsoleSettings(); + PyConsoleOptions.PyConsoleSettings settings = PyConsoleOptions.getInstance(project).getPythonConsoleSettings(); String sdkHome = settings.getSdkHome(); if (sdkHome != null) { sdk = PythonSdkType.findSdkByPath(sdkHome); From 6a8555cf3becf8d6252322e24f775a5e8651f934 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 17:55:38 +0200 Subject: [PATCH 20/26] avoid unnecessary storage of project in PyConsoleSettings, pass it as parameter instead --- .../python/console/PyConsoleOptions.java | 24 ++----------------- .../console/PyConsoleOptionsConfigurable.java | 6 ++--- .../PyConsoleSpecificOptionsPanel.java | 24 +++++++++++-------- 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/python/src/com/jetbrains/python/console/PyConsoleOptions.java b/python/src/com/jetbrains/python/console/PyConsoleOptions.java index 20f7daf9318d..a9bcaa5013ef 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleOptions.java +++ b/python/src/com/jetbrains/python/console/PyConsoleOptions.java @@ -2,13 +2,10 @@ package com.jetbrains.python.console; import com.google.common.collect.Maps; import com.intellij.openapi.components.*; -import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.util.containers.ComparatorUtil; -import com.intellij.util.xmlb.annotations.Transient; import com.jetbrains.python.run.AbstractPyCommonOptionsForm; -import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -24,14 +21,6 @@ import java.util.Map; public class PyConsoleOptions implements PersistentStateComponent { private State myState = new State(); - @NotNull - private final Project myProject; - - public PyConsoleOptions(@NotNull Project project) { - myProject = project; - myState.setProject(project); - } - public PyConsoleSettings getPythonConsoleSettings() { return myState.myPythonConsoleState; } @@ -72,7 +61,6 @@ public class PyConsoleOptions implements PersistentStateComponent result = Lists.newArrayList(); - myPythonConsoleOptionsPanel = new PyConsoleSpecificOptionsPanel(); + myPythonConsoleOptionsPanel = new PyConsoleSpecificOptionsPanel(myProject); result.add(createConsoleChildConfigurable("Python Console", myPythonConsoleOptionsPanel, myOptionsProvider.getPythonConsoleSettings(), CONSOLE_SETTINGS_HELP_REFERENCE_PYTHON)); if (DjangoFacet.isPresentInAnyModule(myProject)) { - myDjangoConsoleOptionsPanel = new PyConsoleSpecificOptionsPanel(); + myDjangoConsoleOptionsPanel = new PyConsoleSpecificOptionsPanel(myProject); result.add(createConsoleChildConfigurable("Django Console", myDjangoConsoleOptionsPanel, myOptionsProvider.getDjangoConsoleSettings(), CONSOLE_SETTINGS_HELP_REFERENCE_DJANGO)); @@ -93,7 +93,7 @@ public class PyConsoleOptionsConfigurable extends SearchableConfigurable.Parent. @Override public JComponent createComponent() { - return panel.createPanel(myProject, settings); + return panel.createPanel(settings); } @Override diff --git a/python/src/com/jetbrains/python/console/PyConsoleSpecificOptionsPanel.java b/python/src/com/jetbrains/python/console/PyConsoleSpecificOptionsPanel.java index b4104173470e..091c9509bf41 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleSpecificOptionsPanel.java +++ b/python/src/com/jetbrains/python/console/PyConsoleSpecificOptionsPanel.java @@ -7,7 +7,6 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.ui.EditorTextField; import com.intellij.util.ui.UIUtil; -import com.intellij.xml.actions.xmlbeans.UIUtils; import com.jetbrains.python.PythonFileType; import com.jetbrains.python.psi.impl.PyExpressionCodeFragmentImpl; import com.jetbrains.python.run.AbstractPyCommonOptionsForm; @@ -24,6 +23,7 @@ import java.util.List; * @author traff */ public class PyConsoleSpecificOptionsPanel { + private final Project myProject; private JPanel myWholePanel; private JPanel myStartingScriptPanel; private JPanel myInterpreterPanel; @@ -31,15 +31,19 @@ public class PyConsoleSpecificOptionsPanel { private EditorTextField myEditorTextField; private AbstractPyCommonOptionsForm myCommonOptionsForm; - public JPanel createPanel(final Project project, final PyConsoleOptions.PyConsoleSettings optionsProvider) { + public PyConsoleSpecificOptionsPanel(Project project) { + myProject = project; + } + + public JPanel createPanel(final PyConsoleOptions.PyConsoleSettings optionsProvider) { myInterpreterPanel.setLayout(new BorderLayout()); - myCommonOptionsForm = PyCommonOptionsFormFactory.getInstance().createForm(createCommonOptionsFormData(project)); + myCommonOptionsForm = PyCommonOptionsFormFactory.getInstance().createForm(createCommonOptionsFormData()); myCommonOptionsForm.subscribe(); myInterpreterPanel.add(myCommonOptionsForm.getMainPanel(), BorderLayout.CENTER); - configureStartingScriptPanel(project, optionsProvider); + configureStartingScriptPanel(optionsProvider); return myWholePanel; } @@ -61,19 +65,19 @@ public class PyConsoleSpecificOptionsPanel { } }); - myConsoleSettings.reset(myCommonOptionsForm); + myConsoleSettings.reset(myProject, myCommonOptionsForm); } - private static PyCommonOptionsFormData createCommonOptionsFormData(final Project project) { + private PyCommonOptionsFormData createCommonOptionsFormData() { return new PyCommonOptionsFormData() { @Override public Project getProject() { - return project; + return myProject; } @Override public List getValidModules() { - return AbstractPythonRunConfiguration.getValidModules(project); + return AbstractPythonRunConfiguration.getValidModules(myProject); } @Override @@ -83,9 +87,9 @@ public class PyConsoleSpecificOptionsPanel { }; } - private void configureStartingScriptPanel(final Project project, final PyConsoleOptions.PyConsoleSettings optionsProvider) { + private void configureStartingScriptPanel(final PyConsoleOptions.PyConsoleSettings optionsProvider) { myEditorTextField = - new EditorTextField(createDocument(project, optionsProvider.myCustomStartScript), project, PythonFileType.INSTANCE) { + new EditorTextField(createDocument(myProject, optionsProvider.myCustomStartScript), myProject, PythonFileType.INSTANCE) { @Override protected EditorEx createEditor() { final EditorEx editor = super.createEditor(); From 2b2726775719991d2596d3ce94a3dd86674f49bb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 18:34:52 +0200 Subject: [PATCH 21/26] extract Django console settings to a separate service --- python/src/META-INF/python-plugin-common.xml | 1 + .../src/com/jetbrains/python/console/PyConsoleOptions.java | 6 ------ .../python/console/PyConsoleOptionsConfigurable.java | 3 ++- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index 7d68a887364b..5603166ade69 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -685,6 +685,7 @@ + diff --git a/python/src/com/jetbrains/python/console/PyConsoleOptions.java b/python/src/com/jetbrains/python/console/PyConsoleOptions.java index a9bcaa5013ef..187877daae84 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleOptions.java +++ b/python/src/com/jetbrains/python/console/PyConsoleOptions.java @@ -25,10 +25,6 @@ public class PyConsoleOptions implements PersistentStateComponent Date: Wed, 28 Aug 2013 18:46:28 +0200 Subject: [PATCH 22/26] extension point for adding options of extra consoles --- python/src/META-INF/python-plugin-common.xml | 4 ++- .../console/PyConsoleOptionsConfigurable.java | 33 +++++++++---------- .../console/PyConsoleOptionsProvider.java | 16 +++++++++ 3 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 python/src/com/jetbrains/python/console/PyConsoleOptionsProvider.java diff --git a/python/src/META-INF/python-plugin-common.xml b/python/src/META-INF/python-plugin-common.xml index 5603166ade69..d03695a6adba 100644 --- a/python/src/META-INF/python-plugin-common.xml +++ b/python/src/META-INF/python-plugin-common.xml @@ -912,6 +912,7 @@ + @@ -946,7 +947,7 @@ - + @@ -954,6 +955,7 @@ + diff --git a/python/src/com/jetbrains/python/console/PyConsoleOptionsConfigurable.java b/python/src/com/jetbrains/python/console/PyConsoleOptionsConfigurable.java index 78749619b048..7ca7bf245c7d 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleOptionsConfigurable.java +++ b/python/src/com/jetbrains/python/console/PyConsoleOptionsConfigurable.java @@ -1,13 +1,12 @@ package com.jetbrains.python.console; import com.google.common.collect.Lists; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.ui.components.JBCheckBox; -import com.jetbrains.django.console.DjangoConsoleOptions; -import com.jetbrains.django.facet.DjangoFacet; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -20,12 +19,9 @@ import java.util.List; public class PyConsoleOptionsConfigurable extends SearchableConfigurable.Parent.Abstract implements Configurable.NoScroll{ public static final String CONSOLE_SETTINGS_HELP_REFERENCE = "reference.project.settings.console"; public static final String CONSOLE_SETTINGS_HELP_REFERENCE_PYTHON = "reference.project.settings.console.python"; - public static final String CONSOLE_SETTINGS_HELP_REFERENCE_DJANGO = "reference.project.settings.console.django"; private PyConsoleOptionsPanel myPanel; - private PyConsoleSpecificOptionsPanel myPythonConsoleOptionsPanel; - private PyConsoleSpecificOptionsPanel myDjangoConsoleOptionsPanel; private final PyConsoleOptions myOptionsProvider; private Project myProject; @@ -50,24 +46,25 @@ public class PyConsoleOptionsConfigurable extends SearchableConfigurable.Parent. protected Configurable[] buildConfigurables() { List result = Lists.newArrayList(); - myPythonConsoleOptionsPanel = new PyConsoleSpecificOptionsPanel(myProject); - result.add(createConsoleChildConfigurable("Python Console", myPythonConsoleOptionsPanel, + PyConsoleSpecificOptionsPanel pythonConsoleOptionsPanel = new PyConsoleSpecificOptionsPanel(myProject); + result.add(createConsoleChildConfigurable("Python Console", pythonConsoleOptionsPanel, myOptionsProvider.getPythonConsoleSettings(), CONSOLE_SETTINGS_HELP_REFERENCE_PYTHON)); - if (DjangoFacet.isPresentInAnyModule(myProject)) { - myDjangoConsoleOptionsPanel = new PyConsoleSpecificOptionsPanel(myProject); - result.add(createConsoleChildConfigurable("Django Console", - myDjangoConsoleOptionsPanel, DjangoConsoleOptions.getInstance(myProject).getState(), - CONSOLE_SETTINGS_HELP_REFERENCE_DJANGO)); + for (PyConsoleOptionsProvider provider : Extensions.getExtensions(PyConsoleOptionsProvider.EP_NAME)) { + if (provider.isApplicableTo(myProject)) { + result.add(createConsoleChildConfigurable(provider.getName(), + new PyConsoleSpecificOptionsPanel(myProject), + provider.getSettings(myProject), + provider.getHelpTopic())); + } } - return result.toArray(new Configurable[result.size()]); } - private Configurable createConsoleChildConfigurable(final String name, - final PyConsoleSpecificOptionsPanel panel, - final PyConsoleOptions.PyConsoleSettings settings, final String helpReference) { + private static Configurable createConsoleChildConfigurable(final String name, + final PyConsoleSpecificOptionsPanel panel, + final PyConsoleOptions.PyConsoleSettings settings, final String helpReference) { return new SearchableConfigurable() { @NotNull @@ -133,7 +130,7 @@ public class PyConsoleOptionsConfigurable extends SearchableConfigurable.Parent. public JComponent createComponent() { myPanel = new PyConsoleOptionsPanel(); - return myPanel.createPanel(myProject, myOptionsProvider); + return myPanel.createPanel(myOptionsProvider); } @Override @@ -163,7 +160,7 @@ public class PyConsoleOptionsConfigurable extends SearchableConfigurable.Parent. private JBCheckBox myShowSeparatorLine; private PyConsoleOptions myOptionsProvider; - public JPanel createPanel(Project project, PyConsoleOptions optionsProvider) { + public JPanel createPanel(PyConsoleOptions optionsProvider) { myOptionsProvider = optionsProvider; return myWholePanel; diff --git a/python/src/com/jetbrains/python/console/PyConsoleOptionsProvider.java b/python/src/com/jetbrains/python/console/PyConsoleOptionsProvider.java new file mode 100644 index 000000000000..e5ea65bc630d --- /dev/null +++ b/python/src/com/jetbrains/python/console/PyConsoleOptionsProvider.java @@ -0,0 +1,16 @@ +package com.jetbrains.python.console; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.project.Project; + +/** + * @author yole + */ +public interface PyConsoleOptionsProvider { + ExtensionPointName EP_NAME = ExtensionPointName.create("Pythonid.consoleOptionsProvider"); + + boolean isApplicableTo(Project project); + String getName(); + String getHelpTopic(); + PyConsoleOptions.PyConsoleSettings getSettings(Project project); +} From cdd33e8cfcfb1704e8f5135eefadd8fb41d3627f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 18:53:37 +0200 Subject: [PATCH 23/26] decouple PyDebugProcess.runToCursor() from DjangoTemplateLineBreakpointType --- .../jetbrains/python/debugger/PyBreakpointType.java | 11 +++++++++++ .../com/jetbrains/python/debugger/PyDebugProcess.java | 11 +++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 python/src/com/jetbrains/python/debugger/PyBreakpointType.java diff --git a/python/src/com/jetbrains/python/debugger/PyBreakpointType.java b/python/src/com/jetbrains/python/debugger/PyBreakpointType.java new file mode 100644 index 000000000000..abe67e979561 --- /dev/null +++ b/python/src/com/jetbrains/python/debugger/PyBreakpointType.java @@ -0,0 +1,11 @@ +package com.jetbrains.python.debugger; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.Project; + +/** + * @author yole + */ +public interface PyBreakpointType { + boolean canPutInDocument(Project project, Document document); +} diff --git a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java index d09b3269c80f..5b1b08ed9780 100644 --- a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java +++ b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java @@ -23,13 +23,12 @@ import com.intellij.remotesdk.RemoteProcessHandlerBase; import com.intellij.xdebugger.*; import com.intellij.xdebugger.breakpoints.XBreakpoint; import com.intellij.xdebugger.breakpoints.XBreakpointHandler; +import com.intellij.xdebugger.breakpoints.XBreakpointType; import com.intellij.xdebugger.breakpoints.XLineBreakpoint; import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider; import com.intellij.xdebugger.frame.XValueChildrenList; import com.intellij.xdebugger.stepping.XSmartStepIntoHandler; -import com.jetbrains.django.util.DjangoUtil; import com.jetbrains.python.console.pydev.PydevCompletionVariant; -import com.jetbrains.python.debugger.django.DjangoTemplateLineBreakpointType; import com.jetbrains.python.debugger.pydev.*; import com.jetbrains.python.remote.RemoteDebuggableProcessHandler; import com.jetbrains.python.run.PythonProcessHandler; @@ -420,8 +419,12 @@ public class PyDebugProcess extends XDebugProcess implements IPyDebugProcess, Pr String type = PyLineBreakpointType.ID; final Document document = FileDocumentManager.getInstance().getDocument(position.getFile()); if (document != null) { - if (DjangoUtil.isDjangoTemplateDocument(document, getSession().getProject())) { - type = DjangoTemplateLineBreakpointType.ID; + for (XBreakpointType breakpointType : Extensions.getExtensions(XBreakpointType.EXTENSION_POINT_NAME)) { + if (breakpointType instanceof PyBreakpointType && + ((PyBreakpointType)breakpointType).canPutInDocument(getSession().getProject(), document)) { + type = breakpointType.getId(); + break; + } } } myDebugger.setTempBreakpoint(type, pyPosition.getFile(), pyPosition.getLine()); From 029c0b429e99fe36627f7b6aa17c49f7db80a7d6 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Aug 2013 19:05:39 +0200 Subject: [PATCH 24/26] include community/src in python plugin build; increment version --- python/build/python_plugin_build.gant | 1 + python/pluginSrc/META-INF/plugin.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/python/build/python_plugin_build.gant b/python/build/python_plugin_build.gant index 82b2ce53c9be..06162c41ff86 100644 --- a/python/build/python_plugin_build.gant +++ b/python/build/python_plugin_build.gant @@ -277,6 +277,7 @@ target(name: "compile", description: "Compile module python") { include(name: "pydevSrc") include(name: "openapi/src") include(name: "psi-api/src") + include(name: "community/src") include(name: "pluginResources") } connectorPlugins.each { diff --git a/python/pluginSrc/META-INF/plugin.xml b/python/pluginSrc/META-INF/plugin.xml index 9cb63c8f57a3..0574cfa1e1e9 100644 --- a/python/pluginSrc/META-INF/plugin.xml +++ b/python/pluginSrc/META-INF/plugin.xml @@ -6,7 +6,7 @@ Python Smart editing for Python scripts - 2.11 + 2.11.1 com.intellij.modules.ultimate com.intellij.modules.java Coverage From 8fdfa4c10452cbf0e72d51d85c44fc9c95b26fc0 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 28 Aug 2013 21:52:01 +0400 Subject: [PATCH 25/26] Extracted CythonReferenceExpression with its own getReference() --- .../python/PythonDialectsTokenSetContributor.java | 1 + .../src/com/jetbrains/python/PyElementTypes.java | 2 -- .../python/PythonDialectsTokenSetProvider.java | 8 ++++++++ .../python/PythonTokenSetContributor.java | 5 +++++ .../python/psi/impl/PyDecoratorImpl.java | 3 ++- .../psi/impl/PyFromImportStatementImpl.java | 3 ++- .../python/psi/impl/PyImportElementImpl.java | 3 ++- .../psi/impl/PyReferenceExpressionImpl.java | 15 --------------- .../impl/stubs/PyTargetExpressionElementType.java | 3 ++- 9 files changed, 22 insertions(+), 21 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java b/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java index ce5f560b56d9..798ec70e421f 100644 --- a/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java +++ b/python/psi-api/src/com/jetbrains/python/PythonDialectsTokenSetContributor.java @@ -16,4 +16,5 @@ public interface PythonDialectsTokenSetContributor { TokenSet getParameterTokens(); TokenSet getFunctionDeclarationTokens(); TokenSet getUnbalancedBracesRecoveryTokens(); + TokenSet getReferenceExpressionTokens(); } diff --git a/python/src/com/jetbrains/python/PyElementTypes.java b/python/src/com/jetbrains/python/PyElementTypes.java index a76d47d1184e..7b58d74ac685 100644 --- a/python/src/com/jetbrains/python/PyElementTypes.java +++ b/python/src/com/jetbrains/python/PyElementTypes.java @@ -72,8 +72,6 @@ public interface PyElementTypes { PyElementType EMPTY_EXPRESSION = new PyElementType("EMPTY_EXPRESSION", PyEmptyExpressionImpl.class); PyElementType REFERENCE_EXPRESSION = new PyElementType("REFERENCE_EXPRESSION", PyReferenceExpressionImpl.class); - TokenSet REFERENCE_EXPRESSION_SET = TokenSet.create(REFERENCE_EXPRESSION); - PyStubElementType TARGET_EXPRESSION = new PyTargetExpressionElementType(); PyElementType INTEGER_LITERAL_EXPRESSION = new PyElementType("INTEGER_LITERAL_EXPRESSION", PyNumericLiteralExpressionImpl.class); PyElementType FLOAT_LITERAL_EXPRESSION = new PyElementType("FLOAT_LITERAL_EXPRESSION", PyNumericLiteralExpressionImpl.class); diff --git a/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java b/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java index 469f6206a549..1e0da69a7807 100644 --- a/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java +++ b/python/src/com/jetbrains/python/PythonDialectsTokenSetProvider.java @@ -16,6 +16,7 @@ public class PythonDialectsTokenSetProvider { private final TokenSet myParameterTokens; private final TokenSet myFunctionDeclarationTokens; private final TokenSet myUnbalancedBracesRecoveryTokens; + private final TokenSet myReferenceExpressionTokens; private PythonDialectsTokenSetProvider() { TokenSet stmts = TokenSet.EMPTY; @@ -25,6 +26,7 @@ public class PythonDialectsTokenSetProvider { TokenSet parameters = TokenSet.EMPTY; TokenSet functionDeclarations = TokenSet.EMPTY; TokenSet recoveryTokens = TokenSet.EMPTY; + TokenSet referenceExpressions = TokenSet.EMPTY; for(PythonDialectsTokenSetContributor contributor: Extensions.getExtensions(PythonDialectsTokenSetContributor.EP_NAME)) { stmts = TokenSet.orSet(stmts, contributor.getStatementTokens()); exprs = TokenSet.orSet(exprs, contributor.getExpressionTokens()); @@ -33,6 +35,7 @@ public class PythonDialectsTokenSetProvider { parameters = TokenSet.orSet(parameters, contributor.getParameterTokens()); functionDeclarations = TokenSet.orSet(functionDeclarations, contributor.getFunctionDeclarationTokens()); recoveryTokens = TokenSet.orSet(recoveryTokens, contributor.getUnbalancedBracesRecoveryTokens()); + referenceExpressions = TokenSet.orSet(referenceExpressions, contributor.getReferenceExpressionTokens()); } myStatementTokens = stmts; myExpressionTokens = exprs; @@ -41,6 +44,7 @@ public class PythonDialectsTokenSetProvider { myParameterTokens = parameters; myFunctionDeclarationTokens = functionDeclarations; myUnbalancedBracesRecoveryTokens = recoveryTokens; + myReferenceExpressionTokens = referenceExpressions; } public TokenSet getStatementTokens() { @@ -70,4 +74,8 @@ public class PythonDialectsTokenSetProvider { public TokenSet getUnbalancedBracesRecoveryTokens() { return myUnbalancedBracesRecoveryTokens; } + + public TokenSet getReferenceExpressionTokens() { + return myReferenceExpressionTokens; + } } diff --git a/python/src/com/jetbrains/python/PythonTokenSetContributor.java b/python/src/com/jetbrains/python/PythonTokenSetContributor.java index e47eec8bfa07..878043dcb078 100644 --- a/python/src/com/jetbrains/python/PythonTokenSetContributor.java +++ b/python/src/com/jetbrains/python/PythonTokenSetContributor.java @@ -70,4 +70,9 @@ public class PythonTokenSetContributor implements PythonDialectsTokenSetContribu return TokenSet.create(DEF_KEYWORD, CLASS_KEYWORD, RETURN_KEYWORD, WITH_KEYWORD, WHILE_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, RAISE_KEYWORD, TRY_KEYWORD, EXCEPT_KEYWORD, FINALLY_KEYWORD); } + + @Override + public TokenSet getReferenceExpressionTokens() { + return TokenSet.create(REFERENCE_EXPRESSION); + } } diff --git a/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java b/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java index cb48d7fba867..efa10ccd8128 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java @@ -7,6 +7,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.PythonDialectsTokenSetProvider; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.resolve.PyResolveContext; import com.jetbrains.python.psi.resolve.PyResolveUtil; @@ -47,7 +48,7 @@ public class PyDecoratorImpl extends StubBasedPsiElementBase im } public boolean isBuiltin() { - ASTNode node = getNode().findChildByType(PyElementTypes.REFERENCE_EXPRESSION_SET); + ASTNode node = getNode().findChildByType(PythonDialectsTokenSetProvider.INSTANCE.getReferenceExpressionTokens()); if (node != null) { PyReferenceExpression ref = (PyReferenceExpression)node.getPsi(); PsiElement target = ref.getReference().resolve(); diff --git a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java index 6601f24d47b1..b43511d0d442 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java @@ -8,6 +8,7 @@ import com.intellij.util.ArrayFactory; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.PythonDialectsTokenSetProvider; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.stubs.PyFromImportStatementStub; @@ -49,7 +50,7 @@ public class PyFromImportStatementImpl extends PyBaseElementImpl @Nullable public PyReferenceExpression getImportReferenceExpression() { - final ASTNode node = getNode().findChildByType(PyElementTypes.REFERENCE_EXPRESSION_SET); + final ASTNode node = getNode().findChildByType(PythonDialectsTokenSetProvider.INSTANCE.getReferenceExpressionTokens()); return node == null ? null : (PyReferenceExpression) node.getPsi(); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index 3e702bf69ef5..63e2e1902feb 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -6,11 +6,6 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; -import com.jetbrains.cython.CythonLanguageDialect; -import com.jetbrains.cython.psi.CythonCImportElement; -import com.jetbrains.cython.psi.CythonFromCImportStatement; -import com.jetbrains.cython.psi.CythonImportReference; -import com.jetbrains.cython.psi.CythonReference; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.PythonDialectsTokenSetProvider; @@ -56,12 +51,6 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere final PyExpression qualifier = getQualifier(); // Handle import reference - final boolean inCythonFile = CythonLanguageDialect.isInsideCythonFile(this); - if (inCythonFile) { - if (PsiTreeUtil.getParentOfType(this, CythonCImportElement.class, CythonFromCImportStatement.class) != null) { - return new CythonImportReference(this, context); - } - } final PsiElement importParent = PsiTreeUtil.getParentOfType(this, PyImportElement.class, PyFromImportStatement.class); if (importParent != null) { return PyImportReference.forElement(this, importParent, context); @@ -80,10 +69,6 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere return new PyQualifiedReference(this, context); } - if (inCythonFile) { - return new CythonReference(this, context); - } - return new PyReferenceImpl(this, context); } diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java index 6c61d3ffd357..4f004f594be9 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java @@ -12,6 +12,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.io.StringRef; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyNames; +import com.jetbrains.python.PythonDialectsTokenSetProvider; import com.jetbrains.python.documentation.DocStringUtil; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyQualifiedName; @@ -118,7 +119,7 @@ public class PyTargetExpressionElementType extends PyStubElementType Date: Thu, 29 Aug 2013 10:24:31 +0200 Subject: [PATCH 26/26] include resoures from community/src into plugin build (PY-10695) --- python/build/python_plugin_build.gant | 4 ++++ python/pluginSrc/META-INF/plugin.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/python/build/python_plugin_build.gant b/python/build/python_plugin_build.gant index 06162c41ff86..d7bee89e7ca8 100644 --- a/python/build/python_plugin_build.gant +++ b/python/build/python_plugin_build.gant @@ -329,6 +329,10 @@ target(name: "compile", description: "Compile module python") { patternset(refid: "resources.pt") type(type: "file") } + fileset(dir: "${pluginHome}/community/src") { + patternset(refid: "resources.pt") + type(type: "file") + } connectorPlugins.each { fileset(dir: "${pluginHome}/${it}/resources") { patternset(refid: "resources.pt") diff --git a/python/pluginSrc/META-INF/plugin.xml b/python/pluginSrc/META-INF/plugin.xml index 0574cfa1e1e9..9b613f34176d 100644 --- a/python/pluginSrc/META-INF/plugin.xml +++ b/python/pluginSrc/META-INF/plugin.xml @@ -6,7 +6,7 @@ Python Smart editing for Python scripts - 2.11.1 + 2.11.2 com.intellij.modules.ultimate com.intellij.modules.java Coverage