From 5d46cb211e9c6ea7e40836a8e3345cd39e7ce0a8 Mon Sep 17 00:00:00 2001 From: Patrick Thomson Date: Thu, 18 Oct 2018 13:50:07 -0400 Subject: [PATCH] Split up typescript grammar even more --- semantic.cabal | 2 + src/Language/TypeScript/Syntax.hs | 2 + src/Language/TypeScript/Syntax/Import.hs | 193 ++++++++++ src/Language/TypeScript/Syntax/TypeScript.hs | 348 ------------------- 4 files changed, 197 insertions(+), 348 deletions(-) create mode 100644 src/Language/TypeScript/Syntax/Import.hs diff --git a/semantic.cabal b/semantic.cabal index a228f3fdf..8f1b40393 100644 --- a/semantic.cabal +++ b/semantic.cabal @@ -153,9 +153,11 @@ library , Language.TypeScript.Grammar , Language.TypeScript.Resolution , Language.TypeScript.Syntax + , Language.TypeScript.Syntax.Import , Language.TypeScript.Syntax.JavaScript , Language.TypeScript.Syntax.JSX , Language.TypeScript.Syntax.TypeScript + , Language.TypeScript.Syntax.Types , Language.PHP.Assignment , Language.PHP.Grammar , Language.PHP.Syntax diff --git a/src/Language/TypeScript/Syntax.hs b/src/Language/TypeScript/Syntax.hs index a9ec2b50e..38a11de42 100644 --- a/src/Language/TypeScript/Syntax.hs +++ b/src/Language/TypeScript/Syntax.hs @@ -1,5 +1,7 @@ module Language.TypeScript.Syntax ( module X ) where +import Language.TypeScript.Syntax.Import as X import Language.TypeScript.Syntax.JavaScript as X import Language.TypeScript.Syntax.JSX as X import Language.TypeScript.Syntax.TypeScript as X +import Language.TypeScript.Syntax.Types as X diff --git a/src/Language/TypeScript/Syntax/Import.hs b/src/Language/TypeScript/Syntax/Import.hs new file mode 100644 index 000000000..e18bc339d --- /dev/null +++ b/src/Language/TypeScript/Syntax/Import.hs @@ -0,0 +1,193 @@ +{-# LANGUAGE DeriveAnyClass, DerivingStrategies, DuplicateRecordFields #-} +{-# OPTIONS_GHC -Wno-missing-export-lists #-} +module Language.TypeScript.Syntax.Import where + +import Prologue + +import Data.Aeson (ToJSON) +import qualified Data.Map.Strict as Map +import Data.Semigroup.App +import Data.Semigroup.Foldable +import qualified Data.Text as T +import Proto3.Suite + +import Control.Abstract hiding (Import) +import Data.Abstract.Evaluatable as Evaluatable +import qualified Data.Abstract.Name as Name +import qualified Data.Abstract.ScopeGraph as ScopeGraph +import Data.JSON.Fields +import Diffing.Algorithm +import Language.TypeScript.Resolution + +data Import a = Import { importSymbols :: ![Alias], importFrom :: ImportPath } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 Import where liftEq = genericLiftEq +instance Ord1 Import where liftCompare = genericLiftCompare +instance Show1 Import where liftShowsPrec = genericLiftShowsPrec + + -- http://www.typescriptlang.org/docs/handbook/module-resolution.html +instance Evaluatable Import where + eval _ _ (Import symbols importPath) = do + modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions + ((moduleScope, moduleFrame), _) <- require modulePath + if Prologue.null symbols then do + insertImportEdge moduleScope + insertFrameLink ScopeGraph.Import (Map.singleton moduleScope moduleFrame) + else do + let scopeEdges = Map.singleton ScopeGraph.Import [ moduleScope ] + scopeAddress <- newScope scopeEdges + let frameLinks = Map.singleton ScopeGraph.Import (Map.singleton moduleScope moduleFrame) + frameAddress <- newFrame scopeAddress frameLinks + + -- Insert import references into the import scope starting from the perspective of the import scope. + withScopeAndFrame moduleFrame $ do + for_ symbols $ \Alias{..} -> + insertImportReference (Reference aliasName) (Declaration aliasValue) scopeAddress + + -- Create edges from the current scope/frame to the import scope/frame. + insertImportEdge scopeAddress + insertFrameLink ScopeGraph.Import (Map.singleton scopeAddress frameAddress) + pure unit + +data QualifiedAliasedImport a = QualifiedAliasedImport { qualifiedAliasedImportAlias :: !a, qualifiedAliasedImportFrom :: ImportPath } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 QualifiedAliasedImport where liftEq = genericLiftEq +instance Ord1 QualifiedAliasedImport where liftCompare = genericLiftCompare +instance Show1 QualifiedAliasedImport where liftShowsPrec = genericLiftShowsPrec + +instance Evaluatable QualifiedAliasedImport where + eval _ _ (QualifiedAliasedImport aliasTerm importPath) = do + modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions + ((moduleScope, moduleFrame), _) <- require modulePath + span <- ask @Span + + importScope <- newScope (Map.singleton ScopeGraph.Import [ moduleScope ]) + let scopeMap = Map.singleton moduleScope moduleFrame + aliasFrame <- newFrame importScope (Map.singleton ScopeGraph.Import scopeMap) + + alias <- maybeM (throwNoNameError aliasTerm) (declaredName aliasTerm) + declare (Declaration alias) Default span (Just importScope) + aliasSlot <- lookupDeclaration (Declaration alias) + assign aliasSlot =<< object aliasFrame + + pure unit + + +newtype SideEffectImport a = SideEffectImport { sideEffectImportFrom :: ImportPath } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 SideEffectImport where liftEq = genericLiftEq +instance Ord1 SideEffectImport where liftCompare = genericLiftCompare +instance Show1 SideEffectImport where liftShowsPrec = genericLiftShowsPrec + +instance Evaluatable SideEffectImport where + eval _ _ (SideEffectImport importPath) = do + modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions + void $ require modulePath + pure unit + + +-- | Qualified Export declarations +newtype QualifiedExport a = QualifiedExport { qualifiedExportSymbols :: [Alias] } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 QualifiedExport where liftEq = genericLiftEq +instance Ord1 QualifiedExport where liftCompare = genericLiftCompare +instance Show1 QualifiedExport where liftShowsPrec = genericLiftShowsPrec + +instance Evaluatable QualifiedExport where + eval _ _ (QualifiedExport exportSymbols) = do + -- Create a Lexical edge from the qualifed export's scope to the current scope. + currentScopeAddress <- currentScope + let edges = Map.singleton Lexical [ currentScopeAddress ] + exportScope <- newScope edges + insertExportEdge exportScope -- Create an export edge from the current scope to the export scope + withScope exportScope . + for_ exportSymbols $ \Alias{..} -> do + reference (Reference aliasName) (Declaration aliasValue) + + -- Create an export edge from a new scope to the qualifed export's scope. + pure unit + +data Alias = Alias { aliasValue :: Name, aliasName :: Name } + deriving (Eq, Generic, Hashable, Ord, Show, Message, Named, ToJSON, NFData) + +toTuple :: Alias -> (Name, Name) +toTuple Alias{..} = (aliasValue, aliasName) + +-- | Qualified Export declarations that export from another module. +data QualifiedExportFrom a = QualifiedExportFrom { qualifiedExportFrom :: ImportPath, qualifiedExportFromSymbols :: ![Alias]} + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 QualifiedExportFrom where liftEq = genericLiftEq +instance Ord1 QualifiedExportFrom where liftCompare = genericLiftCompare +instance Show1 QualifiedExportFrom where liftShowsPrec = genericLiftShowsPrec + +instance Evaluatable QualifiedExportFrom where + eval _ _ (QualifiedExportFrom importPath exportSymbols) = do + modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions + + ((moduleScope, moduleFrame), _) <- require modulePath + exportScope <- newScope (Map.singleton ScopeGraph.Import [ moduleScope ]) + exportFrame <- newFrame exportScope (Map.singleton ScopeGraph.Import (Map.singleton moduleScope moduleFrame)) + + withScopeAndFrame moduleFrame . + for_ exportSymbols $ \Alias{..} -> do + insertImportReference (Reference aliasName) (Declaration aliasValue) exportScope + + insertExportEdge exportScope + insertFrameLink ScopeGraph.Export (Map.singleton exportScope exportFrame) + + pure unit + +newtype DefaultExport a = DefaultExport { defaultExport :: a } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 DefaultExport where liftEq = genericLiftEq +instance Ord1 DefaultExport where liftCompare = genericLiftCompare +instance Show1 DefaultExport where liftShowsPrec = genericLiftShowsPrec + +instance Evaluatable DefaultExport where + eval eval _ (DefaultExport term) = do + case declaredName term of + Just _ -> do + exportScope <- newScope mempty + exportFrame <- newFrame exportScope mempty + exportSpan <- ask @Span + withScopeAndFrame exportFrame $ do + valueRef <- eval term + let declaration = Declaration $ Name.name "__default" + declare declaration Default exportSpan Nothing + defaultSlot <- lookupDeclaration declaration + assign defaultSlot valueRef + + insertExportEdge exportScope + insertFrameLink ScopeGraph.Export (Map.singleton exportScope exportFrame) + Nothing -> throwEvalError DefaultExportError + pure unit + +data ImportRequireClause a = ImportRequireClause { importRequireIdentifier :: !a, importRequireSubject :: !a } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 ImportRequireClause where liftEq = genericLiftEq +instance Ord1 ImportRequireClause where liftCompare = genericLiftCompare +instance Show1 ImportRequireClause where liftShowsPrec = genericLiftShowsPrec +instance Evaluatable ImportRequireClause + +newtype ImportClause a = ImportClause { importClauseElements :: [a] } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 ImportClause where liftEq = genericLiftEq +instance Ord1 ImportClause where liftCompare = genericLiftCompare +instance Show1 ImportClause where liftShowsPrec = genericLiftShowsPrec +instance Evaluatable ImportClause + +data ImportAlias a = ImportAlias { importAliasSubject :: !a, importAlias :: !a } + deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) + +instance Eq1 ImportAlias where liftEq = genericLiftEq +instance Ord1 ImportAlias where liftCompare = genericLiftCompare +instance Show1 ImportAlias where liftShowsPrec = genericLiftShowsPrec +instance Evaluatable ImportAlias diff --git a/src/Language/TypeScript/Syntax/TypeScript.hs b/src/Language/TypeScript/Syntax/TypeScript.hs index 4134e30ae..8ef3363cb 100644 --- a/src/Language/TypeScript/Syntax/TypeScript.hs +++ b/src/Language/TypeScript/Syntax/TypeScript.hs @@ -4,179 +4,16 @@ module Language.TypeScript.Syntax.TypeScript where import Prologue -import Data.Aeson (ToJSON) import qualified Data.Text as T import Proto3.Suite import Control.Abstract hiding (Import) import Data.Abstract.Evaluatable as Evaluatable -import qualified Data.Abstract.Name as Name -import qualified Data.Abstract.ScopeGraph as ScopeGraph import Data.JSON.Fields import qualified Data.Map.Strict as Map import Data.Semigroup.App import Data.Semigroup.Foldable import Diffing.Algorithm -import Language.TypeScript.Resolution - -data Import a = Import { importSymbols :: ![Alias], importFrom :: ImportPath } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 Import where liftEq = genericLiftEq -instance Ord1 Import where liftCompare = genericLiftCompare -instance Show1 Import where liftShowsPrec = genericLiftShowsPrec - - -- http://www.typescriptlang.org/docs/handbook/module-resolution.html -instance Evaluatable Import where - eval _ _ (Import symbols importPath) = do - modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions - ((moduleScope, moduleFrame), _) <- require modulePath - if Prologue.null symbols then do - insertImportEdge moduleScope - insertFrameLink ScopeGraph.Import (Map.singleton moduleScope moduleFrame) - else do - let scopeEdges = Map.singleton ScopeGraph.Import [ moduleScope ] - scopeAddress <- newScope scopeEdges - let frameLinks = Map.singleton ScopeGraph.Import (Map.singleton moduleScope moduleFrame) - frameAddress <- newFrame scopeAddress frameLinks - - -- Insert import references into the import scope starting from the perspective of the import scope. - withScopeAndFrame moduleFrame $ do - for_ symbols $ \Alias{..} -> - insertImportReference (Reference aliasName) (Declaration aliasValue) scopeAddress - - -- Create edges from the current scope/frame to the import scope/frame. - insertImportEdge scopeAddress - insertFrameLink ScopeGraph.Import (Map.singleton scopeAddress frameAddress) - pure unit - -data QualifiedAliasedImport a = QualifiedAliasedImport { qualifiedAliasedImportAlias :: !a, qualifiedAliasedImportFrom :: ImportPath } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 QualifiedAliasedImport where liftEq = genericLiftEq -instance Ord1 QualifiedAliasedImport where liftCompare = genericLiftCompare -instance Show1 QualifiedAliasedImport where liftShowsPrec = genericLiftShowsPrec - -instance Evaluatable QualifiedAliasedImport where - eval _ _ (QualifiedAliasedImport aliasTerm importPath) = do - modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions - ((moduleScope, moduleFrame), _) <- require modulePath - span <- ask @Span - - importScope <- newScope (Map.singleton ScopeGraph.Import [ moduleScope ]) - let scopeMap = Map.singleton moduleScope moduleFrame - aliasFrame <- newFrame importScope (Map.singleton ScopeGraph.Import scopeMap) - - alias <- maybeM (throwNoNameError aliasTerm) (declaredName aliasTerm) - declare (Declaration alias) Default span (Just importScope) - aliasSlot <- lookupDeclaration (Declaration alias) - assign aliasSlot =<< object aliasFrame - - pure unit - - -newtype SideEffectImport a = SideEffectImport { sideEffectImportFrom :: ImportPath } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 SideEffectImport where liftEq = genericLiftEq -instance Ord1 SideEffectImport where liftCompare = genericLiftCompare -instance Show1 SideEffectImport where liftShowsPrec = genericLiftShowsPrec - -instance Evaluatable SideEffectImport where - eval _ _ (SideEffectImport importPath) = do - modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions - void $ require modulePath - pure unit - - --- | Qualified Export declarations -newtype QualifiedExport a = QualifiedExport { qualifiedExportSymbols :: [Alias] } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 QualifiedExport where liftEq = genericLiftEq -instance Ord1 QualifiedExport where liftCompare = genericLiftCompare -instance Show1 QualifiedExport where liftShowsPrec = genericLiftShowsPrec - -instance Evaluatable QualifiedExport where - eval _ _ (QualifiedExport exportSymbols) = do - -- Create a Lexical edge from the qualifed export's scope to the current scope. - currentScopeAddress <- currentScope - let edges = Map.singleton Lexical [ currentScopeAddress ] - exportScope <- newScope edges - insertExportEdge exportScope -- Create an export edge from the current scope to the export scope - withScope exportScope . - for_ exportSymbols $ \Alias{..} -> do - reference (Reference aliasName) (Declaration aliasValue) - - -- Create an export edge from a new scope to the qualifed export's scope. - pure unit - -data Alias = Alias { aliasValue :: Name, aliasName :: Name } - deriving (Eq, Generic, Hashable, Ord, Show, Message, Named, ToJSON, NFData) - -toTuple :: Alias -> (Name, Name) -toTuple Alias{..} = (aliasValue, aliasName) - --- | Qualified Export declarations that export from another module. -data QualifiedExportFrom a = QualifiedExportFrom { qualifiedExportFrom :: ImportPath, qualifiedExportFromSymbols :: ![Alias]} - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 QualifiedExportFrom where liftEq = genericLiftEq -instance Ord1 QualifiedExportFrom where liftCompare = genericLiftCompare -instance Show1 QualifiedExportFrom where liftShowsPrec = genericLiftShowsPrec - -instance Evaluatable QualifiedExportFrom where - eval _ _ (QualifiedExportFrom importPath exportSymbols) = do - modulePath <- resolveWithNodejsStrategy importPath typescriptExtensions - - ((moduleScope, moduleFrame), _) <- require modulePath - exportScope <- newScope (Map.singleton ScopeGraph.Import [ moduleScope ]) - exportFrame <- newFrame exportScope (Map.singleton ScopeGraph.Import (Map.singleton moduleScope moduleFrame)) - - withScopeAndFrame moduleFrame . - for_ exportSymbols $ \Alias{..} -> do - insertImportReference (Reference aliasName) (Declaration aliasValue) exportScope - - insertExportEdge exportScope - insertFrameLink ScopeGraph.Export (Map.singleton exportScope exportFrame) - - pure unit - -newtype DefaultExport a = DefaultExport { defaultExport :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 DefaultExport where liftEq = genericLiftEq -instance Ord1 DefaultExport where liftCompare = genericLiftCompare -instance Show1 DefaultExport where liftShowsPrec = genericLiftShowsPrec - -instance Evaluatable DefaultExport where - eval eval _ (DefaultExport term) = do - case declaredName term of - Just _ -> do - exportScope <- newScope mempty - exportFrame <- newFrame exportScope mempty - exportSpan <- ask @Span - withScopeAndFrame exportFrame $ do - valueRef <- eval term - let declaration = Declaration $ Name.name "__default" - declare declaration Default exportSpan Nothing - defaultSlot <- lookupDeclaration declaration - assign defaultSlot valueRef - - insertExportEdge exportScope - insertFrameLink ScopeGraph.Export (Map.singleton exportScope exportFrame) - Nothing -> throwEvalError DefaultExportError - pure unit - - --- | Lookup type for a type-level key in a typescript map. -data LookupType a = LookupType { lookupTypeIdentifier :: a, lookupTypeKey :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 LookupType where liftEq = genericLiftEq -instance Ord1 LookupType where liftCompare = genericLiftCompare -instance Show1 LookupType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable LookupType -- | ShorthandPropertyIdentifier used in object patterns such as var baz = { foo } to mean var baz = { foo: foo } newtype ShorthandPropertyIdentifier a = ShorthandPropertyIdentifier { contents :: T.Text } @@ -203,14 +40,6 @@ instance Ord1 Intersection where liftCompare = genericLiftCompare instance Show1 Intersection where liftShowsPrec = genericLiftShowsPrec instance Evaluatable Intersection -data FunctionType a = FunctionType { functionTypeParameters :: !a, functionFormalParameters :: ![a], functionType :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 FunctionType where liftEq = genericLiftEq -instance Ord1 FunctionType where liftCompare = genericLiftCompare -instance Show1 FunctionType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable FunctionType - data AmbientFunction a = AmbientFunction { ambientFunctionContext :: ![a], ambientFunctionIdentifier :: !a, ambientFunctionParameters :: ![a] } deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) @@ -219,22 +48,6 @@ instance Ord1 AmbientFunction where liftCompare = genericLiftCompare instance Show1 AmbientFunction where liftShowsPrec = genericLiftShowsPrec instance Evaluatable AmbientFunction -data ImportRequireClause a = ImportRequireClause { importRequireIdentifier :: !a, importRequireSubject :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ImportRequireClause where liftEq = genericLiftEq -instance Ord1 ImportRequireClause where liftCompare = genericLiftCompare -instance Show1 ImportRequireClause where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ImportRequireClause - -newtype ImportClause a = ImportClause { importClauseElements :: [a] } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ImportClause where liftEq = genericLiftEq -instance Ord1 ImportClause where liftCompare = genericLiftCompare -instance Show1 ImportClause where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ImportClause - newtype Tuple a = Tuple { tupleElements :: [a] } deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) @@ -253,21 +66,6 @@ instance Ord1 Language.TypeScript.Syntax.TypeScript.Constructor where liftCompar instance Show1 Language.TypeScript.Syntax.TypeScript.Constructor where liftShowsPrec = genericLiftShowsPrec instance Evaluatable Language.TypeScript.Syntax.TypeScript.Constructor -data TypeParameter a = TypeParameter { typeParameter :: !a, typeParameterConstraint :: !a, typeParameterDefaultType :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 TypeParameter where liftEq = genericLiftEq -instance Ord1 TypeParameter where liftCompare = genericLiftCompare -instance Show1 TypeParameter where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable TypeParameter - -data TypeAssertion a = TypeAssertion { typeAssertionParameters :: !a, typeAssertionExpression :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 TypeAssertion where liftEq = genericLiftEq -instance Ord1 TypeAssertion where liftCompare = genericLiftCompare -instance Show1 TypeAssertion where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable TypeAssertion newtype Annotation a = Annotation { annotationType :: a } deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) @@ -301,47 +99,6 @@ instance Ord1 Constraint where liftCompare = genericLiftCompare instance Show1 Constraint where liftShowsPrec = genericLiftShowsPrec instance Evaluatable Constraint -newtype DefaultType a = DefaultType { defaultType :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 DefaultType where liftEq = genericLiftEq -instance Ord1 DefaultType where liftCompare = genericLiftCompare -instance Show1 DefaultType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable DefaultType - -newtype ParenthesizedType a = ParenthesizedType { parenthesizedType :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ParenthesizedType where liftEq = genericLiftEq -instance Ord1 ParenthesizedType where liftCompare = genericLiftCompare -instance Show1 ParenthesizedType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ParenthesizedType - -newtype PredefinedType a = PredefinedType { predefinedType :: T.Text } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 PredefinedType where liftEq = genericLiftEq -instance Ord1 PredefinedType where liftCompare = genericLiftCompare -instance Show1 PredefinedType where liftShowsPrec = genericLiftShowsPrec --- TODO: Implement Eval instance for PredefinedType -instance Evaluatable PredefinedType - -newtype TypeIdentifier a = TypeIdentifier { contents :: T.Text } - deriving (Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Declarations1 TypeIdentifier where - liftDeclaredName _ (TypeIdentifier identifier) = Just (Evaluatable.name identifier) - -instance Eq1 TypeIdentifier where liftEq = genericLiftEq -instance Ord1 TypeIdentifier where liftCompare = genericLiftCompare -instance Show1 TypeIdentifier where liftShowsPrec = genericLiftShowsPrec --- TODO: TypeIdentifier shouldn't evaluate to an address in the heap? -instance Evaluatable TypeIdentifier where - eval _ _ TypeIdentifier{..} = do - -- Add a reference to the type identifier in the current scope. - reference (Reference (Evaluatable.name contents)) (Declaration (Evaluatable.name contents)) - pure unit - data NestedIdentifier a = NestedIdentifier { left :: !a, right :: !a } deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) @@ -350,38 +107,6 @@ instance Ord1 NestedIdentifier where liftCompare = genericLiftCompare instance Show1 NestedIdentifier where liftShowsPrec = genericLiftShowsPrec instance Evaluatable NestedIdentifier -data NestedTypeIdentifier a = NestedTypeIdentifier { left :: !a, right :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 NestedTypeIdentifier where liftEq = genericLiftEq -instance Ord1 NestedTypeIdentifier where liftCompare = genericLiftCompare -instance Show1 NestedTypeIdentifier where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable NestedTypeIdentifier - -data GenericType a = GenericType { genericTypeIdentifier :: !a, genericTypeArguments :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 GenericType where liftEq = genericLiftEq -instance Ord1 GenericType where liftCompare = genericLiftCompare -instance Show1 GenericType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable GenericType - -data TypePredicate a = TypePredicate { typePredicateIdentifier :: !a, typePredicateType :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 TypePredicate where liftEq = genericLiftEq -instance Ord1 TypePredicate where liftCompare = genericLiftCompare -instance Show1 TypePredicate where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable TypePredicate - -newtype ObjectType a = ObjectType { objectTypeElements :: [a] } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ObjectType where liftEq = genericLiftEq -instance Ord1 ObjectType where liftCompare = genericLiftCompare -instance Show1 ObjectType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ObjectType - newtype AmbientDeclaration a = AmbientDeclaration { ambientDeclarationBody :: a } deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) @@ -420,70 +145,6 @@ instance Evaluatable ExtendsClause where traverse_ eval extendsClauses pure unit -newtype ArrayType a = ArrayType { arrayType :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ArrayType where liftEq = genericLiftEq -instance Ord1 ArrayType where liftCompare = genericLiftCompare -instance Show1 ArrayType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ArrayType - -newtype FlowMaybeType a = FlowMaybeType { flowMaybeType :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 FlowMaybeType where liftEq = genericLiftEq -instance Ord1 FlowMaybeType where liftCompare = genericLiftCompare -instance Show1 FlowMaybeType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable FlowMaybeType - -newtype TypeQuery a = TypeQuery { typeQuerySubject :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 TypeQuery where liftEq = genericLiftEq -instance Ord1 TypeQuery where liftCompare = genericLiftCompare -instance Show1 TypeQuery where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable TypeQuery - -newtype IndexTypeQuery a = IndexTypeQuery { indexTypeQuerySubject :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 IndexTypeQuery where liftEq = genericLiftEq -instance Ord1 IndexTypeQuery where liftCompare = genericLiftCompare -instance Show1 IndexTypeQuery where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable IndexTypeQuery - -newtype TypeArguments a = TypeArguments { typeArguments :: [a] } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 TypeArguments where liftEq = genericLiftEq -instance Ord1 TypeArguments where liftCompare = genericLiftCompare -instance Show1 TypeArguments where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable TypeArguments - -newtype ThisType a = ThisType { contents :: T.Text } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ThisType where liftEq = genericLiftEq -instance Ord1 ThisType where liftCompare = genericLiftCompare -instance Show1 ThisType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ThisType - -newtype ExistentialType a = ExistentialType { contents :: T.Text } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ExistentialType where liftEq = genericLiftEq -instance Ord1 ExistentialType where liftCompare = genericLiftCompare -instance Show1 ExistentialType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ExistentialType - -newtype LiteralType a = LiteralType { literalTypeSubject :: a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 LiteralType where liftEq = genericLiftEq -instance Ord1 LiteralType where liftCompare = genericLiftCompare -instance Show1 LiteralType where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable LiteralType - data PropertySignature a = PropertySignature { modifiers :: ![a], propertySignaturePropertyName :: !a } deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) @@ -631,15 +292,6 @@ instance Evaluatable InternalModule where instance Declarations a => Declarations (InternalModule a) where declaredName InternalModule{..} = declaredName internalModuleIdentifier - -data ImportAlias a = ImportAlias { importAliasSubject :: !a, importAlias :: !a } - deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable) - -instance Eq1 ImportAlias where liftEq = genericLiftEq -instance Ord1 ImportAlias where liftCompare = genericLiftCompare -instance Show1 ImportAlias where liftShowsPrec = genericLiftShowsPrec -instance Evaluatable ImportAlias - data ClassHeritage a = ClassHeritage { classHeritageExtendsClause :: !a, implementsClause :: !a } deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Message1, NFData1, Named1, Ord, Show, ToJSONFields1, Traversable)