All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.runner.core.ParseInvoker Maven / Gradle / Ivy

package com.moon.runner.core;

import com.moon.core.lang.ref.IntAccessor;
import com.moon.core.lang.reflect.FieldUtil;
import com.moon.runner.RunnerSetting;

import java.lang.reflect.Field;

import static com.moon.core.lang.ThrowUtil.noInstanceError;
import static com.moon.core.lang.reflect.FieldUtil.getAccessibleField;
import static com.moon.runner.core.Constants.YUAN_L;
import static com.moon.runner.core.Constants.YUAN_R;
import static com.moon.runner.core.ParseUtil.nextVal;
import static java.util.Objects.requireNonNull;

/**
 * @author moonsky
 */
final class ParseInvoker {

    private ParseInvoker() { noInstanceError(); }

    final static AsRunner tryParseInvoker(
        char[] chars, IntAccessor indexer, int len, RunnerSetting settings, String methodName, AsValuer prevValuer
    ) {
        final AsRunner runner;
        final int cache = indexer.get();
        final boolean isStatic = prevValuer instanceof DataClass;
        if (nextVal(chars, indexer, len) == YUAN_L) {
            if (nextVal(chars, indexer, len) == YUAN_R) {
                // 无参方法调用
                runner = InvokeArgs0.parse(prevValuer, methodName, isStatic);
            } else {
                // 带有参数的方法调用
                runner = parseHasParams(chars, indexer.decrement(), len, settings, prevValuer, methodName, isStatic);
            }
        } else {
            // 静态字段检测
            indexer.set(cache);
            runner = tryParseStaticField(prevValuer, methodName, isStatic);
        }
        return (runner instanceof AsInvoker) ? ((AsInvoker) runner).tryToConst() : runner;
    }

    /**
     * 带有参数的方法调用
     */
    private final static AsRunner parseHasParams(
        char[] chars,
        IntAccessor indexer,
        int len,
        RunnerSetting settings,
        AsValuer prev,
        String name,
        boolean isStatic
    ) {
        AsRunner[] params = ParseParams.parse(chars, indexer, len, settings);
        switch (params.length) {
            case 0:
                return InvokeArgs0.parse(prev, name, isStatic);
            case 1:
                return InvokeArgs1.parse(prev, name, isStatic, params[0]);
            case 2:
                return InvokeArgs2.parse(prev, name, isStatic, params[0], params[1]);
            case 3:
                return InvokeArgs3.parse(prev, name, isStatic, params[0], params[1], params[2]);
            default:
                return InvokeArgsN.parse(prev, name, isStatic, params);
        }
    }

    /**
     * 尝试解析静态字段,如果不是静态字段调用返回 null
     */
    private final static AsValuer tryParseStaticField(
        AsValuer prevValuer, String name, boolean isStatic
    ) {
        if (isStatic) {
            // 静态字段
            Class sourceType = ((DataClass) prevValuer).getValue();
            Field field = requireNonNull(getAccessibleField(sourceType, name));
            return DataConst.get(FieldUtil.getValue(field, sourceType));
        }
        return null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy