Enable using qualified field of constructor in GHCi
authorZejun Wu <watashi@watashi.ws>
Fri, 3 Jul 2015 17:31:25 +0000 (19:31 +0200)
committerBen Gamari <ben@smart-cactus.org>
Fri, 3 Jul 2015 20:33:19 +0000 (22:33 +0200)
The -fimplicit-import-qualified made it possible to uses qualifed names
in GHCi without explicitly import the modules. But it didn't work for
field of constructor, this patch fixed this issue.

Test Plan:
cd testsuite/tests/rename/ && make
cd testsuite/tests/ghci/ && make

Reviewers: austin, simonpj

Reviewed By: austin, simonpj

Subscribers: bgamari, thomie

Differential Revision: https://phabricator.haskell.org/D900

GHC Trac Issues: #10439

compiler/rename/RnEnv.hs
testsuite/tests/ghci/scripts/T10439.script [new file with mode: 0644]
testsuite/tests/ghci/scripts/T10439.stdout [new file with mode: 0644]
testsuite/tests/ghci/scripts/all.T

index 3dcf2cc..73dfbeb 100644 (file)
@@ -482,8 +482,13 @@ lookupSubBndrOcc warnIfDeprec parent doc rdr_name
             [gre] -> do { addUsedRdrName warnIfDeprec gre (used_rdr_name gre)
                           -- Add a usage; this is an *occurrence* site
                         ; return (gre_name gre) }
-            []    -> do { addErr (unknownSubordinateErr doc rdr_name)
-                        ; return (mkUnboundName rdr_name) }
+            []    -> do { ns <- lookupQualifiedNameGHCi rdr_name
+                        ; case ns of {
+                                (n:_) -> return n ;
+                                -- Unlikely to be more than one...?
+                                [] -> do
+                        { addErr (unknownSubordinateErr doc rdr_name)
+                        ; return (mkUnboundName rdr_name) } } }
             gres  -> do { addNameClashErrRn rdr_name gres
                         ; return (gre_name (head gres)) } }
   where
diff --git a/testsuite/tests/ghci/scripts/T10439.script b/testsuite/tests/ghci/scripts/T10439.script
new file mode 100644 (file)
index 0000000..7f481ab
--- /dev/null
@@ -0,0 +1,6 @@
+let tree = Data.Tree.Node 0 []
+Data.Tree.rootLabel tree
+let f (Data.Tree.Node i j) k = Data.Tree.Node k j
+f tree 1
+let g i j = i { Data.Tree.rootLabel = j }
+g tree 2
diff --git a/testsuite/tests/ghci/scripts/T10439.stdout b/testsuite/tests/ghci/scripts/T10439.stdout
new file mode 100644 (file)
index 0000000..63a6be7
--- /dev/null
@@ -0,0 +1,3 @@
+0
+Node {rootLabel = 1, subForest = []}
+Node {rootLabel = 2, subForest = []}
index 384868e..aecadc4 100755 (executable)
@@ -219,6 +219,7 @@ test('T10408B', normal, run_command,
 test('T10248', normal, ghci_script, ['T10248.script'])
 test('T10110', normal, ghci_script, ['T10110.script'])
 test('T10322', normal, ghci_script, ['T10322.script'])
+test('T10439', normal, ghci_script, ['T10439.script'])
 test('T10466', normal, ghci_script, ['T10466.script'])
 test('T10501', normal, ghci_script, ['T10501.script'])
 test('T10508', normal, ghci_script, ['T10508.script'])