Skip to content

Commit

Permalink
add extra params in SpecVisitor
Browse files Browse the repository at this point in the history
  • Loading branch information
ebwood committed Mar 17, 2024
1 parent b8709de commit b7e6af9
Show file tree
Hide file tree
Showing 5 changed files with 325 additions and 204 deletions.
121 changes: 121 additions & 0 deletions packages/rfw_builder/example/test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import 'package:rfw/formats.dart';

void main() {
print(visitDynamicList(
["hello", "world", "welcome to the crazy world wahahahah"]));
return;
const call = ConstructorCall('Container', {
'color': 0xFFF44336,
'child': ConstructorCall('Text', {
'text':
"'hello world, welcome to the crazy world wahahahahhahahafdafasdfsda!!'",
'list': ["hello", "world", "welcome to the crazy world wahahahah"]
})
});
final result = visitConstructorCall(call);
print(result);
}

String indent = ' ';
String visitConstructorCall(ConstructorCall call) {
// map的内容,决定了ConstructorCall是单行还是多行,规则:
// 先简单一点来,假设这个ConstructorCall是最顶级的,也就是前面没有内容了; 所有值都是int/double/bool/String
StringBuffer buffer = StringBuffer();

// 添加参数
List<String> arguments = [];
call.arguments.forEach((key, value) {
// if (value == null) {
// return;
// }
StringBuffer argumentsBuffer = StringBuffer();
String keyString = '$key: ';
argumentsBuffer.write(keyString);

final lineString = visitObject(value);
bool overLineLimit = checkOverLineLimit([keyString, lineString]);
if (overLineLimit) {
List<String> lines = lineString.split('\n');
lines = [lines[0], ...lines.sublist(1).map((e) => '$indent$e')];
argumentsBuffer.write(lines.join('\n'));
} else {
argumentsBuffer.write(lineString);
}
arguments.add(argumentsBuffer.toString());
});

String left = '${call.name}(';
String right = ')';
bool overLineLimit = checkOverLineLimit([left, arguments.join(', '), right]);

buffer.write(left);
if (overLineLimit) {
buffer.write('\n');
for (var e in arguments) {
buffer.write('$indent$e,\n');
}
} else {
buffer.write(arguments.join(', '));
}

buffer.write(right);
return buffer.toString();
}

bool isSingleLine(String value) => !value.contains('\n');

bool checkOverLineLimit(List<String> value, {int limit = 80}) {
return value.any((e) => e.contains('\n')) || value.join('').length > limit;
}

String visitObject(Object? value) {
if (value == null) {
return 'null';
} else if (value is ConstructorCall) {
return visitConstructorCall(value);
} else if (value is DynamicList) {
return visitDynamicList(value);
} else if (value is String) {
return '"$value"';
}
return '$value';
}

String visitDynamicList(DynamicList list) {
List<String> arguments = [];

for (var e in list) {
StringBuffer argumentsBuffer = StringBuffer();
final lineString = visitObject(e);
if (checkOverLineLimit([lineString])) {
// argumentsBuffer.write('\n');

List<String> lines = lineString.split('\n');
lines = lines.map((e) => '$indent$e').toList();

argumentsBuffer.write(lines.join('\n'));
} else {
argumentsBuffer.write(lineString);
}
arguments.add(argumentsBuffer.toString());
}

StringBuffer buffer = StringBuffer();
String left = '[';
String right = ']';
bool overLineLimit = checkOverLineLimit([left, arguments.join(', '), right]);

buffer.write(left);
if (overLineLimit) {
buffer.write('\n');
buffer.write(arguments.map((e) => '$indent$e').join(',\n'));
// for (var e in arguments) {
// buffer.write('$indent$e,\n');
// }
} else {
buffer.write(arguments.join(', '));
}

buffer.write(right);
return buffer.toString();
}
106 changes: 53 additions & 53 deletions packages/rfw_builder/lib/src/base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,104 +9,104 @@ abstract class Builder<T> {
}

abstract class Spec {
R accept<R>(SpecVisitor<R> visitor, [R? context]);
R accept<R, S>(SpecVisitor<R, S> visitor, [R? context, S? param]);
}

