Skip to content

Commit

Permalink
Initial implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
flbulgarelli committed Jul 23, 2018
1 parent 4d7e269 commit 3051c53
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 1 deletion.
47 changes: 47 additions & 0 deletions spec/InspectorSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,53 @@ spec = do
it "is False if there is no usage" $ do
uses (named "m") (EntryPoint "main" (Reference "f")) `shouldBe` False

describe "delegates" $ do
context "when subroutine is declared" $ do
it "is True on function application in entry point" $ do
delegates (named "m") (Sequence [
EntryPoint "main" (Application (Reference "m") []),
SimpleProcedure "m" [] None]) `shouldBe` True

it "is True on message send application in entry point" $ do
delegates (named "m") (Sequence [
EntryPoint "main" (Send Self (Reference "m") []),
SimpleMethod "m" [] None]) `shouldBe` True

it "is False on direct usage in entry point" $ do
delegates (named "m") (Sequence [
EntryPoint "main" (Reference "m"),
Class "m" Nothing None]) `shouldBe` False

it "is False if there is no usage" $ do
delegates (named "m") (Sequence [
EntryPoint "main" (Reference "f"),
SimpleProcedure "m" [] None]) `shouldBe` False

it "is True when delegated and a wildcard is used" $ do
delegates anyone (Sequence [
EntryPoint "main" (Application (Reference "m") []),
SimpleProcedure "m" [] None]) `shouldBe` True

it "is False when not delegated and a wildcard is used" $ do
delegates anyone (Sequence [
EntryPoint "main" (Application (Reference "g") []),
SimpleProcedure "m" [] None]) `shouldBe` False


context "when subroutine is not declared" $ do
it "is False on function application in entry point" $ do
delegates (named "m") (EntryPoint "main" (Application (Reference "m") [])) `shouldBe` False

it "is False on message send application in entry point" $ do
delegates (named "m") (EntryPoint "main" (Send Self (Reference "m") [])) `shouldBe` False

it "is False on direct usage in entry point" $ do
delegates (named "m") (EntryPoint "main" (Reference "m")) `shouldBe` False

it "is False if there is no usage" $ do
delegates (named "m") (EntryPoint "main" (Reference "f")) `shouldBe` False


describe "calls" $ do
it "is True on function application in entry point" $ do
calls (named "m") (EntryPoint "main" (Application (Reference "m") [])) `shouldBe` True
Expand Down
16 changes: 15 additions & 1 deletion src/Language/Mulang/Inspector/Generic.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module Language.Mulang.Inspector.Generic (
parses,
assigns,
calls,
delegates,
uses,
usesIf,
usesYield,
Expand All @@ -23,7 +24,9 @@ module Language.Mulang.Inspector.Generic (
import Language.Mulang.Ast
import Language.Mulang.Identifier
import Language.Mulang.Inspector.Primitive
import Language.Mulang.Generator (declaredIdentifiers, referencedIdentifiers)
import Language.Mulang.Generator (declaredIdentifiers, referencedIdentifiers, declarations, expressions)
import Control.Monad (MonadPlus, guard)


import Data.Maybe (listToMaybe)
import Data.List.Extra (has)
Expand Down Expand Up @@ -51,6 +54,17 @@ calls p = containsExpression f
where f (Call (Reference id) _ ) = p id
f _ = False

-- uncontextualizable
delegates :: IdentifierInspection
delegates p expression = inspect $ do
(Subroutine name1 _) <- declarations expression
(Call (Reference name2) _) <- expressions expression
guard (name1 == name2)
guard (p name1)

-- TODO extract and move
inspect :: [a] -> Bool
inspect = not.null

-- | Inspection that tells whether an expression uses ifs
-- in its definition
Expand Down
2 changes: 2 additions & 0 deletions src/Language/Mulang/Inspector/ObjectOriented/Polymorphism.hs
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ usesTemplateMethod expression = inspect $ do
(SimpleSend Self selector _) <- expressions klass
guard (not . declaresMethod (named selector) $ klass)

-- uncontextualizable
usesDyamicPolymorphism :: Inspection
usesDyamicPolymorphism expression = inspect $ do
(SimpleSend _ selector _) <- expressions expression
guardCount (>1) (methodDeclarationsOf selector expression)

-- uncontextualizable
usesStaticPolymorphism :: Inspection
usesStaticPolymorphism expression = inspect $ do
interface@(Interface interfaceId _ _) <- declarations expression
Expand Down

0 comments on commit 3051c53

Please sign in to comment.