in vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/CountFunctionHandler.kt [24:74]
override fun doFunction(
arguments: Arguments,
editor: VimEditor,
context: ExecutionContext,
vimContext: VimLContext,
): VimInt {
val comp = arguments[0]
val expr = arguments[1]
val ic = arguments.getNumberOrNull(2)?.booleanValue ?: false
val start = arguments.getNumberOrNull(3)?.value ?: 0
return when (comp) {
is VimString -> {
// Count non-overlapping occurrences in string
val text = comp.value
val pattern = expr.toVimString().value
if (pattern.isEmpty()) {
return VimInt(0)
}
var count = 0
var index = 0
while (index <= text.length - pattern.length) {
val substring = text.substring(index, index + pattern.length)
val matches = if (ic) {
substring.equals(pattern, ignoreCase = true)
} else {
substring == pattern
}
if (matches) {
count++
index += pattern.length // Non-overlapping
} else {
index++
}
}
VimInt(count)
}
is VimList -> {
val items = if (start > 0 && start < comp.values.size) {
comp.values.subList(start, comp.values.size)
} else {
comp.values
}
items.count { item -> item.valueEquals(expr, ic) }.asVimInt()
}
is VimDictionary -> comp.dictionary.values.count { item -> item.valueEquals(expr, ic) }.asVimInt()
else -> VimInt.ZERO
}
}