diff --git a/src/Control/Abstract/Heap.hs b/src/Control/Abstract/Heap.hs index dd260d78a..ef02fcba8 100644 --- a/src/Control/Abstract/Heap.hs +++ b/src/Control/Abstract/Heap.hs @@ -55,7 +55,7 @@ import qualified Data.Abstract.Heap as Heap import Data.Abstract.Live import Data.Abstract.Module (ModuleInfo) import Data.Abstract.Name -import Data.Abstract.ScopeGraph (Path (..), putDeclarationScopeAtPosition) +import Data.Abstract.ScopeGraph (Path (..), Relation(..), putDeclarationScopeAtPosition) import qualified Data.Map.Strict as Map import Data.Span (Span, emptySpan) import Prologue @@ -174,11 +174,12 @@ define :: ( HasCallStack , Carrier sig m ) => Declaration + -> Relation -> Evaluator term address value m value -> Evaluator term address value m () -define declaration def = withCurrentCallStack callStack $ do +define declaration rel def = withCurrentCallStack callStack $ do -- TODO: This span is still wrong. - declare declaration emptySpan Nothing + declare declaration rel emptySpan Nothing slot <- lookupDeclaration declaration value <- def assign slot value diff --git a/src/Control/Abstract/Primitive.hs b/src/Control/Abstract/Primitive.hs index 9ac35c5a6..bbe23c82a 100644 --- a/src/Control/Abstract/Primitive.hs +++ b/src/Control/Abstract/Primitive.hs @@ -33,18 +33,19 @@ defineBuiltIn :: ( HasCallStack , Carrier sig m ) => Declaration + -> Relation -> BuiltIn -> Evaluator term address value m () -defineBuiltIn declaration value = withCurrentCallStack callStack $ do +defineBuiltIn declaration rel value = withCurrentCallStack callStack $ do currentScope' <- currentScope let lexicalEdges = Map.singleton Lexical [ currentScope' ] associatedScope <- newScope lexicalEdges -- TODO: This span is still wrong. - declare declaration emptySpan (Just associatedScope) + declare declaration rel emptySpan (Just associatedScope) param <- gensym withScope associatedScope $ do - declare (Declaration param) emptySpan Nothing + declare (Declaration param) rel emptySpan Nothing slot <- lookupDeclaration declaration value <- builtIn associatedScope value @@ -70,7 +71,7 @@ defineClass :: ( AbstractValue term address value m -> [Declaration] -> Evaluator term address value m a -> Evaluator term address value m () -defineClass declaration superclasses body = void . define declaration $ do +defineClass declaration superclasses body = void . define declaration Default $ do currentScope' <- currentScope superScopes <- for superclasses associatedScope @@ -105,7 +106,7 @@ defineNamespace :: ( AbstractValue term address value m => Declaration -> Evaluator term address value m a -> Evaluator term address value m () -defineNamespace declaration@Declaration{..} body = void . define declaration $ do +defineNamespace declaration@Declaration{..} body = void . define declaration Default $ do withChildFrame declaration $ \frame -> do _ <- body namespace unDeclaration frame diff --git a/src/Control/Abstract/ScopeGraph.hs b/src/Control/Abstract/ScopeGraph.hs index d9fc4207f..7c9fe9d1a 100644 --- a/src/Control/Abstract/ScopeGraph.hs +++ b/src/Control/Abstract/ScopeGraph.hs @@ -9,6 +9,7 @@ module Control.Abstract.ScopeGraph , ScopeGraph , ScopeError(..) , Reference(..) + , Relation(..) , EdgeLabel(..) , CurrentScope(..) , currentScope @@ -41,7 +42,7 @@ import Control.Effect.Carrier import Data.Abstract.BaseError import Data.Abstract.Module import Data.Abstract.Name hiding (name) -import Data.Abstract.ScopeGraph (Declaration (..), EdgeLabel, Reference, Scope (..), ScopeGraph, Slot (..)) +import Data.Abstract.ScopeGraph (Declaration(..), EdgeLabel, Reference, Relation(..), Scope (..), ScopeGraph, Slot(..)) import qualified Data.Abstract.ScopeGraph as ScopeGraph import Data.Span import Prelude hiding (lookup) @@ -56,12 +57,13 @@ declare :: ( Carrier sig m , Ord address ) => Declaration + -> Relation -> Span -> Maybe address -> Evaluator term address value m () -declare decl span scope = do +declare decl rel span scope = do currentAddress <- currentScope - modify (fst . ScopeGraph.declare decl span scope currentAddress) + modify (fst . ScopeGraph.declare decl rel span scope currentAddress) putDeclarationScope :: (Ord address, Member (Reader (CurrentScope address)) sig, Member (State (ScopeGraph address)) sig, Carrier sig m) => Declaration -> address -> Evaluator term address value m () putDeclarationScope decl assocScope = do diff --git a/src/Data/Abstract/Evaluatable.hs b/src/Data/Abstract/Evaluatable.hs index d18490ca8..38fe43299 100644 --- a/src/Data/Abstract/Evaluatable.hs +++ b/src/Data/Abstract/Evaluatable.hs @@ -26,6 +26,7 @@ import Data.Abstract.Declarations as X import Data.Abstract.FreeVariables as X import Data.Abstract.Module import Data.Abstract.Name as X +import Data.Abstract.ScopeGraph (Relation(..)) import Data.Language import Data.Scientific (Scientific) import Data.Semigroup.App @@ -135,26 +136,26 @@ instance HasPrelude 'PHP instance HasPrelude 'Python where definePrelude _ = - defineBuiltIn (Declaration $ X.name "print") Print + defineBuiltIn (Declaration $ X.name "print") Default Print instance HasPrelude 'Ruby where definePrelude _ = do defineSelf - defineBuiltIn (Declaration $ X.name "puts") Print + defineBuiltIn (Declaration $ X.name "puts") Default Print defineClass (Declaration (X.name "Object")) [] $ do - defineBuiltIn (Declaration $ X.name "inspect") Show + defineBuiltIn (Declaration $ X.name "inspect") Default Show instance HasPrelude 'TypeScript where definePrelude _ = do defineSelf - defineNamespace (Declaration (X.name "console")) $ defineBuiltIn (Declaration $ X.name "log") Print + defineNamespace (Declaration (X.name "console")) $ defineBuiltIn (Declaration $ X.name "log") Default Print instance HasPrelude 'JavaScript where definePrelude _ = do defineSelf - defineNamespace (Declaration (X.name "console")) $ defineBuiltIn (Declaration $ X.name "log") Print + defineNamespace (Declaration (X.name "console")) $ defineBuiltIn (Declaration $ X.name "log") Default Print defineSelf :: ( AbstractValue term address value m , Carrier sig m @@ -172,7 +173,8 @@ defineSelf :: ( AbstractValue term address value m => Evaluator term address value m () defineSelf = do let self = Declaration $ X.name "__self" - declare self emptySpan Nothing + -- TODO: Should `self` be given a special Relation? + declare self Default emptySpan Nothing slot <- lookupDeclaration self assign slot =<< object =<< currentFrame diff --git a/src/Data/Abstract/ScopeGraph.hs b/src/Data/Abstract/ScopeGraph.hs index e4c80d895..23f6957bc 100644 --- a/src/Data/Abstract/ScopeGraph.hs +++ b/src/Data/Abstract/ScopeGraph.hs @@ -18,6 +18,7 @@ module Data.Abstract.ScopeGraph , Position(..) , reference , Reference(..) -- TODO don't export these constructors + , Relation(..) , ScopeGraph(..) , lookupScope , lookupScopePath @@ -44,11 +45,11 @@ data Slot address = Slot { frameAddress :: address, position :: Position } data Relation = Default | InstanceOf deriving (Eq, Show, Ord, Generic, NFData) -data Data address = Data { - declaration :: Declaration - , relation :: Relation - , span :: Span - , scopeAddress :: Maybe address +data Data scopeAddress = Data { + dataDeclaration :: Declaration + , dataRelation :: Relation + , dataSpan :: Span + , dataAssociatedScope :: Maybe scopeAddress } deriving (Eq, Show, Ord, Generic, NFData) @@ -125,12 +126,12 @@ lookupScope scope = Map.lookup scope . unScopeGraph -- Declare a declaration with a span and an associated scope in the scope graph. -- TODO: Return the whole value in Maybe or Either. -declare :: Ord scope => Declaration -> Span -> Relation -> Maybe scope -> scope -> ScopeGraph scope -> (ScopeGraph scope, Maybe Position) -declare decl declSpan rel assocScope currentScope g = fromMaybe (g, Nothing) $ do +declare :: Ord scope => Declaration -> Relation -> Span -> Maybe scope -> scope -> ScopeGraph scope -> (ScopeGraph scope, Maybe Position) +declare decl rel declSpan assocScope currentScope g = fromMaybe (g, Nothing) $ do scope <- lookupScope currentScope g dataSeq <- ddataOfScope currentScope g - case Seq.findIndexR (\Data{..} -> decl == declaration && declSpan == span && rel == relation) dataSeq of + case Seq.findIndexR (\Data{..} -> decl == dataDeclaration && declSpan == dataSpan && rel == dataRelation) dataSeq of Just index -> pure (g, Just (Position index)) Nothing -> do let newScope = scope { declarations = declarations scope Seq.|> Data decl rel declSpan assocScope } @@ -177,23 +178,23 @@ pathToDeclaration decl address g = DPath decl . snd <$> lookupDeclaration (unDec insertReference :: Reference -> Path scopeAddress -> Scope scopeAddress -> Scope scopeAddress insertReference ref path scope = scope { references = Map.insert ref path (references scope) } -lookupDeclaration :: Ord scopeAddress => Name -> scopeAddress -> ScopeGraph scopeAddress -> Maybe ((Declaration, (Span, Maybe scopeAddress)), Position) +lookupDeclaration :: Ord scopeAddress => Name -> scopeAddress -> ScopeGraph scopeAddress -> Maybe (Data scopeAddress, Position) lookupDeclaration name scope g = do dataSeq <- ddataOfScope scope g - index <- Seq.findIndexR (\Data{..} -> Declaration name == declaration) dataSeq + index <- Seq.findIndexR (\Data{..} -> Declaration name == dataDeclaration) dataSeq (, Position index) <$> Seq.lookup index dataSeq declarationNames :: Ord address => [EdgeLabel] -> Scope address -> ScopeGraph address -> Set Declaration declarationNames edgeLabels scope scopeGraph = localDeclarations <> edgeNames where addresses = join (Map.elems $ Map.restrictKeys (edges scope) (Set.fromList edgeLabels)) edgeNames = flip foldMap addresses $ \address -> maybe mempty (flip (declarationNames edgeLabels) scopeGraph) (lookupScope address scopeGraph) - localDeclarations = Set.fromList . toList . fmap fst $ declarations scope + localDeclarations = Set.fromList . toList . fmap dataDeclaration $ declarations scope putDeclarationScopeAtPosition :: Ord scopeAddress => scopeAddress -> Position -> Maybe scopeAddress -> ScopeGraph scopeAddress -> ScopeGraph scopeAddress putDeclarationScopeAtPosition scope position assocScope g@(ScopeGraph graph) = fromMaybe g $ do dataSeq <- ddataOfScope scope g - let seq = Seq.adjust' (\(d, (span, _)) -> (d, (span, assocScope))) (unPosition position) dataSeq + let seq = Seq.adjust' (\Data{..} -> Data dataDeclaration dataRelation dataSpan assocScope) (unPosition position) dataSeq pure $ ScopeGraph (Map.adjust (\s -> s { declarations = seq }) scope graph) lookupReference :: Ord scopeAddress => Name -> scopeAddress -> ScopeGraph scopeAddress -> Maybe (Path scopeAddress) @@ -207,21 +208,22 @@ insertEdge label target currentAddress g@(ScopeGraph graph) = fromMaybe g $ do pure (ScopeGraph (Map.insert currentAddress newScope graph)) --- | Insert associate the given associated scope into the declaration in the scope graph. +-- | Update the 'Scope' containing a 'Declaration' with an associated scope address. +-- Returns an unmodified 'ScopeGraph' if the 'Declaration' cannot be found with the given scope address. insertDeclarationScope :: Ord scopeAddress => Declaration -> scopeAddress -> scopeAddress -> ScopeGraph scopeAddress -> ScopeGraph scopeAddress -insertDeclarationScope decl@Declaration{..} address currentAddress g@(ScopeGraph graph) = fromMaybe g $ do - declScope <- pathDeclarationScope currentAddress =<< lookupScopePath unDeclaration currentAddress g - (span, position) <- (fst . snd . fst &&& unPosition . snd) <$> lookupDeclaration unDeclaration declScope g - scope <- lookupScope declScope g - pure $ ScopeGraph (Map.insert declScope (scope { declarations = Seq.adjust (const (decl, (span, Just address))) position (declarations scope) }) graph) +insertDeclarationScope decl@Declaration{..} associatedScopeAddress scopeAddress g = fromMaybe g $ do + declScopeAddress <- pathDeclarationScope scopeAddress =<< lookupScopePath unDeclaration scopeAddress g + scope <- lookupScope declScopeAddress g + (declData, position) <- (id . fst &&& unPosition . snd) <$> lookupDeclaration unDeclaration declScopeAddress g + pure $ insertScope declScopeAddress (scope { declarations = Seq.adjust (const (Data decl (dataRelation declData) (dataSpan declData) (Just associatedScopeAddress))) position (declarations scope) }) g -- | Insert a declaration span into the declaration in the scope graph. insertDeclarationSpan :: Ord scopeAddress => Declaration -> Span -> ScopeGraph scopeAddress -> ScopeGraph scopeAddress -insertDeclarationSpan decl@Declaration{..} span g@(ScopeGraph graph) = fromMaybe g $ do - declScope <- scopeOfDeclaration decl g - (associatedScope, position) <- (snd . snd . fst &&& unPosition . snd) <$> lookupDeclaration unDeclaration declScope g - scope <- lookupScope declScope g - pure $ ScopeGraph (Map.insert declScope (scope { declarations = Seq.adjust (const (decl, (span, associatedScope))) position (declarations scope) }) graph) +insertDeclarationSpan decl@Declaration{..} span g = fromMaybe g $ do + declScopeAddress <- scopeOfDeclaration decl g + (declData, position) <- (id . fst &&& unPosition . snd) <$> lookupDeclaration unDeclaration declScopeAddress g + scope <- lookupScope declScopeAddress g + pure $ insertScope declScopeAddress (scope { declarations = Seq.adjust (const (Data decl (dataRelation declData) span (dataAssociatedScope declData))) position (declarations scope) }) g -- | Insert a new scope with the given address and edges into the scope graph. newScope :: Ord address => address -> Map EdgeLabel [address] -> ScopeGraph address -> ScopeGraph address @@ -257,7 +259,7 @@ scopeOfDeclaration Declaration{..} g@(ScopeGraph graph) = go (Map.keys graph) associatedScope :: Ord scope => Declaration -> ScopeGraph scope -> Maybe scope associatedScope Declaration{..} g@(ScopeGraph graph) = go (Map.keys graph) where - go = foldr (\ scope -> ((lookupDeclaration unDeclaration scope g >>= snd . snd . fst) <|>)) Nothing + go = foldr (\ scope -> ((lookupDeclaration unDeclaration scope g >>= dataAssociatedScope . fst) <|>)) Nothing newtype Reference = Reference { unReference :: Name } deriving (Eq, Ord, Show, Generic, NFData) diff --git a/src/Data/Syntax/Declaration.hs b/src/Data/Syntax/Declaration.hs index 597c188b0..a10f54a6a 100644 --- a/src/Data/Syntax/Declaration.hs +++ b/src/Data/Syntax/Declaration.hs @@ -36,7 +36,7 @@ instance Evaluatable Function where params <- withScope associatedScope . for functionParameters $ \paramNode -> do param <- maybeM (throwEvalError $ NoNameError paramNode) (declaredName paramNode) - param <$ declare (Declaration param) span Nothing + param <$ declare (Declaration param) Default span Nothing addr <- lookupDeclaration (Declaration name) v <- function name params functionBody associatedScope @@ -56,7 +56,7 @@ declareFunction name span = do currentScope' <- currentScope let lexicalEdges = Map.singleton Lexical [ currentScope' ] associatedScope <- newScope lexicalEdges - declare (Declaration name) span (Just associatedScope) + declare (Declaration name) Default span (Just associatedScope) pure associatedScope instance Tokenize Function where @@ -92,10 +92,12 @@ instance Evaluatable Method where params <- withScope associatedScope $ do let self = Name.name "__self" - declare (Declaration self) emptySpan Nothing + -- TODO: Should we give `self` a special Relation? + declare (Declaration self) Default emptySpan Nothing fmap (self :) . for methodParameters $ \paramNode -> do param <- maybeM (throwEvalError $ NoNameError paramNode) (declaredName paramNode) - param <$ declare (Declaration param) span Nothing + -- TODO: Should we treat params as a special Relation? I've left this as an `InstanceOf` for now. + param <$ declare (Declaration param) InstanceOf span Nothing addr <- lookupDeclaration (Declaration name) v <- function name params methodBody associatedScope @@ -164,7 +166,7 @@ instance Evaluatable VariableDeclaration where eval eval _ (VariableDeclaration decs) = do for_ decs $ \declaration -> do name <- maybeM (throwEvalError $ NoNameError declaration) (declaredName declaration) - declare (Declaration name) emptySpan Nothing + declare (Declaration name) Default emptySpan Nothing (span, _) <- do ref <- eval declaration subtermSpan <- get @Span @@ -210,7 +212,7 @@ instance Evaluatable PublicFieldDefinition where propertyName <- maybeM (throwEvalError $ NoNameError publicFieldPropertyName) (declaredName publicFieldPropertyName) -- withScope instanceScope $ do - declare (Declaration propertyName) span Nothing + declare (Declaration propertyName) InstanceOf span Nothing slot <- lookupDeclaration (Declaration propertyName) value <- eval publicFieldValue assign slot value @@ -258,7 +260,7 @@ instance Evaluatable Class where current = (Lexical, ) <$> pure (pure currentScope') edges = Map.fromList (superclassEdges <> current) classScope <- newScope edges - declare (Declaration name) span (Just classScope) + declare (Declaration name) Default span (Just classScope) let frameEdges = Map.singleton Superclass (Map.fromList (catMaybes superScopes)) classFrame <- newFrame classScope frameEdges @@ -351,7 +353,8 @@ instance Evaluatable TypeAlias where span <- ask @Span assocScope <- associatedScope (Declaration kindName) - declare (Declaration name) span assocScope + -- TODO: Should we consider a special Relation for `TypeAlias`? + declare (Declaration name) Default span assocScope slot <- lookupDeclaration (Declaration name) kindSlot <- lookupDeclaration (Declaration kindName) diff --git a/src/Data/Syntax/Expression.hs b/src/Data/Syntax/Expression.hs index 7572c8da2..6ebccfa0b 100644 --- a/src/Data/Syntax/Expression.hs +++ b/src/Data/Syntax/Expression.hs @@ -638,6 +638,7 @@ instance Evaluatable New where slot <- lookupDeclaration (Declaration name) classVal <- deref slot classFrame <- maybeM (throwEvalError $ ScopedEnvError classVal) =<< scopedEnvironment classVal + objectFrame <- newFrame objectScope (Map.singleton Superclass $ Map.singleton assocScope classFrame) objectVal <- object objectFrame diff --git a/src/Data/Syntax/Statement.hs b/src/Data/Syntax/Statement.hs index f79553ca3..8cd7582c0 100644 --- a/src/Data/Syntax/Statement.hs +++ b/src/Data/Syntax/Statement.hs @@ -151,7 +151,7 @@ instance Evaluatable Let where assocScope <- associatedScope (Declaration valueName) _ <- withLexicalScopeAndFrame $ do - declare (Declaration name) letSpan assocScope + declare (Declaration name) Default letSpan assocScope letVal <- eval letValue slot <- lookupDeclaration (Declaration name) assign slot letVal diff --git a/src/Language/Go/Syntax.hs b/src/Language/Go/Syntax.hs index 7925517db..a3c0c264f 100644 --- a/src/Language/Go/Syntax.hs +++ b/src/Language/Go/Syntax.hs @@ -85,7 +85,7 @@ instance Evaluatable QualifiedImport where alias <- maybeM (throwEvalError $ NoNameError aliasTerm) (declaredName aliasTerm) span <- ask @Span scopeAddress <- newScope mempty - declare (Declaration alias) span (Just scopeAddress) + declare (Declaration alias) Default span (Just scopeAddress) aliasSlot <- lookupDeclaration (Declaration alias) withScope scopeAddress $ do diff --git a/src/Language/Python/Syntax.hs b/src/Language/Python/Syntax.hs index 3301d24e4..02d5d9122 100644 --- a/src/Language/Python/Syntax.hs +++ b/src/Language/Python/Syntax.hs @@ -148,7 +148,7 @@ instance Evaluatable Import where aliasFrame <- newFrame importScope (Map.singleton ScopeGraph.Import scopeMap) -- Add declaration of the alias name to the current scope (within our current module). - declare (Declaration aliasName) span (Just importScope) + declare (Declaration aliasName) Default span (Just importScope) -- Retrieve the frame slot for the new declaration. aliasSlot <- lookupDeclaration (Declaration aliasName) assign aliasSlot =<< object aliasFrame @@ -219,7 +219,7 @@ instance Evaluatable QualifiedImport where go ((name, modulePath) : namesAndPaths) = do span <- ask @Span scopeAddress <- newScope mempty - declare (Declaration name) span (Just scopeAddress) + declare (Declaration name) Default span (Just scopeAddress) aliasSlot <- lookupDeclaration (Declaration name) -- a.b.c withScope scopeAddress $ @@ -255,7 +255,7 @@ instance Evaluatable QualifiedAliasedImport where span <- ask @Span scopeAddress <- newScope mempty alias <- maybeM (throwEvalError $ NoNameError aliasTerm) (declaredName aliasTerm) - declare (Declaration alias) span (Just scopeAddress) + declare (Declaration alias) Default span (Just scopeAddress) objFrame <- newFrame scopeAddress mempty val <- object objFrame aliasSlot <- lookupDeclaration (Declaration alias) diff --git a/src/Language/Ruby/Syntax.hs b/src/Language/Ruby/Syntax.hs index a1757a14a..1703238d9 100644 --- a/src/Language/Ruby/Syntax.hs +++ b/src/Language/Ruby/Syntax.hs @@ -221,7 +221,7 @@ instance Evaluatable Class where current = (Lexical, ) <$> pure (pure currentScope') edges = Map.fromList (superclassEdges <> current) classScope <- newScope edges - declare (Declaration name) span (Just classScope) + declare (Declaration name) Default span (Just classScope) let frameEdges = Map.singleton Superclass (Map.fromList (catMaybes superScopes)) childFrame <- newFrame classScope frameEdges @@ -274,7 +274,7 @@ instance Evaluatable Module where Nothing -> do let edges = Map.singleton Lexical [ currentScope' ] classScope <- newScope edges - declare (Declaration name) span (Just classScope) + declare (Declaration name) Default span (Just classScope) currentFrame' <- currentFrame let frameEdges = Map.singleton Lexical (Map.singleton currentScope' currentFrame') @@ -350,7 +350,7 @@ instance Evaluatable Assignment where lhsName <- maybeM (throwEvalError $ NoNameError assignmentTarget) (declaredName assignmentTarget) maybeSlot <- maybeLookupDeclaration (Declaration lhsName) assignmentSpan <- ask @Span - maybe (declare (Declaration lhsName) assignmentSpan Nothing) (const (pure ())) maybeSlot + maybe (declare (Declaration lhsName) Default assignmentSpan Nothing) (const (pure ())) maybeSlot lhs <- ref assignmentTarget rhs <- eval assignmentValue diff --git a/src/Language/TypeScript/Syntax/JSX.hs b/src/Language/TypeScript/Syntax/JSX.hs index 2441198bf..3cc75d03f 100644 --- a/src/Language/TypeScript/Syntax/JSX.hs +++ b/src/Language/TypeScript/Syntax/JSX.hs @@ -98,7 +98,8 @@ instance Evaluatable RequiredParameter where eval eval ref RequiredParameter{..} = do name <- maybeM (throwEvalError $ NoNameError requiredParameterSubject) (declaredName requiredParameterSubject) span <- ask @Span - declare (Declaration name) span Nothing + -- TODO: Should we specify function parameters with a special Relation? + declare (Declaration name) Default span Nothing lhs <- ref requiredParameterSubject rhs <- eval requiredParameterValue diff --git a/src/Language/TypeScript/Syntax/JavaScript.hs b/src/Language/TypeScript/Syntax/JavaScript.hs index 3ec487828..6ab14b546 100644 --- a/src/Language/TypeScript/Syntax/JavaScript.hs +++ b/src/Language/TypeScript/Syntax/JavaScript.hs @@ -31,7 +31,7 @@ instance Evaluatable JavaScriptRequire where Just alias -> do span <- ask @Span importScope <- newScope (Map.singleton ScopeGraph.Import [ moduleScope ]) - declare (Declaration alias) span (Just importScope) + declare (Declaration alias) Default span (Just importScope) let scopeMap = Map.singleton moduleScope moduleFrame aliasFrame <- newFrame importScope (Map.singleton ScopeGraph.Import scopeMap) aliasSlot <- lookupDeclaration (Declaration alias) diff --git a/src/Language/TypeScript/Syntax/TypeScript.hs b/src/Language/TypeScript/Syntax/TypeScript.hs index 4c568208f..692651362 100644 --- a/src/Language/TypeScript/Syntax/TypeScript.hs +++ b/src/Language/TypeScript/Syntax/TypeScript.hs @@ -68,7 +68,7 @@ instance Evaluatable QualifiedAliasedImport where aliasFrame <- newFrame importScope (Map.singleton ScopeGraph.Import scopeMap) alias <- maybeM (throwEvalError $ NoNameError aliasTerm) (declaredName aliasTerm) - declare (Declaration alias) span (Just importScope) + declare (Declaration alias) Default span (Just importScope) aliasSlot <- lookupDeclaration (Declaration alias) assign aliasSlot =<< object aliasFrame @@ -159,7 +159,7 @@ instance Evaluatable DefaultExport where withScopeAndFrame exportFrame $ do valueRef <- eval term let declaration = Declaration $ Name.name "__default" - declare declaration exportSpan Nothing + declare declaration Default exportSpan Nothing defaultSlot <- lookupDeclaration declaration assign defaultSlot valueRef @@ -598,7 +598,7 @@ declareModule eval identifier statements = do Nothing -> do let edges = Map.singleton Lexical [ currentScope' ] childScope <- newScope edges - declare (Declaration name) span (Just childScope) + declare (Declaration name) Default span (Just childScope) currentFrame' <- currentFrame let frameEdges = Map.singleton Lexical (Map.singleton currentScope' currentFrame') @@ -676,7 +676,7 @@ instance Evaluatable AbstractClass where current = (Lexical, ) <$> pure (pure currentScope') edges = Map.fromList (superclassEdges <> current) classScope <- newScope edges - declare (Declaration name) span (Just classScope) + declare (Declaration name) Default span (Just classScope) let frameEdges = Map.singleton Superclass (Map.fromList (catMaybes superScopes)) childFrame <- newFrame classScope frameEdges diff --git a/test/fixtures/typescript/analysis/class2.ts b/test/fixtures/typescript/analysis/class2.ts index 8a6db70f3..ec19c1376 100644 --- a/test/fixtures/typescript/analysis/class2.ts +++ b/test/fixtures/typescript/analysis/class2.ts @@ -1,10 +1,10 @@ -class Adder { +class Adder { summand: number; constructor(summand: number) { this.summand = summand; } - add() { - return 4 + this.summand; + add(foo: A) { + return foo } }