)]}'
{
  "commit": "6e7b3a4f16c92d4e763293e132b75dceb705ad64",
  "tree": "a428186159556df0e006b6258059420ccd26b83a",
  "parents": [
    "7374de3285b323845eb01d6b0f1aeb2b137d4023"
  ],
  "author": {
    "name": "Brian Cairns",
    "email": "bcairns@google.com",
    "time": "Wed Jun 12 16:01:57 2024 +0000"
  },
  "committer": {
    "name": "Brian Cairns",
    "email": "bcairns@google.com",
    "time": "Wed Jun 12 16:01:57 2024 +0000"
  },
  "message": "Add a standalone formula parser.\n\nThis is a fork of the EPPlus formula parser with all of the code that\nevaluates formulas removed. AppSheet doesn\u0027t use this code as part of\nits expression system, and removing it allows some significant\ncomplexity and size reductions:\n\n- Most of the dependencies on EPPlus Excel-specific code are\n  unnecessary and have been removed\n- Parsing can be a static method; there\u0027s no need for interfaces for\n  everything\n- There\u0027s no need for an IDisposable parser\n- Many framework/NuGet dependencies are not necessary and have been\n  removed\n\nIn addition, a significant amount of cleanup work has been done:\n- Nullable reference types have been enabled\n- Code has been generally simplified where possible\n- Unnecessary interfaces have been removed\n\nNote that this does *not* change the fundamental design or\nfunctionality of the formula parser. Notably:\n- Parsing behavior should be completely unchanged, down to whatever\n  bugs the old system had\n- NullReferenceException is still thrown for (some) malformed formulas\n- The output is still a weird linked-list / tree hybrid\n- Many functions that AppSheet doesn\u0027t support are still happily parsed\n\nThe idea is for this to be fully compatible with the existing\nexpression system, but faster and with fewer dependencies.\n\nChange-Id: Ic687924a60b2673c24b39295ed684ed33d5cf9e4\nReviewed-on: https://gnocchi-internal-review.git.corp.google.com/c/third_party/epplus/+/208509\nReviewed-by: Mike Smith \u003cmikeas@google.com\u003e\nReviewed-by: Hughes Hilton \u003chugheshilton@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a5459348de68efdd8b410f4ab97d1e11bc2eefe3",
      "old_mode": 33188,
      "old_path": "EPPlus.sln",
      "new_id": "d838aaff9fb1bac42c1baf72a839b593b8c4a396",
      "new_mode": 33188,
      "new_path": "EPPlus.sln"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "366cd3d18fc997d9f9a7bb7cb47f48268ea2bf7f",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/EpplusFormulaParser.csproj"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "31f9bff9d3583849f670cfac0a4049047cc24ff0",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/Excel/Operators/IOperator.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f69a12f2a01227542adbb3e0561c1c8f77717b4d",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/Excel/Operators/Operator.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "13a7dd34807ab1471276e34ea26f7634676f2c00",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/Excel/Operators/OperatorType.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a9fe81540026fe8ad7589fef2997699abb5a4a9e",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExcelUtilities/ExcelAddressBase.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a7c9a8e2adfea51253d1d254aa71730a37dcac8b",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/Exceptions/ExcelErrorValueException.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce20e848d455f5f3bbe33149f9df12f732c4bf04",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/Exceptions/UnrecognizedTokenException.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4fb567cbf4c6072df7fa830d96abd061ef046600",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/AtomicExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8cc1146b9a478d58ab0d66b30f5a4f4f9aff8a8f",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/BooleanExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "63b8f23bf3db798c5a4ed647f72d86ec4b0f9523",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/ConstantExpressions.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "704308b0043314503bf458d9ba865338e181a509",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/DecimalExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "29367f1c0645d037b3f6e8947f86e599fc29d1cc",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/EnumerableExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f58b2944c29fa10bbc817c0191a3fed85aa44006",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/ExcelAddressExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "95cc1395616da86981237338d7983d94b3272be9",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/ExcelErrorExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "506469a55eb4f60f37b88bfe11c73caf3b9a4d4b",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/Expression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4ce661a3dc961f4d944a1a786a8925db9b649774",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/ExpressionFactory.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "100e18637cef6a291d85dcf31579bca18d4954d0",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/ExpressionGraph.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6d6b711c7812f045025400a468386b54bcf8548a",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/ExpressionGraphBuilder.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ab9e3225d4ba1cc124cf046d5e62470a4c86fbbc",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/FunctionArgumentExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "19c5c574ad985e279e4219ec5c919b648d58d6d8",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/FunctionExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7f184c096a20681334b325bd8ca5a7f012711548",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/GroupExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e1f9f7b7f5764ef52c10bcfd6adde7ed58588da9",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/IntegerExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c0fee751bb18f96c8da447d157eaca591172e746",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/NamedValueExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9d452d8f0622203fbc33f5c40053ec4851bbc2f4",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/ExpressionGraph/StringExpression.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "84f2a1e231030e6cff6b8fe10cbaee562f6f8ac3",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/FormulaParser.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c096cb8a6d9cbe9a353bbb0f8bc66d0f6303b1e1",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/FunctionRepository.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "979b42eb3c9fa9e03007d5a88ad0ae8322f22c18",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/Lexer.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "08c1c37b3a181ad2ad04487cd490a49fa278b132",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/SourceCodeTokenizer.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2d698b7b3883e05f6edc5cf6e33bdb100c782d0e",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/SyntacticAnalyzer.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "397cdd52dafc03b7cda7f4605f20ddec589aa9bb",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/Token.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "908459166bc2d262df80df8cfabb7e5b8c5b5333",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/TokenFactory.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f505227b448b62a95dd1768d35f52d7e721a2333",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/TokenSeparatorProvider.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0c689c0d4c15a6ea76a70d833a039382ec934446",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/TokenType.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "76b839abad0da5b50b98f200cc6fd95b507882a0",
      "new_mode": 33188,
      "new_path": "EpplusFormulaParser/LexicalAnalysis/TokenizerContext.cs"
    }
  ]
}
