Skip to content

Commit 0e72fe0

Browse files
authored
Remove support for the old parser (sqlc-dev#553)
* First pass at removing old parser * compiler: Move Result methods to codegen The compiler shouldn't know anything about individual languages. The compiler package no longer imports the codegen package. The *compiler.Result struct isn't a perfect interface, but it's much better than the Generatable interface. * kotlin: Create the new Kotlin codegen package
1 parent 70d2d47 commit 0e72fe0

29 files changed

Lines changed: 1096 additions & 1144 deletions

File tree

examples/kotlin/src/test/kotlin/com/example/ondeck/QueriesImplTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,4 @@ class QueriesImplTest {
4343

4444
q.deleteVenue(venue.slug).execute()
4545
}
46-
}
46+
}

internal/cmd/cmd.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,10 @@ var initCmd = &cobra.Command{
6969
}
7070

7171
type Env struct {
72-
ExperimentalParser bool
7372
}
7473

7574
func ParseEnv() Env {
76-
return Env{
77-
ExperimentalParser: os.Getenv("SQLC_EXPERIMENTAL_PARSER") != "off",
78-
}
75+
return Env{}
7976
}
8077

8178
var genCmd = &cobra.Command{

internal/cmd/generate.go

Lines changed: 39 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@ import (
1111
"strings"
1212

1313
"github.com/kyleconroy/sqlc/internal/codegen/golang"
14+
"github.com/kyleconroy/sqlc/internal/codegen/kotlin"
1415
"github.com/kyleconroy/sqlc/internal/compiler"
1516
"github.com/kyleconroy/sqlc/internal/config"
16-
"github.com/kyleconroy/sqlc/internal/dinosql"
17-
"github.com/kyleconroy/sqlc/internal/dinosql/kotlin"
1817
"github.com/kyleconroy/sqlc/internal/multierr"
1918
"github.com/kyleconroy/sqlc/internal/mysql"
20-
"github.com/kyleconroy/sqlc/internal/pg"
19+
"github.com/kyleconroy/sqlc/internal/opts"
2120
)
2221

2322
const errMessageNoVersion = `The configuration file must have a version number.
@@ -113,7 +112,6 @@ func Generate(e Env, dir string, stderr io.Writer) (map[string]string, error) {
113112

114113
for _, sql := range pairs {
115114
combo := config.Combine(conf, sql.SQL)
116-
var result golang.Generateable
117115

118116
// TODO: This feels like a hack that will bite us later
119117
joined := make([]string, 0, len(sql.Schema))
@@ -129,40 +127,48 @@ func Generate(e Env, dir string, stderr io.Writer) (map[string]string, error) {
129127
sql.Queries = joined
130128

131129
var name string
132-
parseOpts := dinosql.ParserOpts{}
130+
parseOpts := opts.Parser{}
133131
if sql.Gen.Go != nil {
134132
name = combo.Go.Package
135133
} else if sql.Gen.Kotlin != nil {
136134
parseOpts.UsePositionalParameters = true
137135
name = combo.Kotlin.Package
138136
}
139137

140-
result, errored = parse(e, name, dir, sql.SQL, combo, parseOpts, stderr)
141-
if errored {
142-
break
143-
}
144-
145138
var files map[string]string
146139
var out string
147-
if sql.Gen.Go != nil {
140+
141+
// TODO: Note about how this will be going away
142+
if sql.Engine == config.EngineMySQL {
143+
result, errored := parseMySQL(e, name, dir, sql.SQL, combo, parseOpts, stderr)
144+
if errored {
145+
break
146+
}
148147
out = combo.Go.Out
149-
files, err = golang.Generate(result, combo)
150-
} else if sql.Gen.Kotlin != nil {
151-
out = combo.Kotlin.Out
152-
ktRes, ok := result.(kotlin.KtGenerateable)
153-
if !ok {
154-
err = fmt.Errorf("kotlin not supported for engine %s", combo.Package.Engine)
148+
files, err = golang.DeprecatedGenerate(result, combo)
149+
} else {
150+
result, errored := parse(e, name, dir, sql.SQL, combo, parseOpts, stderr)
151+
if errored {
155152
break
156153
}
157-
files, err = kotlin.KtGenerate(ktRes, combo)
154+
switch {
155+
case sql.Gen.Go != nil:
156+
out = combo.Go.Out
157+
files, err = golang.Generate(result, combo)
158+
case sql.Gen.Kotlin != nil:
159+
out = combo.Kotlin.Out
160+
files, err = kotlin.Generate(result, combo)
161+
default:
162+
panic("missing language backend")
163+
}
158164
}
165+
159166
if err != nil {
160167
fmt.Fprintf(stderr, "# package %s\n", name)
161168
fmt.Fprintf(stderr, "error generating code: %s\n", err)
162169
errored = true
163170
continue
164171
}
165-
166172
for n, source := range files {
167173
filename := filepath.Join(dir, out, n)
168174
output[filename] = source
@@ -175,64 +181,25 @@ func Generate(e Env, dir string, stderr io.Writer) (map[string]string, error) {
175181
return output, nil
176182
}
177183

178-
type postgreEngine interface {
179-
ParseCatalog([]string) error
180-
ParseQueries([]string, dinosql.ParserOpts) error
181-
Result() golang.Generateable
182-
}
183-
184-
type dinosqlEngine struct {
185-
catalog pg.Catalog
186-
result *dinosql.Result
187-
}
188-
189-
func (d *dinosqlEngine) ParseCatalog(schema []string) error {
190-
c, err := dinosql.ParseCatalog(schema)
191-
if err != nil {
192-
return err
193-
}
194-
d.catalog = c
195-
return nil
196-
}
197-
198-
func (d *dinosqlEngine) ParseQueries(queries []string, opts dinosql.ParserOpts) error {
199-
q, err := dinosql.ParseQueries(d.catalog, queries, opts)
184+
// Experimental MySQL support
185+
func parseMySQL(e Env, name, dir string, sql config.SQL, combo config.CombinedSettings, parserOpts opts.Parser, stderr io.Writer) (golang.Generateable, bool) {
186+
q, err := mysql.GeneratePkg(name, sql.Schema, sql.Queries, combo)
200187
if err != nil {
201-
return err
202-
}
203-
d.result = q
204-
return nil
205-
}
206-
207-
func (d *dinosqlEngine) Result() golang.Generateable {
208-
return &kotlin.Result{Result: d.result}
209-
}
210-
211-
func parse(e Env, name, dir string, sql config.SQL, combo config.CombinedSettings, parserOpts dinosql.ParserOpts, stderr io.Writer) (golang.Generateable, bool) {
212-
if sql.Engine == config.EngineMySQL {
213-
// Experimental MySQL support
214-
q, err := mysql.GeneratePkg(name, sql.Schema, sql.Queries, combo)
215-
if err != nil {
216-
fmt.Fprintf(stderr, "# package %s\n", name)
217-
if parserErr, ok := err.(*multierr.Error); ok {
218-
for _, fileErr := range parserErr.Errs() {
219-
printFileErr(stderr, dir, fileErr)
220-
}
221-
} else {
222-
fmt.Fprintf(stderr, "error parsing schema: %s\n", err)
188+
fmt.Fprintf(stderr, "# package %s\n", name)
189+
if parserErr, ok := err.(*multierr.Error); ok {
190+
for _, fileErr := range parserErr.Errs() {
191+
printFileErr(stderr, dir, fileErr)
223192
}
224-
return nil, true
193+
} else {
194+
fmt.Fprintf(stderr, "error parsing schema: %s\n", err)
225195
}
226-
return q, false
227-
}
228-
229-
var eng postgreEngine
230-
if sql.Engine == config.EnginePostgreSQL && !e.ExperimentalParser {
231-
eng = &dinosqlEngine{}
232-
} else {
233-
eng = compiler.NewEngine(sql, combo)
196+
return nil, true
234197
}
198+
return q, false
199+
}
235200

201+
func parse(e Env, name, dir string, sql config.SQL, combo config.CombinedSettings, parserOpts opts.Parser, stderr io.Writer) (*compiler.Result, bool) {
202+
eng := compiler.NewEngine(sql, combo)
236203
if err := eng.ParseCatalog(sql.Schema); err != nil {
237204
fmt.Fprintf(stderr, "# package %s\n", name)
238205
if parserErr, ok := err.(*multierr.Error); ok {

internal/codegen/golang/compat.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package golang
2+
3+
import (
4+
core "github.com/kyleconroy/sqlc/internal/pg"
5+
"github.com/kyleconroy/sqlc/internal/sql/ast"
6+
)
7+
8+
func sameTableName(n *ast.TableName, f core.FQN) bool {
9+
if n == nil {
10+
return false
11+
}
12+
schema := n.Schema
13+
if n.Schema == "" {
14+
schema = "public"
15+
}
16+
return n.Catalog == n.Catalog && schema == f.Schema && n.Name == f.Rel
17+
}

0 commit comments

Comments
 (0)