@@ -61,7 +61,6 @@ public IEnumerable<Token> GetOpenBracesInCommandElements()
61
61
return GetBraceInCommandElement ( TokenKind . LCurly ) ;
62
62
}
63
63
64
-
65
64
/// <summary>
66
65
/// Return tokens of kind RCurly that end a scriptblock expression in an command element.
67
66
///
@@ -74,6 +73,44 @@ public IEnumerable<Token> GetCloseBracesInCommandElements()
74
73
return GetBraceInCommandElement ( TokenKind . RCurly ) ;
75
74
}
76
75
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
+
77
114
private IEnumerable < Token > GetBraceInCommandElement ( TokenKind tokenKind )
78
115
{
79
116
var cmdElemAsts = ast . FindAll ( x => x is CommandElementAst && x is ScriptBlockExpressionAst , true ) ;
@@ -110,6 +147,86 @@ private IEnumerable<Token> GetBraceInCommandElement(TokenKind tokenKind)
110
147
}
111
148
}
112
149
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
+
113
230
public IEnumerable < LinkedListNode < Token > > GetTokenNodes ( TokenKind kind )
114
231
{
115
232
return GetTokenNodes ( ( token ) => token . Kind == kind ) ;
0 commit comments