[commit: ghc] master: Ignore comments in getOptions (5d6133b)

git at git.haskell.org git at git.haskell.org
Thu Nov 12 19:34:37 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/5d6133bec0f682e86ee31bbdb6d82e6fb2ede8f7/ghc

>---------------------------------------------------------------

commit 5d6133bec0f682e86ee31bbdb6d82e6fb2ede8f7
Author: Matthew Pickering <matthewtpickering at gmail.com>
Date:   Thu Nov 12 20:33:39 2015 +0100

    Ignore comments in getOptions
    
    When Opt_KeepRawTokenStream is turned on then getOptions fails to find
    the language pragmas which can cause unexpected parse errors when using
    the GHC API. A simple solution is to make it skip over any comments in
    the token
    stream.
    
    Test Plan: ./validate
    
    Reviewers: austin, bgamari
    
    Subscribers: alanz, thomie
    
    Differential Revision: https://phabricator.haskell.org/D1444
    
    GHC Trac Issues: #10942


>---------------------------------------------------------------

5d6133bec0f682e86ee31bbdb6d82e6fb2ede8f7
 compiler/main/HeaderInfo.hs           | 14 ++++++++++++++
 testsuite/tests/ghc-api/T10942.hs     | 22 ++++++++++++++++++++++
 testsuite/tests/ghc-api/T10942.stdout |  1 +
 testsuite/tests/ghc-api/T10942_A.hs   | 16 ++++++++++++++++
 testsuite/tests/ghc-api/all.T         |  3 +++
 5 files changed, 56 insertions(+)

diff --git a/compiler/main/HeaderInfo.hs b/compiler/main/HeaderInfo.hs
index 08c7619..35107c8 100644
--- a/compiler/main/HeaderInfo.hs
+++ b/compiler/main/HeaderInfo.hs
@@ -256,6 +256,9 @@ getOptions' dflags toks
           parseToks (open:xs)
               | ITlanguage_prag <- getToken open
               = parseLanguage xs
+          parseToks (comment:xs) -- Skip over comments
+              | isComment (getToken comment)
+              = parseToks xs
           parseToks _ = []
           parseLanguage (L loc (ITconid fs):rest)
               = checkExtension dflags (L loc fs) :
@@ -269,6 +272,17 @@ getOptions' dflags toks
           parseLanguage []
               = panic "getOptions'.parseLanguage(2) went past eof token"
 
+          isComment :: Token -> Bool
+          isComment c =
+            case c of
+              (ITlineComment {})     -> True
+              (ITblockComment {})    -> True
+              (ITdocCommentNext {})  -> True
+              (ITdocCommentPrev {})  -> True
+              (ITdocCommentNamed {}) -> True
+              (ITdocSection {})      -> True
+              _                      -> False
+
 -----------------------------------------------------------------------------
 
 -- | Complain about non-dynamic flags in OPTIONS pragmas.
diff --git a/testsuite/tests/ghc-api/T10942.hs b/testsuite/tests/ghc-api/T10942.hs
new file mode 100644
index 0000000..6fbf1d5
--- /dev/null
+++ b/testsuite/tests/ghc-api/T10942.hs
@@ -0,0 +1,22 @@
+module Main where
+
+import DynFlags
+import GHC
+
+import Control.Monad.IO.Class (liftIO)
+import System.Environment
+import HeaderInfo
+import Outputable
+import StringBuffer
+
+main :: IO ()
+main = do
+  [libdir] <- getArgs
+  runGhc (Just libdir) $ do
+    dflags <- getSessionDynFlags
+    let dflags' = dflags `gopt_set` Opt_KeepRawTokenStream
+                         `gopt_set` Opt_Haddock
+        filename = "T10942_A.hs"
+    setSessionDynFlags dflags'
+    stringBuffer <- liftIO $ hGetStringBuffer filename
+    liftIO $ print (map unLoc (getOptions dflags' stringBuffer filename))
diff --git a/testsuite/tests/ghc-api/T10942.stdout b/testsuite/tests/ghc-api/T10942.stdout
new file mode 100644
index 0000000..40ead27
--- /dev/null
+++ b/testsuite/tests/ghc-api/T10942.stdout
@@ -0,0 +1 @@
+["-XFlexibleInstances","-XCPP"]
diff --git a/testsuite/tests/ghc-api/T10942_A.hs b/testsuite/tests/ghc-api/T10942_A.hs
new file mode 100644
index 0000000..359961c
--- /dev/null
+++ b/testsuite/tests/ghc-api/T10942_A.hs
@@ -0,0 +1,16 @@
+{-
+
+A normal comment, to check if we can still pick up the CPP directive after it.
+
+-}
+-- Check that we can parse a file with leading comments
+
+-- ^ haddock
+-- * haddock
+-- | haddock
+-- $ haddock
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
+module T10942 where
+
+main = return ()
diff --git a/testsuite/tests/ghc-api/all.T b/testsuite/tests/ghc-api/all.T
index c4783ea..dee74b7 100644
--- a/testsuite/tests/ghc-api/all.T
+++ b/testsuite/tests/ghc-api/all.T
@@ -14,3 +14,6 @@ test('T9595', extra_run_opts('"' + config.libdir + '"'),
 test('T10508_api', extra_run_opts('"' + config.libdir + '"'),
                    compile_and_run,
                    ['-package ghc'])
+test('T10942', extra_run_opts('"' + config.libdir + '"'),
+                   compile_and_run,
+                   ['-package ghc'])



More information about the ghc-commits mailing list