[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:
committed by
Commit Queue
parent
176c192106
commit
ee75d1dfab
@@ -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('=');
|
||||
|
||||
Reference in New Issue
Block a user