| Index: pkg/analyzer/lib/src/dart/element/element.dart
 | 
| diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
 | 
| index dbff10ebee74a66d83473c08b8d2c53d74dbab38..ebd1f63a559a4f28940bff5542e05217321b9137 100644
 | 
| --- a/pkg/analyzer/lib/src/dart/element/element.dart
 | 
| +++ b/pkg/analyzer/lib/src/dart/element/element.dart
 | 
| @@ -1683,6 +1683,11 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
 | 
|  
 | 
|    @override
 | 
|    List<FunctionTypeAliasElement> get functionTypeAliases {
 | 
| +    if (_kernelContext != null) {
 | 
| +      _typeAliases ??= _kernelContext.library.typedefs
 | 
| +          .map((k) => new FunctionTypeAliasElementImpl.forKernel(this, k))
 | 
| +          .toList(growable: false);
 | 
| +    }
 | 
|      if (_unlinkedUnit != null) {
 | 
|        _typeAliases ??= _unlinkedUnit.typedefs.map((t) {
 | 
|          if (t.style == TypedefStyle.functionType) {
 | 
| @@ -4921,6 +4926,11 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|    final UnlinkedTypedef _unlinkedTypedef;
 | 
|  
 | 
|    /**
 | 
| +   * The kernel of the element.
 | 
| +   */
 | 
| +  final kernel.Typedef _kernel;
 | 
| +
 | 
| +  /**
 | 
|     * A list containing all of the parameters defined by this type alias.
 | 
|     */
 | 
|    List<ParameterElement> _parameters;
 | 
| @@ -4944,13 +4954,23 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|     */
 | 
|    FunctionTypeAliasElementImpl(String name, int nameOffset)
 | 
|        : _unlinkedTypedef = null,
 | 
| +        _kernel = null,
 | 
|          super(name, nameOffset);
 | 
|  
 | 
|    /**
 | 
| +   * Initialize using the given kernel.
 | 
| +   */
 | 
| +  FunctionTypeAliasElementImpl.forKernel(
 | 
| +      CompilationUnitElementImpl enclosingUnit, this._kernel)
 | 
| +      : _unlinkedTypedef = null,
 | 
| +        super.forSerialized(enclosingUnit);
 | 
| +
 | 
| +  /**
 | 
|     * Initialize a newly created type alias element to have the given [name].
 | 
|     */
 | 
|    FunctionTypeAliasElementImpl.forNode(Identifier name)
 | 
|        : _unlinkedTypedef = null,
 | 
| +        _kernel = null,
 | 
|          super.forNode(name);
 | 
|  
 | 
|    /**
 | 
| @@ -4958,7 +4978,8 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|     */
 | 
|    FunctionTypeAliasElementImpl.forSerialized(
 | 
|        this._unlinkedTypedef, CompilationUnitElementImpl enclosingUnit)
 | 
| -      : super.forSerialized(enclosingUnit);
 | 
| +      : _kernel = null,
 | 
| +        super.forSerialized(enclosingUnit);
 | 
|  
 | 
|    @override
 | 
|    int get codeLength {
 | 
| @@ -4999,7 +5020,7 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|        _enclosingElement as CompilationUnitElementImpl;
 | 
|  
 | 
|    @override
 | 
| -  List<kernel.TypeParameter> get kernelTypeParams => null;
 | 
| +  List<kernel.TypeParameter> get kernelTypeParams => _kernel?.typeParameters;
 | 
|  
 | 
|    @override
 | 
|    ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
 | 
| @@ -5015,6 +5036,9 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|  
 | 
|    @override
 | 
|    String get name {
 | 
| +    if (_kernel != null) {
 | 
| +      return _kernel.name;
 | 
| +    }
 | 
|      if (_unlinkedTypedef != null) {
 | 
|        return _unlinkedTypedef.name;
 | 
|      }
 | 
| @@ -5032,6 +5056,13 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|  
 | 
|    @override
 | 
|    List<ParameterElement> get parameters {
 | 
| +    if (_kernel != null) {
 | 
| +      _parameters ??= ParameterElementImpl.forKernelParameters(
 | 
| +          this,
 | 
| +          _kernel.requiredParameterCount,
 | 
| +          _kernel.positionalParameters,
 | 
| +          _kernel.namedParameters);
 | 
| +    }
 | 
|      if (_unlinkedTypedef != null) {
 | 
|        _parameters ??= ParameterElementImpl.resynthesizeList(
 | 
|            _unlinkedTypedef.parameters, this);
 | 
| @@ -5054,10 +5085,17 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|  
 | 
|    @override
 | 
|    DartType get returnType {
 | 
| -    if (_unlinkedTypedef != null && _returnType == null) {
 | 
| -      _returnType = enclosingUnit.resynthesizerContext.resolveTypeRef(
 | 
| -          this, _unlinkedTypedef.returnType,
 | 
| -          declaredType: true);
 | 
| +    if (_returnType == null) {
 | 
| +      if (_kernel != null) {
 | 
| +        var type = _kernel.type as kernel.FunctionType;
 | 
| +        _returnType =
 | 
| +            enclosingUnit._kernelContext.getType(this, type.returnType);
 | 
| +      }
 | 
| +      if (_unlinkedTypedef != null) {
 | 
| +        _returnType = enclosingUnit.resynthesizerContext.resolveTypeRef(
 | 
| +            this, _unlinkedTypedef.returnType,
 | 
| +            declaredType: true);
 | 
| +      }
 | 
|      }
 | 
|      return _returnType;
 | 
|    }
 | 
| @@ -5069,8 +5107,10 @@ class FunctionTypeAliasElementImpl extends ElementImpl
 | 
|  
 | 
|    @override
 | 
|    FunctionType get type {
 | 
| -    if (_unlinkedTypedef != null && _type == null) {
 | 
| -      _type = new FunctionTypeImpl.forTypedef(this);
 | 
| +    if (_type == null) {
 | 
| +      if (_kernel != null || _unlinkedTypedef != null) {
 | 
| +        _type = new FunctionTypeImpl.forTypedef(this);
 | 
| +      }
 | 
|      }
 | 
|      return _type;
 | 
|    }
 | 
| 
 |