Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Type checker #346

Merged
merged 326 commits into from
Aug 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
326 commits
Select commit Hold shift + click to select a range
3ca29b6
Incremental
edwardpeters Aug 15, 2023
d06fa75
Incremental
edwardpeters Aug 15, 2023
50358ea
Incremental
edwardpeters Aug 15, 2023
0e580d9
Incremental
edwardpeters Aug 15, 2023
0e85bd7
Incremental
edwardpeters Aug 15, 2023
574af66
Incremental
edwardpeters Aug 15, 2023
7f95051
Incremental
edwardpeters Aug 15, 2023
97feb3b
Incremental
edwardpeters Aug 15, 2023
5186062
Incremental
edwardpeters Aug 15, 2023
7c09cde
Incremental
edwardpeters Aug 15, 2023
3df7774
New test file and cleanup
edwardpeters Aug 15, 2023
b93b5b8
Incremental
edwardpeters Aug 15, 2023
322e536
Incremental
edwardpeters Aug 15, 2023
6aa3ea2
Incremental
edwardpeters Aug 15, 2023
12f33eb
Incremental
edwardpeters Aug 15, 2023
bcb3ff8
Incremental
edwardpeters Aug 15, 2023
c58d710
Incremental
edwardpeters Aug 15, 2023
0654f70
Incremental
edwardpeters Aug 15, 2023
f326bae
Incremental
edwardpeters Aug 15, 2023
09bca57
Incremental
edwardpeters Aug 15, 2023
d5b58ff
Incremental
edwardpeters Aug 15, 2023
a1dfc8e
Incremental
edwardpeters Aug 15, 2023
930f17e
Incremental
edwardpeters Aug 15, 2023
d8e2de8
Incremental
edwardpeters Aug 15, 2023
dd0e108
Incremental
edwardpeters Aug 15, 2023
78e2a01
New test
edwardpeters Aug 15, 2023
9444f44
New test
edwardpeters Aug 15, 2023
aca7257
Incremental
edwardpeters Aug 15, 2023
2cf7475
Incremental
edwardpeters Aug 15, 2023
ae31993
Incremental
edwardpeters Aug 15, 2023
2707c03
Incremental
edwardpeters Aug 15, 2023
781749d
Incremental
edwardpeters Aug 15, 2023
73e24a5
Incremental
edwardpeters Aug 15, 2023
c35225b
Incremental
edwardpeters Aug 15, 2023
959a46a
Incremental
edwardpeters Aug 15, 2023
0059ab6
Incremental
edwardpeters Aug 15, 2023
fdd9524
Incremental
edwardpeters Aug 15, 2023
1099c8e
Incremental
edwardpeters Aug 15, 2023
ba0fbcb
Incremental
edwardpeters Aug 15, 2023
c8a8cf2
Incremental
edwardpeters Aug 15, 2023
7e38036
Incremental
edwardpeters Aug 15, 2023
462361e
Incremental
edwardpeters Aug 15, 2023
2dc1495
Incremental
edwardpeters Aug 15, 2023
ae5238a
Incremental
edwardpeters Aug 15, 2023
fe4520e
Incremental
edwardpeters Aug 15, 2023
b266002
Incremental
edwardpeters Aug 15, 2023
cea0ee8
Incremental
edwardpeters Aug 15, 2023
b871808
Incremental
edwardpeters Aug 15, 2023
310d46f
Incremental
edwardpeters Aug 15, 2023
a9c26f7
Incremental
edwardpeters Aug 15, 2023
664909e
Test file cleanup
edwardpeters Aug 15, 2023
6da75fc
Incremental
edwardpeters Aug 15, 2023
f958988
Incremental
edwardpeters Aug 15, 2023
848d417
Incremental
edwardpeters Aug 15, 2023
611a456
Incremental
edwardpeters Aug 15, 2023
25e60f8
Incremental
edwardpeters Aug 15, 2023
44d8c5e
Incremental
edwardpeters Aug 15, 2023
ab7bdfc
Incremental
edwardpeters Aug 15, 2023
0e76037
Incremental
edwardpeters Aug 15, 2023
550459d
Incremental
edwardpeters Aug 15, 2023
1dcc5f4
Incremental
edwardpeters Aug 15, 2023
f067034
Incremental
edwardpeters Aug 15, 2023
aecd361
Incremental
edwardpeters Aug 15, 2023
97b2cd6
Incremental
edwardpeters Aug 15, 2023
3671b14
Incremental
edwardpeters Aug 15, 2023
59d5938
Incremental
edwardpeters Aug 15, 2023
5cd2a27
Incremental
edwardpeters Aug 15, 2023
8619b3a
Incremental
edwardpeters Aug 15, 2023
981392c
Incremental
edwardpeters Aug 15, 2023
4269572
Incremental
edwardpeters Aug 15, 2023
2a175b0
Incremental
edwardpeters Aug 15, 2023
673a6b0
Incremental
edwardpeters Aug 15, 2023
32c5c77
Incremental
edwardpeters Aug 15, 2023
b53b2fc
Incremental
edwardpeters Aug 15, 2023
3116aaa
Incremental
edwardpeters Aug 15, 2023
6ee91fc
Incremental
edwardpeters Aug 15, 2023
0ac97c6
Incremental
edwardpeters Aug 15, 2023
3d46f84
Incremental
edwardpeters Aug 15, 2023
cd6ec79
Incremental
edwardpeters Aug 15, 2023
6796521
Incremental
edwardpeters Aug 15, 2023
eb24ace
Incremental
edwardpeters Aug 15, 2023
666a7b0
Incremental
edwardpeters Aug 15, 2023
d165538
Incremental
edwardpeters Aug 15, 2023
2032c5c
Incremental
edwardpeters Aug 15, 2023
e92248e
Incremental
edwardpeters Aug 15, 2023
aaab052
Incremental
edwardpeters Aug 15, 2023
4b2629a
Incremental
edwardpeters Aug 15, 2023
f9f123d
Incremental
edwardpeters Aug 15, 2023
4043292
Incremental
edwardpeters Aug 15, 2023
e1a8f8b
Incremental
edwardpeters Aug 15, 2023
d6da4ce
Incremental
edwardpeters Aug 15, 2023
9453c84
Incremental
edwardpeters Aug 15, 2023
04367b2
Incremental
edwardpeters Aug 15, 2023
7c9d771
Incremental
edwardpeters Aug 15, 2023
5c9226a
Incremental
edwardpeters Aug 15, 2023
2c15c50
Incremental
edwardpeters Aug 15, 2023
2b7ea26
Incremental
edwardpeters Aug 15, 2023
cf4f799
Incremental
edwardpeters Aug 15, 2023
8dd4cc3
Incremental
edwardpeters Aug 15, 2023
f1dfb58
Incremental
edwardpeters Aug 15, 2023
a019cb5
Incremental
edwardpeters Aug 15, 2023
3bcb91b
Incremental
edwardpeters Aug 15, 2023
678399d
Incremental
edwardpeters Aug 15, 2023
4648ea4
Incremental
edwardpeters Aug 15, 2023
a6a666e
Incremental
edwardpeters Aug 15, 2023
d71cf27
Incremental
edwardpeters Aug 15, 2023
eccc329
Incremental
edwardpeters Aug 15, 2023
7cf6239
Incremental
edwardpeters Aug 15, 2023
9da115f
Incremental
edwardpeters Aug 15, 2023
bb1dda2
Incremental
edwardpeters Aug 15, 2023
5d5a465
Incremental
edwardpeters Aug 15, 2023
ec3c607
Incremental
edwardpeters Aug 15, 2023
3277e2f
Incremental
edwardpeters Aug 15, 2023
60e8595
Incremental
edwardpeters Aug 15, 2023
90715dc
Incremental
edwardpeters Aug 15, 2023
35ca3e6
Incremental
edwardpeters Aug 15, 2023
997e8f6
Incremental
edwardpeters Aug 15, 2023
2140a7a
Incremental
edwardpeters Aug 15, 2023
c8b618e
Incremental
edwardpeters Aug 15, 2023
2725068
Incremental
edwardpeters Aug 15, 2023
67437dc
Incremental
edwardpeters Aug 15, 2023
5c8967c
Incremental
edwardpeters Aug 15, 2023
f445eb4
Incremental
edwardpeters Aug 15, 2023
b972c1a
Incremental
edwardpeters Aug 15, 2023
1403f1a
Incremental
edwardpeters Aug 15, 2023
09428f6
Incremental
edwardpeters Aug 15, 2023
3c26819
Incremental
edwardpeters Aug 15, 2023
43bf9a5
Incremental
edwardpeters Aug 15, 2023
efba698
Incremental
edwardpeters Aug 15, 2023
ec0946c
Incremental
edwardpeters Aug 15, 2023
ef23d35
Incremental
edwardpeters Aug 15, 2023
97776b4
Incremental
edwardpeters Aug 15, 2023
9f4910a
Incremental
edwardpeters Aug 15, 2023
22eed6c
Incremental
edwardpeters Aug 15, 2023
02466e2
Incremental
edwardpeters Aug 15, 2023
61968ea
Incremental
edwardpeters Aug 15, 2023
30a888b
Incremental
edwardpeters Aug 15, 2023
d9fc133
Incremental
edwardpeters Aug 15, 2023
6bfe038
Incremental
edwardpeters Aug 15, 2023
8a283a0
Incremental
edwardpeters Aug 15, 2023
d831b18
Incremental
edwardpeters Aug 15, 2023
80924d2
Incremental
edwardpeters Aug 15, 2023
eee6665
Incremental
edwardpeters Aug 16, 2023
d9758e7
Incremental
edwardpeters Aug 17, 2023
bf6280d
Incremental
edwardpeters Aug 17, 2023
f302b8c
Incremental
edwardpeters Aug 22, 2023
29ec7fb
Incremental
edwardpeters Aug 22, 2023
f55e430
Incremental
edwardpeters Aug 22, 2023
8ead4ab
Incremental
edwardpeters Aug 22, 2023
83fc2ee
Incremental
edwardpeters Aug 22, 2023
562c3b6
Incremental
edwardpeters Aug 22, 2023
ba9fdcc
Incremental
edwardpeters Aug 22, 2023
e806727
Incremental
edwardpeters Aug 22, 2023
80df6c0
Incremental
edwardpeters Aug 22, 2023
dd6b284
Merge branch 'main' into type-checker
edwardpeters Aug 22, 2023
34e9d20
Incremental
edwardpeters Aug 22, 2023
63bf621
Incremental
edwardpeters Aug 22, 2023
0d6289e
Incremental
edwardpeters Aug 22, 2023
f93263b
Incremental
edwardpeters Aug 23, 2023
fe80c5b
Incremental
edwardpeters Aug 23, 2023
99d183d
Incremental
edwardpeters Aug 23, 2023
515bba6
Incremental
edwardpeters Aug 23, 2023
b747868
Incremental
edwardpeters Aug 23, 2023
2990e2c
Incremental
edwardpeters Aug 23, 2023
06c7e9f
Incremental
edwardpeters Aug 23, 2023
e675b28
Incremental
edwardpeters Aug 23, 2023
d7eaa61
Incremental
edwardpeters Aug 23, 2023
05dac24
Incremental
edwardpeters Aug 23, 2023
ae7d7bf
Incremental
edwardpeters Aug 23, 2023
516c4a9
Incremental
edwardpeters Aug 23, 2023
029961c
Incremental
edwardpeters Aug 23, 2023
e893452
Incremental
edwardpeters Aug 24, 2023
2385eff
Incremental
edwardpeters Aug 24, 2023
cee14a8
Incremental
edwardpeters Aug 24, 2023
b581e37
Incremental
edwardpeters Aug 24, 2023
3e2f694
Incremental
edwardpeters Aug 24, 2023
2d5cef5
Incremental
edwardpeters Aug 24, 2023
5c9b316
Incremental
edwardpeters Aug 24, 2023
26b1d58
Incremental
edwardpeters Aug 24, 2023
98287c8
Incremental
edwardpeters Aug 24, 2023
dda5795
Incremental
edwardpeters Aug 24, 2023
285558f
Incremental
edwardpeters Aug 24, 2023
eadb13e
Incremental
edwardpeters Aug 24, 2023
9e3b984
Incremental
edwardpeters Aug 24, 2023
86b6e8d
Incremental
edwardpeters Aug 24, 2023
70c44aa
Changes to move to new type error completely
edwardpeters Aug 24, 2023
3b80d46
Incremental
edwardpeters Aug 24, 2023
bba2416
Incremental
edwardpeters Aug 24, 2023
85a5a95
Incremental
edwardpeters Aug 24, 2023
de98621
Incremental
edwardpeters Aug 24, 2023
b8742f2
Incremental
edwardpeters Aug 24, 2023
1f52414
Incremental
edwardpeters Aug 24, 2023
edaf5cc
Incremental
edwardpeters Aug 24, 2023
a8a0787
Incremental
edwardpeters Aug 24, 2023
5652bcc
Formatting
edwardpeters Aug 24, 2023
fc52396
Formatting
edwardpeters Aug 24, 2023
a9b8064
Formatting
edwardpeters Aug 24, 2023
bb1d636
Incremental
edwardpeters Aug 24, 2023
b12fcee
Incremental
edwardpeters Aug 24, 2023
f9ee2df
Incremental
edwardpeters Aug 24, 2023
a017853
Formatting
edwardpeters Aug 24, 2023
2effef8
Incremental
edwardpeters Aug 24, 2023
549aeea
Incremental
edwardpeters Aug 24, 2023
ec12dcd
Incremental
edwardpeters Aug 24, 2023
56496a5
Formatting
edwardpeters Aug 24, 2023
6a6239e
Merge branch 'main' into type-checker
edwardpeters Aug 24, 2023
1cfac3d
Incremental
edwardpeters Aug 24, 2023
5343a1d
Incremental
edwardpeters Aug 24, 2023
33c936e
Incremental
edwardpeters Aug 25, 2023
c6f29b1
Incremental
edwardpeters Aug 25, 2023
2175d2e
Incremental
edwardpeters Aug 25, 2023
a69cc4e
Incremental
edwardpeters Aug 25, 2023
e637ec5
Incremental
edwardpeters Aug 25, 2023
33c7c39
Incremental
edwardpeters Aug 25, 2023
c8aff21
Incremental
edwardpeters Aug 25, 2023
3bf8779
Incremental
edwardpeters Aug 25, 2023
7d76588
Incremental
edwardpeters Aug 25, 2023
85456aa
Incremental
edwardpeters Aug 25, 2023
f51738d
Incremental
edwardpeters Aug 25, 2023
9feb4fa
Incremental
edwardpeters Aug 25, 2023
5cc2f74
Incremental
edwardpeters Aug 25, 2023
b55c66a
Incremental
edwardpeters Aug 25, 2023
d8d1ef4
Incremental
edwardpeters Aug 25, 2023
a932323
Incremental
edwardpeters Aug 25, 2023
44e48e1
Incremental
edwardpeters Aug 25, 2023
fdfb531
Incremental
edwardpeters Aug 25, 2023
e82fb87
Incremental
edwardpeters Aug 25, 2023
9a7fc15
Incremental
edwardpeters Aug 25, 2023
5ac8df1
Incremental
edwardpeters Aug 25, 2023
e26f5f3
Incremental
edwardpeters Aug 25, 2023
a14abc2
Incremental
edwardpeters Aug 25, 2023
305fe24
Incremental
edwardpeters Aug 25, 2023
bd6f932
Incremental
edwardpeters Aug 25, 2023
3774d92
Incremental
edwardpeters Aug 25, 2023
8e74b5c
Incremental
edwardpeters Aug 25, 2023
1b703a0
Incremental
edwardpeters Aug 25, 2023
f861413
Incremental
edwardpeters Aug 25, 2023
85b9d6c
Incremental
edwardpeters Aug 25, 2023
7296003
Incremental
edwardpeters Aug 25, 2023
8f8671b
Formatting
edwardpeters Aug 25, 2023
2b1640d
Incremental
edwardpeters Aug 25, 2023
d167121
Formatting
edwardpeters Aug 25, 2023
e9b0bcc
Switch error type to MorphirRuntimeError
edwardpeters Aug 25, 2023
02d2ab2
Switch error type to MorphirRuntimeError
edwardpeters Aug 25, 2023
1023ace
merge
edwardpeters Aug 25, 2023
5ff3e67
Incremental
edwardpeters Aug 25, 2023
c392655
Formatting
edwardpeters Aug 25, 2023
a26ff8d
Incremental
edwardpeters Aug 25, 2023
78976b2
Updated morphir IR
edwardpeters Aug 25, 2023
69595d6
Formatting
edwardpeters Aug 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"src/Morphir/Examples/App/ConstructorTests.elm": "56fdf0bd81a5d4b51e8e94cf16d01c05",
"src/Morphir/Examples/App/CurrentTest.elm": "7217989153ede6e82dfe1edb324e8aa5",
"src/Morphir/Examples/App/DestructureTests.elm": "130b60a9f5c1f62b9e1394b2b1b74339",
"src/Morphir/Examples/App/DictionaryTests.elm": "8405796239dd9d7f7794fb119dd54124",
"src/Morphir/Examples/App/DictionaryTests.elm": "df2a17d866f6e6ee78672ecbb8ca219c",
"src/Morphir/Examples/App/EllieStuff.elm": "f9259184f634d714dabcd8ec90f07e7a",
"src/Morphir/Examples/App/EnumTest.elm": "1bdb50499357960926f3ffe7984a83c0",
"src/Morphir/Examples/App/ExampleModule.elm": "e90c60dd8d4756d55d91efd7923a8cca",
Expand All @@ -19,8 +19,10 @@
"src/Morphir/Examples/App/OptionTests.elm": "7be9a6971b4cd70e2f622664ebaf8a16",
"src/Morphir/Examples/App/PatternMatchTests.elm": "2d597bd3d8d6353fe4fc5f4d9b739fca",
"src/Morphir/Examples/App/RecordTests.elm": "bf6e25596923414d93d9bc532f35293e",
"src/Morphir/Examples/App/SetTests.elm": "72a2dcc13ebc592e3f63c9733e064443",
"src/Morphir/Examples/App/SimpleTests.elm": "f7794a1165f7fe3e5df89b84d0bdbcd8",
"src/Morphir/Examples/App/SkdBasicTests.elm": "930eb32abe511d003720cfaffcc114b0",
"src/Morphir/Examples/App/TupleTests.elm": "2c80092fe40ef7666906ee42214376ac",
"src/Morphir/Examples/App/TypeCheckerTests.elm": "6da55ef4bc0d30651b1119c3b84206d2",
"src/Morphir/Examples/App/UserDefinedReferenceTests.elm": "9bf29afa60bad03b200d08ac8f099b99"
}
73,783 changes: 50,381 additions & 23,402 deletions examples/morphir-elm-projects/evaluator-tests/morphir-ir.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
module Morphir.Examples.App.TypeCheckerTests exposing (..)

