OptionalParametersParser.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.Globalization;
  3. using System.Linq;
  4. using Clang.Ast;
  5. using ICSharpCode.NRefactory.CSharp;
  6. namespace SharpieBinder
  7. {
  8. public static class OptionalParametersParser
  9. {
  10. static readonly string[] MethodsToIgnore = {
  11. "SetTriangleMesh",
  12. "SetLayout",
  13. "DefineSprite",
  14. "SetConvexHull",
  15. "SetGImpactMesh"
  16. };
  17. public static Expression Parse(ParmVarDecl param, CSharpParser parser)
  18. {
  19. string dump = param.DumpToString();
  20. var lines = dump.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
  21. if (lines.Length < 2 || MethodsToIgnore.Contains(((CXXMethodDecl)param.DeclContext).Name))
  22. return null;
  23. var defaultValueLine = lines.Last().TrimStart(' ', '-', '\t', '`');
  24. var words = defaultValueLine.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
  25. var expressionType = words[0];
  26. string defaultValue;
  27. Expression expression = null;
  28. if (expressionType.Contains("Literal")) //e.g. CXXBoolLiteralExpr, IntegerLiteral, etc
  29. {
  30. defaultValue = words.Last();
  31. if (expressionType.StartsWith("Floating")) //numbers come in a format like '1.000000e-01'
  32. defaultValue = float.Parse(defaultValue, CultureInfo.InvariantCulture).ToString() + "f";
  33. if (defaultValue == "0" && dump.Contains("NullToPointer"))
  34. defaultValue = "null";
  35. if (defaultValue == "0f" && dump.Contains("Urho3D::Color"))
  36. defaultValue = "default(Urho.Color)";
  37. if (defaultValue == "'nullptr_t'")
  38. defaultValue = "null";
  39. expression = parser.ParseExpression(defaultValue);
  40. }
  41. else if (expressionType == "DeclRefExpr")
  42. {
  43. var items = defaultValueLine
  44. .Split(new[] { "'" }, StringSplitOptions.RemoveEmptyEntries)
  45. .Where(i => !string.IsNullOrWhiteSpace(i))
  46. .ToArray();
  47. defaultValue = $"{items[items.Length - 2]}";
  48. var type = items.Last();
  49. var clearType = type.DropConst().DropClassOrStructPrefix().DropUrhoNamespace();
  50. bool isEnum = type.Contains("enum ");
  51. expression = parser.ParseExpression(RemapValue(clearType, isEnum, defaultValue));
  52. }
  53. return expression;
  54. }
  55. static string RemapValue(string type, bool isEnum, string value)
  56. {
  57. if (value == "M_MAX_UNSIGNED") return "uint.MaxValue";
  58. if (value == "M_MIN_UNSIGNED") return "0";
  59. if (type == "String" && value == "EMPTY") return "\"\"";
  60. if (!isEnum)
  61. return "";
  62. return type + "." + StringUtil.RemapEnumName(type, value);
  63. }
  64. }
  65. }