Version 2.14.0-161.0.dev

Merge commit '39dead43946645c069f730f0528e20f70e85fc65' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index a383d72..7012a9a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -183,6 +183,8 @@
         counterUnlinkedLinkedBytes += resolutionBytes.length;
 
         librariesLinkedTimer.stop();
+        // TODO(scheglov) Uncomment to keep linking elements.
+        // return;
       } else {
         // TODO(scheglov) Take / clear parsed units in files.
         bytesGet += resolutionBytes.length;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 3fd6aab..852469a 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -751,6 +751,11 @@
   ConstructorElement? getNamedConstructor(String name) =>
       getNamedConstructorFromList(name, constructors);
 
+  void resetMixinApplicationConstructors() {
+    assert(isMixinApplication);
+    _constructors = _Sentinel.constructorElement;
+  }
+
   void setLinkedData(Reference reference, ElementLinkedData linkedData) {
     this.reference = reference;
     reference.element = this;
@@ -3846,14 +3851,8 @@
 
   @override
   Namespace get publicNamespace {
-    if (_publicNamespace != null) return _publicNamespace!;
-
-    if (linkedData != null) {
-      return _publicNamespace =
-          NamespaceBuilder().createPublicNamespaceForLibrary(this);
-    }
-
-    return _publicNamespace!;
+    return _publicNamespace ??=
+        NamespaceBuilder().createPublicNamespaceForLibrary(this);
   }
 
   set publicNamespace(Namespace publicNamespace) {
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index e9a453d..f8033c7 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/src/summary2/library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/util/comment.dart';
 import 'package:collection/collection.dart';
 
 class ElementBuilder extends ThrowingAstVisitor<void> {
@@ -82,6 +83,9 @@
     var firstDirective = unit.directives.firstOrNull;
     if (firstDirective != null) {
       _libraryElement.metadata = _buildAnnotations(firstDirective.metadata);
+      _libraryElement.documentationComment = getCommentNodeRawText(
+        firstDirective.documentationComment,
+      );
     }
   }
 
@@ -94,6 +98,7 @@
     element.isAbstract = node.isAbstract;
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
 
     nameNode.staticElement = element;
     _linker.elementNodes[element] = node;
@@ -126,6 +131,7 @@
     element.isMixinApplication = true;
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
 
     nameNode.staticElement = element;
     _linker.elementNodes[element] = node;
@@ -151,17 +157,23 @@
   void visitConstructorDeclaration(
     covariant ConstructorDeclarationImpl node,
   ) {
-    var nameNode = node.name;
-    var name = nameNode?.name ?? '';
-    var nameOffset = nameNode?.offset ?? -1;
+    var nameNode = node.name ?? node.returnType;
+    var name = node.name?.name ?? '';
+    var nameOffset = nameNode.offset;
 
     var element = ConstructorElementImpl(name, nameOffset);
-    element.constantInitializers = node.initializers;
     element.isConst = node.constKeyword != null;
     element.isExternal = node.externalKeyword != null;
     element.isFactory = node.factoryKeyword != null;
     element.metadata = _buildAnnotations(node.metadata);
+    element.nameEnd = nameNode.end;
+    element.periodOffset = node.period?.offset;
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
+
+    if (element.isConst || element.isFactory) {
+      element.constantInitializers = node.initializers;
+    }
 
     node.declaredElement = element;
     _linker.elementNodes[element] = node;
@@ -188,6 +200,7 @@
     var element = EnumElementImpl(name, nameOffset);
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
 
     nameNode.staticElement = element;
     _linker.elementNodes[element] = node;
@@ -222,6 +235,7 @@
     var element = ExtensionElementImpl(name, nameOffset);
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
 
     node.declaredElement = element;
     _linker.elementNodes[element] = node;
@@ -280,6 +294,8 @@
       element.isLate = node.fields.isLate;
       element.isStatic = node.isStatic;
       element.metadata = _buildAnnotations(node.metadata);
+      _setCodeRange(element, variable);
+      _setDocumentation(element, node);
 
       if (node.fields.type == null) {
         element.hasImplicitType = true;
@@ -401,6 +417,7 @@
     executableElement.isGenerator = body.isGenerator;
     executableElement.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(executableElement, node);
+    _setDocumentation(executableElement, node);
 
     nameNode.staticElement = executableElement;
     _linker.elementNodes[executableElement] = node;
@@ -432,6 +449,7 @@
     element.isFunctionTypeAliasBased = true;
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
 
     nameNode.staticElement = element;
     _linker.elementNodes[element] = node;
@@ -541,6 +559,7 @@
     }
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
 
     nameNode.staticElement = element;
     _linker.elementNodes[element] = node;
@@ -654,6 +673,7 @@
     executableElement.isGenerator = node.body.isGenerator;
     executableElement.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(executableElement, node);
+    _setDocumentation(executableElement, node);
 
     nameNode.staticElement = executableElement;
     _linker.elementNodes[executableElement] = node;
@@ -676,6 +696,7 @@
     var element = MixinElementImpl(name, nameNode.offset);
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
+    _setDocumentation(element, node);
 
     nameNode.staticElement = element;
     _linker.elementNodes[element] = node;
@@ -777,6 +798,8 @@
       element.isFinal = node.variables.isFinal;
       element.isLate = node.variables.isLate;
       element.metadata = _buildAnnotations(node.metadata);
+      _setCodeRange(element, variable);
+      _setDocumentation(element, node);
 
       if (node.variables.type == null) {
         element.hasImplicitType = true;
@@ -824,6 +847,7 @@
 
     var element = TypeParameterElementImpl(name, nameNode.offset);
     element.metadata = _buildAnnotations(node.metadata);
+    _setCodeRange(element, node);
 
     nameNode.staticElement = element;
     _linker.elementNodes[element] = node;
@@ -1047,6 +1071,10 @@
           var name = constant.name.name;
           var reference = containerRef.getChild(name);
           var field = ConstFieldElementImpl_EnumValue(element, name, i);
+          // TODO(scheglov) test it
+          field.nameOffset = constant.name.offset;
+          _setCodeRange(field, constant);
+          _setDocumentation(field, constant);
           field.reference = reference;
           field.metadata = _buildAnnotationsWithUnit(
             unitElement as CompilationUnitElementImpl,
@@ -1078,10 +1106,11 @@
 
     var annotations = <ElementAnnotation>[];
     for (int i = 0; i < length; i++) {
-      var ast = nodeList[i];
-      annotations.add(ElementAnnotationImpl(unitElement)
-        ..annotationAst = ast
-        ..element = ast.element);
+      var ast = nodeList[i] as AnnotationImpl;
+      var element = ElementAnnotationImpl(unitElement);
+      element.annotationAst = ast;
+      ast.elementAnnotation = element;
+      annotations.add(element);
     }
     return annotations;
   }
@@ -1096,6 +1125,8 @@
       }
       if (node is ShowCombinator) {
         return ShowElementCombinatorImpl()
+          ..offset = node.keyword.offset
+          ..end = node.end
           ..shownNames = node.shownNames.nameList;
       }
       throw UnimplementedError('${node.runtimeType}');
@@ -1103,8 +1134,27 @@
   }
 
   static void _setCodeRange(ElementImpl element, AstNode node) {
+    var parent = node.parent;
+    if (node is FormalParameter && parent is DefaultFormalParameter) {
+      node = parent;
+    }
+
+    if (node is VariableDeclaration && parent is VariableDeclarationList) {
+      var fieldDeclaration = parent.parent;
+      if (fieldDeclaration != null && parent.variables.first == node) {
+        var offset = fieldDeclaration.offset;
+        element.setCodeRange(offset, node.end - offset);
+        return;
+      }
+    }
+
     element.setCodeRange(node.offset, node.length);
   }
+
+  static void _setDocumentation(ElementImpl element, AnnotatedNode node) {
+    element.documentationComment =
+        getCommentNodeRawText(node.documentationComment);
+  }
 }
 
 class _EnclosingContext {
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index fbff8be..d3531b7 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -200,6 +200,8 @@
     if (entryPoint is FunctionElement) {
       element.entryPoint = entryPoint;
     }
+
+    linker.elementFactory.setExportsOfLibrary('$uri', exports);
   }
 
   static void build(Linker linker, LinkInputLibrary inputLibrary) {
@@ -250,6 +252,7 @@
       unitElement.lineInfo = unitNode.lineInfo;
       unitElement.source = inputUnit.source;
       unitElement.uri = inputUnit.partUriStr;
+      unitElement.setCodeRange(0, unitNode.length);
 
       var unitReference = unitContainerRef.getChild(inputUnit.uriStr);
       _bindReference(unitReference, unitElement);
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index 8cb08c7..a161473 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -79,6 +79,7 @@
     _writeLibraries();
     timerLinkingLinkingBundle.stop();
 
+    // TODO(scheglov) Remove to keep linking elements.
     timerLinkingRemoveBundle.start();
     elementFactory.removeBundle(
       inputLibraries.map((e) => e.uriStr).toSet(),
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 92f3296..a449b97 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -16,6 +16,7 @@
   final AnalysisSessionImpl analysisSession;
   final Reference rootReference;
   final Map<String, LibraryReader> libraryReaders = {};
+  final _exportsOfLibrary = <String, List<Reference>>{};
 
   bool isApplyingInformativeData = false;
 
@@ -150,6 +151,10 @@
   }
 
   List<Reference> exportsOfLibrary(String uriStr) {
+    var exports = _exportsOfLibrary[uriStr];
+    if (exports != null) return exports;
+
+    // TODO(scheglov) Use [setExportsOfLibrary] instead
     var library = libraryReaders[uriStr];
     if (library == null) return const [];
 
@@ -203,6 +208,7 @@
   /// any session level caches.
   void removeLibraries(Set<String> uriStrSet) {
     for (var uriStr in uriStrSet) {
+      _exportsOfLibrary.remove(uriStr);
       libraryReaders.remove(uriStr);
       rootReference.removeChild(uriStr);
     }
@@ -211,6 +217,12 @@
     analysisSession.inheritanceManager.removeOfLibraries(uriStrSet);
   }
 
+  /// Set exports of the library with [uriStr], after building exports during
+  /// linking, or after reading a linked bundle.
+  void setExportsOfLibrary(String uriStr, List<Reference> exports) {
+    _exportsOfLibrary[uriStr] = exports;
+  }
+
   void setLibraryTypeSystem(LibraryElementImpl libraryElement) {
     // During linking we create libraries when typeProvider is not ready.
     // And if we link dart:core and dart:async, we cannot create it.
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index a999222..4b4a1ad 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -22,10 +22,12 @@
 
   @override
   void visitAnnotation(covariant AnnotationImpl node) {
-    node.elementAnnotation = ElementAnnotationImpl(_unitElement);
-
-    var astResolver = AstResolver(_linker, _unitElement, _scope, node);
-    astResolver.resolveAnnotation(node);
+    var annotationElement = node.elementAnnotation;
+    if (annotationElement is ElementAnnotationImpl) {
+      var astResolver = AstResolver(_linker, _unitElement, _scope, node);
+      astResolver.resolveAnnotation(node);
+      annotationElement.element = node.element;
+    }
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 7fd8d02..7fe4fe8 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -282,6 +282,7 @@
 
   void perform() {
     _walker.walkNodes();
+    _resetMixinApplicationConstructors();
   }
 
   void _addClassConstructorFieldFormals(ClassElement class_) {
@@ -326,6 +327,28 @@
       (element as PropertyInducingElementImpl).type = DynamicTypeImpl.instance;
     }
   }
+
+  /// This is necessary to work around the ordering issue - we infer types
+  /// of fields and types of field formal parameters in constructors as one
+  /// graph walking operation. So, we ask for mixin application constructors,
+  /// and copy not-yet-computed types of formal parameters from base classes.
+  ///
+  /// Here we reset constructors, so that when we create them again, we will
+  /// get inferred types of formal parameters.
+  ///
+  /// TODO(scheglov) Ideally we should use correct ordering instead.
+  void _resetMixinApplicationConstructors() {
+    for (var builder in _linker.builders.values) {
+      for (var unitElement in builder.element.units) {
+        for (var classElement in unitElement.types) {
+          if (classElement is ClassElementImpl &&
+              classElement.isMixinApplication) {
+            classElement.resetMixinApplicationConstructors();
+          }
+        }
+      }
+    }
+  }
 }
 
 class _PropertyInducingElementTypeInference
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 51f3b5b..e3e0548 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -1217,7 +1217,7 @@
   }
 
   String _getElementLocationString(Element? element) {
-    if (element == null) {
+    if (element == null || element is MultiplyDefinedElement) {
       return 'null';
     }
 
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index b90d591..701c255 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1715,6 +1715,8 @@
         var mapStr = _substitutionMapStr(map);
         _writelnWithIndent('substitution: $mapStr');
       });
+    } else if (element is MultiplyDefinedElement) {
+      _sink.writeln('<null>');
     } else {
       var reference = (element as ElementImpl).reference;
       if (reference != null) {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index 758cfc0..c51934d 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -124,6 +124,7 @@
 
     var linkResult = link(elementFactory, inputLibraries, true);
 
+    // TODO(scheglov) Remove to keep linking elements.
     elementFactory.addBundle(
       BundleReader(
         elementFactory: elementFactory,
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 925dec6..8cd8eb7 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -13119,6 +13119,43 @@
 ''');
   }
 
+  @FailingTest(reason: '''
+Synthetic mixin application constructors are created before types of fields
+are inferred.
+''')
+  test_type_inference_field_depends_onFieldFormal_withMixinApp() async {
+    var library = await checkLibrary('''
+class A<T> {
+  T value;
+
+  A(this.value);
+}
+
+class B<T> = A<T> with M;
+
+class C {
+  var a = new B(42);
+}
+
+mixin M {}
+''');
+    checkElementText(library, r'''
+class A<T> {
+  T value;
+  A(final T this.value);
+}
+class alias B<T> extends A<T> with M {
+  synthetic B(final T value) : super(
+        value/*location: test.dart;B;;value*/);
+}
+class C {
+  B<int> a;
+}
+mixin M on Object {
+}
+''');
+  }
+
   test_type_inference_fieldFormal_depends_onField() async {
     var library = await checkLibrary('''
 class A<T> {
@@ -15400,6 +15437,12 @@
     var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
     var reference = unit.reference!;
     names.forEach((name) => reference = reference.getChild(name));
+
+    var element = reference.element;
+    if (element != null) {
+      return element;
+    }
+
     var elementFactory = library.linkedData!.elementFactory;
     return elementFactory.elementOfReference(reference)!;
   }
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 8ab6fca..42d895a 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -21,7 +21,9 @@
 }
 
 config("libdart_builtin_config") {
-  if (!is_win) {
+  if (is_win) {
+    libs = [ "bcrypt.lib" ]
+  } else {
     libs = [ "dl" ]
   }
   if (is_android) {
@@ -214,7 +216,6 @@
         "Rpcrt4.lib",
         "shlwapi.lib",
         "winmm.lib",
-        "bcrypt.lib",
       ]
       if (target_os != "winuwp") {
         libs += [ "psapi.lib" ]
@@ -785,7 +786,6 @@
         "Rpcrt4.lib",
         "shlwapi.lib",
         "winmm.lib",
-        "bcrypt.lib",
       ]
     }
   }
@@ -960,7 +960,6 @@
       "Rpcrt4.lib",
       "shlwapi.lib",
       "winmm.lib",
-      "bcrypt.lib",
     ]
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index 91be7bf..bc0a457 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 160
+PRERELEASE 161
 PRERELEASE_PATCH 0
\ No newline at end of file