getFieldType()

in lib/semantic.js [1802:1923]


  getFieldType(find, modelName, moduleName) {
    if (find.fieldValue.fieldType === 'map') {
      if (find.fieldValue.valueType.idType === 'model') {
        return {
          type: 'map',
          keyType: _basic(find.fieldValue.keyType.lexeme),
          valueType: _model(find.fieldValue.valueType.lexeme, moduleName)
        };
      }
      if (find.fieldValue.valueType.type === 'array') {
        return {
          type: 'map',
          keyType: _basic(find.fieldValue.keyType.lexeme),
          valueType: this.getType(find.fieldValue.valueType, moduleName)
        };
      }
      if (find.fieldValue.valueType.type === 'moduleModel') {
        const [mainId, ...rest] = find.fieldValue.valueType.path;
        let filedName = rest.map((tag) => {
          return tag.lexeme;
        }).join('.');
        return {
          type: 'map',
          keyType: _basic(find.fieldValue.keyType.lexeme),
          valueType: this.getModel(filedName, mainId.lexeme)
        };
      }
      return {
        type: 'map',
        keyType: _basic(find.fieldValue.keyType.lexeme),
        valueType: _basic(find.fieldValue.valueType.lexeme)
      };
    }

    if (find.fieldValue.fieldType === 'entry') {
      if (find.fieldValue.valueType.idType === 'model') {
        return {
          type: 'entry',
          valueType: this.getModel(find.fieldValue.valueType.lexeme, moduleName)
        };
      }
      if (find.fieldValue.valueType.type === 'array') {
        return {
          type: 'entry',
          valueType: this.getType(find.fieldValue.valueType, moduleName)
        };
      }
      return {
        type: 'entry',
        valueType: _basic(find.fieldValue.valueType.lexeme)
      };
    }

    if (find.fieldValue.type === 'modelBody') {
      return this.getModel([modelName, find.fieldName.lexeme].join('.'), moduleName);
    }

    if (find.fieldValue.fieldType === 'array') {
      return this.getArrayFiledType(find.fieldValue, find.fieldValue.itemType, moduleName);
    }
    
    if (find.fieldValue.fieldType.tag === Tag.ID) {
      const id = find.fieldValue.fieldType.lexeme;
      if (this.models.has(id)) {
        return this.getModel(id, moduleName);
      }

      if (this.dependencies.has(id)) {
        return {
          type: 'module_instance',
          name: id
        };
      }

      if (this.enums.has(id)) {
        return _enum(id, moduleName);
      }

      if (this.typedefs.has(id)) {
        return _typedef(id, moduleName);
      }

      if(builtin.has(id)) {
        return this.getModel(find.fieldValue.fieldType.lexeme);
      }

      return this.getModel(find.fieldValue.fieldType.lexeme, moduleName);
    }

    if (find.fieldValue.fieldType.type === 'moduleModel') {
      const [mainId, ...rest] = find.fieldValue.fieldType.path;
      let filedName = rest.map((tag) => {
        return tag.lexeme;
      }).join('.');
      return this.getModel(filedName, mainId.lexeme);
    }

    if (find.fieldValue.fieldType.type === 'moduleEnum') {
      const [mainId, ...rest] = find.fieldValue.fieldType.path;
      let filedName = rest.map((tag) => {
        return tag.lexeme;
      }).join('.');
      return _enum(filedName, mainId.lexeme);
    }

    if (find.fieldValue.fieldType.type === 'moduleTypedef') {
      const [mainId, ...rest] = find.fieldValue.fieldType.path;
      let filedName = rest.map((tag) => {
        return tag.lexeme;
      }).join('.');
      return _typedef(filedName, mainId.lexeme);
    }

    if (find.fieldValue.fieldType.type === 'subModel') {
      let modelName = find.fieldValue.fieldType.path.map((tag) => {
        return tag.lexeme;
      }).join('.');
      return this.getModel(modelName);
    }

    return _basic(find.fieldValue.fieldType);
  }