genProps(ast) {
    let code = []
    if (filterDirective(ast).length) {
      const directives = this.genDirectives(ast)
      if (directives) {
        code.push(directives)
      }
      const directiveTag = this.genDirectiveTag(ast)
      if (directiveTag) {
        code.push(directiveTag)
      }
      const directiveContext = this.genDirectiveContext(ast)
      if (directiveContext) {
        code.push(directiveContext)
      }
    }
    if (ast.slotTarget !== undefined) {
      this.genSlotTarget(ast)
    }
    if (ast.ref || ast.parent === undefined) {
      const ref = this.genRef(ast)
      if (ref) {
        code.push(ref)
      }
    }
    if (ast.key !== undefined) {
      const key = this.genKey(ast)
      if (key) {
        code.push(key)
      }
    }
    if (Array.isArray(ast.attrsList)) {
      ast.attrsList.forEach(v => {
        if (v.name === 'v-bind' && /^\{.*\}$/.test(v.value)) {
          try {
            const matchVArr = v.value.match(/^\{(.*)\}$/)
            if (matchVArr && matchVArr[1]) {
              matchVArr[1].split(',').forEach(_v => {
                const _vArr = _v.split(':')
                if (_vArr.length === 2) {
                  ast.attrs.push({
                    name: _vArr[0].trim().replace(/'|"/g, ''),
                    value: _vArr[1].trim(),
                  })
                }
              })
            }
          } catch (e) {
            console.log('parse error for v-bind obj')
          }
        }
      })
    }
    if (Array.isArray(ast.attrs)) {
      const props = ast.attrs
        .filter(v => {
          return v.name !== 'class' && v.name !== 'style' && v.name !== 'v-pre'
        })
        .map(v => {
          let value = v.value
          let name = v.name
          if (
            name.indexOf('data-') === 0 ||
            name.indexOf(HELPER_HEADER) === 0
          ) {
            return `'${name}': ${value}`
          }
          if (name === 'for') {
            name = 'htmlFor'
          }
          if (isBooleanAttr(name)) {
            if (value === '""') {
              value = 'true'
            }
          }
          if (!isReservedTag(ast.tag)) {
            name = camelize(name)
          } else if (propertyMap[name]) {
            name = propertyMap[name]
          }
          return `'${name}': ${value}`
        })
      code = code.concat(props)
    }
    return code
  }
gen props, this funciton would be override by sub class
@param {Object} ast