@@ -28,13 +28,14 @@ func actionEndpointsFromIR(config gowdk.Config, ir gwdkir.Program) ([]ActionEndp
2828 if route == "" {
2929 route = page .Route
3030 }
31- bindingRoute := route
3231 fragments , err := actionFragmentsFromIR (action )
3332 if err != nil {
3433 return nil , fmt .Errorf ("%s.%s: %w" , page .ID , action .Name , err )
3534 }
35+ semanticEndpoint := irEndpointForBlock (ir .Endpoints , gwdkir .EndpointAction , page .ID , action .Name , method , route )
3636 for _ , localized := range actionEndpointRoutes (config .I18N , page .Route , route , action .Route == "" ) {
3737 endpoints = append (endpoints , ActionEndpoint {
38+ EndpointID : semanticEndpoint .SemanticID (),
3839 PageID : page .ID ,
3940 ActionName : action .Name ,
4041 Method : method ,
@@ -51,7 +52,7 @@ func actionEndpointsFromIR(config gowdk.Config, ir gwdkir.Program) ([]ActionEndp
5152 Redirect : action .Redirect ,
5253 Fragments : fragments ,
5354 ErrorPage : action .ErrorPage ,
54- Binding : bindings [irEndpointKey ( gwdkir . EndpointAction , page . ID , action . Name , method , bindingRoute )],
55+ Binding : bindings [semanticEndpoint . SemanticID ( )],
5556 Source : page .Source ,
5657 SourceSpan : action .Span ,
5758 })
@@ -62,8 +63,9 @@ func actionEndpointsFromIR(config gowdk.Config, ir gwdkir.Program) ([]ActionEndp
6263 if endpoint .Kind != gwdkir .EndpointAction || endpoint .Source != gwdkir .EndpointSourceGo {
6364 continue
6465 }
65- binding := bindings [irEndpointKey ( endpoint .Kind , endpoint . PageID , endpoint . Symbol , endpoint . Method , endpoint . Path )]
66+ binding := bindings [endpoint .SemanticID ( )]
6667 endpoints = append (endpoints , ActionEndpoint {
68+ EndpointID : endpoint .SemanticID (),
6769 PageID : endpoint .PageID ,
6870 ActionName : endpoint .Symbol ,
6971 Method : endpoint .Method ,
@@ -116,15 +118,17 @@ func apiEndpointsFromIR(ir gwdkir.Program) ([]APIEndpoint, error) {
116118 if route == "" {
117119 route = page .Route
118120 }
121+ semanticEndpoint := irEndpointForBlock (ir .Endpoints , gwdkir .EndpointAPI , page .ID , api .Name , method , route )
119122 endpoints = append (endpoints , APIEndpoint {
123+ EndpointID : semanticEndpoint .SemanticID (),
120124 PageID : page .ID ,
121125 APIName : api .Name ,
122126 Method : method ,
123127 Route : route ,
124128 Guards : append ([]string (nil ), page .Guards ... ),
125129 ErrorPage : api .ErrorPage ,
126130 CORS : cloneEndpointCORS (api .CORS ),
127- Binding : bindings [irEndpointKey ( gwdkir . EndpointAPI , page . ID , api . Name , method , route )],
131+ Binding : bindings [semanticEndpoint . SemanticID ( )],
128132 Source : page .Source ,
129133 SourceSpan : api .Span ,
130134 })
@@ -135,13 +139,14 @@ func apiEndpointsFromIR(ir gwdkir.Program) ([]APIEndpoint, error) {
135139 continue
136140 }
137141 endpoints = append (endpoints , APIEndpoint {
142+ EndpointID : endpoint .SemanticID (),
138143 PageID : endpoint .PageID ,
139144 APIName : endpoint .Symbol ,
140145 Method : endpoint .Method ,
141146 Route : endpoint .Path ,
142147 ErrorPage : endpoint .ErrorPage ,
143148 CORS : cloneEndpointCORS (endpoint .CORS ),
144- Binding : bindings [irEndpointKey ( endpoint .Kind , endpoint . PageID , endpoint . Symbol , endpoint . Method , endpoint . Path )],
149+ Binding : bindings [endpoint .SemanticID ( )],
145150 Source : endpoint .SourceFile ,
146151 SourceSpan : endpoint .Span ,
147152 })
@@ -175,18 +180,21 @@ func fragmentEndpointsFromIR(ir gwdkir.Program) ([]FragmentEndpoint, error) {
175180 if method == "" {
176181 method = "GET"
177182 }
183+ route := strings .TrimSpace (fragment .Route )
184+ semanticEndpoint := irEndpointForBlock (ir .Endpoints , gwdkir .EndpointFragment , page .ID , fragment .Name , method , route )
178185 endpoints = append (endpoints , FragmentEndpoint {
186+ EndpointID : semanticEndpoint .SemanticID (),
179187 PageID : page .ID ,
180188 FragmentName : fragment .Name ,
181189 Method : method ,
182- Route : strings . TrimSpace ( fragment . Route ) ,
183- RouteParams : gwdkir .RouteParamsFromPath (strings . TrimSpace ( fragment . Route ) ),
190+ Route : route ,
191+ RouteParams : gwdkir .RouteParamsFromPath (route ),
184192 Target : fragment .Target ,
185193 HTML : html ,
186194 Package : page .Package ,
187195 Uses : uses ,
188196 Guards : append ([]string (nil ), page .Guards ... ),
189- Binding : bindings [irEndpointKey ( gwdkir . EndpointFragment , page . ID , fragment . Name , method , strings . TrimSpace ( fragment . Route ) )],
197+ Binding : bindings [semanticEndpoint . SemanticID ( )],
190198 Source : page .Source ,
191199 SourceSpan : fragment .Span ,
192200 })
@@ -316,8 +324,8 @@ func irExportTypes(exports []gwdkir.Export) map[string]clientlang.ValueType {
316324 return out
317325}
318326
319- func irBindingsByEndpoint (endpoints []gwdkir.Endpoint ) map [string ]source.BackendBinding {
320- out := map [string ]source.BackendBinding {}
327+ func irBindingsByEndpoint (endpoints []gwdkir.Endpoint ) map [gwdkir. EndpointID ]source.BackendBinding {
328+ out := map [gwdkir. EndpointID ]source.BackendBinding {}
321329 for _ , endpoint := range endpoints {
322330 if endpoint .Binding .Status == "" && endpoint .Binding .ImportPath == "" && endpoint .Binding .FunctionName == "" {
323331 continue
@@ -326,7 +334,7 @@ func irBindingsByEndpoint(endpoints []gwdkir.Endpoint) map[string]source.Backend
326334 if endpoint .Kind == gwdkir .EndpointAPI {
327335 kind = "api"
328336 }
329- out [irEndpointKey ( endpoint .Kind , endpoint . PageID , endpoint . Symbol , endpoint . Method , endpoint . Path )] = source.BackendBinding {
337+ out [endpoint .SemanticID ( )] = source.BackendBinding {
330338 Kind : kind ,
331339 PageID : endpoint .PageID ,
332340 Source : endpoint .SourceFile ,
@@ -350,8 +358,23 @@ func irBindingsByEndpoint(endpoints []gwdkir.Endpoint) map[string]source.Backend
350358 return out
351359}
352360
353- func irEndpointKey (kind gwdkir.EndpointKind , pageID , symbol , method , route string ) string {
354- return strings .Join ([]string {string (kind ), pageID , symbol , method , route }, "\x00 " )
361+ func irEndpointForBlock (endpoints []gwdkir.Endpoint , kind gwdkir.EndpointKind , pageID , symbol , method , route string ) gwdkir.Endpoint {
362+ for _ , endpoint := range endpoints {
363+ if endpoint .Kind == kind &&
364+ endpoint .PageID == pageID &&
365+ endpoint .Symbol == symbol &&
366+ endpoint .Method == method &&
367+ endpoint .Path == route {
368+ return endpoint
369+ }
370+ }
371+ return gwdkir.Endpoint {
372+ Kind : kind ,
373+ PageID : pageID ,
374+ Symbol : symbol ,
375+ Method : method ,
376+ Path : route ,
377+ }
355378}
356379
357380func actionFragmentsFromIR (action gwdkir.Action ) ([]ActionFragment , error ) {
0 commit comments