diff --git a/smithy-syntax/src/main/java/software/amazon/smithy/syntax/Formatter.java b/smithy-syntax/src/main/java/software/amazon/smithy/syntax/Formatter.java index 67b93af3188..a8ee673cd1b 100644 --- a/smithy-syntax/src/main/java/software/amazon/smithy/syntax/Formatter.java +++ b/smithy-syntax/src/main/java/software/amazon/smithy/syntax/Formatter.java @@ -365,23 +365,28 @@ private Doc visit(TreeCursor cursor) { }) .build(); } else { - // Check the inner trait node for hard line breaks rather than the wrapper. - TreeCursor traitNode = cursor - .getFirstChild(TreeType.TRAIT_NODE) - .getFirstChild(TreeType.NODE_VALUE) - .getFirstChild(); // The actual node value. - return new BracketBuilder() - .open(Doc.text("(")) - .close(Doc.text(")")) - .extractChildren(cursor, traitNode, child -> { - if (child.getTree().getType() == TreeType.TRAIT_NODE) { - // Split WS and NODE_VALUE so that they appear on different lines. - return child.getChildrenByType(TreeType.NODE_VALUE, TreeType.WS).stream(); - } else { - return Stream.empty(); - } - }) - .build(); + if (cursor.getFirstChild(TreeType.TRAIT_NODE) != null) { + // Check the inner trait node for hard line breaks rather than the wrapper. + TreeCursor traitNode = cursor + .getFirstChild(TreeType.TRAIT_NODE) + .getFirstChild(TreeType.NODE_VALUE) + .getFirstChild(); // The actual node value. + return new BracketBuilder() + .open(Doc.text("(")) + .close(Doc.text(")")) + .extractChildren(cursor, traitNode, child -> { + if (child.getTree().getType() == TreeType.TRAIT_NODE) { + // Split WS and NODE_VALUE so that they appear on different lines. + return child.getChildrenByType(TreeType.NODE_VALUE, TreeType.WS).stream(); + } else { + return Stream.empty(); + } + }) + .build(); + } else { + // If the trait node is empty, remove the empty parentheses. + return Doc.text(""); + } } } diff --git a/smithy-syntax/src/test/resources/software/amazon/smithy/syntax/formatter/null-trait-body.formatted.smithy b/smithy-syntax/src/test/resources/software/amazon/smithy/syntax/formatter/null-trait-body.formatted.smithy new file mode 100644 index 00000000000..96bebad04cb --- /dev/null +++ b/smithy-syntax/src/test/resources/software/amazon/smithy/syntax/formatter/null-trait-body.formatted.smithy @@ -0,0 +1,17 @@ +$version: "2.0" + +namespace smithy.example + +structure Struct { + @default + a: String + + @default + b: String + + @default + c: String + + @default(null) + d: String +} diff --git a/smithy-syntax/src/test/resources/software/amazon/smithy/syntax/formatter/null-trait-body.smithy b/smithy-syntax/src/test/resources/software/amazon/smithy/syntax/formatter/null-trait-body.smithy new file mode 100644 index 00000000000..75e6ebf59ab --- /dev/null +++ b/smithy-syntax/src/test/resources/software/amazon/smithy/syntax/formatter/null-trait-body.smithy @@ -0,0 +1,17 @@ +$version: "2.0" + +namespace smithy.example + +structure Struct { + @default + a: String + + @default() + b: String + + @default( ) + c: String + + @default(null) + d: String +}