11import * as AST from "./ast.js" ;
22
3- function indent ( content : string ) : string {
3+ function indentExceptFirstLine ( content : string ) : string {
44 return content . split ( "\n" ) . join ( "\n " ) ;
55}
66
@@ -13,6 +13,29 @@ function isSelectExpr(elem: AST.PatternElement): boolean {
1313 && elem . expression instanceof AST . SelectExpression ;
1414}
1515
16+ function shouldStartOnNewLine ( pattern : AST . Pattern ) : boolean {
17+ const isMultiline =
18+ pattern . elements . some ( isSelectExpr ) ||
19+ pattern . elements . some ( includesNewLine ) ;
20+
21+ if ( isMultiline ) {
22+ const firstElement = pattern . elements [ 0 ] ;
23+ if ( firstElement instanceof AST . TextElement ) {
24+ const firstChar = firstElement . value [ 0 ] ;
25+ // Due to the indentation requirement these text characters may not appear
26+ // as the first character on a new line.
27+ if ( firstChar === "[" || firstChar === "." || firstChar === "*" ) {
28+ return false ;
29+ }
30+ }
31+
32+ return true ;
33+ }
34+
35+ return false ;
36+ }
37+
38+
1639// Bit masks representing the state of the serializer.
1740export const HAS_ENTRIES = 1 ;
1841
@@ -136,22 +159,19 @@ function serializeTerm(term: AST.Term): string {
136159
137160
138161function serializeAttribute ( attribute : AST . Attribute ) : string {
139- const value = indent ( serializePattern ( attribute . value ) ) ;
162+ const value = indentExceptFirstLine ( serializePattern ( attribute . value ) ) ;
140163 return `\n .${ attribute . id . name } =${ value } ` ;
141164}
142165
143166
144167function serializePattern ( pattern : AST . Pattern ) : string {
145168 const content = pattern . elements . map ( serializeElement ) . join ( "" ) ;
146- const startOnNewLine =
147- pattern . elements . some ( isSelectExpr ) ||
148- pattern . elements . some ( includesNewLine ) ;
149169
150- if ( startOnNewLine ) {
151- return `\n ${ indent ( content ) } ` ;
170+ if ( shouldStartOnNewLine ( pattern ) ) {
171+ return `\n ${ indentExceptFirstLine ( content ) } ` ;
152172 }
153173
154- return ` ${ content } ` ;
174+ return ` ${ indentExceptFirstLine ( content ) } ` ;
155175}
156176
157177
@@ -228,7 +248,7 @@ export function serializeExpression(expr: AST.Expression): string {
228248
229249function serializeVariant ( variant : AST . Variant ) : string {
230250 const key = serializeVariantKey ( variant . key ) ;
231- const value = indent ( serializePattern ( variant . value ) ) ;
251+ const value = indentExceptFirstLine ( serializePattern ( variant . value ) ) ;
232252
233253 if ( variant . default ) {
234254 return `\n *[${ key } ]${ value } ` ;
0 commit comments