Может ли ScriptEngineManager дать мне имя функции Javascript, которую он только что скомпилировал в Java

Как мне узнать имя функции JavaScript, проанализированной в Java? Я разрешаю пользователю ввести функцию Javascript (в JTextArea), затем я использую ScriptEngineManager, чтобы подтвердить, что это допустимый синтаксис следующим образом:

public final boolean isFunctionValid(String function)
{
    try
    {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        Object result = engine.eval(function);
    }
    catch(ScriptException se)
    {
        return false;
    }
    return true;
}

Работает нормально, но я также хочу знать имя функции, чтобы я мог назначить функции имя, соответствующее имени функции. Я бы предпочел, чтобы ScriptEngineManager сделал это для меня, а не для того, чтобы я пытался разобраться, анализируя функцию переменной со всеми присущими этому подходу рисками.

РЕДАКТИРОВАТЬ Поскольку кажется, что нет способа сделать это правильно, я создал две проверки, используя регулярные выражения, которые работают для меня.

    protected static Pattern functionNameMatch;
    protected static Pattern multipleFunctionsMatch;
    static
    {
        functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*)[ ]*\\(");
        multipleFunctionsMatch = Pattern.compile("function[ ]+");
    }


    protected boolean isOneFunction()
    {
        Matcher m = multipleFunctionsMatch.matcher(function.getText());
        if(m.find())
        {
            if(m.find())
            {
                return false;
            }
            return true;
        }
        return false;
    }

    protected String deriveNameFromFunction()
    {
        Matcher m = functionNameMatch.matcher(function.getText());
        if(m.find())
        {
            return m.group(1);
        }
        return "";
    }

1 ответ

Решение

Так как это было невозможно в JavaScript, я делаю некоторые дополнительные проверки, используя сопоставление с шаблоном

protected static Pattern functionNameMatch;
protected static Pattern multipleFunctionsMatch;
static
{
    //TODO this method only works if all parameters are put on first line of function, otherwise declares function
    //is invalid
    functionNameMatch = Pattern.compile("function[ ]+([a-zA-Z0-9]*[ ]*\\(.*\\))");
    multipleFunctionsMatch = Pattern.compile("function[ ]+");
}

protected boolean isOneFunction()
{
    Matcher m = multipleFunctionsMatch.matcher(function.getText());
    if(m.find())
    {
        if(m.find())
        {
            return false;
        }
        return true;
    }
    return false;
}

protected String deriveNameFromFunction()
{
    Matcher m = functionNameMatch.matcher(function.getText());
    if(m.find())
    {
        return m.group(1);
    }
    return "";
}
Другие вопросы по тегам