visitAssign()

in lib/generator.js [1858:1931]


  visitAssign(ast, level, env) {
    let leftName;
    leftName = ast.left.id && _name(ast.left.id);
    if (leftName === '__response') {
      leftName = RESPONSE;
    } else if (leftName === '__request') {
      leftName = REQUEST;
    } else {
      leftName = _avoidReserveName(leftName);
    }
    if (ast.left.type === 'id') {
      this.emit(`${leftName}`, level);
    } else if (ast.left.type === 'property_assign' || ast.left.type === 'property') {
      this.emit(`${leftName}`, level);
      let isMapNext = ast.left.id.inferred && ast.left.id.inferred.type === 'map';
      for (let i = 0; i < ast.left.propertyPath.length; i++) {
        if (!isMapNext) {
          this.emit(`.${_upperFirst(_name(ast.left.propertyPath[i]))}`);
        } else {
          this.emit(`["${_name(ast.left.propertyPath[i])}"]`);
        }
        isMapNext = ast.left.propertyPathTypes[i].type === 'map';
      }
    } else if (ast.left.type === 'virtualVariable') { // vid
      this.emit(`this._${_lowerFirst(_name(ast.left.vid).substr(1))}`, level);
    } else if (ast.left.type === 'variable') {
      this.emit(`${leftName}`, level);
    } else if (ast.left.type === 'array_access') {
      this.visitArrayAccess(ast.left, level, env, true);
    } else if (ast.left.type === 'map_access') {
      let expr;
      if (ast.left.id.tag === DSL.Tag.Tag.VID) {
        expr = `this.${_vid(ast.left.id)}`;
      } else {
        expr = `${_name(ast.left.id)}`;
      }
      if (ast.left.propertyPath && ast.left.propertyPath.length) {
        var current = ast.left.id.inferred;
        for (let i = 0; i < ast.left.propertyPath.length; i++) {
          var name = _name(ast.left.propertyPath[i]);
          if (current.type === 'model') {
            expr += `.${_upperFirst(name)}`;
          } else {
            expr += `["${name}"]`;
          }
          current = ast.left.propertyPathTypes[i];
        }
      }
      this.emit(`${expr}[`, level);
      this.visitExpr(ast.left.accessKey, level);
      this.emit(`]`);
    } else {
      throw new Error('unimpelemented');
    }

    this.emit(' = ');
    if (ast.expr.needToReadable) {
      this.emit('StreamUtils.BytesReadable(');
      this.used.push('Darabonba.Utils');
    }
    if (ast.expr.type === 'object') {
      // paser give error inferred
      let expr = ast.expr;
      expr.inferred = ast.left.inferred;
      this.visitExpr(expr, level, env);
    } else {
      this.visitExpr(ast.expr, level, env);
    }

    if (ast.expr.needToReadable) {
      this.emit(')');
    }
    this.emit(';\n');
  }