| // 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; |
| } |