func (e *SplitExp) IsEmpty() bool {
	switch exp := e.Value.(type) {
	case *ArrayExp:
		if len(exp.Value) == 0 {
			return true
		}
	case *MapExp:
		if len(exp.Value) == 0 {
			return true
		}
	case *NullExp:
		return true
	case *SplitExp:
		if exp.IsEmpty() {
			return true
		}
	case *MergeExp:
		if exp.IsEmpty() {
			return true
		}
	}
	return e.Source.KnownLength() &&
		len(e.Source.Keys()) == 0 &&
		e.Source.ArrayLength() <= 0
}
IsEmpty returns true if the split expression is over an empty array or map.
package syntax
import (
	"strconv"
)
type SplitExp struct {
	valExp
	Value Exp
	Type Type
	Call *CallStm
	Source MapCallSource
}
func (s *SplitExp) getKind() ExpKind { return KindSplit }
func (s *SplitExp) val() interface{} { return s.Value }
func (s *SplitExp) getSubnodes() []AstNodable {
	return []AstNodable{s.Value}
}
func (e *SplitExp) HasRef() bool {
	if e == nil || e.Value == nil {
		return false
	}
	return e.Value.HasRef()
}
func (e *SplitExp) HasSplit() bool {
	return true
}
func (e *SplitExp) GetCall() *CallStm {
	return e.Call
}
func (e *SplitExp) innerValue() Exp {
	return e.Value
}
func (e *SplitExp) mapSource() MapCallSource {
	return e.Source
}
func (e *SplitExp) setSource(src MapCallSource) {
	e.Source = src
}