OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library kernel.class_table; | 4 library kernel.core_types; |
5 | 5 |
6 import 'ast.dart'; | 6 import 'ast.dart'; |
| 7 import 'lookup_table.dart'; |
7 | 8 |
8 /// Provides access to the classes and libraries in the core libraries. | 9 /// Provides access to the classes and libraries in the core libraries. |
9 class CoreTypes { | 10 class CoreTypes extends LookupTable { |
10 final Map<String, _LibraryIndex> _dartLibraries = <String, _LibraryIndex>{}; | |
11 Class objectClass; | 11 Class objectClass; |
12 Class nullClass; | 12 Class nullClass; |
13 Class boolClass; | 13 Class boolClass; |
14 Class intClass; | 14 Class intClass; |
15 Class numClass; | 15 Class numClass; |
16 Class doubleClass; | 16 Class doubleClass; |
17 Class stringClass; | 17 Class stringClass; |
18 Class listClass; | 18 Class listClass; |
19 Class mapClass; | 19 Class mapClass; |
20 Class iterableClass; | 20 Class iterableClass; |
(...skipping 26 matching lines...) Expand all Loading... |
47 ], | 47 ], |
48 'dart:_internal': [ | 48 'dart:_internal': [ |
49 'Symbol', | 49 'Symbol', |
50 ], | 50 ], |
51 'dart:async': [ | 51 'dart:async': [ |
52 'Future', | 52 'Future', |
53 'Stream', | 53 'Stream', |
54 ] | 54 ] |
55 }; | 55 }; |
56 | 56 |
57 Library getCoreLibrary(String uri) => _dartLibraries[uri]?.library; | 57 CoreTypes(Program program) : super.coreLibraries(program) { |
58 | 58 objectClass = getClass('dart:core', 'Object'); |
59 Class getCoreClass(String libraryUri, String className) { | 59 nullClass = getClass('dart:core', 'Null'); |
60 return _dartLibraries[libraryUri].require(className); | 60 boolClass = getClass('dart:core', 'bool'); |
61 } | 61 intClass = getClass('dart:core', 'int'); |
62 | 62 numClass = getClass('dart:core', 'num'); |
63 Procedure getCoreProcedure(String libraryUri, String topLevelMemberName) { | 63 doubleClass = getClass('dart:core', 'double'); |
64 Library library = getCoreLibrary(libraryUri); | 64 stringClass = getClass('dart:core', 'String'); |
65 for (Procedure procedure in library.procedures) { | 65 listClass = getClass('dart:core', 'List'); |
66 if (procedure.name.name == topLevelMemberName) return procedure; | 66 mapClass = getClass('dart:core', 'Map'); |
67 } | 67 iterableClass = getClass('dart:core', 'Iterable'); |
68 throw 'Missing procedure ${topLevelMemberName} from $libraryUri'; | 68 iteratorClass = getClass('dart:core', 'Iterator'); |
69 } | 69 symbolClass = getClass('dart:core', 'Symbol'); |
70 | 70 typeClass = getClass('dart:core', 'Type'); |
71 CoreTypes(Program program) { | 71 functionClass = getClass('dart:core', 'Function'); |
72 for (var library in program.libraries) { | 72 invocationClass = getClass('dart:core', 'Invocation'); |
73 if (library.importUri.scheme == 'dart') { | 73 futureClass = getClass('dart:async', 'Future'); |
74 _dartLibraries['${library.importUri}'] = new _LibraryIndex(library); | 74 streamClass = getClass('dart:async', 'Stream'); |
75 } | 75 internalSymbolClass = getClass('dart:_internal', 'Symbol'); |
76 } | |
77 _LibraryIndex dartCore = _dartLibraries['dart:core']; | |
78 _LibraryIndex dartAsync = _dartLibraries['dart:async']; | |
79 _LibraryIndex dartInternal = _dartLibraries['dart:_internal']; | |
80 objectClass = dartCore.require('Object'); | |
81 nullClass = dartCore.require('Null'); | |
82 boolClass = dartCore.require('bool'); | |
83 intClass = dartCore.require('int'); | |
84 numClass = dartCore.require('num'); | |
85 doubleClass = dartCore.require('double'); | |
86 stringClass = dartCore.require('String'); | |
87 listClass = dartCore.require('List'); | |
88 mapClass = dartCore.require('Map'); | |
89 iterableClass = dartCore.require('Iterable'); | |
90 iteratorClass = dartCore.require('Iterator'); | |
91 symbolClass = dartCore.require('Symbol'); | |
92 typeClass = dartCore.require('Type'); | |
93 functionClass = dartCore.require('Function'); | |
94 invocationClass = dartCore.require('Invocation'); | |
95 futureClass = dartAsync.require('Future'); | |
96 streamClass = dartAsync.require('Stream'); | |
97 internalSymbolClass = dartInternal.require('Symbol'); | |
98 } | 76 } |
99 } | 77 } |
100 | |
101 /// Provides by-name lookup of classes in a library. | |
102 class _LibraryIndex { | |
103 final Library library; | |
104 final Map<String, Class> classes = <String, Class>{}; | |
105 | |
106 _LibraryIndex(this.library) { | |
107 for (Class classNode in library.classes) { | |
108 if (classNode.name != null) { | |
109 classes[classNode.name] = classNode; | |
110 } | |
111 } | |
112 } | |
113 | |
114 Class require(String name) { | |
115 Class result = classes[name]; | |
116 if (result == null) { | |
117 if (library.isExternal) { | |
118 throw 'Missing class $name from external library ${library.name}'; | |
119 } else { | |
120 throw 'Missing class $name from ${library.name}'; | |
121 } | |
122 } | |
123 return result; | |
124 } | |
125 } | |
OLD | NEW |