blob: 29c37918d47d36608d5feee7cbea6c44e2316f97 [file] [log] [blame]
// 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.
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator;
import '../../js/js_ast.dart' as JS;
abstract class Backend {
LibraryBuilder libraryBuilder(LibraryElement element);
// JS.Expression buildTypeLiteral(JS.TypeRef typeRef);
}
abstract class LibraryBuilder {
LibraryElement get element;
LibraryPartBuilder libraryPartBuilder(CompilationUnitElement element);
void build();
}
abstract class LibraryPartBuilder {
CompilationUnitElement get element;
void buildTypedef(
FunctionTypeAliasElement element,
JS.TypeRef returnType, List<JS.TypeRef> paramTypes);
ClassBuilder classBuilder(ClassElement element, ClassDeclaration node);
}
abstract class ClassBuilder {
ClassElement get element;
ClassDeclaration get node;
final dartxNames = <JS.Expression>[];
final overrideFields = <JS.Expression>[];
final extensionNames = <JS.Expression>[];
final metadataExpressions = <JS.Expression>[];
final constructorNames = <JS.Expression>[];
final mixinTypeRefs = <JS.TypeRef>[];
final implementedTypeRefs = <JS.TypeRef>[];
final genericTypeNames = <String>[];
JS.Expression signature;
JS.Expression deferredSuperType;
JS.Expression jsPeerName;
JS.TypeRef parentTypeRef;
JS.TypeRef deferredParentTypeRef;
addConstructor(Element element, JS.Expression name, JS.Expression body);
addNamedConstructor(Element element, JS.Expression name, JS.Expression body);
addMethod(MethodElement element, JS.Expression name, JS.Fun body);
addGetter(MethodElement element, JS.Expression name, JS.Fun body);
addSetter(MethodElement element, JS.Expression name, JS.Fun body);
void build();
}
/// Useful base impl class for [ClassBuilder].
abstract class DefaultClassBuilder extends ClassBuilder {
final constructors = <Element, Map<JS.Expression, JS.Expression>>{};
final namedConstructors = <Element, Map<JS.Expression, JS.Expression>>{};
final methods = <MethodElement, Map<JS.Expression, JS.Fun>>{};
final getters = <MethodElement, Map<JS.Expression, JS.Fun>>{};
final setters = <MethodElement, Map<JS.Expression, JS.Fun>>{};
addConstructor(Element element, JS.Expression name, JS.Expression body) =>
constructors.putIfAbsent(element, () => {})[name] = body;
addNamedConstructor(Element element, JS.Expression name, JS.Expression body) =>
namedConstructors.putIfAbsent(element, () => {})[name] = body;
addMethod(MethodElement element, JS.Expression name, JS.Fun body) =>
methods.putIfAbsent(element, () => {})[name] = body;
addGetter(MethodElement element, JS.Expression name, JS.Fun body) =>
getters.putIfAbsent(element, () => {})[name] = body;
addSetter(MethodElement element, JS.Expression name, JS.Fun body) =>
setters.putIfAbsent(element, () => {})[name] = body;
}