From 02b1dc2759e3ace619da5640cd0b55bc1bf726a8 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Thu, 30 Aug 2012 14:40:17 +0400 Subject: [PATCH 1/8] fixed PY-7355 Specify type using annotation: quick-fix is not available for top-level statements --- .../SpecifyTypeInPy3AnnotationsIntention.java | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java index 69ff9506e981..e3ab71f0b1c8 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/SpecifyTypeInPy3AnnotationsIntention.java @@ -63,36 +63,33 @@ public class SpecifyTypeInPy3AnnotationsIntention implements IntentionAction { } final PyType type = problemElement.getType(TypeEvalContext.slow()); if (type == null || type instanceof PyReturnTypeReference) { - PyFunction pyFunction = PsiTreeUtil.getParentOfType(problemElement, PyFunction.class); PsiReference reference = problemElement.getReference(); if (problemElement instanceof PyQualifiedExpression) { final PyExpression qualifier = ((PyQualifiedExpression)problemElement).getQualifier(); if (qualifier != null && !qualifier.getText().equals(PyNames.CANONICAL_SELF)) reference = qualifier.getReference(); } - if (pyFunction != null) { - PyParameter parameter = null; - final PsiElement resolvedReference = reference != null?reference.resolve() : null; - if (problemElement instanceof PyParameter) - parameter = (PyParameter)problemElement; - else if (resolvedReference instanceof PyParameter) - parameter = (PyParameter)resolvedReference; - if (parameter instanceof PyNamedParameter && (((PyNamedParameter)parameter).getAnnotation() != null || - parameter.getDefaultValue() != null)) return false; - if (parameter != null) - return true; - else { - if (resolvedReference instanceof PyTargetExpression) { - final PyExpression assignedValue = ((PyTargetExpression)resolvedReference).findAssignedValue(); - if (assignedValue instanceof PyCallExpression) { - final PyExpression callee = ((PyCallExpression)assignedValue).getCallee(); - if (callee != null) { - final PsiReference psiReference = callee.getReference(); - if (psiReference != null && psiReference.resolve() == null) return false; - } - final Callable callable = ((PyCallExpression)assignedValue).resolveCalleeFunction(PyResolveContext.defaultContext()); - - if (callable instanceof PyFunction && ((PyFunction)callable).getAnnotation() == null) return true; + PyParameter parameter = null; + final PsiElement resolvedReference = reference != null?reference.resolve() : null; + if (problemElement instanceof PyParameter) + parameter = (PyParameter)problemElement; + else if (resolvedReference instanceof PyParameter) + parameter = (PyParameter)resolvedReference; + if (parameter instanceof PyNamedParameter && (((PyNamedParameter)parameter).getAnnotation() != null || + parameter.getDefaultValue() != null)) return false; + if (parameter != null) + return true; + else { + if (resolvedReference instanceof PyTargetExpression) { + final PyExpression assignedValue = ((PyTargetExpression)resolvedReference).findAssignedValue(); + if (assignedValue instanceof PyCallExpression) { + final PyExpression callee = ((PyCallExpression)assignedValue).getCallee(); + if (callee != null) { + final PsiReference psiReference = callee.getReference(); + if (psiReference != null && psiReference.resolve() == null) return false; } + final Callable callable = ((PyCallExpression)assignedValue).resolveCalleeFunction(PyResolveContext.defaultContext()); + + if (callable instanceof PyFunction && ((PyFunction)callable).getAnnotation() == null) return true; } } } From e392e3ba568843a5318b11637a1d2f26b4b205b3 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 30 Aug 2012 15:45:48 +0400 Subject: [PATCH 2/8] Fixed path for Python 3.3 interpreter installed via official installer on Mac OS X (PY-7336) --- .../jetbrains/python/sdk/MacPythonSdkFlavor.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/python/src/com/jetbrains/python/sdk/MacPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/MacPythonSdkFlavor.java index 416b22fef9cd..c233efd531ae 100644 --- a/python/src/com/jetbrains/python/sdk/MacPythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/MacPythonSdkFlavor.java @@ -16,6 +16,7 @@ public class MacPythonSdkFlavor extends CPythonSdkFlavor { } public static MacPythonSdkFlavor INSTANCE = new MacPythonSdkFlavor(); + private static final String[] POSSIBLE_BINARY_NAMES = {"python", "python2", "python3"}; @Override public Collection suggestHomePaths() { @@ -36,10 +37,15 @@ public class MacPythonSdkFlavor extends CPythonSdkFlavor { final String dir_name = dir.getName().toLowerCase(); if (dir.isDirectory()) { if ("Current".equals(dir_name) || dir_name.startsWith("2") || dir_name.startsWith("3")) { - VirtualFile bin_dir = dir.findChild("bin"); - if (bin_dir != null && bin_dir.isDirectory()) { - VirtualFile python_exe = bin_dir.findChild("python"); - if (python_exe != null) candidates.add(python_exe.getPath()); + final VirtualFile binDir = dir.findChild("bin"); + if (binDir != null && binDir.isDirectory()) { + for (String name : POSSIBLE_BINARY_NAMES) { + final VirtualFile child = binDir.findChild(name); + if (child != null) { + candidates.add(child.getPath()); + break; + } + } } } } From 5e314dbb48eee166a89894527dee2ce6ba797deb Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 30 Aug 2012 16:15:13 +0400 Subject: [PATCH 3/8] Added runWithLanguageLevel() for Python testes --- .../com/jetbrains/python/fixtures/PyTestCase.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java b/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java index f1142c26a00d..6697b0775462 100644 --- a/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java +++ b/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java @@ -27,6 +27,7 @@ import com.jetbrains.python.psi.LanguageLevel; import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.impl.PyFileImpl; import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -89,6 +90,16 @@ public abstract class PyTestCase extends UsefulTestCase { PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), languageLevel); } + protected void runWithLanguageLevel(@NotNull LanguageLevel languageLevel, @NotNull Runnable action) { + setLanguageLevel(languageLevel); + try { + action.run(); + } + finally { + setLanguageLevel(null); + } + } + protected static void assertNotParsed(PyFile file) { assertNull(PARSED_ERROR_MSG, ((PyFileImpl)file).getTreeElement()); } From 81672ebe207ec0d72711bfe912219c3bf75b6eb4 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 30 Aug 2012 16:58:53 +0400 Subject: [PATCH 4/8] Fixed unresolved __qualname__ for instances and functions in Python 3.3 (PY-6745) --- .../inspections/PyUnresolvedReferencesInspection.java | 5 +++++ .../qualNameAttribute.py | 10 ++++++++++ .../PyUnresolvedReferencesInspectionTest.java | 11 +++++++++++ 3 files changed, 26 insertions(+) create mode 100644 python/testData/inspections/PyUnresolvedReferencesInspection/qualNameAttribute.py diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 03dab57430dc..35f927ce0e4a 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -449,6 +449,11 @@ public class PyUnresolvedReferencesInspection extends PyInspection { if (description == null) { boolean marked_qualified = false; if (element instanceof PyQualifiedExpression) { + // TODO: Add __qualname__ for Python 3.3 to the skeleton of , introduce a pseudo-class skeleton for + // + if ("__qualname__".equals(ref_text) && LanguageLevel.forElement(element).isAtLeast(LanguageLevel.PYTHON33)) { + return; + } final PyQualifiedExpression qexpr = (PyQualifiedExpression)element; if (PyNames.COMPARISON_OPERATORS.contains(qexpr.getReferencedName()) || refname == null) { return; diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/qualNameAttribute.py b/python/testData/inspections/PyUnresolvedReferencesInspection/qualNameAttribute.py new file mode 100644 index 000000000000..f1bb4a6e0d01 --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/qualNameAttribute.py @@ -0,0 +1,10 @@ +class C: + pass + +def f(x): + x.__qualname__ #pass + +C.__qualname__ #pass +c = C() +c.__qualname__ #pass +f.__qualname__ #pass diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java index a5bbed89e7b9..71642e4d361f 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java @@ -1,6 +1,7 @@ package com.jetbrains.python.inspections; import com.jetbrains.python.fixtures.PyTestCase; +import com.jetbrains.python.psi.LanguageLevel; import org.jetbrains.annotations.NotNull; /** @@ -190,6 +191,16 @@ public class PyUnresolvedReferencesInspectionTest extends PyTestCase { doTest(); } + // PY-6745 + public void testQualNameAttribute() { + runWithLanguageLevel(LanguageLevel.PYTHON33, new Runnable() { + @Override + public void run() { + doTest(); + } + }); + } + private void doTest() { myFixture.configureByFile(TEST_DIRECTORY + getTestName(true) + ".py"); myFixture.enableInspections(PyUnresolvedReferencesInspection.class); From 93d0b8058b45be6c776f320c703fb741b5fb6106 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Thu, 30 Aug 2012 17:30:21 +0400 Subject: [PATCH 5/8] fixed PY-7319 "Join lines" does not remove trailing backslash correctly --- .../python/editor/PyJoinLinesHandler.java | 46 ++++++++++++++----- .../joinLines/LongExpression-after.py | 1 + python/testData/joinLines/LongExpression.py | 2 + .../com/jetbrains/python/PyJoinLinesTest.java | 1 + 4 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 python/testData/joinLines/LongExpression-after.py create mode 100644 python/testData/joinLines/LongExpression.py diff --git a/python/src/com/jetbrains/python/editor/PyJoinLinesHandler.java b/python/src/com/jetbrains/python/editor/PyJoinLinesHandler.java index 6afb2274409a..16dd0faa3127 100644 --- a/python/src/com/jetbrains/python/editor/PyJoinLinesHandler.java +++ b/python/src/com/jetbrains/python/editor/PyJoinLinesHandler.java @@ -3,6 +3,7 @@ package com.jetbrains.python.editor; import com.intellij.codeInsight.editorActions.JoinRawLinesHandlerDelegate; import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -73,29 +74,52 @@ public class PyJoinLinesHandler implements JoinRawLinesHandlerDelegate { } // single string case PY-4375 + final PyExpression leftExpression = request.leftExpr(); + final PyExpression rightExpression = request.rightExpr(); if (request.leftElem() == request.rightElem()) { IElementType type = request.leftElem().getNode().getElementType(); if (PyTokenTypes.SINGLE_QUOTED_STRING == type || PyTokenTypes.SINGLE_QUOTED_UNICODE == type) { - PyExpression element = request.leftExpr(); + PyExpression element = leftExpression; if (element == null) return CANNOT_JOIN; - String[] substrings = element.getText().split("\n"); - if (substrings.length != 1) { - StringBuilder replacement = new StringBuilder(); - for (String string : substrings) { - if (string.trim().endsWith("\\")) - replacement.append(string.substring(0, string.length()-1)); - else - replacement.append(string); - } - document.replaceString(element.getTextOffset(), element.getTextOffset()+element.getTextLength(), replacement); + if (removeBackSlash(document, element, false)) { return element.getTextOffset(); } } } + PsiElement expression = null; + if (leftExpression != null && rightExpression != null) { + if (PsiTreeUtil.isAncestor(leftExpression, rightExpression, false)) + expression = leftExpression; + else if (PsiTreeUtil.isAncestor(rightExpression, leftExpression, false)) + expression = rightExpression; + if (expression != null && !(expression instanceof PyStringLiteralExpression)) { + if (removeBackSlash(document, expression, true)) { + return expression.getTextOffset(); + } + } + } } return CANNOT_JOIN; } + private boolean removeBackSlash(Document document, PsiElement element, boolean trim) { + String[] substrings = element.getText().split("\n"); + if (substrings.length != 1) { + StringBuilder replacement = new StringBuilder(); + for (String string : substrings) { + if (trim) + string = StringUtil.trimLeading(string); + if (string.trim().endsWith("\\")) + replacement.append(string.substring(0, string.length()-1)); + else + replacement.append(string); + } + document.replaceString(element.getTextOffset(), element.getTextOffset()+element.getTextLength(), replacement); + return true; + } + return false; + } + // a dumb immutable result holder private static class Result { final String myInsert; diff --git a/python/testData/joinLines/LongExpression-after.py b/python/testData/joinLines/LongExpression-after.py new file mode 100644 index 000000000000..7fc1972a9b79 --- /dev/null +++ b/python/testData/joinLines/LongExpression-after.py @@ -0,0 +1 @@ +really_really_really_really_really_really_really_long_name = percentage_complete.as_integer_ratio() \ No newline at end of file diff --git a/python/testData/joinLines/LongExpression.py b/python/testData/joinLines/LongExpression.py new file mode 100644 index 000000000000..a58f8434142f --- /dev/null +++ b/python/testData/joinLines/LongExpression.py @@ -0,0 +1,2 @@ +really_really_really_really_really_really_really_long_name = percentage_complete\ + .as_integer_ratio() \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java b/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java index 93234c071898..cfec42363c17 100644 --- a/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java +++ b/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java @@ -65,4 +65,5 @@ public class PyJoinLinesTest extends PyTestCase { public void testTwoStatements() { doTest(); } public void testStringWithSlash() { doTest(); } public void testListOfStrings() { doTest(); } + public void testLongExpression() { doTest(); } } From 76ffc0f6211800735cd252477203da4e98ece378 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 30 Aug 2012 16:08:24 +0400 Subject: [PATCH 6/8] Refer to originating class so IconLoader doesn't have to guess via stack frame reflection --- python/helpers/icons/PythonHelpersIcons.java | 8 ++++++-- python/rest/src/icons/RestIcons.java | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/python/helpers/icons/PythonHelpersIcons.java b/python/helpers/icons/PythonHelpersIcons.java index c80728d8bc73..63f1581154ff 100644 --- a/python/helpers/icons/PythonHelpersIcons.java +++ b/python/helpers/icons/PythonHelpersIcons.java @@ -9,6 +9,10 @@ import javax.swing.*; * Don't repeat mistakes of others ;-) */ public class PythonHelpersIcons { - public static final Icon Keybd_closed = IconLoader.getIcon("/coverage/htmlfiles/keybd_closed.png"); // 35x12 - public static final Icon Keybd_open = IconLoader.getIcon("/coverage/htmlfiles/keybd_open.png"); // 35x12 + private static Icon load(String path) { + return IconLoader.getIcon(path, PythonHelpersIcons.class); + } + + public static final Icon Keybd_closed = load("/coverage/htmlfiles/keybd_closed.png"); // 35x12 + public static final Icon Keybd_open = load("/coverage/htmlfiles/keybd_open.png"); // 35x12 } diff --git a/python/rest/src/icons/RestIcons.java b/python/rest/src/icons/RestIcons.java index 37a8509d1aee..810d775edecd 100644 --- a/python/rest/src/icons/RestIcons.java +++ b/python/rest/src/icons/RestIcons.java @@ -9,5 +9,9 @@ import javax.swing.*; * Don't repeat mistakes of others ;-) */ public class RestIcons { - public static final Icon Rst = IconLoader.getIcon("/com/jetbrains/rest/res/rst.png"); // 16x16 + private static Icon load(String path) { + return IconLoader.getIcon(path, RestIcons.class); + } + + public static final Icon Rst = load("/com/jetbrains/rest/res/rst.png"); // 16x16 } From 0df6752999f6a5bb68b1f7d5fd3ddc5b304f588c Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 30 Aug 2012 19:26:50 +0400 Subject: [PATCH 7/8] Use plugin reflective icons --- .../com/jetbrains/python/facet/PythonFacetType.java | 4 ++-- python/rest/src/com/jetbrains/rest/RestFileType.java | 4 ++-- python/src/com/jetbrains/pyqt/QtTranslationsFileType.java | 4 ++-- python/src/com/jetbrains/pyqt/QtUIFileType.java | 4 ++-- python/src/com/jetbrains/python/PyIcons.java | 8 ++++---- python/src/com/jetbrains/python/PythonModuleTypeBase.java | 8 ++++---- .../com/jetbrains/python/buildout/BuildoutFacetType.java | 4 ++-- .../python/console/PythonDebugLanguageConsoleView.java | 4 ++-- .../jetbrains/python/console/RunPythonConsoleAction.java | 4 ++-- .../src/com/jetbrains/python/psi/impl/PyFunctionImpl.java | 8 ++++---- .../com/jetbrains/python/run/PythonConfigurationType.java | 4 ++-- .../src/com/jetbrains/python/sdk/IronPythonSdkFlavor.java | 4 ++-- python/src/com/jetbrains/python/sdk/JythonSdkFlavor.java | 4 ++-- python/src/com/jetbrains/python/sdk/PyPySdkFlavor.java | 4 ++-- python/src/com/jetbrains/python/sdk/PythonSdkFlavor.java | 4 ++-- python/src/com/jetbrains/python/sdk/PythonSdkType.java | 4 ++-- .../src/com/jetbrains/python/sdk/VirtualEnvSdkFlavor.java | 4 ++-- .../python/testing/PythonTestConfigurationType.java | 4 ++-- 18 files changed, 42 insertions(+), 42 deletions(-) diff --git a/python/pluginSrc/com/jetbrains/python/facet/PythonFacetType.java b/python/pluginSrc/com/jetbrains/python/facet/PythonFacetType.java index a4b9c16d6cec..e71a767c58c8 100644 --- a/python/pluginSrc/com/jetbrains/python/facet/PythonFacetType.java +++ b/python/pluginSrc/com/jetbrains/python/facet/PythonFacetType.java @@ -9,12 +9,12 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.util.IconLoader; import com.intellij.patterns.ElementPattern; import com.intellij.util.indexing.FileContent; import com.jetbrains.python.PythonFileType; import com.jetbrains.python.module.PythonModuleType; import com.jetbrains.python.sdk.PythonSdkType; +import icons.PythonIcons; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,7 +26,7 @@ import java.util.List; * @author yole */ public class PythonFacetType extends FacetType { - public static final Icon ICON = IconLoader.getIcon("/com/jetbrains/python/icons/python.png"); + public static final Icon ICON = PythonIcons.Python.Icons.Python; @NonNls private static final String ID = "Python"; diff --git a/python/rest/src/com/jetbrains/rest/RestFileType.java b/python/rest/src/com/jetbrains/rest/RestFileType.java index 63bdf14b9b32..3142be8b63aa 100644 --- a/python/rest/src/com/jetbrains/rest/RestFileType.java +++ b/python/rest/src/com/jetbrains/rest/RestFileType.java @@ -1,7 +1,7 @@ package com.jetbrains.rest; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.util.IconLoader; +import icons.RestIcons; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,7 +40,7 @@ public class RestFileType extends LanguageFileType { @Nullable public Icon getIcon() { - return IconLoader.getIcon("/com/jetbrains/rest/res/rst.png", RestFileType.class); + return RestIcons.Rst; } } diff --git a/python/src/com/jetbrains/pyqt/QtTranslationsFileType.java b/python/src/com/jetbrains/pyqt/QtTranslationsFileType.java index bf0a5e545fd6..0961948be93e 100644 --- a/python/src/com/jetbrains/pyqt/QtTranslationsFileType.java +++ b/python/src/com/jetbrains/pyqt/QtTranslationsFileType.java @@ -1,7 +1,7 @@ package com.jetbrains.pyqt; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.util.IconLoader; +import icons.PythonIcons; /** * @author yole @@ -10,7 +10,7 @@ public class QtTranslationsFileType extends QtFileType implements FileType { public static QtTranslationsFileType INSTANCE = new QtTranslationsFileType(); protected QtTranslationsFileType() { - super("Qt translations file", "Qt Linguist translations files", "ts", IconLoader.getIcon("/com/jetbrains/pyqt/tsFile.png")); + super("Qt translations file", "Qt Linguist translations files", "ts", PythonIcons.Pyqt.TsFile); } protected String getToolName() { diff --git a/python/src/com/jetbrains/pyqt/QtUIFileType.java b/python/src/com/jetbrains/pyqt/QtUIFileType.java index 73985c82e681..7788662cdb51 100644 --- a/python/src/com/jetbrains/pyqt/QtUIFileType.java +++ b/python/src/com/jetbrains/pyqt/QtUIFileType.java @@ -1,7 +1,7 @@ package com.jetbrains.pyqt; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.util.IconLoader; +import icons.PythonIcons; /** * @author yole @@ -10,7 +10,7 @@ public class QtUIFileType extends QtFileType implements FileType { public static QtUIFileType INSTANCE = new QtUIFileType(); protected QtUIFileType() { - super("Qt UI file", "Qt UI Designer form files", "ui", IconLoader.getIcon("/com/jetbrains/pyqt/uiForm.png")); + super("Qt UI file", "Qt UI Designer form files", "ui", PythonIcons.Pyqt.UiForm); } protected String getToolName() { diff --git a/python/src/com/jetbrains/python/PyIcons.java b/python/src/com/jetbrains/python/PyIcons.java index 7f93670b0bda..c4738e9e7228 100644 --- a/python/src/com/jetbrains/python/PyIcons.java +++ b/python/src/com/jetbrains/python/PyIcons.java @@ -1,6 +1,6 @@ package com.jetbrains.python; -import com.intellij.openapi.util.IconLoader; +import icons.PythonIcons; import org.jetbrains.annotations.NonNls; import javax.swing.*; @@ -13,7 +13,7 @@ import javax.swing.*; public interface PyIcons { @NonNls String DATA_ROOT = "icons/"; /*"/com/jetbrains/python/PyIcons";*/ - Icon PRIVATE = IconLoader.getIcon(DATA_ROOT + "nodes/lock.png"); - Icon PREDEFINED = IconLoader.getIcon(DATA_ROOT + "nodes/cyan-dot.png"); - Icon INVISIBLE = IconLoader.getIcon(DATA_ROOT + "nodes/red-inv-triangle.png"); + Icon PRIVATE = PythonIcons.Python.Icons.Nodes.Lock; + Icon PREDEFINED = PythonIcons.Python.Icons.Nodes.Cyan_dot; + Icon INVISIBLE = PythonIcons.Python.Icons.Nodes.Red_inv_triangle; } diff --git a/python/src/com/jetbrains/python/PythonModuleTypeBase.java b/python/src/com/jetbrains/python/PythonModuleTypeBase.java index 73115756b36f..7f9801eed6fa 100644 --- a/python/src/com/jetbrains/python/PythonModuleTypeBase.java +++ b/python/src/com/jetbrains/python/PythonModuleTypeBase.java @@ -2,7 +2,7 @@ package com.jetbrains.python; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.openapi.module.ModuleType; -import com.intellij.openapi.util.IconLoader; +import icons.PythonIcons; import org.jetbrains.annotations.NonNls; import javax.swing.*; @@ -12,9 +12,9 @@ import javax.swing.*; */ public abstract class PythonModuleTypeBase extends ModuleType { @NonNls public static final String PYTHON_MODULE = "PYTHON_MODULE"; - private final Icon myBigIcon = IconLoader.getIcon("/com/jetbrains/python/icons/python_24.png"); - private final Icon myOpenIcon = IconLoader.getIcon("/com/jetbrains/python/icons/pythonOpen.png"); - private final Icon myClosedIcon = IconLoader.getIcon("/com/jetbrains/python/icons/pythonClosed.png"); + private final Icon myBigIcon = PythonIcons.Python.Icons.Python_24; + private final Icon myOpenIcon = PythonIcons.Python.Icons.PythonOpen; + private final Icon myClosedIcon = PythonIcons.Python.Icons.PythonClosed; protected PythonModuleTypeBase() { super(PYTHON_MODULE); diff --git a/python/src/com/jetbrains/python/buildout/BuildoutFacetType.java b/python/src/com/jetbrains/python/buildout/BuildoutFacetType.java index d999e0fa539b..b8a0e0a6e9af 100644 --- a/python/src/com/jetbrains/python/buildout/BuildoutFacetType.java +++ b/python/src/com/jetbrains/python/buildout/BuildoutFacetType.java @@ -6,8 +6,8 @@ import com.intellij.facet.FacetTypeId; import com.intellij.facet.FacetTypeRegistry; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; -import com.intellij.openapi.util.IconLoader; import com.jetbrains.python.PythonModuleTypeBase; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,7 +48,7 @@ public class BuildoutFacetType extends FacetType implements PyFunction { - private static final Icon PROPERTY_GETTER = IconLoader.findIcon("/com/jetbrains/python/icons/propertyGetter.png"); - private static final Icon PROPERTY_SETTER = IconLoader.findIcon("/com/jetbrains/python/icons/propertySetter.png"); - private static final Icon PROPERTY_DELETER = IconLoader.findIcon("/com/jetbrains/python/icons/propertyDeleter.png"); + private static final Icon PROPERTY_GETTER = PythonIcons.Python.Icons.PropertyGetter; + private static final Icon PROPERTY_SETTER = PythonIcons.Python.Icons.PropertySetter; + private static final Icon PROPERTY_DELETER = PythonIcons.Python.Icons.PropertyDeleter; public PyFunctionImpl(ASTNode astNode) { super(astNode); diff --git a/python/src/com/jetbrains/python/run/PythonConfigurationType.java b/python/src/com/jetbrains/python/run/PythonConfigurationType.java index 3098fa9d07a3..2abe39117d20 100644 --- a/python/src/com/jetbrains/python/run/PythonConfigurationType.java +++ b/python/src/com/jetbrains/python/run/PythonConfigurationType.java @@ -6,7 +6,7 @@ import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.RunConfigurationModule; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.IconLoader; +import icons.PythonIcons; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -29,7 +29,7 @@ public class PythonConfigurationType implements ConfigurationType { return null; } - private final Icon _icon = IconLoader.getIcon("/com/jetbrains/python/icons/python.png"); + private final Icon _icon = PythonIcons.Python.Icons.Python; private static class PythonConfigurationFactory extends ConfigurationFactory { protected PythonConfigurationFactory(ConfigurationType configurationType) { diff --git a/python/src/com/jetbrains/python/sdk/IronPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/IronPythonSdkFlavor.java index 1f556e56c539..11821f160903 100644 --- a/python/src/com/jetbrains/python/sdk/IronPythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/IronPythonSdkFlavor.java @@ -1,8 +1,8 @@ package com.jetbrains.python.sdk; import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.text.StringUtil; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -84,6 +84,6 @@ public class IronPythonSdkFlavor extends PythonSdkFlavor { @Override public Icon getIcon() { - return IconLoader.getIcon("/com/jetbrains/python/icons/dotnet.png"); + return PythonIcons.Python.Icons.Dotnet; } } diff --git a/python/src/com/jetbrains/python/sdk/JythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/JythonSdkFlavor.java index 363f08a9e205..28fdb5b001cd 100644 --- a/python/src/com/jetbrains/python/sdk/JythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/JythonSdkFlavor.java @@ -2,10 +2,10 @@ package com.jetbrains.python.sdk; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.configurations.ParamsGroup; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.jetbrains.python.run.PythonCommandLineState; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -66,6 +66,6 @@ public class JythonSdkFlavor extends PythonSdkFlavor { @Override public Icon getIcon() { - return IconLoader.getIcon("/com/jetbrains/python/icons/jython.png"); + return PythonIcons.Python.Icons.Jython; } } diff --git a/python/src/com/jetbrains/python/sdk/PyPySdkFlavor.java b/python/src/com/jetbrains/python/sdk/PyPySdkFlavor.java index 20b34516cfa2..b948a9c95507 100644 --- a/python/src/com/jetbrains/python/sdk/PyPySdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/PyPySdkFlavor.java @@ -1,10 +1,10 @@ package com.jetbrains.python.sdk; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.jetbrains.python.psi.LanguageLevel; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -77,6 +77,6 @@ public class PyPySdkFlavor extends PythonSdkFlavor { @Override public Icon getIcon() { - return IconLoader.getIcon("/com/jetbrains/python/icons/pypy.png"); + return PythonIcons.Python.Icons.Pypy; } } diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/PythonSdkFlavor.java index f80c9e12c803..d257402d02ea 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkFlavor.java @@ -6,12 +6,12 @@ import com.intellij.execution.process.ProcessOutput; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkAdditionalData; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.encoding.EncodingManager; import com.jetbrains.python.psi.LanguageLevel; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -226,6 +226,6 @@ public abstract class PythonSdkFlavor { } public Icon getIcon() { - return IconLoader.getIcon("/com/jetbrains/python/icons/python.png"); + return PythonIcons.Python.Icons.Python; } } diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index 5df5247449e6..f6cefba7431f 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -28,7 +28,6 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; @@ -46,6 +45,7 @@ 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.PythonRemoteSdkAdditionalData; +import icons.PythonIcons; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -84,7 +84,7 @@ public class PythonSdkType extends SdkType { } public Icon getIcon() { - return IconLoader.getIcon("/com/jetbrains/python/icons/python.png"); + return PythonIcons.Python.Icons.Python; } @NotNull diff --git a/python/src/com/jetbrains/python/sdk/VirtualEnvSdkFlavor.java b/python/src/com/jetbrains/python/sdk/VirtualEnvSdkFlavor.java index c9ea879fbcfd..a59aac80ced0 100644 --- a/python/src/com/jetbrains/python/sdk/VirtualEnvSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/VirtualEnvSdkFlavor.java @@ -3,12 +3,12 @@ package com.jetbrains.python.sdk; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.SystemProperties; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -117,6 +117,6 @@ public class VirtualEnvSdkFlavor extends CPythonSdkFlavor { @Override public Icon getIcon() { - return IconLoader.getIcon("/com/jetbrains/python/icons/virtualenv.png"); + return PythonIcons.Python.Icons.Virtualenv; } } diff --git a/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java b/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java index 1fa6fbd8c428..28b069ae8fa4 100644 --- a/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java +++ b/python/src/com/jetbrains/python/testing/PythonTestConfigurationType.java @@ -2,13 +2,13 @@ package com.jetbrains.python.testing; import com.intellij.execution.configurations.*; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.IconLoader; import com.jetbrains.python.PyBundle; import com.jetbrains.python.testing.attest.PythonAtTestRunConfiguration; import com.jetbrains.python.testing.doctest.PythonDocTestRunConfiguration; import com.jetbrains.python.testing.nosetest.PythonNoseTestRunConfiguration; import com.jetbrains.python.testing.pytest.PyTestRunConfiguration; import com.jetbrains.python.testing.unittest.PythonUnitTestRunConfiguration; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -29,7 +29,7 @@ public class PythonTestConfigurationType implements ConfigurationType { return ConfigurationTypeUtil.findConfigurationType(PythonTestConfigurationType.class); } - private static final Icon ICON = IconLoader.getIcon("/com/jetbrains/python/icons/pythonTests.png"); + private static final Icon ICON = PythonIcons.Python.Icons.PythonTests; private static class PythonUnitTestConfigurationFactory extends ConfigurationFactory { protected PythonUnitTestConfigurationFactory(ConfigurationType configurationType) { From 868bae486e43b465e3b3df47f1ceb51fbabfbd0c Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Thu, 30 Aug 2012 19:45:38 +0400 Subject: [PATCH 8/8] fixed PY-7316 Wrong text ranges for type references that have qualified canonical names --- .../DocStringReferenceProvider.java | 16 +++++++++------- .../documentation/StructuredDocString.java | 5 +++++ python/testData/resolve/ReferenceInDocstring.py | 7 +++++++ .../com/jetbrains/python/PyResolveTest.java | 4 ++++ 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 python/testData/resolve/ReferenceInDocstring.py diff --git a/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java b/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java index 7210f6493bbc..0e1a26b73967 100644 --- a/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java +++ b/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java @@ -43,14 +43,14 @@ public class DocStringReferenceProvider extends PsiReferenceProvider { StructuredDocString docString = StructuredDocString.parse(text); if (docString != null) { result.addAll(referencesFromNames(element, offset, docString, - docString.getTagArguments(StructuredDocString.PARAM_TAGS), "parameter")); + docString.getTagArguments(StructuredDocString.PARAM_TAGS), StructuredDocString.PARAMETER)); result.addAll(referencesFromNames(element, offset, docString, - docString.getTagArguments(StructuredDocString.PARAM_TYPE_TAGS), "parameter_type")); + docString.getTagArguments(StructuredDocString.PARAM_TYPE_TAGS), StructuredDocString.PARAMETER_TYPE)); result.addAll(referencesFromNames(element, offset, docString, - docString.getKeywordArgumentSubstrings(), "keyword")); + docString.getKeywordArgumentSubstrings(), StructuredDocString.KEYWORD)); result.addAll(referencesFromNames(element, offset, docString, - docString.getTagArguments(StructuredDocString.VARIABLE_TAGS), "variable")); + docString.getTagArguments(StructuredDocString.VARIABLE_TAGS), StructuredDocString.VARIABLE)); } return result.toArray(new PsiReference[result.size()]); } @@ -69,9 +69,11 @@ public class DocStringReferenceProvider extends PsiReferenceProvider { if (PyNames.isIdentifier(s)) { result.add(new DocStringParameterReference(element, name.getTextRange().shiftRight(offset), refType)); } - final Substring type = docString.getParamTypeSubstring(s); - if (type != null) { - result.addAll(parseTypeReferences(element, type, offset)); + if (!refType.equals(StructuredDocString.PARAMETER_TYPE)) { + final Substring type = docString.getParamTypeSubstring(s); + if (type != null) { + result.addAll(parseTypeReferences(element, type, offset)); + } } } final Substring rtype = docString.getReturnTypeSubstring(); diff --git a/python/src/com/jetbrains/python/documentation/StructuredDocString.java b/python/src/com/jetbrains/python/documentation/StructuredDocString.java index d1fe556b9af4..de4b44d5f3c4 100644 --- a/python/src/com/jetbrains/python/documentation/StructuredDocString.java +++ b/python/src/com/jetbrains/python/documentation/StructuredDocString.java @@ -33,6 +33,11 @@ public abstract class StructuredDocString { public static String[] RAISES_TAGS = new String[] { "raises", "raise", "except", "exception" }; public static String[] RETURN_TAGS = new String[] { "return", "returns" }; + public static String PARAMETER = "parameter"; + public static String PARAMETER_TYPE = "parameter_type"; + public static String KEYWORD = "keyword"; + public static String VARIABLE = "variable"; + @Nullable public static StructuredDocString parse(String text) { if (text == null) { diff --git a/python/testData/resolve/ReferenceInDocstring.py b/python/testData/resolve/ReferenceInDocstring.py new file mode 100644 index 000000000000..d3a566e71135 --- /dev/null +++ b/python/testData/resolve/ReferenceInDocstring.py @@ -0,0 +1,7 @@ +from datetime import datetime + +def foo(p): + """Foo + :param datetime p: a datetime + + """ \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index 3991c0d911c0..ab3a496bf146 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -476,4 +476,8 @@ public class PyResolveTest extends PyResolveTestCase { public void testKWArg() { assertResolvesTo(PyClass.class, "timedelta"); } + + public void testReferenceInDocstring() { + assertResolvesTo(PyClass.class, "datetime"); + } }