blob: 32bc255638396b9e74bef1958b4fc9722e9be9d7 [file] [log] [blame] [edit]
// 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 'es6_backend.dart';
import 'typescript_backend.dart';
import 'module_builder.dart';
import '../js/js_ast.dart' as JS;
import '../options.dart';
import '../utils.dart';
import '../compiler.dart';
abstract class Backend {
Backend.base();
factory Backend(AbstractCompiler compiler) {
moduleBuilderFactory() =>
new ModuleBuilder(compiler.options.codegenOptions.moduleFormat);
if (compiler.options.codegenOptions.closure) {
return new TypeScriptBackend(compiler, moduleBuilderFactory);
} else {
return new Es6Backend(compiler, moduleBuilderFactory);
}
}
LibraryBuilder libraryBuilder(LibraryElement element);
// JS.Expression buildTypeLiteral(JS.TypeRef typeRef);
}
abstract class LibraryBuilder {
String jsModuleValue;
LibraryElement get element;
JS.Expression get exportsVar;
void buildTypedef(
FunctionTypeAliasElement element,
JS.TypeRef returnType, List<JS.TypeRef> paramTypes);
ClassBuilder classBuilder(ClassElement element, ClassDeclaration node);
void build();
}
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;
}