Skip to content

Commit 3201eb6

Browse files
authored
[WX-1531] Struct Literal Type Checking (#7402)
1 parent 6738975 commit 3201eb6

File tree

22 files changed

+1102
-483
lines changed

22 files changed

+1102
-483
lines changed

wdl/model/draft3/src/main/scala/wdl/model/draft3/graph/expression/TypeEvaluator.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import wom.types.WomType
88

99
@typeclass
1010
trait TypeEvaluator[A] {
11-
def evaluateType(a: A, linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle])(implicit
11+
def evaluateType(a: A,
12+
linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle],
13+
typeAliases: Map[String, WomType]
14+
)(implicit
1215
expressionTypeEvaluator: TypeEvaluator[ExpressionElement]
1316
): ErrorOr[WomType]
1417
}

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluators.scala

Lines changed: 184 additions & 38 deletions
Large diffs are not rendered by default.

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

Lines changed: 81 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -18,102 +18,105 @@ import wdl.transforms.biscayne.linking.expression.types.BiscayneTypeEvaluators._
1818

1919
package object types {
2020
implicit val expressionTypeEvaluator: TypeEvaluator[ExpressionElement] = new TypeEvaluator[ExpressionElement] {
21-
override def evaluateType(a: ExpressionElement, linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle])(
22-
implicit typeEvaluator: TypeEvaluator[ExpressionElement]
21+
override def evaluateType(a: ExpressionElement,
22+
linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle],
23+
typeAliases: Map[String, WomType]
24+
)(implicit
25+
typeEvaluator: TypeEvaluator[ExpressionElement]
2326
): ErrorOr[WomType] =
2427
a match {
2528
// Literals:
26-
case a: PrimitiveLiteralExpressionElement => a.evaluateType(linkedValues)(typeEvaluator)
27-
case a: NoneLiteralElement.type => a.evaluateType(linkedValues)(typeEvaluator)
29+
case a: PrimitiveLiteralExpressionElement => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
30+
case a: NoneLiteralElement.type => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
2831

29-
case a: StringLiteral => a.evaluateType(linkedValues)(typeEvaluator)
30-
case a: StringExpression => a.evaluateType(linkedValues)(typeEvaluator)
31-
case a: ObjectLiteral => a.evaluateType(linkedValues)(typeEvaluator)
32-
case a: StructLiteral => a.evaluateType(linkedValues)(typeEvaluator)
33-
case a: MapLiteral => a.evaluateType(linkedValues)(typeEvaluator)
34-
case a: ArrayLiteral => a.evaluateType(linkedValues)(typeEvaluator)
35-
case a: PairLiteral => a.evaluateType(linkedValues)(typeEvaluator)
32+
case a: StringLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
33+
case a: StringExpression => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
34+
case a: ObjectLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
35+
case a: StructLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
36+
case a: MapLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
37+
case a: ArrayLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
38+
case a: PairLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
3639

3740
// Lookups and member accesses:
38-
case a: IdentifierLookup => a.evaluateType(linkedValues)(typeEvaluator)
39-
case a: ExpressionMemberAccess => a.evaluateType(linkedValues)(typeEvaluator)
40-
case a: IdentifierMemberAccess => a.evaluateType(linkedValues)(typeEvaluator)
41-
case a: IndexAccess => a.evaluateType(linkedValues)(typeEvaluator)
41+
case a: IdentifierLookup => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
42+
case a: ExpressionMemberAccess => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
43+
case a: IdentifierMemberAccess => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
44+
case a: IndexAccess => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
4245

4346
// Unary operators:
44-
case a: UnaryNegation => a.evaluateType(linkedValues)(typeEvaluator)
45-
case a: UnaryPlus => a.evaluateType(linkedValues)(typeEvaluator)
46-
case a: LogicalNot => a.evaluateType(linkedValues)(typeEvaluator)
47+
case a: UnaryNegation => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
48+
case a: UnaryPlus => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
49+
case a: LogicalNot => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
4750

4851
// Binary operators (at some point we might want to split these into separate cases):
49-
case a: LogicalOr => a.evaluateType(linkedValues)(typeEvaluator)
50-
case a: LogicalAnd => a.evaluateType(linkedValues)(typeEvaluator)
51-
case a: Equals => a.evaluateType(linkedValues)(typeEvaluator)
52-
case a: NotEquals => a.evaluateType(linkedValues)(typeEvaluator)
53-
case a: LessThan => a.evaluateType(linkedValues)(typeEvaluator)
54-
case a: LessThanOrEquals => a.evaluateType(linkedValues)(typeEvaluator)
55-
case a: GreaterThan => a.evaluateType(linkedValues)(typeEvaluator)
56-
case a: GreaterThanOrEquals => a.evaluateType(linkedValues)(typeEvaluator)
57-
case a: Add => a.evaluateType(linkedValues)(typeEvaluator)
58-
case a: Subtract => a.evaluateType(linkedValues)(typeEvaluator)
59-
case a: Multiply => a.evaluateType(linkedValues)(typeEvaluator)
60-
case a: Divide => a.evaluateType(linkedValues)(typeEvaluator)
61-
case a: Remainder => a.evaluateType(linkedValues)(typeEvaluator)
52+
case a: LogicalOr => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
53+
case a: LogicalAnd => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
54+
case a: Equals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
55+
case a: NotEquals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
56+
case a: LessThan => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
57+
case a: LessThanOrEquals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
58+
case a: GreaterThan => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
59+
case a: GreaterThanOrEquals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
60+
case a: Add => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
61+
case a: Subtract => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
62+
case a: Multiply => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
63+
case a: Divide => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
64+
case a: Remainder => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
6265

63-
case a: TernaryIf => a.evaluateType(linkedValues)(typeEvaluator)
66+
case a: TernaryIf => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
6467

6568
// Engine functions:
66-
case a: ReadLines => a.evaluateType(linkedValues)(typeEvaluator)
67-
case a: ReadTsv => a.evaluateType(linkedValues)(typeEvaluator)
68-
case a: ReadMap => a.evaluateType(linkedValues)(typeEvaluator)
69-
case a: ReadObject => a.evaluateType(linkedValues)(typeEvaluator)
70-
case a: ReadObjects => a.evaluateType(linkedValues)(typeEvaluator)
71-
case a: ReadJson => a.evaluateType(linkedValues)(typeEvaluator)
72-
case a: ReadInt => a.evaluateType(linkedValues)(typeEvaluator)
73-
case a: ReadString => a.evaluateType(linkedValues)(typeEvaluator)
74-
case a: ReadFloat => a.evaluateType(linkedValues)(typeEvaluator)
75-
case a: ReadBoolean => a.evaluateType(linkedValues)(typeEvaluator)
76-
case a: WriteLines => a.evaluateType(linkedValues)(typeEvaluator)
77-
case a: WriteTsv => a.evaluateType(linkedValues)(typeEvaluator)
78-
case a: WriteMap => a.evaluateType(linkedValues)(typeEvaluator)
79-
case a: WriteObject => a.evaluateType(linkedValues)(typeEvaluator)
80-
case a: WriteObjects => a.evaluateType(linkedValues)(typeEvaluator)
81-
case a: WriteJson => a.evaluateType(linkedValues)(typeEvaluator)
82-
case a: Range => a.evaluateType(linkedValues)(typeEvaluator)
83-
case a: Transpose => a.evaluateType(linkedValues)(typeEvaluator)
84-
case a: Length => a.evaluateType(linkedValues)(typeEvaluator)
85-
case a: Flatten => a.evaluateType(linkedValues)(typeEvaluator)
86-
case a: Prefix => a.evaluateType(linkedValues)(typeEvaluator)
87-
case a: Suffix => a.evaluateType(linkedValues)(typeEvaluator)
88-
case a: SelectFirst => a.evaluateType(linkedValues)(typeEvaluator)
89-
case a: SelectAll => a.evaluateType(linkedValues)(typeEvaluator)
90-
case a: Defined => a.evaluateType(linkedValues)(typeEvaluator)
91-
case a: Floor => a.evaluateType(linkedValues)(typeEvaluator)
92-
case a: Ceil => a.evaluateType(linkedValues)(typeEvaluator)
93-
case a: Round => a.evaluateType(linkedValues)(typeEvaluator)
94-
case a: Glob => a.evaluateType(linkedValues)(typeEvaluator)
95-
case a: Quote => a.evaluateType(linkedValues)(typeEvaluator)
96-
case a: SQuote => a.evaluateType(linkedValues)(typeEvaluator)
97-
case a: Size => a.evaluateType(linkedValues)(typeEvaluator)
98-
case a: Basename => a.evaluateType(linkedValues)(typeEvaluator)
69+
case a: ReadLines => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
70+
case a: ReadTsv => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
71+
case a: ReadMap => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
72+
case a: ReadObject => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
73+
case a: ReadObjects => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
74+
case a: ReadJson => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
75+
case a: ReadInt => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
76+
case a: ReadString => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
77+
case a: ReadFloat => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
78+
case a: ReadBoolean => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
79+
case a: WriteLines => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
80+
case a: WriteTsv => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
81+
case a: WriteMap => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
82+
case a: WriteObject => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
83+
case a: WriteObjects => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
84+
case a: WriteJson => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
85+
case a: Range => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
86+
case a: Transpose => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
87+
case a: Length => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
88+
case a: Flatten => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
89+
case a: Prefix => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
90+
case a: Suffix => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
91+
case a: SelectFirst => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
92+
case a: SelectAll => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
93+
case a: Defined => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
94+
case a: Floor => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
95+
case a: Ceil => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
96+
case a: Round => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
97+
case a: Glob => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
98+
case a: Quote => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
99+
case a: SQuote => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
100+
case a: Size => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
101+
case a: Basename => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
99102

100-
case a: Zip => a.evaluateType(linkedValues)(typeEvaluator)
101-
case a: Cross => a.evaluateType(linkedValues)(typeEvaluator)
102-
case a: Unzip => a.evaluateType(linkedValues)(typeEvaluator)
103+
case a: Zip => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
104+
case a: Cross => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
105+
case a: Unzip => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
103106

104-
case a: SubPosix => a.evaluateType(linkedValues)(typeEvaluator)
107+
case a: SubPosix => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
105108

106-
case a: StdoutElement.type => a.evaluateType(linkedValues)(typeEvaluator)
107-
case a: StderrElement.type => a.evaluateType(linkedValues)(typeEvaluator)
109+
case a: StdoutElement.type => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
110+
case a: StderrElement.type => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
108111

109-
case a: Keys => a.evaluateType(linkedValues)(typeEvaluator)
110-
case a: AsMap => a.evaluateType(linkedValues)(typeEvaluator)
111-
case a: AsPairs => a.evaluateType(linkedValues)(typeEvaluator)
112-
case a: CollectByKey => a.evaluateType(linkedValues)(typeEvaluator)
113-
case a: Sep => a.evaluateType(linkedValues)(typeEvaluator)
112+
case a: Keys => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
113+
case a: AsMap => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
114+
case a: AsPairs => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
115+
case a: CollectByKey => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
116+
case a: Sep => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
114117

115-
case a: Min => a.evaluateType(linkedValues)(typeEvaluator)
116-
case a: Max => a.evaluateType(linkedValues)(typeEvaluator)
118+
case a: Min => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
119+
case a: Max => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
117120

118121
case other =>
119122
s"Unable to process ${other.getClass.getSimpleName}: No evaluateType exists for that type.".invalidNel

0 commit comments

Comments
 (0)