OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * Assigns JavaScript identifiers to Dart variables, class-names and members. | 6 * Assigns JavaScript identifiers to Dart variables, class-names and members. |
7 */ | 7 */ |
8 class Namer { | 8 class Namer { |
9 final Compiler compiler; | 9 final Compiler compiler; |
10 | 10 |
11 static Set<String> _jsReserved = null; | 11 static Set<String> _jsReserved = null; |
12 Set<String> get jsReserved { | 12 Set<String> get jsReserved { |
13 if (_jsReserved === null) { | 13 if (_jsReserved === null) { |
14 _jsReserved = new Set<String>(); | 14 _jsReserved = new Set<String>(); |
15 _jsReserved.addAll(JsNames.javaScriptKeywords); | 15 _jsReserved.addAll(JsNames.javaScriptKeywords); |
16 _jsReserved.addAll(JsNames.reservedPropertySymbols); | 16 _jsReserved.addAll(JsNames.reservedPropertySymbols); |
17 } | 17 } |
18 return _jsReserved; | 18 return _jsReserved; |
19 } | 19 } |
20 | 20 |
21 final Map<Element, String> globals; | 21 Map<Element, String> globals; |
22 final Map<String, int> usedGlobals; | 22 Map<String, int> usedGlobals; |
23 final Map<String, LibraryElement> shortPrivateNameOwners; | 23 Map<String, LibraryElement> shortPrivateNameOwners; |
24 | |
25 final Map<Constant, String> constantNames; | |
26 | 24 |
27 Namer(this.compiler) | 25 Namer(this.compiler) |
28 : globals = new Map<Element, String>(), | 26 : globals = new Map<Element, String>(), |
29 usedGlobals = new Map<String, int>(), | 27 usedGlobals = new Map<String, int>(), |
30 shortPrivateNameOwners = new Map<String, LibraryElement>(), | 28 shortPrivateNameOwners = new Map<String, LibraryElement>(); |
31 constantNames = new Map<Constant, String>(); | |
32 | 29 |
33 final String CURRENT_ISOLATE = @'$'; | 30 final String CURRENT_ISOLATE = @'$'; |
34 final String ISOLATE = 'Isolate'; | 31 final String ISOLATE = 'Isolate'; |
35 final String ISOLATE_PROPERTIES = @"$isolateProperties"; | 32 final String ISOLATE_PROPERTIES = @"$isolateProperties"; |
36 /** Some closures must contain their name. The name is stored in | 33 /** Some closures must contain their name. The name is stored in |
37 * [STATIC_CLOSURE_NAME_NAME]. */ | 34 * [STATIC_CLOSURE_NAME_NAME]. */ |
38 final String STATIC_CLOSURE_NAME_NAME = @'$name'; | 35 final String STATIC_CLOSURE_NAME_NAME = @'$name'; |
39 static const SourceString CLOSURE_INVOCATION_NAME = | 36 static const SourceString CLOSURE_INVOCATION_NAME = |
40 Compiler.CALL_OPERATOR_NAME; | 37 Compiler.CALL_OPERATOR_NAME; |
41 | 38 |
42 String constantName(Constant constant) { | |
43 // In the current implementation it doesn't make sense to give names to | |
44 // function constants since the function-implementation itself serves as | |
45 // constant and can be accessed directly. | |
46 assert(!constant.isFunction()); | |
47 String result = constantNames[constant]; | |
48 if (result === null) { | |
49 result = getFreshGlobalName("CTC"); | |
50 constantNames[constant] = result; | |
51 } | |
52 return result; | |
53 } | |
54 | 39 |
55 String closureInvocationName(Selector selector) { | 40 String closureInvocationName(Selector selector) { |
56 // TODO(floitsch): mangle, while not conflicting with instance names. | 41 // TODO(floitsch): mangle, while not conflicting with instance names. |
57 return instanceMethodInvocationName(null, CLOSURE_INVOCATION_NAME, | 42 return instanceMethodInvocationName(null, CLOSURE_INVOCATION_NAME, |
58 selector); | 43 selector); |
59 } | 44 } |
60 | 45 |
61 String breakLabelName(LabelElement label) { | 46 String breakLabelName(LabelElement label) { |
62 return '\$${label.labelName}\$${label.target.nestingLevel}'; | 47 return '\$${label.labelName}\$${label.target.nestingLevel}'; |
63 } | 48 } |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 } | 272 } |
288 | 273 |
289 String safeName(String name) { | 274 String safeName(String name) { |
290 if (jsReserved.contains(name) || name.startsWith('\$')) { | 275 if (jsReserved.contains(name) || name.startsWith('\$')) { |
291 name = "\$$name"; | 276 name = "\$$name"; |
292 assert(!jsReserved.contains(name)); | 277 assert(!jsReserved.contains(name)); |
293 } | 278 } |
294 return name; | 279 return name; |
295 } | 280 } |
296 } | 281 } |
OLD | NEW |