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