pydantic-pycharm-plugin icon indicating copy to clipboard operation
pydantic-pycharm-plugin copied to clipboard

Non-idempotent computation error in pycharm 2021.2 with plugin version 0.3.4

Open ilyachch opened this issue 2 years ago • 2 comments

java.lang.Throwable: Non-idempotent computation: it returns different results when invoked multiple times or on different threads:
  MyInstanceElement{myClass=PyClass: Usermember={resolve=PsiParameterizedCachedValue{com.jetbrains.python.codeInsight.PyCustomMember$$Lambda$5746/0x0000000102385440@6c2279fa}}node=Element(Py:CLASS_DECLARATION), myContext=PyClass: HttpRequest} != MyInstanceElement{myClass=PyClass: Usermember={resolve=PsiParameterizedCachedValue{com.jetbrains.python.codeInsight.PyCustomMember$$Lambda$5746/0x0000000102385440@2dcf7073}}node=Element(Py:CLASS_DECLARATION), myContext=PyClass: HttpRequest}
  which is element of MyInstanceElement{myClass=PyClass: Usermember={resolve=PsiParameterizedCachedValue{com.jetbrains.python.codeInsight.PyCustomMember$$Lambda$5746/0x0000000102385440@6c2279fa}}node=Element(Py:CLASS_DECLARATION), myContext=PyClass: HttpRequest}@0 and MyInstanceElement{myClass=PyClass: Usermember={resolve=PsiParameterizedCachedValue{com.jetbrains.python.codeInsight.PyCustomMember$$Lambda$5746/0x0000000102385440@2dcf7073}}node=Element(Py:CLASS_DECLARATION), myContext=PyClass: HttpRequest}@0
  which is 0th element of [MyInstanceElement{myClass=PyClass: Usermember={resolve=PsiParameterizedCachedValue{com.jetbrains.python.codeInsight.PyCustomMember$$Lambda$5746/0x0000000102385440@6c2279fa}}node=Element(Py:CLASS_DECLARATION), myContext=PyClass: HttpRequest}@0] and [MyInstanceElement{myClass=PyClass: Usermember={resolve=PsiParameterizedCachedValue{com.jetbrains.python.codeInsight.PyCustomMember$$Lambda$5746/0x0000000102385440@2dcf7073}}node=Element(Py:CLASS_DECLARATION), myContext=PyClass: HttpRequest}@0]

