diff --git a/examples/fnl/fnl.q b/examples/fnl/fnl.q index b518130..1728229 100644 --- a/examples/fnl/fnl.q +++ b/examples/fnl/fnl.q @@ -4,23 +4,23 @@ import io import mem import run -const { - MODE_STATUS = 0 - MODE_ADD = 1 - MODE_REMOVE = 2 +Mode const { + Status = 0 + Add = 1 + Remove = 2 } main() { - mode := MODE_STATUS + mode := Mode.Status args := cli.args() loop i := 0..args.len { switch { args[i] == "-add" { - mode = MODE_ADD + mode = Mode.Add } args[i] == "-remove" { - mode = MODE_REMOVE + mode = Mode.Remove } _ { processFile(args[i], mode) @@ -43,11 +43,11 @@ processStdin(mode int) { if n == 0 { switch { - mode == MODE_ADD && pos < buffer.len && buffer[pos-1] != '\n' { + mode == Mode.Add && pos < buffer.len && buffer[pos-1] != '\n' { buffer[pos] = '\n' pos += 1 } - mode == MODE_REMOVE && pos > 0 && buffer[pos-1] == '\n' { + mode == Mode.Remove && pos > 0 && buffer[pos-1] == '\n' { pos -= 1 } } @@ -83,14 +83,14 @@ processFile(path string, mode int) { io.write(": ") if source[source.len-1] == '\n' { - if mode == MODE_REMOVE { + if mode == Mode.Remove { io.writeLine("no final newline [removed]") fs.writeFile(path, source[..source.len-1]) } else { io.writeLine("final newline") } } else { - if mode == MODE_ADD { + if mode == Mode.Add { io.writeLine("final newline [added]") newSource := addNewline(source) fs.writeFile(path, newSource) diff --git a/examples/raylib/extern.q b/examples/raylib/extern.q index cc3a137..1749bc1 100644 --- a/examples/raylib/extern.q +++ b/examples/raylib/extern.q @@ -1,8 +1,8 @@ -const { - KEY_RIGHT = 262 - KEY_LEFT = 263 - KEY_DOWN = 264 - KEY_UP = 265 +Key const { + Right = 262 + Left = 263 + Down = 264 + Up = 265 } extern { diff --git a/examples/raylib/raylib.q b/examples/raylib/raylib.q index a808501..810a41a 100644 --- a/examples/raylib/raylib.q +++ b/examples/raylib/raylib.q @@ -11,17 +11,17 @@ // const { - canvasWidth = 1280 - canvasHeight = 720 + CANVAS_WIDTH = 1280 + CANVAS_HEIGHT = 720 } main() { - raylib.InitWindow(canvasWidth, canvasHeight, "raylib example\0".ptr) + raylib.InitWindow(CANVAS_WIDTH, CANVAS_HEIGHT, "raylib example\0".ptr) raylib.SetTargetFPS(1000) player := new(Player) { - x: canvasWidth / 2, - y: canvasHeight / 2, + x: CANVAS_WIDTH / 2, + y: CANVAS_HEIGHT / 2, width: 10, height: 10, } @@ -39,19 +39,19 @@ main() { } input(player *Player) { - if raylib.IsKeyDown(KEY_RIGHT) { + if raylib.IsKeyDown(Key.Right) { player.x += 1 } - if raylib.IsKeyDown(KEY_LEFT) { + if raylib.IsKeyDown(Key.Left) { player.x -= 1 } - if raylib.IsKeyDown(KEY_DOWN) { + if raylib.IsKeyDown(Key.Down) { player.y += 1 } - if raylib.IsKeyDown(KEY_UP) { + if raylib.IsKeyDown(Key.Up) { player.y -= 1 } } @@ -63,7 +63,7 @@ update(player *Player) { player.x = minX } - maxX := canvasWidth - minX + maxX := CANVAS_WIDTH - minX if player.x > maxX { player.x = maxX @@ -75,7 +75,7 @@ update(player *Player) { player.y = minY } - maxY := canvasHeight - minY + maxY := CANVAS_HEIGHT - minY if player.y > maxY { player.y = maxY diff --git a/src/core/evaluateDot.go b/src/core/evaluateDot.go index 0d68ca8..c48d266 100644 --- a/src/core/evaluateDot.go +++ b/src/core/evaluateDot.go @@ -3,6 +3,7 @@ package core import ( "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/expression" + "git.urbach.dev/cli/q/src/fs" "git.urbach.dev/cli/q/src/ssa" "git.urbach.dev/cli/q/src/token" ) @@ -62,7 +63,16 @@ func (f *Function) evaluateDot(expr *expression.Expression) (ssa.Value, error) { return nil, errors.New(&UnknownEnumMember{EnumName: enumValue.Typ.Name(), MemberName: rightText}, f.File, right.Source()) } - return f.evaluateRight(constExpr.(*expression.Expression)) + tmp := f.File + f.File = enumValue.Typ.File().(*fs.File) + value, err := f.evaluateRight(constExpr.(*expression.Expression)) + f.File = tmp + + if err != nil { + return nil, err + } + + return value, nil } if expr.Parent != nil && expr.Parent.Token.Kind == token.Call && expr.Parent.Children[0] == expr { diff --git a/src/scanner/scanEnum.go b/src/scanner/scanEnum.go index 3301c3b..d05c29d 100644 --- a/src/scanner/scanEnum.go +++ b/src/scanner/scanEnum.go @@ -17,7 +17,7 @@ func (s *scanner) scanEnum(file *fs.File, tokens token.List, i int) (int, error) return i, errors.NewAt(MissingBlockStart, file, tokens[i].Position) } - enum := types.NewEnum(file.Package, enumName) + enum := types.NewEnum(file.Package, enumName, file) i++ start := -1 blockLevel := 1 diff --git a/src/types/Enum.go b/src/types/Enum.go index 8381eb9..26268f9 100644 --- a/src/types/Enum.go +++ b/src/types/Enum.go @@ -4,14 +4,16 @@ package types type Enum struct { pkg string name string + file any members map[string]any } // NewEnum creates a new enum type. -func NewEnum(pkg string, name string) *Enum { +func NewEnum(pkg string, name string, file any) *Enum { return &Enum{ pkg: pkg, name: name, + file: file, members: make(map[string]any), } } @@ -21,6 +23,11 @@ func (e *Enum) AddMember(name string, value any) { e.members[name] = value } +// File returns the file where the enum was defined. +func (e *Enum) File() any { + return e.file +} + // Member returns the value for the given member name, or nil if not found. func (e *Enum) Member(name string) (any, bool) { v, ok := e.members[name]