Index: lib/src/codegen/js_typeref_codegen.dart |
diff --git a/lib/src/codegen/js_typeref_codegen.dart b/lib/src/codegen/js_typeref_codegen.dart |
deleted file mode 100644 |
index 7aa4c0a2e7d0786aef798846670d9a045c99ad7c..0000000000000000000000000000000000000000 |
--- a/lib/src/codegen/js_typeref_codegen.dart |
+++ /dev/null |
@@ -1,134 +0,0 @@ |
-// Copyright (c) 2015, 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/dart/element/element.dart'; |
-import 'package:analyzer/dart/element/type.dart'; |
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider; |
-import 'package:analyzer/src/generated/utilities_dart.dart'; |
- |
-import '../js/js_ast.dart' as JS; |
-import '../options.dart'; |
-import 'js_interop.dart'; |
- |
-/// Mixin with logic to generate [TypeRef]s out of [DartType]s. |
-abstract class JsTypeRefCodegen { |
- final _resolved = <DartType, JS.TypeRef>{}; |
- |
- // Mixin dependencies: |
- CodegenOptions get options; |
- TypeProvider get types; |
- JS.Identifier get namedArgumentTemp; |
- LibraryElement get currentLibrary; |
- JS.Identifier emitLibraryName(LibraryElement e); |
- |
- /// Finds the qualified path to the type. |
- JS.TypeRef _emitTopLevelTypeRef(DartType type) { |
- var e = type.element; |
- if (e.library == currentLibrary) { |
- return new JS.TypeRef.named(type.name); |
- } else { |
- return new JS.TypeRef.qualified([ |
- emitLibraryName(e.library), |
- new JS.Identifier(getJSExportName(e, types) ?? type.name) |
- ]); |
- } |
- } |
- |
- JS.TypeRef emitTypeRef(DartType type) { |
- if (!options.closure) return null; |
- |
- return _resolved.putIfAbsent(type, () { |
- if (type == null) new JS.TypeRef.unknown(); |
- // TODO(ochafik): Consider calling _loader.declareBeforeUse(type.element). |
- if (type.isBottom || type.isDynamic) new JS.TypeRef.any(); |
- if (type.isVoid) return new JS.TypeRef.void_(); |
- |
- if (type == types.intType) return new JS.TypeRef.number().orNull(); |
- if (type == types.numType) return new JS.TypeRef.number().orNull(); |
- if (type == types.doubleType) return new JS.TypeRef.number().orNull(); |
- if (type == types.boolType) return new JS.TypeRef.boolean().orNull(); |
- if (type == types.stringType) return new JS.TypeRef.string(); |
- |
- if (type is TypeParameterType) return new JS.TypeRef.named(type.name); |
- if (type is ParameterizedType) { |
- JS.TypeRef rawType; |
- if (type is FunctionType && type.name == null) { |
- var args = <JS.Identifier, JS.TypeRef>{}; |
- for (var param in type.parameters) { |
- if (param.parameterKind == ParameterKind.NAMED) break; |
- var type = emitTypeRef(param.type); |
- args[new JS.Identifier(param.name)] = param.parameterKind == |
- ParameterKind.POSITIONAL ? type.toOptional() : type; |
- } |
- var namedParamType = emitNamedParamsArgType(type.parameters); |
- if (namedParamType != null) { |
- args[namedArgumentTemp] = namedParamType.toOptional(); |
- } |
- |
- rawType = new JS.TypeRef.function(emitTypeRef(type.returnType), args); |
- } else { |
- var jsTypeRef = _getDartJsTypeRef(type); |
- if (jsTypeRef != null) return jsTypeRef; |
- |
- rawType = _emitTopLevelTypeRef(type); |
- } |
- var typeArgs = _getOwnTypeArguments(type).map(emitTypeRef); |
- return typeArgs.isEmpty |
- ? rawType |
- : new JS.TypeRef.generic(rawType, typeArgs); |
- } |
- return new JS.TypeRef.unknown(); |
- }); |
- } |
- |
- JS.TypeRef emitNamedParamsArgType(List<ParameterElement> params) { |
- if (!options.closure) return null; |
- |
- var namedArgs = <JS.Identifier, JS.TypeRef>{}; |
- for (ParameterElement param in params) { |
- if (param.parameterKind != ParameterKind.NAMED) continue; |
- namedArgs[new JS.Identifier(param.name)] = |
- emitTypeRef(param.type).toOptional(); |
- } |
- if (namedArgs.isEmpty) return null; |
- return new JS.TypeRef.record(namedArgs); |
- } |
- |
- /// Gets the "own" type arguments of [type]. |
- /// |
- /// Method argument with adhoc unnamed [FunctionType] inherit any type params |
- /// from their enclosing class: |
- /// |
- /// class Foo<T> { |
- /// void method(f()); // f has [T] as type arguments, |
- /// } // but [] as its "own" type arguments. |
- Iterable<DartType> _getOwnTypeArguments(ParameterizedType type) sync* { |
- for (int i = 0, n = type.typeParameters.length; i < n; i++) { |
- if (type.typeParameters[i].enclosingElement == type.element) { |
- yield type.typeArguments[i]; |
- } |
- } |
- } |
- |
- /// Special treatment of types from dart:js |
- /// TODO(ochafik): Is this the right thing to do? And what about package:js? |
- JS.TypeRef _getDartJsTypeRef(DartType type) { |
- switch (type.element.source.uri.toString()) { |
- case 'dart:js': |
- switch (type.name) { |
- case 'JsArray': |
- return new JS.TypeRef.array( |
- type is InterfaceType && type.typeArguments.length == 1 |
- ? emitTypeRef(type.typeArguments.single) |
- : null); |
- case 'JsObject': |
- return new JS.TypeRef.object(); |
- case 'JsFunction': |
- return new JS.TypeRef.function(); |
- } |
- break; |
- } |
- return null; |
- } |
-} |