11static class SqlFormatter
22{
3+ static readonly FormattedScriptGenerator generator = new ( ) ;
4+
35 public static StringBuilder Format ( string input )
46 {
57 var parser = new TSql170Parser ( false ) ;
@@ -23,112 +25,15 @@ Failed to parse sql.
2325 var visitor = new RemoveSquareBracketVisitor ( ) ;
2426 fragment . Accept ( visitor ) ;
2527
26- var generator = new Sql170ScriptGenerator (
27- new ( )
28- {
29- SqlVersion = SqlVersion . Sql170 ,
30- KeywordCasing = KeywordCasing . Lowercase ,
31- IndentationSize = 2 ,
32- AlignClauseBodies = true
33- } ) ;
34-
35- var builder = new StringBuilder ( ) ;
36- using ( var writer = new StringWriter ( builder , CultureInfo . InvariantCulture ) )
37- {
38- generator . GenerateScript ( fragment , writer ) ;
39- }
28+ var script = generator . GenerateScript ( fragment ) ;
4029
30+ var builder = new StringBuilder ( script ) ;
4131 builder . TrimEnd ( ) ;
4232 if ( builder [ ^ 1 ] == ';' )
4333 {
4434 builder . Length -- ;
4535 }
4636
47- FormatOrderBy ( builder ) ;
48-
4937 return builder ;
5038 }
51-
52- static void FormatOrderBy ( StringBuilder builder )
53- {
54- var text = builder . ToString ( ) ;
55- builder . Clear ( ) ;
56-
57- using var lineReader = new StringReader ( text ) ;
58- string ? line ;
59- var first = true ;
60-
61- while ( ( line = lineReader . ReadLine ( ) ) != null )
62- {
63- if ( ! first )
64- {
65- builder . Append ( '\n ' ) ;
66- }
67-
68- first = false ;
69-
70- var trimmed = line . TrimStart ( ) ;
71- if ( trimmed . StartsWith ( "order by " ) && trimmed . Contains ( ',' ) )
72- {
73- var leadingSpaces = line . Length - trimmed . Length ;
74- var prefix = new string ( ' ' , leadingSpaces ) + "order by " ;
75- var columns = trimmed [ "order by " . Length ..] ;
76- var items = SplitRespectingParens ( columns ) ;
77-
78- if ( items . Count > 1 )
79- {
80- var pad = new string ( ' ' , prefix . Length ) ;
81- for ( var j = 0 ; j < items . Count ; j ++ )
82- {
83- if ( j > 0 )
84- {
85- builder . Append ( '\n ' ) ;
86- builder . Append ( pad ) ;
87- }
88- else
89- {
90- builder . Append ( prefix ) ;
91- }
92-
93- builder . Append ( items [ j ] . Trim ( ) ) ;
94- if ( j < items . Count - 1 )
95- {
96- builder . Append ( ',' ) ;
97- }
98- }
99-
100- continue ;
101- }
102- }
103-
104- builder . Append ( line ) ;
105- }
106- }
107-
108- static List < string > SplitRespectingParens ( string input )
109- {
110- var items = new List < string > ( ) ;
111- var depth = 0 ;
112- var start = 0 ;
113-
114- for ( var i = 0 ; i < input . Length ; i ++ )
115- {
116- switch ( input [ i ] )
117- {
118- case '(' :
119- depth ++ ;
120- break ;
121- case ')' :
122- depth -- ;
123- break ;
124- case ',' when depth == 0 :
125- items . Add ( input [ start ..i ] ) ;
126- start = i + 1 ;
127- break ;
128- }
129- }
130-
131- items . Add ( input [ start ..] ) ;
132- return items ;
133- }
134- }
39+ }
0 commit comments