Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[WX-1531] Struct Literal Type Checking #7402

Merged
merged 13 commits into from
Apr 10, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ import wom.types.WomType

@typeclass
trait TypeEvaluator[A] {
def evaluateType(a: A, linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle])(implicit
def evaluateType(a: A,
linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle],
typeAliases: Map[String, WomType]
)(implicit
expressionTypeEvaluator: TypeEvaluator[ExpressionElement]
): ErrorOr[WomType]
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -18,102 +18,105 @@

package object types {
implicit val expressionTypeEvaluator: TypeEvaluator[ExpressionElement] = new TypeEvaluator[ExpressionElement] {
override def evaluateType(a: ExpressionElement, linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle])(
implicit typeEvaluator: TypeEvaluator[ExpressionElement]
override def evaluateType(a: ExpressionElement,
linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle],
typeAliases: Map[String, WomType]
)(implicit
typeEvaluator: TypeEvaluator[ExpressionElement]
): ErrorOr[WomType] =
a match {
// Literals:
case a: PrimitiveLiteralExpressionElement => a.evaluateType(linkedValues)(typeEvaluator)
case a: NoneLiteralElement.type => a.evaluateType(linkedValues)(typeEvaluator)
case a: PrimitiveLiteralExpressionElement => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: NoneLiteralElement.type => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 30 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

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

Added line #L30 was not covered by tests

case a: StringLiteral => a.evaluateType(linkedValues)(typeEvaluator)
case a: StringExpression => a.evaluateType(linkedValues)(typeEvaluator)
case a: ObjectLiteral => a.evaluateType(linkedValues)(typeEvaluator)
case a: StructLiteral => a.evaluateType(linkedValues)(typeEvaluator)
case a: MapLiteral => a.evaluateType(linkedValues)(typeEvaluator)
case a: ArrayLiteral => a.evaluateType(linkedValues)(typeEvaluator)
case a: PairLiteral => a.evaluateType(linkedValues)(typeEvaluator)
case a: StringLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: StringExpression => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 33 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

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

Added line #L33 was not covered by tests
case a: ObjectLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: StructLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: MapLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ArrayLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: PairLiteral => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

// Lookups and member accesses:
case a: IdentifierLookup => a.evaluateType(linkedValues)(typeEvaluator)
case a: ExpressionMemberAccess => a.evaluateType(linkedValues)(typeEvaluator)
case a: IdentifierMemberAccess => a.evaluateType(linkedValues)(typeEvaluator)
case a: IndexAccess => a.evaluateType(linkedValues)(typeEvaluator)
case a: IdentifierLookup => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ExpressionMemberAccess => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 42 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

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

Added line #L42 was not covered by tests
case a: IdentifierMemberAccess => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: IndexAccess => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 44 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

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

Added line #L44 was not covered by tests

// Unary operators:
case a: UnaryNegation => a.evaluateType(linkedValues)(typeEvaluator)
case a: UnaryPlus => a.evaluateType(linkedValues)(typeEvaluator)
case a: LogicalNot => a.evaluateType(linkedValues)(typeEvaluator)
case a: UnaryNegation => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: UnaryPlus => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: LogicalNot => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 49 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala#L47-L49

Added lines #L47 - L49 were not covered by tests

// Binary operators (at some point we might want to split these into separate cases):
case a: LogicalOr => a.evaluateType(linkedValues)(typeEvaluator)
case a: LogicalAnd => a.evaluateType(linkedValues)(typeEvaluator)
case a: Equals => a.evaluateType(linkedValues)(typeEvaluator)
case a: NotEquals => a.evaluateType(linkedValues)(typeEvaluator)
case a: LessThan => a.evaluateType(linkedValues)(typeEvaluator)
case a: LessThanOrEquals => a.evaluateType(linkedValues)(typeEvaluator)
case a: GreaterThan => a.evaluateType(linkedValues)(typeEvaluator)
case a: GreaterThanOrEquals => a.evaluateType(linkedValues)(typeEvaluator)
case a: Add => a.evaluateType(linkedValues)(typeEvaluator)
case a: Subtract => a.evaluateType(linkedValues)(typeEvaluator)
case a: Multiply => a.evaluateType(linkedValues)(typeEvaluator)
case a: Divide => a.evaluateType(linkedValues)(typeEvaluator)
case a: Remainder => a.evaluateType(linkedValues)(typeEvaluator)
case a: LogicalOr => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: LogicalAnd => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Equals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: NotEquals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: LessThan => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: LessThanOrEquals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: GreaterThan => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: GreaterThanOrEquals => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Add => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Subtract => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Multiply => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Divide => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Remainder => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 64 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala#L52-L64

Added lines #L52 - L64 were not covered by tests

case a: TernaryIf => a.evaluateType(linkedValues)(typeEvaluator)
case a: TernaryIf => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 66 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

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

Added line #L66 was not covered by tests

// Engine functions:
case a: ReadLines => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadTsv => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadMap => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadObject => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadObjects => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadJson => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadInt => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadString => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadFloat => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadBoolean => a.evaluateType(linkedValues)(typeEvaluator)
case a: WriteLines => a.evaluateType(linkedValues)(typeEvaluator)
case a: WriteTsv => a.evaluateType(linkedValues)(typeEvaluator)
case a: WriteMap => a.evaluateType(linkedValues)(typeEvaluator)
case a: WriteObject => a.evaluateType(linkedValues)(typeEvaluator)
case a: WriteObjects => a.evaluateType(linkedValues)(typeEvaluator)
case a: WriteJson => a.evaluateType(linkedValues)(typeEvaluator)
case a: Range => a.evaluateType(linkedValues)(typeEvaluator)
case a: Transpose => a.evaluateType(linkedValues)(typeEvaluator)
case a: Length => a.evaluateType(linkedValues)(typeEvaluator)
case a: Flatten => a.evaluateType(linkedValues)(typeEvaluator)
case a: Prefix => a.evaluateType(linkedValues)(typeEvaluator)
case a: Suffix => a.evaluateType(linkedValues)(typeEvaluator)
case a: SelectFirst => a.evaluateType(linkedValues)(typeEvaluator)
case a: SelectAll => a.evaluateType(linkedValues)(typeEvaluator)
case a: Defined => a.evaluateType(linkedValues)(typeEvaluator)
case a: Floor => a.evaluateType(linkedValues)(typeEvaluator)
case a: Ceil => a.evaluateType(linkedValues)(typeEvaluator)
case a: Round => a.evaluateType(linkedValues)(typeEvaluator)
case a: Glob => a.evaluateType(linkedValues)(typeEvaluator)
case a: Quote => a.evaluateType(linkedValues)(typeEvaluator)
case a: SQuote => a.evaluateType(linkedValues)(typeEvaluator)
case a: Size => a.evaluateType(linkedValues)(typeEvaluator)
case a: Basename => a.evaluateType(linkedValues)(typeEvaluator)
case a: ReadLines => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadTsv => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadMap => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadObject => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadObjects => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 73 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala#L72-L73

Added lines #L72 - L73 were not covered by tests
case a: ReadJson => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadInt => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadString => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadFloat => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: ReadBoolean => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: WriteLines => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: WriteTsv => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: WriteMap => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: WriteObject => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: WriteObjects => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: WriteJson => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Range => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Transpose => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Length => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Flatten => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Prefix => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 89 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala#L77-L89

Added lines #L77 - L89 were not covered by tests
case a: Suffix => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: SelectFirst => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: SelectAll => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Defined => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Floor => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Ceil => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Round => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Glob => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 97 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala#L91-L97

Added lines #L91 - L97 were not covered by tests
case a: Quote => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: SQuote => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Size => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Basename => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 101 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala#L100-L101

Added lines #L100 - L101 were not covered by tests

case a: Zip => a.evaluateType(linkedValues)(typeEvaluator)
case a: Cross => a.evaluateType(linkedValues)(typeEvaluator)
case a: Unzip => a.evaluateType(linkedValues)(typeEvaluator)
case a: Zip => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Cross => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 104 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala#L103-L104

Added lines #L103 - L104 were not covered by tests
case a: Unzip => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

case a: SubPosix => a.evaluateType(linkedValues)(typeEvaluator)
case a: SubPosix => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

case a: StdoutElement.type => a.evaluateType(linkedValues)(typeEvaluator)
case a: StderrElement.type => a.evaluateType(linkedValues)(typeEvaluator)
case a: StdoutElement.type => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: StderrElement.type => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 110 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

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

Added line #L110 was not covered by tests

case a: Keys => a.evaluateType(linkedValues)(typeEvaluator)
case a: AsMap => a.evaluateType(linkedValues)(typeEvaluator)
case a: AsPairs => a.evaluateType(linkedValues)(typeEvaluator)
case a: CollectByKey => a.evaluateType(linkedValues)(typeEvaluator)
case a: Sep => a.evaluateType(linkedValues)(typeEvaluator)
case a: Keys => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: AsMap => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: AsPairs => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: CollectByKey => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Sep => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

Check warning on line 116 in wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala

View check run for this annotation

Codecov / codecov/patch

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

Added line #L116 was not covered by tests

case a: Min => a.evaluateType(linkedValues)(typeEvaluator)
case a: Max => a.evaluateType(linkedValues)(typeEvaluator)
case a: Min => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)
case a: Max => a.evaluateType(linkedValues, typeAliases)(typeEvaluator)

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