intToInt : Int -> Int
intToInt x = x

tupleUp : t -> t -> (t, t)
tupleUp x y = (x, y)

withParam : (List a) -> a
withParam l = case l of
Expand All @@ -9,4 +14,7 @@ withParam l = case l of
withInt : (List Int) -> Int
withInt l = case l of
head :: _ -> head
_ -> withParam l
_ -> withParam l

twoArgEntry : Int -> String -> (Int, String)
twoArgEntry i s = (i, s)
19 changes: 0 additions & 19 deletions examples/morphir-elm-projects/evaluator-tests/tests.txt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,11 @@ trait EvaluationLibraryPlatformSpecific {
.mapError(MorphirIRDecodingError(_))
} yield morphirIRFile.distribution

def loadValueFromFileZIO(fileName: String): Task[TypedValue] =
for {
fileContents <- ZIO.readFile(fileName)
value <- ZIO.fromEither(fileContents.fromJson[TypedValue])
.mapError(MorphirIRDecodingError(_))
} yield value

}
104 changes: 104 additions & 0 deletions morphir/runtime/src/org/finos/morphir/runtime/Distributions.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package org.finos.morphir.runtime

import org.finos.morphir.naming._
import org.finos.morphir.naming._
import org.finos.morphir.ir.{Type as T, Value as V}
import org.finos.morphir.ir.Value.{
Value,
Pattern,
TypedValue,
USpecification => UValueSpec,
TypedDefinition => TypedValueDef
}
import org.finos.morphir.ir.Type.{Type, UType, USpecification => UTypeSpec}
import org.finos.morphir.ir.Module.{Specification => ModSpec, Definition => ModDef}
import org.finos.morphir.ir.sdk
import org.finos.morphir.ir.sdk.Basics
import org.finos.morphir.ir.Field
import org.finos.morphir.runtime.exports.*
import org.finos.morphir.ir.distribution.Distribution
import org.finos.morphir.ir.distribution.Distribution.Library
import zio.Chunk

