diff --git a/DEPS b/DEPS
index 2c9ef02..cc4a62a 100644
--- a/DEPS
+++ b/DEPS
@@ -101,7 +101,7 @@
   "dart_style_tag": "1.3.11",  # Please see the note above before updating.
 
   "chromedriver_tag": "83.0.4103.39",
-  "dartdoc_rev" : "a1d86f2c992f4660ddcc09b27733396e92765d2a",
+  "dartdoc_rev" : "9e61a4f11091aaa8998525a2692b14148dc24ab5",
   "ffi_rev": "31352979f261f7c6ea88fa0a2cfb0fdd004c38fb",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
   "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 3260c5d..ddc1c22 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -127,7 +127,7 @@
   SearchedFiles _createSearchedFiles(List<AnalysisDriver> drivers) {
     var searchedFiles = SearchedFiles();
     for (var driver in drivers) {
-      searchedFiles.ownAdded(driver.search);
+      searchedFiles.ownAnalyzed(driver.search);
     }
     return searchedFiles;
   }
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 14990fd..9676017 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -278,6 +278,21 @@
   }
 }
 
+mixin WithNonFunctionTypeAliasesMixin on AbstractContextTest {
+  @override
+  String get testPackageLanguageVersion => null;
+
+  @nonVirtual
+  @override
+  void setUp() {
+    super.setUp();
+
+    createAnalysisOptionsFile(
+      experiments: [EnableString.nonfunction_type_aliases],
+    );
+  }
+}
+
 mixin WithNullSafetyMixin on AbstractContextTest {
   @override
   String get testPackageLanguageVersion => '2.12';
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 006b6c1..1dca4d3 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -53,11 +52,6 @@
     return findOffset(search) + search.length;
   }
 
-  /// Returns the [SimpleIdentifier] at the given search pattern.
-  SimpleIdentifier findIdentifier(String search) {
-    return findNodeAtString(search, (node) => node is SimpleIdentifier);
-  }
-
   AstNode findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
     var result = NodeLocator(offset).searchWithin(testUnit);
     if (result != null && predicate != null) {
@@ -71,42 +65,12 @@
     return findNodeAtOffset(offset, predicate);
   }
 
-  Element findNodeElementAtString(String search,
-      [Predicate<AstNode> predicate]) {
-    var node = findNodeAtString(search, predicate);
-    if (node == null) {
-      return null;
-    }
-    return ElementLocator.locate(node);
-  }
-
   int findOffset(String search) {
     var offset = testCode.indexOf(search);
     expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
     return offset;
   }
 
