LibName.hs revision 720eeee7c9d8442093c8d05bed743193eee906e0
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 MaederAbstract syntax of HetCASL specification libraries
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder Follows Sect. II:2.2.5 of the CASL Reference Manual.
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder ( LibName (LibName)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , LibId (IndirectLink)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , VersionNumber (VersionNumber)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , LinkPath (LinkPath)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , isQualNameFrom
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , setFilePath
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , getFilePath
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , emptyLibName
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , convertFileToLibStr
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs :: [Token]
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederomTs = [genToken "OM"]
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaedermkQualName :: SIMPLE_ID -> LibName -> Id -> Id
720eeee7c9d8442093c8d05bed743193eee906e0Christian MaedermkQualName nodeId ln i =
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maeder Id omTs [i, simpleIdToId nodeId, libNameToId ln] $ posOfId i
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
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName :: Id -> Bool
0789323dfca89bae8f710da5bba20220b9af2feaChristian MaederisQualName (Id ts cs _) = case cs of
0789323dfca89bae8f710da5bba20220b9af2feaChristian Maeder _ : _ : _ -> ts == omTs
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName :: Id -> Id
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian MaederunQualName j@(Id _ cs _) = case cs of
5dc46f6d0fdd8747d730f9e79a93978145ed43bbChristian Maeder i : _ | isQualName j -> i
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
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederdata LibName = LibName
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maeder { getLibId :: LibId
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , _libVersion :: Maybe VersionNumber }
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian MaederemptyLibName :: String -> LibName
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaederemptyLibName s = LibName (IndirectLink s nullRange "") Nothing
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maederdata LibId = IndirectLink PATH Range FilePath
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: start of PATH
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaederupdFilePathOfLibId :: FilePath -> LibId -> LibId
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaederupdFilePathOfLibId fp (IndirectLink p r _) = IndirectLink p r fp
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath :: FilePath -> LibName -> LibName
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath fp ln =
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder ln { getLibId = updFilePathOfLibId fp $ getLibId ln }
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst SchulzgetFilePath :: LibName -> FilePath
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst SchulzgetFilePath ln =
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst Schulz case getLibId ln of
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder IndirectLink _ _ fp -> fp
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maederdata VersionNumber = VersionNumber [String] Range
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: "version", start of first string
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maedertype PATH = String
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance GetRange LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder getRange (IndirectLink _ r _) = r
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Show LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder show (IndirectLink s1 _ _) = s1
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance GetRange LibName where
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maeder getRange = getRange . getLibId
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Show LibName where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder show = show . hsep . prettyLibName
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian MaederprettyVersionNumber :: VersionNumber -> [Doc]
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian MaederprettyVersionNumber (VersionNumber v _) =
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maeder [keyword versionS, hcat $ punctuate dot $ map codeToken v]
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian MaederprettyLibName :: LibName -> [Doc]
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian MaederprettyLibName (LibName i mv) = pretty i : case mv of
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder Nothing -> []
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder Just v -> prettyVersionNumber v
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Eq LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder IndirectLink s1 _ _ == IndirectLink s2 _ _ = s1 == s2
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Ord LibId where
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian Maeder IndirectLink s1 _ _ <= IndirectLink s2 _ _ = s1 <= s2
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Eq LibName where
248ab4f138caa9a594cd3fe0815e7fd4150701efChristian Maeder ln1 == ln2 = compare ln1 ln2 == EQ
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Ord LibName where
a43c1a7fa08c12524415386aa13a566cc9e53a4fChristian Maeder compare = comparing getLibId
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Pretty LibName where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder pretty = fsep . prettyLibName
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance Pretty LibId where
54a535fb81b928ac8f99a11bdcfa8998533204a5Christian Maeder pretty = structId . show
720eeee7c9d8442093c8d05bed743193eee906e0Christian Maederdata LinkPath a = LinkPath a [(LibName, Int)] deriving (Ord, Eq)
831b0d8f47480be51d14f2cf122913507859f9c3Ewaryst Schulztype SLinkPath = LinkPath String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederconvertFileToLibStr :: FilePath -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederconvertFileToLibStr = mkLibStr . takeBaseName
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederstripLibChars :: String -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaederstripLibChars = filter (\ c -> isAlphaNum c || elem c "'_/")
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaedermkLibStr :: String -> String
8acac20a235839e60ea2d43709fce47de1c68bc1Christian MaedermkLibStr = dropWhile (== '/') . stripLibChars