//TODO: Error hierarchy and code should reflect possibility of specification lookup
sealed abstract class LookupError(msg: String) extends Exception(msg) {
def getMsg: String = msg
}
case class MissingPackage(pkgName: PackageName) extends LookupError(s"Package ${pkgName.toString} not found")
case class MissingModule(pkgName: PackageName, modName: ModuleName)
extends LookupError(s"Package ${pkgName.toString} does not contain module ${modName.toString}")
case class MissingType(pkgName: PackageName, modName: ModuleName, typeName: Name)
extends LookupError(s"Module ${pkgName.toString}:${modName.toString} has no type named ${typeName.toTitleCase}")
case class MissingDefinition(pkgName: PackageName, modName: ModuleName, defName: Name) extends LookupError(
s"Module ${pkgName.toString}:${modName.toString} has no definition named ${defName.toCamelCase}"
)
case class MissingConstructor(pkgName: PackageName, modName: ModuleName, ctorName: Name) extends LookupError(
s"Module ${pkgName.toString}:${modName.toString} has no constructor named ${ctorName.toTitleCase}"
)

class Distributions(dists: Map[PackageName, Distribution]) {
def lookupModuleSpecification(pkgName: PackageName, modName: ModuleName): Either[LookupError, ModSpec.Raw] =
dists.get(pkgName) match {
case Some(Library(_, _, packageDef)) =>
packageDef.toSpecification.modules.get(modName) match {
case Some(module) => Right(module)
case None => Left(new MissingModule(pkgName, modName))
}
case None => Left(new MissingPackage(pkgName))
}

def lookupModuleDefinition(pkgName: PackageName, modName: ModuleName): Either[LookupError, ModDef[Unit, UType]] =
dists.get(pkgName) match {
case Some(Library(_, _, packageDef)) =>
packageDef.modules.get(modName) match {
case Some(module) => Right(module.value)
case None => Left(new MissingModule(pkgName, modName))
}
case None => Left(new MissingPackage(pkgName))
}

def lookupTypeSpecification(
pkgName: PackageName,
modName: ModuleName,
localName: Name
): Either[LookupError, UTypeSpec] =
lookupModuleSpecification(pkgName, modName).flatMap(_.lookupTypeSpecification(localName) match {
case Some(tpe) => Right(tpe)
case None => Left(new MissingType(pkgName, modName, localName))
})

def lookupTypeSpecification(fqn: FQName): Either[LookupError, UTypeSpec] =
lookupTypeSpecification(fqn.packagePath, fqn.modulePath, fqn.localName)

def lookupValueSpecification(
pkgName: PackageName,
modName: ModuleName,
localName: Name
): Either[LookupError, UValueSpec] =
lookupModuleSpecification(pkgName, modName).flatMap(_.lookupValueSpecification(localName) match {
case Some(tpe) => Right(tpe)
case None => Left(new MissingDefinition(pkgName, modName, localName))
})

def lookupValueSpecification(fqn: FQName): Either[LookupError, UValueSpec] =
lookupValueSpecification(fqn.packagePath, fqn.modulePath, fqn.localName)

def lookupValueDefinition(
pkgName: PackageName,
modName: ModuleName,
localName: Name
): Either[LookupError, TypedValueDef] =
lookupModuleDefinition(pkgName, modName).flatMap(_.lookupValueDefinition(localName) match {
case Some(tpe) => Right(tpe)
case None => Left(new MissingDefinition(pkgName, modName, localName))
})

def lookupValueDefinition(fqn: FQName): Either[LookupError, TypedValueDef] =
lookupValueDefinition(fqn.packagePath, fqn.modulePath, fqn.localName)
def getDists: Map[PackageName, Distribution] = dists
}