abstract class SpecVisitor<R> {
R visitObject(Object? spec, [R? context]);
abstract class SpecVisitor<R, S> {
R visitObject(Object? spec, [R? context, S? params]);

R visitDynamicList(DynamicList spec, [R? context]);
R visitDynamicList(DynamicList spec, [R? context, S? params]);

R visitDynamicMap(DynamicMap spec,
[R? context, bool withoutCurlyBraces = false, bool singleLine = false]);

R visitLibraryName(LibraryName spec, [R? context]);
R visitLibraryName(LibraryName spec, [R? context, S? params]);

R visitFullyQualifiedWidgetName(FullyQualifiedWidgetName spec, [R? context]);
R visitFullyQualifiedWidgetName(FullyQualifiedWidgetName spec, [R? context, S? params]);

R visitMissing(Missing spec, [R? context]);
R visitMissing(Missing spec, [R? context, S? params]);

R visitLoop(Loop spec, [R? context]);
R visitLoop(Loop spec, [R? context, S? params]);

R visitSwitch(Switch spec, [R? context]);
R visitSwitch(Switch spec, [R? context, S? params]);

R visitConstructorCall(ConstructorCall spec, [R? context]);
R visitConstructorCall(ConstructorCall spec, [R? context, S? params]);

R visitWidgetBuilderDeclaration(WidgetBuilderDeclaration spec, [R? context]);
R visitWidgetBuilderDeclaration(WidgetBuilderDeclaration spec, [R? context, S? params]);

R visitArgsReference(ArgsReference spec, [R? context]);
R visitArgsReference(ArgsReference spec, [R? context, S? params]);

R visitBoundArgsReference(BoundArgsReference spec, [R? context]);
R visitBoundArgsReference(BoundArgsReference spec, [R? context, S? params]);

R visitDataReference(DataReference spec, [R? context]);
R visitDataReference(DataReference spec, [R? context, S? params]);

R visitWidgetBuilderArgReference(WidgetBuilderArgReference spec,
[R? context]);
[R? context, S? params]);

R visitLoopReference(LoopReference spec, [R? context]);
R visitLoopReference(LoopReference spec, [R? context, S? params]);

R visitBoundLoopReference(BoundLoopReference spec, [R? context]);
R visitBoundLoopReference(BoundLoopReference spec, [R? context, S? params]);

R visitStateReference(StateReference spec, [R? context]);
R visitStateReference(StateReference spec, [R? context, S? params]);

R visitBoundStateReference(BoundStateReference spec, [R? context]);
R visitBoundStateReference(BoundStateReference spec, [R? context, S? params]);

R visitEventHandler(EventHandler spec, [R? context]);
R visitEventHandler(EventHandler spec, [R? context, S? params]);

R visitSetStateHandler(SetStateHandler spec, [R? context]);
R visitSetStateHandler(SetStateHandler spec, [R? context, S? params]);

R visitImport(Import spec, [R? context]);
R visitImport(Import spec, [R? context, S? params]);

R visitWidgetDeclaration(WidgetDeclaration spec, [R? context]);
R visitWidgetDeclaration(WidgetDeclaration spec, [R? context, S? params]);

R visitRemoteWidgetLibrary(RemoteWidgetLibrary spec, [R? context]);
R visitRemoteWidgetLibrary(RemoteWidgetLibrary spec, [R? context, S? params]);

R visitOtherReference(Reference spec, [R? context]);
R visitOtherReference(Reference spec, [R? context, S? params]);

R visitOtherAnyEventHandler(AnyEventHandler spec, [R? context]);
R visitOtherAnyEventHandler(AnyEventHandler spec, [R? context, S? params]);

R visitOtherBlobNode(BlobNode spec, [R? context]);
R visitOtherBlobNode(BlobNode spec, [R? context, S? params]);
}

