|
6 | 6 | module |
7 | 7 |
|
8 | 8 | public import Strata.DDM.AST |
| 9 | +import Strata.DDM.Ion |
9 | 10 | import Strata.DDM.Integration.Categories |
10 | 11 |
|
11 | 12 | namespace Strata.Java |
@@ -137,13 +138,7 @@ def argDeclKindToJavaType : ArgDeclKind → JavaType |
137 | 138 |
|
138 | 139 | /-- Get Ion separator name for a list category, or none if not a list. -/ |
139 | 140 | def getSeparator (c : SyntaxCat) : Option String := |
140 | | - match c.name with |
141 | | - | q`Init.Seq => some "seq" |
142 | | - | q`Init.CommaSepBy => some "commaSepList" |
143 | | - | q`Init.NewlineSepBy => some "newlineSepList" |
144 | | - | q`Init.SpaceSepBy => some "spaceSepList" |
145 | | - | q`Init.SpacePrefixSepBy => some "spacePrefixedList" |
146 | | - | _ => none |
| 141 | + SepFormat.fromCategoryName? c.name |>.map SepFormat.toIonName |
147 | 142 |
|
148 | 143 | /-- Extract the QualifiedIdent for categories that need Java interfaces, or none for primitives. -/ |
149 | 144 | partial def syntaxCatToQualifiedName (cat : SyntaxCat) : Option QualifiedIdent := |
@@ -322,15 +317,22 @@ def opDeclToJavaRecord (dialectName : String) (names : NameAssignments) (op : Op |
322 | 317 |
|
323 | 318 | def generateBuilders (package : String) (dialectName : String) (d : Dialect) (names : NameAssignments) : String := |
324 | 319 | let methods (op : OpDecl) := |
325 | | - let fields := op.argDecls.toArray.map argDeclToJavaField |
326 | | - let (ps, as, checks) := fields.foldl (init := (#[], #[], #[])) fun (ps, as, checks) f => |
327 | | - match f.type with |
328 | | - | .simple "java.math.BigInteger" _ => |
329 | | - (ps.push s!"long {f.name}", |
330 | | - as.push s!"java.math.BigInteger.valueOf({f.name})", |
331 | | - checks.push s!"if ({f.name} < 0) throw new IllegalArgumentException(\"{f.name} must be non-negative\");") |
332 | | - | .simple "java.math.BigDecimal" _ => (ps.push s!"double {f.name}", as.push s!"java.math.BigDecimal.valueOf({f.name})", checks) |
333 | | - | t => (ps.push s!"{t.toJava} {f.name}", as.push f.name, checks) |
| 320 | + let (ps, as, checks) := op.argDecls.toArray |
| 321 | + |>.foldl (init := (#[], #[], #[])) fun (ps, as, checks) decl => |
| 322 | + let name := escapeJavaName decl.ident |
| 323 | + let cat := decl.kind.categoryOf.name |
| 324 | + if cat == q`Init.Num then |
| 325 | + -- Long parameter must be non-negative. |
| 326 | + (ps.push s!"long {name}", |
| 327 | + as.push s!"java.math.BigInteger.valueOf({name})", |
| 328 | + checks.push s!"if ({name} < 0) throw new IllegalArgumentException(\"{name} must be non-negative\");") |
| 329 | + else if cat == q`Init.Decimal then |
| 330 | + (ps.push s!"double {name}", |
| 331 | + as.push s!"java.math.BigDecimal.valueOf({name})", |
| 332 | + checks) |
| 333 | + else |
| 334 | + let t := (argDeclKindToJavaType decl.kind).toJava |
| 335 | + (ps.push s!"{t} {name}", as.push name, checks) |
334 | 336 | let methodName := escapeJavaName op.name |
335 | 337 | let returnType := names.categories[op.category]! |
336 | 338 | let recordName := names.operators[(op.category, op.name)]! |
|
0 commit comments