1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-05-16 12:34:04 +02:00
IntelliJ-IdeaVim/src/com/maddyhome/idea/vim/vimscript/model/expressions/FunctionCallExpression.kt
2021-10-08 00:02:36 +03:00

34 lines
1.7 KiB
Kotlin

package com.maddyhome.idea.vim.vimscript.model.expressions
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.ex.ExException
import com.maddyhome.idea.vim.vimscript.model.Executable
import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType
import com.maddyhome.idea.vim.vimscript.model.datatypes.VimFuncref
import com.maddyhome.idea.vim.vimscript.model.functions.DefinedFunctionHandler
import com.maddyhome.idea.vim.vimscript.model.statements.FunctionFlag
import com.maddyhome.idea.vim.vimscript.services.FunctionStorage
import com.maddyhome.idea.vim.vimscript.services.VariableService
data class FunctionCallExpression(val scope: Scope?, val functionName: String, val arguments: MutableList<Expression>) :
Expression() {
override fun evaluate(editor: Editor, context: DataContext, parent: Executable): VimDataType {
val handler = FunctionStorage.getFunctionHandlerOrNull(scope, functionName, parent)
if (handler != null) {
if (handler is DefinedFunctionHandler && handler.function.flags.contains(FunctionFlag.DICT)) {
throw ExException("E725: Calling dict function without Dictionary: ${(if (scope != null) scope.c + ":" else "") + functionName}")
}
return handler.executeFunction(this.arguments, editor, context, parent)
}
val funcref = VariableService.getNullableVariableValue(Variable(scope, functionName), editor, context, parent)
if (funcref is VimFuncref) {
val name = (if (scope != null) scope.c + ":" else "") + functionName
return funcref.execute(name, arguments, editor, context, parent)
}
throw ExException("E117: Unknown function: ${if (scope != null) scope.c + ":" else ""}$functionName")
}
}