@@ -61,7 +61,6 @@ public IEnumerable<Token> GetOpenBracesInCommandElements()
6161 return GetBraceInCommandElement ( TokenKind . LCurly ) ;
6262 }
6363
64-
6564 /// <summary>
6665 /// Return tokens of kind RCurly that end a scriptblock expression in an command element.
6766 ///
@@ -74,6 +73,44 @@ public IEnumerable<Token> GetCloseBracesInCommandElements()
7473 return GetBraceInCommandElement ( TokenKind . RCurly ) ;
7574 }
7675
76+ /// <summary>
77+ /// Returns pairs of associatd braces.
78+ /// </summary>
79+ /// <returns>Tuples of tokens such that item1 is LCurly token and item2 is RCurly token.</returns>
80+ public IEnumerable < Tuple < Token , Token > > GetBracePairs ( )
81+ {
82+ var openBraceStack = new Stack < Token > ( ) ;
83+ foreach ( var token in tokens )
84+ {
85+ if ( token . Kind == TokenKind . LCurly )
86+ {
87+ openBraceStack . Push ( token ) ;
88+ continue ;
89+ }
90+
91+ if ( token . Kind == TokenKind . RCurly
92+ && openBraceStack . Count > 0 )
93+ {
94+ yield return new Tuple < Token , Token > ( openBraceStack . Pop ( ) , token ) ;
95+ }
96+ }
97+ }
98+
99+ /// <summary>
100+ /// Returns brace pairs that are on the same line.
101+ /// </summary>
102+ /// <returns>Tuples of tokens such that item1 is LCurly token and item2 is RCurly token.</returns>
103+ public IEnumerable < Tuple < Token , Token > > GetBracePairsOnSameLine ( )
104+ {
105+ foreach ( var bracePair in GetBracePairs ( ) )
106+ {
107+ if ( bracePair . Item1 . Extent . StartLineNumber == bracePair . Item2 . Extent . StartLineNumber )
108+ {
109+ yield return bracePair ;
110+ }
111+ }
112+ }
113+
77114 private IEnumerable < Token > GetBraceInCommandElement ( TokenKind tokenKind )
78115 {
79116 var cmdElemAsts = ast . FindAll ( x => x is CommandElementAst && x is ScriptBlockExpressionAst , true ) ;
@@ -110,6 +147,86 @@ private IEnumerable<Token> GetBraceInCommandElement(TokenKind tokenKind)
110147 }
111148 }
112149
150+ public IEnumerable < Token > GetCloseBraceInOneLineIfStatement ( )
151+ {
152+ return GetBraceInOneLineIfStatment ( TokenKind . RCurly ) ;
153+ }
154+
155+ public IEnumerable < Token > GetOpenBraceInOneLineIfStatement ( )
156+ {
157+ return GetBraceInOneLineIfStatment ( TokenKind . LCurly ) ;
158+ }
159+
160+ // TODO Fix code duplication in the following method and GetBraceInCommandElement
161+ private IEnumerable < Token > GetBraceInOneLineIfStatment ( TokenKind tokenKind )
162+ {
163+ var ifStatementAsts = ast . FindAll ( ast =>
164+ {
165+ var ifAst = ast as IfStatementAst ;
166+ if ( ifAst == null )
167+ {
168+ return false ;
169+ }
170+
171+ return ifAst . Extent . StartLineNumber == ifAst . Extent . EndLineNumber ;
172+ } ,
173+ true ) ;
174+
175+ if ( ifStatementAsts == null )
176+ {
177+ yield break ;
178+ }
179+
180+ var braceTokens = new List < Token > ( ) ;
181+ foreach ( var ast in ifStatementAsts )
182+ {
183+ var ifStatementAst = ast as IfStatementAst ;
184+ foreach ( var clause in ifStatementAst . Clauses )
185+ {
186+ var tokenIf
187+ = tokenKind == TokenKind . LCurly
188+ ? GetTokens ( clause . Item2 ) . FirstOrDefault ( )
189+ : GetTokens ( clause . Item2 ) . LastOrDefault ( ) ;
190+ if ( tokenIf != null )
191+ {
192+ yield return tokenIf ;
193+ }
194+ }
195+
196+ if ( ifStatementAst . ElseClause == null )
197+ {
198+ continue ;
199+ }
200+
201+ var tokenElse
202+ = tokenKind == TokenKind . LCurly
203+ ? GetTokens ( ifStatementAst . ElseClause ) . FirstOrDefault ( )
204+ : GetTokens ( ifStatementAst . ElseClause ) . LastOrDefault ( ) ;
205+ if ( tokenElse != null )
206+ {
207+ yield return tokenElse ;
208+ }
209+ }
210+ }
211+
212+ private IEnumerable < Token > GetTokens ( Ast ast )
213+ {
214+ int k = 0 ;
215+ while ( k < tokens . Length && tokens [ k ] . Extent . EndOffset <= ast . Extent . StartOffset )
216+ {
217+ k ++ ;
218+ }
219+
220+ while ( k < tokens . Length && tokens [ k ] . Extent . EndOffset <= ast . Extent . EndOffset )
221+ {
222+ var token = tokens [ k ++ ] ;
223+ if ( token . Extent . StartOffset >= ast . Extent . StartOffset )
224+ {
225+ yield return token ;
226+ }
227+ }
228+ }
229+
113230 public IEnumerable < LinkedListNode < Token > > GetTokenNodes ( TokenKind kind )
114231 {
115232 return GetTokenNodes ( ( token ) => token . Kind == kind ) ;
0 commit comments