Commit 1cd5a240 authored by Kenton Varda's avatar Kenton Varda

Avoid generating #includes for imports that are used only for their annotations.

parent dc51ed6b
...@@ -785,6 +785,8 @@ compileFile name decls annotations importMap = ...@@ -785,6 +785,8 @@ compileFile name decls annotations importMap =
{ fileName = name { fileName = name
, fileId = theId , fileId = theId
, fileImports = Map.elems importMap , fileImports = Map.elems importMap
, fileRuntimeImports =
Set.fromList $ map fileName $ concatMap descRuntimeImports members
, fileUsings = [d | DescUsing d <- members] , fileUsings = [d | DescUsing d <- members]
, fileConstants = [d | DescConstant d <- members] , fileConstants = [d | DescConstant d <- members]
, fileEnums = [d | DescEnum d <- members] , fileEnums = [d | DescEnum d <- members]
......
...@@ -30,6 +30,7 @@ import Data.FileEmbed(embedFile) ...@@ -30,6 +30,7 @@ import Data.FileEmbed(embedFile)
import Data.Word(Word8) import Data.Word(Word8)
import qualified Data.Digest.MD5 as MD5 import qualified Data.Digest.MD5 as MD5
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified Data.Set as Set
import Data.Maybe(catMaybes, fromMaybe) import Data.Maybe(catMaybes, fromMaybe)
import Data.Binary.IEEE754(floatToWord, doubleToWord) import Data.Binary.IEEE754(floatToWord, doubleToWord)
import Text.Printf(printf) import Text.Printf(printf)
...@@ -320,6 +321,8 @@ fileContext desc = mkStrContext context where ...@@ -320,6 +321,8 @@ fileContext desc = mkStrContext context where
namespace = maybe [] (splitOn "::") $ fileNamespace desc namespace = maybe [] (splitOn "::") $ fileNamespace desc
isImportUsed (_, dep) = Set.member (fileName dep) (fileRuntimeImports desc)
context "fileName" = MuVariable $ fileName desc context "fileName" = MuVariable $ fileName desc
context "fileBasename" = MuVariable $ takeBaseName $ fileName desc context "fileBasename" = MuVariable $ takeBaseName $ fileName desc
context "fileIncludeGuard" = MuVariable $ context "fileIncludeGuard" = MuVariable $
...@@ -327,7 +330,8 @@ fileContext desc = mkStrContext context where ...@@ -327,7 +330,8 @@ fileContext desc = mkStrContext context where
context "fileNamespaces" = MuList $ map (namespaceContext context) namespace context "fileNamespaces" = MuList $ map (namespaceContext context) namespace
context "fileEnums" = MuList $ map (enumContext context) $ fileEnums desc context "fileEnums" = MuList $ map (enumContext context) $ fileEnums desc
context "fileTypes" = MuList $ map (typeContext context) flattenedMembers context "fileTypes" = MuList $ map (typeContext context) flattenedMembers
context "fileImports" = MuList $ map (importContext context) $ Map.keys $ fileImportMap desc context "fileImports" = MuList $ map (importContext context . fst)
$ filter isImportUsed $ Map.toList $ fileImportMap desc
context s = error ("Template variable not defined: " ++ s) context s = error ("Template variable not defined: " ++ s)
headerTemplate :: String headerTemplate :: String
......
...@@ -113,6 +113,9 @@ descParent (DescBuiltinType _) = error "Builtin type has no parent." ...@@ -113,6 +113,9 @@ descParent (DescBuiltinType _) = error "Builtin type has no parent."
descParent DescBuiltinList = error "Builtin type has no parent." descParent DescBuiltinList = error "Builtin type has no parent."
descParent DescBuiltinId = error "Builtin annotation has no parent." descParent DescBuiltinId = error "Builtin annotation has no parent."
descFile (DescFile d) = d
descFile desc = descFile $ descParent desc
descAnnotations (DescFile d) = fileAnnotations d descAnnotations (DescFile d) = fileAnnotations d
descAnnotations (DescUsing _) = Map.empty descAnnotations (DescUsing _) = Map.empty
descAnnotations (DescConstant d) = constantAnnotations d descAnnotations (DescConstant d) = constantAnnotations d
...@@ -129,6 +132,22 @@ descAnnotations (DescBuiltinType _) = Map.empty ...@@ -129,6 +132,22 @@ descAnnotations (DescBuiltinType _) = Map.empty
descAnnotations DescBuiltinList = Map.empty descAnnotations DescBuiltinList = Map.empty
descAnnotations DescBuiltinId = Map.empty descAnnotations DescBuiltinId = Map.empty
descRuntimeImports (DescFile d) = error "Not to be called on files."
descRuntimeImports (DescUsing d) = usingRuntimeImports d
descRuntimeImports (DescConstant d) = constantRuntimeImports d
descRuntimeImports (DescEnum d) = enumRuntimeImports d
descRuntimeImports (DescEnumerant d) = enumerantRuntimeImports d
descRuntimeImports (DescStruct d) = structRuntimeImports d
descRuntimeImports (DescUnion d) = unionRuntimeImports d
descRuntimeImports (DescField d) = fieldRuntimeImports d
descRuntimeImports (DescInterface d) = interfaceRuntimeImports d
descRuntimeImports (DescMethod d) = methodRuntimeImports d
descRuntimeImports (DescParam d) = paramRuntimeImports d
descRuntimeImports (DescAnnotation d) = annotationRuntimeImports d
descRuntimeImports (DescBuiltinType _) = []
descRuntimeImports DescBuiltinList = []
descRuntimeImports DescBuiltinId = []
type MemberMap = Map.Map String (Maybe Desc) type MemberMap = Map.Map String (Maybe Desc)
lookupMember :: String -> MemberMap -> Maybe Desc lookupMember :: String -> MemberMap -> Maybe Desc
...@@ -196,6 +215,12 @@ data TypeDesc = BuiltinType BuiltinType ...@@ -196,6 +215,12 @@ data TypeDesc = BuiltinType BuiltinType
| InterfaceType InterfaceDesc | InterfaceType InterfaceDesc
| ListType TypeDesc | ListType TypeDesc
typeRuntimeImports (BuiltinType _) = []
typeRuntimeImports (EnumType d) = [descFile (DescEnum d)]
typeRuntimeImports (StructType d) = [descFile (DescStruct d)]
typeRuntimeImports (InterfaceType d) = [descFile (DescInterface d)]
typeRuntimeImports (ListType d) = typeRuntimeImports d
data PackingState = PackingState data PackingState = PackingState
{ packingHole1 :: Integer { packingHole1 :: Integer
, packingHole8 :: Integer , packingHole8 :: Integer
...@@ -307,6 +332,9 @@ data FileDesc = FileDesc ...@@ -307,6 +332,9 @@ data FileDesc = FileDesc
{ fileName :: String { fileName :: String
, fileId :: Maybe String , fileId :: Maybe String
, fileImports :: [FileDesc] , fileImports :: [FileDesc]
-- Set of imports which are used at runtime, i.e. not just for annotations.
-- The set contains file names matching files in fileImports.
, fileRuntimeImports :: Set.Set String
, fileUsings :: [UsingDesc] , fileUsings :: [UsingDesc]
, fileConstants :: [ConstantDesc] , fileConstants :: [ConstantDesc]
, fileEnums :: [EnumDesc] , fileEnums :: [EnumDesc]
...@@ -324,6 +352,8 @@ data UsingDesc = UsingDesc ...@@ -324,6 +352,8 @@ data UsingDesc = UsingDesc
, usingTarget :: Desc , usingTarget :: Desc
} }
usingRuntimeImports _ = []
data ConstantDesc = ConstantDesc data ConstantDesc = ConstantDesc
{ constantName :: String { constantName :: String
, constantId :: Maybe String , constantId :: Maybe String
...@@ -333,6 +363,8 @@ data ConstantDesc = ConstantDesc ...@@ -333,6 +363,8 @@ data ConstantDesc = ConstantDesc
, constantValue :: ValueDesc , constantValue :: ValueDesc
} }
constantRuntimeImports desc = typeRuntimeImports $ constantType desc
data EnumDesc = EnumDesc data EnumDesc = EnumDesc
{ enumName :: String { enumName :: String
, enumId :: Maybe String , enumId :: Maybe String
...@@ -343,6 +375,8 @@ data EnumDesc = EnumDesc ...@@ -343,6 +375,8 @@ data EnumDesc = EnumDesc
, enumStatements :: [Desc] , enumStatements :: [Desc]
} }
enumRuntimeImports desc = concatMap descRuntimeImports $ enumStatements desc
data EnumerantDesc = EnumerantDesc data EnumerantDesc = EnumerantDesc
{ enumerantName :: String { enumerantName :: String
, enumerantId :: Maybe String , enumerantId :: Maybe String
...@@ -351,6 +385,8 @@ data EnumerantDesc = EnumerantDesc ...@@ -351,6 +385,8 @@ data EnumerantDesc = EnumerantDesc
, enumerantAnnotations :: AnnotationMap , enumerantAnnotations :: AnnotationMap
} }
enumerantRuntimeImports _ = []
data StructDesc = StructDesc data StructDesc = StructDesc
{ structName :: String { structName :: String
, structId :: Maybe String , structId :: Maybe String
...@@ -373,6 +409,8 @@ data StructDesc = StructDesc ...@@ -373,6 +409,8 @@ data StructDesc = StructDesc
, structFieldPackingMap :: Map.Map Integer (Integer, PackingState) , structFieldPackingMap :: Map.Map Integer (Integer, PackingState)
} }
structRuntimeImports desc = concatMap descRuntimeImports $ structStatements desc
data UnionDesc = UnionDesc data UnionDesc = UnionDesc
{ unionName :: String { unionName :: String
, unionId :: Maybe String , unionId :: Maybe String
...@@ -389,6 +427,8 @@ data UnionDesc = UnionDesc ...@@ -389,6 +427,8 @@ data UnionDesc = UnionDesc
, unionFieldDiscriminantMap :: Map.Map Integer Integer , unionFieldDiscriminantMap :: Map.Map Integer Integer
} }
unionRuntimeImports desc = concatMap descRuntimeImports $ unionStatements desc
data FieldDesc = FieldDesc data FieldDesc = FieldDesc
{ fieldName :: String { fieldName :: String
, fieldId :: Maybe String , fieldId :: Maybe String
...@@ -402,6 +442,8 @@ data FieldDesc = FieldDesc ...@@ -402,6 +442,8 @@ data FieldDesc = FieldDesc
, fieldAnnotations :: AnnotationMap , fieldAnnotations :: AnnotationMap
} }
fieldRuntimeImports desc = typeRuntimeImports $ fieldType desc
data InterfaceDesc = InterfaceDesc data InterfaceDesc = InterfaceDesc
{ interfaceName :: String { interfaceName :: String
, interfaceId :: Maybe String , interfaceId :: Maybe String
...@@ -417,6 +459,8 @@ data InterfaceDesc = InterfaceDesc ...@@ -417,6 +459,8 @@ data InterfaceDesc = InterfaceDesc
, interfaceStatements :: [Desc] , interfaceStatements :: [Desc]
} }
interfaceRuntimeImports desc = concatMap descRuntimeImports $ interfaceStatements desc
data MethodDesc = MethodDesc data MethodDesc = MethodDesc
{ methodName :: String { methodName :: String
, methodId :: Maybe String , methodId :: Maybe String
...@@ -427,6 +471,9 @@ data MethodDesc = MethodDesc ...@@ -427,6 +471,9 @@ data MethodDesc = MethodDesc
, methodAnnotations :: AnnotationMap , methodAnnotations :: AnnotationMap
} }
methodRuntimeImports desc = typeRuntimeImports (methodReturnType desc) ++
concatMap paramRuntimeImports (methodParams desc)
data ParamDesc = ParamDesc data ParamDesc = ParamDesc
{ paramName :: String { paramName :: String
, paramId :: Maybe String , paramId :: Maybe String
...@@ -437,6 +484,8 @@ data ParamDesc = ParamDesc ...@@ -437,6 +484,8 @@ data ParamDesc = ParamDesc
, paramAnnotations :: AnnotationMap , paramAnnotations :: AnnotationMap
} }
paramRuntimeImports desc = typeRuntimeImports $ paramType desc
data AnnotationDesc = AnnotationDesc data AnnotationDesc = AnnotationDesc
{ annotationName :: String { annotationName :: String
, annotationParent :: Desc , annotationParent :: Desc
...@@ -446,6 +495,8 @@ data AnnotationDesc = AnnotationDesc ...@@ -446,6 +495,8 @@ data AnnotationDesc = AnnotationDesc
, annotationTargets :: Set.Set AnnotationTarget , annotationTargets :: Set.Set AnnotationTarget
} }
annotationRuntimeImports desc = typeRuntimeImports $ annotationType desc
type AnnotationMap = Map.Map String (AnnotationDesc, ValueDesc) type AnnotationMap = Map.Map String (AnnotationDesc, ValueDesc)
descToCode :: String -> Desc -> String descToCode :: String -> Desc -> String
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment