[cfe] Add file offsets for FunctionNode in ast-to-text

This is in preparation for adding missing file offsets.

Change-Id: If122a650a06c9ddf3ae5b73bf75d2f65aea51852
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/488482
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Johnni Winther
2026-03-17 06:22:14 -07:00
committed by Commit Queue
parent 176c192106
commit ee75d1dfab
63 changed files with 595 additions and 267 deletions
+177 -91
View File
@@ -110,44 +110,54 @@ NameSystem globalDebuggingNames = new NameSystem();
String debugNodeToString(Node node) {
StringBuffer buffer = new StringBuffer();
new Printer(buffer, showOffsets: true, syntheticNames: globalDebuggingNames)
.writeNode(node);
new Printer(
buffer,
showOffsets: true,
syntheticNames: globalDebuggingNames,
).writeNode(node);
return '$buffer';
}
String debugLibraryToString(Library library) {
StringBuffer buffer = new StringBuffer();
new Printer(buffer, syntheticNames: globalDebuggingNames)
.writeLibraryFile(library);
new Printer(
buffer,
syntheticNames: globalDebuggingNames,
).writeLibraryFile(library);
return '$buffer';
}
String debugComponentToString(Component component) {
StringBuffer buffer = new StringBuffer();
new Printer(buffer, syntheticNames: new NameSystem())
.writeComponentFile(component);
new Printer(
buffer,
syntheticNames: new NameSystem(),
).writeComponentFile(component);
return '$buffer';
}
String componentToString(Component node) {
StringBuffer buffer = new StringBuffer();
new Printer(buffer, syntheticNames: new NameSystem())
.writeComponentFile(node);
new Printer(
buffer,
syntheticNames: new NameSystem(),
).writeComponentFile(node);
return '$buffer';
}
class NameSystem {
final Namer<Variable> variables =
new NormalNamer<Variable>('#t');
final Namer<Variable> variables = new NormalNamer<Variable>('#t');
final Namer<Reference> libraries = new NormalNamer<Reference>('#lib');
final Namer<TypeParameter> typeParameters =
new NormalNamer<TypeParameter>('#T');
final Namer<TypeParameter> typeParameters = new NormalNamer<TypeParameter>(
'#T',
);
final Namer<StructuralParameter> structuralParameters =
new NormalNamer<StructuralParameter>('#T');
final Namer<TreeNode> labels = new NormalNamer<TreeNode>('#L');
final Namer<Constant> constants = new ConstantNamer('#C');
final Namer<VariableContext> contexts =
new NormalNamer<VariableContext>('#ctx');
final Namer<VariableContext> contexts = new NormalNamer<VariableContext>(
'#ctx',
);
final Disambiguator<Reference, CanonicalName> prefixes =
new Disambiguator<Reference, CanonicalName>();
@@ -183,7 +193,9 @@ class NameSystem {
return abbreviateName(path);
} else {
return _nameFromLibraryCanonicalName(
reference, reference.canonicalName);
reference,
reference.canonicalName,
);
}
});
}
@@ -204,8 +216,11 @@ class NameSystem {
return 'L';
}
String nameCanonicalNameAsLibraryPrefix(Reference? node, CanonicalName? name,
{String? proposedName}) {
String nameCanonicalNameAsLibraryPrefix(
Reference? node,
CanonicalName? name, {
String? proposedName,
}) {
return prefixes.disambiguate(node, name, () {
if (proposedName != null) return proposedName;
return _nameFromLibraryCanonicalName(node, name);
@@ -251,25 +266,30 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
static final int SYMBOL = 2;
int state = SPACE;
Printer(this.sink,
{NameSystem? syntheticNames,
this.showOffsets = false,
this.showMetadata = false,
this.showLibraryForNames = false,
this.importTable,
this.annotator,
this.metadata})
: this.syntheticNames = syntheticNames ?? new NameSystem();
Printer(
this.sink, {
NameSystem? syntheticNames,
this.showOffsets = false,
this.showMetadata = false,
this.showLibraryForNames = false,
this.importTable,
this.annotator,
this.metadata,
}) : this.syntheticNames = syntheticNames ?? new NameSystem();
Printer createInner(ImportTable importTable,
Map<String, MetadataRepository<dynamic>>? metadata) {
return new Printer(sink,
importTable: importTable,
metadata: metadata,
syntheticNames: syntheticNames,
annotator: annotator,
showOffsets: showOffsets,
showMetadata: showMetadata);
Printer createInner(
ImportTable importTable,
Map<String, MetadataRepository<dynamic>>? metadata,
) {
return new Printer(
sink,
importTable: importTable,
metadata: metadata,
syntheticNames: syntheticNames,
annotator: annotator,
showOffsets: showOffsets,
showMetadata: showMetadata,
);
}
bool shouldHighlight(Node node) {
@@ -338,8 +358,9 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
String declarationName = getClassReference(enclosingDeclaration);
return '$declarationName::$name';
} else if (enclosingDeclaration is ExtensionTypeDeclaration) {
String declarationName =
getExtensionTypeDeclarationReference(enclosingDeclaration);
String declarationName = getExtensionTypeDeclarationReference(
enclosingDeclaration,
);
return '$declarationName::$name';
} else {
String library = getLibraryReference(node.enclosingLibrary.reference);
@@ -433,8 +454,11 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
LibraryImportTable imports = new LibraryImportTable(library);
Printer inner = createInner(imports, library.enclosingComponent?.metadata);
inner.writeStandardLibraryContent(library,
outerPrinter: this, importsToPrint: imports);
inner.writeStandardLibraryContent(
library,
outerPrinter: this,
importsToPrint: imports,
);
}
void writeProcedureInLibrary(Procedure procedure, Library library) {
@@ -447,8 +471,10 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
for (Library library in imports.importedLibraries) {
String importPath = imports.getImportPath(library);
if (importPath == "") {
String prefix = syntheticNames.nameLibraryPrefix(library.reference,
proposedName: 'self');
String prefix = syntheticNames.nameLibraryPrefix(
library.reference,
proposedName: 'self',
);
endLine('import self as $prefix;');
} else {
String prefix = syntheticNames.nameLibraryPrefix(library.reference);
@@ -457,12 +483,17 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
}
}
void writeStandardLibraryContent(Library library,
{Printer? outerPrinter, LibraryImportTable? importsToPrint}) {
void writeStandardLibraryContent(
Library library, {
Printer? outerPrinter,
LibraryImportTable? importsToPrint,
}) {
_currentLibrary = library;
outerPrinter ??= this;
outerPrinter.writeProblemsAsJson(
"Problems in library", library.problemsAsJson);
"Problems in library",
library.problemsAsJson,
);
if (importsToPrint != null) {
outerPrinter.printLibraryImportTable(importsToPrint);
@@ -642,8 +673,10 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
writeWord("[${node.fileOffset}]");
}
if (showMetadata && node is TreeNode && node is! VariableDeclaration) {
writeMetadata(node,
separateLines: node is Member || node is FunctionDeclaration);
writeMetadata(
node,
separateLines: node is Member || node is FunctionDeclaration,
);
}
node.accept(this);
@@ -748,8 +781,16 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
}
}
void writeFunction(FunctionNode function,
{name, List<Initializer>? initializers, bool terminateLine = true}) {
void writeFunction(
FunctionNode function, {
name,
List<Initializer>? initializers,
bool terminateLine = true,
}) {
if (showOffsets) {
writeWord("[${function.fileOffset}]");
writeWord("[${function.fileEndOffset}]");
}
if (name is String) {
writeWord(name);
} else if (name is Name) {
@@ -758,11 +799,16 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
assert(name == null);
}
writeTypeParameterList(function.typeParameters);
writeParameterList(function.positionalParameters, function.namedParameters,
function.requiredParameterCount);
writeParameterList(
function.positionalParameters,
function.namedParameters,
function.requiredParameterCount,
);
_writeContexts(function);
writeReturnType(
function.returnType, annotator?.annotateReturn(this, function));
function.returnType,
annotator?.annotateReturn(this, function),
);
if (initializers != null && initializers.isNotEmpty) {
endLine();
++indentation;
@@ -791,7 +837,8 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
redirectingFactoryTarget.target != null) {
writeWord('/* redirection-target:');
writeMemberReferenceFromReference(
redirectingFactoryTarget.targetReference);
redirectingFactoryTarget.targetReference,
);
if (redirectingFactoryTarget.typeArguments!.isNotEmpty) {
writeSymbol('<');
writeList(redirectingFactoryTarget.typeArguments!, writeType);
@@ -931,18 +978,25 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
state = WORD; // Ensure space if not followed by another symbol.
}
void writeParameterList(List<VariableDeclaration> positional,
List<VariableDeclaration> named, int requiredParameterCount) {
void writeParameterList(
List<VariableDeclaration> positional,
List<VariableDeclaration> named,
int requiredParameterCount,
) {
writeSymbol('(');
writeList(
positional.take(requiredParameterCount), writeVariableDeclaration);
positional.take(requiredParameterCount),
writeVariableDeclaration,
);
if (requiredParameterCount < positional.length) {
if (requiredParameterCount > 0) {
writeComma();
}
writeSymbol('[');
writeList(
positional.skip(requiredParameterCount), writeVariableDeclaration);
positional.skip(requiredParameterCount),
writeVariableDeclaration,
);
writeSymbol(']');
}
if (named.isNotEmpty) {
@@ -956,8 +1010,11 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
writeSymbol(')');
}
void writeList<T>(Iterable<T> nodes, void callback(T x),
{String separator = ','}) {
void writeList<T>(
Iterable<T> nodes,
void callback(T x), {
String separator = ',',
}) {
bool first = true;
for (T node in nodes) {
if (first) {
@@ -982,15 +1039,18 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
}
void writeExtensionTypeDeclarationReferenceFromReference(
Reference reference) {
Reference reference,
) {
writeWord(getExtensionTypeDeclarationReferenceFromReference(reference));
}
String getExtensionTypeDeclarationReferenceFromReference(
Reference reference) {
Reference reference,
) {
if (reference.node != null) {
return getExtensionTypeDeclarationReference(
reference.asExtensionTypeDeclaration);
reference.asExtensionTypeDeclaration,
);
}
if (reference.canonicalName != null) {
return getCanonicalNameString(reference.canonicalName!);
@@ -1020,7 +1080,9 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
return getLibraryReference(lib.reference);
}
return syntheticNames.nameCanonicalNameAsLibraryPrefix(
lib.reference, lib);
lib.reference,
lib,
);
}
String classString(CanonicalName cls) =>
@@ -1098,8 +1160,10 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
}
}
void writeAnnotationList(List<Expression> nodes,
{bool separateLines = true}) {
void writeAnnotationList(
List<Expression> nodes, {
bool separateLines = true,
}) {
for (Expression node in nodes) {
if (separateLines) {
writeIndentation();
@@ -1220,7 +1284,9 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
}
if (node.hasIsCovariantByDeclaration) {
writeModifier(
node.isCovariantByDeclaration, 'covariant-by-declaration');
node.isCovariantByDeclaration,
'covariant-by-declaration',
);
}
if (node.hasIsCovariantByClass) {
writeModifier(node.isCovariantByClass, 'covariant-by-class');
@@ -1233,7 +1299,9 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
}
if (node.hasIsSynthesized) {
writeModifier(
node.isSynthesized && node.cosmeticName != null, 'synthesized');
node.isSynthesized && node.cosmeticName != null,
'synthesized',
);
}
if (node.hasIsHoisted) {
writeModifier(node.isHoisted, 'hoisted');
@@ -1354,8 +1422,11 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
break;
case ProcedureStubKind.MemberSignature:
case ProcedureStubKind.AbstractMixinStub:
writeFunction(node.function,
name: getMemberName(node), terminateLine: false);
writeFunction(
node.function,
name: getMemberName(node),
terminateLine: false,
);
if (node.function.body is ReturnStatement) {
writeSymbol(';');
}
@@ -1382,8 +1453,11 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
if (features.isNotEmpty) {
writeWord("/*${features.join(',')}*/");
}
writeFunction(node.function,
name: node.name, initializers: node.initializers);
writeFunction(
node.function,
name: node.name,
initializers: node.initializers,
);
}
@override
@@ -1657,9 +1731,7 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
_writeDynamicAccessKind(node.kind);
if (!node.isImplicitCall) {
writeSymbol('.');
writeName(
node.name,
);
writeName(node.name);
}
writeNode(node.arguments);
}
@@ -1823,8 +1895,10 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
@override
void visitLogicalExpression(LogicalExpression node) {
int precedence = Precedence.binaryPrecedence[
logicalExpressionOperatorToString(node.operatorEnum)]!;
int precedence =
Precedence.binaryPrecedence[logicalExpressionOperatorToString(
node.operatorEnum,
)]!;
writeExpression(node.left, precedence);
writeSpaced(logicalExpressionOperatorToString(node.operatorEnum));
writeExpression(node.right, precedence + 1);
@@ -2381,9 +2455,11 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
writeSymbol('.${node.name}');
writeSymbol('{');
// TODO(johnniwinther): Should we store the result type in the node?
writeType(node.receiverType.named
.singleWhere((element) => element.name == node.name)
.type);
writeType(
node.receiverType.named
.singleWhere((element) => element.name == node.name)
.type,
);
writeSymbol('}');
}
@@ -2690,8 +2766,10 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
writeFunction(node.function, name: getVariableName(node.variable));
}
void writeVariableDeclaration(VariableDeclaration node,
{bool useVarKeyword = false}) {
void writeVariableDeclaration(
VariableDeclaration node, {
bool useVarKeyword = false,
}) {
if (node is FunctionParameter) {
writeExpressionVariable(node);
} else {
@@ -2709,7 +2787,8 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
writeModifier(node.isHoisted, 'hoisted');
writeModifier(node.isWildcard, 'wildcard');
writeModifier(node.isErroneouslyInitialized, 'erroneously-initialized');
bool hasImplicitInitializer = node.initializer is NullLiteral ||
bool hasImplicitInitializer =
node.initializer is NullLiteral ||
(node.initializer is ConstantExpression &&
(node.initializer as ConstantExpression).constant
is NullConstant);
@@ -2720,7 +2799,9 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
!hasImplicitInitializer &&
!node.hasDeclaredInitializer) {
writeModifier(
node.hasDeclaredInitializer, 'has-no-declared-initializer');
node.hasDeclaredInitializer,
'has-no-declared-initializer',
);
}
writeAnnotatedType(node.type, annotator?.annotateVariable(this, node));
writeWord(getVariableName(node));
@@ -2732,9 +2813,7 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
}
}
void writeVariableInitialization(
VariableInitialization node,
) {
void writeVariableInitialization(VariableInitialization node) {
if (node is VariableDeclaration) {
writeVariableDeclaration(node);
} else {
@@ -2742,7 +2821,8 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
if (showMetadata) writeMetadata(node);
writeAnnotationList(node.annotations, separateLines: false);
writeModifier(node.isErroneouslyInitialized, 'erroneously-initialized');
bool hasImplicitInitializer = node.initializer is NullLiteral ||
bool hasImplicitInitializer =
node.initializer is NullLiteral ||
(node.initializer is ConstantExpression &&
(node.initializer as ConstantExpression).constant
is NullConstant);
@@ -2753,7 +2833,9 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
!hasImplicitInitializer &&
!node.hasDeclaredInitializer) {
writeModifier(
node.hasDeclaredInitializer, 'has-no-declared-initializer');
node.hasDeclaredInitializer,
'has-no-declared-initializer',
);
}
writeWord(getVariableName(node.variable));
Expression? initializer = node.initializer;
@@ -2772,8 +2854,10 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
writeSymbol('>');
}
writeSymbol('(');
Iterable<TreeNode> allArgs =
<List<TreeNode>>[node.positional, node.named].expand((x) => x);
Iterable<TreeNode> allArgs = <List<TreeNode>>[
node.positional,
node.named,
].expand((x) => x);
writeList(allArgs, writeNode);
writeSymbol(')');
}
@@ -2905,7 +2989,8 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
@override
void visitExtensionType(ExtensionType node) {
writeExtensionTypeDeclarationReferenceFromReference(
node.extensionTypeDeclarationReference);
node.extensionTypeDeclarationReference,
);
if (node.typeArguments.isNotEmpty) {
writeSymbol('<');
writeList(node.typeArguments, writeType);
@@ -3278,7 +3363,8 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
@override
void visitRedirectingFactoryTearOffConstant(
RedirectingFactoryTearOffConstant node) {
RedirectingFactoryTearOffConstant node,
) {
writeIndentation();
writeConstantReference(node);
writeSpaced('=');