Skip to content

Commit d6432ed

Browse files
scheglovCommit Queue
authored and
Commit Queue
committed
Parts. Resolve PartDirective configurations.
Change-Id: I499a1f971ac30b919e7aede267779151495b235c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380141 Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 5a62d02 commit d6432ed

File tree

10 files changed

+903
-145
lines changed

10 files changed

+903
-145
lines changed

pkg/analyzer/lib/src/dart/analysis/file_state.dart

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -494,25 +494,29 @@ abstract class FileKind {
494494
return PartIncludeWithFile(
495495
container: this,
496496
unlinked: unlinked,
497-
uri: selectedUri,
497+
selectedUri: selectedUri,
498+
uris: uris,
498499
);
499500
case DirectiveUriWithUri():
500501
return PartIncludeWithUri(
501502
container: this,
502503
unlinked: unlinked,
503-
uri: selectedUri,
504+
selectedUri: selectedUri,
505+
uris: uris,
504506
);
505507
case DirectiveUriWithString():
506508
return PartIncludeWithUriStr(
507509
container: this,
508510
unlinked: unlinked,
509-
uri: selectedUri,
511+
selectedUri: selectedUri,
512+
uris: uris,
510513
);
511514
case DirectiveUriWithoutString():
512515
return PartIncludeState(
513516
container: this,
514517
unlinked: unlinked,
515-
uri: selectedUri,
518+
selectedUri: selectedUri,
519+
uris: uris,
516520
);
517521
}
518522
}).toFixedList();
@@ -2515,12 +2519,14 @@ sealed class PartFileKind extends FileKind {
25152519
/// Information about a single `part` directive.
25162520
final class PartIncludeState<U extends DirectiveUri> extends DirectiveState {
25172521
final UnlinkedPartDirective unlinked;
2518-
final U uri;
2522+
final U selectedUri;
2523+
final DirectiveUris uris;
25192524

25202525
PartIncludeState({
25212526
required super.container,
25222527
required this.unlinked,
2523-
required this.uri,
2528+
required this.selectedUri,
2529+
required this.uris,
25242530
});
25252531
}
25262532

@@ -2530,12 +2536,13 @@ final class PartIncludeWithFile
25302536
PartIncludeWithFile({
25312537
required super.container,
25322538
required super.unlinked,
2533-
required super.uri,
2539+
required super.selectedUri,
2540+
required super.uris,
25342541
}) {
25352542
includedFile.referencingFiles.add(container.file);
25362543
}
25372544

2538-
FileState get includedFile => uri.file;
2545+
FileState get includedFile => selectedUri.file;
25392546

25402547
/// If [includedFile] is a [PartFileKind], and it confirms that it
25412548
/// is a part of the [container], returns the [includedFile].
@@ -2559,7 +2566,8 @@ final class PartIncludeWithUri<U extends DirectiveUriWithUri>
25592566
PartIncludeWithUri({
25602567
required super.container,
25612568
required super.unlinked,
2562-
required super.uri,
2569+
required super.selectedUri,
2570+
required super.uris,
25632571
});
25642572
}
25652573

@@ -2569,7 +2577,8 @@ final class PartIncludeWithUriStr<U extends DirectiveUriWithString>
25692577
PartIncludeWithUriStr({
25702578
required super.container,
25712579
required super.unlinked,
2572-
required super.uri,
2580+
required super.selectedUri,
2581+
required super.uris,
25732582
});
25742583
}
25752584

pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/analysis/declared_variables.dart';
6+
import 'package:analyzer/dart/analysis/features.dart';
67
import 'package:analyzer/dart/element/element.dart';
78
import 'package:analyzer/error/error.dart';
89
import 'package:analyzer/error/listener.dart';
@@ -968,7 +969,7 @@ class LibraryAnalyzer {
968969
required LibraryImportState state,
969970
required ErrorReporter errorReporter,
970971
}) {
971-
_resolveNamespaceDirective(
972+
_resolveUriConfigurations(
972973
configurationNodes: directive.configurations,
973974
configurationUris: state.uris.configurations,
974975
);
@@ -986,7 +987,7 @@ class LibraryAnalyzer {
986987
required ErrorReporter errorReporter,
987988
}) {
988989
directive.element = element;
989-
_resolveNamespaceDirective(
990+
_resolveUriConfigurations(
990991
configurationNodes: directive.configurations,
991992
configurationUris: state.uris.configurations,
992993
);
@@ -1041,7 +1042,7 @@ class LibraryAnalyzer {
10411042
}) {
10421043
directive.element = element;
10431044
directive.prefix?.staticElement = element.prefix?.element;
1044-
_resolveNamespaceDirective(
1045+
_resolveUriConfigurations(
10451046
configurationNodes: directive.configurations,
10461047
configurationUris: state.uris.configurations,
10471048
);
@@ -1052,16 +1053,6 @@ class LibraryAnalyzer {
10521053
);
10531054
}
10541055

1055-
void _resolveNamespaceDirective({
1056-
required List<Configuration> configurationNodes,
1057-
required List<file_state.DirectiveUri> configurationUris,
1058-
}) {
1059-
for (var i = 0; i < configurationNodes.length; i++) {
1060-
var node = configurationNodes[i] as ConfigurationImpl;
1061-
node.resolvedUri = configurationUris[i].asDirectiveUri;
1062-
}
1063-
}
1064-
10651056
void _resolvePartDirective({
10661057
required FileAnalysis enclosingFile,
10671058
required PartDirectiveImpl directive,
@@ -1085,7 +1076,7 @@ class LibraryAnalyzer {
10851076
errorReporter.atNode(
10861077
directive.uri,
10871078
CompileTimeErrorCode.INVALID_URI,
1088-
arguments: [partState.uri.relativeUriStr],
1079+
arguments: [partState.selectedUri.relativeUriStr],
10891080
);
10901081
return;
10911082
}
@@ -1094,7 +1085,7 @@ class LibraryAnalyzer {
10941085
errorReporter.atNode(
10951086
directive.uri,
10961087
CompileTimeErrorCode.URI_DOES_NOT_EXIST,
1097-
arguments: [partState.uri.relativeUriStr],
1088+
arguments: [partState.selectedUri.relativeUriStr],
10981089
);
10991090
return;
11001091
}
@@ -1135,20 +1126,22 @@ class LibraryAnalyzer {
11351126
if (partElementUri is! DirectiveUriWithUnitImpl) {
11361127
switch (includedKind) {
11371128
case PartOfNameFileKind():
1138-
var name = includedKind.unlinked.name;
1139-
var libraryName = _libraryElement.name;
1140-
if (libraryName.isEmpty) {
1141-
errorReporter.atNode(
1142-
partUri,
1143-
CompileTimeErrorCode.PART_OF_UNNAMED_LIBRARY,
1144-
arguments: [name],
1145-
);
1146-
} else {
1147-
errorReporter.atNode(
1148-
partUri,
1149-
CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY,
1150-
arguments: [libraryName, name],
1151-
);
1129+
if (!_libraryElement.featureSet.isEnabled(Feature.enhanced_parts)) {
1130+
var name = includedKind.unlinked.name;
1131+
var libraryName = _libraryElement.name;
1132+
if (libraryName.isEmpty) {
1133+
errorReporter.atNode(
1134+
partUri,
1135+
CompileTimeErrorCode.PART_OF_UNNAMED_LIBRARY,
1136+
arguments: [name],
1137+
);
1138+
} else {
1139+
errorReporter.atNode(
1140+
partUri,
1141+
CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY,
1142+
arguments: [libraryName, name],
1143+
);
1144+
}
11521145
}
11531146
case PartOfUriFileKind():
11541147
errorReporter.atNode(
@@ -1163,12 +1156,27 @@ class LibraryAnalyzer {
11631156
return;
11641157
}
11651158

1159+
_resolveUriConfigurations(
1160+
configurationNodes: directive.configurations,
1161+
configurationUris: partState.uris.configurations,
1162+
);
1163+
11661164
_resolveDirectives(
11671165
enclosingFile: enclosingFile,
11681166
fileKind: includedKind,
11691167
fileElement: partElementUri.unit,
11701168
);
11711169
}
1170+
1171+
void _resolveUriConfigurations({
1172+
required List<ConfigurationImpl> configurationNodes,
1173+
required List<file_state.DirectiveUri> configurationUris,
1174+
}) {
1175+
for (var i = 0; i < configurationNodes.length; i++) {
1176+
var node = configurationNodes[i];
1177+
node.resolvedUri = configurationUris[i].asDirectiveUri;
1178+
}
1179+
}
11721180
}
11731181

11741182
/// Analysis result for single file.

pkg/analyzer/lib/src/summary2/library_builder.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,19 +1320,19 @@ class LibraryBuilder with MacroApplicationsContainer {
13201320
);
13211321

13221322
directiveUri = DirectiveUriWithUnitImpl(
1323-
relativeUriString: state.uri.relativeUriStr,
1324-
relativeUri: state.uri.relativeUri,
1323+
relativeUriString: state.selectedUri.relativeUriStr,
1324+
relativeUri: state.selectedUri.relativeUri,
13251325
unit: unitElement,
13261326
);
13271327
} else {
13281328
directiveUri = DirectiveUriWithSourceImpl(
1329-
relativeUriString: state.uri.relativeUriStr,
1330-
relativeUri: state.uri.relativeUri,
1329+
relativeUriString: state.selectedUri.relativeUriStr,
1330+
relativeUri: state.selectedUri.relativeUri,
13311331
source: state.includedFile.source,
13321332
);
13331333
}
13341334
default:
1335-
var uriState = state.uri;
1335+
var uriState = state.selectedUri;
13361336
switch (uriState) {
13371337
case file_state.DirectiveUriWithSource():
13381338
directiveUri = DirectiveUriWithSourceImpl(

pkg/analyzer/lib/src/test_utilities/find_node.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class FindNode {
5555

5656
ConditionalExpression get singleConditionalExpression => _single();
5757

58+
Configuration get singleConfiguration => _single();
59+
5860
ConstructorDeclaration get singleConstructorDeclaration => _single();
5961

6062
ConstructorFieldInitializer get singleConstructorFieldInitializer =>

pkg/analyzer/messages.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13293,6 +13293,7 @@ CompileTimeErrorCode:
1329313293
code:
1329413294

1329513295
```dart
13296+
%language=3.4
1329613297
%uri="lib/part_file.dart"
1329713298
part of lib;
1329813299
```
@@ -13302,6 +13303,7 @@ CompileTimeErrorCode:
1330213303
name to specify which library it's a part of:
1330313304

1330413305
```dart
13306+
%language=3.4
1330513307
part [!'part_file.dart'!];
1330613308
```
1330713309

@@ -13311,6 +13313,7 @@ CompileTimeErrorCode:
1331113313
by URI:
1331213314

1331313315
```dart
13316+
%language=3.4
1331413317
%uri="lib/part_file.dart"
1331513318
part of 'test.dart';
1331613319
```

pkg/analyzer/test/src/dart/analysis/analyzer_state_printer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ class AnalyzerStatePrinter {
661661
}
662662
});
663663
case PartIncludeWithUri():
664-
var uriStr = _stringOfUriStr(part.uri.relativeUriStr);
664+
var uriStr = _stringOfUriStr(part.selectedUri.relativeUriStr);
665665
sink.writelnWithIndent('uri: $uriStr');
666666
default:
667667
sink.writelnWithIndent('noUri');

pkg/analyzer/test/src/dart/analysis/file_state_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3220,6 +3220,35 @@ elementFactory
32203220
''');
32213221
}
32223222

3223+
test_newFile_library_parts_invalidUri_noSource() {
3224+
var a = newFile('$testPackageLibPath/a.dart', r'''
3225+
part 'foo:bar';
3226+
''');
3227+
3228+
fileStateFor(a);
3229+
3230+
assertDriverStateString(testFile, r'''
3231+
files
3232+
/home/test/lib/a.dart
3233+
uri: package:test/a.dart
3234+
current
3235+
id: file_0
3236+
kind: library_0
3237+
libraryImports
3238+
library_1 dart:core synthetic
3239+
partIncludes
3240+
uri: foo:bar
3241+
fileKinds: library_0
3242+
cycle_0
3243+
dependencies: dart:core
3244+
libraries: library_0
3245+
apiSignature_0
3246+
unlinkedKey: k00
3247+
libraryCycles
3248+
elementFactory
3249+
''');
3250+
}
3251+
32233252
test_newFile_library_parts_ofUri_two() {
32243253
var a = newFile('$testPackageLibPath/a.dart', r'''
32253254
part of 'c.dart';

0 commit comments

Comments
 (0)