From 88de54c64791d961d4bc502a5f92b05665318f6c Mon Sep 17 00:00:00 2001 From: Princesseuh <3019731+Princesseuh@users.noreply.github.com> Date: Wed, 31 Jul 2024 17:48:43 +0200 Subject: [PATCH] revert: top level returns transformations --- .changeset/brown-terms-sleep.md | 5 ++ internal/js_scanner/js_scanner.go | 54 ------------------- internal/printer/print-to-tsx.go | 23 +------- .../compiler/test/tsx/top-level-returns.ts | 44 --------------- 4 files changed, 6 insertions(+), 120 deletions(-) create mode 100644 .changeset/brown-terms-sleep.md delete mode 100644 packages/compiler/test/tsx/top-level-returns.ts diff --git a/.changeset/brown-terms-sleep.md b/.changeset/brown-terms-sleep.md new file mode 100644 index 000000000..0e8bf3619 --- /dev/null +++ b/.changeset/brown-terms-sleep.md @@ -0,0 +1,5 @@ +--- +"@astrojs/compiler": patch +--- + +Revert the transformation of top-level returns into throws in TSX as it was buggy in numerous situations diff --git a/internal/js_scanner/js_scanner.go b/internal/js_scanner/js_scanner.go index 38f48a80e..17fa15e24 100644 --- a/internal/js_scanner/js_scanner.go +++ b/internal/js_scanner/js_scanner.go @@ -12,60 +12,6 @@ import ( "github.com/withastro/compiler/internal/loc" ) -func FindTopLevelReturns(source []byte) []int { - l := js.NewLexer(parse.NewInputBytes(source)) - i := 0 - returns := make([]int, 0) - pairs := make(map[byte]int) - inFunction := false - - for { - token, value := l.Next() - - if token == js.DivToken || token == js.DivEqToken { - lns := bytes.Split(source[i+1:], []byte{'\n'}) - if bytes.Contains(lns[0], []byte{'/'}) { - token, value = l.RegExp() - } - } - - if token == js.ErrorToken { - if l.Err() != io.EOF { - return returns - } - break - } - - if js.IsPunctuator(token) { - if value[0] == '{' { - pairs[value[0]]++ - i += len(value) - continue - } else if value[0] == '}' { - pairs['{']-- - } - } - - // Track function declarations - if token == js.FunctionToken { - inFunction = true - } - - // Track end of function declarations - if inFunction && token == js.CloseBraceToken && pairs['{'] == 1 { - inFunction = false - } - - if token == js.ReturnToken && !inFunction { - returns = append(returns, i) - } - - i += len(value) - } - - return returns -} - type HoistedScripts struct { Hoisted [][]byte HoistedLocs []loc.Loc diff --git a/internal/printer/print-to-tsx.go b/internal/printer/print-to-tsx.go index 3b4753756..95636b888 100644 --- a/internal/printer/print-to-tsx.go +++ b/internal/printer/print-to-tsx.go @@ -2,7 +2,6 @@ package printer import ( "fmt" - "slices" "strings" "unicode" @@ -404,31 +403,11 @@ declare const Astro: Readonly 0 { p.addSourceMapping(c.Loc[0]) } - // Remplace all the top level returns with a `throw` - if len(topLevelReturn) > 0 { - // Loop over the characters and replace the top level returns with a `throw` - newString := []byte{} - - i := 0 - for i < len(c.Data) { - if slices.Contains(topLevelReturn, i) { - newString = append(newString, []byte("throw ")...) - i += len("return") - } else { - newString = append(newString, c.Data[i]) - i++ - } - } - - p.printTextWithSourcemap(string(newString), c.Loc[0]) - } else { - p.printTextWithSourcemap(c.Data, c.Loc[0]) - } + p.printTextWithSourcemap(c.Data, c.Loc[0]) } else { renderTsx(p, c, o) } diff --git a/packages/compiler/test/tsx/top-level-returns.ts b/packages/compiler/test/tsx/top-level-returns.ts deleted file mode 100644 index 6e5c95933..000000000 --- a/packages/compiler/test/tsx/top-level-returns.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { convertToTSX } from '@astrojs/compiler'; -import { test } from 'uvu'; -import * as assert from 'uvu/assert'; -import { TSXPrefix } from '../utils.js'; - -test('transforms top-level returns to throw statements', async () => { - const input = `--- -if (something) { - return Astro.redirect(); -} - -function thatDoesSomething() { - return "Hey"; -} - -class Component { - render() { - return "wow"! - } -} ----`; - const output = `${TSXPrefix} -if (something) { - throw Astro.redirect(); -} - -function thatDoesSomething() { - return "Hey"; -} - -class Component { - render() { - return "wow"! - } -} - - -export default function __AstroComponent_(_props: Record): any {} -`; - const { code } = await convertToTSX(input, { sourcemap: 'external' }); - assert.snapshot(code, output, 'expected code to match snapshot'); -}); - -test.run();