getParameterType()

in lib/semantic.js [1481:1579]


  getParameterType(type, moduleName) {

    if (type.tag === Tag.TYPE && type.lexeme === 'object') {
      return {
        type: 'map',
        keyType: _basic('string'),
        valueType: _basic('any')
      };
    } else if (type.type === 'map') {
      return {
        type: 'map',
        keyType: _basic('string'),
        valueType: this.getParameterType(type.valueType, moduleName)
      };
    } else if (type.type === 'iterator' || type.type === 'asyncIterator') {
      return {
        type: type.type,
        valueType: this.getParameterType(type.valueType, moduleName)
      };
    } else if (type.tag === Tag.TYPE) {
      return _basic(type.lexeme);
    } else if (type.tag === Tag.ID && builtin.has(type.lexeme)) {
      const ast = builtin.get(type.lexeme);
      if(ast.type === 'model') {
        return _model(type.lexeme);
      }
      return {
        type: 'module_instance',
        name: type.lexeme
      };
      
    } else if (type.tag === Tag.ID && type.lexeme.startsWith('$')) {
      return _model(type.lexeme);
    } else if (type.tag === Tag.ID && type.idType === 'model') {
      const checker = moduleName ? this.dependencies.get(moduleName) : this;
      return checker.getModel(type.lexeme, moduleName);
    } else if (type.tag === Tag.ID && this.dependencies.has(type.lexeme)) {
      return {
        type: 'module_instance',
        name: type.lexeme
      };
    } else if (type.tag === Tag.ID && type.idType === 'typedef') {
      return _typedef(type.lexeme, moduleName);
    } else if (type.tag === Tag.ID) {
      return this.getModel(type.lexeme);
    } else if (
      type.type === 'moduleModel' ||
      type.type === 'subModel' || 
      type.type === 'subModel_or_moduleModel') {
      if (moduleName && type.type === 'subModel') {
        const checker = this.dependencies.get(moduleName);
        return checker.getModel(type.path.map((item) => {
          return item.lexeme;
        }).join('.'), moduleName);
      }
      const [mainId, ...rest] = type.path;
      const idType = this.getIdType(mainId.lexeme);
      if (idType === 'module') {
        const checker = this.dependencies.get(mainId.lexeme);
        const typeName = rest.map((item) => {
          return item.lexeme;
        }).join('.');
        if (checker.models.has(typeName)) {
          return checker.getModel(rest.map((item) => {
            return item.lexeme;
          }).join('.'), mainId.lexeme);
        } else if (checker.enums.has(typeName)) {
          return _enum(rest.map((item) => {
            return item.lexeme;
          }).join('.'), mainId.lexeme);
        } else if (checker.typedefs.has(typeName)) {
          return _typedef(rest.map((item) => {
            return item.lexeme;
          }).join('.'), mainId.lexeme);
        }
        
      }

      if (idType === 'model') {
        return this.getModel(type.path.map((item) => {
          return item.lexeme;
        }).join('.'));
      }
      
    } else if (type.type === 'moduleTypedef') {
      const [mainId, ...rest] = type.path;
      return _typedef(rest.map((item) => {
        return item.lexeme;
      }).join('.'), mainId.lexeme);
    } else if (type.type === 'array') {
      return {
        type: 'array',
        itemType: this.getParameterType(type.subType, moduleName)
      };
    }

    console.log(type);
    throw new Error('un-implemented');
  }