99import 'dart:io' ;
1010import 'dart:math' as math;
1111
12+ import 'package:analyzer/dart/analysis/features.dart' ;
13+ import 'package:analyzer/dart/analysis/results.dart' ;
1214import 'package:analyzer/dart/analysis/utilities.dart' ;
1315import 'package:analyzer/dart/ast/ast.dart' ;
1416import 'package:analyzer/dart/ast/token.dart' ;
@@ -35,8 +37,16 @@ void main(List<String> argv) {
3537 }
3638
3739 var sdk = 'sdk' ;
40+ var useNnbd = false ;
3841 if (argv.length > 3 ) {
3942 sdk = argv[3 ];
43+
44+ // TODO(38701): While the core libraries have been forked for NNBD, use the
45+ // SDK directory name to determine whether to enable the NNBD experiment
46+ // when parsing the lib sources. Once the libraries have been unforked, we
47+ // should unconditionally enable the experiment flag since then the
48+ // canonical SDK libs will use NNBD syntax.
49+ useNnbd = sdk.contains ("nnbd" );
4050 }
4151
4252 var selfModifyTime = File (self).lastModifiedSync ().millisecondsSinceEpoch;
@@ -63,7 +73,7 @@ void main(List<String> argv) {
6373 File (p.join (repoDir, 'tools' , 'VERSION' )).readAsStringSync ());
6474
6575 // Parse libraries.dart
66- var sdkLibraries = _getSdkLibraries (libContents);
76+ var sdkLibraries = _getSdkLibraries (libContents, useNnbd : useNnbd );
6777
6878 // Enumerate core libraries and apply patches
6979 for (SdkLibrary library in sdkLibraries) {
@@ -91,7 +101,8 @@ void main(List<String> argv) {
91101 int inputModifyTime = math.max (selfModifyTime,
92102 libraryFile.lastModifiedSync ().millisecondsSinceEpoch);
93103 var partFiles = < File > [];
94- for (var part in parseString (content: libraryContents).unit.directives) {
104+ for (var part
105+ in _parseString (libraryContents, useNnbd: false ).unit.directives) {
95106 if (part is PartDirective ) {
96107 var partPath = part.uri.stringValue;
97108 outPaths.add (p.join (p.dirname (libraryOut), partPath));
@@ -136,7 +147,7 @@ void main(List<String> argv) {
136147 contents.addAll (partFiles.map ((f) => f.readAsStringSync ()));
137148 if (patchExists) {
138149 var patchContents = patchFile.readAsStringSync ();
139- contents = _patchLibrary (contents, patchContents);
150+ contents = _patchLibrary (contents, patchContents, useNnbd : useNnbd );
140151 }
141152
142153 if (contents != null ) {
@@ -178,18 +189,19 @@ void _writeSync(String filePath, String contents) {
178189/// in the Dart language. Since this feature is only for the convenience of
179190/// writing the dart:* libraries, and not a tool given to Dart developers, it
180191/// seems like a non-ideal situation. Instead we keep the preprocessing simple.
181- List <String > _patchLibrary (List <String > partsContents, String patchContents) {
192+ List <String > _patchLibrary (List <String > partsContents, String patchContents,
193+ {bool useNnbd = false }) {
182194 var results = < StringEditBuffer > [];
183195
184196 // Parse the patch first. We'll need to extract bits of this as we go through
185197 // the other files.
186- var patchFinder = PatchFinder .parseAndVisit (patchContents);
198+ var patchFinder = PatchFinder .parseAndVisit (patchContents, useNnbd : useNnbd );
187199
188200 // Merge `external` declarations with the corresponding `@patch` code.
189201 bool failed = false ;
190202 for (var partContent in partsContents) {
191203 var partEdits = StringEditBuffer (partContent);
192- var partUnit = parseString (content : partContent ).unit;
204+ var partUnit = _parseString (partContent, useNnbd : useNnbd ).unit;
193205 var patcher = PatchApplier (partEdits, patchFinder);
194206 partUnit.accept (patcher);
195207 if (! failed) failed = patcher.patchWasMissing;
@@ -314,9 +326,9 @@ class PatchFinder extends GeneralizingAstVisitor {
314326 final mergeMembers = < String , List <ClassMember >> {};
315327 final mergeDeclarations = < CompilationUnitMember > [];
316328
317- PatchFinder .parseAndVisit (String contents)
329+ PatchFinder .parseAndVisit (String contents, { bool useNnbd} )
318330 : contents = contents,
319- unit = parseString (content : contents ).unit {
331+ unit = _parseString (contents, useNnbd : false ).unit {
320332 visitCompilationUnit (unit);
321333 }
322334
@@ -478,11 +490,16 @@ class _StringEdit implements Comparable<_StringEdit> {
478490 }
479491}
480492
481- List <SdkLibrary > _getSdkLibraries (String contents) {
493+ List <SdkLibrary > _getSdkLibraries (String contents, { bool useNnbd} ) {
482494 // TODO(jmesserly): fix SdkLibrariesReader_LibraryBuilder in Analyzer.
483495 // It doesn't understand optional new/const in Dart 2. For now, we keep
484496 // redundant `const` in tool/input_sdk/libraries.dart as a workaround.
485497 var libraryBuilder = SdkLibrariesReader_LibraryBuilder ();
486- parseString (content : contents ).unit.accept (libraryBuilder);
498+ _parseString (contents, useNnbd : false ).unit.accept (libraryBuilder);
487499 return libraryBuilder.librariesMap.sdkLibraries;
488500}
501+
502+ ParseStringResult _parseString (String source, {bool useNnbd}) {
503+ var features = FeatureSet .fromEnableFlags ([if (useNnbd) "non-nullable" ]);
504+ return parseString (content: source, featureSet: features);
505+ }
0 commit comments