getExtendFileds()

in lib/semantic.js [3345:3392]


  getExtendFileds(extendOn, isException, keys) {
    keys = keys || new Map();
    if(!extendOn && !isException) {
      return [];
    }
    let extendModel, moduleName;
    let checker = this;
    
    if(!extendOn && isException) {
      extendModel = builtin.get('$Error');
      isException = false;
    } else if (extendOn.type === 'moduleModel') {
      const [ main, ...path ] = extendOn.path;
      moduleName = main.lexeme;
      checker = this.dependencies.get(moduleName);
      const typeName = path.map((item) => {
        return item.lexeme;
      }).join('.');
      extendModel = checker.models.get(typeName);
    } else if (extendOn.type === 'subModel') {
      let modelName = extendOn.path.map((tag) => {
        return tag.lexeme;
      }).join('.');
      extendModel = this.models.get(modelName);
    } else if (extendOn.idType === 'builtin_model') {
      extendModel = builtin.get(extendOn.lexeme);
    } else {
      extendModel = this.models.get(extendOn.lexeme);
    }
    if(!extendModel) {
      return [];
    }

    let extendFileds = extendModel.modelBody.nodes.filter(node => {
      const fieldName = node.fieldName.lexeme;
      if(keys.has(fieldName)) {
        return false;
      }
      keys.set(fieldName, true);
      // non 
      // node.tokenRange = [];
      return true;
    });
    if(extendModel.extendOn) {
      return extendFileds.concat(this.getExtendFileds(extendModel.extendOn, isException, keys));
    }
    return extendFileds;
  }