From bbf2970c4ec1fd29ce1b2b3c78dc67dce81caeaa Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Wed, 26 Feb 2025 20:02:53 +0100 Subject: [PATCH] Simplified constant folding --- src/core/Fold.go | 24 ++---------------------- src/core/FoldConstant.go | 23 +++++++++++++++++++++++ src/core/FoldLeaf.go | 17 +++++++++++++++++ src/expression/Expression.go | 5 ++--- src/expression/Foldable.go | 7 +++++++ 5 files changed, 51 insertions(+), 25 deletions(-) create mode 100644 src/core/FoldConstant.go create mode 100644 src/core/FoldLeaf.go create mode 100644 src/expression/Foldable.go diff --git a/src/core/Fold.go b/src/core/Fold.go index 768f2ec..11ae861 100644 --- a/src/core/Fold.go +++ b/src/core/Fold.go @@ -17,31 +17,11 @@ func (f *Function) Fold(expr *expression.Expression) error { } if expr.IsLeaf() { - if expr.Token.IsNumeric() { - value, err := f.ToNumber(expr.Token) - expr.Value = value - expr.IsFolded = true - return err - } - - return nil + return f.FoldLeaf(expr) } if expr.Token.Kind == token.Period { - left := expr.Children[0] - leftText := left.Token.Text(f.File.Bytes) - right := expr.Children[1] - rightText := right.Token.Text(f.File.Bytes) - constant, isConst := f.All.Constants[f.Package+"."+leftText+"."+rightText] - - if !isConst { - return nil - } - - value, err := ToNumber(constant.Token, constant.File) - expr.Value = value - expr.IsFolded = true - return err + return f.FoldConstant(expr) } canFold := true diff --git a/src/core/FoldConstant.go b/src/core/FoldConstant.go new file mode 100644 index 0000000..39c0c23 --- /dev/null +++ b/src/core/FoldConstant.go @@ -0,0 +1,23 @@ +package core + +import ( + "git.urbach.dev/cli/q/src/expression" +) + +// FoldConstant tries to find a constant that can be folded. +func (f *Function) FoldConstant(expr *expression.Expression) error { + left := expr.Children[0] + right := expr.Children[1] + leftText := left.Token.Text(f.File.Bytes) + rightText := right.Token.Text(f.File.Bytes) + constant, exists := f.All.Constants[f.Package+"."+leftText+"."+rightText] + + if !exists { + return nil + } + + value, err := ToNumber(constant.Token, constant.File) + expr.Value = value + expr.IsFolded = true + return err +} diff --git a/src/core/FoldLeaf.go b/src/core/FoldLeaf.go new file mode 100644 index 0000000..c989bf7 --- /dev/null +++ b/src/core/FoldLeaf.go @@ -0,0 +1,17 @@ +package core + +import ( + "git.urbach.dev/cli/q/src/expression" +) + +// FoldLeaf tries to fold a leaf expression. +func (f *Function) FoldLeaf(expr *expression.Expression) error { + if !expr.Token.IsNumeric() { + return nil + } + + value, err := f.ToNumber(expr.Token) + expr.Value = value + expr.IsFolded = true + return err +} diff --git a/src/expression/Expression.go b/src/expression/Expression.go index aecaa77..a76569a 100644 --- a/src/expression/Expression.go +++ b/src/expression/Expression.go @@ -11,9 +11,8 @@ type Expression struct { Parent *Expression Children []*Expression Token token.Token - Value int Precedence int8 - IsFolded bool + Foldable } // New creates a new expression. @@ -62,8 +61,8 @@ func (expr *Expression) Reset() { } expr.Token.Reset() - expr.Value = 0 expr.Precedence = 0 + expr.Value = 0 expr.IsFolded = false } diff --git a/src/expression/Foldable.go b/src/expression/Foldable.go new file mode 100644 index 0000000..c225d80 --- /dev/null +++ b/src/expression/Foldable.go @@ -0,0 +1,7 @@ +package expression + +// Foldable has optional fields that are used for constant folding later. +type Foldable struct { + Value int + IsFolded bool +}