LibName.hs revision 720eeee7c9d8442093c8d05bed743193eee906e0
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder{- |
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederModule : $Header$
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederDescription : library names for HetCASL and development graphs
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederCopyright : (c) Christian Maeder, DFKI GmbH 2008
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : GPLv2 or higher, see LICENSE.txt
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederMaintainer : Christian.Maeder@dfki.de
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederStability : provisional
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederPortability : portable
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederAbstract syntax of HetCASL specification libraries
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Follows Sect. II:2.2.5 of the CASL Reference Manual.
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder-}
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maedermodule Common.LibName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder ( LibName (LibName)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , LibId (IndirectLink)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , VersionNumber (VersionNumber)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , LinkPath (LinkPath)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , SLinkPath
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , isQualNameFrom
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , isQualName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , mkQualName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , unQualName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , setFilePath
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , getFilePath
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , emptyLibName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , convertFileToLibStr
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , getLibId
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , mkLibStr
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder ) where
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.Doc
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.DocUtils
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport Common.Id
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Common.Keywords
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maederimport Common.Utils
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maederimport Data.Char
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maederimport Data.List
a43c1a7fa08c12524415386aa13a566cc9e53a4fChristian Maederimport Data.Ord
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maederimport System.FilePath
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs :: [Token]
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs = [genToken "OM"]
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaedermkQualName :: SIMPLE_ID -> LibName -> Id -> Id
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaedermkQualName nodeId ln i =
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder Id omTs [i, simpleIdToId nodeId, libNameToId ln] $ posOfId i
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederisQualNameFrom :: SIMPLE_ID -> LibName -> Id -> Bool
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederisQualNameFrom nodeId ln i@(Id _ cs _) = case cs of
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ : n : l : _ | isQualName i ->
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder n == simpleIdToId nodeId && libNameToId ln == l
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ -> True
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName :: Id -> Bool
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName (Id ts cs _) = case cs of
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder _ : _ : _ -> ts == omTs
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder _ -> False
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName :: Id -> Id
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName j@(Id _ cs _) = case cs of
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder i : _ | isQualName j -> i
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder _ -> j
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederlibNameToId :: LibName -> Id
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaederlibNameToId ln = let
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder path = splitOn '/' . show $ getLibId ln
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder toTok s = Token s $ getRange ln
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder in mkId $ map toTok $ intersperse "/" path
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederdata LibName = LibName
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maeder { getLibId :: LibId
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , _libVersion :: Maybe VersionNumber }
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian MaederemptyLibName :: String -> LibName
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaederemptyLibName s = LibName (IndirectLink s nullRange "") Nothing
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maeder
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maederdata LibId = IndirectLink PATH Range FilePath
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: start of PATH
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaederupdFilePathOfLibId :: FilePath -> LibId -> LibId
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaederupdFilePathOfLibId fp (IndirectLink p r _) = IndirectLink p r fp
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath :: FilePath -> LibName -> LibName
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath fp ln =
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder ln { getLibId = updFilePathOfLibId fp $ getLibId ln }
429df04296fa571432f62cbfad6855e1420e0fd6Christian Maeder
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst SchulzgetFilePath :: LibName -> FilePath
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst SchulzgetFilePath ln =
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst Schulz case getLibId ln of
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder IndirectLink _ _ fp -> fp
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst Schulz
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maederdata VersionNumber = VersionNumber [String] Range
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: "version", start of first string
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maedertype PATH = String
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance GetRange LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder getRange (IndirectLink _ r _) = r
92dc581bf568c9e225aa9d0570ab0a4b6ebdab69Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Show LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder show (IndirectLink s1 _ _) = s1
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance GetRange LibName where
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maeder getRange = getRange . getLibId
14d7908303969441ba30c2748de45f20345c6b31Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Show LibName where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder show = show . hsep . prettyLibName
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maeder
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian MaederprettyVersionNumber :: VersionNumber -> [Doc]
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian MaederprettyVersionNumber (VersionNumber v _) =
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maeder [keyword versionS, hcat $ punctuate dot $ map codeToken v]
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian MaederprettyLibName :: LibName -> [Doc]
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian MaederprettyLibName (LibName i mv) = pretty i : case mv of
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder Nothing -> []
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder Just v -> prettyVersionNumber v
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Eq LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder IndirectLink s1 _ _ == IndirectLink s2 _ _ = s1 == s2
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Ord LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder IndirectLink s1 _ _ <= IndirectLink s2 _ _ = s1 <= s2
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Eq LibName where
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder ln1 == ln2 = compare ln1 ln2 == EQ
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Ord LibName where
a43c1a7fa08c12524415386aa13a566cc9e53a4fChristian Maeder compare = comparing getLibId
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Pretty LibName where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder pretty = fsep . prettyLibName
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Pretty LibId where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder pretty = structId . show
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maederdata LinkPath a = LinkPath a [(LibName, Int)] deriving (Ord, Eq)
e2e5830e2562de2f9a7daa31704fca25285180f0Ewaryst Schulz
831b0d8f47480be51d14f2cf122913507859f9c3Ewaryst Schulztype SLinkPath = LinkPath String
831b0d8f47480be51d14f2cf122913507859f9c3Ewaryst Schulz
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederconvertFileToLibStr :: FilePath -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederconvertFileToLibStr = mkLibStr . takeBaseName
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederstripLibChars :: String -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederstripLibChars = filter (\ c -> isAlphaNum c || elem c "'_/")
8acac20a235839e60ea2d43709fce47de1c68bc1Christian Maeder
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaedermkLibStr :: String -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaedermkLibStr = dropWhile (== '/') . stripLibChars