2013-07-28 71 views
6

在模塊B我有一個鏈接'A.foo'鏈接到模塊Afoo成員的文檔。在模塊A中,我導入模塊B。 Haddock將其作爲A.html#t:foo的鏈接,即指向類型foo(不存在)而不是函數foo,它位於A.html#v:foo鱈魚鏈接到非導入模塊中的功能

  • 爲什麼Haddock鏈接到t:的變量以小寫字母開頭?這是一個錯誤?對於'A.Foo'我可以看到它可能是一個類型或構造函數,所以存在命名空間問題。對於foo,似乎一個變量至少是最合理的。
  • 有什麼辦法可以僞造一個鏈接?我在代碼示例中寫這個,所以我需要將它呈現爲foo。我嘗試了錨點,但它們作爲模塊名稱呈現,而對於直接超鏈接,您無法控制顯示的文本。
  • 我認爲一個後處理器(替換t:[a-z]v:),但這需要一個自定義的Setup.hs導致問題,是相當醜陋的。
  • 我找不到任何Haddock命令行標誌來獲得更合理的行爲,例如指定foo是一個變量。
  • 我無法添加導入AB而沒有引入循環導入,這純粹是爲了文檔而添加的。

我遇到了這個問題在Shake documentation,其中作爲一個例子removeFilesAfter沒有得到正確的鏈接。

回答

2

這是一個Haddock bug #228和尼爾的Haddock bug #253和解決方案已經上游了幾個月。您可以構建GHC HEAD並重建文檔或等待7.8然後完成。

4

我可以部分回答第一個問題(爲什麼?);不知道它是一個錯誤或期望的行爲。

當haddock解析LexParseRn.rename中的引用時,它會嘗試在環境中查找標識符(通過lookupGRE_RdrName)。這應該失敗。接下來它看起來像什麼可能的意思是(使用dataTcOccs from GHC’s RnEnv)。相關的線路有:

dataTcOccs :: RdrName -> [RdrName] 
-- Return both the given name and the same name promoted to the TcClsName 
-- namespace. This is useful when we aren't sure which we are looking at. 
dataTcOccs rdr_name 
    [...] 
    | isDataOcc occ || isVarOcc occ 
    = [rdr_name, rdr_name_tc] 
    [...] 
    where 
    occ = rdrNameOcc rdr_name 
    rdr_name_tc = setRdrNameSpace rdr_name tcName 

所以它返回名稱第一個解釋爲不管它是什麼之前(可能是一個鏈接到一個值),然後解釋爲一個類型構造。一個常規名稱如何成爲一個類型構造函數?我的猜測是,當TypeOperators在GHC 7.6中進行重組時,這個增加了,它現在與名稱空間共享值級運算符。

然後haddock匹配結果:如果第一個是類型構造函數,則使用該構造函數,否則使用第二個。所以無論是之前的類型構造函數,都會使用它。或者它不是,但那麼將使用由dataTcOccs生成的修改版本。

在我看來,haddock應該總是使用這裏的第一個選項,而代碼僅僅是一個誤導性的副本,從實際上可以解決多個結果的使用方式。

+1

非常好的分析,任何你可以提交上游補丁的機會? –

+0

我只知道*代碼如何以這種方式工作,而不是*爲什麼*,這可能是一個很好的理由。但我想你可以打開一個錯誤報告並在這裏指出它們,以便他們知道他們需要考慮哪些代碼。 –

+0

我有一堆開放的哈多克蟲(至少6我的計數),從來沒有任何反應 - 它似乎他們並不在乎... –