visit()

in lib/generator.js [49:117]


  visit(ast, level = 0) {
    assert.equal(ast.type, 'module');
    this.comments = ast.comments;
    this.usedExternModel = ast.usedExternModel;
    this.conflictModels = ast.conflictModels;
    this.eachImport(ast.imports);
    this.visitPom();
    if (ast.extends) {
      const extendsName = _name(ast.extends);
      this.extendsPackage = this.imports[extendsName].package;
    }

    const models = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'model';
    });

    const enums = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'enum';
    });

    this.enumMap = {};

    for (let i = 0; i < enums.length; i++) {
      const enumName = enums[i].enumName.lexeme;
      const enumType = _type(enums[i].enumType.lexeme);
      this.enumMap[enumName] = enumType;
      // enum generator
      const enum_generator = new EnumGenerator(enums[i], this);
      enum_generator.codegen();
      save(path.join(this.outputDir, 'models', `${enumName}.java`), enum_generator.output);
    }

    // const baseModel = new ModelGenerator(ast, this);
    // baseModel.codegenRequest();
    // save(path.join(this.outputDir, 'models', 'Request.java'), baseModel.output);
    // baseModel.output = '';
    // baseModel.codegenResponse();
    // save(path.join(this.outputDir, 'models', 'Response.java'), baseModel.output);
    // global definition
    let model;
    for (let i = 0; i < models.length; i++) {
      const modelName = models[i].modelName.lexeme;
      this.subModels = [];
      if (ast.models) {
        this.subModels = Object.keys(ast.models).filter((key) => {
          return key.startsWith(modelName + '.');
        }).map((key) => {
          return ast.models[key];
        });
      }
      // model generator
      model = new ModelGenerator(models[i], this);
      model.codegen();
      save(path.join(this.outputDir, 'models', `${modelName}.java`), model.output);
    }

    // client generator
    this.iterators = [];
    const client = new ClientGenerator(ast, this);
    client.codegen();
    save(path.join(this.outputDir, `${this.className}.java`), client.output);
    
    let iterator;
    for (let i = 0; i < this.iterators.length; i++) {
      iterator = new IteratorGenerator(this.iterators[i], this);
      iterator.codegen();
      save(path.join(this.outputDir, 'models', `${_name(this.iterators[i].iteratorType)}Iterator.java`), iterator.output);
    }
  }