constructor(reporter, options, metadata) {
    super(reporter, options.validate);
    let idGenerator = new UniqueIdentifierGenerator();

    let append = (transformer) => {
      this.append((tree) => {
        return new transformer(idGenerator, reporter, options, metadata).
            transformAny(tree);
      });
    };

    // Issue errors for any unbound variables
    if (options.freeVariableChecker) {
      this.append((tree) => {
        validateFreeVariables(tree, reporter);
        return tree;
      });
    }

    if (options.jsx) {
      append(JsxTransformer);
    }

    if (options.spreadProperties) {
      append(SpreadPropertiesTransformer);
    }

    if (options.memberVariables) {
      append(MemberVariableTransformer);
    }
    append(AnnotationsTransformer);
    append(TypeTransformer);
    append(AsyncToGeneratorTransformer);

    if (options.modules === 'inline') {
      append(InlineES6ModuleTransformer);
    }
  }
@param {ErrorReporter} reporter
@param {Options} options
@param {Object} metadata Implementation defined loader data.