private static string ParseArithmeticNodes(string value, JavascriptContainer container) { if (KirinArithmetic.IsArithmetic(value, out var tree)) { return(ParseArithmeticNodes(tree, container)); } return(SanitizeValue(value, container)); }
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)); }