summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2021-09-27 16:24:57 +0100
committerMatthew Pickering <matthewtpickering@gmail.com>2021-09-27 16:29:53 +0100
commita05bb1d6a1d963d14cb0bafade1e7c1072ac94a5 (patch)
treea716abfdb348a879914f7ef9401a6a9ae3cb080f
parent33eb4a4e396e76cf8122a97734d0e8cdd850c747 (diff)
downloadhaskell-wip/t20417.tar.gz
Recompilation: Handle -plugin-package correctlywip/t20417
If a plugins was specified using the -plugin-package-(id) flag then the module it applied to was always recompiled. The recompilation checker was previously using `findImportedModule`, which looked for packages in the HPT and then in the package database but only for modules specified using `-package`. The correct lookup function for plugins is `findPluginModule`, therefore we check normal imports with `findImportedModule` and plugins with `findPluginModule`. Fixes #20417
-rw-r--r--compiler/GHC/Iface/Recomp.hs14
-rw-r--r--testsuite/tests/plugins/Makefile6
-rw-r--r--testsuite/tests/plugins/T20417.stderr3
-rw-r--r--testsuite/tests/plugins/all.T7
4 files changed, 25 insertions, 5 deletions
diff --git a/compiler/GHC/Iface/Recomp.hs b/compiler/GHC/Iface/Recomp.hs
index 4cc03d488d..6bbf8f58cb 100644
--- a/compiler/GHC/Iface/Recomp.hs
+++ b/compiler/GHC/Iface/Recomp.hs
@@ -506,11 +506,9 @@ checkMergedSignatures hsc_env mod_summary iface = do
checkDependencies :: HscEnv -> ModSummary -> ModIface -> IfG RecompileRequired
checkDependencies hsc_env summary iface
= do
- res <- liftIO $ traverse (\(mb_pkg, L _ mod) ->
- let reason = ModuleChanged mod
- in classify reason <$> findImportedModule fc fopts units home_unit mod (mb_pkg))
- (ms_imps summary ++ ms_srcimps summary)
- case sequence (res ++ [Right (fake_ghc_prim_import)| ms_ghc_prim_import summary]) of
+ res_normal <- classify_import (findImportedModule fc fopts units home_unit) (ms_textual_imps summary ++ ms_srcimps summary)
+ res_plugin <- classify_import (\mod _ -> findPluginModule fc fopts units home_unit mod) (ms_plugin_imps summary)
+ case sequence (res_normal ++ res_plugin ++ [Right (fake_ghc_prim_import)| ms_ghc_prim_import summary]) of
Left recomp -> return recomp
Right es -> do
let (hs, ps) = partitionEithers es
@@ -520,6 +518,12 @@ checkDependencies hsc_env summary iface
res2 <- liftIO $ check_packages allPkgDeps prev_dep_pkgs
return (res1 `mappend` res2)
where
+
+ classify_import find_import imports =
+ liftIO $ traverse (\(mb_pkg, L _ mod) ->
+ let reason = ModuleChanged mod
+ in classify reason <$> find_import mod mb_pkg)
+ imports
dflags = hsc_dflags hsc_env
fopts = initFinderOpts dflags
logger = hsc_logger hsc_env
diff --git a/testsuite/tests/plugins/Makefile b/testsuite/tests/plugins/Makefile
index e242a0a387..710cf827ec 100644
--- a/testsuite/tests/plugins/Makefile
+++ b/testsuite/tests/plugins/Makefile
@@ -146,3 +146,9 @@ plugin-recomp-change-2:
"$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs PluginRecompTest.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -fplugin PurePlugin
"$(MAKE)" -s --no-print-directory -C plugin-recomp package.plugins01 TOP=$(TOP) RUN=-DRUN2
"$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs PluginRecompTest.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -fplugin PurePlugin
+
+# Shouldn't recompile the module because the plugin is pure and nothing changed.
+.PHONY: T20417
+T20417:
+ "$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -hide-all-packages -package base -plugin-package plugin-recompilation-0.1 -fplugin PurePlugin
+ "$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -hide-all-packages -package base -plugin-package plugin-recompilation-0.1 -fplugin PurePlugin
diff --git a/testsuite/tests/plugins/T20417.stderr b/testsuite/tests/plugins/T20417.stderr
new file mode 100644
index 0000000000..84e15cfa91
--- /dev/null
+++ b/testsuite/tests/plugins/T20417.stderr
@@ -0,0 +1,3 @@
+Simple Plugin Passes Queried
+Got options:
+Simple Plugin Pass Run
diff --git a/testsuite/tests/plugins/all.T b/testsuite/tests/plugins/all.T
index fc0abca043..0242ab7d93 100644
--- a/testsuite/tests/plugins/all.T
+++ b/testsuite/tests/plugins/all.T
@@ -240,3 +240,10 @@ test('plugin-recomp-change-2',
pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}')
],
makefile_test, [])
+
+test('T20417',
+ [extra_files(['plugin-recomp/', 'plugin-recomp-test.hs']),
+ only_ways([config.ghc_plugin_way]),
+ pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}')
+ ],
+ makefile_test, [])