// React JSX tests

var fbTestFixture = {
  'Type Annotations': {
    'function foo(numVal: any){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'numVal',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'AnyTypeAnnotation',
            range: [21, 24],
            loc: {
              start: { line: 1, column: 21 },
              end: { line: 1, column: 24 }
            }
          },
          range: [19, 24],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 24 }
          }
        },
        range: [13, 24],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 24 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [25, 27],
        loc: {
          start: { line: 1, column: 25 },
          end: { line: 1, column: 27 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 27],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 27 }
      }
    },
    'function foo(numVal: number){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'numVal',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'NumberTypeAnnotation',
            range: [21, 27],
            loc: {
              start: { line: 1, column: 21 },
              end: { line: 1, column: 27 }
            }
          },
          range: [19, 27],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 27 }
          }
        },
        range: [13, 27],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 27 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [28, 30],
        loc: {
          start: { line: 1, column: 28 },
          end: { line: 1, column: 30 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 30],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 30 }
      }
    },
    'function foo(numVal: number, strVal: string){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'numVal',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'NumberTypeAnnotation',
            range: [21, 27],
            loc: {
              start: { line: 1, column: 21 },
              end: { line: 1, column: 27 }
            }
          },
          range: [19, 27],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 27 }
          }
        },
        range: [13, 27],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 27 }
        }
      }, {
        type: 'Identifier',
        name: 'strVal',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'StringTypeAnnotation',
            range: [37, 43],
            loc: {
              start: { line: 1, column: 37 },
              end: { line: 1, column: 43 }
            }
          },
          range: [35, 43],
          loc: {
            start: { line: 1, column: 35 },
            end: { line: 1, column: 43 }
          }
        },
        range: [29, 43],
        loc: {
          start: { line: 1, column: 29 },
          end: { line: 1, column: 43 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [44, 46],
        loc: {
          start: { line: 1, column: 44 },
          end: { line: 1, column: 46 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 46],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 46 }
      }
    },
    'function foo(numVal: number, untypedVal){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'numVal',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'NumberTypeAnnotation',
            range: [21, 27],
            loc: {
              start: { line: 1, column: 21 },
              end: { line: 1, column: 27 }
            }
          },
          range: [19, 27],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 27 }
          }
        },
        range: [13, 27],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 27 }
        }
      }, {
        type: 'Identifier',
        name: 'untypedVal',
        range: [29, 39],
        loc: {
          start: { line: 1, column: 29 },
          end: { line: 1, column: 39 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [40, 42],
        loc: {
          start: { line: 1, column: 40 },
          end: { line: 1, column: 42 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 42],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 42 }
      }
    },
    'function foo(untypedVal, numVal: number){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'untypedVal',
        range: [13, 23],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 23 }
        }
      }, {
        type: 'Identifier',
        name: 'numVal',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'NumberTypeAnnotation',
            range: [33, 39],
            loc: {
              start: { line: 1, column: 33 },
              end: { line: 1, column: 39 }
            }
          },
          range: [31, 39],
          loc: {
            start: { line: 1, column: 31 },
            end: { line: 1, column: 39 }
          }
        },
        range: [25, 39],
        loc: {
          start: { line: 1, column: 25 },
          end: { line: 1, column: 39 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [40, 42],
        loc: {
          start: { line: 1, column: 40 },
          end: { line: 1, column: 42 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 42],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 42 }
      }
    },
    'function foo(nullableNum: ?number){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'nullableNum',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'NullableTypeAnnotation',
            typeAnnotation: {
              type: 'NumberTypeAnnotation',
              range: [27, 33],
              loc: {
                start: { line: 1, column: 27 },
                end: { line: 1, column: 33 }
              }
            },
            range: [26, 33],
            loc: {
              start: { line: 1, column: 26 },
              end: { line: 1, column: 33 }
            }
          },
          range: [24, 33],
          loc: {
            start: { line: 1, column: 24 },
            end: { line: 1, column: 33 }
          }
        },
        range: [13, 33],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 33 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [34, 36],
        loc: {
          start: { line: 1, column: 34 },
          end: { line: 1, column: 36 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    'function foo(callback: () => void){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'callback',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'VoidTypeAnnotation',
              range: [29, 33],
              loc: {
                start: { line: 1, column: 29 },
                end: { line: 1, column: 33 }
              }
            },
            typeParameters: null,
            range: [23, 33],
            loc: {
              start: { line: 1, column: 23 },
              end: { line: 1, column: 33 }
            }
          },
          range: [21, 33],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 33 }
          }
        },
        range: [13, 33],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 33 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [34, 36],
        loc: {
          start: { line: 1, column: 34 },
          end: { line: 1, column: 36 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    'function foo(callback: () => number){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'callback',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [29, 35],
              loc: {
                start: { line: 1, column: 29 },
                end: { line: 1, column: 35 }
              }
            },
            typeParameters: null,
            range: [23, 35],
            loc: {
              start: { line: 1, column: 23 },
              end: { line: 1, column: 35 }
            }
          },
          range: [21, 35],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 35 }
          }
        },
        range: [13, 35],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 35 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [36, 38],
        loc: {
          start: { line: 1, column: 36 },
          end: { line: 1, column: 38 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 38],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 38 }
      }
    },
    'function foo(callback: (_:bool) => number){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'callback',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [{
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: '_',
                range: [24, 25],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 25 }
                }
              },
              typeAnnotation: {
                type: 'BooleanTypeAnnotation',
                range: [26, 30],
                loc: {
                  start: { line: 1, column: 26 },
                  end: { line: 1, column: 30 }
                }
              },
              optional: false,
              range: [24, 30],
              loc: {
                start: { line: 1, column: 24 },
                end: { line: 1, column: 30 }
              }
            }],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [35, 41],
              loc: {
                start: { line: 1, column: 35 },
                end: { line: 1, column: 41 }
              }
            },
            typeParameters: null,
            range: [23, 41],
            loc: {
              start: { line: 1, column: 23 },
              end: { line: 1, column: 41 }
            }
          },
          range: [21, 41],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 41 }
          }
        },
        range: [13, 41],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 41 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [42, 44],
        loc: {
          start: { line: 1, column: 42 },
          end: { line: 1, column: 44 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 44],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 44 }
      }
    },
    'function foo(callback: (_1:bool, _2:string) => number){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'callback',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [{
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: '_1',
                range: [24, 26],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 26 }
                }
              },
              typeAnnotation: {
                type: 'BooleanTypeAnnotation',
                range: [27, 31],
                loc: {
                  start: { line: 1, column: 27 },
                  end: { line: 1, column: 31 }
                }
              },
              optional: false,
              range: [24, 31],
              loc: {
                start: { line: 1, column: 24 },
                end: { line: 1, column: 31 }
              }
            }, {
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: '_2',
                range: [33, 35],
                loc: {
                  start: { line: 1, column: 33 },
                  end: { line: 1, column: 35 }
                }
              },
              typeAnnotation: {
                type: 'StringTypeAnnotation',
                range: [36, 42],
                loc: {
                  start: { line: 1, column: 36 },
                  end: { line: 1, column: 42 }
                }
              },
              optional: false,
              range: [33, 42],
              loc: {
                start: { line: 1, column: 33 },
                end: { line: 1, column: 42 }
              }
            }],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [47, 53],
              loc: {
                start: { line: 1, column: 47 },
                end: { line: 1, column: 53 }
              }
            },
            typeParameters: null,
            range: [23, 53],
            loc: {
              start: { line: 1, column: 23 },
              end: { line: 1, column: 53 }
            }
          },
          range: [21, 53],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 53 }
          }
        },
        range: [13, 53],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 53 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [54, 56],
        loc: {
          start: { line: 1, column: 54 },
          end: { line: 1, column: 56 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 56],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 56 }
      }
    },
    'function foo(callback: (_1:bool, ...foo:Array<number>) => number){}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'callback',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [{
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: '_1',
                range: [24, 26],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 26 }
                }
              },
              typeAnnotation: {
                type: 'BooleanTypeAnnotation',
                range: [27, 31],
                loc: {
                  start: { line: 1, column: 27 },
                  end: { line: 1, column: 31 }
                }
              },
              optional: false,
              range: [24, 31],
              loc: {
                start: { line: 1, column: 24 },
                end: { line: 1, column: 31 }
              }
            }],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [58, 64],
              loc: {
                start: { line: 1, column: 58 },
                end: { line: 1, column: 64 }
              }
            },
            rest: {
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: 'foo',
                range: [36, 39],
                loc: {
                  start: { line: 1, column: 36 },
                  end: { line: 1, column: 39 }
                }
              },
              typeAnnotation: {
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'Identifier',
                  name: 'Array',
                  range: [40, 45],
                  loc: {
                    start: { line: 1, column: 40 },
                    end: { line: 1, column: 45 }
                  }
                },
                typeParameters: {
                  type: 'TypeParameterInstantiation',
                  params: [{
                    type: 'NumberTypeAnnotation',
                    range: [46, 52],
                    loc: {
                      start: { line: 1, column: 46 },
                      end: { line: 1, column: 52 }
                    }
                  }],
                  range: [45, 53],
                  loc: {
                    start: { line: 1, column: 45 },
                    end: { line: 1, column: 53 }
                  }
                },
                range: [40, 53],
                loc: {
                  start: { line: 1, column: 40 },
                  end: { line: 1, column: 53 }
                }
              },
              optional: false,
              range: [36, 53],
              loc: {
                start: { line: 1, column: 36 },
                end: { line: 1, column: 53 }
              }
            },
            typeParameters: null,
            range: [23, 64],
            loc: {
              start: { line: 1, column: 23 },
              end: { line: 1, column: 64 }
            }
          },
          range: [21, 64],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 64 }
          }
        },
        range: [13, 64],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 64 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [65, 67],
        loc: {
          start: { line: 1, column: 65 },
          end: { line: 1, column: 67 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 67],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 67 }
      }
    },
    'function foo():number{}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [21, 23],
        loc: {
          start: { line: 1, column: 21 },
          end: { line: 1, column: 23 }
        }
      },
      generator: false,
      expression: false,
      returnType: {
        type: 'TypeAnnotation',
        typeAnnotation: {
          type: 'NumberTypeAnnotation',
          range: [15, 21],
          loc: {
            start: { line: 1, column: 15 },
            end: { line: 1, column: 21 }
          }
        },
        range: [14, 21],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 21 }
        }
      },
      range: [0, 23],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 23 }
      }
    },
    'function foo():() => void{}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [25, 27],
        loc: {
          start: { line: 1, column: 25 },
          end: { line: 1, column: 27 }
        }
      },
      generator: false,
      expression: false,
      returnType: {
        type: 'TypeAnnotation',
        typeAnnotation: {
          type: 'FunctionTypeAnnotation',
          params: [],
          returnType: {
            type: 'VoidTypeAnnotation',
            range: [21, 25],
            loc: {
              start: { line: 1, column: 21 },
              end: { line: 1, column: 25 }
            }
          },
          typeParameters: null,
          range: [15, 25],
          loc: {
            start: { line: 1, column: 15 },
            end: { line: 1, column: 25 }
          }
        },
        range: [14, 25],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 25 }
        }
      },
      range: [0, 27],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 27 }
      }
    },
    'function foo():(_:bool) => number{}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [33, 35],
        loc: {
          start: { line: 1, column: 33 },
          end: { line: 1, column: 35 }
        }
      },
      generator: false,
      expression: false,
      returnType: {
        type: 'TypeAnnotation',
        typeAnnotation: {
          type: 'FunctionTypeAnnotation',
          params: [{
            type: 'FunctionTypeParam',
            name: {
              type: 'Identifier',
              name: '_',
              range: [16, 17],
              loc: {
                start: { line: 1, column: 16 },
                end: { line: 1, column: 17 }
              }
            },
            typeAnnotation: {
              type: 'BooleanTypeAnnotation',
              range: [18, 22],
              loc: {
                start: { line: 1, column: 18 },
                end: { line: 1, column: 22 }
              }
            },
            optional: false,
            range: [16, 22],
            loc: {
              start: { line: 1, column: 16 },
              end: { line: 1, column: 22 }
            }
          }],
          returnType: {
            type: 'NumberTypeAnnotation',
            range: [27, 33],
            loc: {
              start: { line: 1, column: 27 },
              end: { line: 1, column: 33 }
            }
          },
          typeParameters: null,
          range: [15, 33],
          loc: {
            start: { line: 1, column: 15 },
            end: { line: 1, column: 33 }
          }
        },
        range: [14, 33],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 33 }
        }
      },
      range: [0, 35],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 35 }
      }
    },
    'function foo():(_?:bool) => number{}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [34, 36],
        loc: {
          start: { line: 1, column: 34 },
          end: { line: 1, column: 36 }
        }
      },
      generator: false,
      expression: false,
      returnType: {
        type: 'TypeAnnotation',
        typeAnnotation: {
          type: 'FunctionTypeAnnotation',
          params: [{
            type: 'FunctionTypeParam',
            name: {
              type: 'Identifier',
              name: '_',
              range: [16, 17],
              loc: {
                start: { line: 1, column: 16 },
                end: { line: 1, column: 17 }
              }
            },
            typeAnnotation: {
              type: 'BooleanTypeAnnotation',
              range: [19, 23],
              loc: {
                start: { line: 1, column: 19 },
                end: { line: 1, column: 23 }
              }
            },
            optional: true,
            range: [16, 23],
            loc: {
              start: { line: 1, column: 16 },
              end: { line: 1, column: 23 }
            }
          }],
          returnType: {
            type: 'NumberTypeAnnotation',
            range: [28, 34],
            loc: {
              start: { line: 1, column: 28 },
              end: { line: 1, column: 34 }
            }
          },
          typeParameters: null,
          range: [15, 34],
          loc: {
            start: { line: 1, column: 15 },
            end: { line: 1, column: 34 }
          }
        },
        range: [14, 34],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 34 }
        }
      },
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    'function foo(): {} {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [19, 21],
        loc: {
          start: { line: 1, column: 19 },
          end: { line: 1, column: 21 }
        }
      },
      generator: false,
      expression: false,
      returnType: {
        type: 'TypeAnnotation',
        typeAnnotation: {
          type: 'ObjectTypeAnnotation',
          properties: [],
          indexers: [],
          callProperties: [],
          range: [16, 18],
          loc: {
            start: { line: 1, column: 16 },
            end: { line: 1, column: 18 }
          }
        },
        range: [14, 18],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 18 }
        }
      },
      range: [0, 21],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 21 }
      }
    },
    'function foo<T>() {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [18, 20],
        loc: {
          start: { line: 1, column: 18 },
          end: { line: 1, column: 20 }
        }
      },
      generator: false,
      expression: false,
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [13, 14],
          loc: {
            start: { line: 1, column: 13 },
            end: { line: 1, column: 14 }
          }
        }],
        range: [12, 15],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 15 }
        }
      },
      range: [0, 20],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 20 }
      }
    },
    'function foo<T,S>() {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [20, 22],
        loc: {
          start: { line: 1, column: 20 },
          end: { line: 1, column: 22 }
        }
      },
      generator: false,
      expression: false,
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [13, 14],
          loc: {
            start: { line: 1, column: 13 },
            end: { line: 1, column: 14 }
          }
        }, {
          type: 'Identifier',
          name: 'S',
          range: [15, 16],
          loc: {
            start: { line: 1, column: 15 },
            end: { line: 1, column: 16 }
          }
        }],
        range: [12, 17],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 17 }
        }
      },
      range: [0, 22],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 22 }
      }
    },
    'a=function<T,S>() {}': {
      type: 'ExpressionStatement',
      expression: {
        type: 'AssignmentExpression',
        operator: '=',
        left: {
          type: 'Identifier',
          name: 'a',
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: 'FunctionExpression',
          id: null,
          params: [],
          body: {
            type: 'BlockStatement',
            body: [],
            range: [18, 20],
            loc: {
              start: { line: 1, column: 18 },
              end: { line: 1, column: 20 }
            }
          },
          generator: false,
          expression: false,
          typeParameters: {
            type: 'TypeParameterDeclaration',
            params: [{
              type: 'Identifier',
              name: 'T',
              range: [11, 12],
              loc: {
                start: { line: 1, column: 11 },
                end: { line: 1, column: 12 }
              }
            }, {
              type: 'Identifier',
              name: 'S',
              range: [13, 14],
              loc: {
                start: { line: 1, column: 13 },
                end: { line: 1, column: 14 }
              }
            }],
            range: [10, 15],
            loc: {
              start: { line: 1, column: 10 },
              end: { line: 1, column: 15 }
            }
          },
          range: [2, 20],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 20 }
          }
        },
        range: [0, 20],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 20 }
        }
      },
      range: [0, 20],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 20 }
      }
    },
    "a={set fooProp(value:number){}}": {
      type: "ExpressionStatement",
      expression: {
        type: "AssignmentExpression",
        operator: "=",
        left: {
          type: "Identifier",
          name: "a",
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: "ObjectExpression",
          properties: [{
            type: "Property",
            key: {
              type: "Identifier",
              name: "fooProp",
              range: [7, 14],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 14 }
              }
            },
            value: {
              type: "FunctionExpression",
              id: null,
              params: [{
                type: "Identifier",
                name: "value",
                typeAnnotation: {
                  type: "TypeAnnotation",
                  typeAnnotation: {
                    type: "NumberTypeAnnotation",
                    range: [21, 27],
                    loc: {
                      start: { line: 1, column: 21 },
                      end: { line: 1, column: 27 }
                    }
                  },
                  range: [20, 27],
                  loc: {
                    start: { line: 1, column: 20 },
                    end: { line: 1, column: 27 }
                  }
                },
                range: [15, 27],
                loc: {
                  start: { line: 1, column: 15 },
                  end: { line: 1, column: 27 }
                }
              }],
              body: {
                type: "BlockStatement",
                body: [],
                range: [28, 30],
                loc: {
                  start: { line: 1, column: 28 },
                  end: { line: 1, column: 30 }
                }
              },
              generator: false,
              expression: false,
              //range: [28, 30],
              //loc: {
              //  start: { line: 1, column: 28 },
              //  end: { line: 1, column: 30 }
              //}
            },
            kind: "set",
            method: false,
            shorthand: false,
            computed: false,
            range: [3, 30],
            loc: {
              start: { line: 1, column: 3 },
              end: { line: 1, column: 30 }
            }
          }],
          range: [2, 31],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 31 }
          }
        },
        range: [0, 31],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 31 }
        }
      },
      range: [0, 31],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 31 }
      }
    },
    "a={set fooProp(value:number):void{}}": {
      type: "ExpressionStatement",
      expression: {
        type: "AssignmentExpression",
        operator: "=",
        left: {
          type: "Identifier",
          name: "a",
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: "ObjectExpression",
          properties: [{
            type: "Property",
            key: {
              type: "Identifier",
              name: "fooProp",
              range: [7, 14],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 14 }
              }
            },
            value: {
              type: "FunctionExpression",
              id: null,
              params: [{
                type: "Identifier",
                name: "value",
                typeAnnotation: {
                  type: "TypeAnnotation",
                  typeAnnotation: {
                    type: "NumberTypeAnnotation",
                    range: [21, 27],
                    loc: {
                      start: { line: 1, column: 21 },
                      end: { line: 1, column: 27 }
                    }
                  },
                  range: [20, 27],
                  loc: {
                    start: { line: 1, column: 20 },
                    end: { line: 1, column: 27 }
                  }
                },
                range: [15, 27],
                loc: {
                  start: { line: 1, column: 15 },
                  end: { line: 1, column: 27 }
                }
              }],
              body: {
                type: "BlockStatement",
                body: [],
                range: [33, 35],
                loc: {
                  start: { line: 1, column: 33 },
                  end: { line: 1, column: 35 }
                }
              },
              generator: false,
              expression: false,
              returnType: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "VoidTypeAnnotation",
                  range: [29, 33],
                  loc: {
                    start: { line: 1, column: 29 },
                    end: { line: 1, column: 33 }
                  }
                },
                range: [28, 33],
                loc: {
                  start: { line: 1, column: 28 },
                  end: { line: 1, column: 33 }
                }
              },
              //range: [33, 35],
              //loc: {
              //  start: { line: 1, column: 33 },
              //  end: { line: 1, column: 35 }
              //}
            },
            kind: "set",
            method: false,
            shorthand: false,
            computed: false,
            range: [3, 35],
            loc: {
              start: { line: 1, column: 3 },
              end: { line: 1, column: 35 }
            }
          }],
          range: [2, 36],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 36 }
          }
        },
        range: [0, 36],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 36 }
        }
      },
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    "a={get fooProp():number{}}": {
      type: "ExpressionStatement",
      expression: {
        type: "AssignmentExpression",
        operator: "=",
        left: {
          type: "Identifier",
          name: "a",
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: "ObjectExpression",
          properties: [{
            type: "Property",
            key: {
              type: "Identifier",
              name: "fooProp",
              range: [7, 14],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 14 }
              }
            },
            value: {
              type: "FunctionExpression",
              id: null,
              params: [],
              body: {
                type: "BlockStatement",
                body: [],
                range: [23, 25],
                loc: {
                  start: { line: 1, column: 23 },
                  end: { line: 1, column: 25 }
                }
              },
              generator: false,
              expression: false,
              returnType: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "NumberTypeAnnotation",
                  range: [17, 23],
                  loc: {
                    start: { line: 1, column: 17 },
                    end: { line: 1, column: 23 }
                  }
                },
                range: [16, 23],
                loc: {
                  start: { line: 1, column: 16 },
                  end: { line: 1, column: 23 }
                }
              },
              //range: [23, 25],
              //loc: {
              //  start: { line: 1, column: 23 },
              //  end: { line: 1, column: 25 }
              //}
            },
            kind: "get",
            method: false,
            shorthand: false,
            computed: false,
            range: [3, 25],
            loc: {
              start: { line: 1, column: 3 },
              end: { line: 1, column: 25 }
            }
          }],
          range: [2, 26],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 26 }
          }
        },
        range: [0, 26],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 26 }
        }
      },
      range: [0, 26],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 26 }
      }
    },
    'a={id<T>(x: T): T {}}': {
      type: "ExpressionStatement",
      expression: {
        type: "AssignmentExpression",
        operator: "=",
        left: {
          type: "Identifier",
          name: "a",
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: "ObjectExpression",
          properties: [{
            type: "Property",
            key: {
              type: "Identifier",
              name: "id",
              range: [3, 5],
              loc: {
                start: { line: 1, column: 3 },
                end: { line: 1, column: 5 }
              }
            },
            value: {
              type: "FunctionExpression",
              //id: null,
              params: [{
                type: "Identifier",
                name: "x",
                typeAnnotation: {
                  type: "TypeAnnotation",
                  typeAnnotation: {
                    type: "GenericTypeAnnotation",
                    id: {
                      type: "Identifier",
                      name: "T",
                      range: [12, 13],
                      loc: {
                        start: { line: 1, column: 12 },
                        end: { line: 1, column: 13 }
                      }
                    },
                    typeParameters: null,
                    range: [12, 13],
                    loc: {
                      start: { line: 1, column: 12 },
                      end: { line: 1, column: 13 }
                    }
                  },
                  range: [10, 13],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 13 }
                  }
                },
                range: [9, 13],
                loc: {
                  start: { line: 1, column: 9 },
                  end: { line: 1, column: 13 }
                }
              }],
              body: {
                type: "BlockStatement",
                body: [],
                range: [18, 20],
                loc: {
                  start: { line: 1, column: 18 },
                  end: { line: 1, column: 20 }
                }
              },
              generator: false,
              expression: false,
              returnType: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "GenericTypeAnnotation",
                  id: {
                    type: "Identifier",
                    name: "T",
                    range: [16, 17],
                    loc: {
                      start: { line: 1, column: 16 },
                      end: { line: 1, column: 17 }
                    }
                  },
                  typeParameters: null,
                  range: [16, 17],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 17 }
                  }
                },
                range: [14, 17],
                loc: {
                  start: { line: 1, column: 14 },
                  end: { line: 1, column: 17 }
                }
              },
              typeParameters: {
                type: "TypeParameterDeclaration",
                params: [{
                  type: "Identifier",
                  name: "T",
                  range: [6, 7],
                  loc: {
                    start: { line: 1, column: 6 },
                    end: { line: 1, column: 7 }
                  }
                }],
                range: [5, 8],
                loc: {
                  start: { line: 1, column: 5 },
                  end: { line: 1, column: 8 }
                }
              },
              //range: [18, 20],
              //loc: {
              //  start: { line: 1, column: 18 },
              //  end: { line: 1, column: 20 }
              //}
            },
            kind: "init",
            method: true,
            shorthand: false,
            computed: false,
            range: [3, 20],
            loc: {
              start: { line: 1, column: 3 },
              end: { line: 1, column: 20 }
            }
          }],
          range: [2, 21],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 21 }
          }
        },
        range: [0, 21],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 21 }
        }
      },
      range: [0, 21],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 21 }
      }
    },
    'a={*id<T>(x: T): T {}}': {
      type: "ExpressionStatement",
      expression: {
        type: "AssignmentExpression",
        operator: "=",
        left: {
          type: "Identifier",
          name: "a",
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: "ObjectExpression",
          properties: [{
            type: "Property",
            key: {
              type: "Identifier",
              name: "id",
              range: [4, 6],
              loc: {
                start: { line: 1, column: 4 },
                end: { line: 1, column: 6 }
              }
            },
            value: {
              type: "FunctionExpression",
              id: null,
              params: [{
                type: "Identifier",
                name: "x",
                typeAnnotation: {
                  type: "TypeAnnotation",
                  typeAnnotation: {
                    type: "GenericTypeAnnotation",
                    id: {
                      type: "Identifier",
                      name: "T",
                      range: [13, 14],
                      loc: {
                        start: { line: 1, column: 13 },
                        end: { line: 1, column: 14 }
                      }
                    },
                    typeParameters: null,
                    range: [13, 14],
                    loc: {
                      start: { line: 1, column: 13 },
                      end: { line: 1, column: 14 }
                    }
                  },
                  range: [11, 14],
                  loc: {
                    start: { line: 1, column: 11 },
                    end: { line: 1, column: 14 }
                  }
                },
                range: [10, 14],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 14 }
                }
              }],
              body: {
                type: "BlockStatement",
                body: [],
                range: [19, 21],
                loc: {
                  start: { line: 1, column: 19 },
                  end: { line: 1, column: 21 }
                }
              },
              generator: true,
              expression: false,
              returnType: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "GenericTypeAnnotation",
                  id: {
                    type: "Identifier",
                    name: "T",
                    range: [17, 18],
                    loc: {
                      start: { line: 1, column: 17 },
                      end: { line: 1, column: 18 }
                    }
                  },
                  typeParameters: null,
                  range: [17, 18],
                  loc: {
                    start: { line: 1, column: 17 },
                    end: { line: 1, column: 18 }
                  }
                },
                range: [15, 18],
                loc: {
                  start: { line: 1, column: 15 },
                  end: { line: 1, column: 18 }
                }
              },
              typeParameters: {
                type: "TypeParameterDeclaration",
                params: [{
                  type: "Identifier",
                  name: "T",
                  range: [7, 8],
                  loc: {
                    start: { line: 1, column: 7 },
                    end: { line: 1, column: 8 }
                  }
                }],
                range: [6, 9],
                loc: {
                  start: { line: 1, column: 6 },
                  end: { line: 1, column: 9 }
                }
              },
              //range: [19, 21],
              //loc: {
              //  start: { line: 1, column: 19 },
              //  end: { line: 1, column: 21 }
              //}
            },
            kind: "init",
            method: true,
            shorthand: false,
            computed: false,
            //range: [3, 21],
            //loc: {
            //  start: { line: 1, column: 3 },
            //  end: { line: 1, column: 21 }
            //}
          }],
          range: [2, 22],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 22 }
          }
        },
        range: [0, 22],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 22 }
        }
      },
      range: [0, 22],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 22 }
      }
    },
    'a={async id<T>(x: T): T {}}': {
      type: 'ExpressionStatement',
      expression: {
        type: 'AssignmentExpression',
        operator: '=',
        left: {
          type: 'Identifier',
          name: 'a',
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: 'ObjectExpression',
          properties: [{
            type: 'Property',
            key: {
              type: 'Identifier',
              name: 'id',
              range: [9, 11],
              loc: {
                start: { line: 1, column: 9 },
                end: { line: 1, column: 11 }
              }
            },
            value: {
              type: 'FunctionExpression',
              id: null,
              params: [{
                type: 'Identifier',
                name: 'x',
                typeAnnotation: {
                  type: 'TypeAnnotation',
                  typeAnnotation: {
                    type: 'GenericTypeAnnotation',
                    id: {
                      type: 'Identifier',
                      name: 'T',
                      range: [18, 19],
                      loc: {
                        start: { line: 1, column: 18 },
                        end: { line: 1, column: 19 }
                      }
                    },
                    typeParameters: null,
                    range: [18, 19],
                    loc: {
                      start: { line: 1, column: 18 },
                      end: { line: 1, column: 19 }
                    }
                  },
                  range: [16, 19],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 19 }
                  }
                },
                range: [15, 19],
                loc: {
                  start: { line: 1, column: 15 },
                  end: { line: 1, column: 19 }
                }
              }],
              body: {
                type: 'BlockStatement',
                body: [],
                range: [24, 26],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 26 }
                }
              },
              generator: false,
              expression: false,
              returnType: {
                type: 'TypeAnnotation',
                typeAnnotation: {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'T',
                    range: [22, 23],
                    loc: {
                      start: { line: 1, column: 22 },
                      end: { line: 1, column: 23 }
                    }
                  },
                  typeParameters: null,
                  range: [22, 23],
                  loc: {
                    start: { line: 1, column: 22 },
                    end: { line: 1, column: 23 }
                  }
                },
                range: [20, 23],
                loc: {
                  start: { line: 1, column: 20 },
                  end: { line: 1, column: 23 }
                }
              },
              typeParameters: {
                type: 'TypeParameterDeclaration',
                params: [{
                  type: 'Identifier',
                  name: 'T',
                  range: [12, 13],
                  loc: {
                    start: { line: 1, column: 12 },
                    end: { line: 1, column: 13 }
                  }
                }],
                range: [11, 14],
                loc: {
                  start: { line: 1, column: 11 },
                  end: { line: 1, column: 14 }
                }
              },
              async: true,
              //range: [24, 26],
              //loc: {
              //  start: { line: 1, column: 24 },
              //  end: { line: 1, column: 26 }
              //}
            },
            kind: 'init',
            method: true,
            shorthand: false,
            computed: false,
            range: [3, 26],
            loc: {
              start: { line: 1, column: 3 },
              end: { line: 1, column: 26 }
            }
          }],
          range: [2, 27],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 27 }
          }
        },
        range: [0, 27],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 27 }
        }
      },
      range: [0, 27],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 27 }
      }
    },
    'a={123<T>(x: T): T {}}': {
      type: "ExpressionStatement",
      expression: {
        type: "AssignmentExpression",
        operator: "=",
        left: {
          type: "Identifier",
          name: "a",
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: "ObjectExpression",
          properties: [{
            type: "Property",
            key: {
              type: "Literal",
              value: 123,
              raw: "123",
              range: [3, 6],
              loc: {
                start: { line: 1, column: 3 },
                end: { line: 1, column: 6 }
              }
            },
            value: {
              type: "FunctionExpression",
              id: null,
              params: [{
                type: "Identifier",
                name: "x",
                typeAnnotation: {
                  type: "TypeAnnotation",
                  typeAnnotation: {
                    type: "GenericTypeAnnotation",
                    id: {
                      type: "Identifier",
                      name: "T",
                      range: [13, 14],
                      loc: {
                        start: { line: 1, column: 13 },
                        end: { line: 1, column: 14 }
                      }
                    },
                    typeParameters: null,
                    range: [13, 14],
                    loc: {
                      start: { line: 1, column: 13 },
                      end: { line: 1, column: 14 }
                    }
                  },
                  range: [11, 14],
                  loc: {
                    start: { line: 1, column: 11 },
                    end: { line: 1, column: 14 }
                  }
                },
                range: [10, 14],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 14 }
                }
              }],
              body: {
                type: "BlockStatement",
                body: [],
                range: [19, 21],
                loc: {
                  start: { line: 1, column: 19 },
                  end: { line: 1, column: 21 }
                }
              },
              generator: false,
              expression: false,
              returnType: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "GenericTypeAnnotation",
                  id: {
                    type: "Identifier",
                    name: "T",
                    range: [17, 18],
                    loc: {
                      start: { line: 1, column: 17 },
                      end: { line: 1, column: 18 }
                    }
                  },
                  typeParameters: null,
                  range: [17, 18],
                  loc: {
                    start: { line: 1, column: 17 },
                    end: { line: 1, column: 18 }
                  }
                },
                range: [15, 18],
                loc: {
                  start: { line: 1, column: 15 },
                  end: { line: 1, column: 18 }
                }
              },
              typeParameters: {
                type: "TypeParameterDeclaration",
                params: [{
                  type: "Identifier",
                  name: "T",
                  range: [7, 8],
                  loc: {
                    start: { line: 1, column: 7 },
                    end: { line: 1, column: 8 }
                  }
                }],
                range: [6, 9],
                loc: {
                  start: { line: 1, column: 6 },
                  end: { line: 1, column: 9 }
                }
              },
              //range: [19, 21],
              //loc: {
              //  start: { line: 1, column: 19 },
              //  end: { line: 1, column: 21 }
              //}
            },
            kind: "init",
            method: true,
            shorthand: false,
            computed: false,
            range: [3, 21],
            loc: {
              start: { line: 1, column: 3 },
              end: { line: 1, column: 21 }
            }
          }],
          range: [2, 22],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 22 }
          }
        },
        range: [0, 22],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 22 }
        }
      },
      range: [0, 22],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 22 }
      }
    },
    "class Foo {set fooProp(value:number){}}": {
      type: "ClassDeclaration",
      id: {
        type: "Identifier",
        name: "Foo",
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: "ClassBody",
        body: [{
          type: "MethodDefinition",
          key: {
            type: "Identifier",
            name: "fooProp",
            range: [15, 22],
            loc: {
              start: { line: 1, column: 15 },
              end: { line: 1, column: 22 }
            }
          },
          value: {
            type: "FunctionExpression",
            id: null,
            params: [{
              type: "Identifier",
              name: "value",
              typeAnnotation: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "NumberTypeAnnotation",
                  range: [29, 35],
                  loc: {
                    start: { line: 1, column: 29 },
                    end: { line: 1, column: 35 }
                  }
                },
                range: [28, 35],
                loc: {
                  start: { line: 1, column: 28 },
                  end: { line: 1, column: 35 }
                }
              },
              range: [23, 35],
              loc: {
                start: { line: 1, column: 23 },
                end: { line: 1, column: 35 }
              }
            }],
            body: {
              type: "BlockStatement",
              body: [],
              range: [36, 38],
              loc: {
                start: { line: 1, column: 36 },
                end: { line: 1, column: 38 }
              }
            },
            generator: false,
            expression: false,
            //range: [36, 38],
            //loc: {
            //  start: { line: 1, column: 36 },
            //  end: { line: 1, column: 38 }
            //}
          },
          kind: "set",
          "static": false,
          computed: false,
          range: [11, 38],
          loc: {
            start: { line: 1, column: 11 },
            end: { line: 1, column: 38 }
          }
        }],
        range: [10, 39],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 39 }
        }
      },
      range: [0, 39],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 39 }
      }
    },
    'class Foo {set fooProp(value:number):void{}}': {
      type: "ClassDeclaration",
      id: {
        type: "Identifier",
        name: "Foo",
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: "ClassBody",
        body: [{
          type: "MethodDefinition",
          key: {
            type: "Identifier",
            name: "fooProp",
            range: [15, 22],
            loc: {
              start: { line: 1, column: 15 },
              end: { line: 1, column: 22 }
            }
          },
          value: {
            type: "FunctionExpression",
            id: null,
            params: [{
              type: "Identifier",
              name: "value",
              typeAnnotation: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "NumberTypeAnnotation",
                  range: [29, 35],
                  loc: {
                    start: { line: 1, column: 29 },
                    end: { line: 1, column: 35 }
                  }
                },
                range: [28, 35],
                loc: {
                  start: { line: 1, column: 28 },
                  end: { line: 1, column: 35 }
                }
              },
              range: [23, 35],
              loc: {
                start: { line: 1, column: 23 },
                end: { line: 1, column: 35 }
              }
            }],
            body: {
              type: "BlockStatement",
              body: [],
              range: [41, 43],
              loc: {
                start: { line: 1, column: 41 },
                end: { line: 1, column: 43 }
              }
            },
            generator: false,
            expression: false,
            returnType: {
              type: "TypeAnnotation",
              typeAnnotation: {
                type: "VoidTypeAnnotation",
                range: [37, 41],
                loc: {
                  start: { line: 1, column: 37 },
                  end: { line: 1, column: 41 }
                }
              },
              range: [36, 41],
              loc: {
                start: { line: 1, column: 36 },
                end: { line: 1, column: 41 }
              }
            },
            //range: [41, 43],
            //loc: {
            //  start: { line: 1, column: 41 },
            //  end: { line: 1, column: 43 }
            //}
          },
          kind: "set",
          "static": false,
          computed: false,
          range: [11, 43],
          loc: {
            start: { line: 1, column: 11 },
            end: { line: 1, column: 43 }
          }
        }],
        range: [10, 44],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 44 }
        }
      },
      range: [0, 44],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 44 }
      }
    },
    'class Foo {get fooProp():number{}}': {
      type: "ClassDeclaration",
      id: {
        type: "Identifier",
        name: "Foo",
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: "ClassBody",
        body: [{
          type: "MethodDefinition",
          key: {
            type: "Identifier",
            name: "fooProp",
            range: [15, 22],
            loc: {
              start: { line: 1, column: 15 },
              end: { line: 1, column: 22 }
            }
          },
          value: {
            type: "FunctionExpression",
            id: null,
            params: [],
            body: {
              type: "BlockStatement",
              body: [],
              range: [31, 33],
              loc: {
                start: { line: 1, column: 31 },
                end: { line: 1, column: 33 }
              }
            },
            generator: false,
            expression: false,
            returnType: {
              type: "TypeAnnotation",
              typeAnnotation: {
                type: "NumberTypeAnnotation",
                range: [25, 31],
                loc: {
                  start: { line: 1, column: 25 },
                  end: { line: 1, column: 31 }
                }
              },
              range: [24, 31],
              loc: {
                start: { line: 1, column: 24 },
                end: { line: 1, column: 31 }
              }
            },
            //range: [31, 33],
            //loc: {
            //  start: { line: 1, column: 31 },
            //  end: { line: 1, column: 33 }
            //}
          },
          kind: "get",
          "static": false,
          computed: false,
          range: [11, 33],
          loc: {
            start: { line: 1, column: 11 },
            end: { line: 1, column: 33 }
          }
        }],
        range: [10, 34],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 34 }
        }
      },
      range: [0, 34],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 34 }
      }
    },
    'var numVal:number;': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'numVal',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NumberTypeAnnotation',
              range: [11, 17],
              loc: {
                start: { line: 1, column: 11 },
                end: { line: 1, column: 17 }
              }
            },
            range: [10, 17],
            loc: {
              start: { line: 1, column: 10 },
              end: { line: 1, column: 17 }
            }
          },
          range: [4, 17],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 17 }
          }
        },
        init: null,
        range: [4, 17],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 17 }
        }
      }],
      kind: 'var',
      range: [0, 18],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 18 }
      }
    },
    'var numVal:number = otherNumVal;': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'numVal',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NumberTypeAnnotation',
              range: [11, 17],
              loc: {
                start: { line: 1, column: 11 },
                end: { line: 1, column: 17 }
              }
            },
            range: [10, 17],
            loc: {
              start: { line: 1, column: 10 },
              end: { line: 1, column: 17 }
            }
          },
          range: [4, 17],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 17 }
          }
        },
        init: {
          type: 'Identifier',
          name: 'otherNumVal',
          range: [20, 31],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 31 }
          }
        },
        range: [4, 31],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 31 }
        }
      }],
      kind: 'var',
      range: [0, 32],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 32 }
      }
    },
    'var a: {numVal: number};': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'numVal',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'NumberTypeAnnotation',
                  range: [16, 22],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [8, 22],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 22 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 23],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 23 }
              }
            },
            range: [5, 23],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 23 }
            }
          },
          range: [4, 23],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 23 }
          }
        },
        init: null,
        range: [4, 23],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 23 }
        }
      }],
      kind: 'var',
      range: [0, 24],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 24 }
      }
    },
    'var a: {numVal: number;};': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'numVal',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'NumberTypeAnnotation',
                  range: [16, 22],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [8, 23],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 23 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 24],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 24 }
              }
            },
            range: [5, 24],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 24 }
            }
          },
          range: [4, 24],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 24 }
          }
        },
        init: null,
        range: [4, 24],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 24 }
        }
      }],
      kind: 'var',
      range: [0, 25],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 25 }
      }
    },
    'var a: {numVal: number; [indexer: string]: number};': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'numVal',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'NumberTypeAnnotation',
                  range: [16, 22],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [8, 23],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 23 }
                }
              }],
              indexers: [{
                type: 'ObjectTypeIndexer',
                id: {
                  type: 'Identifier',
                  name: 'indexer',
                  range: [25, 32],
                  loc: {
                    start: { line: 1, column: 25 },
                    end: { line: 1, column: 32 }
                  }
                },
                key: {
                  type: 'StringTypeAnnotation',
                  range: [34, 40],
                  loc: {
                    start: { line: 1, column: 34 },
                    end: { line: 1, column: 40 }
                  }
                },
                value: {
                  type: 'NumberTypeAnnotation',
                  range: [43, 49],
                  loc: {
                    start: { line: 1, column: 43 },
                    end: { line: 1, column: 49 }
                  }
                },
                range: [24, 49],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 49 }
                }
              }],
              callProperties: [],
              range: [7, 50],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 50 }
              }
            },
            range: [5, 50],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 50 }
            }
          },
          range: [4, 50],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 50 }
          }
        },
        init: null,
        range: [4, 50],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 50 }
        }
      }],
      kind: 'var',
      range: [0, 51],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 51 }
      }
    },
    'var a: ?{numVal: number};': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NullableTypeAnnotation',
              typeAnnotation: {
                type: 'ObjectTypeAnnotation',
                properties: [{
                  type: 'ObjectTypeProperty',
                  key: {
                    type: 'Identifier',
                    name: 'numVal',
                    range: [9, 15],
                    loc: {
                      start: { line: 1, column: 9 },
                      end: { line: 1, column: 15 }
                    }
                  },
                  value: {
                    type: 'NumberTypeAnnotation',
                    range: [17, 23],
                    loc: {
                      start: { line: 1, column: 17 },
                      end: { line: 1, column: 23 }
                    }
                  },
                  optional: false,
                  range: [9, 23],
                  loc: {
                    start: { line: 1, column: 9 },
                    end: { line: 1, column: 23 }
                  }
                }],
                indexers: [],
                callProperties: [],
                range: [8, 24],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 24 }
                }
              },
              range: [7, 24],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 24 }
              }
            },
            range: [5, 24],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 24 }
            }
          },
          range: [4, 24],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 24 }
          }
        },
        init: null,
        range: [4, 24],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 24 }
        }
      }],
      kind: 'var',
      range: [0, 25],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 25 }
      }
    },
    'var a: {numVal: number; strVal: string}': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'numVal',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'NumberTypeAnnotation',
                  range: [16, 22],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [8, 23],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 23 }
                }
              }, {
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'strVal',
                  range: [24, 30],
                  loc: {
                    start: { line: 1, column: 24 },
                    end: { line: 1, column: 30 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [32, 38],
                  loc: {
                    start: { line: 1, column: 32 },
                    end: { line: 1, column: 38 }
                  }
                },
                optional: false,
                range: [24, 38],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 38 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 39],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 39 }
              }
            },
            range: [5, 39],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 39 }
            }
          },
          range: [4, 39],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 39 }
          }
        },
        init: null,
        range: [4, 39],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 39 }
        }
      }],
      kind: 'var',
      range: [0, 39],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 39 }
      }
    },
    'var a: {subObj: {strVal: string}}': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'subObj',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'ObjectTypeAnnotation',
                  properties: [{
                    type: 'ObjectTypeProperty',
                    key: {
                      type: 'Identifier',
                      name: 'strVal',
                      range: [17, 23],
                      loc: {
                        start: { line: 1, column: 17 },
                        end: { line: 1, column: 23 }
                      }
                    },
                    value: {
                      type: 'StringTypeAnnotation',
                      range: [25, 31],
                      loc: {
                        start: { line: 1, column: 25 },
                        end: { line: 1, column: 31 }
                      }
                    },
                    optional: false,
                    range: [17, 31],
                    loc: {
                      start: { line: 1, column: 17 },
                      end: { line: 1, column: 31 }
                    }
                  }],
                  indexers: [],
                  callProperties: [],
                  range: [16, 32],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 32 }
                  }
                },
                optional: false,
                range: [8, 32],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 32 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 33],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 33 }
              }
            },
            range: [5, 33],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 33 }
            }
          },
          range: [4, 33],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 33 }
          }
        },
        init: null,
        range: [4, 33],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 33 }
        }
      }],
      kind: 'var',
      range: [0, 33],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 33 }
      }
    },
    'var a: {subObj: ?{strVal: string}}': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'subObj',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'NullableTypeAnnotation',
                  typeAnnotation: {
                    type: 'ObjectTypeAnnotation',
                    properties: [{
                      type: 'ObjectTypeProperty',
                      key: {
                        type: 'Identifier',
                        name: 'strVal',
                        range: [18, 24],
                        loc: {
                          start: { line: 1, column: 18 },
                          end: { line: 1, column: 24 }
                        }
                      },
                      value: {
                        type: 'StringTypeAnnotation',
                        range: [26, 32],
                        loc: {
                          start: { line: 1, column: 26 },
                          end: { line: 1, column: 32 }
                        }
                      },
                      optional: false,
                      range: [18, 32],
                      loc: {
                        start: { line: 1, column: 18 },
                        end: { line: 1, column: 32 }
                      }
                    }],
                    indexers: [],
                    callProperties: [],
                    range: [17, 33],
                    loc: {
                      start: { line: 1, column: 17 },
                      end: { line: 1, column: 33 }
                    }
                  },
                  range: [16, 33],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 33 }
                  }
                },
                optional: false,
                range: [8, 33],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 33 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 34],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 34 }
              }
            },
            range: [5, 34],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 34 }
            }
          },
          range: [4, 34],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 34 }
          }
        },
        init: null,
        range: [4, 34],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 34 }
        }
      }],
      kind: 'var',
      range: [0, 34],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 34 }
      }
    },
    'var a: {param1: number; param2: string}': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'param1',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'NumberTypeAnnotation',
                  range: [16, 22],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [8, 23],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 23 }
                }
              }, {
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'param2',
                  range: [24, 30],
                  loc: {
                    start: { line: 1, column: 24 },
                    end: { line: 1, column: 30 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [32, 38],
                  loc: {
                    start: { line: 1, column: 32 },
                    end: { line: 1, column: 38 }
                  }
                },
                optional: false,
                range: [24, 38],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 38 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 39],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 39 }
              }
            },
            range: [5, 39],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 39 }
            }
          },
          range: [4, 39],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 39 }
          }
        },
        init: null,
        range: [4, 39],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 39 }
        }
      }],
      kind: 'var',
      range: [0, 39],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 39 }
      }
    },
    'var a: {param1: number; param2?: string}': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'param1',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                value: {
                  type: 'NumberTypeAnnotation',
                  range: [16, 22],
                  loc: {
                    start: { line: 1, column: 16 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [8, 23],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 23 }
                }
              }, {
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'param2',
                  range: [24, 30],
                  loc: {
                    start: { line: 1, column: 24 },
                    end: { line: 1, column: 30 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [33, 39],
                  loc: {
                    start: { line: 1, column: 33 },
                    end: { line: 1, column: 39 }
                  }
                },
                optional: true,
                range: [24, 39],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 39 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 40],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 40 }
              }
            },
            range: [5, 40],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 40 }
            }
          },
          range: [4, 40],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 40 }
          }
        },
        init: null,
        range: [4, 40],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 40 }
        }
      }],
      kind: 'var',
      range: [0, 40],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 40 }
      }
    },
    'var a: { [a: number]: string; [b: number]: string; };': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [],
              indexers: [{
                type: 'ObjectTypeIndexer',
                id: {
                  type: 'Identifier',
                  name: 'a',
                  range: [10, 11],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 11 }
                  }
                },
                key: {
                  type: 'NumberTypeAnnotation',
                  range: [13, 19],
                  loc: {
                    start: { line: 1, column: 13 },
                    end: { line: 1, column: 19 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [22, 28],
                  loc: {
                    start: { line: 1, column: 22 },
                    end: { line: 1, column: 28 }
                  }
                },
                range: [9, 29],
                loc: {
                  start: { line: 1, column: 9 },
                  end: { line: 1, column: 29 }
                }
              }, {
                type: 'ObjectTypeIndexer',
                id: {
                  type: 'Identifier',
                  name: 'b',
                  range: [31, 32],
                  loc: {
                    start: { line: 1, column: 31 },
                    end: { line: 1, column: 32 }
                  }
                },
                key: {
                  type: 'NumberTypeAnnotation',
                  range: [34, 40],
                  loc: {
                    start: { line: 1, column: 34 },
                    end: { line: 1, column: 40 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [43, 49],
                  loc: {
                    start: { line: 1, column: 43 },
                    end: { line: 1, column: 49 }
                  }
                },
                range: [30, 50],
                loc: {
                  start: { line: 1, column: 30 },
                  end: { line: 1, column: 50 }
                }
              }],
              callProperties: [],
              range: [7, 52],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 52 }
              }
            },
            range: [5, 52],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 52 }
            }
          },
          range: [4, 52],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 52 }
          }
        },
        init: null,
        range: [4, 52],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 52 }
        }
      }],
      kind: 'var',
      range: [0, 53],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 53 }
      }
    },
    'var a: {add(x:number, ...y:Array<string>): void}': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'add',
                  range: [8, 11],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 11 }
                  }
                },
                value: {
                  type: 'FunctionTypeAnnotation',
                  params: [{
                    type: 'FunctionTypeParam',
                    name: {
                      type: 'Identifier',
                      name: 'x',
                      range: [12, 13],
                      loc: {
                        start: { line: 1, column: 12 },
                        end: { line: 1, column: 13 }
                      }
                    },
                    typeAnnotation: {
                      type: 'NumberTypeAnnotation',
                      range: [14, 20],
                      loc: {
                        start: { line: 1, column: 14 },
                        end: { line: 1, column: 20 }
                      }
                    },
                    optional: false,
                    range: [12, 20],
                    loc: {
                      start: { line: 1, column: 12 },
                      end: { line: 1, column: 20 }
                    }
                  }],
                  returnType: {
                    type: 'VoidTypeAnnotation',
                    range: [43, 47],
                    loc: {
                      start: { line: 1, column: 43 },
                      end: { line: 1, column: 47 }
                    }
                  },
                  rest: {
                    type: 'FunctionTypeParam',
                    name: {
                      type: 'Identifier',
                      name: 'y',
                      range: [25, 26],
                      loc: {
                        start: { line: 1, column: 25 },
                        end: { line: 1, column: 26 }
                      }
                    },
                    typeAnnotation: {
                      type: 'GenericTypeAnnotation',
                      id: {
                        type: 'Identifier',
                        name: 'Array',
                        range: [27, 32],
                        loc: {
                          start: { line: 1, column: 27 },
                          end: { line: 1, column: 32 }
                        }
                      },
                      typeParameters: {
                        type: 'TypeParameterInstantiation',
                        params: [{
                          type: 'StringTypeAnnotation',
                          range: [33, 39],
                          loc: {
                            start: { line: 1, column: 33 },
                            end: { line: 1, column: 39 }
                          }
                        }],
                        range: [32, 40],
                        loc: {
                          start: { line: 1, column: 32 },
                          end: { line: 1, column: 40 }
                        }
                      },
                      range: [27, 40],
                      loc: {
                        start: { line: 1, column: 27 },
                        end: { line: 1, column: 40 }
                      }
                    },
                    optional: false,
                    range: [25, 40],
                    loc: {
                      start: { line: 1, column: 25 },
                      end: { line: 1, column: 40 }
                    }
                  },
                  typeParameters: null,
                  range: [8, 47],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 47 }
                  }
                },
                optional: false,
                range: [8, 47],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 47 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 48],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 48 }
              }
            },
            range: [5, 48],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 48 }
            }
          },
          range: [4, 48],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 48 }
          }
        },
        init: null,
        range: [4, 48],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 48 }
        }
      }],
      kind: 'var',
      range: [0, 48],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 48 }
      }
    },
    'var a: { id<T>(x: T): T; }': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'id',
                  range: [9, 11],
                  loc: {
                    start: { line: 1, column: 9 },
                    end: { line: 1, column: 11 }
                  }
                },
                value: {
                  type: 'FunctionTypeAnnotation',
                  params: [{
                    type: 'FunctionTypeParam',
                    name: {
                      type: 'Identifier',
                      name: 'x',
                      range: [15, 16],
                      loc: {
                        start: { line: 1, column: 15 },
                        end: { line: 1, column: 16 }
                      }
                    },
                    typeAnnotation: {
                      type: 'GenericTypeAnnotation',
                      id: {
                        type: 'Identifier',
                        name: 'T',
                        range: [18, 19],
                        loc: {
                          start: { line: 1, column: 18 },
                          end: { line: 1, column: 19 }
                        }
                      },
                      typeParameters: null,
                      range: [18, 19],
                      loc: {
                        start: { line: 1, column: 18 },
                        end: { line: 1, column: 19 }
                      }
                    },
                    optional: false,
                    range: [15, 19],
                    loc: {
                      start: { line: 1, column: 15 },
                      end: { line: 1, column: 19 }
                    }
                  }],
                  returnType: {
                    type: 'GenericTypeAnnotation',
                    id: {
                      type: 'Identifier',
                      name: 'T',
                      range: [22, 23],
                      loc: {
                        start: { line: 1, column: 22 },
                        end: { line: 1, column: 23 }
                      }
                    },
                    typeParameters: null,
                    range: [22, 23],
                    loc: {
                      start: { line: 1, column: 22 },
                      end: { line: 1, column: 23 }
                    }
                  },
                  typeParameters: {
                    type: 'TypeParameterDeclaration',
                    params: [{
                      type: 'Identifier',
                      name: 'T',
                      range: [12, 13],
                      loc: {
                        start: { line: 1, column: 12 },
                        end: { line: 1, column: 13 }
                      }
                    }],
                    range: [11, 14],
                    loc: {
                      start: { line: 1, column: 11 },
                      end: { line: 1, column: 14 }
                    }
                  },
                  range: [9, 23],
                  loc: {
                    start: { line: 1, column: 9 },
                    end: { line: 1, column: 23 }
                  }
                },
                optional: false,
                range: [9, 24],
                loc: {
                  start: { line: 1, column: 9 },
                  end: { line: 1, column: 24 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [7, 26],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 26 }
              }
            },
            range: [5, 26],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 26 }
            }
          },
          range: [4, 26],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 26 }
          }
        },
        init: null,
        range: [4, 26],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 26 }
        }
      }],
      kind: 'var',
      range: [0, 26],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 26 }
      }
    },
    'var a:Array<number> = [1, 2, 3]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'Identifier',
                name: 'Array',
                range: [6, 11],
                loc: {
                  start: { line: 1, column: 6 },
                  end: { line: 1, column: 11 }
                }
              },
              typeParameters: {
                type: 'TypeParameterInstantiation',
                params: [{
                  type: 'NumberTypeAnnotation',
                  range: [12, 18],
                  loc: {
                    start: { line: 1, column: 12 },
                    end: { line: 1, column: 18 }
                  }
                }],
                range: [11, 19],
                loc: {
                  start: { line: 1, column: 11 },
                  end: { line: 1, column: 19 }
                }
              },
              range: [6, 19],
              loc: {
                start: { line: 1, column: 6 },
                end: { line: 1, column: 19 }
              }
            },
            range: [5, 19],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 19 }
            }
          },
          range: [4, 19],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 19 }
          }
        },
        init: {
          type: 'ArrayExpression',
          elements: [{
            type: 'Literal',
            value: 1,
            raw: '1',
            range: [23, 24],
            loc: {
              start: { line: 1, column: 23 },
              end: { line: 1, column: 24 }
            }
          }, {
            type: 'Literal',
            value: 2,
            raw: '2',
            range: [26, 27],
            loc: {
              start: { line: 1, column: 26 },
              end: { line: 1, column: 27 }
            }
          }, {
            type: 'Literal',
            value: 3,
            raw: '3',
            range: [29, 30],
            loc: {
              start: { line: 1, column: 29 },
              end: { line: 1, column: 30 }
            }
          }],
          range: [22, 31],
          loc: {
            start: { line: 1, column: 22 },
            end: { line: 1, column: 31 }
          }
        },
        range: [4, 31],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 31 }
        }
      }],
      kind: 'var',
      range: [0, 31],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 31 }
      }
    },
    'a = class Foo<T> { }': {
      type: 'ExpressionStatement',
      expression: {
        type: 'AssignmentExpression',
        operator: '=',
        left: {
          type: 'Identifier',
          name: 'a',
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: 'ClassExpression',
          id: {
            type: 'Identifier',
            name: 'Foo',
            range: [10, 13],
            loc: {
              start: { line: 1, column: 10 },
              end: { line: 1, column: 13 }
            }
          },
          superClass: null,
          body: {
            type: 'ClassBody',
            body: [],
            range: [17, 20],
            loc: {
              start: { line: 1, column: 17 },
              end: { line: 1, column: 20 }
            }
          },
          typeParameters: {
            type: 'TypeParameterDeclaration',
            params: [{
              type: 'Identifier',
              name: 'T',
              range: [14, 15],
              loc: {
                start: { line: 1, column: 14 },
                end: { line: 1, column: 15 }
              }
            }],
            range: [13, 16],
            loc: {
              start: { line: 1, column: 13 },
              end: { line: 1, column: 16 }
            }
          },
          range: [4, 20],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 20 }
          }
        },
        range: [0, 20],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 20 }
        }
      },
      range: [0, 20],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 20 }
      }
    },
    'a = class Foo<T> extends Bar<T> { }': {
      type: 'ExpressionStatement',
      expression: {
        type: 'AssignmentExpression',
        operator: '=',
        left: {
          type: 'Identifier',
          name: 'a',
          range: [0, 1],
          loc: {
            start: { line: 1, column: 0 },
            end: { line: 1, column: 1 }
          }
        },
        right: {
          type: 'ClassExpression',
          id: {
            type: 'Identifier',
            name: 'Foo',
            range: [10, 13],
            loc: {
              start: { line: 1, column: 10 },
              end: { line: 1, column: 13 }
            }
          },
          superClass: {
            type: 'Identifier',
            name: 'Bar',
            range: [25, 28],
            loc: {
              start: { line: 1, column: 25 },
              end: { line: 1, column: 28 }
            }
          },
          body: {
            type: 'ClassBody',
            body: [],
            range: [32, 35],
            loc: {
              start: { line: 1, column: 32 },
              end: { line: 1, column: 35 }
            }
          },
          typeParameters: {
            type: 'TypeParameterDeclaration',
            params: [{
              type: 'Identifier',
              name: 'T',
              range: [14, 15],
              loc: {
                start: { line: 1, column: 14 },
                end: { line: 1, column: 15 }
              }
            }],
            range: [13, 16],
            loc: {
              start: { line: 1, column: 13 },
              end: { line: 1, column: 16 }
            }
          },
          superTypeParameters: {
            type: 'TypeParameterInstantiation',
            params: [{
              type: 'GenericTypeAnnotation',
              id: {
                type: 'Identifier',
                name: 'T',
                range: [29, 30],
                loc: {
                  start: { line: 1, column: 29 },
                  end: { line: 1, column: 30 }
                }
              },
              typeParameters: null,
              range: [29, 30],
              loc: {
                start: { line: 1, column: 29 },
                end: { line: 1, column: 30 }
              }
            }],
            range: [28, 31],
            loc: {
              start: { line: 1, column: 28 },
              end: { line: 1, column: 31 }
            }
          },
          range: [4, 35],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 35 }
          }
        },
        range: [0, 35],
        loc: {
          start: { line: 1, column: 0 },
          end: { line: 1, column: 35 }
        }
      },
      range: [0, 35],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 35 }
      }
    },
    'class Foo<T> {}': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: 'ClassBody',
        body: [],
        range: [13, 15],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 15 }
        }
      },
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [10, 11],
          loc: {
            start: { line: 1, column: 10 },
            end: { line: 1, column: 11 }
          }
        }],
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      range: [0, 15],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 15 }
      }
    },
    'class Foo<T> extends Bar<T> { }': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: {
        type: 'Identifier',
        name: 'Bar',
        range: [21, 24],
        loc: {
          start: { line: 1, column: 21 },
          end: { line: 1, column: 24 }
        }
      },
      body: {
        type: 'ClassBody',
        body: [],
        range: [28, 31],
        loc: {
          start: { line: 1, column: 28 },
          end: { line: 1, column: 31 }
        }
      },
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [10, 11],
          loc: {
            start: { line: 1, column: 10 },
            end: { line: 1, column: 11 }
          }
        }],
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      superTypeParameters: {
        type: 'TypeParameterInstantiation',
        params: [{
          type: 'GenericTypeAnnotation',
          id: {
            type: 'Identifier',
            name: 'T',
            range: [25, 26],
            loc: {
              start: { line: 1, column: 25 },
              end: { line: 1, column: 26 }
            }
          },
          typeParameters: null,
          range: [25, 26],
          loc: {
            start: { line: 1, column: 25 },
            end: { line: 1, column: 26 }
          }
        }],
        range: [24, 27],
        loc: {
          start: { line: 1, column: 24 },
          end: { line: 1, column: 27 }
        }
      },
      range: [0, 31],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 31 }
      }
    },
    'class Foo<T> extends mixin(Bar) { }': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: {
        type: 'CallExpression',
        callee: {
          type: 'Identifier',
          name: 'mixin',
          range: [21, 26],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 26 }
          }
        },
        'arguments': [{
          type: 'Identifier',
          name: 'Bar',
          range: [27, 30],
          loc: {
            start: { line: 1, column: 27 },
            end: { line: 1, column: 30 }
          }
        }],
        range: [21, 31],
        loc: {
          start: { line: 1, column: 21 },
          end: { line: 1, column: 31 }
        }
      },
      body: {
        type: 'ClassBody',
        body: [],
        range: [32, 35],
        loc: {
          start: { line: 1, column: 32 },
          end: { line: 1, column: 35 }
        }
      },
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [10, 11],
          loc: {
            start: { line: 1, column: 10 },
            end: { line: 1, column: 11 }
          }
        }],
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      range: [0, 35],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 35 }
      }
    },
    'class Foo<T> { bar<U>():number { return 42; }}': {
      type: "ClassDeclaration",
      id: {
        type: "Identifier",
        name: "Foo",
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: "ClassBody",
        body: [{
          type: "MethodDefinition",
          key: {
            type: "Identifier",
            name: "bar",
            range: [15, 18],
            loc: {
              start: { line: 1, column: 15 },
              end: { line: 1, column: 18 }
            }
          },
          value: {
            type: "FunctionExpression",
            id: null,
            params: [],
            body: {
              type: "BlockStatement",
              body: [{
                type: "ReturnStatement",
                argument: {
                  type: "Literal",
                  value: 42,
                  raw: "42",
                  range: [40, 42],
                  loc: {
                    start: { line: 1, column: 40 },
                    end: { line: 1, column: 42 }
                  }
                },
                range: [33, 43],
                loc: {
                  start: { line: 1, column: 33 },
                  end: { line: 1, column: 43 }
                }
              }],
              range: [31, 45],
              loc: {
                start: { line: 1, column: 31 },
                end: { line: 1, column: 45 }
              }
            },
            generator: false,
            expression: false,
            returnType: {
              type: "TypeAnnotation",
              typeAnnotation: {
                type: "NumberTypeAnnotation",
                range: [24, 30],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 30 }
                }
              },
              range: [23, 30],
              loc: {
                start: { line: 1, column: 23 },
                end: { line: 1, column: 30 }
              }
            },
            typeParameters: {
              type: "TypeParameterDeclaration",
              params: [{
                type: "Identifier",
                name: "U",
                range: [19, 20],
                loc: {
                  start: { line: 1, column: 19 },
                  end: { line: 1, column: 20 }
                }
              }],
              range: [18, 21],
              loc: {
                start: { line: 1, column: 18 },
                end: { line: 1, column: 21 }
              }
            },
            //range: [31, 45],
            //loc: {
            //  start: { line: 1, column: 31 },
            //  end: { line: 1, column: 45 }
            //}
          },
          kind: "method",
          "static": false,
          computed: false,
          range: [15, 45],
          loc: {
            start: { line: 1, column: 15 },
            end: { line: 1, column: 45 }
          }
        }],
        range: [13, 46],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 46 }
        }
      },
      typeParameters: {
        type: "TypeParameterDeclaration",
        params: [{
          type: "Identifier",
          name: "T",
          range: [10, 11],
          loc: {
            start: { line: 1, column: 10 },
            end: { line: 1, column: 11 }
          }
        }],
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      range: [0, 46],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 46 }
      }
    },
    'class Foo { "bar"<T>() { } }': {
      type: "ClassDeclaration",
      id: {
        type: "Identifier",
        name: "Foo",
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: "ClassBody",
        body: [{
          type: "MethodDefinition",
          key: {
            type: "Literal",
            value: "bar",
            raw: '"bar"',
            range: [12, 17],
            loc: {
              start: { line: 1, column: 12 },
              end: { line: 1, column: 17 }
            }
          },
          value: {
            type: "FunctionExpression",
            id: null,
            params: [],
            body: {
              type: "BlockStatement",
              body: [],
              range: [23, 26],
              loc: {
                start: { line: 1, column: 23 },
                end: { line: 1, column: 26 }
              }
            },
            generator: false,
            expression: false,
            typeParameters: {
              type: "TypeParameterDeclaration",
              params: [{
                type: "Identifier",
                name: "T",
                range: [18, 19],
                loc: {
                  start: { line: 1, column: 18 },
                  end: { line: 1, column: 19 }
                }
              }],
              range: [17, 20],
              loc: {
                start: { line: 1, column: 17 },
                end: { line: 1, column: 20 }
              }
            },
            //range: [23, 26],
            //loc: {
            //  start: { line: 1, column: 23 },
            //  end: { line: 1, column: 26 }
            //}
          },
          kind: "method",
          "static": false,
          computed: false,
          range: [12, 26],
          loc: {
            start: { line: 1, column: 12 },
            end: { line: 1, column: 26 }
          }
        }],
        range: [10, 28],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 28 }
        }
      },
      range: [0, 28],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 28 }
      }
    },
    'function foo(requiredParam, optParam?) {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'requiredParam',
        range: [13, 26],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 26 }
        }
      }, {
        type: 'Identifier',
        name: 'optParam',
        optional: true,
        range: [28, 37],
        loc: {
          start: { line: 1, column: 28 },
          end: { line: 1, column: 37 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [39, 41],
        loc: {
          start: { line: 1, column: 39 },
          end: { line: 1, column: 41 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 41],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 41 }
      }
    },
    'class Foo { prop1:string; prop2:number; }': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: 'ClassBody',
        body: [{
          type: 'ClassProperty',
          key: {
            type: 'Identifier',
            name: 'prop1',
            range: [12, 17],
            loc: {
              start: { line: 1, column: 12 },
              end: { line: 1, column: 17 }
            }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'StringTypeAnnotation',
              range: [18, 24],
              loc: {
                start: { line: 1, column: 18 },
                end: { line: 1, column: 24 }
              }
            },
            range: [17, 24],
            loc: {
              start: { line: 1, column: 17 },
              end: { line: 1, column: 24 }
            }
          },
          computed: false,
          'static': false,
          range: [12, 25],
          loc: {
            start: { line: 1, column: 12 },
            end: { line: 1, column: 25 }
          }
        }, {
          type: 'ClassProperty',
          key: {
            type: 'Identifier',
            name: 'prop2',
            range: [26, 31],
            loc: {
              start: { line: 1, column: 26 },
              end: { line: 1, column: 31 }
            }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NumberTypeAnnotation',
              range: [32, 38],
              loc: {
                start: { line: 1, column: 32 },
                end: { line: 1, column: 38 }
              }
            },
            range: [31, 38],
            loc: {
              start: { line: 1, column: 31 },
              end: { line: 1, column: 38 }
            }
          },
          computed: false,
          'static': false,
          range: [26, 39],
          loc: {
            start: { line: 1, column: 26 },
            end: { line: 1, column: 39 }
          }
        }],
        range: [10, 41],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 41 }
        }
      },
      range: [0, 41],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 41 }
      }
    },
    'class Foo { static prop1:string; prop2:number; }': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: 'ClassBody',
        body: [{
          type: 'ClassProperty',
          key: {
            type: 'Identifier',
            name: 'prop1',
            range: [19, 24],
            loc: {
              start: { line: 1, column: 19 },
              end: { line: 1, column: 24 }
            }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'StringTypeAnnotation',
              range: [25, 31],
              loc: {
                start: { line: 1, column: 25 },
                end: { line: 1, column: 31 }
              }
            },
            range: [24, 31],
            loc: {
              start: { line: 1, column: 24 },
              end: { line: 1, column: 31 }
            }
          },
          computed: false,
          'static': true,
          range: [12, 32],
          loc: {
            start: { line: 1, column: 12 },
            end: { line: 1, column: 32 }
          }
        }, {
          type: 'ClassProperty',
          key: {
            type: 'Identifier',
            name: 'prop2',
            range: [33, 38],
            loc: {
              start: { line: 1, column: 33 },
              end: { line: 1, column: 38 }
            }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NumberTypeAnnotation',
              range: [39, 45],
              loc: {
                start: { line: 1, column: 39 },
                end: { line: 1, column: 45 }
              }
            },
            range: [38, 45],
            loc: {
              start: { line: 1, column: 38 },
              end: { line: 1, column: 45 }
            }
          },
          computed: false,
          'static': false,
          range: [33, 46],
          loc: {
            start: { line: 1, column: 33 },
            end: { line: 1, column: 46 }
          }
        }],
        range: [10, 48],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 48 }
        }
      },
      range: [0, 48],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 48 }
      }
    },
    'var x : number | string = 4;': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'x',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'UnionTypeAnnotation',
              types: [{
                type: 'NumberTypeAnnotation',
                range: [8, 14],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 14 }
                }
              }, {
                type: 'StringTypeAnnotation',
                range: [17, 23],
                loc: {
                  start: { line: 1, column: 17 },
                  end: { line: 1, column: 23 }
                }
              }],
              range: [8, 23],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 23 }
              }
            },
            range: [6, 23],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 23 }
            }
          },
          range: [4, 23],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 23 }
          }
        },
        init: {
          type: 'Literal',
          value: 4,
          raw: '4',
          range: [26, 27],
          loc: {
            start: { line: 1, column: 26 },
            end: { line: 1, column: 27 }
          }
        },
        range: [4, 27],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 27 }
        }
      }],
      kind: 'var',
      range: [0, 28],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 28 }
      }
    },
    "class Array { concat(items:number | string) {}; }": {
      type: "ClassDeclaration",
      id: {
        type: "Identifier",
        name: "Array",
        range: [6, 11],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 11 }
        }
      },
      superClass: null,
      body: {
        type: "ClassBody",
        body: [{
          type: "MethodDefinition",
          key: {
            type: "Identifier",
            name: "concat",
            range: [14, 20],
            loc: {
              start: { line: 1, column: 14 },
              end: { line: 1, column: 20 }
            }
          },
          value: {
            type: "FunctionExpression",
            id: null,
            params: [{
              type: "Identifier",
              name: "items",
              typeAnnotation: {
                type: "TypeAnnotation",
                typeAnnotation: {
                  type: "UnionTypeAnnotation",
                  types: [{
                    type: "NumberTypeAnnotation",
                    range: [27, 33],
                    loc: {
                      start: { line: 1, column: 27 },
                      end: { line: 1, column: 33 }
                    }
                  }, {
                    type: "StringTypeAnnotation",
                    range: [36, 42],
                    loc: {
                      start: { line: 1, column: 36 },
                      end: { line: 1, column: 42 }
                    }
                  }],
                  range: [27, 42],
                  loc: {
                    start: { line: 1, column: 27 },
                    end: { line: 1, column: 42 }
                  }
                },
                range: [26, 42],
                loc: {
                  start: { line: 1, column: 26 },
                  end: { line: 1, column: 42 }
                }
              },
              range: [21, 42],
              loc: {
                start: { line: 1, column: 21 },
                end: { line: 1, column: 42 }
              }
            }],
            body: {
              type: "BlockStatement",
              body: [],
              range: [44, 46],
              loc: {
                start: { line: 1, column: 44 },
                end: { line: 1, column: 46 }
              }
            },
            generator: false,
            expression: false,
            //range: [44, 46],
            //loc: {
            //  start: { line: 1, column: 44 },
            //  end: { line: 1, column: 46 }
            //}
          },
          kind: "method",
          "static": false,
          computed: false,
          range: [14, 46],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 46 }
          }
        }],
        range: [12, 49],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 49 }
        }
      },
      range: [0, 49],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 49 }
      }
    },
    'var x : () => number | () => string = fn;': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'x',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'FunctionTypeAnnotation',
              params: [],
              returnType: {
                type: 'UnionTypeAnnotation',
                types: [{
                  type: 'NumberTypeAnnotation',
                  range: [14, 20],
                  loc: {
                    start: { line: 1, column: 14 },
                    end: { line: 1, column: 20 }
                  }
                }, {
                  type: 'FunctionTypeAnnotation',
                  params: [],
                  returnType: {
                    type: 'StringTypeAnnotation',
                    range: [29, 35],
                    loc: {
                      start: { line: 1, column: 29 },
                      end: { line: 1, column: 35 }
                    }
                  },
                  typeParameters: null,
                  range: [23, 35],
                  loc: {
                    start: { line: 1, column: 23 },
                    end: { line: 1, column: 35 }
                  }
                }],
                range: [14, 35],
                loc: {
                  start: { line: 1, column: 14 },
                  end: { line: 1, column: 35 }
                }
              },
              typeParameters: null,
              range: [8, 35],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 35 }
              }
            },
            range: [6, 35],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 35 }
            }
          },
          range: [4, 35],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 35 }
          }
        },
        init: {
          type: 'Identifier',
          name: 'fn',
          range: [38, 40],
          loc: {
            start: { line: 1, column: 38 },
            end: { line: 1, column: 40 }
          }
        },
        range: [4, 40],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 40 }
        }
      }],
      kind: 'var',
      range: [0, 41],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 41 }
      }
    },
    'var x: typeof Y = Y;': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'x',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'TypeofTypeAnnotation',
              argument: {
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'Identifier',
                  name: 'Y',
                  range: [14, 15],
                  loc: {
                    start: { line: 1, column: 14 },
                    end: { line: 1, column: 15 }
                  }
                },
                typeParameters: null,
                range: [14, 15],
                loc: {
                  start: { line: 1, column: 14 },
                  end: { line: 1, column: 15 }
                }
              },
              range: [7, 15],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 15 }
              }
            },
            range: [5, 15],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 15 }
            }
          },
          range: [4, 15],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 15 }
          }
        },
        init: {
          type: 'Identifier',
          name: 'Y',
          range: [18, 19],
          loc: {
            start: { line: 1, column: 18 },
            end: { line: 1, column: 19 }
          }
        },
        range: [4, 19],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 19 }
        }
      }],
      kind: 'var',
      range: [0, 20],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 20 }
      }
    },
    'var x: typeof Y | number = Y;': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'x',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'UnionTypeAnnotation',
              types: [{
                type: 'TypeofTypeAnnotation',
                argument: {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'Y',
                    range: [14, 15],
                    loc: {
                      start: { line: 1, column: 14 },
                      end: { line: 1, column: 15 }
                    }
                  },
                  typeParameters: null,
                  range: [14, 15],
                  loc: {
                    start: { line: 1, column: 14 },
                    end: { line: 1, column: 15 }
                  }
                },
                range: [7, 15],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 15 }
                }
              }, {
                type: 'NumberTypeAnnotation',
                range: [18, 24],
                loc: {
                  start: { line: 1, column: 18 },
                  end: { line: 1, column: 24 }
                }
              }],
              range: [7, 24],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 24 }
              }
            },
            range: [5, 24],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 24 }
            }
          },
          range: [4, 24],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 24 }
          }
        },
        init: {
          type: 'Identifier',
          name: 'Y',
          range: [27, 28],
          loc: {
            start: { line: 1, column: 27 },
            end: { line: 1, column: 28 }
          }
        },
        range: [4, 28],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 28 }
        }
      }],
      kind: 'var',
      range: [0, 29],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 29 }
      }
    },
    'var {x}: {x: string; } = { x: "hello" };': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'ObjectPattern',
          properties: [{
            type: 'Property',
            key: {
              type: 'Identifier',
              name: 'x',
              range: [5, 6],
              loc: {
                start: { line: 1, column: 5 },
                end: { line: 1, column: 6 }
              }
            },
            value: {
              type: 'Identifier',
              name: 'x',
              range: [5, 6],
              loc: {
                start: { line: 1, column: 5 },
                end: { line: 1, column: 6 }
              }
            },
            kind: 'init',
            method: false,
            shorthand: true,
            computed: false,
            range: [5, 6],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 6 }
            }
          }],
          range: [4, 22],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 22 }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'x',
                  range: [10, 11],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 11 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [13, 19],
                  loc: {
                    start: { line: 1, column: 13 },
                    end: { line: 1, column: 19 }
                  }
                },
                optional: false,
                range: [10, 20],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 20 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [9, 22],
              loc: {
                start: { line: 1, column: 9 },
                end: { line: 1, column: 22 }
              }
            },
            range: [7, 22],
            loc: {
              start: { line: 1, column: 7 },
              end: { line: 1, column: 22 }
            }
          }
        },
        init: {
          type: 'ObjectExpression',
          properties: [{
            type: 'Property',
            key: {
              type: 'Identifier',
              name: 'x',
              range: [27, 28],
              loc: {
                start: { line: 1, column: 27 },
                end: { line: 1, column: 28 }
              }
            },
            value: {
              type: 'Literal',
              value: 'hello',
              raw: '"hello"',
              range: [30, 37],
              loc: {
                start: { line: 1, column: 30 },
                end: { line: 1, column: 37 }
              }
            },
            kind: 'init',
            method: false,
            shorthand: false,
            computed: false,
            range: [27, 37],
            loc: {
              start: { line: 1, column: 27 },
              end: { line: 1, column: 37 }
            }
          }],
          range: [25, 39],
          loc: {
            start: { line: 1, column: 25 },
            end: { line: 1, column: 39 }
          }
        },
        range: [4, 39],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 39 }
        }
      }],
      kind: 'var',
      range: [0, 40],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 40 }
      }
    },
    'var {x}: {x: string } = { x: "hello" };': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'ObjectPattern',
          properties: [{
            type: 'Property',
            key: {
              type: 'Identifier',
              name: 'x',
              range: [5, 6],
              loc: {
                start: { line: 1, column: 5 },
                end: { line: 1, column: 6 }
              }
            },
            value: {
              type: 'Identifier',
              name: 'x',
              range: [5, 6],
              loc: {
                start: { line: 1, column: 5 },
                end: { line: 1, column: 6 }
              }
            },
            kind: 'init',
            method: false,
            shorthand: true,
            computed: false,
            range: [5, 6],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 6 }
            }
          }],
          range: [4, 21],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 21 }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'x',
                  range: [10, 11],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 11 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [13, 19],
                  loc: {
                    start: { line: 1, column: 13 },
                    end: { line: 1, column: 19 }
                  }
                },
                optional: false,
                range: [10, 19],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 19 }
                }
              }],
              indexers: [],
              callProperties: [],
              range: [9, 21],
              loc: {
                start: { line: 1, column: 9 },
                end: { line: 1, column: 21 }
              }
            },
            range: [7, 21],
            loc: {
              start: { line: 1, column: 7 },
              end: { line: 1, column: 21 }
            }
          }
        },
        init: {
          type: 'ObjectExpression',
          properties: [{
            type: 'Property',
            key: {
              type: 'Identifier',
              name: 'x',
              range: [26, 27],
              loc: {
                start: { line: 1, column: 26 },
                end: { line: 1, column: 27 }
              }
            },
            value: {
              type: 'Literal',
              value: 'hello',
              raw: '"hello"',
              range: [29, 36],
              loc: {
                start: { line: 1, column: 29 },
                end: { line: 1, column: 36 }
              }
            },
            kind: 'init',
            method: false,
            shorthand: false,
            computed: false,
            range: [26, 36],
            loc: {
              start: { line: 1, column: 26 },
              end: { line: 1, column: 36 }
            }
          }],
          range: [24, 38],
          loc: {
            start: { line: 1, column: 24 },
            end: { line: 1, column: 38 }
          }
        },
        range: [4, 38],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 38 }
        }
      }],
      kind: 'var',
      range: [0, 39],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 39 }
      }
    },
    'var [x]: Array<string> = [ "hello" ];': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'ArrayPattern',
          elements: [{
            type: 'Identifier',
            name: 'x',
            range: [5, 6],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 6 }
            }
          }],
          range: [4, 22],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 22 }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'Identifier',
                name: 'Array',
                range: [9, 14],
                loc: {
                  start: { line: 1, column: 9 },
                  end: { line: 1, column: 14 }
                }
              },
              typeParameters: {
                type: 'TypeParameterInstantiation',
                params: [{
                  type: 'StringTypeAnnotation',
                  range: [15, 21],
                  loc: {
                    start: { line: 1, column: 15 },
                    end: { line: 1, column: 21 }
                  }
                }],
                range: [14, 22],
                loc: {
                  start: { line: 1, column: 14 },
                  end: { line: 1, column: 22 }
                }
              },
              range: [9, 22],
              loc: {
                start: { line: 1, column: 9 },
                end: { line: 1, column: 22 }
              }
            },
            range: [7, 22],
            loc: {
              start: { line: 1, column: 7 },
              end: { line: 1, column: 22 }
            }
          }
        },
        init: {
          type: 'ArrayExpression',
          elements: [{
            type: 'Literal',
            value: 'hello',
            raw: '"hello"',
            range: [27, 34],
            loc: {
              start: { line: 1, column: 27 },
              end: { line: 1, column: 34 }
            }
          }],
          range: [25, 36],
          loc: {
            start: { line: 1, column: 25 },
            end: { line: 1, column: 36 }
          }
        },
        range: [4, 36],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 36 }
        }
      }],
      kind: 'var',
      range: [0, 37],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 37 }
      }
    },
    'function foo({x}: { x: string; }) {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'ObjectPattern',
        properties: [{
          type: 'Property',
          key: {
            type: 'Identifier',
            name: 'x',
            range: [14, 15],
            loc: {
              start: { line: 1, column: 14 },
              end: { line: 1, column: 15 }
            }
          },
          value: {
            type: 'Identifier',
            name: 'x',
            range: [14, 15],
            loc: {
              start: { line: 1, column: 14 },
              end: { line: 1, column: 15 }
            }
          },
          kind: 'init',
          method: false,
          shorthand: true,
          computed: false,
          range: [14, 15],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 15 }
          }
        }],
        range: [13, 32],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 32 }
        },
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'ObjectTypeAnnotation',
            properties: [{
              type: 'ObjectTypeProperty',
              key: {
                type: 'Identifier',
                name: 'x',
                range: [20, 21],
                loc: {
                  start: { line: 1, column: 20 },
                  end: { line: 1, column: 21 }
                }
              },
              value: {
                type: 'StringTypeAnnotation',
                range: [23, 29],
                loc: {
                  start: { line: 1, column: 23 },
                  end: { line: 1, column: 29 }
                }
              },
              optional: false,
              range: [20, 30],
              loc: {
                start: { line: 1, column: 20 },
                end: { line: 1, column: 30 }
              }
            }],
            indexers: [],
            callProperties: [],
            range: [18, 32],
            loc: {
              start: { line: 1, column: 18 },
              end: { line: 1, column: 32 }
            }
          },
          range: [16, 32],
          loc: {
            start: { line: 1, column: 16 },
            end: { line: 1, column: 32 }
          }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [34, 36],
        loc: {
          start: { line: 1, column: 34 },
          end: { line: 1, column: 36 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    'function foo([x]: Array<string>) {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [{
        type: 'ArrayPattern',
        elements: [{
          type: 'Identifier',
          name: 'x',
          range: [14, 15],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 15 }
          }
        }],
        range: [13, 31],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 31 }
        },
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'GenericTypeAnnotation',
            id: {
              type: 'Identifier',
              name: 'Array',
              range: [18, 23],
              loc: {
                start: { line: 1, column: 18 },
                end: { line: 1, column: 23 }
              }
            },
            typeParameters: {
              type: 'TypeParameterInstantiation',
              params: [{
                type: 'StringTypeAnnotation',
                range: [24, 30],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 30 }
                }
              }],
              range: [23, 31],
              loc: {
                start: { line: 1, column: 23 },
                end: { line: 1, column: 31 }
              }
            },
            range: [18, 31],
            loc: {
              start: { line: 1, column: 18 },
              end: { line: 1, column: 31 }
            }
          },
          range: [16, 31],
          loc: {
            start: { line: 1, column: 16 },
            end: { line: 1, column: 31 }
          }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [33, 35],
        loc: {
          start: { line: 1, column: 33 },
          end: { line: 1, column: 35 }
        }
      },
      generator: false,
      expression: false,
      range: [0, 35],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 35 }
      }
    },
    "function foo(...rest: Array<number>) {}": {
      type: "FunctionDeclaration",
      start: 0,
      end: 39,
      id: {
        type: "Identifier",
        start: 9,
        end: 12,
        name: "foo"
      },
      generator: false,
      expression: false,
      params: [{
        type: "RestElement",
        start: 13,
        end: 35,
        argument: {
          type: "Identifier",
          start: 16,
          end: 20,
          name: "rest"
        },
        typeAnnotation: {
          type: "TypeAnnotation",
          start: 20,
          end: 35,
          typeAnnotation: {
            type: "GenericTypeAnnotation",
            start: 22,
            end: 35,
            typeParameters: {
              type: "TypeParameterInstantiation",
              start: 27,
              end: 35,
              params: [
                {
                  type: "NumberTypeAnnotation",
                  start: 28,
                  end: 34
                }
              ]
            },
            id: {
              type: "Identifier",
              start: 22,
              end: 27,
              name: "Array"
            }
          }
        }
      }],
      body: {
        type: "BlockStatement",
        start: 37,
        end: 39,
        body: []
      }
    },
    "(function (...rest: Array<number>) {})": {
      type: "ExpressionStatement",
      start: 0,
      end: 38,
      expression: {
        type: "FunctionExpression",
        start: 1,
        end: 37,
        id: null,
        generator: false,
        expression: false,
        params: [{
          type: "RestElement",
          start: 11,
          end: 33,
          argument: {
            type: "Identifier",
            start: 14,
            end: 18,
            name: "rest"
          },
          typeAnnotation: {
            type: "TypeAnnotation",
            start: 18,
            end: 33,
            typeAnnotation: {
              type: "GenericTypeAnnotation",
              start: 20,
              end: 33,
              typeParameters: {
                type: "TypeParameterInstantiation",
                start: 25,
                end: 33,
                params: [
                  {
                    type: "NumberTypeAnnotation",
                    start: 26,
                    end: 32
                  }
                ]
              },
              id: {
                type: "Identifier",
                start: 20,
                end: 25,
                name: "Array"
              }
            }
          }
        }],
        body: {
          type: "BlockStatement",
          start: 35,
          end: 37,
          body: []
        }
      }
    },
    "((...rest: Array<number>) => rest)": {
      type: "ExpressionStatement",
      start: 0,
      end: 34,
      expression: {
        type: "ArrowFunctionExpression",
        start: 1,
        end: 33,
        id: null,
        generator: false,
        expression: true,
        params: [{
          type: "RestElement",
          start: 2,
          end: 9,
          argument: {
            type: "Identifier",
            start: 5,
            end: 9,
            name: "rest"
          },
          typeAnnotation: {
            type: "TypeAnnotation",
            start: 9,
            end: 24,
            typeAnnotation: {
              type: "GenericTypeAnnotation",
              start: 11,
              end: 24,
              typeParameters: {
                type: "TypeParameterInstantiation",
                start: 16,
                end: 24,
                params: [
                  {
                    type: "NumberTypeAnnotation",
                    start: 17,
                    end: 23
                  }
                ]
              },
              id: {
                type: "Identifier",
                start: 11,
                end: 16,
                name: "Array"
              }
            }
          }
        }],
        body: {
          type: "Identifier",
          start: 29,
          end: 33,
          name: "rest"
        }
      }
    },
    'var a: Map<string, Array<string> >': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'Identifier',
                name: 'Map',
                range: [7, 10],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 10 }
                }
              },
              typeParameters: {
                type: 'TypeParameterInstantiation',
                params: [{
                  type: 'StringTypeAnnotation',
                  range: [11, 17],
                  loc: {
                    start: { line: 1, column: 11 },
                    end: { line: 1, column: 17 }
                  }
                }, {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'Array',
                    range: [19, 24],
                    loc: {
                      start: { line: 1, column: 19 },
                      end: { line: 1, column: 24 }
                    }
                  },
                  typeParameters: {
                    type: 'TypeParameterInstantiation',
                    params: [{
                      type: 'StringTypeAnnotation',
                      range: [25, 31],
                      loc: {
                        start: { line: 1, column: 25 },
                        end: { line: 1, column: 31 }
                      }
                    }],
                    range: [24, 32],
                    loc: {
                      start: { line: 1, column: 24 },
                      end: { line: 1, column: 32 }
                    }
                  },
                  range: [19, 32],
                  loc: {
                    start: { line: 1, column: 19 },
                    end: { line: 1, column: 32 }
                  }
                }],
                range: [10, 34],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 34 }
                }
              },
              range: [7, 34],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 34 }
              }
            },
            range: [5, 34],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 34 }
            }
          },
          range: [4, 34],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 34 }
          }
        },
        init: null,
        range: [4, 34],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 34 }
        }
      }],
      kind: 'var',
      range: [0, 34],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 34 }
      }
    },
    'var a: Map<string, Array<string>>': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'Identifier',
                name: 'Map',
                range: [7, 10],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 10 }
                }
              },
              typeParameters: {
                type: 'TypeParameterInstantiation',
                params: [{
                  type: 'StringTypeAnnotation',
                  range: [11, 17],
                  loc: {
                    start: { line: 1, column: 11 },
                    end: { line: 1, column: 17 }
                  }
                }, {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'Array',
                    range: [19, 24],
                    loc: {
                      start: { line: 1, column: 19 },
                      end: { line: 1, column: 24 }
                    }
                  },
                  typeParameters: {
                    type: 'TypeParameterInstantiation',
                    params: [{
                      type: 'StringTypeAnnotation',
                      range: [25, 31],
                      loc: {
                        start: { line: 1, column: 25 },
                        end: { line: 1, column: 31 }
                      }
                    }],
                    range: [24, 32],
                    loc: {
                      start: { line: 1, column: 24 },
                      end: { line: 1, column: 32 }
                    }
                  },
                  range: [19, 32],
                  loc: {
                    start: { line: 1, column: 19 },
                    end: { line: 1, column: 32 }
                  }
                }],
                range: [10, 33],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 33 }
                }
              },
              range: [7, 33],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 33 }
              }
            },
            range: [5, 33],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 33 }
            }
          },
          range: [4, 33],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 33 }
          }
        },
        init: null,
        range: [4, 33],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 33 }
        }
      }],
      kind: 'var',
      range: [0, 33],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 33 }
      }
    },
    'var a: number[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ArrayTypeAnnotation',
              elementType: {
                type: 'NumberTypeAnnotation',
                range: [7, 13],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 13 }
                }
              },
              range: [7, 15],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 15 }
              }
            },
            range: [5, 15],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 15 }
            }
          },
          range: [4, 15],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 15 }
          }
        },
        init: null,
        range: [4, 15],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 15 }
        }
      }],
      kind: 'var',
      range: [0, 15],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 15 }
      }
    },
    'var a: ?string[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NullableTypeAnnotation',
              typeAnnotation: {
                type: 'ArrayTypeAnnotation',
                elementType: {
                  type: 'StringTypeAnnotation',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                range: [8, 16],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 16 }
                }
              },
              range: [7, 16],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 16 }
              }
            },
            range: [5, 16],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 16 }
            }
          },
          range: [4, 16],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 16 }
          }
        },
        init: null,
        range: [4, 16],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 16 }
        }
      }],
      kind: 'var',
      range: [0, 16],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 16 }
      }
    },
    'var a: Promise<bool>[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ArrayTypeAnnotation',
              elementType: {
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'Identifier',
                  name: 'Promise',
                  range: [7, 14],
                  loc: {
                    start: { line: 1, column: 7 },
                    end: { line: 1, column: 14 }
                  }
                },
                typeParameters: {
                  type: 'TypeParameterInstantiation',
                  params: [{
                    type: 'BooleanTypeAnnotation',
                    range: [15, 19],
                    loc: {
                      start: { line: 1, column: 15 },
                      end: { line: 1, column: 19 }
                    }
                  }],
                  range: [14, 20],
                  loc: {
                    start: { line: 1, column: 14 },
                    end: { line: 1, column: 20 }
                  }
                },
                range: [7, 20],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 20 }
                }
              },
              range: [7, 22],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 22 }
              }
            },
            range: [5, 22],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 22 }
            }
          },
          range: [4, 22],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 22 }
          }
        },
        init: null,
        range: [4, 22],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 22 }
        }
      }],
      kind: 'var',
      range: [0, 22],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 22 }
      }
    },
    'var a:(...rest:Array<number>) => number': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'FunctionTypeAnnotation',
              params: [],
              returnType: {
                type: 'NumberTypeAnnotation',
                range: [33, 39],
                loc: {
                  start: { line: 1, column: 33 },
                  end: { line: 1, column: 39 }
                }
              },
              rest: {
                type: 'FunctionTypeParam',
                name: {
                  type: 'Identifier',
                  name: 'rest',
                  range: [10, 14],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 14 }
                  }
                },
                typeAnnotation: {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'Array',
                    range: [15, 20],
                    loc: {
                      start: { line: 1, column: 15 },
                      end: { line: 1, column: 20 }
                    }
                  },
                  typeParameters: {
                    type: 'TypeParameterInstantiation',
                    params: [{
                      type: 'NumberTypeAnnotation',
                      range: [21, 27],
                      loc: {
                        start: { line: 1, column: 21 },
                        end: { line: 1, column: 27 }
                      }
                    }],
                    range: [20, 28],
                    loc: {
                      start: { line: 1, column: 20 },
                      end: { line: 1, column: 28 }
                    }
                  },
                  range: [15, 28],
                  loc: {
                    start: { line: 1, column: 15 },
                    end: { line: 1, column: 28 }
                  }
                },
                optional: false,
                range: [10, 28],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 28 }
                }
              },
              typeParameters: null,
              range: [6, 39],
              loc: {
                start: { line: 1, column: 6 },
                end: { line: 1, column: 39 }
              }
            },
            range: [5, 39],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 39 }
            }
          },
          range: [4, 39],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 39 }
          }
        },
        init: null,
        range: [4, 39],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 39 }
        }
      }],
      kind: 'var',
      range: [0, 39],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 39 }
      }
    },
    'var identity: <T>(x: T) => T': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'identity',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'FunctionTypeAnnotation',
              params: [{
                type: 'FunctionTypeParam',
                name: {
                  type: 'Identifier',
                  name: 'x',
                  range: [18, 19],
                  loc: {
                    start: { line: 1, column: 18 },
                    end: { line: 1, column: 19 }
                  }
                },
                typeAnnotation: {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'T',
                    range: [21, 22],
                    loc: {
                      start: { line: 1, column: 21 },
                      end: { line: 1, column: 22 }
                    }
                  },
                  typeParameters: null,
                  range: [21, 22],
                  loc: {
                    start: { line: 1, column: 21 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [18, 22],
                loc: {
                  start: { line: 1, column: 18 },
                  end: { line: 1, column: 22 }
                }
              }],
              returnType: {
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'Identifier',
                  name: 'T',
                  range: [27, 28],
                  loc: {
                    start: { line: 1, column: 27 },
                    end: { line: 1, column: 28 }
                  }
                },
                typeParameters: null,
                range: [27, 28],
                loc: {
                  start: { line: 1, column: 27 },
                  end: { line: 1, column: 28 }
                }
              },
              typeParameters: {
                type: 'TypeParameterDeclaration',
                params: [{
                  type: 'Identifier',
                  name: 'T',
                  range: [15, 16],
                  loc: {
                    start: { line: 1, column: 15 },
                    end: { line: 1, column: 16 }
                  }
                }],
                range: [14, 17],
                loc: {
                  start: { line: 1, column: 14 },
                  end: { line: 1, column: 17 }
                }
              },
              range: [14, 28],
              loc: {
                start: { line: 1, column: 14 },
                end: { line: 1, column: 28 }
              }
            },
            range: [12, 28],
            loc: {
              start: { line: 1, column: 12 },
              end: { line: 1, column: 28 }
            }
          },
          range: [4, 28],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 28 }
          }
        },
        init: null,
        range: [4, 28],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 28 }
        }
      }],
      kind: 'var',
      range: [0, 28],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 28 }
      }
    },
    'var identity: <T>(x: T, ...y:T[]) => T': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'identity',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'FunctionTypeAnnotation',
              params: [{
                type: 'FunctionTypeParam',
                name: {
                  type: 'Identifier',
                  name: 'x',
                  range: [18, 19],
                  loc: {
                    start: { line: 1, column: 18 },
                    end: { line: 1, column: 19 }
                  }
                },
                typeAnnotation: {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'T',
                    range: [21, 22],
                    loc: {
                      start: { line: 1, column: 21 },
                      end: { line: 1, column: 22 }
                    }
                  },
                  typeParameters: null,
                  range: [21, 22],
                  loc: {
                    start: { line: 1, column: 21 },
                    end: { line: 1, column: 22 }
                  }
                },
                optional: false,
                range: [18, 22],
                loc: {
                  start: { line: 1, column: 18 },
                  end: { line: 1, column: 22 }
                }
              }],
              returnType: {
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'Identifier',
                  name: 'T',
                  range: [37, 38],
                  loc: {
                    start: { line: 1, column: 37 },
                    end: { line: 1, column: 38 }
                  }
                },
                typeParameters: null,
                range: [37, 38],
                loc: {
                  start: { line: 1, column: 37 },
                  end: { line: 1, column: 38 }
                }
              },
              rest: {
                type: 'FunctionTypeParam',
                name: {
                  type: 'Identifier',
                  name: 'y',
                  range: [27, 28],
                  loc: {
                    start: { line: 1, column: 27 },
                    end: { line: 1, column: 28 }
                  }
                },
                typeAnnotation: {
                  type: 'ArrayTypeAnnotation',
                  elementType: {
                    type: 'GenericTypeAnnotation',
                    id: {
                      type: 'Identifier',
                      name: 'T',
                      range: [29, 30],
                      loc: {
                        start: { line: 1, column: 29 },
                        end: { line: 1, column: 30 }
                      }
                    },
                    typeParameters: null,
                    range: [29, 30],
                    loc: {
                      start: { line: 1, column: 29 },
                      end: { line: 1, column: 30 }
                    }
                  },
                  range: [29, 32],
                  loc: {
                    start: { line: 1, column: 29 },
                    end: { line: 1, column: 32 }
                  }
                },
                optional: false,
                range: [27, 32],
                loc: {
                  start: { line: 1, column: 27 },
                  end: { line: 1, column: 32 }
                }
              },
              typeParameters: {
                type: 'TypeParameterDeclaration',
                params: [{
                  type: 'Identifier',
                  name: 'T',
                  range: [15, 16],
                  loc: {
                    start: { line: 1, column: 15 },
                    end: { line: 1, column: 16 }
                  }
                }],
                range: [14, 17],
                loc: {
                  start: { line: 1, column: 14 },
                  end: { line: 1, column: 17 }
                }
              },
              range: [14, 38],
              loc: {
                start: { line: 1, column: 14 },
                end: { line: 1, column: 38 }
              }
            },
            range: [12, 38],
            loc: {
              start: { line: 1, column: 12 },
              end: { line: 1, column: 38 }
            }
          },
          range: [4, 38],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 38 }
          }
        },
        init: null,
        range: [4, 38],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 38 }
        }
      }],
      kind: 'var',
      range: [0, 38],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 38 }
      }
    },
    'import type foo from "bar";': {
      type: 'ImportDeclaration',
      specifiers: [{
        type: 'ImportDefaultSpecifier',
        local: {
          type: 'Identifier',
          name: 'foo',
          range: [12, 15],
          loc: {
            start: { line: 1, column: 12 },
            end: { line: 1, column: 15 }
          }
        },
        range: [12, 15],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 15 }
        }
      }],
      source: {
        type: 'Literal',
        value: 'bar',
        raw: '"bar"',
        range: [21, 26],
        loc: {
          start: { line: 1, column: 21 },
          end: { line: 1, column: 26 }
        }
      },
      isType: true,
      range: [0, 27],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 27 }
      }
    },
    'import type {foo, bar} from "baz";': {
      type: 'ImportDeclaration',
      specifiers: [{
        type: 'ImportSpecifier',
        local: {
          type: 'Identifier',
          name: 'foo',
          range: [13, 16],
          loc: {
            start: { line: 1, column: 13 },
            end: { line: 1, column: 16 }
          }
        },
        imported: {
          type: 'Identifier',
          name: 'foo',
          range: [13, 16],
          loc: {
            start: { line: 1, column: 13 },
            end: { line: 1, column: 16 }
          }
        },
        range: [13, 16],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 16 }
        }
      }, {
        type: 'ImportSpecifier',
        local: {
          type: 'Identifier',
          name: 'bar',
          range: [18, 21],
          loc: {
            start: { line: 1, column: 18 },
            end: { line: 1, column: 21 }
          }
        },
        imported: {
          type: 'Identifier',
          name: 'bar',
          range: [18, 21],
          loc: {
            start: { line: 1, column: 18 },
            end: { line: 1, column: 21 }
          }
        },
        range: [18, 21],
        loc: {
          start: { line: 1, column: 18 },
          end: { line: 1, column: 21 }
        }
      }],
      source: {
        type: 'Literal',
        value: 'baz',
        raw: '"baz"',
        range: [28, 33],
        loc: {
          start: { line: 1, column: 28 },
          end: { line: 1, column: 33 }
        }
      },
      isType: true,
      range: [0, 34],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 34 }
      }
    },
    'import type {foo as bar} from "baz";': {
      type: 'ImportDeclaration',
      specifiers: [{
        type: 'ImportSpecifier',
        imported: {
          type: 'Identifier',
          name: 'foo',
          range: [13, 16],
          loc: {
            start: { line: 1, column: 13 },
            end: { line: 1, column: 16 }
          }
        },
        local: {
          type: 'Identifier',
          name: 'bar',
          range: [20, 23],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 23 }
          }
        },
        range: [13, 23],
        loc: {
          start: { line: 1, column: 13 },
          end: { line: 1, column: 23 }
        }
      }],
      source: {
        type: 'Literal',
        value: 'baz',
        raw: '"baz"',
        range: [30, 35],
        loc: {
          start: { line: 1, column: 30 },
          end: { line: 1, column: 35 }
        }
      },
      isType: true,
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    'import type from "foo";': {
      type: 'ImportDeclaration',
      specifiers: [{
        type: 'ImportDefaultSpecifier',
        local: {
          type: 'Identifier',
          name: 'type',
          range: [7, 11],
          loc: {
            start: { line: 1, column: 7 },
            end: { line: 1, column: 11 }
          }
        },
        range: [7, 11],
        loc: {
          start: { line: 1, column: 7 },
          end: { line: 1, column: 11 }
        }
      }],
      source: {
        type: 'Literal',
        value: 'foo',
        raw: '"foo"',
        range: [17, 22],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 22 }
        }
      },
      isType: false,
      range: [0, 23],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 23 }
      }
    },
    'import type, {foo} from "bar";': {
      type: 'ImportDeclaration',
      specifiers: [{
        type: 'ImportDefaultSpecifier',
        local: {
          type: 'Identifier',
          name: 'type',
          range: [7, 11],
          loc: {
            start: { line: 1, column: 7 },
            end: { line: 1, column: 11 }
          }
        },
        range: [7, 11],
        loc: {
          start: { line: 1, column: 7 },
          end: { line: 1, column: 11 }
        }
      }, {
        type: 'ImportSpecifier',
        local: {
          type: 'Identifier',
          name: 'foo',
          range: [14, 17],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 17 }
          }
        },
        imported: {
          type: 'Identifier',
          name: 'foo',
          range: [14, 17],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 17 }
          }
        },
        range: [14, 17],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 17 }
        }
      }],
      source: {
        type: 'Literal',
        value: 'bar',
        raw: '"bar"',
        range: [24, 29],
        loc: {
          start: { line: 1, column: 24 },
          end: { line: 1, column: 29 }
        }
      },
      isType: false,
      range: [0, 30],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 30 }
      }
    },
    'import type * as namespace from "bar";': {
      type: 'ImportDeclaration',
      specifiers: [{
        type: 'ImportNamespaceSpecifier',
        local: {
          type: 'Identifier',
          name: 'namespace',
          range: [17, 26],
          loc: {
            start: { line: 1, column: 17 },
            end: { line: 1, column: 26 }
          }
        },
        range: [12, 26],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 26 }
        }
      }],
      source: {
        type: 'Literal',
        value: 'bar',
        raw: '"bar"',
        range: [32, 37],
        loc: {
          start: { line: 1, column: 32 },
          end: { line: 1, column: 37 }
        }
      },
      isType: true,
      range: [0, 38],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 38 }
      }
    },
  },
  'Array Types': {
    'var a: number[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ArrayTypeAnnotation',
              elementType: {
                type: 'NumberTypeAnnotation',
                range: [7, 13],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 13 }
                }
              },
              range: [7, 15],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 15 }
              }
            },
            range: [5, 15],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 15 }
            }
          },
          range: [4, 15],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 15 }
          }
        },
        init: null,
        range: [4, 15],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 15 }
        }
      }],
      kind: 'var',
      range: [0, 15],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 15 }
      }
    },
    'var a: ?number[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NullableTypeAnnotation',
              typeAnnotation: {
                type: 'ArrayTypeAnnotation',
                elementType: {
                  type: 'NumberTypeAnnotation',
                  range: [8, 14],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 14 }
                  }
                },
                range: [8, 16],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 16 }
                }
              },
              range: [7, 16],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 16 }
              }
            },
            range: [5, 16],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 16 }
            }
          },
          range: [4, 16],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 16 }
          }
        },
        init: null,
        range: [4, 16],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 16 }
        }
      }],
      kind: 'var',
      range: [0, 16],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 16 }
      }
    },
    'var a: (?number)[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ArrayTypeAnnotation',
              elementType: {
                type: 'NullableTypeAnnotation',
                typeAnnotation: {
                  type: 'NumberTypeAnnotation',
                  range: [9, 15],
                  loc: {
                    start: { line: 1, column: 9 },
                    end: { line: 1, column: 15 }
                  }
                },
                range: [8, 15],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 15 }
                }
              },
              range: [7, 18],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 18 }
              }
            },
            range: [5, 18],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 18 }
            }
          },
          range: [4, 18],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 18 }
          }
        },
        init: null,
        range: [4, 18],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 18 }
        }
      }],
      kind: 'var',
      range: [0, 18],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 18 }
      }
    },
    'var a: () => number[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'FunctionTypeAnnotation',
              params: [],
              returnType: {
                type: 'ArrayTypeAnnotation',
                elementType: {
                  type: 'NumberTypeAnnotation',
                  range: [13, 19],
                  loc: {
                    start: { line: 1, column: 13 },
                    end: { line: 1, column: 19 }
                  }
                },
                range: [13, 21],
                loc: {
                  start: { line: 1, column: 13 },
                  end: { line: 1, column: 21 }
                }
              },
              typeParameters: null,
              range: [7, 21],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 21 }
              }
            },
            range: [5, 21],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 21 }
            }
          },
          range: [4, 21],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 21 }
          }
        },
        init: null,
        range: [4, 21],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 21 }
        }
      }],
      kind: 'var',
      range: [0, 21],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 21 }
      }
    },
    'var a: (() => number)[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ArrayTypeAnnotation',
              elementType: {
                type: 'FunctionTypeAnnotation',
                params: [],
                returnType: {
                  type: 'NumberTypeAnnotation',
                  range: [14, 20],
                  loc: {
                    start: { line: 1, column: 14 },
                    end: { line: 1, column: 20 }
                  }
                },
                typeParameters: null,
                range: [8, 20],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 20 }
                }
              },
              range: [7, 23],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 23 }
              }
            },
            range: [5, 23],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 23 }
            }
          },
          range: [4, 23],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 23 }
          }
        },
        init: null,
        range: [4, 23],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 23 }
        }
      }],
      kind: 'var',
      range: [0, 23],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 23 }
      }
    },
    'var a: typeof A[]': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ArrayTypeAnnotation',
              elementType: {
                type: 'TypeofTypeAnnotation',
                argument: {
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'A',
                    range: [14, 15],
                    loc: {
                      start: { line: 1, column: 14 },
                      end: { line: 1, column: 15 }
                    }
                  },
                  typeParameters: null,
                  range: [14, 15],
                  loc: {
                    start: { line: 1, column: 14 },
                    end: { line: 1, column: 15 }
                  }
                },
                range: [7, 15],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 15 }
                }
              },
              range: [7, 17],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 17 }
              }
            },
            range: [5, 17],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 17 }
            }
          },
          range: [4, 17],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 17 }
          }
        },
        init: null,
        range: [4, 17],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 17 }
        }
      }],
      kind: 'var',
      range: [0, 17],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 17 }
      }
    },
  },
  'Tuples': {
    'var a : [] = [];': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'TupleTypeAnnotation',
              types: [],
              range: [8, 10],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 10 }
              }
            },
            range: [6, 10],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 10 }
            }
          },
          range: [4, 10],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 10 }
          }
        },
        init: {
          type: 'ArrayExpression',
          elements: [],
          range: [13, 15],
          loc: {
            start: { line: 1, column: 13 },
            end: { line: 1, column: 15 }
          }
        },
        range: [4, 15],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 15 }
        }
      }],
      kind: 'var',
      range: [0, 16],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 16 }
      }
    },
    'var a : [Foo<T>] = [foo];': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'TupleTypeAnnotation',
              types: [{
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'Identifier',
                  name: 'Foo',
                  range: [9, 12],
                  loc: {
                    start: { line: 1, column: 9 },
                    end: { line: 1, column: 12 }
                  }
                },
                typeParameters: {
                  type: 'TypeParameterInstantiation',
                  params: [{
                    type: 'GenericTypeAnnotation',
                    id: {
                      type: 'Identifier',
                      name: 'T',
                      range: [13, 14],
                      loc: {
                        start: { line: 1, column: 13 },
                        end: { line: 1, column: 14 }
                      }
                    },
                    typeParameters: null,
                    range: [13, 14],
                    loc: {
                      start: { line: 1, column: 13 },
                      end: { line: 1, column: 14 }
                    }
                  }],
                  range: [12, 15],
                  loc: {
                    start: { line: 1, column: 12 },
                    end: { line: 1, column: 15 }
                  }
                },
                range: [9, 15],
                loc: {
                  start: { line: 1, column: 9 },
                  end: { line: 1, column: 15 }
                }
              }],
              range: [8, 16],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 16 }
              }
            },
            range: [6, 16],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 16 }
            }
          },
          range: [4, 16],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 16 }
          }
        },
        init: {
          type: 'ArrayExpression',
          elements: [{
            type: 'Identifier',
            name: 'foo',
            range: [20, 23],
            loc: {
              start: { line: 1, column: 20 },
              end: { line: 1, column: 23 }
            }
          }],
          range: [19, 24],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 24 }
          }
        },
        range: [4, 24],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 24 }
        }
      }],
      kind: 'var',
      range: [0, 25],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 25 }
      }
    },
    'var a : [number,] = [123,];': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'TupleTypeAnnotation',
              types: [{
                type: 'NumberTypeAnnotation',
                range: [9, 15],
                loc: {
                  start: { line: 1, column: 9 },
                  end: { line: 1, column: 15 }
                }
              }],
              range: [8, 17],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 17 }
              }
            },
            range: [6, 17],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 17 }
            }
          },
          range: [4, 17],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 17 }
          }
        },
        init: {
          type: 'ArrayExpression',
          elements: [{
            type: 'Literal',
            value: 123,
            raw: '123',
            range: [21, 24],
            loc: {
              start: { line: 1, column: 21 },
              end: { line: 1, column: 24 }
            }
          }],
          range: [20, 26],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 26 }
          }
        },
        range: [4, 26],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 26 }
        }
      }],
      kind: 'var',
      range: [0, 27],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 27 }
      }
    },
    'var a : [number, string] = [123, "duck"];': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'TupleTypeAnnotation',
              types: [{
                type: 'NumberTypeAnnotation',
                range: [9, 15],
                loc: {
                  start: { line: 1, column: 9 },
                  end: { line: 1, column: 15 }
                }
              }, {
                type: 'StringTypeAnnotation',
                range: [17, 23],
                loc: {
                  start: { line: 1, column: 17 },
                  end: { line: 1, column: 23 }
                }
              }],
              range: [8, 24],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 24 }
              }
            },
            range: [6, 24],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 24 }
            }
          },
          range: [4, 24],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 24 }
          }
        },
        init: {
          type: 'ArrayExpression',
          elements: [{
            type: 'Literal',
            value: 123,
            raw: '123',
            range: [28, 31],
            loc: {
              start: { line: 1, column: 28 },
              end: { line: 1, column: 31 }
            }
          }, {
            type: 'Literal',
            value: 'duck',
            raw: '"duck"',
            range: [33, 39],
            loc: {
              start: { line: 1, column: 33 },
              end: { line: 1, column: 39 }
            }
          }],
          range: [27, 40],
          loc: {
            start: { line: 1, column: 27 },
            end: { line: 1, column: 40 }
          }
        },
        range: [4, 40],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 40 }
        }
      }],
      kind: 'var',
      range: [0, 41],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 41 }
      }
    },
  },
  'Type Alias': {
    'type FBID = number;': {
      type: 'TypeAlias',
      id: {
        type: 'Identifier',
        name: 'FBID',
        range: [5, 9],
        loc: {
          start: { line: 1, column: 5 },
          end: { line: 1, column: 9 }
        }
      },
      typeParameters: null,
      right: {
        type: 'NumberTypeAnnotation',
        range: [12, 18],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 18 }
        }
      },
      range: [0, 19],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 19 }
      }
    },
    'type Foo<T> = Bar<T>': {
      type: 'TypeAlias',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [5, 8],
        loc: {
          start: { line: 1, column: 5 },
          end: { line: 1, column: 8 }
        }
      },
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [9, 10],
          loc: {
            start: { line: 1, column: 9 },
            end: { line: 1, column: 10 }
          }
        }],
        range: [8, 11],
        loc: {
          start: { line: 1, column: 8 },
          end: { line: 1, column: 11 }
        }
      },
      right: {
        type: 'GenericTypeAnnotation',
        id: {
          type: 'Identifier',
          name: 'Bar',
          range: [14, 17],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 17 }
          }
        },
        typeParameters: {
          type: 'TypeParameterInstantiation',
          params: [{
            type: 'GenericTypeAnnotation',
            id: {
              type: 'Identifier',
              name: 'T',
              range: [18, 19],
              loc: {
                start: { line: 1, column: 18 },
                end: { line: 1, column: 19 }
              }
            },
            typeParameters: null,
            range: [18, 19],
            loc: {
              start: { line: 1, column: 18 },
              end: { line: 1, column: 19 }
            }
          }],
          range: [17, 20],
          loc: {
            start: { line: 1, column: 17 },
            end: { line: 1, column: 20 }
          }
        },
        range: [14, 20],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 20 }
        }
      },
      range: [0, 20],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 20 }
      }
    },
    'export type Foo = number;': {
      type: 'ExportNamedDeclaration',
      declaration: {
        type: 'TypeAlias',
        id: {
          type: 'Identifier',
          name: 'Foo',
          range: [12, 15],
          loc: {
            start: { line: 1, column: 12 },
            end: { line: 1, column: 15 }
          }
        },
        typeParameters: null,
        right: {
          type: 'NumberTypeAnnotation',
          range: [18, 24],
          loc: {
            start: { line: 1, column: 18 },
            end: { line: 1, column: 24 }
          }
        },
        range: [7, 25],
        loc: {
          start: { line: 1, column: 7 },
          end: { line: 1, column: 25 }
        }
      },
      specifiers: [],
      source: null,
      range: [0, 25],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 25 }
      }
    },
  },
  'Interfaces (module and script)': {
    'interface A {}': {
      type: 'InterfaceDeclaration',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [10, 11],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 11 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [],
        indexers: [],
        callProperties: [],
        range: [12, 14],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 14 }
        }
      },
      'extends': [],
      range: [0, 14],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 14 }
      }
    },
    'interface A extends B {}': {
      type: 'InterfaceDeclaration',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [10, 11],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 11 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [],
        indexers: [],
        callProperties: [],
        range: [22, 24],
        loc: {
          start: { line: 1, column: 22 },
          end: { line: 1, column: 24 }
        }
      },
      'extends': [{
        type: 'InterfaceExtends',
        id: {
          type: 'Identifier',
          name: 'B',
          range: [20, 21],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 21 }
          }
        },
        typeParameters: null,
        range: [20, 21],
        loc: {
          start: { line: 1, column: 20 },
          end: { line: 1, column: 21 }
        }
      }],
      range: [0, 24],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 24 }
      }
    },
    'interface A<T> extends B<T>, C<T> {}': {
      type: 'InterfaceDeclaration',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [10, 11],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 11 }
        }
      },
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [12, 13],
          loc: {
            start: { line: 1, column: 12 },
            end: { line: 1, column: 13 }
          }
        }],
        range: [11, 14],
        loc: {
          start: { line: 1, column: 11 },
          end: { line: 1, column: 14 }
        }
      },
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [],
        indexers: [],
        callProperties: [],
        range: [34, 36],
        loc: {
          start: { line: 1, column: 34 },
          end: { line: 1, column: 36 }
        }
      },
      'extends': [{
        type: 'InterfaceExtends',
        id: {
          type: 'Identifier',
          name: 'B',
          range: [23, 24],
          loc: {
            start: { line: 1, column: 23 },
            end: { line: 1, column: 24 }
          }
        },
        typeParameters: {
          type: 'TypeParameterInstantiation',
          params: [{
            type: 'GenericTypeAnnotation',
            id: {
              type: 'Identifier',
              name: 'T',
              range: [25, 26],
              loc: {
                start: { line: 1, column: 25 },
                end: { line: 1, column: 26 }
              }
            },
            typeParameters: null,
            range: [25, 26],
            loc: {
              start: { line: 1, column: 25 },
              end: { line: 1, column: 26 }
            }
          }],
          range: [24, 27],
          loc: {
            start: { line: 1, column: 24 },
            end: { line: 1, column: 27 }
          }
        },
        range: [23, 27],
        loc: {
          start: { line: 1, column: 23 },
          end: { line: 1, column: 27 }
        }
      }, {
        type: 'InterfaceExtends',
        id: {
          type: 'Identifier',
          name: 'C',
          range: [29, 30],
          loc: {
            start: { line: 1, column: 29 },
            end: { line: 1, column: 30 }
          }
        },
        typeParameters: {
          type: 'TypeParameterInstantiation',
          params: [{
            type: 'GenericTypeAnnotation',
            id: {
              type: 'Identifier',
              name: 'T',
              range: [31, 32],
              loc: {
                start: { line: 1, column: 31 },
                end: { line: 1, column: 32 }
              }
            },
            typeParameters: null,
            range: [31, 32],
            loc: {
              start: { line: 1, column: 31 },
              end: { line: 1, column: 32 }
            }
          }],
          range: [30, 33],
          loc: {
            start: { line: 1, column: 30 },
            end: { line: 1, column: 33 }
          }
        },
        range: [29, 33],
        loc: {
          start: { line: 1, column: 29 },
          end: { line: 1, column: 33 }
        }
      }],
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    'interface A { foo: () => number; }': {
      type: 'InterfaceDeclaration',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [10, 11],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 11 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [{
          type: 'ObjectTypeProperty',
          key: {
            type: 'Identifier',
            name: 'foo',
            range: [14, 17],
            loc: {
              start: { line: 1, column: 14 },
              end: { line: 1, column: 17 }
            }
          },
          value: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [25, 31],
              loc: {
                start: { line: 1, column: 25 },
                end: { line: 1, column: 31 }
              }
            },
            typeParameters: null,
            range: [19, 31],
            loc: {
              start: { line: 1, column: 19 },
              end: { line: 1, column: 31 }
            }
          },
          optional: false,
          range: [14, 32],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 32 }
          }
        }],
        indexers: [],
        callProperties: [],
        range: [12, 34],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 34 }
        }
      },
      'extends': [],
      range: [0, 34],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 34 }
      }
    },
    'interface Dictionary { [index: string]: string; length: number; }': {
      type: 'InterfaceDeclaration',
      id: {
        type: 'Identifier',
        name: 'Dictionary',
        range: [10, 20],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 20 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [{
          type: 'ObjectTypeProperty',
          key: {
            type: 'Identifier',
            name: 'length',
            range: [48, 54],
            loc: {
              start: { line: 1, column: 48 },
              end: { line: 1, column: 54 }
            }
          },
          value: {
            type: 'NumberTypeAnnotation',
            range: [56, 62],
            loc: {
              start: { line: 1, column: 56 },
              end: { line: 1, column: 62 }
            }
          },
          optional: false,
          range: [48, 63],
          loc: {
            start: { line: 1, column: 48 },
            end: { line: 1, column: 63 }
          }
        }],
        indexers: [{
          type: 'ObjectTypeIndexer',
          id: {
            type: 'Identifier',
            name: 'index',
            range: [24, 29],
            loc: {
              start: { line: 1, column: 24 },
              end: { line: 1, column: 29 }
            }
          },
          key: {
            type: 'StringTypeAnnotation',
            range: [31, 37],
            loc: {
              start: { line: 1, column: 31 },
              end: { line: 1, column: 37 }
            }
          },
          value: {
            type: 'StringTypeAnnotation',
            range: [40, 46],
            loc: {
              start: { line: 1, column: 40 },
              end: { line: 1, column: 46 }
            }
          },
          range: [23, 47],
          loc: {
            start: { line: 1, column: 23 },
            end: { line: 1, column: 47 }
          }
        }],
        callProperties: [],
        range: [21, 65],
        loc: {
          start: { line: 1, column: 21 },
          end: { line: 1, column: 65 }
        }
      },
      'extends': [],
      range: [0, 65],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 65 }
      }
    },
    'class Foo implements Bar {}': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: null,
      body: {
        type: 'ClassBody',
        body: [],
        range: [25, 27],
        loc: {
          start: { line: 1, column: 25 },
          end: { line: 1, column: 27 }
        }
      },
      'implements': [{
        type: 'ClassImplements',
        id: {
          type: 'Identifier',
          name: 'Bar',
          range: [21, 24],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 24 }
          }
        },
        typeParameters: null,
        range: [21, 24],
        loc: {
          start: { line: 1, column: 21 },
          end: { line: 1, column: 24 }
        }
      }],
      range: [0, 27],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 27 }
      }
    },
    'class Foo extends Bar implements Bat, Man<number> {}': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: {
        type: 'Identifier',
        name: 'Bar',
        range: [18, 21],
        loc: {
          start: { line: 1, column: 18 },
          end: { line: 1, column: 21 }
        }
      },
      body: {
        type: 'ClassBody',
        body: [],
        range: [50, 52],
        loc: {
          start: { line: 1, column: 50 },
          end: { line: 1, column: 52 }
        }
      },
      'implements': [{
        type: 'ClassImplements',
        id: {
          type: 'Identifier',
          name: 'Bat',
          range: [33, 36],
          loc: {
            start: { line: 1, column: 33 },
            end: { line: 1, column: 36 }
          }
        },
        typeParameters: null,
        range: [33, 36],
        loc: {
          start: { line: 1, column: 33 },
          end: { line: 1, column: 36 }
        }
      }, {
        type: 'ClassImplements',
        id: {
          type: 'Identifier',
          name: 'Man',
          range: [38, 41],
          loc: {
            start: { line: 1, column: 38 },
            end: { line: 1, column: 41 }
          }
        },
        typeParameters: {
          type: 'TypeParameterInstantiation',
          params: [{
            type: 'NumberTypeAnnotation',
            range: [42, 48],
            loc: {
              start: { line: 1, column: 42 },
              end: { line: 1, column: 48 }
            }
          }],
          range: [41, 49],
          loc: {
            start: { line: 1, column: 41 },
            end: { line: 1, column: 49 }
          }
        },
        range: [38, 49],
        loc: {
          start: { line: 1, column: 38 },
          end: { line: 1, column: 49 }
        }
      }],
      range: [0, 52],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 52 }
      }
    },
    'class Foo extends class Bar implements Bat {} {}': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: {
        type: 'ClassExpression',
        id: {
          type: 'Identifier',
          name: 'Bar',
          range: [24, 27],
          loc: {
            start: { line: 1, column: 24 },
            end: { line: 1, column: 27 }
          }
        },
        superClass: null,
        body: {
          type: 'ClassBody',
          body: [],
          range: [43, 45],
          loc: {
            start: { line: 1, column: 43 },
            end: { line: 1, column: 45 }
          }
        },
        'implements': [{
          type: 'ClassImplements',
          id: {
            type: 'Identifier',
            name: 'Bat',
            range: [39, 42],
            loc: {
              start: { line: 1, column: 39 },
              end: { line: 1, column: 42 }
            }
          },
          typeParameters: null,
          range: [39, 42],
          loc: {
            start: { line: 1, column: 39 },
            end: { line: 1, column: 42 }
          }
        }],
        range: [18, 45],
        loc: {
          start: { line: 1, column: 18 },
          end: { line: 1, column: 45 }
        }
      },
      body: {
        type: 'ClassBody',
        body: [],
        range: [46, 48],
        loc: {
          start: { line: 1, column: 46 },
          end: { line: 1, column: 48 }
        }
      },
      range: [0, 48],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 48 }
      }
    },
    'class Foo extends class Bar implements Bat {} implements Man {}': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'Foo',
        range: [6, 9],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 9 }
        }
      },
      superClass: {
        type: 'ClassExpression',
        id: {
          type: 'Identifier',
          name: 'Bar',
          range: [24, 27],
          loc: {
            start: { line: 1, column: 24 },
            end: { line: 1, column: 27 }
          }
        },
        superClass: null,
        body: {
          type: 'ClassBody',
          body: [],
          range: [43, 45],
          loc: {
            start: { line: 1, column: 43 },
            end: { line: 1, column: 45 }
          }
        },
        'implements': [{
          type: 'ClassImplements',
          id: {
            type: 'Identifier',
            name: 'Bat',
            range: [39, 42],
            loc: {
              start: { line: 1, column: 39 },
              end: { line: 1, column: 42 }
            }
          },
          typeParameters: null,
          range: [39, 42],
          loc: {
            start: { line: 1, column: 39 },
            end: { line: 1, column: 42 }
          }
        }],
        range: [18, 45],
        loc: {
          start: { line: 1, column: 18 },
          end: { line: 1, column: 45 }
        }
      },
      body: {
        type: 'ClassBody',
        body: [],
        range: [61, 63],
        loc: {
          start: { line: 1, column: 61 },
          end: { line: 1, column: 63 }
        }
      },
      'implements': [{
        type: 'ClassImplements',
        id: {
          type: 'Identifier',
          name: 'Man',
          range: [57, 60],
          loc: {
            start: { line: 1, column: 57 },
            end: { line: 1, column: 60 }
          }
        },
        typeParameters: null,
        range: [57, 60],
        loc: {
          start: { line: 1, column: 57 },
          end: { line: 1, column: 60 }
        }
      }],
      range: [0, 63],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 63 }
      }
    },
  },
  'Type Grouping': {
    'var a: (number)': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NumberTypeAnnotation',
              range: [8, 14],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 14 }
              }
            },
            range: [5, 15],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 15 }
            }
          },
          range: [4, 15],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 15 }
          }
        },
        init: null,
        range: [4, 15],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 15 }
        }
      }],
      kind: 'var',
      range: [0, 15],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 15 }
      }
    },
    'var a: (() => number) | () => string': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'UnionTypeAnnotation',
              types: [{
                type: 'FunctionTypeAnnotation',
                params: [],
                returnType: {
                  type: 'NumberTypeAnnotation',
                  range: [14, 20],
                  loc: {
                    start: { line: 1, column: 14 },
                    end: { line: 1, column: 20 }
                  }
                },
                typeParameters: null,
                range: [8, 20],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 20 }
                }
              }, {
                type: 'FunctionTypeAnnotation',
                params: [],
                returnType: {
                  type: 'StringTypeAnnotation',
                  range: [30, 36],
                  loc: {
                    start: { line: 1, column: 30 },
                    end: { line: 1, column: 36 }
                  }
                },
                typeParameters: null,
                range: [24, 36],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 36 }
                }
              }],
              range: [7, 36],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 36 }
              }
            },
            range: [5, 36],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 36 }
            }
          },
          range: [4, 36],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 36 }
          }
        },
        init: null,
        range: [4, 36],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 36 }
        }
      }],
      kind: 'var',
      range: [0, 36],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 36 }
      }
    },
    'var a: number & (string | bool)': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'IntersectionTypeAnnotation',
              types: [{
                type: 'NumberTypeAnnotation',
                range: [7, 13],
                loc: {
                  start: { line: 1, column: 7 },
                  end: { line: 1, column: 13 }
                }
              }, {
                type: 'UnionTypeAnnotation',
                types: [{
                  type: 'StringTypeAnnotation',
                  range: [17, 23],
                  loc: {
                    start: { line: 1, column: 17 },
                    end: { line: 1, column: 23 }
                  }
                }, {
                  type: 'BooleanTypeAnnotation',
                  range: [26, 30],
                  loc: {
                    start: { line: 1, column: 26 },
                    end: { line: 1, column: 30 }
                  }
                }],
                range: [17, 30],
                loc: {
                  start: { line: 1, column: 17 },
                  end: { line: 1, column: 30 }
                }
              }],
              range: [7, 31],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 31 }
              }
            },
            range: [5, 31],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 31 }
            }
          },
          range: [4, 31],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 31 }
          }
        },
        init: null,
        range: [4, 31],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 31 }
        }
      }],
      kind: 'var',
      range: [0, 31],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 31 }
      }
    },
    'var a: (typeof A)': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'TypeofTypeAnnotation',
              argument: {
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'Identifier',
                  name: 'A',
                  range: [15, 16],
                  loc: {
                    start: { line: 1, column: 15 },
                    end: { line: 1, column: 16 }
                  }
                },
                typeParameters: null,
                range: [15, 16],
                loc: {
                  start: { line: 1, column: 15 },
                  end: { line: 1, column: 16 }
                }
              },
              range: [8, 16],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 16 }
              }
            },
            range: [5, 17],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 17 }
            }
          },
          range: [4, 17],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 17 }
          }
        },
        init: null,
        range: [4, 17],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 17 }
        }
      }],
      kind: 'var',
      range: [0, 17],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 17 }
      }
    },
  },
  'Call Properties': {
    'var a : { (): number }': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [],
              indexers: [],
              callProperties: [{
                type: 'ObjectTypeCallProperty',
                value: {
                  type: 'FunctionTypeAnnotation',
                  params: [],
                  returnType: {
                    type: 'NumberTypeAnnotation',
                    range: [14, 20],
                    loc: {
                      start: { line: 1, column: 14 },
                      end: { line: 1, column: 20 }
                    }
                  },
                  typeParameters: null,
                  range: [10, 20],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 20 }
                  }
                },
                range: [10, 20],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 20 }
                }
              }],
              range: [8, 22],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 22 }
              }
            },
            range: [6, 22],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 22 }
            }
          },
          range: [4, 22],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 22 }
          }
        },
        init: null,
        range: [4, 22],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 22 }
        }
      }],
      kind: 'var',
      range: [0, 22],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 22 }
      }
    },
    'var a : { (): number; }': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [],
              indexers: [],
              callProperties: [{
                type: 'ObjectTypeCallProperty',
                value: {
                  type: 'FunctionTypeAnnotation',
                  params: [],
                  returnType: {
                    type: 'NumberTypeAnnotation',
                    range: [14, 20],
                    loc: {
                      start: { line: 1, column: 14 },
                      end: { line: 1, column: 20 }
                    }
                  },
                  typeParameters: null,
                  range: [10, 20],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 20 }
                  }
                },
                range: [10, 21],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 21 }
                }
              }],
              range: [8, 23],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 23 }
              }
            },
            range: [6, 23],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 23 }
            }
          },
          range: [4, 23],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 23 }
          }
        },
        init: null,
        range: [4, 23],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 23 }
        }
      }],
      kind: 'var',
      range: [0, 23],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 23 }
      }
    },
    'var a : { (): number; y: string; (x: string): string }': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [{
                type: 'ObjectTypeProperty',
                key: {
                  type: 'Identifier',
                  name: 'y',
                  range: [22, 23],
                  loc: {
                    start: { line: 1, column: 22 },
                    end: { line: 1, column: 23 }
                  }
                },
                value: {
                  type: 'StringTypeAnnotation',
                  range: [25, 31],
                  loc: {
                    start: { line: 1, column: 25 },
                    end: { line: 1, column: 31 }
                  }
                },
                optional: false,
                range: [22, 32],
                loc: {
                  start: { line: 1, column: 22 },
                  end: { line: 1, column: 32 }
                }
              }],
              indexers: [],
              callProperties: [{
                type: 'ObjectTypeCallProperty',
                value: {
                  type: 'FunctionTypeAnnotation',
                  params: [],
                  returnType: {
                    type: 'NumberTypeAnnotation',
                    range: [14, 20],
                    loc: {
                      start: { line: 1, column: 14 },
                      end: { line: 1, column: 20 }
                    }
                  },
                  typeParameters: null,
                  range: [10, 20],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 20 }
                  }
                },
                range: [10, 21],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 21 }
                }
              }, {
                type: 'ObjectTypeCallProperty',
                value: {
                  type: 'FunctionTypeAnnotation',
                  params: [{
                    type: 'FunctionTypeParam',
                    name: {
                      type: 'Identifier',
                      name: 'x',
                      range: [34, 35],
                      loc: {
                        start: { line: 1, column: 34 },
                        end: { line: 1, column: 35 }
                      }
                    },
                    typeAnnotation: {
                      type: 'StringTypeAnnotation',
                      range: [37, 43],
                      loc: {
                        start: { line: 1, column: 37 },
                        end: { line: 1, column: 43 }
                      }
                    },
                    optional: false,
                    range: [34, 43],
                    loc: {
                      start: { line: 1, column: 34 },
                      end: { line: 1, column: 43 }
                    }
                  }],
                  returnType: {
                    type: 'StringTypeAnnotation',
                    range: [46, 52],
                    loc: {
                      start: { line: 1, column: 46 },
                      end: { line: 1, column: 52 }
                    }
                  },
                  typeParameters: null,
                  range: [33, 52],
                  loc: {
                    start: { line: 1, column: 33 },
                    end: { line: 1, column: 52 }
                  }
                },
                range: [33, 52],
                loc: {
                  start: { line: 1, column: 33 },
                  end: { line: 1, column: 52 }
                }
              }],
              range: [8, 54],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 54 }
              }
            },
            range: [6, 54],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 54 }
            }
          },
          range: [4, 54],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 54 }
          }
        },
        init: null,
        range: [4, 54],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 54 }
        }
      }],
      kind: 'var',
      range: [0, 54],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 54 }
      }
    },
    'var a : { <T>(x: T): number; }': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'ObjectTypeAnnotation',
              properties: [],
              indexers: [],
              callProperties: [{
                type: 'ObjectTypeCallProperty',
                value: {
                  type: 'FunctionTypeAnnotation',
                  params: [{
                    type: 'FunctionTypeParam',
                    name: {
                      type: 'Identifier',
                      name: 'x',
                      range: [14, 15],
                      loc: {
                        start: { line: 1, column: 14 },
                        end: { line: 1, column: 15 }
                      }
                    },
                    typeAnnotation: {
                      type: 'GenericTypeAnnotation',
                      id: {
                        type: 'Identifier',
                        name: 'T',
                        range: [17, 18],
                        loc: {
                          start: { line: 1, column: 17 },
                          end: { line: 1, column: 18 }
                        }
                      },
                      typeParameters: null,
                      range: [17, 18],
                      loc: {
                        start: { line: 1, column: 17 },
                        end: { line: 1, column: 18 }
                      }
                    },
                    optional: false,
                    range: [14, 18],
                    loc: {
                      start: { line: 1, column: 14 },
                      end: { line: 1, column: 18 }
                    }
                  }],
                  returnType: {
                    type: 'NumberTypeAnnotation',
                    range: [21, 27],
                    loc: {
                      start: { line: 1, column: 21 },
                      end: { line: 1, column: 27 }
                    }
                  },
                  typeParameters: {
                    type: 'TypeParameterDeclaration',
                    params: [{
                      type: 'Identifier',
                      name: 'T',
                      range: [11, 12],
                      loc: {
                        start: { line: 1, column: 11 },
                        end: { line: 1, column: 12 }
                      }
                    }],
                    range: [10, 13],
                    loc: {
                      start: { line: 1, column: 10 },
                      end: { line: 1, column: 13 }
                    }
                  },
                  range: [10, 27],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 27 }
                  }
                },
                range: [10, 28],
                loc: {
                  start: { line: 1, column: 10 },
                  end: { line: 1, column: 28 }
                }
              }],
              range: [8, 30],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 30 }
              }
            },
            range: [6, 30],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 30 }
            }
          },
          range: [4, 30],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 30 }
          }
        },
        init: null,
        range: [4, 30],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 30 }
        }
      }],
      kind: 'var',
      range: [0, 30],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 30 }
      }
    },
    'interface A { (): number; }': {
      type: 'InterfaceDeclaration',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [10, 11],
        loc: {
          start: { line: 1, column: 10 },
          end: { line: 1, column: 11 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [],
        indexers: [],
        callProperties: [{
          type: 'ObjectTypeCallProperty',
          value: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [18, 24],
              loc: {
                start: { line: 1, column: 18 },
                end: { line: 1, column: 24 }
              }
            },
            typeParameters: null,
            range: [14, 24],
            loc: {
              start: { line: 1, column: 14 },
              end: { line: 1, column: 24 }
            }
          },
          'static': false,
          range: [14, 25],
          loc: {
            start: { line: 1, column: 14 },
            end: { line: 1, column: 25 }
          }
        }],
        range: [12, 27],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 27 }
        }
      },
      'extends': [],
      range: [0, 27],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 27 }
      }
    },
  },
  'String Literal Types': {
    'function createElement(tagName: "div"): HTMLDivElement {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'createElement',
        range: [9, 22],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 22 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'tagName',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'StringLiteralTypeAnnotation',
            value: 'div',
            raw: '"div"',
            range: [32, 37],
            loc: {
              start: { line: 1, column: 32 },
              end: { line: 1, column: 37 }
            }
          },
          range: [30, 37],
          loc: {
            start: { line: 1, column: 30 },
            end: { line: 1, column: 37 }
          }
        },
        range: [23, 37],
        loc: {
          start: { line: 1, column: 23 },
          end: { line: 1, column: 37 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [55, 57],
        loc: {
          start: { line: 1, column: 55 },
          end: { line: 1, column: 57 }
        }
      },
      generator: false,
      expression: false,
      returnType: {
        type: 'TypeAnnotation',
        typeAnnotation: {
          type: 'GenericTypeAnnotation',
          id: {
            type: 'Identifier',
            name: 'HTMLDivElement',
            range: [40, 54],
            loc: {
              start: { line: 1, column: 40 },
              end: { line: 1, column: 54 }
            }
          },
          typeParameters: null,
          range: [40, 54],
          loc: {
            start: { line: 1, column: 40 },
            end: { line: 1, column: 54 }
          }
        },
        range: [38, 54],
        loc: {
          start: { line: 1, column: 38 },
          end: { line: 1, column: 54 }
        }
      },
      range: [0, 57],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 57 }
      }
    },
    'function createElement(tagName: \'div\'): HTMLDivElement {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'createElement',
        range: [9, 22],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 22 }
        }
      },
      params: [{
        type: 'Identifier',
        name: 'tagName',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'StringLiteralTypeAnnotation',
            value: 'div',
            raw: '\'div\'',
            range: [32, 37],
            loc: {
              start: { line: 1, column: 32 },
              end: { line: 1, column: 37 }
            }
          },
          range: [30, 37],
          loc: {
            start: { line: 1, column: 30 },
            end: { line: 1, column: 37 }
          }
        },
        range: [23, 37],
        loc: {
          start: { line: 1, column: 23 },
          end: { line: 1, column: 37 }
        }
      }],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [55, 57],
        loc: {
          start: { line: 1, column: 55 },
          end: { line: 1, column: 57 }
        }
      },
      generator: false,
      expression: false,
      returnType: {
        type: 'TypeAnnotation',
        typeAnnotation: {
          type: 'GenericTypeAnnotation',
          id: {
            type: 'Identifier',
            name: 'HTMLDivElement',
            range: [40, 54],
            loc: {
              start: { line: 1, column: 40 },
              end: { line: 1, column: 54 }
            }
          },
          typeParameters: null,
          range: [40, 54],
          loc: {
            start: { line: 1, column: 40 },
            end: { line: 1, column: 54 }
          }
        },
        range: [38, 54],
        loc: {
          start: { line: 1, column: 38 },
          end: { line: 1, column: 54 }
        }
      },
      range: [0, 57],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 57 }
      }
    },
  },
  'Qualified Generic Type': {
    'var a : A.B': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'QualifiedTypeIdentifier',
                qualification: {
                  type: 'Identifier',
                  name: 'A',
                  range: [8, 9],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 9 }
                  }
                },
                id: {
                  type: 'Identifier',
                  name: 'B',
                  range: [10, 11],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 11 }
                  }
                },
                range: [8, 11],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 11 }
                }
              },
              typeParameters: null,
              range: [8, 11],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 11 }
              }
            },
            range: [6, 11],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 11 }
            }
          },
          range: [4, 11],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 11 }
          }
        },
        init: null,
        range: [4, 11],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 11 }
        }
      }],
      kind: 'var',
      range: [0, 11],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 11 }
      }
    },
    'var a : A.B.C': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'QualifiedTypeIdentifier',
                qualification: {
                  type: 'QualifiedTypeIdentifier',
                  qualification: {
                    type: 'Identifier',
                    name: 'A',
                    range: [8, 9],
                    loc: {
                      start: { line: 1, column: 8 },
                      end: { line: 1, column: 9 }
                    }
                  },
                  id: {
                    type: 'Identifier',
                    name: 'B',
                    range: [10, 11],
                    loc: {
                      start: { line: 1, column: 10 },
                      end: { line: 1, column: 11 }
                    }
                  },
                  range: [8, 11],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 11 }
                  }
                },
                id: {
                  type: 'Identifier',
                  name: 'C',
                  range: [12, 13],
                  loc: {
                    start: { line: 1, column: 12 },
                    end: { line: 1, column: 13 }
                  }
                },
                range: [8, 13],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 13 }
                }
              },
              typeParameters: null,
              range: [8, 13],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 13 }
              }
            },
            range: [6, 13],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 13 }
            }
          },
          range: [4, 13],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 13 }
          }
        },
        init: null,
        range: [4, 13],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 13 }
        }
      }],
      kind: 'var',
      range: [0, 13],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 13 }
      }
    },
    'var a : A.B<T>': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'QualifiedTypeIdentifier',
                qualification: {
                  type: 'Identifier',
                  name: 'A',
                  range: [8, 9],
                  loc: {
                    start: { line: 1, column: 8 },
                    end: { line: 1, column: 9 }
                  }
                },
                id: {
                  type: 'Identifier',
                  name: 'B',
                  range: [10, 11],
                  loc: {
                    start: { line: 1, column: 10 },
                    end: { line: 1, column: 11 }
                  }
                },
                range: [8, 11],
                loc: {
                  start: { line: 1, column: 8 },
                  end: { line: 1, column: 11 }
                }
              },
              typeParameters: {
                type: 'TypeParameterInstantiation',
                params: [{
                  type: 'GenericTypeAnnotation',
                  id: {
                    type: 'Identifier',
                    name: 'T',
                    range: [12, 13],
                    loc: {
                      start: { line: 1, column: 12 },
                      end: { line: 1, column: 13 }
                    }
                  },
                  typeParameters: null,
                  range: [12, 13],
                  loc: {
                    start: { line: 1, column: 12 },
                    end: { line: 1, column: 13 }
                  }
                }],
                range: [11, 14],
                loc: {
                  start: { line: 1, column: 11 },
                  end: { line: 1, column: 14 }
                }
              },
              range: [8, 14],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 14 }
              }
            },
            range: [6, 14],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 14 }
            }
          },
          range: [4, 14],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 14 }
          }
        },
        init: null,
        range: [4, 14],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 14 }
        }
      }],
      kind: 'var',
      range: [0, 14],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 14 }
      }
    },
    'var a : typeof A.B<T>': {
      type: 'VariableDeclaration',
      declarations: [{
        type: 'VariableDeclarator',
        id: {
          type: 'Identifier',
          name: 'a',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'TypeofTypeAnnotation',
              argument: {
                type: 'GenericTypeAnnotation',
                id: {
                  type: 'QualifiedTypeIdentifier',
                  qualification: {
                    type: 'Identifier',
                    name: 'A',
                    range: [15, 16],
                    loc: {
                      start: { line: 1, column: 15 },
                      end: { line: 1, column: 16 }
                    }
                  },
                  id: {
                    type: 'Identifier',
                    name: 'B',
                    range: [17, 18],
                    loc: {
                      start: { line: 1, column: 17 },
                      end: { line: 1, column: 18 }
                    }
                  },
                  range: [15, 18],
                  loc: {
                    start: { line: 1, column: 15 },
                    end: { line: 1, column: 18 }
                  }
                },
                typeParameters: {
                  type: 'TypeParameterInstantiation',
                  params: [{
                    type: 'GenericTypeAnnotation',
                    id: {
                      type: 'Identifier',
                      name: 'T',
                      range: [19, 20],
                      loc: {
                        start: { line: 1, column: 19 },
                        end: { line: 1, column: 20 }
                      }
                    },
                    typeParameters: null,
                    range: [19, 20],
                    loc: {
                      start: { line: 1, column: 19 },
                      end: { line: 1, column: 20 }
                    }
                  }],
                  range: [18, 21],
                  loc: {
                    start: { line: 1, column: 18 },
                    end: { line: 1, column: 21 }
                  }
                },
                range: [15, 21],
                loc: {
                  start: { line: 1, column: 15 },
                  end: { line: 1, column: 21 }
                }
              },
              range: [8, 21],
              loc: {
                start: { line: 1, column: 8 },
                end: { line: 1, column: 21 }
              }
            },
            range: [6, 21],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 21 }
            }
          },
          range: [4, 21],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 21 }
          }
        },
        init: null,
        range: [4, 21],
        loc: {
          start: { line: 1, column: 4 },
          end: { line: 1, column: 21 }
        }
      }],
      kind: 'var',
      range: [0, 21],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 21 }
      }
    },
  },
  'Declare Statements': {
    'declare var foo': {
      type: 'DeclareVariable',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [12, 15],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 15 }
        }
      },
      range: [0, 15],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 15 }
      }
    },
    'declare var foo;': {
      type: 'DeclareVariable',
      id: {
        type: 'Identifier',
        name: 'foo',
        range: [12, 15],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 15 }
        }
      },
      range: [0, 16],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 16 }
      }
    },
    'declare function foo(): void': {
      type: 'DeclareFunction',
      id: {
        type: 'Identifier',
        name: 'foo',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'VoidTypeAnnotation',
              range: [24, 28],
              loc: {
                start: { line: 1, column: 24 },
                end: { line: 1, column: 28 }
              }
            },
            typeParameters: null,
            range: [20, 28],
            loc: {
              start: { line: 1, column: 20 },
              end: { line: 1, column: 28 }
            }
          },
          range: [20, 28],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 28 }
          }
        },
        range: [17, 28],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 28 }
        }
      },
      range: [0, 28],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 28 }
      }
    },
    'declare function foo(): void;': {
      type: 'DeclareFunction',
      id: {
        type: 'Identifier',
        name: 'foo',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'VoidTypeAnnotation',
              range: [24, 28],
              loc: {
                start: { line: 1, column: 24 },
                end: { line: 1, column: 28 }
              }
            },
            typeParameters: null,
            range: [20, 28],
            loc: {
              start: { line: 1, column: 20 },
              end: { line: 1, column: 28 }
            }
          },
          range: [20, 28],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 28 }
          }
        },
        range: [17, 28],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 28 }
        }
      },
      range: [0, 29],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 29 }
      }
    },
    'declare function foo<T>(): void;': {
      type: 'DeclareFunction',
      id: {
        type: 'Identifier',
        name: 'foo',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'VoidTypeAnnotation',
              range: [27, 31],
              loc: {
                start: { line: 1, column: 27 },
                end: { line: 1, column: 31 }
              }
            },
            typeParameters: {
              type: 'TypeParameterDeclaration',
              params: [{
                type: 'Identifier',
                name: 'T',
                range: [21, 22],
                loc: {
                  start: { line: 1, column: 21 },
                  end: { line: 1, column: 22 }
                }
              }],
              range: [20, 23],
              loc: {
                start: { line: 1, column: 20 },
                end: { line: 1, column: 23 }
              }
            },
            range: [20, 31],
            loc: {
              start: { line: 1, column: 20 },
              end: { line: 1, column: 31 }
            }
          },
          range: [20, 31],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 31 }
          }
        },
        range: [17, 31],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 31 }
        }
      },
      range: [0, 32],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 32 }
      }
    },
    'declare function foo(x: number, y: string): void;': {
      type: 'DeclareFunction',
      id: {
        type: 'Identifier',
        name: 'foo',
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [{
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: 'x',
                range: [21, 22],
                loc: {
                  start: { line: 1, column: 21 },
                  end: { line: 1, column: 22 }
                }
              },
              typeAnnotation: {
                type: 'NumberTypeAnnotation',
                range: [24, 30],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 30 }
                }
              },
              optional: false,
              range: [21, 30],
              loc: {
                start: { line: 1, column: 21 },
                end: { line: 1, column: 30 }
              }
            }, {
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: 'y',
                range: [32, 33],
                loc: {
                  start: { line: 1, column: 32 },
                  end: { line: 1, column: 33 }
                }
              },
              typeAnnotation: {
                type: 'StringTypeAnnotation',
                range: [35, 41],
                loc: {
                  start: { line: 1, column: 35 },
                  end: { line: 1, column: 41 }
                }
              },
              optional: false,
              range: [32, 41],
              loc: {
                start: { line: 1, column: 32 },
                end: { line: 1, column: 41 }
              }
            }],
            returnType: {
              type: 'VoidTypeAnnotation',
              range: [44, 48],
              loc: {
                start: { line: 1, column: 44 },
                end: { line: 1, column: 48 }
              }
            },
            typeParameters: null,
            range: [20, 48],
            loc: {
              start: { line: 1, column: 20 },
              end: { line: 1, column: 48 }
            }
          },
          range: [20, 48],
          loc: {
            start: { line: 1, column: 20 },
            end: { line: 1, column: 48 }
          }
        },
        range: [17, 48],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 48 }
        }
      },
      range: [0, 49],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 49 }
      }
    },
    'declare class A {}': {
      type: 'DeclareClass',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [14, 15],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 15 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [],
        indexers: [],
        callProperties: [],
        range: [16, 18],
        loc: {
          start: { line: 1, column: 16 },
          end: { line: 1, column: 18 }
        }
      },
      'extends': [],
      range: [0, 18],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 18 }
      }
    },
    'declare class A<T> extends B<T> { x: number }': {
      type: 'DeclareClass',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [14, 15],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 15 }
        }
      },
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          range: [16, 17],
          loc: {
            start: { line: 1, column: 16 },
            end: { line: 1, column: 17 }
          }
        }],
        range: [15, 18],
        loc: {
          start: { line: 1, column: 15 },
          end: { line: 1, column: 18 }
        }
      },
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [{
          type: 'ObjectTypeProperty',
          key: {
            type: 'Identifier',
            name: 'x',
            range: [34, 35],
            loc: {
              start: { line: 1, column: 34 },
              end: { line: 1, column: 35 }
            }
          },
          value: {
            type: 'NumberTypeAnnotation',
            range: [37, 43],
            loc: {
              start: { line: 1, column: 37 },
              end: { line: 1, column: 43 }
            }
          },
          optional: false,
          range: [34, 43],
          loc: {
            start: { line: 1, column: 34 },
            end: { line: 1, column: 43 }
          }
        }],
        indexers: [],
        callProperties: [],
        range: [32, 45],
        loc: {
          start: { line: 1, column: 32 },
          end: { line: 1, column: 45 }
        }
      },
      'extends': [{
        type: 'InterfaceExtends',
        id: {
          type: 'Identifier',
          name: 'B',
          range: [27, 28],
          loc: {
            start: { line: 1, column: 27 },
            end: { line: 1, column: 28 }
          }
        },
        typeParameters: {
          type: 'TypeParameterInstantiation',
          params: [{
            type: 'GenericTypeAnnotation',
            id: {
              type: 'Identifier',
              name: 'T',
              range: [29, 30],
              loc: {
                start: { line: 1, column: 29 },
                end: { line: 1, column: 30 }
              }
            },
            typeParameters: null,
            range: [29, 30],
            loc: {
              start: { line: 1, column: 29 },
              end: { line: 1, column: 30 }
            }
          }],
          range: [28, 31],
          loc: {
            start: { line: 1, column: 28 },
            end: { line: 1, column: 31 }
          }
        },
        range: [27, 31],
        loc: {
          start: { line: 1, column: 27 },
          end: { line: 1, column: 31 }
        }
      }],
      range: [0, 45],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 45 }
      }
    },
    'declare class A { static foo(): number; static x : string }': {
      type: 'DeclareClass',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [14, 15],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 15 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [{
          type: 'ObjectTypeProperty',
          key: {
            type: 'Identifier',
            name: 'foo',
            range: [25, 28],
            loc: {
              start: { line: 1, column: 25 },
              end: { line: 1, column: 28 }
            }
          },
          value: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [32, 38],
              loc: {
                start: { line: 1, column: 32 },
                end: { line: 1, column: 38 }
              }
            },
            typeParameters: null,
            range: [18, 38],
            loc: {
              start: { line: 1, column: 18 },
              end: { line: 1, column: 38 }
            }
          },
          optional: false,
          'static': true,
          range: [18, 39],
          loc: {
            start: { line: 1, column: 18 },
            end: { line: 1, column: 39 }
          }
        }, {
          type: 'ObjectTypeProperty',
          key: {
            type: 'Identifier',
            name: 'x',
            range: [47, 48],
            loc: {
              start: { line: 1, column: 47 },
              end: { line: 1, column: 48 }
            }
          },
          value: {
            type: 'StringTypeAnnotation',
            range: [51, 57],
            loc: {
              start: { line: 1, column: 51 },
              end: { line: 1, column: 57 }
            }
          },
          optional: false,
          'static': true,
          range: [40, 57],
          loc: {
            start: { line: 1, column: 40 },
            end: { line: 1, column: 57 }
          }
        }],
        indexers: [],
        callProperties: [],
        range: [16, 59],
        loc: {
          start: { line: 1, column: 16 },
          end: { line: 1, column: 59 }
        }
      },
      'extends': [],
      range: [0, 59],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 59 }
      }
    },
    'declare class A { static [ indexer: number]: string }': {
      type: 'DeclareClass',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [14, 15],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 15 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [],
        indexers: [{
          type: 'ObjectTypeIndexer',
          id: {
            type: 'Identifier',
            name: 'indexer',
            range: [27, 34],
            loc: {
              start: { line: 1, column: 27 },
              end: { line: 1, column: 34 }
            }
          },
          key: {
            type: 'NumberTypeAnnotation',
            range: [36, 42],
            loc: {
              start: { line: 1, column: 36 },
              end: { line: 1, column: 42 }
            }
          },
          value: {
            type: 'StringTypeAnnotation',
            range: [45, 51],
            loc: {
              start: { line: 1, column: 45 },
              end: { line: 1, column: 51 }
            }
          },
          'static': true,
          range: [18, 51],
          loc: {
            start: { line: 1, column: 18 },
            end: { line: 1, column: 51 }
          }
        }],
        callProperties: [],
        range: [16, 53],
        loc: {
          start: { line: 1, column: 16 },
          end: { line: 1, column: 53 }
        }
      },
      'extends': [],
      range: [0, 53],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 53 }
      }
    },
    'declare class A { static () : number }': {
      type: 'DeclareClass',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [14, 15],
        loc: {
          start: { line: 1, column: 14 },
          end: { line: 1, column: 15 }
        }
      },
      typeParameters: null,
      body: {
        type: 'ObjectTypeAnnotation',
        properties: [],
        indexers: [],
        callProperties: [{
          type: 'ObjectTypeCallProperty',
          value: {
            type: 'FunctionTypeAnnotation',
            params: [],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [30, 36],
              loc: {
                start: { line: 1, column: 30 },
                end: { line: 1, column: 36 }
              }
            },
            typeParameters: null,
            range: [25, 36],
            loc: {
              start: { line: 1, column: 25 },
              end: { line: 1, column: 36 }
            }
          },
          'static': true,
          range: [18, 36],
          loc: {
            start: { line: 1, column: 18 },
            end: { line: 1, column: 36 }
          }
        }],
        range: [16, 38],
        loc: {
          start: { line: 1, column: 16 },
          end: { line: 1, column: 38 }
        }
      },
      'extends': [],
      range: [0, 38],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 38 }
      }
    },
  },
  'Declare Module': {
    'declare module A {}': {
      type: 'DeclareModule',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [15, 16],
        loc: {
          start: { line: 1, column: 15 },
          end: { line: 1, column: 16 }
        }
      },
      body: {
        type: 'BlockStatement',
        body: [],
        range: [17, 19],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 19 }
        }
      },
      range: [0, 19],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 19 }
      }
    },
    'declare module "./a/b.js" {}': {
      type: 'DeclareModule',
      id: {
        type: 'Literal',
        value: './a/b.js',
        raw: '"./a/b.js"',
        range: [15, 25],
        loc: {
          start: { line: 1, column: 15 },
          end: { line: 1, column: 25 }
        }
      },
      body: {
        type: 'BlockStatement',
        body: [],
        range: [26, 28],
        loc: {
          start: { line: 1, column: 26 },
          end: { line: 1, column: 28 }
        }
      },
      range: [0, 28],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 28 }
      }
    },
    'declare module A { declare var x: number; }': {
      type: 'DeclareModule',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [15, 16],
        loc: {
          start: { line: 1, column: 15 },
          end: { line: 1, column: 16 }
        }
      },
      body: {
        type: 'BlockStatement',
        body: [{
          type: 'DeclareVariable',
          id: {
            type: 'Identifier',
            name: 'x',
            typeAnnotation: {
              type: 'TypeAnnotation',
              typeAnnotation: {
                type: 'NumberTypeAnnotation',
                range: [34, 40],
                loc: {
                  start: { line: 1, column: 34 },
                  end: { line: 1, column: 40 }
                }
              },
              range: [32, 40],
              loc: {
                start: { line: 1, column: 32 },
                end: { line: 1, column: 40 }
              }
            },
            range: [31, 40],
            loc: {
              start: { line: 1, column: 31 },
              end: { line: 1, column: 40 }
            }
          },
          range: [19, 41],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 41 }
          }
        }],
        range: [17, 43],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 43 }
        }
      },
      range: [0, 43],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 43 }
      }
    },
    'declare module A { declare function foo(): number; }': {
      type: 'DeclareModule',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [15, 16],
        loc: {
          start: { line: 1, column: 15 },
          end: { line: 1, column: 16 }
        }
      },
      body: {
        type: 'BlockStatement',
        body: [{
          type: 'DeclareFunction',
          id: {
            type: 'Identifier',
            name: 'foo',
            typeAnnotation: {
              type: 'TypeAnnotation',
              typeAnnotation: {
                type: 'FunctionTypeAnnotation',
                params: [],
                returnType: {
                  type: 'NumberTypeAnnotation',
                  range: [43, 49],
                  loc: {
                    start: { line: 1, column: 43 },
                    end: { line: 1, column: 49 }
                  }
                },
                typeParameters: null,
                range: [39, 49],
                loc: {
                  start: { line: 1, column: 39 },
                  end: { line: 1, column: 49 }
                }
              },
              range: [39, 49],
              loc: {
                start: { line: 1, column: 39 },
                end: { line: 1, column: 49 }
              }
            },
            range: [36, 49],
            loc: {
              start: { line: 1, column: 36 },
              end: { line: 1, column: 49 }
            }
          },
          range: [19, 50],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 50 }
          }
        }],
        range: [17, 52],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 52 }
        }
      },
      range: [0, 52],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 52 }
      }
    },
    'declare module A { declare class B { foo(): number; } }': {
      type: 'DeclareModule',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [15, 16],
        loc: {
          start: { line: 1, column: 15 },
          end: { line: 1, column: 16 }
        }
      },
      body: {
        type: 'BlockStatement',
        body: [{
          type: 'DeclareClass',
          id: {
            type: 'Identifier',
            name: 'B',
            range: [33, 34],
            loc: {
              start: { line: 1, column: 33 },
              end: { line: 1, column: 34 }
            }
          },
          typeParameters: null,
          body: {
            type: 'ObjectTypeAnnotation',
            properties: [{
              type: 'ObjectTypeProperty',
              key: {
                type: 'Identifier',
                name: 'foo',
                range: [37, 40],
                loc: {
                  start: { line: 1, column: 37 },
                  end: { line: 1, column: 40 }
                }
              },
              value: {
                type: 'FunctionTypeAnnotation',
                params: [],
                returnType: {
                  type: 'NumberTypeAnnotation',
                  range: [44, 50],
                  loc: {
                    start: { line: 1, column: 44 },
                    end: { line: 1, column: 50 }
                  }
                },
                typeParameters: null,
                range: [37, 50],
                loc: {
                  start: { line: 1, column: 37 },
                  end: { line: 1, column: 50 }
                }
              },
              optional: false,
              range: [37, 51],
              loc: {
                start: { line: 1, column: 37 },
                end: { line: 1, column: 51 }
              }
            }],
            indexers: [],
            callProperties: [],
            range: [35, 53],
            loc: {
              start: { line: 1, column: 35 },
              end: { line: 1, column: 53 }
            }
          },
          'extends': [],
          range: [19, 53],
          loc: {
            start: { line: 1, column: 19 },
            end: { line: 1, column: 53 }
          }
        }],
        range: [17, 55],
        loc: {
          start: { line: 1, column: 17 },
          end: { line: 1, column: 55 }
        }
      },
      range: [0, 55],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 55 }
      }
    },
  },
  'Typecasts': {
    '(xxx: number)': {
      type: 'ExpressionStatement',
      expression: {
        type: 'TypeCastExpression',
        expression: {
          type: 'Identifier',
          name: 'xxx',
          range: [1, 4],
          loc: {
            start: { line: 1, column: 1 },
            end: { line: 1, column: 4 }
          }
        },
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'NumberTypeAnnotation',
            range: [6, 12],
            loc: {
              start: { line: 1, column: 6 },
              end: { line: 1, column: 12 }
            }
          },
          range: [4, 12],
          loc: {
            start: { line: 1, column: 4 },
            end: { line: 1, column: 12 }
          }
        },
        range: [1, 12],
        loc: {
          start: { line: 1, column: 1 },
          end: { line: 1, column: 12 }
        }
      },
      range: [0, 13],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 13 }
      }
    },
    '({xxx: 0, yyy: "hey"}: {xxx: number; yyy: string})': {
      type: 'ExpressionStatement',
      expression: {
        type: 'TypeCastExpression',
        expression: {
          type: 'ObjectExpression',
          properties: [{
            type: 'Property',
            key: {
              type: 'Identifier',
              name: 'xxx',
              range: [2, 5],
              loc: {
                start: { line: 1, column: 2 },
                end: { line: 1, column: 5 }
              }
            },
            value: {
              type: 'Literal',
              value: 0,
              raw: '0',
              range: [7, 8],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 8 }
              }
            },
            kind: 'init',
            method: false,
            shorthand: false,
            computed: false,
            range: [2, 8],
            loc: {
              start: { line: 1, column: 2 },
              end: { line: 1, column: 8 }
            }
          }, {
            type: 'Property',
            key: {
              type: 'Identifier',
              name: 'yyy',
              range: [10, 13],
              loc: {
                start: { line: 1, column: 10 },
                end: { line: 1, column: 13 }
              }
            },
            value: {
              type: 'Literal',
              value: 'hey',
              raw: '"hey"',
              range: [15, 20],
              loc: {
                start: { line: 1, column: 15 },
                end: { line: 1, column: 20 }
              }
            },
            kind: 'init',
            method: false,
            shorthand: false,
            computed: false,
            range: [10, 20],
            loc: {
              start: { line: 1, column: 10 },
              end: { line: 1, column: 20 }
            }
          }],
          range: [1, 21],
          loc: {
            start: { line: 1, column: 1 },
            end: { line: 1, column: 21 }
          }
        },
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'ObjectTypeAnnotation',
            properties: [{
              type: 'ObjectTypeProperty',
              key: {
                type: 'Identifier',
                name: 'xxx',
                range: [24, 27],
                loc: {
                  start: { line: 1, column: 24 },
                  end: { line: 1, column: 27 }
                }
              },
              value: {
                type: 'NumberTypeAnnotation',
                range: [29, 35],
                loc: {
                  start: { line: 1, column: 29 },
                  end: { line: 1, column: 35 }
                }
              },
              optional: false,
              range: [24, 36],
              loc: {
                start: { line: 1, column: 24 },
                end: { line: 1, column: 36 }
              }
            }, {
              type: 'ObjectTypeProperty',
              key: {
                type: 'Identifier',
                name: 'yyy',
                range: [37, 40],
                loc: {
                  start: { line: 1, column: 37 },
                  end: { line: 1, column: 40 }
                }
              },
              value: {
                type: 'StringTypeAnnotation',
                range: [42, 48],
                loc: {
                  start: { line: 1, column: 42 },
                  end: { line: 1, column: 48 }
                }
              },
              optional: false,
              range: [37, 48],
              loc: {
                start: { line: 1, column: 37 },
                end: { line: 1, column: 48 }
              }
            }],
            indexers: [],
            callProperties: [],
            range: [23, 49],
            loc: {
              start: { line: 1, column: 23 },
              end: { line: 1, column: 49 }
            }
          },
          range: [21, 49],
          loc: {
            start: { line: 1, column: 21 },
            end: { line: 1, column: 49 }
          }
        },
        range: [1, 49],
        loc: {
          start: { line: 1, column: 1 },
          end: { line: 1, column: 49 }
        }
      },
      range: [0, 50],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 50 }
      }
    },
    '((xxx) => xxx + 1: (xxx: number) => number)': {
      type: 'ExpressionStatement',
      expression: {
        type: 'TypeCastExpression',
        expression: {
          type: 'ArrowFunctionExpression',
          id: null,
          params: [{
            type: 'Identifier',
            name: 'xxx',
            range: [2, 5],
            loc: {
              start: { line: 1, column: 2 },
              end: { line: 1, column: 5 }
            }
          }],
          body: {
            type: 'BinaryExpression',
            operator: '+',
            left: {
              type: 'Identifier',
              name: 'xxx',
              range: [10, 13],
              loc: {
                start: { line: 1, column: 10 },
                end: { line: 1, column: 13 }
              }
            },
            right: {
              type: 'Literal',
              value: 1,
              raw: '1',
              range: [16, 17],
              loc: {
                start: { line: 1, column: 16 },
                end: { line: 1, column: 17 }
              }
            },
            range: [10, 17],
            loc: {
              start: { line: 1, column: 10 },
              end: { line: 1, column: 17 }
            }
          },
          generator: false,
          expression: true,
          range: [1, 17],
          loc: {
            start: { line: 1, column: 1 },
            end: { line: 1, column: 17 }
          }
        },
        typeAnnotation: {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'FunctionTypeAnnotation',
            params: [{
              type: 'FunctionTypeParam',
              name: {
                type: 'Identifier',
                name: 'xxx',
                range: [20, 23],
                loc: {
                  start: { line: 1, column: 20 },
                  end: { line: 1, column: 23 }
                }
              },
              typeAnnotation: {
                type: 'NumberTypeAnnotation',
                range: [25, 31],
                loc: {
                  start: { line: 1, column: 25 },
                  end: { line: 1, column: 31 }
                }
              },
              optional: false,
              range: [20, 31],
              loc: {
                start: { line: 1, column: 20 },
                end: { line: 1, column: 31 }
              }
            }],
            returnType: {
              type: 'NumberTypeAnnotation',
              range: [36, 42],
              loc: {
                start: { line: 1, column: 36 },
                end: { line: 1, column: 42 }
              }
            },
            typeParameters: null,
            range: [19, 42],
            loc: {
              start: { line: 1, column: 19 },
              end: { line: 1, column: 42 }
            }
          },
          range: [17, 42],
          loc: {
            start: { line: 1, column: 17 },
            end: { line: 1, column: 42 }
          }
        },
        range: [1, 42],
        loc: {
          start: { line: 1, column: 1 },
          end: { line: 1, column: 42 }
        }
      },
      range: [0, 43],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 43 }
      }
    },
    '((xxx: number), (yyy: string))': {
      type: 'ExpressionStatement',
      expression: {
        type: 'SequenceExpression',
        expressions: [{
          type: 'TypeCastExpression',
          expression: {
            type: 'Identifier',
            name: 'xxx',
            range: [2, 5],
            loc: {
              start: { line: 1, column: 2 },
              end: { line: 1, column: 5 }
            }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NumberTypeAnnotation',
              range: [7, 13],
              loc: {
                start: { line: 1, column: 7 },
                end: { line: 1, column: 13 }
              }
            },
            range: [5, 13],
            loc: {
              start: { line: 1, column: 5 },
              end: { line: 1, column: 13 }
            }
          },
          range: [2, 13],
          loc: {
            start: { line: 1, column: 2 },
            end: { line: 1, column: 13 }
          }
        }, {
          type: 'TypeCastExpression',
          expression: {
            type: 'Identifier',
            name: 'yyy',
            range: [17, 20],
            loc: {
              start: { line: 1, column: 17 },
              end: { line: 1, column: 20 }
            }
          },
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'StringTypeAnnotation',
              range: [22, 28],
              loc: {
                start: { line: 1, column: 22 },
                end: { line: 1, column: 28 }
              }
            },
            range: [20, 28],
            loc: {
              start: { line: 1, column: 20 },
              end: { line: 1, column: 28 }
            }
          },
          range: [17, 28],
          loc: {
            start: { line: 1, column: 17 },
            end: { line: 1, column: 28 }
          }
        }],
        range: [1, 29],
        loc: {
          start: { line: 1, column: 1 },
          end: { line: 1, column: 29 }
        }
      },
      range: [0, 30],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 30 }
      }
    },
  },
  'Bounded Polymorphism': {
    'class A<T: Foo> {}': {
      type: 'ClassDeclaration',
      id: {
        type: 'Identifier',
        name: 'A',
        range: [6, 7],
        loc: {
          start: { line: 1, column: 6 },
          end: { line: 1, column: 7 }
        }
      },
      superClass: null,
      body: {
        type: 'ClassBody',
        body: [],
        range: [16, 18],
        loc: {
          start: { line: 1, column: 16 },
          end: { line: 1, column: 18 }
        }
      },
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'GenericTypeAnnotation',
              id: {
                type: 'Identifier',
                name: 'Foo',
                range: [11, 14],
                loc: {
                  start: { line: 1, column: 11 },
                  end: { line: 1, column: 14 }
                }
              },
              typeParameters: null,
              range: [11, 14],
              loc: {
                start: { line: 1, column: 11 },
                end: { line: 1, column: 14 }
              }
            },
            range: [9, 14],
            loc: {
              start: { line: 1, column: 9 },
              end: { line: 1, column: 14 }
            }
          },
          range: [8, 14],
          loc: {
            start: { line: 1, column: 8 },
            end: { line: 1, column: 14 }
          }
        }],
        range: [7, 15],
        loc: {
          start: { line: 1, column: 7 },
          end: { line: 1, column: 15 }
        }
      },
      range: [0, 18],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 18 }
      }
    },
    'function bar<T: ?number>() {}': {
      type: 'FunctionDeclaration',
      id: {
        type: 'Identifier',
        name: 'bar',
        range: [9, 12],
        loc: {
          start: { line: 1, column: 9 },
          end: { line: 1, column: 12 }
        }
      },
      params: [],
      body: {
        type: 'BlockStatement',
        body: [],
        range: [27, 29],
        loc: {
          start: { line: 1, column: 27 },
          end: { line: 1, column: 29 }
        }
      },
      generator: false,
      expression: false,
      typeParameters: {
        type: 'TypeParameterDeclaration',
        params: [{
          type: 'Identifier',
          name: 'T',
          typeAnnotation: {
            type: 'TypeAnnotation',
            typeAnnotation: {
              type: 'NullableTypeAnnotation',
              typeAnnotation: {
                type: 'NumberTypeAnnotation',
                range: [17, 23],
                loc: {
                  start: { line: 1, column: 17 },
                  end: { line: 1, column: 23 }
                }
              },
              range: [16, 23],
              loc: {
                start: { line: 1, column: 16 },
                end: { line: 1, column: 23 }
              }
            },
            range: [14, 23],
            loc: {
              start: { line: 1, column: 14 },
              end: { line: 1, column: 23 }
            }
          },
          range: [13, 23],
          loc: {
            start: { line: 1, column: 13 },
            end: { line: 1, column: 23 }
          }
        }],
        range: [12, 24],
        loc: {
          start: { line: 1, column: 12 },
          end: { line: 1, column: 24 }
        }
      },
      range: [0, 29],
      loc: {
        start: { line: 1, column: 0 },
        end: { line: 1, column: 29 }
      }
    },
  },
};

if (typeof exports !== "undefined") {
  var test = require("./driver.js").test;
}

for (var ns in fbTestFixture) {
  ns = fbTestFixture[ns];
  for (var code in ns) {
    test(code, {
      type: "Program",
      body: [ns[code]]
    }, {
      ecmaVersion: 7,
      sourceType: "module",
      plugins: { jsx: true, flow: true },
      features: { "es7.asyncFunctions": true },
      locations: true,
      ranges: true
    });
  }
}
