visitModule()

in lib/generator.js [310:413]


  visitModule(ast, level) {
    assert.equal(ast.type, 'module');

    const nonStaticWraps = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'function' && !item.isStatic;
    });
    const apis = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'api';
    });
    const models = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'model';
    });
    const types = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'type';
    });
    const init = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'init';
    });
    this.comments = ast.comments;
    var extendParam = {};
    if (nonStaticWraps.length > 0 || apis.length > 0) {
      extendParam.writeConstruct = true;
    }
    if (models.length > 0) {
      extendParam.writeImport = true;
    }
    this.predefined = ast.predefined;

    this.eachImport(ast.imports, ast.usedExternModel, level);
    this.visitPom();
    if (this.implements) {
      this.visitInterface(nonStaticWraps, apis, level);
    }
    // global definition
    for (let i = 0; i < models.length; i++) {
      const modelName = models[i].modelName.lexeme;

      this.modelBefore(level, modelName);

      this.eachModel(models[i], level);
      if (ast.models) {
        const subModels = Object.keys(ast.models).filter((key) => {
          return key.startsWith(modelName + '.');
        }).map((key) => {
          return ast.models[key];
        });
        for (let i = 0; i < subModels.length; i++) {
          this.eachSubModel(subModels[i], level + 1);
        }
      }
      this.emit('}\n', level);
      this.save('models/' + modelName + '.java');
    }

    // models definition
    var extendsClass;
    if (ast.extends) {
      var extendsName = _name(ast.extends);
      extendsClass = {};
      extendsClass.className = this.imports[extendsName].className || 'Client';
      extendsClass.package = this.imports[extendsName].package;
    }
    this.apiBefore(extendParam, extendsClass, apis.length > 0, level);

    // creat class field
    for (let i = 0; i < types.length; i++) {
      this.emit('\n');
      this.eachType(types[i], level + 1);
    }

    // creat contructor
    for (let i = 0; i < init.length; i++) {
      this.emit('\n');
      this.eachInit(init[i], level + 1);
    }

    for (let i = 0; i < apis.length; i++) {
      if (i !== 0) {
        this.emit('\n');
      }

      this.eachAPI(apis[i], level + 1);
    }

    this.apiAfter(apis.length > 0, level + 1);

    this.wrapBefore(level);
    const functions = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'function';
    });


    for (let i = 0; i < functions.length; i++) {
      if (i !== 0) {
        this.emit('\n');
      }

      this.eachFunction(functions[i], level + 1);
    }

    this.emit('}\n');
    let outPutclassName = this.className || 'Client';
    this.save(outPutclassName + '.java');
  }