mixin class DefaultSpecVisitor<R> implements SpecVisitor<R> {
mixin class DefaultSpecVisitor<R, S> implements SpecVisitor<R, S> {
@override
R visitArgsReference(ArgsReference spec, [R? context]) {
R visitArgsReference(ArgsReference spec, [R? context, S? params]) {
// TODO: implement visitArgsReference
throw UnimplementedError();
}

@override
R visitBoundArgsReference(BoundArgsReference spec, [R? context]) {
R visitBoundArgsReference(BoundArgsReference spec, [R? context, S? params]) {
// TODO: implement visitBoundArgsReference
throw UnimplementedError();
}

@override
R visitBoundLoopReference(BoundLoopReference spec, [R? context]) {
R visitBoundLoopReference(BoundLoopReference spec, [R? context, S? params]) {
// TODO: implement visitBoundLoopReference
throw UnimplementedError();
}

@override
R visitBoundStateReference(BoundStateReference spec, [R? context]) {
R visitBoundStateReference(BoundStateReference spec, [R? context, S? params]) {
// TODO: implement visitBoundStateReference
throw UnimplementedError();
}

@override
R visitConstructorCall(ConstructorCall spec, [R? context]) {
R visitConstructorCall(ConstructorCall spec, [R? context, S? params]) {
// TODO: implement visitConstructorCall
throw UnimplementedError();
}

@override
R visitDataReference(DataReference spec, [R? context]) {
R visitDataReference(DataReference spec, [R? context, S? params]) {
// TODO: implement visitDataReference
throw UnimplementedError();
}

@override
R visitDynamicList(DynamicList spec, [R? context]) {
R visitDynamicList(DynamicList spec, [R? context, S? params]) {
// TODO: implement visitDynamicList
throw UnimplementedError();
}
Expand All @@ -119,110 +119,110 @@ mixin class DefaultSpecVisitor<R> implements SpecVisitor<R> {
}

@override
R visitEventHandler(EventHandler spec, [R? context]) {
R visitEventHandler(EventHandler spec, [R? context, S? params]) {
// TODO: implement visitEventHandler
throw UnimplementedError();
}

@override
R visitFullyQualifiedWidgetName(FullyQualifiedWidgetName spec, [R? context]) {
R visitFullyQualifiedWidgetName(FullyQualifiedWidgetName spec, [R? context, S? params]) {
// TODO: implement visitFullyQualifiedWidgetName
throw UnimplementedError();
}

@override
R visitImport(Import spec, [R? context]) {
R visitImport(Import spec, [R? context, S? params]) {
// TODO: implement visitImport
throw UnimplementedError();
}

@override
R visitLibraryName(LibraryName spec, [R? context]) {
R visitLibraryName(LibraryName spec, [R? context, S? params]) {
// TODO: implement visitLibraryName
throw UnimplementedError();
}

@override
R visitLoop(Loop spec, [R? context]) {
R visitLoop(Loop spec, [R? context, S? params]) {
// TODO: implement visitLoop
throw UnimplementedError();
}

@override
R visitLoopReference(LoopReference spec, [R? context]) {
R visitLoopReference(LoopReference spec, [R? context, S? params]) {
// TODO: implement visitLoopReference
throw UnimplementedError();
}

@override
R visitMissing(Missing spec, [R? context]) {
R visitMissing(Missing spec, [R? context, S? params]) {
// TODO: implement visitMissing
throw UnimplementedError();
}

@override
R visitOtherAnyEventHandler(AnyEventHandler spec, [R? context]) {
R visitOtherAnyEventHandler(AnyEventHandler spec, [R? context, S? params]) {
// TODO: implement visitOtherAnyEventHandler
throw UnimplementedError();
}

@override
R visitOtherBlobNode(BlobNode spec, [R? context]) {
R visitOtherBlobNode(BlobNode spec, [R? context, S? params]) {
// TODO: implement visitOtherBlobNode
throw UnimplementedError();
}

@override
R visitOtherReference(Reference spec, [R? context]) {
R visitOtherReference(Reference spec, [R? context, S? params]) {
// TODO: implement visitOtherReference
throw UnimplementedError();
}

@override
R visitRemoteWidgetLibrary(RemoteWidgetLibrary spec, [R? context]) {
R visitRemoteWidgetLibrary(RemoteWidgetLibrary spec, [R? context, S? params]) {
// TODO: implement visitRemoteWidgetLibrary
throw UnimplementedError();
}

@override
R visitSetStateHandler(SetStateHandler spec, [R? context]) {
R visitSetStateHandler(SetStateHandler spec, [R? context, S? params]) {
// TODO: implement visitSetStateHandler
throw UnimplementedError();
}

@override
R visitStateReference(StateReference spec, [R? context]) {
R visitStateReference(StateReference spec, [R? context, S? params]) {
// TODO: implement visitStateReference
throw UnimplementedError();
}

@override
R visitSwitch(Switch spec, [R? context]) {
R visitSwitch(Switch spec, [R? context, S? params]) {
// TODO: implement visitSwitch
throw UnimplementedError();
}

@override
R visitWidgetBuilderArgReference(WidgetBuilderArgReference spec,
[R? context]) {
[R? context, S? params]) {
// TODO: implement visitWidgetBuilderArgReference
throw UnimplementedError();
}

@override
R visitWidgetBuilderDeclaration(WidgetBuilderDeclaration spec, [R? context]) {
R visitWidgetBuilderDeclaration(WidgetBuilderDeclaration spec, [R? context, S? params]) {
// TODO: implement visitWidgetBuilderDeclaration
throw UnimplementedError();
}

@override
R visitWidgetDeclaration(WidgetDeclaration spec, [R? context]) {
R visitWidgetDeclaration(WidgetDeclaration spec, [R? context, S? params]) {
// TODO: implement visitWidgetDeclaration
throw UnimplementedError();
}

@override
R visitObject(Object? spec, [R? context]) {
R visitObject(Object? spec, [R? context, S? params]) {
// TODO: implement visitObject
throw UnimplementedError();
}
Expand Down
Loading

0 comments on commit b7e6af9

Please sign in to comment.