| Index: lib/src/compiler/code_generator.dart
|
| diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
|
| index c65209faab53de2607d01f646db2799835b439fb..dad88eb3fa58f5ca1436eebfa9f3c9fb0b12fff5 100644
|
| --- a/lib/src/compiler/code_generator.dart
|
| +++ b/lib/src/compiler/code_generator.dart
|
| @@ -285,12 +285,12 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
|
|
| var libraryJSName = getAnnotationName(e.library, isPublicJSAnnotation);
|
| - var libraryPrefix = [];
|
| + var libraryPrefix = <String>[];
|
| if (libraryJSName != null && libraryJSName.isNotEmpty) {
|
| libraryPrefix.addAll(libraryJSName.split('.'));
|
| }
|
|
|
| - var elementJSName;
|
| + String elementJSName;
|
| if (findAnnotation(e, isPublicJSAnnotation) != null) {
|
| elementJSName = getAnnotationName(e, isPublicJSAnnotation) ?? '';
|
| }
|
| @@ -302,7 +302,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
| if (elementJSName == null) return null;
|
|
|
| - var elementJSParts = [];
|
| + var elementJSParts = <String>[];
|
| if (elementJSName.isNotEmpty) {
|
| elementJSParts.addAll(elementJSName.split('.'));
|
| } else {
|
| @@ -316,7 +316,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var jsName = _getJSName(e);
|
| if (jsName == null) return null;
|
| var fullName = ['global']..addAll(jsName);
|
| - var access = _runtimeLibVar;
|
| + JS.Expression access = _runtimeLibVar;
|
| for (var part in fullName) {
|
| access = new JS.PropertyAccess(access, js.string(part));
|
| }
|
| @@ -699,7 +699,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| className = _emitTopLevelName(classElem);
|
| }
|
|
|
| - var allFields = new List.from(fields)..addAll(staticFields);
|
| + var allFields = fields.toList()..addAll(staticFields);
|
| var superclasses = getSuperclasses(classElem);
|
| var virtualFields = <FieldElement, JS.TemporaryId>{};
|
| var virtualFieldSymbols = <JS.Statement>[];
|
| @@ -949,7 +949,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var jsMethods = <JS.Method>[];
|
| if (!node.isStatic) {
|
| for (var decl in node.fields.variables) {
|
| - var field = decl.element;
|
| + var field = decl.element as FieldElement;
|
| var name = getAnnotationName(field, isJsName) ?? field.name;
|
| // Generate getter
|
| var fn = new JS.Fun([], js.statement('{ return this.#; }', [name]));
|
| @@ -1351,12 +1351,12 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| dartxNames.add(_elementMemberName(m.element, useExtension: false));
|
| }
|
| }
|
| - for (var f in fields) {
|
| - if (!f.isStatic) {
|
| - for (var d in f.fields.variables) {
|
| - if (d.element.isPublic) {
|
| - dartxNames.add(
|
| - _elementMemberName(d.element.getter, useExtension: false));
|
| + for (var fieldDecl in fields) {
|
| + if (!fieldDecl.isStatic) {
|
| + for (var field in fieldDecl.fields.variables) {
|
| + var e = field.element as FieldElement;
|
| + if (e.isPublic) {
|
| + dartxNames.add(_elementMemberName(e.getter, useExtension: false));
|
| }
|
| }
|
| }
|
| @@ -1542,7 +1542,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| JS.Statement visitRedirectingConstructorInvocation(
|
| RedirectingConstructorInvocation node) {
|
| var ctor = node.staticElement;
|
| - var cls = ctor.enclosingElement as ClassElement;
|
| + var cls = ctor.enclosingElement;
|
| // We can't dispatch to the constructor with `this.new` as that might hit a
|
| // derived class constructor with the same name.
|
| return js.statement('#.prototype.#.call(this, #);', [
|
| @@ -1848,7 +1848,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var props = <JS.Method>[_emitTopLevelProperty(node)];
|
| var setter = element.correspondingSetter;
|
| if (setter != null) {
|
| - props.add(_loader.emitDeclaration(setter, _emitTopLevelProperty));
|
| + props.add(_loader.emitDeclaration(
|
| + setter, (node) => _emitTopLevelProperty(node)));
|
| }
|
| return js.statement('dart.copyProperties(#, { # });',
|
| [emitLibraryName(currentLibrary), props]);
|
| @@ -1858,7 +1859,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var props = <JS.Method>[_emitTopLevelProperty(node)];
|
| var getter = element.correspondingGetter;
|
| if (getter != null) {
|
| - props.add(_loader.emitDeclaration(getter, _emitTopLevelProperty));
|
| + props.add(_loader.emitDeclaration(
|
| + getter, (node) => _emitTopLevelProperty(node)));
|
| }
|
| return js.statement('dart.copyProperties(#, { # });',
|
| [emitLibraryName(currentLibrary), props]);
|
| @@ -1983,7 +1985,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
|
|
| JS.ArrowFun _emitArrowFunction(FunctionExpression node) {
|
| JS.Fun f = _emitFunctionBody(node.element, node.parameters, node.body);
|
| - var body = f.body;
|
| + JS.Node body = f.body;
|
|
|
| // Simplify `=> { return e; }` to `=> e`
|
| if (body is JS.Block) {
|
| @@ -1999,25 +2001,24 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var fn = new JS.ArrowFun(f.params, body,
|
| typeParams: f.typeParams, returnType: f.returnType);
|
|
|
| - return annotate(_makeGenericFunction(fn), node);
|
| + return annotate(_makeGenericArrowFun(fn), node);
|
| }
|
|
|
| - JS.FunctionExpression/*=T*/ _makeGenericFunction
|
| - /*<T extends JS.FunctionExpression>*/(JS.FunctionExpression/*=T*/ fn) {
|
| + JS.ArrowFun _makeGenericArrowFun(JS.ArrowFun fn) {
|
| + if (fn.typeParams == null || fn.typeParams.isEmpty) return fn;
|
| + return new JS.ArrowFun(fn.typeParams, fn);
|
| + }
|
| +
|
| + JS.Fun _makeGenericFunction(JS.Fun fn) {
|
| if (fn.typeParams == null || fn.typeParams.isEmpty) return fn;
|
|
|
| // TODO(jmesserly): we could make these default to `dynamic`.
|
| - var typeParams = fn.typeParams;
|
| - if (fn is JS.ArrowFun) {
|
| - return new JS.ArrowFun(typeParams, fn);
|
| - }
|
| - var f = fn as JS.Fun;
|
| return new JS.Fun(
|
| - typeParams,
|
| + fn.typeParams,
|
| new JS.Block([
|
| // Convert the function to an => function, to ensure `this` binding.
|
| - new JS.Return(new JS.ArrowFun(f.params, f.body,
|
| - typeParams: f.typeParams, returnType: f.returnType))
|
| + new JS.Return(new JS.ArrowFun(fn.params, fn.body,
|
| + typeParams: fn.typeParams, returnType: fn.returnType))
|
| ]));
|
| }
|
|
|
| @@ -2091,7 +2092,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // `await` is generated as `yield`.
|
| // runtime/_generators.js has an example of what the code is generated as.
|
| var savedController = _asyncStarController;
|
| - List jsParams = visitFormalParameterList(parameters);
|
| + var jsParams = visitFormalParameterList(parameters);
|
| if (kind == 'asyncStar') {
|
| _asyncStarController = new JS.TemporaryId('stream');
|
| jsParams.insert(0, _asyncStarController);
|
| @@ -2285,8 +2286,8 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| _emitType(types[i], nameType: nameType, hoistType: hoistType);
|
| var value = typeName;
|
| if (options.emitMetadata && metadata.isNotEmpty) {
|
| - metadata = metadata.map(_instantiateAnnotation).toList();
|
| - value = new JS.ArrayInitializer([typeName]..addAll(metadata));
|
| + value = new JS.ArrayInitializer(
|
| + [typeName]..addAll(metadata.map(_instantiateAnnotation)));
|
| }
|
| result.add(value);
|
| }
|
| @@ -2599,7 +2600,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
|
|
| JS.Expression _emitMethodCall(Expression target, MethodInvocation node) {
|
| - List<JS.Expression> args = _visit(node.argumentList);
|
| + var args = _visit(node.argumentList) as List<JS.Expression>;
|
| var typeArgs = _emitInvokeTypeArguments(node);
|
|
|
| if (target is SuperExpression && !_superAllowed) {
|
| @@ -2686,7 +2687,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| /// an expression.
|
| JS.Expression _emitFunctionCall(InvocationExpression node) {
|
| var fn = _visit(node.function);
|
| - var args = _visit(node.argumentList);
|
| + var args = _visit(node.argumentList) as List<JS.Expression>;
|
| if (DynamicInvoke.get(node.function)) {
|
| var typeArgs = _emitInvokeTypeArguments(node);
|
| if (typeArgs != null) {
|
| @@ -2766,7 +2767,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| var args = node.argumentList.arguments;
|
| // arg[0] is static return type, used in `RestrictedStaticTypeAnalyzer`
|
| var code = args[1];
|
| - var templateArgs;
|
| + List<AstNode> templateArgs;
|
| var source;
|
| if (code is StringInterpolation) {
|
| if (args.length > 2) {
|
| @@ -2783,7 +2784,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| }
|
| }).join();
|
| } else {
|
| - templateArgs = args.skip(2);
|
| + templateArgs = args.skip(2).toList();
|
| source = (code as StringLiteral).stringValue;
|
| }
|
|
|
| @@ -4065,7 +4066,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // full desugaring seems okay.
|
| var streamIterator = rules.instantiateToBounds(_asyncStreamIterator);
|
| var createStreamIter = _emitInstanceCreationExpression(
|
| - streamIterator.element.unnamedConstructor,
|
| + (streamIterator.element as ClassElement).unnamedConstructor,
|
| streamIterator,
|
| null,
|
| AstBuilder.argumentList([node.iterable]),
|
| @@ -4366,7 +4367,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| List/*<T>*/ _visitList/*<T extends AstNode>*/(Iterable/*<T>*/ nodes) {
|
| if (nodes == null) return null;
|
| var result = /*<T>*/ [];
|
| - for (var node in nodes) result.add(_visit(node));
|
| + for (var node in nodes) result.add(_visit(node) as dynamic/*=T*/);
|
| return result;
|
| }
|
|
|
| @@ -4499,7 +4500,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| // Dart "extension" methods. Used for JS Array, Boolean, Number, String.
|
| var baseType = type;
|
| while (baseType is TypeParameterType) {
|
| - baseType = baseType.element.bound;
|
| + baseType = (baseType.element as TypeParameterElement).bound;
|
| }
|
| useExtension = baseType != null &&
|
| _extensionTypes.hasNativeSubtype(baseType) &&
|
| @@ -4539,7 +4540,7 @@ class CodeGenerator extends GeneralizingAstVisitor
|
| [Element element]) {
|
| if (options.closure && element != null) {
|
| node = node.withClosureAnnotation(closureAnnotationFor(
|
| - node, original, element, namedArgumentTemp.name));
|
| + node, original, element, namedArgumentTemp.name)) as dynamic/*=T*/;
|
| }
|
| return node..sourceInformation = original;
|
| }
|
|
|