-  int getLeadingIdentifierLength(String search) {
-    var length = 0;
-    while (length < search.length) {
-      var c = search.codeUnitAt(length);
-      if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) {
-        length++;
-        continue;
-      }
-      if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) {
-        length++;
-        continue;
-      }
-      if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) {
-        length++;
-        continue;
-      }
-      break;
-    }
-    return length;
-  }
-
   @override
   File newFile(String path, {String content = ''}) {
     if (useLineEndingsForPlatform) {
@@ -122,6 +86,7 @@
 
   Future<void> resolveTestFile() async {
     testAnalysisResult = await session.getResolvedUnit(testFile);
+    testCode = testAnalysisResult.content;
     testUnit = testAnalysisResult.unit;
     if (verifyNoTestUnitErrors) {
       expect(testAnalysisResult.errors.where((AnalysisError error) {
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 7de0635..3a3c7aa 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -40,7 +40,7 @@
   /// Creates a new [RenameRefactoring] in [refactoring] for the [Element] of
   /// the [SimpleIdentifier] at the given [search] pattern.
   void createRenameRefactoringAtString(String search) {
-    var identifier = findIdentifier(search);
+    var identifier = findNode.simple(search);
     var element = identifier.writeOrReadElement;
     if (element is PrefixElement) {
       element = getImportElement(identifier);
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
index 5f334d4..aa6c028 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -63,7 +63,8 @@
   var vd = d.test;
 }
 ''');
-    _createRefactoringForString('test => 2');
+    var element = findElement.getter('test', of: 'B');
+    _createRefactoringForElement(element);
     // apply refactoring
     return _assertSuccessfulRefactoring('''
 class A {
@@ -103,7 +104,8 @@
   b.test;
 }
 ''');
-    _createRefactoringForString('test => 2');
+    var element = findElement.getter('test', of: 'B');
+    _createRefactoringForElement(element);
     // apply refactoring
     return _assertSuccessfulRefactoring('''
 import 'other.dart';
@@ -149,9 +151,4 @@
     refactoring = ConvertGetterToMethodRefactoring(
         searchEngine, testAnalysisResult.session, element);
   }
-
-  void _createRefactoringForString(String search) {
-    ExecutableElement element = findNodeElementAtString(search);
-    _createRefactoringForElement(element);
-  }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index e80bb98..4683949 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -63,7 +63,8 @@
   var vd = d.test();
 }
 ''');
-    _createRefactoringForString('test() => 2');
+    var element = findElement.method('test', of: 'B');
+    _createRefactoringForElement(element);
     // apply refactoring
     return _assertSuccessfulRefactoring('''
 class A {
@@ -103,7 +104,8 @@
   b.test();
 }
 ''');
-    _createRefactoringForString('test() => 2');
+    var element = findElement.method('test', of: 'B');
+    _createRefactoringForElement(element);
     // apply refactoring
     return _assertSuccessfulRefactoring('''
 import 'other.dart';
@@ -203,9 +205,4 @@
     refactoring = ConvertMethodToGetterRefactoring(
         searchEngine, testAnalysisResult.session, element);
   }
-
-  void _createRefactoringForString(String search) {
-    ExecutableElement element = findNodeElementAtString(search);
-    _createRefactoringForElement(element);
-  }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index 045a97a..52da455 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -236,14 +234,13 @@
   }
 
   void _createConstructorDeclarationRefactoring(String search) {
-    ConstructorElement element = findNodeElementAtString(
-        search, (node) => node is ConstructorDeclaration);
+    var element = findNode.constructor(search).declaredElement;
     createRenameRefactoringForElement(element);
   }
 
   void _createConstructorInvocationRefactoring(String search) {
-    ConstructorElement element = findNodeElementAtString(
-        search, (node) => node is InstanceCreationExpression);
+    var instanceCreation = findNode.instanceCreation(search);
+    var element = instanceCreation.constructorName.staticElement;
     createRenameRefactoringForElement(element);
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 31993ea..e13ea89 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -465,10 +465,8 @@
 ''');
     await analyzeTestPackageFiles();
 
-    testAnalysisResult = await resolveFile(a);
-    testFile = testAnalysisResult.path;
-    testCode = testAnalysisResult.content;
-    testUnit = testAnalysisResult.unit;
+    testFile = a;
+    await resolveTestFile();
 
     createRenameRefactoringAtString('test});');
     expect(refactoring.refactoringName, 'Rename Parameter');
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index f090ec9..9e59c61 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -17,6 +17,7 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SearchEngineImplTest);
+    defineReflectiveTests(SearchEngineImplWithNonFunctionTypeAliasesTest);
   });
 }
 
@@ -61,22 +62,6 @@
     return SearchEngineImpl(allDrivers);
   }
 
-  @override
-  void setUp() {
-    super.setUp();
-
-    // TODO(scheglov) This is not ideal.
-    // We write into the root because we choose the workspace root to
-    // index `aaa/lib/a.dart`. But ideally we should use the context root
-    // that contains it (i.e. `root/aaa`), or a context root where it is a
-    // package (e.g. `root/test`).
-    writePackageConfig(
-      '$workspaceRootPath/.dart_tool/package_config.json',
-      PackageConfigFileBuilder()
-        ..add(name: 'test', rootPath: testPackageRootPath),
-    );
-  }
-
   Future<void> test_membersOfSubtypes_hasMembers() async {
     newFile('$testPackageLibPath/a.dart', content: '''
 class A {
@@ -424,22 +409,16 @@
   String _configureForPackage_aaa() {
     var aaaRootPath = '$workspaceRootPath/aaa';
 
+    writePackageConfig(
+      '$aaaRootPath/.dart_tool/package_config.json',
+      PackageConfigFileBuilder()..add(name: 'aaa', rootPath: aaaRootPath),
+    );
+
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
         ..add(name: 'aaa', rootPath: aaaRootPath),
     );
 
-    // TODO(scheglov) This is not ideal.
-    // We write into the root because we choose the workspace root to
-    // index `aaa/lib/a.dart`. But ideally we should use the context root
-    // that contains it (i.e. `root/aaa`), or a context root where it is a
-    // package (e.g. `root/test`).
-    writePackageConfig(
-      '$workspaceRootPath/.dart_tool/package_config.json',
-      PackageConfigFileBuilder()
-        ..add(name: 'aaa', rootPath: aaaRootPath)
-        ..add(name: 'test', rootPath: testPackageRootPath),
-    );
     return aaaRootPath;
   }
 
@@ -447,7 +426,9 @@
     for (var driver in allDrivers) {
       var contextRoot = driver.analysisContext.contextRoot;
       for (var file in contextRoot.analyzedFiles()) {
-        await driver.getUnitElement(file);
+        if (file.endsWith('.dart')) {
+          await driver.getUnitElement(file);
+        }
       }
     }
   }
@@ -456,3 +437,33 @@
     expect(subtypes, contains(predicate((ClassElement e) => e.name == name)));
   }
 }
+
+@reflectiveTest
+class SearchEngineImplWithNonFunctionTypeAliasesTest
+    extends SearchEngineImplTest with WithNonFunctionTypeAliasesMixin {
+  Future<void> test_searchReferences_typeAlias_interfaceType() async {
+    await resolveTestCode('''
+typedef A<T> = Map<T, String>;
+
+void f(A<int> a, A<double> b) {}
+''');
+
+    var element = findElement.typeAlias('A');
+    var matches = await searchEngine.searchReferences(element);
+
+    Matcher hasOne(Element element, String search) {
+      return predicate((SearchMatch match) {
+        return match.element == element &&
+            match.sourceRange.offset == findNode.offset(search);
+      });
+    }
+
+    expect(
+      matches,
+      unorderedMatches([
+        hasOne(findElement.parameter('a'), 'A<int>'),
+        hasOne(findElement.parameter('b'), 'A<double>'),
+      ]),
+    );
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index cf8be4e..dc113ba 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -248,9 +248,8 @@
 
   void _computeConstantErrors(
       ErrorReporter errorReporter, CompilationUnit unit) {
-    ConstantVerifier constantVerifier = ConstantVerifier(
-        errorReporter, _libraryElement, _declaredVariables,
-        featureSet: unit.featureSet);
+    ConstantVerifier constantVerifier =
+        ConstantVerifier(errorReporter, _libraryElement, _declaredVariables);
     unit.accept(constantVerifier);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index d9cf7b5..4207727 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -249,7 +249,7 @@
       }
     } else {
       files = await _driver.getFilesReferencingName(name);
-      if (!files.contains(path)) {
+      if (searchedFiles.add(path, this) && !files.contains(path)) {
         files.add(path);
       }
     }
@@ -500,9 +500,12 @@
     return identical(pathOwner, search) && identical(uriOwner, search);
   }
 
-  void ownAdded(Search search) {
-    for (var path in search._driver.addedFiles) {
-      add(path, search);
+  void ownAnalyzed(Search search) {
+    var contextRoot = search._driver.analysisContext.contextRoot;
+    for (var path in contextRoot.analyzedFiles()) {
+      if (path.endsWith('.dart')) {
+        add(path, search);
+      }
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index ad1100b..e517f1d 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -46,38 +45,30 @@
   /// The current library that is being analyzed.
   final LibraryElement _currentLibrary;
 
-  final bool _constantUpdate2018Enabled;
-
   final ConstantEvaluationEngine _evaluationEngine;
 
   final DiagnosticFactory _diagnosticFactory = DiagnosticFactory();
 
   /// Initialize a newly created constant verifier.
-  ConstantVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary,
-      DeclaredVariables declaredVariables,
-      {
-      // TODO(paulberry): make [featureSet] a required parameter.
-      FeatureSet featureSet})
-      : this._(
-            errorReporter,
-            currentLibrary,
-            currentLibrary.typeSystem,
-            currentLibrary.typeProvider,
-            declaredVariables,
-            featureSet ??
-                (currentLibrary.context.analysisOptions as AnalysisOptionsImpl)
-                    .contextFeatures);
+  ConstantVerifier(
+    ErrorReporter errorReporter,
+    LibraryElement currentLibrary,
+    DeclaredVariables declaredVariables,
+  ) : this._(
+          errorReporter,
+          currentLibrary,
+          currentLibrary.typeSystem,
+          currentLibrary.typeProvider,
+          declaredVariables,
+        );
 
   ConstantVerifier._(
-      this._errorReporter,
-      this._currentLibrary,
-      this._typeSystem,
-      this._typeProvider,
-      this.declaredVariables,
-      FeatureSet featureSet)
-      : _constantUpdate2018Enabled =
-            featureSet.isEnabled(Feature.constant_update_2018),
-        _intType = _typeProvider.intType,
+    this._errorReporter,
+    this._currentLibrary,
+    this._typeSystem,
+    this._typeProvider,
+    this.declaredVariables,
+  )   : _intType = _typeProvider.intType,
         _evaluationEngine = ConstantEvaluationEngine(declaredVariables);
 
   bool get _isNonNullableByDefault => _currentLibrary.isNonNullableByDefault;
@@ -704,10 +695,6 @@
       verifier._errorReporter.reportErrorForNode(errorCode, element);
       return false;
     } else if (element is IfElement) {
-      if (!verifier._constantUpdate2018Enabled) {
-        verifier._errorReporter.reportErrorForNode(errorCode, element);
-        return false;
-      }
       var conditionValue = verifier._validate(element.condition, errorCode);
       var conditionBool = conditionValue?.toBoolValue();
 
@@ -735,10 +722,6 @@
     } else if (element is MapLiteralEntry) {
       return _validateMapLiteralEntry(element);
     } else if (element is SpreadElement) {
-      if (!verifier._constantUpdate2018Enabled) {
-        verifier._errorReporter.reportErrorForNode(errorCode, element);
-        return false;
-      }
       var value = verifier._validate(element.expression, errorCode);
       if (value == null) return false;
 
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 8ca926c..329422d 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -5,7 +5,6 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -979,10 +978,6 @@
   /// Convenience getter to gain access to the [evaluationEngine]'s type system.
   TypeSystemImpl get typeSystem => _library.typeSystem;
 
-  bool get _isEnabledConstantUpdate2018 {
-    return _library.featureSet.isEnabled(Feature.constant_update_2018);
-  }
-
   bool get _isNonNullableByDefault => typeSystem.isNonNullableByDefault;
 
   /// Convenience getter to gain access to the [evaluationEngine]'s type
@@ -1005,14 +1000,9 @@
 
   @override
   DartObjectImpl visitAsExpression(AsExpression node) {
-    if (_isEnabledConstantUpdate2018) {
-      DartObjectImpl expressionResult = node.expression.accept(this);
-      DartObjectImpl typeResult = node.type.accept(this);
-      return _dartObjectComputer.castToType(node, expressionResult, typeResult);
-    }
-    // TODO(brianwilkerson) Figure out which error to report.
-    _error(node, null);
-    return null;
+    DartObjectImpl expressionResult = node.expression.accept(this);
+    DartObjectImpl typeResult = node.type.accept(this);
+    return _dartObjectComputer.castToType(node, expressionResult, typeResult);
   }
 
   @override
@@ -1027,33 +1017,21 @@
       return _dartObjectComputer.lazyOr(
           node, leftResult, () => node.rightOperand.accept(this));
     } else if (operatorType == TokenType.QUESTION_QUESTION) {
-      if (_isEnabledConstantUpdate2018) {
-        return _dartObjectComputer.lazyQuestionQuestion(
-            node, leftResult, () => node.rightOperand.accept(this));
-      } else {
-        return _dartObjectComputer.eagerQuestionQuestion(
-            node, leftResult, node.rightOperand.accept(this));
-      }
+      return _dartObjectComputer.lazyQuestionQuestion(
+          node, leftResult, () => node.rightOperand.accept(this));
     }
     // evaluate eager operators
     DartObjectImpl rightResult = node.rightOperand.accept(this);
     if (operatorType == TokenType.AMPERSAND) {
-      return _dartObjectComputer.eagerAnd(
-          node, leftResult, rightResult, _isEnabledConstantUpdate2018);
+      return _dartObjectComputer.eagerAnd(node, leftResult, rightResult);
     } else if (operatorType == TokenType.BANG_EQ) {
       return _dartObjectComputer.notEqual(node, leftResult, rightResult);
     } else if (operatorType == TokenType.BAR) {
-      return _dartObjectComputer.eagerOr(
-          node, leftResult, rightResult, _isEnabledConstantUpdate2018);
+      return _dartObjectComputer.eagerOr(node, leftResult, rightResult);
     } else if (operatorType == TokenType.CARET) {
-      return _dartObjectComputer.eagerXor(
-          node, leftResult, rightResult, _isEnabledConstantUpdate2018);
+      return _dartObjectComputer.eagerXor(node, leftResult, rightResult);
     } else if (operatorType == TokenType.EQ_EQ) {
-      if (_isEnabledConstantUpdate2018) {
-        return _dartObjectComputer.lazyEqualEqual(
-            node, leftResult, rightResult);
-      }
-      return _dartObjectComputer.equalEqual(node, leftResult, rightResult);
+      return _dartObjectComputer.lazyEqualEqual(node, leftResult, rightResult);
     } else if (operatorType == TokenType.GT) {
       return _dartObjectComputer.greaterThan(node, leftResult, rightResult);
     } else if (operatorType == TokenType.GT_EQ) {
@@ -1102,44 +1080,13 @@
   DartObjectImpl visitConditionalExpression(ConditionalExpression node) {
     Expression condition = node.condition;
     DartObjectImpl conditionResult = condition.accept(this);
-    if (_isEnabledConstantUpdate2018) {
-      if (conditionResult == null) {
-        return conditionResult;
-      } else if (!conditionResult.isBool) {
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, condition);
-        return null;
-      }
-      conditionResult = _dartObjectComputer.applyBooleanConversion(
-          condition, conditionResult);
-      if (conditionResult == null) {
-        return conditionResult;
-      }
-      if (conditionResult.toBoolValue() == true) {
-        _reportNotPotentialConstants(node.elseExpression);
-        return node.thenExpression.accept(this);
-      } else if (conditionResult.toBoolValue() == false) {
-        _reportNotPotentialConstants(node.thenExpression);
-        return node.elseExpression.accept(this);
-      }
-      // We used to return an object with a known type and an unknown value, but
-      // we can't do that without evaluating both the 'then' and 'else'
-      // expressions, and we're not suppose to do that under lazy semantics. I'm
-      // not sure which failure mode is worse.
-      return null;
-    }
-    DartObjectImpl thenResult = node.thenExpression.accept(this);
-    DartObjectImpl elseResult = node.elseExpression.accept(this);
+
     if (conditionResult == null) {
       return conditionResult;
     } else if (!conditionResult.isBool) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, condition);
       return null;
-    } else if (thenResult == null) {
-      return thenResult;
-    } else if (elseResult == null) {
-      return elseResult;
     }
     conditionResult =
         _dartObjectComputer.applyBooleanConversion(condition, conditionResult);
@@ -1147,16 +1094,18 @@
       return conditionResult;
     }
     if (conditionResult.toBoolValue() == true) {
-      return thenResult;
+      _reportNotPotentialConstants(node.elseExpression);
+      return node.thenExpression.accept(this);
     } else if (conditionResult.toBoolValue() == false) {
-      return elseResult;
+      _reportNotPotentialConstants(node.thenExpression);
+      return node.elseExpression.accept(this);
     }
-    ParameterizedType thenType = thenResult.type;
-    ParameterizedType elseType = elseResult.type;
-    return DartObjectImpl.validWithUnknownValue(
-      typeSystem,
-      typeSystem.getLeastUpperBound(thenType, elseType) as ParameterizedType,
-    );
+
+    // We used to return an object with a known type and an unknown value, but
+    // we can't do that without evaluating both the 'then' and 'else'
+    // expressions, and we're not suppose to do that under lazy semantics. I'm
+    // not sure which failure mode is worse.
+    return null;
   }
 
   @override
@@ -1224,14 +1173,9 @@
 
   @override
   DartObjectImpl visitIsExpression(IsExpression node) {
-    if (_isEnabledConstantUpdate2018) {
-      DartObjectImpl expressionResult = node.expression.accept(this);
-      DartObjectImpl typeResult = node.type.accept(this);
-      return _dartObjectComputer.typeTest(node, expressionResult, typeResult);
-    }
-    // TODO(brianwilkerson) Figure out which error to report.
-    _error(node, null);
-    return null;
+    DartObjectImpl expressionResult = node.expression.accept(this);
+    DartObjectImpl typeResult = node.type.accept(this);
+    return _dartObjectComputer.typeTest(node, expressionResult, typeResult);
   }
 
   @override
@@ -1839,10 +1783,10 @@
   }
 
   DartObjectImpl eagerAnd(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand, bool allowBool) {
+      DartObjectImpl rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
-        return leftOperand.eagerAnd(_typeSystem, rightOperand, allowBool);
+        return leftOperand.eagerAnd(_typeSystem, rightOperand);
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
@@ -1851,10 +1795,10 @@
   }
 
   DartObjectImpl eagerOr(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand, bool allowBool) {
+      DartObjectImpl rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
-        return leftOperand.eagerOr(_typeSystem, rightOperand, allowBool);
+        return leftOperand.eagerOr(_typeSystem, rightOperand);
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
@@ -1874,10 +1818,10 @@
   }
 
   DartObjectImpl eagerXor(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand, bool allowBool) {
+      DartObjectImpl rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
-        return leftOperand.eagerXor(_typeSystem, rightOperand, allowBool);
+        return leftOperand.eagerXor(_typeSystem, rightOperand);
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index ee72b09..af14481 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -327,8 +327,8 @@
   /// Throws an [EvaluationException] if the operator is not appropriate for an
   /// object of this kind.
   DartObjectImpl eagerAnd(
-      TypeSystemImpl typeSystem, DartObjectImpl rightOperand, bool allowBool) {
-    if (allowBool && isBool && rightOperand.isBool) {
+      TypeSystemImpl typeSystem, DartObjectImpl rightOperand) {
+    if (isBool && rightOperand.isBool) {
       return DartObjectImpl(
         typeSystem,
         typeSystem.typeProvider.boolType,
@@ -350,8 +350,8 @@
   /// Throws an [EvaluationException] if the operator is not appropriate for an
   /// object of this kind.
   DartObjectImpl eagerOr(
-      TypeSystemImpl typeSystem, DartObjectImpl rightOperand, bool allowBool) {
-    if (allowBool && isBool && rightOperand.isBool) {
+      TypeSystemImpl typeSystem, DartObjectImpl rightOperand) {
+    if (isBool && rightOperand.isBool) {
       return DartObjectImpl(
         typeSystem,
         typeSystem.typeProvider.boolType,
@@ -373,8 +373,8 @@
   /// Throws an [EvaluationException] if the operator is not appropriate for an
   /// object of this kind.
   DartObjectImpl eagerXor(
-      TypeSystemImpl typeSystem, DartObjectImpl rightOperand, bool allowBool) {
-    if (allowBool && isBool && rightOperand.isBool) {
+      TypeSystemImpl typeSystem, DartObjectImpl rightOperand) {
+    if (isBool && rightOperand.isBool) {
       return DartObjectImpl(
         typeSystem,
         typeSystem.typeProvider.boolType,
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 44ab5b5..12a7a75 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -193,9 +193,8 @@
 
   void _computeConstantErrors(
       ErrorReporter errorReporter, CompilationUnit unit) {
-    ConstantVerifier constantVerifier = ConstantVerifier(
-        errorReporter, _libraryElement, _declaredVariables,
-        featureSet: unit.featureSet);
+    ConstantVerifier constantVerifier =
+        ConstantVerifier(errorReporter, _libraryElement, _declaredVariables);
     unit.accept(constantVerifier);
   }
 
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index d28ca62..bf67b7b 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -469,7 +469,6 @@
         errorReporter,
         libraryElement,
         declaredVariables,
-        featureSet: currentUnit.unit.featureSet,
       ),
     );
     return listener.hasConstError;
diff --git a/pkg/analyzer/test/src/dart/constant/value_test.dart b/pkg/analyzer/test/src/dart/constant/value_test.dart
index 0a47069..df77b25 100644
--- a/pkg/analyzer/test/src/dart/constant/value_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/value_test.dart
@@ -261,6 +261,87 @@
     _assertDivide(_doubleValue(null), _intValue(null), _intValue(2));
   }
 
+  void test_eagerAnd_knownBool_knownBool() {
+    void check(bool left, bool right, bool expected) {
+      _assertEagerAnd(
+        _boolValue(expected),
+        _boolValue(left),
+        _boolValue(right),
+      );
+    }
+
+    check(false, false, false);
+    check(true, false, false);
+    check(false, true, false);
+    check(true, true, true);
+  }
+
+  void test_eagerAnd_knownBool_knownInt() {
+    _assertEagerAnd(null, _boolValue(true), _intValue(0));
+  }
+
+  void test_eagerAnd_knownBool_unknownBool() {
+    _assertEagerAnd(_boolValue(null), _boolValue(true), _boolValue(null));
+  }
+
+  void test_eagerAnd_unknownBool_knownBool() {
+    _assertEagerAnd(_boolValue(null), _boolValue(null), _boolValue(true));
+  }
+
+  void test_eagerOr_knownBool_knownBool() {
+    void check(bool left, bool right, bool expected) {
+      _assertEagerOr(
+        _boolValue(expected),
+        _boolValue(left),
+        _boolValue(right),
+      );
+    }
+
+    check(false, false, false);
+    check(true, false, true);
+    check(false, true, true);
+    check(true, true, true);
+  }
+
+  void test_eagerOr_knownBool_knownInt() {
+    _assertEagerOr(null, _boolValue(true), _intValue(0));
+  }
+
+  void test_eagerOr_knownBool_unknownBool() {
+    _assertEagerOr(_boolValue(null), _boolValue(true), _boolValue(null));
+  }
+
+  void test_eagerOr_unknownBool_knownBool() {
+    _assertEagerOr(_boolValue(null), _boolValue(null), _boolValue(true));
+  }
+
+  void test_eagerXor_knownBool_knownBool() {
+    void check(bool left, bool right, bool expected) {
+      _assertEagerXor(
+        _boolValue(expected),
+        _boolValue(left),
+        _boolValue(right),
+      );
+    }
+
+    check(false, false, false);
+    check(true, false, true);
+    check(false, true, true);
+    check(true, true, false);
+  }
+
+  void test_eagerXor_knownBool_knownInt() {
+    _assertEagerXor(null, _boolValue(true), _intValue(0));
+  }
+
+  void test_eagerXor_knownBool_unknownBool() {
+    _assertEagerXor(_boolValue(null), _boolValue(true), _boolValue(null));
+  }
+
+  void test_eagerXor_unknownBool_knownBool() {
+    _assertEagerXor(_boolValue(null), _boolValue(null), _boolValue(true));
+  }
+
   void test_equalEqual_bool_false() {
     _assertEqualEqual(_boolValue(false), _boolValue(false), _boolValue(true));
   }
@@ -1716,10 +1797,10 @@
       DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
-        left.eagerAnd(_typeSystem, right, false);
+        left.eagerAnd(_typeSystem, right);
       }, throwsEvaluationException);
     } else {
-      DartObjectImpl result = left.eagerAnd(_typeSystem, right, false);
+      DartObjectImpl result = left.eagerAnd(_typeSystem, right);
       expect(result, isNotNull);
       expect(result, expected);
     }
@@ -1732,10 +1813,10 @@
       DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
-        left.eagerOr(_typeSystem, right, false);
+        left.eagerOr(_typeSystem, right);
       }, throwsEvaluationException);
     } else {
-      DartObjectImpl result = left.eagerOr(_typeSystem, right, false);
+      DartObjectImpl result = left.eagerOr(_typeSystem, right);
       expect(result, isNotNull);
       expect(result, expected);
     }
@@ -1748,10 +1829,10 @@
       DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
     if (expected == null) {
       expect(() {
-        left.eagerXor(_typeSystem, right, false);
+        left.eagerXor(_typeSystem, right);
       }, throwsEvaluationException);
     } else {
-      DartObjectImpl result = left.eagerXor(_typeSystem, right, false);
+      DartObjectImpl result = left.eagerXor(_typeSystem, right);
       expect(result, isNotNull);
       expect(result, expected);
     }
diff --git a/runtime/tests/vm/dart/regress_37382_test.dart b/runtime/tests/vm/dart/regress_37382_test.dart
index e0d818c..0a25345 100644
--- a/runtime/tests/vm/dart/regress_37382_test.dart
+++ b/runtime/tests/vm/dart/regress_37382_test.dart
@@ -4,11 +4,23 @@
 
 import 'package:expect/expect.dart';
 
+void expectType(Type type, Pattern text) {
+  var typeString = "$type";
+  if (typeString.contains("minified:")) {
+    return; // No checks for minimized types.
+  }
+  var match = text.matchAsPrefix(typeString);
+  if (match != null && match.end == typeString.length) return;
+  Expect.fail(
+      "$typeString was not matched by $text${match == null ? "" : ", match: ${match[0]}"}");
+}
+
 class A<X, Y> {
   R f<R>(R Function<S, T>(A<S, T>) t) => t<X, Y>(this);
 }
 
 main() {
   A<num, num> a = A<int, int>();
-  Expect.equals(a.f.runtimeType.toString(), '<R>(<S, T>(A<S, T>) => R) => R');
+  expectType(a.f.runtimeType,
+      RegExp(r"<(\w+)>\(<(\w+), (\w+)>\(A<\2, \3>\) => \1\) => \1$"));
 }
diff --git a/runtime/tests/vm/dart_2/regress_37382_test.dart b/runtime/tests/vm/dart_2/regress_37382_test.dart
index e0d818c..0a25345 100644
--- a/runtime/tests/vm/dart_2/regress_37382_test.dart
+++ b/runtime/tests/vm/dart_2/regress_37382_test.dart
@@ -4,11 +4,23 @@
 
 import 'package:expect/expect.dart';
 
+void expectType(Type type, Pattern text) {
+  var typeString = "$type";
+  if (typeString.contains("minified:")) {
+    return; // No checks for minimized types.
+  }
+  var match = text.matchAsPrefix(typeString);
+  if (match != null && match.end == typeString.length) return;
+  Expect.fail(
+      "$typeString was not matched by $text${match == null ? "" : ", match: ${match[0]}"}");
+}
+
 class A<X, Y> {
   R f<R>(R Function<S, T>(A<S, T>) t) => t<X, Y>(this);
 }
 
 main() {
   A<num, num> a = A<int, int>();
-  Expect.equals(a.f.runtimeType.toString(), '<R>(<S, T>(A<S, T>) => R) => R');
+  expectType(a.f.runtimeType,
+      RegExp(r"<(\w+)>\(<(\w+), (\w+)>\(A<\2, \3>\) => \1\) => \1$"));
 }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index e8fdaa4..c59eb92 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -3134,6 +3134,8 @@
 
   Class& klass = Class::ZoneHandle(
       Z, H.LookupClassByKernelClass(H.EnclosingName(kernel_name)));
+  const auto& error = klass.EnsureIsFinalized(H.thread());
+  ASSERT(error == Error::null());
 
   Fragment instructions;
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index ae03f6e..c3c6bc6 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -3348,12 +3348,18 @@
   const Library& lib = Library::Handle(Z, active_class->klass->library());
   {
     AlternativeReadingScope alt(&helper_->reader_);
+    String& name = String::Handle(Z);
     for (intptr_t i = 0; i < type_parameter_count; i++) {
       TypeParameterHelper helper(helper_);
       helper.Finish();
+      if (parameterized_class.IsNull() && function.IsNull()) {
+        // Erase provided name and use a canonical one instead.
+        name = Symbols::NewFormatted(H.thread(), "X%" Pd, offset + i);
+      } else {
+        name = H.DartIdentifier(lib, helper.name_index_).raw();
+      }
       parameter = TypeParameter::New(
-          parameterized_class, offset, offset + i,
-          H.DartIdentifier(lib, helper.name_index_), null_bound,
+          parameterized_class, offset, offset + i, name, null_bound,
           helper.IsGenericCovariantImpl(), nullability);
       type_parameters.SetTypeAt(i, parameter);
     }
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index 0d6b8b3..df0f48b 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -20,7 +20,7 @@
 #include <unistd.h>
 #endif
 
-#if defined(HOST_OS_IOS)
+#if defined(HOST_OS_MACOS) || defined(HOST_OS_IOS)
 #include <libkern/OSCacheControl.h>
 #endif
 
@@ -42,7 +42,7 @@
 // On iOS we use sys_icache_invalidate from Darwin. See:
 //
 // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sys_icache_invalidate.3.html
-#if defined(HOST_OS_IOS)
+#if defined(HOST_OS_MACOS) || defined(HOST_OS_IOS)
   sys_icache_invalidate(reinterpret_cast<void*>(start), size);
 #elif defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX)
   extern void __clear_cache(char*, char*);
@@ -54,7 +54,7 @@
                                       size, ZX_CACHE_FLUSH_INSN);
   ASSERT(result == ZX_OK);
 #else
-#error FlushICache only tested/supported on Android, Fuchsia, Linux and iOS
+#error FlushICache not implemented for this OS
 #endif
 
 #endif
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 129d71f..cea08ae 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5423,6 +5423,7 @@
   ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   RELEASE_ASSERT(is_finalized());
+  SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_FUNCTION_HANDLESCOPE(thread);
   REUSABLE_STRING_HANDLESCOPE(thread);
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 1e3c5f6..a055948 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -598,7 +598,8 @@
             if (IsolateGroup::Current()->heap()->Contains(value)) {
               OS::PrintErr("%s: \n", arg1);
 #if defined(DEBUG)
-              const Object& obj = Object::Handle(static_cast<ObjectPtr>(value));
+              const Object& obj = Object::Handle(
+                  static_cast<ObjectPtr>(static_cast<uword>(value)));
               obj.Print();
 #endif  // defined(DEBUG)
             } else {
diff --git a/tools/VERSION b/tools/VERSION
index f98a1fa..3cd2a88 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 225
+PRERELEASE 226
 PRERELEASE_PATCH 0
\ No newline at end of file
