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/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/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 } 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, 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/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java index 1859530767de..45171a16d327 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java @@ -3,7 +3,6 @@ package com.jetbrains.python.psi.impl; import com.google.common.collect.Maps; import com.intellij.lang.ASTNode; import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; @@ -30,6 +29,7 @@ import com.jetbrains.python.psi.stubs.PyFunctionStub; import com.jetbrains.python.psi.stubs.PyTargetExpressionStub; import com.jetbrains.python.psi.types.*; import com.jetbrains.python.sdk.PythonSdkType; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,9 +44,9 @@ import static com.jetbrains.python.psi.impl.PyCallExpressionHelper.interpretAsMo * Implements PyFunction. */ public class PyFunctionImpl extends PyPresentableElementImpl 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/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; + } + } } } } 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) { 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/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/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/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(); } } 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"); + } } 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()); } 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);