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

Side by Side Diff: pkg/fasta/lib/src/analyzer/element_store.dart

Issue 2632663002: Fasta analyzer AST builder. (Closed)
Patch Set: Created 3 years, 11 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
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698