Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: pkg/kernel/lib/core_types.dart

Issue 2712983002: Add LookupTable class for finding classes and members by name.
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/kernel/lib/lookup_table.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/kernel/lib/lookup_table.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698