private static Node parseTraitValueBody(IdlModelLoader loader, SourceLocation location) {
        IdlInternalTokenizer tokenizer = loader.getTokenizer();
        tokenizer.expect(IdlToken.LBRACE,
                IdlToken.LBRACKET,
                IdlToken.TEXT_BLOCK,
                IdlToken.STRING,
                IdlToken.NUMBER,
                IdlToken.IDENTIFIER);

        switch (tokenizer.getCurrentToken()) {
            case LBRACE:
            case LBRACKET:
                Node result = IdlNodeParser.expectAndSkipNode(loader, location);
                tokenizer.skipWsAndDocs();
                return result;
            case TEXT_BLOCK:
                Node textBlockResult = new StringNode(tokenizer.getCurrentTokenStringSlice().toString(), location);
                tokenizer.next();
                tokenizer.skipWsAndDocs();
                return textBlockResult;
            case NUMBER:
                Number number = tokenizer.getCurrentTokenNumberValue();
                tokenizer.next();
                tokenizer.skipWsAndDocs();
                return new NumberNode(number, location);
            case STRING:
                String stringValue = tokenizer.getCurrentTokenStringSlice().toString();
                StringNode stringNode = new StringNode(stringValue, location);
                tokenizer.next();
                tokenizer.skipWsAndDocs();
                if (tokenizer.getCurrentToken() == IdlToken.COLON) {
                    tokenizer.next();
                    tokenizer.skipWsAndDocs();
                    return parseStructuredTrait(loader, stringNode);
                } else {
                    return stringNode;
                }
            case IDENTIFIER:
            default:
                // Handle: `foo`, `foo$bar`, `foo.bar#baz`, `foo.bar#baz$bam`, `foo: bam`
                String identifier = loader.internString(IdlShapeIdParser.expectAndSkipShapeId(tokenizer));
                tokenizer.skipWsAndDocs();
                if (tokenizer.getCurrentToken() == IdlToken.RPAREN || isItDefinitelyShapeId(identifier)) {
                    return IdlNodeParser.createIdentifier(loader, identifier, location);
                } else {
                    tokenizer.expect(IdlToken.COLON);
                    tokenizer.next();
                    tokenizer.skipWsAndDocs();
                    return parseStructuredTrait(loader, new StringNode(identifier, location));
                }
        }
    }
Parses a single trait: "@" trait-id [(trait-body)].

@param loader   IDL parser.
@return Returns the parsed trait.
smithy-model/src/main/java/software/amazon/smithy/model/loader/IdlTraitParser.java