ForNeVeR / ForNeVeR/haskeletor
Rename refactoring doesn't work for the module export list
- Dominant language
- Scala
- Stars
- 6
- Forks
- 2
- PR merge metrics
- No merged PRs in 30d
Description
Consider this code:
```haskell
module Lib
( someFunc
) where
someFunc :: IO ()
someFunc = putStrLn "someFunc"
```
Now, rename the `someFunc` via Haskeletor: while it _seems_ to rename `someFunc` in the export list, it gets canceled:
```
module Lib
( someFunc
) where
layOut :: IO ()
layOut = putStrLn "someFunc"
```
Possibly related exception:
```
java.lang.NullPointerException: Cannot invoke "String.equalsIgnoreCase(String)" because "$2$$1" is null
at me.fornever.haskeletor.notification.ConfigFileWatcher.after$$anonfun$1$$anonfun$2(ConfigFileWatcherNotificationProvider.scala:69)
at scala.collection.IterableOnceOps.exists(IterableOnce.scala:660)
at scala.collection.IterableOnceOps.exists$(IterableOnce.scala:336)
at scala.collection.AbstractIterable.exists(Iterable.scala:941)
at me.fornever.haskeletor.notification.ConfigFileWatcher.after$$anonfun$1(ConfigFileWatcherNotificationProvider.scala:69)
at scala.collection.IterableOnceOps.exists(IterableOnce.scala:660)
at scala.collection.IterableOnceOps.exists$(IterableOnce.scala:336)
at scala.collection.AbstractIterable.exists(Iterable.scala:941)
at me.fornever.haskeletor.notification.ConfigFileWatcher.after(ConfigFileWatcherNotificationProvider.scala:66)
at com.intellij.util.messages.impl.MessageBusImplKt.invokeMethod(MessageBusImpl.kt:831)
at com.intellij.util.messages.impl.MessageBusImplKt.invokeListener(MessageBusImpl.kt:775)
at com.intellij.util.messages.impl.MessageBusImplKt.executeOrAddToQueue(MessageBusImpl.kt:596)
at com.intellij.util.messages.impl.ToDirectChildrenMessagePublisher.publish$intellij_platform_core(CompositeMessageBus.kt:193)
at com.intellij.util.messages.impl.MessagePublisher.invoke(MessageBusImpl.kt:544)
at jdk.proxy2/jdk.proxy2.$Proxy113.after(Unknown Source)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.lambda$fireAfterEvents$4(PersistentFSImpl.java:1798)
at com.intellij.openapi.vfs.newvfs.impl.VfsThreadingUtil.runActionOnEdtRegardlessOfCurrentThread(VfsThreadingUtil.java:18)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.lambda$fireAfterEvents$3(PersistentFSImpl.java:1798)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.runSuppressing(PersistentFSImpl.java:1405)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.fireAfterEvents(PersistentFSImpl.java:1794)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl$3.writeToDisk(PersistentFSImpl.java:1308)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl$3.close(PersistentFSImpl.java:1287)
at com.intellij.openapi.fileEditor.impl.LoadTextUtil.write(LoadTextUtil.java:496)
at com.intellij.openapi.fileEditor.impl.LoadTextUtil.write(LoadTextUtil.java:507)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.lambda$doSaveDocumentInWriteAction$2(FileDocumentManagerImpl.java:481)
at com.intellij.pom.core.impl.PomModelImpl.guardPsiModificationsIn(PomModelImpl.java:351)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.doSaveDocumentInWriteAction(FileDocumentManagerImpl.java:468)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.lambda$doSaveDocument$0(FileDocumentManagerImpl.java:411)
at com.intellij.openapi.application.ThrowableComputableToLambda.invoke(coroutines.kt:351)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runWriteActionBlocking(NestedLocksThreadingSupport.kt:1005)
at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1187)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.doSaveDocument(FileDocumentManagerImpl.java:410)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.doSave(FileDocumentManagerImpl.java:324)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.lambda$saveDocumentsOnEdt$0(FileDocumentManagerImpl.java:293)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$1(CoreProgressManager.java:291)
at com.intellij.platform.diagnostic.telemetry.helpers.TraceKt.use(trace.kt:44)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$0(CoreProgressManager.java:290)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$0(CoreProgressManager.java:756)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:832)
at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:788)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:755)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.lambda$executeProcessUnderProgress$0(ProgressManagerImpl.java:90)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runWithHook(ProgressManagerImpl.java:293)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:90)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:271)
at com.intellij.openapi.progress.util.PotemkinProgress.runInSwingThread(PotemkinProgress.java:155)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.saveDocumentsOnEdt(FileDocumentManagerImpl.java:292)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.saveDocuments(FileDocumentManagerImpl.java:271)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.saveAllDocuments(FileDocumentManagerImpl.java:252)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.saveAllDocuments(FileDocumentManagerImpl.java:245)
at com.intellij.ide.actions.SaveAllAction.actionPerformed(SaveAllAction.kt:25)
at com.intellij.openapi.actionSystem.ex.ActionUtil.doPerformActionOrShowPopup(ActionUtil.kt:467)
at com.intellij.openapi.keymap.impl.ActionProcessor.performAction$lambda$0(ActionProcessor.kt:35)
at com.intellij.openapi.application.WriteIntentReadAction.lambda$run$0(WriteIntentReadAction.java:24)
at com.intellij.openapi.application.ThrowableComputableToLambda.invoke(coroutines.kt:351)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runWriteIntentReadAction(NestedLocksThreadingSupport.kt:710)
at com.intellij.openapi.application.impl.ApplicationImpl.runWriteIntentReadAction(ApplicationImpl.java:1218)
at com.intellij.openapi.application.WriteIntentReadAction.computeThrowable(WriteIntentReadAction.java:55)
at com.intellij.openapi.application.WriteIntentReadAction.run(WriteIntentReadAction.java:23)
at com.intellij.openapi.keymap.impl.ActionProcessor.performAction(ActionProcessor.kt:34)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher$actionProcessor$1.performAction(IdeKeyEventDispatcher.kt:546)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcherKt.doPerformActionInner$lambda$0$0(IdeKeyEventDispatcher.kt:885)
at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:106)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:95)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcherKt.doPerformActionInner$lambda$0(IdeKeyEventDispatcher.kt:884)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.performWithActionCallbacks$lambda$1$0(ActionManagerImpl.kt:623)
at com.intellij.openapi.application.WriteIntentReadAction.lambda$run$0(WriteIntentReadAction.java:24)
at com.intellij.openapi.application.ThrowableComputableToLambda.invoke(coroutines.kt:351)
at com.intellij.platform.locking.impl.NestedLocksThreadingSupport.runWriteIntentReadAction(NestedLocksThreadingSupport.kt:710)
at com.intellij.openapi.application.impl.ApplicationImpl.runWriteIntentReadAction(ApplicationImpl.java:1218)
at com.intellij.openapi.application.WriteIntentReadAction.computeThrowable(WriteIntentReadAction.java:55)
at com.intellij.openapi.application.WriteIntentReadAction.run(WriteIntentReadAction.java:23)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.performWithActionCallbacks$lambda$1(ActionManagerImpl.kt:812)
at com.intellij.concurrency.ThreadContext.installThreadContext(threadContext.kt:307)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.performWithActionCallbacks(ActionManagerImpl.kt:620)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcherKt.doPerformActionInner(IdeKeyEventDispatcher.kt:882)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcherKt.access$doPerformActionInner(IdeKeyEventDispatcher.kt:1)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processAction(IdeKeyEventDispatcher.kt:605)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processAction(IdeKeyEventDispatcher.kt:559)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.processActionOrWaitSecondStroke(IdeKeyEventDispatcher.kt:498)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.inInitState(IdeKeyEventDispatcher.kt:491)
at com.intellij.openapi.keymap.impl.IdeKeyEventDispatcher.dispatchKeyEvent(IdeKeyEventDispatcher.kt:351)
at com.intellij.ide.IdeEventQueue.dispatchKeyEvent(IdeEventQueue.kt:622)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:575)
at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$0$0$0$0(IdeEventQueue.kt:388)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:941)
at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$0$0$0(IdeEventQueue.kt:387)
at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$0(IdeEventQueue.kt:1122)
at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:114)
at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:1122)
at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$0(IdeEventQueue.kt:382)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:422)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)
```
This doesn't break each time.
Contributor guide
Research direction
Start by tracing the Haskell rename handling for module export lists, then inspect the reported ConfigFileWatcherNotificationProvider.scala location around line 69 for the intermittent exception. Reproduce the example in an IntelliJ project and verify that renaming someFunc updates both the declaration and export list consistently without cancellation or a NullPointerException.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- haskell, scala
- Domain
- devtools, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100