Skip to content

Commit d3f28d7

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Support parts with imports/parts
This is a part of the enhanced-parts feature needed for further progress on the Builder model migration where patch libraries should be handled as patch parts. Change-Id: I253b471df56ce383eaf5de18b3287ec3cc161005 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/409700 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent 5c0c426 commit d3f28d7

File tree

86 files changed

+1106
-114
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+1106
-114
lines changed

pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ class ClassMemberParser extends Parser {
1717
Parser? skipParser;
1818

1919
ClassMemberParser(super.listener,
20-
{super.useImplicitCreationExpression, super.allowPatterns});
20+
{super.useImplicitCreationExpression,
21+
super.allowPatterns,
22+
super.enableFeatureEnhancedParts});
2123

2224
@override
2325
Token parseExpression(Token token) {
@@ -37,7 +39,8 @@ class ClassMemberParser extends Parser {
3739
// feature together with a no-op listener instead.
3840
this.skipParser ??= new Parser(new ErrorDelegationListener(listener),
3941
useImplicitCreationExpression: useImplicitCreationExpression,
40-
allowPatterns: allowPatterns);
42+
allowPatterns: allowPatterns,
43+
enableFeatureEnhancedParts: enableFeatureEnhancedParts);
4144
Parser skipParser = this.skipParser!;
4245
skipParser.mayParseFunctionExpressions = mayParseFunctionExpressions;
4346
skipParser.asyncState = asyncState;

pkg/front_end/lib/src/base/incremental_compiler.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,8 +1181,12 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
11811181
context.options.globalFeatures.tripleShift.isEnabled);
11821182
bool enablePatterns =
11831183
builder.languageVersion >= ExperimentalFlag.patterns.enabledVersion;
1184+
bool enableEnhancedParts = builder.languageVersion >=
1185+
ExperimentalFlag.enhancedParts.enabledVersion;
11841186
String? before = textualOutline(previousSource, scannerConfiguration,
1185-
performModelling: true, enablePatterns: enablePatterns);
1187+
performModelling: true,
1188+
enablePatterns: enablePatterns,
1189+
enableEnhancedParts: enableEnhancedParts);
11861190
if (before == null) {
11871191
// Coverage-ignore-block(suite): Not run.
11881192
recorderForTesting?.recordAdvancedInvalidationResult(
@@ -1193,7 +1197,9 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
11931197
FileSystemEntity entity = c.options.fileSystem.entityForUri(uri);
11941198
if (await entity.exists()) {
11951199
now = textualOutline(await entity.readAsBytes(), scannerConfiguration,
1196-
performModelling: true, enablePatterns: enablePatterns);
1200+
performModelling: true,
1201+
enablePatterns: enablePatterns,
1202+
enableEnhancedParts: enableEnhancedParts);
11971203
}
11981204
if (before != now) {
11991205
recorderForTesting?.recordAdvancedInvalidationResult(

pkg/front_end/lib/src/base/messages.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class LibraryProblemReporting implements ProblemReporting {
7777
}
7878

7979
void registerLibrary(Library library) {
80-
assert(_library == null, "Library has already been register for $this.");
80+
assert(_library == null, "Library has already been registered for $this.");
8181
_library = library;
8282
if (_problemsAsJson != null) {
8383
(library.problemsAsJson ??= []).addAll(_problemsAsJson!);

pkg/front_end/lib/src/builder/library_builder.dart

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,14 +187,38 @@ abstract class SourceCompilationUnit implements CompilationUnit {
187187

188188
void addDependencies(Library library, Set<SourceCompilationUnit> seen);
189189

190-
void includeParts(SourceLibraryBuilder libraryBuilder,
190+
/// Runs through all part directives in this compilation unit and adds the
191+
/// compilation unit for the parts to the [libraryBuilder] by adding them
192+
/// to [includedParts]
193+
///
194+
/// [usedParts] is used to ensure that a compilation unit is only included in
195+
/// one library. If the compilation unit is part of two libraries, it is only
196+
/// included in the first and reported as an error on the second.
197+
///
198+
/// This should only be called on the main compilation unit for
199+
/// [libraryBuilder]. Inclusion of nested parts is from within this method,
200+
/// using [becomePart] for each individual subpart.
201+
void includeParts(
191202
List<SourceCompilationUnit> includedParts, Set<Uri> usedParts);
192203

193-
void validatePart(
194-
SourceLibraryBuilder library,
195-
SourceCompilationUnit parentCompilationUnit,
204+
/// Includes this compilation unit as a part of [libraryBuilder] with
205+
/// [parentCompilationUnit] as the parent compilation unit.
206+
///
207+
/// The parent compilation unit is used to define the compilation unit
208+
/// scope of this compilation unit.
209+
///
210+
/// All fragment in this compilation unit will be added to
211+
/// [libraryNameSpaceBuilder].
212+
///
213+
/// If parts with parts is supported (through the enhanced parts feature),
214+
/// the compilation units of the part directives in this compilation unit
215+
/// will be added [libraryBuilder] recursively.
216+
void becomePart(
217+
SourceLibraryBuilder libraryBuilder,
196218
LibraryNameSpaceBuilder libraryNameSpaceBuilder,
197-
Set<Uri>? usedParts);
219+
SourceCompilationUnit parentCompilationUnit,
220+
List<SourceCompilationUnit> includedParts,
221+
Set<Uri> usedParts);
198222

199223
/// Reports that [feature] is not enabled, using [charOffset] and
200224
/// [length] for the location of the message.

pkg/front_end/lib/src/compute_platform_binaries_location.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ Uri computePlatformBinariesLocation({bool forceBuildDir = false}) {
9696
// The directory of the Dart VM executable.
9797
Uri vmDirectory = Uri.base
9898
.resolveUri(
99-
new Uri.file(resolvedExecutable ?? // Coverage-ignore(suite): Not run.
100-
Platform.resolvedExecutable))
99+
new Uri.file(resolvedExecutable ?? Platform.resolvedExecutable))
101100
.resolve(".");
102101
if (vmDirectory.path.endsWith("/bin/")) {
103102
// Looks like the VM is in a `/bin/` directory, so this is running from a

pkg/front_end/lib/src/kernel/body_builder.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,7 +1697,8 @@ class BodyBuilder extends StackListenerImpl
16971697
{bool doFinishConstructor = true}) {
16981698
Parser parser = new Parser(this,
16991699
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1700-
allowPatterns: libraryFeatures.patterns.isEnabled);
1700+
allowPatterns: libraryFeatures.patterns.isEnabled,
1701+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
17011702
if (!token.isEof) {
17021703
token = parser.parseInitializers(token);
17031704
checkEmpty(token.charOffset);
@@ -1717,7 +1718,8 @@ class BodyBuilder extends StackListenerImpl
17171718
Expression parseFieldInitializer(Token token) {
17181719
Parser parser = new Parser(this,
17191720
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1720-
allowPatterns: libraryFeatures.patterns.isEnabled);
1721+
allowPatterns: libraryFeatures.patterns.isEnabled,
1722+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
17211723
Token endToken =
17221724
parser.parseExpression(parser.syntheticPreviousToken(token));
17231725
assert(checkState(token, [
@@ -1735,7 +1737,8 @@ class BodyBuilder extends StackListenerImpl
17351737
Expression parseAnnotation(Token token) {
17361738
Parser parser = new Parser(this,
17371739
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1738-
allowPatterns: libraryFeatures.patterns.isEnabled);
1740+
allowPatterns: libraryFeatures.patterns.isEnabled,
1741+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
17391742
Token endToken = parser.parseMetadata(parser.syntheticPreviousToken(token));
17401743
assert(checkState(token, [ValueKinds.Expression]));
17411744
Expression annotation = pop() as Expression;
@@ -1746,7 +1749,8 @@ class BodyBuilder extends StackListenerImpl
17461749
ArgumentsImpl parseArguments(Token token) {
17471750
Parser parser = new Parser(this,
17481751
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1749-
allowPatterns: libraryFeatures.patterns.isEnabled);
1752+
allowPatterns: libraryFeatures.patterns.isEnabled,
1753+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
17501754
token = parser.parseArgumentsRest(token);
17511755
ArgumentsImpl arguments = pop() as ArgumentsImpl;
17521756
checkEmpty(token.charOffset);

pkg/front_end/lib/src/source/diet_listener.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,8 @@ class DietListener extends StackListenerImpl {
894894
try {
895895
Parser parser = new Parser(listener,
896896
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
897-
allowPatterns: libraryFeatures.patterns.isEnabled);
897+
allowPatterns: libraryFeatures.patterns.isEnabled,
898+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
898899
if (metadata != null) {
899900
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
900901
listener.pop(); // Pops metadata constants.
@@ -1225,7 +1226,8 @@ class DietListener extends StackListenerImpl {
12251226
try {
12261227
Parser parser = new Parser(bodyBuilder,
12271228
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1228-
allowPatterns: libraryFeatures.patterns.isEnabled);
1229+
allowPatterns: libraryFeatures.patterns.isEnabled,
1230+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
12291231
token = parser.parseFormalParametersOpt(
12301232
parser.syntheticPreviousToken(token), MemberKind.PrimaryConstructor);
12311233
FormalParameters? formals = bodyBuilder.pop() as FormalParameters?;
@@ -1254,7 +1256,8 @@ class DietListener extends StackListenerImpl {
12541256
try {
12551257
Parser parser = new Parser(bodyBuilder,
12561258
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1257-
allowPatterns: libraryFeatures.patterns.isEnabled);
1259+
allowPatterns: libraryFeatures.patterns.isEnabled,
1260+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
12581261
if (metadata != null) {
12591262
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
12601263
bodyBuilder.pop(); // Annotations.
@@ -1303,7 +1306,8 @@ class DietListener extends StackListenerImpl {
13031306
Token token = startToken;
13041307
Parser parser = new Parser(bodyBuilder,
13051308
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1306-
allowPatterns: libraryFeatures.patterns.isEnabled);
1309+
allowPatterns: libraryFeatures.patterns.isEnabled,
1310+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
13071311
if (isTopLevel) {
13081312
token = parser.parseTopLevelMember(metadata ?? token);
13091313
} else {
@@ -1335,7 +1339,8 @@ class DietListener extends StackListenerImpl {
13351339
BodyBuilder listener = createListener(bodyBuilderContext, memberScope);
13361340
Parser parser = new Parser(listener,
13371341
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
1338-
allowPatterns: libraryFeatures.patterns.isEnabled);
1342+
allowPatterns: libraryFeatures.patterns.isEnabled,
1343+
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled);
13391344
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
13401345
return listener.finishMetadata(parent);
13411346
}

pkg/front_end/lib/src/source/diet_parser.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ const bool useImplicitCreationExpressionInCfe = true;
1010

1111
// TODO(ahe): Move this to parser package.
1212
class DietParser extends ClassMemberParser {
13-
DietParser(Listener listener, {bool allowPatterns = false})
13+
DietParser(Listener listener,
14+
{required bool allowPatterns, required bool enableFeatureEnhancedParts})
1415
: super(listener,
1516
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
16-
allowPatterns: allowPatterns);
17+
allowPatterns: allowPatterns,
18+
enableFeatureEnhancedParts: enableFeatureEnhancedParts);
1719

1820
@override
1921
Token parseFormalParametersRest(Token token, MemberKind kind) {

0 commit comments

Comments
 (0)