object Distributions {
def apply(dists: Distribution*): Distributions =
new Distributions(dists.map { case (lib: Library) => lib.packageName -> lib }.toMap)
}
213 changes: 213 additions & 0 deletions morphir/runtime/src/org/finos/morphir/runtime/Extractors.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
package org.finos.morphir.runtime

import org.finos.morphir.naming._
import org.finos.morphir.ir.{Type as T, Value as V}
import org.finos.morphir.ir.Value.{Value, Pattern, TypedValue, USpecification => UValueSpec}
import org.finos.morphir.ir.Type.{Type, UType, USpecification => UTypeSpec}
import org.finos.morphir.ir.sdk
import org.finos.morphir.ir.sdk.Basics
import org.finos.morphir.ir.Field
import org.finos.morphir.runtime.exports.*
import zio.Chunk
import Extractors.Types

object Extractors {

object FQString {
def unapply(fqName: FQName): Option[String] = Some(fqName.toString())
}
object Types {
object ListRef {
def unapply(tpe: UType): Option[UType] =
tpe match {
// TODO: The SDK specification should make these names available, without requiring a type argument
case Type.Reference(_, FQString("Morphir.SDK:List:list"), Chunk(elementType)) =>
Some(elementType)
case _ => None
}
}

object SetRef {
def unapply(tpe: UType): Option[UType] =
tpe match {
case Type.Reference(_, FQString("Morphir.SDK:Set:set"), Chunk(elementType)) =>
Some(elementType)
case _ => None
}
}
object MaybeRef {
def unapply(tpe: UType): Option[UType] =
tpe match {
case Type.Reference(_, FQString("Morphir.SDK:Maybe:maybe"), Chunk(elementType)) =>
Some(elementType)
case _ => None
}
}

object ResultRef {
def unapply(tpe: UType): Option[(UType, UType)] =
tpe match {
case Type.Reference(_, FQString("Morphir.SDK:Result:result"), Chunk(keyType, valType)) =>
Some((keyType, valType))
case _ => None
}
}
object DictRef {
def unapply(tpe: UType): Option[(UType, UType)] =
tpe match {
case Type.Reference(_, FQString("Morphir.SDK:Dict:dict"), Chunk(keyType, valType)) =>
Some((keyType, valType))
case _ => None
}
}
trait CommonReference {
val tpe: UType
// TODO: Consider exposing more at the SDK level, so that these type names may be looked up w/o the "asInstanceOf"
def ref = tpe.asInstanceOf[Type.Reference[Unit]]
def unapply(argTpe: UType): Boolean =
argTpe match {
case Type.Reference(_, fqName, Chunk()) if fqName == ref.typeName => true
case _ => false
}
}
object IntRef extends CommonReference {
final val tpe = Basics.intType
}
object Int16Ref extends CommonReference {
final val tpe = sdk.Int.int16Type
}
object Int32Ref extends CommonReference {
final val tpe = sdk.Int.int32Type
}
object Int64Ref extends CommonReference {
final val tpe = sdk.Int.int64Type
}
object BoolRef extends CommonReference {
final val tpe = Basics.boolType
}
object FloatRef extends CommonReference {
final val tpe = Basics.floatType
}
object DecimalRef extends CommonReference {
final val tpe = sdk.Decimal.decimalType
}
object StringRef extends CommonReference {
final val tpe = sdk.String.stringType
}
object CharRef extends CommonReference {
final val tpe = sdk.Char.charType
}
object LocalDateRef extends CommonReference {
final val tpe = sdk.LocalDate.localDateType
}
object LocalTimeRef extends CommonReference {
final val tpe = sdk.LocalTime.localTimeType
}
// Matches anything w/o nested subtypes
object LeafType {
def unapply(tpe: UType): Boolean =
tpe match {
case Type.Reference(_, _, Chunk()) => true
case Type.Unit(_) => true
case _ => false
}
}
// Matches any reference that does not come from the morphir SDK
object NonNativeRef {
def unapply(tpe: UType): Option[(FQName, Chunk[UType])] =
tpe match {
case Type.Reference(_, name, args)
if (!Utils.isNative(name)) =>
Some((name, args))
case _ => None
}
}
// Matches any reference that does come from the DK
object NativeRef {
def unapply(tpe: UType): Option[(FQName, Chunk[UType])] =
tpe match {
case Type.Reference(_, name, args)
if (Utils.isNative(name)) =>
Some((name, args))
case _ => None
}
}
// Extractor object that unwraps a single layer of aliasing, applying any bindings that were discovered in the process
class Dealiased(dists: Distributions) {
def unapply(tpe: UType): Option[UType] = // If it's aliased we may need to grab bindings
tpe match {
case NativeRef(_, _) => None
case Type.Reference(_, typeName, typeArgs) =>
val lookedUp = dists.lookupTypeSpecification(typeName.packagePath, typeName.modulePath, typeName.localName)
lookedUp match {
case Right(T.Specification.TypeAliasSpecification(typeParams, expr)) =>
val newBindings = typeParams.zip(typeArgs).toMap
Some(Utils.applyBindings(expr, newBindings))
case _ => None // Missing name, but failing extractors cause problems
}
case _ => None
}
}

// Extractor object that uncurries a function type, dealiasing along the way to reeturn a result value and flat list of arguments
class CurriedOnion(dists: Distributions) {
val dealiaser = new Dealiased(dists)
def unapply(tpe: UType): Option[(UType, List[UType])] = {
val myself = this
tpe match {
case Type.Function(_, arg, myself(inner, args)) =>
Some((inner, args :+ arg))
case dealiaser(myself(inner, args)) =>
Some((inner, args))
case other =>
Some((other, List()))
}
}
}
}
object Values {
// Extractor that helps handle currying
object ApplyChain {
def unapply(value: TypedValue): Option[(TypedValue, List[TypedValue])] = value match {
case Value.Apply(_, ApplyChain(inner, args), arg) => Some((inner, args :+ arg))
case other => Some((other, List()))
}
}
object JustConstructor {
def unapply(value: TypedValue): Option[TypedValue] =
value match {
case Value.Apply(_, Value.Constructor(_, FQString("Morphir.SDK:Maybe:just")), something) =>
Some(something)
case _ => None
}
}
object NothingConstructor {
def unapply(value: TypedValue): Boolean =
value match {
case Value.Constructor(_, FQString("Morphir.SDK:Maybe:nothing")) =>
true
case _ => false
}
}

object NonNativeRef {
def unapply(value: TypedValue): Option[(UType, FQName)] =
value match {
case Value.Reference(tpe, name)
if (!Utils.isNative(name)) =>
Some((tpe, name))
case _ => None
}
}

object NativeRef {
def unapply(value: TypedValue): Option[(UType, FQName)] =
value match {
case Value.Reference(tpe, name)
if (Utils.isNative(name)) =>
Some((tpe, name))
case _ => None
}
}
}
}
Loading