Recomputation gives [Lcom.intellij.psi.ResolveResult;@342d0519 (class [Lcom.intellij.psi.ResolveResult;) which is different from both values
Recomputation log:
  Resolving PyQualifiedReference(PyReferenceExpression: user,com.jetbrains.python.psi.resolve.PyResolveContext@3c1) of class com.jetbrains.python.psi.impl.references.PyQualifiedReference
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:182)
at com.intellij.util.IdempotenceChecker.reportFailure(IdempotenceChecker.java:89)
at com.intellij.util.IdempotenceChecker.checkEquivalence(IdempotenceChecker.java:76)
at com.intellij.psi.impl.source.resolve.ResolveCache.cache(ResolveCache.java:322)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:249)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:154)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:169)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:162)
at com.jetbrains.python.psi.impl.references.PyReferenceImpl.multiResolve(PyReferenceImpl.java:93)
at com.jetbrains.python.psi.PyUtil.multiResolveTopPriority(PyUtil.java:515)
at com.koxudaxi.pydantic.PydanticKt.getResolvedPsiElements(Pydantic.kt:255)
at com.koxudaxi.pydantic.PydanticDataclassTypeProvider.getPydanticDataclass(PydanticDataclassTypeProvider.kt:63)
at com.koxudaxi.pydantic.PydanticDataclassTypeProvider.getReferenceExpressionType(PydanticDataclassTypeProvider.kt:27)
at com.jetbrains.python.psi.impl.PyReferenceExpressionImpl.getTypeFromProviders(PyReferenceExpressionImpl.java:383)
at com.jetbrains.python.psi.impl.PyReferenceExpressionImpl.getType(PyReferenceExpressionImpl.java:217)
at com.jetbrains.python.psi.types.TypeEvalContext.lambda$getType$0(TypeEvalContext.java:177)
at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:111)
at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:43)
at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68)
at com.jetbrains.python.psi.types.TypeEvalContext.getType(TypeEvalContext.java:166)
at com.jetbrains.python.psi.impl.references.PyQualifiedReference.resolveInner(PyQualifiedReference.java:79)
at com.jetbrains.python.psi.impl.references.PyReferenceImpl.multiResolveInner(PyReferenceImpl.java:106)
at com.jetbrains.python.psi.impl.references.PyReferenceImpl$CachingResolver.resolve(PyReferenceImpl.java:775)
at com.jetbrains.python.psi.impl.references.PyReferenceImpl$CachingResolver.resolve(PyReferenceImpl.java:770)
at com.intellij.psi.impl.source.resolve.ResolveCache.lambda$resolve$1(ResolveCache.java:154)
at com.intellij.openapi.util.Computable.get(Computable.java:18)
at com.intellij.psi.impl.source.resolve.ResolveCache.lambda$loggingResolver$4(ResolveCache.java:260)
at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:111)
at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:43)
at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:237)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolve(ResolveCache.java:154)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:169)
at com.intellij.psi.impl.source.resolve.ResolveCache.resolveWithCaching(ResolveCache.java:162)
at com.jetbrains.python.psi.impl.references.PyReferenceImpl.multiResolve(PyReferenceImpl.java:93)
at com.jetbrains.python.psi.impl.PyReferenceExpressionImpl.multiFollowAssignmentsChain(PyReferenceExpressionImpl.java:153)
at com.jetbrains.python.psi.PyReferenceExpression.multiFollowAssignmentsChain(PyReferenceExpression.java:54)
at com.jetbrains.python.psi.impl.PyReferenceExpressionImpl.followAssignmentsChain(PyReferenceExpressionImpl.java:123)
at com.jetbrains.django.util.PythonDataflowUtil.isCallWithArgument(PythonDataflowUtil.java:203)
at com.jetbrains.django.util.PythonDataflowUtil$CallVisitor.visitPyCallExpression(PythonDataflowUtil.java:182)
at com.jetbrains.python.psi.impl.PyCallExpressionImpl.acceptPyVisitor(PyCallExpressionImpl.java:27)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
at com.jetbrains.python.psi.PyRecursiveElementVisitor.visitElement(PyRecursiveElementVisitor.java:12)
at com.jetbrains.python.psi.PyElementVisitor.visitPyElement(PyElementVisitor.java:26)
at com.jetbrains.python.psi.PyElementVisitor.visitPyStatement(PyElementVisitor.java:170)
at com.jetbrains.python.psi.PyElementVisitor.visitPyExpressionStatement(PyElementVisitor.java:166)
at com.jetbrains.python.psi.impl.PyExpressionStatementImpl.acceptPyVisitor(PyExpressionStatementImpl.java:25)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
at com.jetbrains.python.psi.PyRecursiveElementVisitor.visitElement(PyRecursiveElementVisitor.java:12)
at com.jetbrains.python.psi.PyElementVisitor.visitPyElement(PyElementVisitor.java:26)
at com.jetbrains.python.psi.PyElementVisitor.visitPyStatementList(PyElementVisitor.java:198)
at com.jetbrains.python.psi.impl.PyStatementListImpl.acceptPyVisitor(PyStatementListImpl.java:23)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
at com.jetbrains.python.psi.PyRecursiveElementVisitor.visitElement(PyRecursiveElementVisitor.java:12)
at com.jetbrains.python.psi.PyElementVisitor.visitPyElement(PyElementVisitor.java:26)
at com.jetbrains.python.psi.PyElementVisitor.visitPyConditionalStatementPart(PyElementVisitor.java:270)
at com.jetbrains.python.psi.impl.PyConditionalStatementPartImpl.acceptPyVisitor(PyConditionalStatementPartImpl.java:26)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
at com.jetbrains.python.psi.PyRecursiveElementVisitor.visitElement(PyRecursiveElementVisitor.java:12)
at com.jetbrains.python.psi.PyElementVisitor.visitPyElement(PyElementVisitor.java:26)
at com.jetbrains.python.psi.PyElementVisitor.visitPyStatement(PyElementVisitor.java:170)
at com.jetbrains.python.psi.PyElementVisitor.visitPyIfStatement(PyElementVisitor.java:150)
at com.jetbrains.python.psi.impl.PyIfStatementImpl.acceptPyVisitor(PyIfStatementImpl.java:20)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
at com.jetbrains.python.psi.PyRecursiveElementVisitor.visitElement(PyRecursiveElementVisitor.java:12)
at com.jetbrains.python.psi.PyElementVisitor.visitPyElement(PyElementVisitor.java:26)
at com.jetbrains.python.psi.PyElementVisitor.visitPyStatementList(PyElementVisitor.java:198)
at com.jetbrains.python.psi.impl.PyStatementListImpl.acceptPyVisitor(PyStatementListImpl.java:23)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
at com.jetbrains.python.psi.PyRecursiveElementVisitor.visitElement(PyRecursiveElementVisitor.java:12)
at com.jetbrains.python.psi.PyElementVisitor.visitPyElement(PyElementVisitor.java:26)
at com.jetbrains.python.psi.PyElementVisitor.visitPyFunction(PyElementVisitor.java:206)
at com.jetbrains.python.psi.impl.PyFunctionImpl.acceptPyVisitor(PyFunctionImpl.java:553)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
at com.jetbrains.python.psi.PyRecursiveElementVisitor.visitElement(PyRecursiveElementVisitor.java:12)
at com.jetbrains.python.psi.PyElementVisitor.visitPyElement(PyElementVisitor.java:26)
at com.jetbrains.python.psi.PyElementVisitor.visitPyStatementList(PyElementVisitor.java:198)
at com.jetbrains.python.psi.impl.PyStatementListImpl.acceptPyVisitor(PyStatementListImpl.java:23)
at com.jetbrains.python.psi.impl.PyBaseElementImpl.accept(PyBaseElementImpl.java:69)
at com.jetbrains.django.util.PythonDataflowUtil.getCalls(PythonDataflowUtil.java:158)
at com.jetbrains.django.model.DjangoTemplateManager$TemplateReferenceExpectedChecker.fun(DjangoTemplateManager.java:540)
at com.jetbrains.django.model.DjangoTemplateManager$TemplateReferenceExpectedChecker.fun(DjangoTemplateManager.java:523)
at com.intellij.psi.util.PsiCacheKey.getValue(PsiCacheKey.java:29)
at com.jetbrains.django.model.DjangoTemplateManager.isTemplateReferenceExpected(DjangoTemplateManager.java:362)
at com.jetbrains.django.ref.DjangoTemplateReferenceProvider.getReferencesByElement(DjangoTemplateReferenceProvider.java:23)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.getReferences(ReferenceProvidersRegistryImpl.java:199)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.mapNotEmptyReferencesFromProviders(ReferenceProvidersRegistryImpl.java:162)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.doGetReferencesFromProviders(ReferenceProvidersRegistryImpl.java:141)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.lambda$getReferencesFromProviders$0(ReferenceProvidersRegistry.java:39)
at com.intellij.psi.util.CachedValuesManager$1.compute(CachedValuesManager.java:158)
at com.intellij.psi.impl.PsiCachedValueImpl.doCompute(PsiCachedValueImpl.java:39)
at com.intellij.util.CachedValueBase.lambda$getValueWithLock$3(CachedValueBase.java:227)
at com.intellij.util.CachedValueBase.computeData(CachedValueBase.java:42)
at com.intellij.util.CachedValueBase.lambda$getValueWithLock$4(CachedValueBase.java:227)
at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:111)
at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:43)
at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68)
at com.intellij.util.CachedValueBase.getValueWithLock(CachedValueBase.java:228)
at com.intellij.psi.impl.PsiCachedValueImpl.getValue(PsiCachedValueImpl.java:28)
at com.intellij.util.CachedValuesManagerImpl.getCachedValue(CachedValuesManagerImpl.java:72)
at com.intellij.psi.util.CachedValuesManager.getCachedValue(CachedValuesManager.java:155)
at com.intellij.psi.util.CachedValuesManager.getCachedValue(CachedValuesManager.java:121)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.getReferencesFromProviders(ReferenceProvidersRegistry.java:38)
at com.jetbrains.python.psi.impl.PyStringLiteralExpressionImpl.getReferences(PyStringLiteralExpressionImpl.java:194)
at com.intellij.codeInsight.highlighting.HyperlinkAnnotator.annotate(HyperlinkAnnotator.java:45)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.runAnnotators(DefaultHighlightVisitor.java:134)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.visit(DefaultHighlightVisitor.java:114)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.runVisitors(GeneralHighlightingPass.java:335)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.lambda$collectHighlights$5(GeneralHighlightingPass.java:268)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.analyzeByVisitors(GeneralHighlightingPass.java:294)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.lambda$analyzeByVisitors$6(GeneralHighlightingPass.java:297)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.analyze(DefaultHighlightVisitor.java:94)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.analyzeByVisitors(GeneralHighlightingPass.java:297)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.collectHighlights(GeneralHighlightingPass.java:265)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.collectInformationWithProgress(GeneralHighlightingPass.java:211)
at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:84)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:56)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$1(PassExecutorService.java:399)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1078)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$2(PassExecutorService.java:392)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:705)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:647)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:63)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.doRun(PassExecutorService.java:391)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$run$0(PassExecutorService.java:367)
at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:174)
at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:183)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:365)
at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask$1.exec(JobLauncherImpl.java:188)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

Environments (please complete the following information):

  • IDE: PyCharm Pro 2021.2
  • OS: Ubuntu 20.04.2
  • Pydantic Version 1.8.1
  • Plugin version 0.3.4

ilyachch avatar Aug 19 '21 08:08 ilyachch

Screenshot from 2021-08-19 16-49-57

ilyachch avatar Aug 19 '21 13:08 ilyachch

@ilyachch Thank you for creating this issue. I'll investigate the source of the problem.

koxudaxi avatar Aug 22 '21 08:08 koxudaxi

@ilyachch I'm sorry for my too-late fix. I have released a new version v0.4.0 in the market The version dropped unnecessary resolving for an object reference. It means the update reduces CPU load and fixes unexpected errors.

I closed the PR because the root cause method was removed from the plugin's source code. Thank you.

koxudaxi avatar Mar 02 '23 13:03 koxudaxi