Chromium Code Reviews| 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..a92c003d218c15927f07498e0fa1c2c3c59808fa |
| --- /dev/null |
| +++ b/pkg/fasta/lib/src/analyzer/element_store.dart |
| @@ -0,0 +1,280 @@ |
| +// 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) => 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() => internalError("not supported."); |
| + Class getCoreClassReference(String className) => internalError("not supported."); |
| + TypeParameter tryGetClassTypeParameter(TypeParameterElement element) => internalError("not supported."); |
| + Class getSharedMixinApplicationClass( |
| + Library library, Class supertype, Class mixin) => internalError("not supported."); |
|
asgerf
2017/01/19 10:13:27
several long lines here
ahe
2017/01/19 10:59:45
Done.
|
| + 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>[]; |
| +} |