88 "strings"
99
1010 "github.com/MadAppGang/dingo/pkg/plugin"
11+ "golang.org/x/tools/go/ast/astutil"
1112)
1213
1314// ResultTypePlugin generates Result<T, E> type declarations and transformations
@@ -143,10 +144,11 @@ func (p *ResultTypePlugin) handleConstructorCall(call *ast.CallExpr) {
143144}
144145
145146// transformOkConstructor transforms Ok(value) → Result_T_E{tag: ResultTag_Ok, ok_0: &value}
146- func (p * ResultTypePlugin ) transformOkConstructor (call * ast.CallExpr ) {
147+ // Returns the replacement node, or the original call if transformation fails
148+ func (p * ResultTypePlugin ) transformOkConstructor (call * ast.CallExpr ) ast.Expr {
147149 if len (call .Args ) != 1 {
148150 p .ctx .Logger .Warn ("Ok() expects exactly one argument, found %d" , len (call .Args ))
149- return
151+ return call // Return unchanged
150152 }
151153
152154 // Type inference: For now, use simple heuristics
@@ -166,20 +168,37 @@ func (p *ResultTypePlugin) transformOkConstructor(call *ast.CallExpr) {
166168 p .emittedTypes [resultTypeName ] = true
167169 }
168170
169- // Transform the call to a struct literal
170- // Ok(value) → Result_T_E{tag: ResultTag_Ok, ok_0: &value}
171+ // Log transformation
171172 p .ctx .Logger .Debug ("Transforming Ok(%s) → %s{tag: ResultTag_Ok, ok_0: &value}" , okType , resultTypeName )
172173
173- // Note: Actual AST transformation would happen here
174- // For now, we log the transformation for testing
175- // The actual replacement would be done in a Transform() method
174+ // Create the replacement CompositeLit
175+ // Ok(value) → Result_T_E{tag: ResultTag_Ok, ok_0: &value}
176+ replacement := & ast.CompositeLit {
177+ Type : ast .NewIdent (resultTypeName ),
178+ Elts : []ast.Expr {
179+ & ast.KeyValueExpr {
180+ Key : ast .NewIdent ("tag" ),
181+ Value : ast .NewIdent ("ResultTag_Ok" ),
182+ },
183+ & ast.KeyValueExpr {
184+ Key : ast .NewIdent ("ok_0" ),
185+ Value : & ast.UnaryExpr {
186+ Op : token .AND ,
187+ X : valueArg , // Use original argument expression
188+ },
189+ },
190+ },
191+ }
192+
193+ return replacement
176194}
177195
178196// transformErrConstructor transforms Err(error) → Result_T_E{tag: ResultTag_Err, err_0: &error}
179- func (p * ResultTypePlugin ) transformErrConstructor (call * ast.CallExpr ) {
197+ // Returns the replacement node, or the original call if transformation fails
198+ func (p * ResultTypePlugin ) transformErrConstructor (call * ast.CallExpr ) ast.Expr {
180199 if len (call .Args ) != 1 {
181200 p .ctx .Logger .Warn ("Err() expects exactly one argument, found %d" , len (call .Args ))
182- return
201+ return call // Return unchanged
183202 }
184203
185204 // Type inference: For Err, we need context to determine T
@@ -203,11 +222,29 @@ func (p *ResultTypePlugin) transformErrConstructor(call *ast.CallExpr) {
203222 p .emittedTypes [resultTypeName ] = true
204223 }
205224
206- // Transform the call to a struct literal
207- // Err(error) → Result_T_E{tag: ResultTag_Err, err_0: &error}
225+ // Log transformation
208226 p .ctx .Logger .Debug ("Transforming Err(%s) → %s{tag: ResultTag_Err, err_0: &value}" , errType , resultTypeName )
209227
210- // Note: Actual AST transformation would happen here
228+ // Create the replacement CompositeLit
229+ // Err(error) → Result_T_E{tag: ResultTag_Err, err_0: &error}
230+ replacement := & ast.CompositeLit {
231+ Type : ast .NewIdent (resultTypeName ),
232+ Elts : []ast.Expr {
233+ & ast.KeyValueExpr {
234+ Key : ast .NewIdent ("tag" ),
235+ Value : ast .NewIdent ("ResultTag_Err" ),
236+ },
237+ & ast.KeyValueExpr {
238+ Key : ast .NewIdent ("err_0" ),
239+ Value : & ast.UnaryExpr {
240+ Op : token .AND ,
241+ X : errorArg , // Use original argument expression
242+ },
243+ },
244+ },
245+ }
246+
247+ return replacement
211248}
212249
213250// inferTypeFromExpr infers the type of an expression
0 commit comments