|
1 | 1 | ///<reference path='services.ts' />
|
2 | 2 | /* @internal */
|
3 | 3 | namespace ts.SignatureHelp {
|
4 |
| - |
5 |
| - // A partially written generic type expression is not guaranteed to have the correct syntax tree. the expression could be parsed as less than/greater than expression or a comma expression |
6 |
| - // or some other combination depending on what the user has typed so far. For the purposes of signature help we need to consider any location after "<" as a possible generic type reference. |
7 |
| - // To do this, the method will back parse the expression starting at the position required. it will try to parse the current expression as a generic type expression, if it did succeed it |
8 |
| - // will return the generic identifier that started the expression (e.g. "foo" in "foo<any, |"). It is then up to the caller to ensure that this is a valid generic expression through |
9 |
| - // looking up the type. The method will also keep track of the parameter index inside the expression. |
10 |
| - // public static isInPartiallyWrittenTypeArgumentList(syntaxTree: TypeScript.SyntaxTree, position: number): any { |
11 |
| - // let token = Syntax.findTokenOnLeft(syntaxTree.sourceUnit(), position, /*includeSkippedTokens*/ true); |
12 |
| - |
13 |
| - // if (token && TypeScript.Syntax.hasAncestorOfKind(token, TypeScript.SyntaxKind.TypeParameterList)) { |
14 |
| - // // We are in the wrong generic list. bail out |
15 |
| - // return null; |
16 |
| - // } |
17 |
| - |
18 |
| - // let stack = 0; |
19 |
| - // let argumentIndex = 0; |
20 |
| - |
21 |
| - // whileLoop: |
22 |
| - // while (token) { |
23 |
| - // switch (token.kind()) { |
24 |
| - // case TypeScript.SyntaxKind.LessThanToken: |
25 |
| - // if (stack === 0) { |
26 |
| - // // Found the beginning of the generic argument expression |
27 |
| - // let lessThanToken = token; |
28 |
| - // token = previousToken(token, /*includeSkippedTokens*/ true); |
29 |
| - // if (!token || token.kind() !== TypeScript.SyntaxKind.IdentifierName) { |
30 |
| - // break whileLoop; |
31 |
| - // } |
32 |
| - |
33 |
| - // // Found the name, return the data |
34 |
| - // return { |
35 |
| - // genericIdentifer: token, |
36 |
| - // lessThanToken: lessThanToken, |
37 |
| - // argumentIndex: argumentIndex |
38 |
| - // }; |
39 |
| - // } |
40 |
| - // else if (stack < 0) { |
41 |
| - // // Seen one too many less than tokens, bail out |
42 |
| - // break whileLoop; |
43 |
| - // } |
44 |
| - // else { |
45 |
| - // stack--; |
46 |
| - // } |
47 |
| - |
48 |
| - // break; |
49 |
| - |
50 |
| - // case TypeScript.SyntaxKind.GreaterThanGreaterThanGreaterThanToken: |
51 |
| - // stack++; |
52 |
| - |
53 |
| - // // Intentional fall through |
54 |
| - // case TypeScript.SyntaxKind.GreaterThanToken: |
55 |
| - // stack++; |
56 |
| - // break; |
57 |
| - |
58 |
| - // case TypeScript.SyntaxKind.CommaToken: |
59 |
| - // if (stack === 0) { |
60 |
| - // argumentIndex++; |
61 |
| - // } |
62 |
| - |
63 |
| - // break; |
64 |
| - |
65 |
| - // case TypeScript.SyntaxKind.CloseBraceToken: |
66 |
| - // // This can be object type, skip untill we find the matching open brace token |
67 |
| - // let unmatchedOpenBraceTokens = 0; |
68 |
| - |
69 |
| - // // Skip untill the matching open brace token |
70 |
| - // token = SignatureInfoHelpers.moveBackUpTillMatchingTokenKind(token, TypeScript.SyntaxKind.CloseBraceToken, TypeScript.SyntaxKind.OpenBraceToken); |
71 |
| - // if (!token) { |
72 |
| - // // No matching token was found. bail out |
73 |
| - // break whileLoop; |
74 |
| - // } |
75 |
| - |
76 |
| - // break; |
77 |
| - |
78 |
| - // case TypeScript.SyntaxKind.EqualsGreaterThanToken: |
79 |
| - // // This can be a function type or a constructor type. In either case, we want to skip the function definition |
80 |
| - // token = previousToken(token, /*includeSkippedTokens*/ true); |
81 |
| - |
82 |
| - // if (token && token.kind() === TypeScript.SyntaxKind.CloseParenToken) { |
83 |
| - // // Skip untill the matching open paren token |
84 |
| - // token = SignatureInfoHelpers.moveBackUpTillMatchingTokenKind(token, TypeScript.SyntaxKind.CloseParenToken, TypeScript.SyntaxKind.OpenParenToken); |
85 |
| - |
86 |
| - // if (token && token.kind() === TypeScript.SyntaxKind.GreaterThanToken) { |
87 |
| - // // Another generic type argument list, skip it\ |
88 |
| - // token = SignatureInfoHelpers.moveBackUpTillMatchingTokenKind(token, TypeScript.SyntaxKind.GreaterThanToken, TypeScript.SyntaxKind.LessThanToken); |
89 |
| - // } |
90 |
| - |
91 |
| - // if (token && token.kind() === TypeScript.SyntaxKind.NewKeyword) { |
92 |
| - // // In case this was a constructor type, skip the new keyword |
93 |
| - // token = previousToken(token, /*includeSkippedTokens*/ true); |
94 |
| - // } |
95 |
| - |
96 |
| - // if (!token) { |
97 |
| - // // No matching token was found. bail out |
98 |
| - // break whileLoop; |
99 |
| - // } |
100 |
| - // } |
101 |
| - // else { |
102 |
| - // // This is not a function type. exit the main loop |
103 |
| - // break whileLoop; |
104 |
| - // } |
105 |
| - |
106 |
| - // break; |
107 |
| - |
108 |
| - // case TypeScript.SyntaxKind.IdentifierName: |
109 |
| - // case TypeScript.SyntaxKind.AnyKeyword: |
110 |
| - // case TypeScript.SyntaxKind.NumberKeyword: |
111 |
| - // case TypeScript.SyntaxKind.StringKeyword: |
112 |
| - // case TypeScript.SyntaxKind.VoidKeyword: |
113 |
| - // case TypeScript.SyntaxKind.BooleanKeyword: |
114 |
| - // case TypeScript.SyntaxKind.DotToken: |
115 |
| - // case TypeScript.SyntaxKind.OpenBracketToken: |
116 |
| - // case TypeScript.SyntaxKind.CloseBracketToken: |
117 |
| - // // Valid tokens in a type name. Skip. |
118 |
| - // break; |
119 |
| - |
120 |
| - // default: |
121 |
| - // break whileLoop; |
122 |
| - // } |
123 |
| - |
124 |
| - // token = previousToken(token, /*includeSkippedTokens*/ true); |
125 |
| - // } |
126 |
| - |
127 |
| - // return null; |
128 |
| - // } |
129 |
| - |
130 |
| - // private static moveBackUpTillMatchingTokenKind(token: TypeScript.ISyntaxToken, tokenKind: TypeScript.SyntaxKind, matchingTokenKind: TypeScript.SyntaxKind): TypeScript.ISyntaxToken { |
131 |
| - // if (!token || token.kind() !== tokenKind) { |
132 |
| - // throw TypeScript.Errors.invalidOperation(); |
133 |
| - // } |
134 |
| - |
135 |
| - // // Skip the current token |
136 |
| - // token = previousToken(token, /*includeSkippedTokens*/ true); |
137 |
| - |
138 |
| - // let stack = 0; |
139 |
| - |
140 |
| - // while (token) { |
141 |
| - // if (token.kind() === matchingTokenKind) { |
142 |
| - // if (stack === 0) { |
143 |
| - // // Found the matching token, return |
144 |
| - // return token; |
145 |
| - // } |
146 |
| - // else if (stack < 0) { |
147 |
| - // // tokens overlapped.. bail out. |
148 |
| - // break; |
149 |
| - // } |
150 |
| - // else { |
151 |
| - // stack--; |
152 |
| - // } |
153 |
| - // } |
154 |
| - // else if (token.kind() === tokenKind) { |
155 |
| - // stack++; |
156 |
| - // } |
157 |
| - |
158 |
| - // // Move back |
159 |
| - // token = previousToken(token, /*includeSkippedTokens*/ true); |
160 |
| - // } |
161 |
| - |
162 |
| - // // Did not find matching token |
163 |
| - // return null; |
164 |
| - // } |
165 |
| - |
166 | 4 | const emptyArray: any[] = [];
|
167 | 5 |
|
168 | 6 | export const enum ArgumentListKind {
|
|
0 commit comments