CQ. Extract _IndexTextBuilder.

Change-Id: I0119c2c312dd666fc42654e04c9dd445e8fb900e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/507740
Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Konstantin Shcheglov
2026-06-01 09:56:51 -07:00
parent bf02a527ce
commit 771a30f853
@@ -32,7 +32,7 @@ class IndexTest extends PubPackageResolutionTest {
Element element,
String expected,
) {
var actual = _getElementRelationsText(result, element);
var actual = _IndexTextBuilder(result).elementRelations(element);
if (actual != expected) {
NodeTextExpectationsCollector.add(actual);
printPrettyDiff(expected, actual);
@@ -45,7 +45,7 @@ class IndexTest extends PubPackageResolutionTest {
LibraryFragmentImpl fragment,
String expected,
) {
var actual = _getLibraryFragmentReferencesText(result, fragment);
var actual = _IndexTextBuilder(result).libraryFragmentReferences(fragment);
if (actual != expected) {
NodeTextExpectationsCollector.add(actual);
printPrettyDiff(expected, actual);
@@ -54,7 +54,7 @@ class IndexTest extends PubPackageResolutionTest {
}
void assertNameIndexText(_IndexResult result, String name, String expected) {
var actual = _getNameRelationsText(result, name);
var actual = _IndexTextBuilder(result).nameRelations(name);
if (actual != expected) {
NodeTextExpectationsCollector.add(actual);
printPrettyDiff(expected, actual);
@@ -4845,10 +4845,148 @@ void f() {
return stringIds.map((i) => index.strings[i]).toList();
}
/// Return the [element] identifier in the result index, or `null`.
int? _findElementId(_IndexResult result, Element element) {
Future<_IndexResult> _indexFileWithDiagnostics(File file, String code) async {
var unitResult = await resolveFileWithDiagnostics(file, code);
var indexBuilder = indexUnit(unitResult.unit);
var indexBytes = indexBuilder.toBuffer();
var index = AnalysisDriverUnitIndex.fromBuffer(indexBytes);
return _IndexResult(unitResult, index);
}
Future<_IndexResult> _indexTestCode(String code) {
return _indexFileWithDiagnostics(testFile, code);
}
String? _interfaceId(InterfaceElement element) {
var libraryFile = element.library.firstFragment.source.mustBeFile;
var libraryPath = libraryFile.path;
var fragmentFile = element.firstFragment.libraryFragment.source.mustBeFile;
var fragmentPath = fragmentFile.path;
return '$libraryPath;$fragmentPath;${element.name}';
}
}
final class _IndexRelation {
final IndexRelationKind kind;
final int offset;
final int length;
final bool isQualified;
_IndexRelation({
required this.kind,
required this.offset,
required this.length,
required this.isQualified,
});
@override
String toString() {
return '_IndexRelation{kind: $kind, offset: $offset, length: $length, '
'isQualified: $isQualified})';
}
}
final class _IndexResult {
final TestResolvedUnitResult resolvedUnit;
final AnalysisDriverUnitIndex index;
_IndexResult(this.resolvedUnit, this.index);
FindElement2 get findElement => resolvedUnit.findElement;
}
final class _IndexTextBuilder {
final _IndexResult result;
_IndexTextBuilder(this.result);
String elementRelations(Element element) {
var index = result.index;
var unitId = _getUnitId(index, element);
var elementId = _findElementId(element);
if (elementId == null) {
return '';
}
var relations = <_IndexRelation>[];
for (var i = 0; i < index.usedElementOffsets.length; i++) {
if (index.usedElements[i] == elementId) {
relations.add(
_IndexRelation(
kind: index.usedElementKinds[i],
offset: index.usedElementOffsets[i],
length: index.usedElementLengths[i],
isQualified: index.usedElementIsQualifiedFlags[i],
),
);
}
}
var buffer = StringBuffer();
_writeRelationsText(buffer, relations);
_writeImportPrefixesText(buffer, index.elementImportPrefixes[elementId]);
return buffer.toString();
}
String libraryFragmentReferences(LibraryFragmentImpl target) {
var index = result.index;
var targetId = index.getLibraryFragmentId(target);
expect(
index.libFragmentRefTargets.length,
index.libFragmentRefUriOffsets.length,
);
expect(
index.libFragmentRefTargets.length,
index.libFragmentRefUriLengths.length,
);
var buffer = StringBuffer();
for (var i = 0; i < index.libFragmentRefTargets.length; i++) {
if (index.libFragmentRefTargets[i] == targetId) {
_writeSourceSpanText(
buffer,
index.libFragmentRefUriOffsets[i],
index.libFragmentRefUriLengths[i],
);
buffer.writeln();
}
}
return buffer.toString();
}
String nameRelations(String name) {
var index = result.index;
var nameId = index.getStringId(name);
if (nameId == -1) {
return '';
}
var relations = <_IndexRelation>[];
for (var i = 0; i < index.usedNameOffsets.length; i++) {
if (index.usedNames[i] == nameId) {
relations.add(
_IndexRelation(
kind: index.usedNameKinds[i],
offset: index.usedNameOffsets[i],
length: name.length,
isQualified: index.usedNameIsQualifiedFlags[i],
),
);
}
}
var buffer = StringBuffer();
_writeRelationsText(buffer, relations);
return buffer.toString();
}
/// Return the [element] identifier in the result index, or `null`.
int? _findElementId(Element element) {
var index = result.index;
var unitId = _getUnitId(element);
// Prepare the element that was put into the index.
IndexElementInfo info = IndexElementInfo(element);
@@ -4878,32 +5016,13 @@ void f() {
return null;
}
String _getElementRelationsText(_IndexResult result, Element element) {
var index = result.index;
var elementId = _findElementId(result, element);
if (elementId == null) {
return '';
}
int _getUnitId(Element element) {
var unitElement = getUnitElement(element);
return result.index.getLibraryFragmentId(unitElement);
}
var relations = <_Relation>[];
for (var i = 0; i < index.usedElementOffsets.length; i++) {
if (index.usedElements[i] == elementId) {
relations.add(
_Relation(
kind: index.usedElementKinds[i],
offset: index.usedElementOffsets[i],
length: index.usedElementLengths[i],
isQualified: index.usedElementIsQualifiedFlags[i],
),
);
}
}
var buffer = StringBuffer();
_writeRelationsText(buffer, result, relations);
var prefixString = index.elementImportPrefixes[elementId];
// If the only access is unprefixed, omit the line
void _writeImportPrefixesText(StringBuffer buffer, String prefixString) {
// If the only access is unprefixed, omit the line.
if (prefixString.isNotEmpty) {
// Otherwise, use some marker text for unprefixed so it's clearer in the
// output than an empty string.
@@ -4914,110 +5033,12 @@ void f() {
buffer.writeln('Prefixes: $prefixes');
}
return buffer.toString();
}
String _getLibraryFragmentReferencesText(
_IndexResult result,
LibraryFragmentImpl target,
) {
var index = result.index;
var lineInfo = result.resolvedUnit.unit.lineInfo;
var targetId = index.getLibraryFragmentId(target);
expect(
index.libFragmentRefTargets.length,
index.libFragmentRefUriOffsets.length,
);
expect(
index.libFragmentRefTargets.length,
index.libFragmentRefUriLengths.length,
);
var buffer = StringBuffer();
for (var i = 0; i < index.libFragmentRefTargets.length; i++) {
if (index.libFragmentRefTargets[i] == targetId) {
var offset = index.libFragmentRefUriOffsets[i];
var length = index.libFragmentRefUriLengths[i];
var location = lineInfo.getLocation(offset);
var snippet = result.resolvedUnit.content.substring(
offset,
offset + length,
);
buffer.write(offset);
buffer.write(' ');
buffer.write(location.lineNumber);
buffer.write(':');
buffer.write(location.columnNumber);
buffer.write(' ');
buffer.write('|$snippet|');
buffer.writeln();
}
}
return buffer.toString();
}
String _getNameRelationsText(_IndexResult result, String name) {
var index = result.index;
var nameId = index.getStringId(name);
if (nameId == -1) {
return '';
}
var relations = <_Relation>[];
for (var i = 0; i < index.usedNameOffsets.length; i++) {
if (index.usedNames[i] == nameId) {
relations.add(
_Relation(
kind: index.usedNameKinds[i],
offset: index.usedNameOffsets[i],
length: name.length,
isQualified: index.usedNameIsQualifiedFlags[i],
),
);
}
}
var buffer = StringBuffer();
_writeRelationsText(buffer, result, relations);
return buffer.toString();
}
int _getUnitId(AnalysisDriverUnitIndex index, Element element) {
var unitElement = getUnitElement(element);
return index.getLibraryFragmentId(unitElement);
}
Future<_IndexResult> _indexFileWithDiagnostics(File file, String code) async {
var unitResult = await resolveFileWithDiagnostics(file, code);
var indexBuilder = indexUnit(unitResult.unit);
var indexBytes = indexBuilder.toBuffer();
var index = AnalysisDriverUnitIndex.fromBuffer(indexBytes);
return _IndexResult(unitResult, index);
}
Future<_IndexResult> _indexTestCode(String code) {
return _indexFileWithDiagnostics(testFile, code);
}
String? _interfaceId(InterfaceElement element) {
var libraryFile = element.library.firstFragment.source.mustBeFile;
var libraryPath = libraryFile.path;
var fragmentFile = element.firstFragment.libraryFragment.source.mustBeFile;
var fragmentPath = fragmentFile.path;
return '$libraryPath;$fragmentPath;${element.name}';
}
void _writeRelationsText(
StringBuffer buffer,
_IndexResult result,
List<_Relation> relations,
List<_IndexRelation> relations,
) {
var lineInfo = result.resolvedUnit.unit.lineInfo;
var sortedRelations = relations.sorted((a, b) {
var byOffset = a.offset - b.offset;
if (byOffset != 0) {
@@ -5042,20 +5063,7 @@ void f() {
}
for (var relation in sortedRelations) {
var offset = relation.offset;
var length = relation.length;
var location = lineInfo.getLocation(offset);
var snippet = result.resolvedUnit.content.substring(
offset,
offset + length,
);
buffer.write(offset);
buffer.write(' ');
buffer.write(location.lineNumber);
buffer.write(':');
buffer.write(location.columnNumber);
buffer.write(' ');
buffer.write('|$snippet|');
_writeSourceSpanText(buffer, relation.offset, relation.length);
buffer.write(' ');
buffer.write(relation.kind.name);
if (relation.isQualified) {
@@ -5064,34 +5072,21 @@ void f() {
buffer.writeln();
}
}
}
final class _IndexResult {
final TestResolvedUnitResult resolvedUnit;
final AnalysisDriverUnitIndex index;
_IndexResult(this.resolvedUnit, this.index);
FindElement2 get findElement => resolvedUnit.findElement;
}
class _Relation {
final IndexRelationKind kind;
final int offset;
final int length;
final bool isQualified;
_Relation({
required this.kind,
required this.offset,
required this.length,
required this.isQualified,
});
@override
String toString() {
return '_Relation{kind: $kind, offset: $offset, length: $length, '
'isQualified: $isQualified})';
void _writeSourceSpanText(StringBuffer buffer, int offset, int length) {
var lineInfo = result.resolvedUnit.unit.lineInfo;
var location = lineInfo.getLocation(offset);
var snippet = result.resolvedUnit.content.substring(
offset,
offset + length,
);
buffer.write(offset);
buffer.write(' ');
buffer.write(location.lineNumber);
buffer.write(':');
buffer.write(location.columnNumber);
buffer.write(' ');
buffer.write('|$snippet|');
}
}