Ignore unresolved __attrs_attrs__ for attrs (PY-29929)

This commit is contained in:
Semyon Proshev
2019-02-05 18:14:59 +03:00
parent 648d9521fa
commit d13811d2c5
2 changed files with 22 additions and 0 deletions
@@ -2,12 +2,16 @@
package com.jetbrains.python.inspections
import com.intellij.util.containers.ContainerUtil
import com.jetbrains.python.codeInsight.stdlib.PyDataclassParameters
import com.jetbrains.python.codeInsight.stdlib.parseDataclassParameters
import com.jetbrains.python.psi.PyElement
import com.jetbrains.python.psi.PyExpression
import com.jetbrains.python.psi.PyFunction
import com.jetbrains.python.psi.PyUtil
import com.jetbrains.python.psi.resolve.PyResolveContext
import com.jetbrains.python.psi.resolve.QualifiedNameFinder
import com.jetbrains.python.psi.types.PyClassType
import com.jetbrains.python.psi.types.PyType
import com.jetbrains.python.psi.types.TypeEvalContext
class PyThirdPartyInspectionExtension : PyInspectionExtension() {
@@ -29,6 +33,12 @@ class PyThirdPartyInspectionExtension : PyInspectionExtension() {
return false
}
override fun ignoreUnresolvedMember(type: PyType, name: String, context: TypeEvalContext): Boolean {
return name == "__attrs_attrs__" &&
type is PyClassType &&
parseDataclassParameters(type.pyClass, context)?.type == PyDataclassParameters.Type.ATTRS
}
private fun resolvesTo(expression: PyExpression, qualifiedName: String, resolveContext: PyResolveContext): Boolean {
return ContainerUtil.exists(PyUtil.multiResolveTopPriority(expression, resolveContext)) {
it is PyElement && QualifiedNameFinder.getQualifiedName(it) == qualifiedName
@@ -770,6 +770,18 @@ public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase {
"print(<error descr=\"Unresolved reference 'module'\">module</error>)");
}
// PY-29929
public void testAttrsSpecialAttribute() {
doTestByText("import attr\n" +
"\n" +
"@attr.s\n" +
"class C:\n" +
" a = attr.ib()\n" +
"\n" +
"print(C.__attrs_attrs__)\n" +
"print(C(1).__attrs_attrs__)");
}
// PY-32927
public void testPrefixExpressionOnClassHavingSkeletons() {
doMultiFileTest();