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

Unified Diff: pkg/fasta/lib/src/analyzer/element_store.dart

Issue 2632663002: Fasta analyzer AST builder. (Closed)
Patch Set: Address review comments. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/fasta/lib/src/analyzer/ast_builder.dart ('k') | pkg/fasta/lib/src/analyzer/mock_element.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/fasta/lib/src/analyzer/element_store.dart
diff --git a/pkg/fasta/lib/src/analyzer/element_store.dart b/pkg/fasta/lib/src/analyzer/element_store.dart
new file mode 100644
index 0000000000000000000000000000000000000000..2aa783844c1721c59937dc79984f8e3c0a8adf77
--- /dev/null
+++ b/pkg/fasta/lib/src/analyzer/element_store.dart
@@ -0,0 +1,295 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.analyzer.element_store;
+
+import 'package:kernel/analyzer/loader.dart' show
+ ReferenceLevelLoader;
+
+import 'package:kernel/ast.dart';
+
+import 'package:analyzer/analyzer.dart' show
+ ParameterKind;
+
+import 'package:analyzer/analyzer.dart' as analyzer;
+
+import 'package:analyzer/dart/element/element.dart';
+
+import 'package:analyzer/dart/element/type.dart' as analyzer;
+
+import '../errors.dart' show
+ internalError;
+
+import '../kernel/kernel_builder.dart';
+
+import '../dill/dill_member_builder.dart';
+
+import 'mock_element.dart';
+
+import 'mock_type.dart';
+
+abstract class ElementStore implements ReferenceLevelLoader {
+ Element operator[] (Builder builder);
+
+ factory ElementStore(
+ LibraryBuilder coreLibrary, Map<Uri, LibraryBuilder> builders) =
+ ElementStoreImplementation;
+}
+
+// ClassElement,
+// ClassMemberElement,
+// CompilationUnitElement,
+// ConstructorElement,
+// Element,
+// FieldElement,
+// FieldFormalParameterElement,
+// FunctionElement,
+// FunctionTypedElement,
+// LibraryElement,
+// LocalElement,
+// LocalVariableElement,
+// MethodElement,
+// ParameterElement,
+// PrefixElement,
+// PropertyAccessorElement,
+// TopLevelVariableElement,
+// TypeParameterElement,
+// VariableElement;
+class ElementStoreImplementation implements ElementStore {
+ final LibraryBuilder coreLibrary;
+
+ final Map<Builder, Element> elements;
+
+ ElementStoreImplementation.internal(this.coreLibrary, this.elements);
+
+ Element operator[] (Builder builder) {
+ // Avoid storing local elements in the element store to reduce memory
+ // usage. So they both implement [Element] and [Builder].
+ return builder is Element ? builder : elements[builder];
+ }
+
+ factory ElementStoreImplementation(
+ LibraryBuilder coreLibrary, Map<Uri, LibraryBuilder> libraries) {
+ Map<Builder, Element> elements = <Builder, Element>{};
+ libraries.forEach((Uri uri, LibraryBuilder library) {
+ KernelCompilationUnitElement unit =
+ new KernelCompilationUnitElement(library);
+ KernelLibraryElement element = new KernelLibraryElement(unit);
+ elements[library] = element;
+ unit.library = element;
+ library.members.forEach((String name, Builder builder) {
+ do {
+ if (builder is ClassBuilder) {
+ elements[builder] = new KernelClassElement(builder);
+ } else if (builder is DillMemberBuilder) {
+ Member member = builder.member;
+ if (member is Field) {
+ } else if (member is Procedure) {
+ buildDillFunctionElement(builder, unit, elements);
+ } else {
+ internalError("Unhandled $name ${member.runtimeType} in $uri");
+ }
+ } else if (builder is KernelProcedureBuilder) {
+ buildKernelFunctionElement(builder, unit, elements);
+ } else {
+ internalError("Unhandled $name ${builder.runtimeType} in $uri");
+ }
+ builder = builder.next;
+ } while (builder != null);
+ });
+ });
+ return new ElementStoreImplementation.internal(coreLibrary, elements);
+ }
+
+ bool get ignoreRedirectingFactories => false;
+
+ Constructor getCoreClassConstructorReference(String className,
+ {String constructorName, String library}) {
+ assert(library == null);
+ KernelClassBuilder cls = coreLibrary.members[className];
+ Constructor constructor = constructorName == null
+ ? cls.cls.constructors.first
+ : cls.cls.constructors.firstWhere(
+ (Constructor c) => c.name.name == constructorName);
+ return constructor;
+ }
+
+ Library getLibraryReference(LibraryElement element) {
+ return internalError("not supported.");
+ }
+
+ Class getClassReference(KernelClassElement cls) => cls.builder.cls;
+
+ Member getMemberReference(Element element) {
+ if (element is KernelFunctionElement) {
+ return element.procedure;
+ } else {
+ return internalError("getMemberReference(${element.runtimeType})");
+ }
+ }
+
+ Class getRootClassReference() => internalError("not supported.");
+
+ Constructor getRootClassConstructorReference() {
+ return internalError("not supported.");
+ }
+
+ Class getCoreClassReference(String className) {
+ return internalError("not supported.");
+ }
+
+ TypeParameter tryGetClassTypeParameter(TypeParameterElement element) {
+ return internalError("not supported.");
+ }
+
+ Class getSharedMixinApplicationClass(
+ Library library, Class supertype, Class mixin) {
+ return internalError("not supported.");
+ }
+
+ bool get strongMode => false;
+
+ static void buildDillFunctionElement(DillMemberBuilder builder,
+ KernelCompilationUnitElement unit, Map<Builder, Element> elements) {
+ Procedure procedure = builder.member;
+ List<VariableDeclaration> positionalParameters =
+ procedure.function.positionalParameters;
+ List<VariableDeclaration> namedParameters =
+ procedure.function.namedParameters;
+ int requiredParameterCount = procedure.function.requiredParameterCount;
+ List<KernelParameterElement> parameters = new List<KernelParameterElement>(
+ positionalParameters.length + namedParameters.length);
+ int i = 0;
+ for (VariableDeclaration parameter in positionalParameters) {
+ parameters[i] = buildFormalParameter(
+ parameter, isOptional: i >= requiredParameterCount);
+ i++;
+ }
+ for (VariableDeclaration parameter in namedParameters) {
+ parameters[i++] = buildFormalParameter(parameter, isNamed: true);
+ }
+ elements[builder] = new KernelFunctionElement(procedure, unit, parameters);
+ }
+
+ static void buildKernelFunctionElement(KernelProcedureBuilder builder,
+ KernelCompilationUnitElement unit, Map<Builder, Element> elements) {
+ assert(builder.procedure != null);
+ List<KernelParameterElement> parameters;
+ int i = 0;
+ if (builder.formals != null) {
+ parameters = new List<KernelParameterElement>(builder.formals.length);
+ for (KernelFormalParameterBuilder parameter in builder.formals) {
+ assert(parameter.declaration != null);
+ elements[parameter] = parameters[i++] = buildFormalParameter(
+ parameter.declaration, isOptional: parameter.isOptional,
+ isNamed: parameter.isNamed);
+ }
+ } else {
+ parameters = new List<KernelParameterElement>(0);
+ }
+ elements[builder] = new KernelFunctionElement(
+ builder.procedure, unit, parameters);
+ }
+
+ static KernelParameterElement buildFormalParameter(
+ VariableDeclaration parameter,
+ {bool isOptional: true, bool isNamed: false}) {
+ ParameterKind kind = isOptional
+ ? (isNamed ? ParameterKind.NAMED : ParameterKind.POSITIONAL)
+ : ParameterKind.REQUIRED;
+ return new KernelParameterElement(parameter, kind);
+ }
+}
+
+class KernelLibraryElement extends MockLibraryElement {
+ final KernelCompilationUnitElement definingCompilationUnit;
+
+ KernelLibraryElement(this.definingCompilationUnit);
+
+ FunctionElement get loadLibraryFunction => null;
+}
+
+class KernelCompilationUnitElement extends MockCompilationUnitElement {
+ final LibraryBuilder builder;
+
+ KernelLibraryElement library;
+
+ KernelCompilationUnitElement(this.builder);
+
+ KernelLibraryElement get enclosingElement => library;
+
+ String get uri => "${builder.uri}";
+}
+
+class KernelFunctionElement extends MockFunctionElement {
+ final Procedure procedure;
+
+ final KernelCompilationUnitElement enclosingElement;
+
+ final List<KernelParameterElement> parameters;
+
+ KernelFunctionElement(this.procedure, this.enclosingElement, this.parameters);
+
+ KernelLibraryElement get library => enclosingElement.library;
+}
+
+class KernelParameterElement extends MockParameterElement {
+ final VariableDeclaration declaration;
+
+ final ParameterKind parameterKind;
+
+ KernelParameterElement(this.declaration, this.parameterKind);
+}
+
+/// Both an [Element] and [Builder] to using memory to store local elements in
+/// [ElementStore].
+class AnalyzerLocalVariableElemment extends MockElement with Builder
+ implements LocalVariableElement {
+ final analyzer.VariableDeclaration variable;
+
+ AnalyzerLocalVariableElemment(this.variable)
+ : super(ElementKind.LOCAL_VARIABLE);
+
+ String get name => variable.name.name;
+
+ bool get isFinal => false; // TODO(ahe): implement this.
+
+ bool get isConst => false; // TODO(ahe): implement this.
+
+ analyzer.VariableDeclaration get target => variable;
+}
+
+/// Both an [Element] and [Builder] to using memory to store local elements in
+/// [ElementStore].
+class AnalyzerParameterElement extends MockParameterElement with Builder {
+ final analyzer.FormalParameter parameter;
+
+ AnalyzerParameterElement(this.parameter);
+
+ String get name => parameter.identifier.name;
+
+ bool get isFinal => false; // TODO(ahe): implement this.
+
+ bool get isConst => false; // TODO(ahe): implement this.
+
+ analyzer.FormalParameter get target => parameter;
+}
+
+class KernelClassElement extends MockClassElement {
+ final KernelClassBuilder builder;
+
+ KernelInterfaceType rawType;
+
+ KernelClassElement(this.builder) {
+ rawType = new KernelInterfaceType(this);
+ }
+}
+
+class KernelInterfaceType extends MockInterfaceType {
+ final KernelClassElement element;
+
+ KernelInterfaceType(this.element);
+
+ List<analyzer.DartType> get typeArguments => const <analyzer.DartType>[];
+}
« no previous file with comments | « pkg/fasta/lib/src/analyzer/ast_builder.dart ('k') | pkg/fasta/lib/src/analyzer/mock_element.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698