OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library fasta.analyzer.element_store; | |
6 | |
7 import 'package:kernel/analyzer/loader.dart' show | |
8 ReferenceLevelLoader; | |
9 | |
10 import 'package:kernel/ast.dart'; | |
11 | |
12 import 'package:analyzer/analyzer.dart' show | |
13 ParameterKind; | |
14 | |
15 import 'package:analyzer/analyzer.dart' as analyzer; | |
16 | |
17 import 'package:analyzer/dart/element/element.dart'; | |
18 | |
19 import 'package:analyzer/dart/element/type.dart' as analyzer; | |
20 | |
21 import '../errors.dart' show | |
22 internalError; | |
23 | |
24 import '../kernel/kernel_builder.dart'; | |
25 | |
26 import '../dill/dill_member_builder.dart'; | |
27 | |
28 import 'mock_element.dart'; | |
29 | |
30 import 'mock_type.dart'; | |
31 | |
32 abstract class ElementStore implements ReferenceLevelLoader { | |
33 Element operator[] (Builder builder); | |
34 | |
35 factory ElementStore( | |
36 LibraryBuilder coreLibrary, Map<Uri, LibraryBuilder> builders) = | |
37 ElementStoreImplementation; | |
38 } | |
39 | |
40 // ClassElement, | |
41 // ClassMemberElement, | |
42 // CompilationUnitElement, | |
43 // ConstructorElement, | |
44 // Element, | |
45 // FieldElement, | |
46 // FieldFormalParameterElement, | |
47 // FunctionElement, | |
48 // FunctionTypedElement, | |
49 // LibraryElement, | |
50 // LocalElement, | |
51 // LocalVariableElement, | |
52 // MethodElement, | |
53 // ParameterElement, | |
54 // PrefixElement, | |
55 // PropertyAccessorElement, | |
56 // TopLevelVariableElement, | |
57 // TypeParameterElement, | |
58 // VariableElement; | |
59 class ElementStoreImplementation implements ElementStore { | |
60 final LibraryBuilder coreLibrary; | |
61 | |
62 final Map<Builder, Element> elements; | |
63 | |
64 ElementStoreImplementation.internal(this.coreLibrary, this.elements); | |
65 | |
66 Element operator[] (Builder builder) { | |
67 // Avoid storing local elements in the element store to reduce memory | |
68 // usage. So they both implement [Element] and [Builder]. | |
69 return builder is Element ? builder : elements[builder]; | |
70 } | |
71 | |
72 factory ElementStoreImplementation( | |
73 LibraryBuilder coreLibrary, Map<Uri, LibraryBuilder> libraries) { | |
74 Map<Builder, Element> elements = <Builder, Element>{}; | |
75 libraries.forEach((Uri uri, LibraryBuilder library) { | |
76 KernelCompilationUnitElement unit = | |
77 new KernelCompilationUnitElement(library); | |
78 KernelLibraryElement element = new KernelLibraryElement(unit); | |
79 elements[library] = element; | |
80 unit.library = element; | |
81 library.members.forEach((String name, Builder builder) { | |
82 do { | |
83 if (builder is ClassBuilder) { | |
84 elements[builder] = new KernelClassElement(builder); | |
85 } else if (builder is DillMemberBuilder) { | |
86 Member member = builder.member; | |
87 if (member is Field) { | |
88 } else if (member is Procedure) { | |
89 buildDillFunctionElement(builder, unit, elements); | |
90 } else { | |
91 internalError("Unhandled $name ${member.runtimeType} in $uri"); | |
92 } | |
93 } else if (builder is KernelProcedureBuilder) { | |
94 buildKernelFunctionElement(builder, unit, elements); | |
95 } else { | |
96 internalError("Unhandled $name ${builder.runtimeType} in $uri"); | |
97 } | |
98 builder = builder.next; | |
99 } while (builder != null); | |
100 }); | |
101 }); | |
102 return new ElementStoreImplementation.internal(coreLibrary, elements); | |
103 } | |
104 | |
105 bool get ignoreRedirectingFactories => false; | |
106 | |
107 Constructor getCoreClassConstructorReference(String className, | |
108 {String constructorName, String library}) { | |
109 assert(library == null); | |
110 KernelClassBuilder cls = coreLibrary.members[className]; | |
111 Constructor constructor = constructorName == null | |
112 ? cls.cls.constructors.first | |
113 : cls.cls.constructors.firstWhere( | |
114 (Constructor c) => c.name.name == constructorName); | |
115 return constructor; | |
116 } | |
117 | |
118 Library getLibraryReference(LibraryElement element) => internalError("not supp orted."); | |
119 | |
120 Class getClassReference(KernelClassElement cls) => cls.builder.cls; | |
121 | |
122 Member getMemberReference(Element element) { | |
123 if (element is KernelFunctionElement) { | |
124 return element.procedure; | |
125 } else { | |
126 return internalError("getMemberReference(${element.runtimeType})"); | |
127 } | |
128 } | |
129 | |
130 Class getRootClassReference() => internalError("not supported."); | |
131 Constructor getRootClassConstructorReference() => internalError("not supported ."); | |
132 Class getCoreClassReference(String className) => internalError("not supported. "); | |
133 TypeParameter tryGetClassTypeParameter(TypeParameterElement element) => intern alError("not supported."); | |
134 Class getSharedMixinApplicationClass( | |
135 Library library, Class supertype, Class mixin) => internalError("not suppo rted."); | |
asgerf
2017/01/19 10:13:27
several long lines here
ahe
2017/01/19 10:59:45
Done.
| |
136 bool get strongMode => false; | |
137 | |
138 static void buildDillFunctionElement(DillMemberBuilder builder, | |
139 KernelCompilationUnitElement unit, Map<Builder, Element> elements) { | |
140 Procedure procedure = builder.member; | |
141 List<VariableDeclaration> positionalParameters = | |
142 procedure.function.positionalParameters; | |
143 List<VariableDeclaration> namedParameters = | |
144 procedure.function.namedParameters; | |
145 int requiredParameterCount = procedure.function.requiredParameterCount; | |
146 List<KernelParameterElement> parameters = new List<KernelParameterElement>( | |
147 positionalParameters.length + namedParameters.length); | |
148 int i = 0; | |
149 for (VariableDeclaration parameter in positionalParameters) { | |
150 parameters[i] = buildFormalParameter( | |
151 parameter, isOptional: i >= requiredParameterCount); | |
152 i++; | |
153 } | |
154 for (VariableDeclaration parameter in namedParameters) { | |
155 parameters[i++] = buildFormalParameter(parameter, isNamed: true); | |
156 } | |
157 elements[builder] = new KernelFunctionElement(procedure, unit, parameters); | |
158 } | |
159 | |
160 static void buildKernelFunctionElement(KernelProcedureBuilder builder, | |
161 KernelCompilationUnitElement unit, Map<Builder, Element> elements) { | |
162 assert(builder.procedure != null); | |
163 List<KernelParameterElement> parameters; | |
164 int i = 0; | |
165 if (builder.formals != null) { | |
166 parameters = new List<KernelParameterElement>(builder.formals.length); | |
167 for (KernelFormalParameterBuilder parameter in builder.formals) { | |
168 assert(parameter.declaration != null); | |
169 elements[parameter] = parameters[i++] = buildFormalParameter( | |
170 parameter.declaration, isOptional: parameter.isOptional, | |
171 isNamed: parameter.isNamed); | |
172 } | |
173 } else { | |
174 parameters = new List<KernelParameterElement>(0); | |
175 } | |
176 elements[builder] = new KernelFunctionElement( | |
177 builder.procedure, unit, parameters); | |
178 } | |
179 | |
180 static KernelParameterElement buildFormalParameter( | |
181 VariableDeclaration parameter, | |
182 {bool isOptional: true, bool isNamed: false}) { | |
183 ParameterKind kind = isOptional | |
184 ? (isNamed ? ParameterKind.NAMED : ParameterKind.POSITIONAL) | |
185 : ParameterKind.REQUIRED; | |
186 return new KernelParameterElement(parameter, kind); | |
187 } | |
188 } | |
189 | |
190 class KernelLibraryElement extends MockLibraryElement { | |
191 final KernelCompilationUnitElement definingCompilationUnit; | |
192 | |
193 KernelLibraryElement(this.definingCompilationUnit); | |
194 | |
195 FunctionElement get loadLibraryFunction => null; | |
196 } | |
197 | |
198 class KernelCompilationUnitElement extends MockCompilationUnitElement { | |
199 final LibraryBuilder builder; | |
200 | |
201 KernelLibraryElement library; | |
202 | |
203 KernelCompilationUnitElement(this.builder); | |
204 | |
205 KernelLibraryElement get enclosingElement => library; | |
206 | |
207 String get uri => "${builder.uri}"; | |
208 } | |
209 | |
210 class KernelFunctionElement extends MockFunctionElement { | |
211 final Procedure procedure; | |
212 | |
213 final KernelCompilationUnitElement enclosingElement; | |
214 | |
215 final List<KernelParameterElement> parameters; | |
216 | |
217 KernelFunctionElement(this.procedure, this.enclosingElement, this.parameters); | |
218 | |
219 KernelLibraryElement get library => enclosingElement.library; | |
220 } | |
221 | |
222 class KernelParameterElement extends MockParameterElement { | |
223 final VariableDeclaration declaration; | |
224 | |
225 final ParameterKind parameterKind; | |
226 | |
227 KernelParameterElement(this.declaration, this.parameterKind); | |
228 } | |
229 | |
230 /// Both an [Element] and [Builder] to using memory to store local elements in | |
231 /// [ElementStore]. | |
232 class AnalyzerLocalVariableElemment extends MockElement with Builder | |
233 implements LocalVariableElement { | |
234 final analyzer.VariableDeclaration variable; | |
235 | |
236 AnalyzerLocalVariableElemment(this.variable) | |
237 : super(ElementKind.LOCAL_VARIABLE); | |
238 | |
239 String get name => variable.name.name; | |
240 | |
241 bool get isFinal => false; // TODO(ahe): implement this. | |
242 | |
243 bool get isConst => false; // TODO(ahe): implement this. | |
244 | |
245 analyzer.VariableDeclaration get target => variable; | |
246 } | |
247 | |
248 /// Both an [Element] and [Builder] to using memory to store local elements in | |
249 /// [ElementStore]. | |
250 class AnalyzerParameterElement extends MockParameterElement with Builder { | |
251 final analyzer.FormalParameter parameter; | |
252 | |
253 AnalyzerParameterElement(this.parameter); | |
254 | |
255 String get name => parameter.identifier.name; | |
256 | |
257 bool get isFinal => false; // TODO(ahe): implement this. | |
258 | |
259 bool get isConst => false; // TODO(ahe): implement this. | |
260 | |
261 analyzer.FormalParameter get target => parameter; | |
262 } | |
263 | |
264 class KernelClassElement extends MockClassElement { | |
265 final KernelClassBuilder builder; | |
266 | |
267 KernelInterfaceType rawType; | |
268 | |
269 KernelClassElement(this.builder) { | |
270 rawType = new KernelInterfaceType(this); | |
271 } | |
272 } | |
273 | |
274 class KernelInterfaceType extends MockInterfaceType { | |
275 final KernelClassElement element; | |
276 | |
277 KernelInterfaceType(this.element); | |
278 | |
279 List<analyzer.DartType> get typeArguments => const <analyzer.DartType>[]; | |
280 } | |
OLD | NEW |