Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 52 additions & 40 deletions codegen/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,18 @@
})
}

type build struct {
name string // original case filename for file I/O
data *Data
}

func generatePerSchema(data *Data) error {
err := generateRootFile(data)
if err != nil {
return err
}

builds := map[string]*Data{}
builds := map[string]*build{}

err = addObjects(data, &builds)
if err != nil {
Expand All @@ -72,18 +77,18 @@
return err
}

for filename, build := range builds {
if filename == "" {
for _, b := range builds {
if b.name == "" {
continue
}

dir := data.Config.Exec.DirName
path := filepath.Join(dir, filename)
path := filepath.Join(dir, b.name)

err = templates.Render(templates.Options{
PackageName: data.Config.Exec.Package,
Filename: path,
Data: build,
Data: b.data,
RegionTags: true,
GeneratedHeader: true,
Packages: data.Config.Packages,
Expand Down Expand Up @@ -114,18 +119,21 @@
return strings.ReplaceAll(filenameTempl, "{name}", name)
}

func addBuild(filename string, p *ast.Position, data *Data, builds *map[string]*Data) {
func addBuild(fnCase string, fnKey string, p *ast.Position, data *Data, builds *map[string]*build) {

Check failure on line 122 in codegen/generate.go

View workflow job for this annotation

GitHub Actions / golangci-lint (1.25)

paramTypeCombine: func(fnCase string, fnKey string, p *ast.Position, data *Data, builds *map[string]*build) could be replaced with func(fnCase, fnKey string, p *ast.Position, data *Data, builds *map[string]*build) (gocritic)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
func addBuild(fnCase string, fnKey string, p *ast.Position, data *Data, builds *map[string]*build) {
func addBuild(fnCase, fnKey string, p *ast.Position, data *Data, builds *map[string]*build) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The abbreviation you chose fn for fnCase and fnKey is commonly used to mean function so it may be a little confusing here?

@StevenACoffman StevenACoffman Apr 23, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, even in gigantic projects, the number of files is probably not significant, as you do in a number of the other functions, so I'm not sure that we need to bother passing the same data fnCase and fnKey here, when we can just re-compute fnKey from strings.ToLower(filename)

buildConfig := *data.Config
if p != nil {
buildConfig.Sources = []*ast.Source{p.Src}
}

(*builds)[filename] = &Data{
Config: &buildConfig,
QueryRoot: data.QueryRoot,
MutationRoot: data.MutationRoot,
SubscriptionRoot: data.SubscriptionRoot,
AllDirectives: data.AllDirectives,
(*builds)[fnKey] = &build{
name: fnCase,
data: &Data{
Config: &buildConfig,
QueryRoot: data.QueryRoot,
MutationRoot: data.MutationRoot,
SubscriptionRoot: data.SubscriptionRoot,
AllDirectives: data.AllDirectives,
},
}
}

Expand All @@ -151,66 +159,70 @@
})
}

func addObjects(data *Data, builds *map[string]*Data) error {
func addObjects(data *Data, builds *map[string]*build) error {
for _, o := range data.Objects {
filename := filename(o.Position, data.Config)
if (*builds)[filename] == nil {
addBuild(filename, o.Position, data, builds)
fnCase := filename(o.Position, data.Config)
fn := strings.ToLower(fnCase)
if (*builds)[fn] == nil {
addBuild(fnCase, fn, o.Position, data, builds)
}

(*builds)[filename].Objects = append((*builds)[filename].Objects, o)
(*builds)[fn].data.Objects = append((*builds)[fn].data.Objects, o)
}
return nil
}

func addInputs(data *Data, builds *map[string]*Data) error {
func addInputs(data *Data, builds *map[string]*build) error {
for _, in := range data.Inputs {
filename := filename(in.Position, data.Config)
if (*builds)[filename] == nil {
addBuild(filename, in.Position, data, builds)
fnCase := filename(in.Position, data.Config)
fn := strings.ToLower(fnCase)
if (*builds)[fn] == nil {
addBuild(fnCase, fn, in.Position, data, builds)
}

(*builds)[filename].Inputs = append((*builds)[filename].Inputs, in)
(*builds)[fn].data.Inputs = append((*builds)[fn].data.Inputs, in)
}
return nil
}

func addInterfaces(data *Data, builds *map[string]*Data) error {
func addInterfaces(data *Data, builds *map[string]*build) error {
for k, inf := range data.Interfaces {
filename := filename(inf.Position, data.Config)
if (*builds)[filename] == nil {
addBuild(filename, inf.Position, data, builds)
fnCase := filename(inf.Position, data.Config)
fn := strings.ToLower(fnCase)
if (*builds)[fn] == nil {
addBuild(fnCase, fn, inf.Position, data, builds)
}
build := (*builds)[filename]
b := (*builds)[fn]

if build.Interfaces == nil {
build.Interfaces = map[string]*Interface{}
if b.data.Interfaces == nil {
b.data.Interfaces = map[string]*Interface{}
}
if build.Interfaces[k] != nil {
if b.data.Interfaces[k] != nil {
return errors.New("conflicting interface keys")
}

build.Interfaces[k] = inf
b.data.Interfaces[k] = inf
}
return nil
}

func addReferencedTypes(data *Data, builds *map[string]*Data) error {
func addReferencedTypes(data *Data, builds *map[string]*build) error {
for k, rt := range data.ReferencedTypes {
filename := filename(rt.Definition.Position, data.Config)
if (*builds)[filename] == nil {
addBuild(filename, rt.Definition.Position, data, builds)
fnCase := filename(rt.Definition.Position, data.Config)
fn := strings.ToLower(fnCase)
if (*builds)[fn] == nil {
addBuild(fnCase, fn, rt.Definition.Position, data, builds)
}
build := (*builds)[filename]
b := (*builds)[fn]

if build.ReferencedTypes == nil {
build.ReferencedTypes = map[string]*config.TypeReference{}
if b.data.ReferencedTypes == nil {
b.data.ReferencedTypes = map[string]*config.TypeReference{}
}
if build.ReferencedTypes[k] != nil {
if b.data.ReferencedTypes[k] != nil {
return errors.New("conflicting referenced type keys")
}

build.ReferencedTypes[k] = rt
b.data.ReferencedTypes[k] = rt
}
return nil
}
4 changes: 4 additions & 0 deletions codegen/testserver/casesensitivity/generated_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//go:generate sh -c "rm -f *.generated.go *.resolvers.go"
//go:generate go run ../../../testdata/gqlgen.go -config gqlgen.yml

package casesensitivity
16 changes: 16 additions & 0 deletions codegen/testserver/casesensitivity/gqlgen.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
schema:
- "schema.graphql"
- "queries/*.graphql"
- "types/*.graphql"
skip_validation: true
exec:
layout: follow-schema
dir: .
package: casesensitivity
model:
filename: models.generated.go
package: casesensitivity
resolver:
layout: follow-schema
dir: .
package: casesensitivity
17 changes: 17 additions & 0 deletions codegen/testserver/casesensitivity/models.generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading