LibName.hs revision 9005b07df2277a9fefca6868cd00c1c39533a9fb
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 , VersionNumber (VersionNumber)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , LinkPath (LinkPath)
33f5512f0538c5ec4141205a8440ff6ba9e96139Christian Maeder , isQualNameFrom
002961cfb5c53204887101239d2a47c83d596585Christian Maeder , filePathToIri
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
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder { getLibId :: IRI
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , libIdRange :: Range -- start of getLibId
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , locIRI :: Maybe IRI
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder , libVersion :: Maybe VersionNumber }
002961cfb5c53204887101239d2a47c83d596585Christian MaedeririLibName :: IRI -> LibName
002961cfb5c53204887101239d2a47c83d596585Christian MaedeririLibName i = LibName i nullRange Nothing Nothing
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian MaederemptyLibName :: String -> LibName
002961cfb5c53204887101239d2a47c83d596585Christian MaederemptyLibName s = iriLibName .
b7bba589fb78fe61379de93d531556c00da36cd9Christian Maeder fromMaybe (if null s then nullIRI else error $ "emptyLibName: " ++ s)
b7bba589fb78fe61379de93d531556c00da36cd9Christian Maeder $ parseIRIManchester s
002961cfb5c53204887101239d2a47c83d596585Christian MaederfilePathToIri :: FilePath -> IRI
9005b07df2277a9fefca6868cd00c1c39533a9fbChristian MaederfilePathToIri fp = maybe (error $ "filePathToIri: " ++ fp) (setAnkles True)
9005b07df2277a9fefca6868cd00c1c39533a9fbChristian Maeder . parseIRIReference $ escapeIRIString isUnescapedInIRI fp
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath :: FilePath -> LibName -> LibName
1596a4d2cc01bff500afdd3789a43ec93210e81fChristian MaedersetFilePath fp ln =
002961cfb5c53204887101239d2a47c83d596585Christian Maeder ln { locIRI = Just $ filePathToIri fp }
fbc1e851413f39999a00a0d3be0edf75bbf42007Ewaryst SchulzgetFilePath :: LibName -> FilePath
db6729e623b4053149084ccf4b35e5308ac7e359Christian MaedergetFilePath = maybe "" iriToStringUnsecure . locIRI
b410420153cc9ac37fb4ebb86699cba7fa19bc35Christian Maederdata VersionNumber = VersionNumber [String] Range
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder -- pos: "version", start of first string
e49fd57c63845c7806860a9736ad09f6d44dbaedChristian Maederinstance GetRange LibName where
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder getRange = libIdRange
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]
db6729e623b4053149084ccf4b35e5308ac7e359Christian MaederprettyLibName ln =
db6729e623b4053149084ccf4b35e5308ac7e359Christian Maeder pretty (getLibId ln) : maybe [] prettyVersionNumber (libVersion ln)
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
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