diff --git a/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart b/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
index 18f1072..46710be 100644
--- a/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
+++ b/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
@@ -38,6 +38,9 @@
         AnalyzerOptions.implicitDynamic: EmptyProducer(),
       }),
     }),
+    AnalyzerOptions.codeStyle: MapProducer({
+      AnalyzerOptions.format: BooleanProducer(),
+    }),
     // TODO(brianwilkerson) Create a producer to produce `package:` URIs.
     AnalyzerOptions.include: EmptyProducer(),
     // TODO(brianwilkerson) Create constants for 'linter' and 'rules'.
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index a0e8c5c..816c714 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -1901,6 +1901,9 @@
         ..completion.isEqualTo('analyzer: ')
         ..kind.isIdentifier,
       (suggestion) => suggestion
+        ..completion.isEqualTo('code-style: ')
+        ..kind.isIdentifier,
+      (suggestion) => suggestion
         ..completion.isEqualTo('include: ')
         ..kind.isIdentifier,
       (suggestion) => suggestion
diff --git a/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart b/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart
index c86dc28..7d020ef 100644
--- a/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/yaml/analysis_options_generator_test.dart
@@ -32,9 +32,27 @@
     assertSuggestion('${AnalyzerOptions.enableExperiment}: ');
   }
 
+  void test_codeStyle() {
+    getCompletions('''
+code-style:
+  ^
+''');
+    assertSuggestion('${AnalyzerOptions.format}: ');
+  }
+
+  void test_codeStyle_format() {
+    getCompletions('''
+code-style:
+  format: ^
+''');
+    assertSuggestion('false');
+    assertSuggestion('true');
+  }
+
   void test_empty() {
     getCompletions('^');
     assertSuggestion('${AnalyzerOptions.analyzer}: ');
+    assertSuggestion('${AnalyzerOptions.codeStyle}: ');
     assertSuggestion('${AnalyzerOptions.include}: ');
     // TODO(brianwilkerson) Replace this with a constant.
     assertSuggestion('linter: ');
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_options.dart b/pkg/analyzer/lib/dart/analysis/analysis_options.dart
index 3f961bb..fbb185e 100644
--- a/pkg/analyzer/lib/dart/analysis/analysis_options.dart
+++ b/pkg/analyzer/lib/dart/analysis/analysis_options.dart
@@ -4,6 +4,7 @@
 
 import 'dart:typed_data';
 
+import 'package:analyzer/dart/analysis/code_style_options.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/services/lint.dart';
@@ -18,6 +19,9 @@
   /// see if it is complaint with Chrome OS.
   bool get chromeOsManifestChecks;
 
+  /// Return the options used to control the code that is generated.
+  CodeStyleOptions get codeStyleOptions;
+
   /// The set of features that are globally enabled for this context.
   FeatureSet get contextFeatures;
 
diff --git a/pkg/analyzer/lib/dart/analysis/code_style_options.dart b/pkg/analyzer/lib/dart/analysis/code_style_options.dart
new file mode 100644
index 0000000..4fb8a42
--- /dev/null
+++ b/pkg/analyzer/lib/dart/analysis/code_style_options.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A set of options related to coding style that apply to the code within a
+/// single analysis context.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class CodeStyleOptions {
+  /// Return `true` if local variables should be `final` whenever possible.
+  bool get makeLocalsFinal;
+
+  /// Return `true` if the formatter should be used on code changes in this
+  /// context.
+  bool get useFormatter;
+
+  /// Return `true` if URIs should be "relative", meaning without a scheme,
+  /// whenever possible.
+  bool get useRelativeUris;
+}
diff --git a/pkg/analyzer/lib/src/analysis_options/code_style_options.dart b/pkg/analyzer/lib/src/analysis_options/code_style_options.dart
new file mode 100644
index 0000000..1276bd9
--- /dev/null
+++ b/pkg/analyzer/lib/src/analysis_options/code_style_options.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/analysis_options.dart';
+import 'package:analyzer/dart/analysis/code_style_options.dart';
+
+/// The concrete implementation of [CodeStyleOptions].
+class CodeStyleOptionsImpl implements CodeStyleOptions {
+  /// The analysis options that owns this instance.
+  final AnalysisOptions options;
+
+  @override
+  final bool useFormatter;
+
+  CodeStyleOptionsImpl(this.options, {required this.useFormatter});
+
+  @override
+  bool get makeLocalsFinal => _isLintEnabled('prefer_final_locals');
+
+  @override
+  bool get useRelativeUris => _isLintEnabled('prefer_relative_imports');
+
+  /// Return `true` if the lint with the given [name] is enabled.
+  bool _isLintEnabled(String name) => options.isLintEnabled(name);
+}
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d33f063..c138f7c 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -979,10 +979,10 @@
     implements CompilationUnitElement {
   /// The source that corresponds to this compilation unit.
   @override
-  late Source source;
+  final Source source;
 
   @override
-  late LineInfo lineInfo;
+  LineInfo lineInfo;
 
   /// The source of the library containing this compilation unit.
   ///
@@ -990,7 +990,7 @@
   /// except that it does not require the containing [LibraryElement] to be
   /// computed.
   @override
-  late Source librarySource;
+  final Source librarySource;
 
   /// A list containing all of the top-level accessors (getters and setters)
   /// contained in this compilation unit.
@@ -1024,7 +1024,11 @@
 
   /// Initialize a newly created compilation unit element to have the given
   /// [name].
-  CompilationUnitElementImpl() : super(null, -1);
+  CompilationUnitElementImpl({
+    required this.source,
+    required this.librarySource,
+    required this.lineInfo,
+  }) : super(null, -1);
 
   @override
   List<PropertyAccessorElement> get accessors {
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 6f6bf17..eb6df5c 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -6,10 +6,12 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token_impl.dart';
 import 'package:analyzer/dart/analysis/analysis_options.dart';
+import 'package:analyzer/dart/analysis/code_style_options.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/error_processor.dart';
+import 'package:analyzer/src/analysis_options/code_style_options.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -243,17 +245,23 @@
   @override
   bool chromeOsManifestChecks = false;
 
+  @override
+  late CodeStyleOptions codeStyleOptions;
+
   /// The set of "un-ignorable" error names, as parsed in [AnalyzerOptions] from
   /// an analysis options file.
   Set<String> unignorableNames = {};
 
   /// Initialize a newly created set of analysis options to have their default
   /// values.
-  AnalysisOptionsImpl();
+  AnalysisOptionsImpl() {
+    codeStyleOptions = CodeStyleOptionsImpl(this, useFormatter: false);
+  }
 
   /// Initialize a newly created set of analysis options to have the same values
   /// as those in the given set of analysis [options].
   AnalysisOptionsImpl.from(AnalysisOptions options) {
+    codeStyleOptions = options.codeStyleOptions;
     contextFeatures = options.contextFeatures;
     enabledPluginNames = options.enabledPluginNames;
     errorProcessors = options.errorProcessors;
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 5492b85..68896c6 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -90,14 +90,16 @@
           [List<String>? parameterNames]) =>
       classTypeAlias(typeName, objectType, parameterNames);
 
-  static CompilationUnitElementImpl compilationUnit(String fileName,
-      [Source? librarySource, LineInfo? lineInfo]) {
-    Source source = NonExistingSource(fileName, toUri(fileName));
-    CompilationUnitElementImpl unit = CompilationUnitElementImpl();
-    unit.source = source;
-    unit.librarySource = librarySource ?? source;
-    unit.lineInfo = lineInfo ?? LineInfo([0]);
-    return unit;
+  static CompilationUnitElementImpl compilationUnit({
+    required Source source,
+    Source? librarySource,
+    LineInfo? lineInfo,
+  }) {
+    return CompilationUnitElementImpl(
+      source: source,
+      librarySource: librarySource ?? source,
+      lineInfo: lineInfo ?? LineInfo([0]),
+    );
   }
 
   static ConstLocalVariableElementImpl constLocalVariableElement(String name) =>
@@ -206,7 +208,9 @@
   static LibraryElementImpl library(
       AnalysisContext context, String libraryName) {
     String fileName = "/$libraryName.dart";
-    CompilationUnitElementImpl unit = compilationUnit(fileName);
+    CompilationUnitElementImpl unit = compilationUnit(
+      source: NonExistingSource(fileName, toUri(fileName)),
+    );
     LibraryElementImpl library = LibraryElementImpl(
       context,
       _MockAnalysisSession(),
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 85ce530..b58c5c6 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1180,9 +1180,11 @@
     var unitUri = Uri.parse(unitUriStr);
     var unitSource = sourceFactory.forUri2(unitUri)!;
 
-    var unitElement = CompilationUnitElementImpl();
-    unitElement.source = unitSource;
-    unitElement.librarySource = librarySource;
+    var unitElement = CompilationUnitElementImpl(
+      source: unitSource,
+      librarySource: librarySource,
+      lineInfo: LineInfo([0]),
+    );
 
     var unitReference = unitContainerRef.getChild(unitUriStr);
     unitElement.setLinkedData(
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 36f7c25..ee3209b 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -265,11 +265,12 @@
     for (var inputUnit in inputLibrary.units) {
       var unitNode = inputUnit.unit as ast.CompilationUnitImpl;
 
-      var unitElement = CompilationUnitElementImpl();
+      var unitElement = CompilationUnitElementImpl(
+        source: inputUnit.source,
+        librarySource: inputLibrary.source,
+        lineInfo: unitNode.lineInfo,
+      );
       unitElement.isSynthetic = inputUnit.isSynthetic;
-      unitElement.librarySource = inputLibrary.source;
-      unitElement.lineInfo = unitNode.lineInfo;
-      unitElement.source = inputUnit.source;
       unitElement.uri = inputUnit.partUriStr;
       unitElement.setCodeRange(0, unitNode.length);
 
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 8170621..ea2f3f4 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/code_style_options.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
+import 'package:analyzer/src/analysis_options/code_style_options.dart';
 import 'package:analyzer/src/analysis_options/error/option_codes.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -120,6 +122,7 @@
   static const String enablePreviewDart2 = 'enablePreviewDart2';
 
   static const String cannotIgnore = 'cannot-ignore';
+  static const String codeStyle = 'code-style';
   static const String enableExperiment = 'enable-experiment';
   static const String errors = 'errors';
   static const String exclude = 'exclude';
@@ -142,6 +145,9 @@
   static const String strictInference = 'strict-inference';
   static const String strictRawTypes = 'strict-raw-types';
 
+  // Code style options
+  static const String format = 'format';
+
   /// Ways to say `ignore`.
   static const List<String> ignoreSynonyms = ['ignore', 'false'];
 
@@ -188,6 +194,11 @@
     chromeOsManifestChecks,
   ];
 
+  /// Supported 'code-style' options.
+  static const List<String> codeStyleOptions = [
+    format,
+  ];
+
   /// Proposed values for a `true` or `false` option.
   static String get trueOrFalseProposal =>
       AnalyzerOptions.trueOrFalse.quotedAndCommaSeparatedWithAnd;
@@ -265,6 +276,61 @@
   }
 }
 
+/// Validates `code-style` options.
+class CodeStyleOptionsValidator extends OptionsValidator {
+  @override
+  void validate(ErrorReporter reporter, YamlMap options) {
+    var codeStyle = options.valueAt(AnalyzerOptions.codeStyle);
+    if (codeStyle is YamlMap) {
+      codeStyle.nodeMap.forEach((keyNode, valueNode) {
+        var key = keyNode.value;
+        if (key == AnalyzerOptions.format) {
+          _validateFormat(reporter, valueNode);
+        } else {
+          reporter.reportErrorForSpan(
+              AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES,
+              keyNode.span,
+              [AnalyzerOptions.codeStyle, keyNode.toString()]);
+        }
+      });
+    } else if (codeStyle is YamlScalar && codeStyle.value != null) {
+      reporter.reportErrorForSpan(
+          AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
+          codeStyle.span,
+          [AnalyzerOptions.codeStyle]);
+    } else if (codeStyle is YamlList) {
+      reporter.reportErrorForSpan(
+          AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
+          codeStyle.span,
+          [AnalyzerOptions.codeStyle]);
+    }
+  }
+
+  void _validateFormat(ErrorReporter reporter, YamlNode format) {
+    if (format is YamlMap) {
+      reporter.reportErrorForSpan(
+          AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
+          format.span,
+          [AnalyzerOptions.format]);
+    } else if (format is YamlScalar) {
+      var formatValue = toBool(format.value);
+      if (formatValue == null) {
+        reporter.reportErrorForSpan(
+            AnalysisOptionsWarningCode.UNSUPPORTED_VALUE, format.span, [
+          AnalyzerOptions.format,
+          format.value,
+          AnalyzerOptions.trueOrFalseProposal
+        ]);
+      }
+    } else if (format is YamlList) {
+      reporter.reportErrorForSpan(
+          AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
+          format.span,
+          [AnalyzerOptions.format]);
+    }
+  }
+}
+
 /// Convenience class for composing validators.
 class CompositeValidator extends OptionsValidator {
   final List<OptionsValidator> validators;
@@ -540,6 +606,7 @@
 
   final List<OptionsValidator> _validators = [
     AnalyzerOptionsValidator(),
+    CodeStyleOptionsValidator(),
     LinterOptionsValidator(),
     LinterRuleOptionsValidator()
   ];
@@ -736,6 +803,10 @@
       options.enabledPluginNames = pluginNames;
     }
 
+    // Process the 'code-style' option.
+    var codeStyle = optionMap.valueAt(AnalyzerOptions.codeStyle);
+    options.codeStyleOptions = _buildCodeStyleOptions(options, codeStyle);
+
     var config = parseConfig(optionMap);
     if (config != null) {
       Iterable<LintRule> lintRules = Registry.ruleRegistry.enabled(config);
@@ -871,6 +942,21 @@
     }
   }
 
+  CodeStyleOptions _buildCodeStyleOptions(
+      AnalysisOptionsImpl options, YamlNode? config) {
+    var useFormatter = false;
+    if (config is YamlMap) {
+      var formatNode = config.valueAt(AnalyzerOptions.format);
+      if (formatNode != null) {
+        var formatValue = toBool(formatNode);
+        if (formatValue is bool) {
+          useFormatter = formatValue;
+        }
+      }
+    }
+    return CodeStyleOptionsImpl(options, useFormatter: useFormatter);
+  }
+
   String? _toString(YamlNode? node) {
     if (node is YamlScalar) {
       var value = node.value;
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index 38630e9..bfd8020 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -861,20 +861,12 @@
   }
 
   LibraryElementImpl _buildAsync() {
-    var asyncLibrary = LibraryElementImpl(
-      analysisContext,
-      analysisSession,
-      'dart.async',
-      0,
-      0,
-      FeatureSet.latestLanguageVersion(),
-    );
-
-    var asyncUnit = CompilationUnitElementImpl();
     var asyncSource = analysisContext.sourceFactory.forUri('dart:async')!;
-    asyncUnit.librarySource = asyncUnit.source = asyncSource;
-    asyncUnit.lineInfo = LineInfo([0]);
-    asyncLibrary.definingCompilationUnit = asyncUnit;
+    var asyncUnit = CompilationUnitElementImpl(
+      source: asyncSource,
+      librarySource: asyncSource,
+      lineInfo: LineInfo([0]),
+    );
 
     asyncUnit.classes = <ClassElement>[
       completerElement,
@@ -884,15 +876,26 @@
       streamSubscriptionElement
     ];
 
+    var asyncLibrary = LibraryElementImpl(
+      analysisContext,
+      analysisSession,
+      'dart.async',
+      0,
+      0,
+      FeatureSet.latestLanguageVersion(),
+    );
+    asyncLibrary.definingCompilationUnit = asyncUnit;
+
     return asyncLibrary;
   }
 
   LibraryElementImpl _buildCore() {
-    var coreUnit = CompilationUnitElementImpl();
-
     var coreSource = analysisContext.sourceFactory.forUri('dart:core')!;
-    coreUnit.librarySource = coreUnit.source = coreSource;
-    coreUnit.lineInfo = LineInfo([0]);
+    var coreUnit = CompilationUnitElementImpl(
+      source: coreSource,
+      librarySource: coreSource,
+      lineInfo: LineInfo([0]),
+    );
 
     coreUnit.classes = <ClassElement>[
       boolElement,
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index 3f5b739..8b660f5 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -367,6 +367,15 @@
     required AnalysisContext analysisContext,
     required AnalysisSessionImpl analysisSession,
   }) {
+    var uri = Uri.parse(uriStr);
+    var source = _MockSource(uri);
+
+    var definingUnit = CompilationUnitElementImpl(
+      source: source,
+      librarySource: source,
+      lineInfo: LineInfo([0]),
+    );
+
     var library = LibraryElementImpl(
       analysisContext,
       analysisSession,
@@ -375,19 +384,9 @@
       0,
       FeatureSet.latestLanguageVersion(),
     );
-    library.typeSystem = typeSystem;
-    library.typeProvider = typeSystem.typeProvider;
-
-    var uri = Uri.parse(uriStr);
-    var source = _MockSource(uri);
-
-    var definingUnit = CompilationUnitElementImpl();
-    definingUnit.source = source;
-    definingUnit.librarySource = source;
-    definingUnit.lineInfo = LineInfo([0]);
-
-    definingUnit.enclosingElement = library;
     library.definingCompilationUnit = definingUnit;
+    library.typeProvider = typeSystem.typeProvider;
+    library.typeSystem = typeSystem;
 
     return library;
   }
diff --git a/pkg/analyzer/test/src/dart/constant/utilities_test.dart b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
index 99bd23a..913f242 100644
--- a/pkg/analyzer/test/src/dart/constant/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
@@ -41,7 +41,7 @@
   /// represents a reference to a compile-time constant variable).
   void test_visitAnnotation_constantVariable() {
     var compilationUnitElement =
-        ElementFactory.compilationUnit('/test.dart', _source)..source = _source;
+        ElementFactory.compilationUnit(source: _source);
     ElementFactory.library(_AnalysisContextMock(), 'L')
         .definingCompilationUnit = compilationUnitElement;
     ElementAnnotationImpl elementAnnotation =
@@ -56,7 +56,7 @@
   /// constructor.
   void test_visitAnnotation_invocation() {
     var compilationUnitElement =
-        ElementFactory.compilationUnit('/test.dart', _source)..source = _source;
+        ElementFactory.compilationUnit(source: _source);
     ElementFactory.library(_AnalysisContextMock(), 'L')
         .definingCompilationUnit = compilationUnitElement;
     ElementAnnotationImpl elementAnnotation =
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 94515af..715ee3a 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -17,6 +17,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../generated/test_analysis_context.dart';
+import '../../../generated/test_support.dart';
 import '../../../generated/type_system_test.dart';
 import '../resolution/context_collection_resolution.dart';
 
@@ -467,7 +468,7 @@
 class CompilationUnitElementImplTest {
   void test_getType_declared() {
     CompilationUnitElementImpl unit =
-        ElementFactory.compilationUnit("/lib.dart");
+        ElementFactory.compilationUnit(source: TestSource("/lib.dart"));
     String className = "C";
     ClassElement classElement = ElementFactory.classElement2(className);
     unit.classes = <ClassElement>[classElement];
@@ -476,7 +477,7 @@
 
   void test_getType_undeclared() {
     CompilationUnitElementImpl unit =
-        ElementFactory.compilationUnit("/lib.dart");
+        ElementFactory.compilationUnit(source: TestSource("/lib.dart"));
     String className = "C";
     ClassElement classElement = ElementFactory.classElement2(className);
     unit.classes = <ClassElement>[classElement];
@@ -1327,10 +1328,14 @@
     AnalysisContext context = TestAnalysisContext();
     LibraryElementImpl library = ElementFactory.library(context, "test");
     CompilationUnitElement unitLib = library.definingCompilationUnit;
-    CompilationUnitElementImpl unitA =
-        ElementFactory.compilationUnit("unit_a.dart", unitLib.source);
-    CompilationUnitElementImpl unitB =
-        ElementFactory.compilationUnit("unit_b.dart", unitLib.source);
+    CompilationUnitElementImpl unitA = ElementFactory.compilationUnit(
+      source: TestSource("unit_a.dart"),
+      librarySource: unitLib.source,
+    );
+    CompilationUnitElementImpl unitB = ElementFactory.compilationUnit(
+      source: TestSource("unit_b.dart"),
+      librarySource: unitLib.source,
+    );
     library.parts = <CompilationUnitElement>[unitA, unitB];
     expect(library.units,
         unorderedEquals(<CompilationUnitElement>[unitLib, unitA, unitB]));
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index beadb3c..bf13737 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -43,7 +43,7 @@
   YamlMap parseOptions(String source) =>
       optionsProvider.getOptionsFromString(source);
 
-  test_configure_cannotIgnore() {
+  test_analyzer_cannotIgnore() {
     configureContext('''
 analyzer:
   cannot-ignore:
@@ -55,7 +55,7 @@
     expect(unignorableNames, unorderedEquals(['ONE_ERROR_CODE', 'ANOTHER']));
   }
 
-  test_configure_cannotIgnore_severity() {
+  test_analyzer_cannotIgnore_severity() {
     configureContext('''
 analyzer:
   cannot-ignore:
@@ -67,7 +67,7 @@
     expect(unignorableNames.length, greaterThan(500));
   }
 
-  test_configure_cannotIgnore_severity_withProcessor() {
+  test_analyzer_cannotIgnore_severity_withProcessor() {
     configureContext('''
 analyzer:
   errors:
@@ -80,7 +80,7 @@
     expect(unignorableNames, contains('UNUSED_IMPORT'));
   }
 
-  test_configure_chromeos_checks() {
+  test_analyzer_chromeos_checks() {
     configureContext('''
 analyzer:
   optional-checks:
@@ -89,7 +89,7 @@
     expect(true, analysisOptions.chromeOsManifestChecks);
   }
 
-  test_configure_chromeos_checks_map() {
+  test_analyzer_chromeos_checks_map() {
     configureContext('''
 analyzer:
   optional-checks:
@@ -98,7 +98,7 @@
     expect(true, analysisOptions.chromeOsManifestChecks);
   }
 
-  test_configure_error_processors() {
+  test_analyzer_errors_processors() {
     configureContext('''
 analyzer:
   errors:
@@ -106,7 +106,7 @@
     unused_local_variable: error
 ''');
 
-    List<ErrorProcessor> processors = analysisOptions.errorProcessors;
+    var processors = analysisOptions.errorProcessors;
     expect(processors, hasLength(2));
 
     var unused_local =
@@ -129,7 +129,7 @@
     expect(unusedLocal.severity, ErrorSeverity.ERROR);
   }
 
-  test_configure_excludes() {
+  test_analyzer_exclude() {
     configureContext('''
 analyzer:
   exclude:
@@ -137,11 +137,11 @@
     - 'test/**'
 ''');
 
-    List<String> excludes = analysisOptions.excludePatterns;
+    var excludes = analysisOptions.excludePatterns;
     expect(excludes, unorderedEquals(['foo/bar.dart', 'test/**']));
   }
 
-  test_configure_excludes_withNonStrings() {
+  test_analyzer_exclude_withNonStrings() {
     configureContext('''
 analyzer:
   exclude:
@@ -150,11 +150,11 @@
     - a: b
 ''');
 
-    List<String> excludes = analysisOptions.excludePatterns;
+    var excludes = analysisOptions.excludePatterns;
     expect(excludes, unorderedEquals(['foo/bar.dart', 'test/**']));
   }
 
-  test_configure_plugins_list() {
+  test_analyzer_plugins_list() {
     configureContext('''
 analyzer:
   plugins:
@@ -162,11 +162,11 @@
     - intl
 ''');
 
-    List<String> names = analysisOptions.enabledPluginNames;
+    var names = analysisOptions.enabledPluginNames;
     expect(names, ['angular2', 'intl']);
   }
 
-  test_configure_plugins_map() {
+  test_analyzer_plugins_map() {
     configureContext('''
 analyzer:
   plugins:
@@ -174,20 +174,36 @@
       enabled: true
 ''');
 
-    List<String> names = analysisOptions.enabledPluginNames;
+    var names = analysisOptions.enabledPluginNames;
     expect(names, ['angular2']);
   }
 
-  test_configure_plugins_string() {
+  test_analyzer_plugins_string() {
     configureContext('''
 analyzer:
   plugins:
     angular2
 ''');
 
-    List<String> names = analysisOptions.enabledPluginNames;
+    var names = analysisOptions.enabledPluginNames;
     expect(names, ['angular2']);
   }
+
+  test_codeStyle_format_false() {
+    configureContext('''
+code-style:
+  format: false
+''');
+    expect(analysisOptions.codeStyleOptions.useFormatter, false);
+  }
+
+  test_codeStyle_format_true() {
+    configureContext('''
+code-style:
+  format: true
+''');
+    expect(analysisOptions.codeStyleOptions.useFormatter, true);
+  }
 }
 
 @reflectiveTest
@@ -529,6 +545,47 @@
 ''', [AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT]);
   }
 
+  test_codeStyle_format_false() {
+    validate('''
+code-style:
+  format: false
+''', []);
+  }
+
+  test_codeStyle_format_invalid() {
+    validate('''
+code-style:
+  format: 80
+''', [AnalysisOptionsWarningCode.UNSUPPORTED_VALUE]);
+  }
+
+  test_codeStyle_format_true() {
+    validate('''
+code-style:
+  format: true
+''', []);
+  }
+
+  test_codeStyle_unsupported_list() {
+    validate('''
+code-style:
+  - format
+''', [AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT]);
+  }
+
+  test_codeStyle_unsupported_scalar() {
+    validate('''
+code-style: format
+''', [AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT]);
+  }
+
+  test_codeStyle_unsupportedOption() {
+    validate('''
+code-style:
+  not_supported: true
+''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES]);
+  }
+
   test_linter_supported_rules() {
     Registry.ruleRegistry.register(TestRule());
     validate('''
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 2be4a72..8609209 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -471,6 +471,14 @@
     var typeSystem = coreLibrary.typeSystem;
 
     var uriStr = 'package:test/test.dart';
+    var uri = Uri.parse(uriStr);
+    var source = _MockSource(uri);
+
+    var definingUnit = CompilationUnitElementImpl(
+      source: source,
+      librarySource: source,
+      lineInfo: LineInfo([0]),
+    );
 
     _myLibrary = LibraryElementImpl(
       analysisContext,
@@ -482,19 +490,10 @@
         sdkLanguageVersion: Version.parse('2.10.0'),
         flags: [EnableString.non_nullable],
       ),
-    );
-    _myLibrary!.typeSystem = typeSystem;
-    _myLibrary!.typeProvider = coreLibrary.typeProvider;
-
-    var uri = Uri.parse(uriStr);
-    var source = _MockSource(uri);
-
-    var definingUnit = CompilationUnitElementImpl();
-    definingUnit.source = source;
-    definingUnit.librarySource = source;
-
-    definingUnit.enclosingElement = _myLibrary;
-    _myLibrary!.definingCompilationUnit = definingUnit;
+    )
+      ..definingCompilationUnit = definingUnit
+      ..typeProvider = coreLibrary.typeProvider
+      ..typeSystem = typeSystem;
   }
 
   static void _setCoreLibrariesTypeSystem(TypeProviderImpl typeProvider) {
diff --git a/tools/VERSION b/tools/VERSION
index 36ee48e..36bc97b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 238
+PRERELEASE 239
 PRERELEASE_PATCH 0
\ No newline at end of file
