Introduce typed semantic analysis pipeline
This commit is contained in:
parent
117d188194
commit
f4cd4f4458
30 changed files with 2079 additions and 2381 deletions
|
|
@ -10,9 +10,9 @@ func TestGenerateRecursiveClassMapping(t *testing.T) {
|
|||
package demo
|
||||
data class SourceAddress(var city: String)
|
||||
data class TargetAddress(var city: String)
|
||||
data class Source(var id: String, var address: *SourceAddress)
|
||||
data class Target(var address: *TargetAddress, var id: String)
|
||||
fun convert(source: *Source): *Target { return source.mapTo<Target>() }
|
||||
data class Source(var id: String, var address: SourceAddress)
|
||||
data class Target(var address: TargetAddress, var id: String)
|
||||
fun convert(source: Source): Target { return source.mapTo<Target>() }
|
||||
`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
@ -22,7 +22,7 @@ fun convert(source: *Source): *Target { return source.mapTo<Target>() }
|
|||
t.Fatal(err)
|
||||
}
|
||||
code := string(out)
|
||||
for _, want := range []string{"gotlinMap1(source)", "Address:", "Id: value.Id", "TargetAddress{City: value.City}"} {
|
||||
for _, want := range []string{"gotlinMap1(source)", "Address:", "Id: source.Id", "&TargetAddress{City: source.Address.City}"} {
|
||||
if !strings.Contains(code, want) {
|
||||
t.Fatalf("missing %q:\n%s", want, code)
|
||||
}
|
||||
|
|
@ -34,8 +34,8 @@ func TestGenerateListAndMapMapping(t *testing.T) {
|
|||
package demo
|
||||
data class Source(var id: String)
|
||||
data class Target(var id: String)
|
||||
fun list(values: List<*Source>): List<*Target> { return values.mapTo<List<*Target>>() }
|
||||
fun mapping(values: Map<String, *Source>): Map<String, *Target> { return values.mapTo<Map<String, *Target>>() }
|
||||
fun list(values: List<Source>): List<Target> { return values.mapTo<List<Target>>() }
|
||||
fun mapping(values: Map<String, Source>): Map<String, Target> { return values.mapTo<Map<String, Target>>() }
|
||||
`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
@ -77,9 +77,9 @@ func TestMappingReportsNestedFieldPath(t *testing.T) {
|
|||
package demo
|
||||
data class SourceAddress(var zip: String)
|
||||
data class TargetAddress(var zip: Int)
|
||||
data class Source(var address: *SourceAddress)
|
||||
data class Target(var address: *TargetAddress)
|
||||
fun convert(value: *Source): *Target { return value.mapTo<Target>() }
|
||||
data class Source(var address: SourceAddress)
|
||||
data class Target(var address: TargetAddress)
|
||||
fun convert(value: Source): Target { return value.mapTo<Target>() }
|
||||
`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
@ -92,7 +92,7 @@ fun convert(value: *Source): *Target { return value.mapTo<Target>() }
|
|||
|
||||
func TestMappingRejectsMissingFieldAndEnumVariant(t *testing.T) {
|
||||
for _, source := range []string{
|
||||
`package demo data class Source(var id: String) data class Target(var id: String, var name: String) fun convert(value: *Source): *Target { return value.mapTo<Target>() }`,
|
||||
`package demo data class Source(var id: String) data class Target(var id: String, var name: String) fun convert(value: Source): Target { return value.mapTo<Target>() }`,
|
||||
`package demo enum Source { Ready, Failed } enum Target { Ready } fun convert(value: Source): Target { return value.mapTo<Target>() }`,
|
||||
} {
|
||||
prog, err := Parse(source)
|
||||
|
|
@ -110,8 +110,8 @@ func TestMapStringBackedEnumToAndFromString(t *testing.T) {
|
|||
enum Status { PendingReservation, Initiated }
|
||||
data class Domain(var status: Status)
|
||||
data class Row(var status: String)
|
||||
fun toRow(value: *Domain): *Row { return value.mapTo<Row>() }
|
||||
fun toDomain(value: *Row): *Domain { return value.mapTo<Domain>() }`)
|
||||
fun toRow(value: Domain): Row { return value.mapTo<Row>() }
|
||||
fun toDomain(value: Row): Domain { return value.mapTo<Domain>() }`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
|
@ -130,10 +130,10 @@ func TestMapToInfersExpectedTargetType(t *testing.T) {
|
|||
prog, err := Parse(`package demo
|
||||
data class Source(var id: String)
|
||||
data class Target(var id: String)
|
||||
data class Wrapper(var target: *Target)
|
||||
fun returned(value: *Source): *Target { return value.mapTo() }
|
||||
fun wrapped(value: *Source): *Wrapper { return Wrapper(value.mapTo()) }
|
||||
fun local(value: *Source): *Target { val target: *Target = value.mapTo(); return target }`)
|
||||
data class Wrapper(var target: Target)
|
||||
fun returned(value: Source): Target { return value.mapTo() }
|
||||
fun wrapped(value: Source): Wrapper { return Wrapper(value.mapTo()) }
|
||||
fun local(value: Source): Target { val target: Target = value.mapTo(); return target }`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
|
@ -148,7 +148,7 @@ fun local(value: *Source): *Target { val target: *Target = value.mapTo(); return
|
|||
|
||||
func TestMapToWithoutTargetContextHasHelpfulError(t *testing.T) {
|
||||
prog, err := Parse(`package demo
|
||||
fun convert(value: *Source) { val target = value.mapTo() }`)
|
||||
fun convert(value: Source) { val target = value.mapTo() }`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue