JS синтаксис распространения в Android с использованием Kotlin и Duktape - PullRequest
0 голосов
/ 07 апреля 2020

Я использую Duktape для запуска JS кода в моем приложении Android. Я пытаюсь реализовать функцию журнала в JS, которая получает несколько аргументов varargs. При выполнении кода я получаю исключение:

Метод вызвал исключение com.squareup.duktape.DuktapeException. Ошибка синтаксиса: ожидаемый идентификатор (строка 3)

Поддерживает ли Duktape Распространение синтаксиса ? Поддерживаются ли опции Kotlin в целом?

//JS code
"""
    var Console = {
        log : function(...args) {
            __consoleImpl.log(args);
                    }
            };
"""

//Kotlin interface
interface Console {

    fun log(arg1:String? = null, arg2:String? = null, arg3:String? = null, arg4:String? = null,
            arg5:String? = null, arg6:String? = null, arg7:String? = null, arg8:String? = null,
            arg9:String? = null, arg10:String? = null)
}


//Interface impl
class ConsoleImpl() : Console {

    override fun log(arg1: String?, arg2: String?, arg3: String?, arg4: String?, arg5: String?, arg6: String?, arg7: String?, arg8: String?, arg9: String?, arg10: String?) {
    val values = listOfNotNull(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10).map {it.toString()}.filter { it != "undefined" }
    Log.d("ConsoleImpl", values.joinToString())
    }
}

//in setup
duktape.set("__consoleImpl", Console::class.java, ConsoleImpl())
duktape.evaluate("Console.log("message")) //exception thrown here

1 Ответ

1 голос
/ 08 апреля 2020

duktape полностью поддерживает только ES5, а также несколько функций из ES6 и ES7 ( см. Описание функций ES5 ). Синтаксис распространения является функцией ES6.

...