Exemplo n.º 1
0
 private static string ParseConditionalNodes(string value, JavascriptContainer container)
 {
     if (KirinConditional.IsConditional(value, out var tree))
     {
         return(ParseConditionalNodes(tree, container));
     }
     return(SanitizeValue(value, container));
 }
Exemplo n.º 2
0
        private static string SanitizeValue(string value, JavascriptContainer container, KirinVariableType?expectedType = null)
        {
            var eType = FiMHelper.DeclarationType.Determine(" " + value, out string eKeyword, strict: false);

            if (eType != KirinVariableType.UNKNOWN)
            {
                value        = value.Substring(eKeyword.Length);
                expectedType = eType;
            }

            // Nothing
            if ((value == null || value == "nothing") && expectedType != null)
            {
                return(DefaultValue((KirinVariableType)expectedType));
            }

            if (KirinLiteral.TryParse(value, out object val))
            {
                if (val.GetType() == typeof(bool))
                {
                    return((bool)val == true ? "true" : "false");
                }
                return(value);
            }

            // Calling an existing method
            if (container.report.GetParagraphLazy(value) != null)
            {
                string args  = "";
                string pName = value;

                if (pName.Contains(KirinFunctionCall.FunctionParam))
                {
                    int pIndex = pName.IndexOf(KirinFunctionCall.FunctionParam);
                    pName = pName.Substring(0, pIndex);
                    args  = string.Join(", ",
                                        value
                                        .Substring(pName.Length + KirinFunctionCall.FunctionParam.Length)
                                        .Split(new string[] { " and " }, StringSplitOptions.None)
                                        .Select(v => SanitizeValue(v, container))
                                        );
                }

                if (container.internalFunctions.ContainsKey(pName))
                {
                    return($"{ container.internalFunctions[pName] }({ args })");
                }
                return($"this.{ SanitizeName(pName, container) }({ args })");
            }

            // Array
            if (expectedType != null && FiMHelper.IsTypeArray((KirinVariableType)expectedType))
            {
                string args = string.Join(", ",
                                          value
                                          .Split(new string[] { " and " }, StringSplitOptions.None)
                                          .Select(v => SanitizeValue(v, container))
                                          );

                return($"[, { args }]");
            }

            // Array index
            if (IsArrayIndex(value))
            {
                var match = GetArrayIndex(value);

                var index    = SanitizeValue(match.RawIndex, container);
                var variable = SanitizeValue(match.RawVariable, container);

                return($"{ variable }[ fim_index({ variable }, {index}) ]");
            }

            // Arithmetic
            if (KirinArithmetic.IsArithmetic(value, out var arithmeticResult))
            {
                return(ParseArithmeticNodes(arithmeticResult, container));
            }

            // Conditional
            if (KirinConditional.IsConditional(value, out var conditionalResult))
            {
                return(ParseConditionalNodes(conditionalResult, container));
            }

            // Calling an existing variable (hopefully)
            return(SanitizeName(value, container));
        }