import 'ast.dart';
import 'generator_tools.dart';
abstract class InternalOptions {
const InternalOptions();
}
abstract class Generator<T extends InternalOptions> {
const Generator();
void generate(
T generatorOptions,
Root root,
StringSink sink, {
required String dartPackageName,
});
}
abstract class StructuredGenerator<T extends InternalOptions>
extends Generator<T> {
const StructuredGenerator();
@override
void generate(
T generatorOptions,
Root root,
StringSink sink, {
required String dartPackageName,
}) {
final Indent indent = Indent(sink);
writeFilePrologue(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeFileImports(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeOpenNamespace(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeGeneralUtilities(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
if (root.apis.any((Api api) => api is AstProxyApi)) {
writeInstanceManager(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeInstanceManagerApi(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeProxyApiBaseCodec(generatorOptions, root, indent);
}
writeEnums(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeDataClasses(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeGeneralCodec(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeApis(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
writeCloseNamespace(
generatorOptions,
root,
indent,
dartPackageName: dartPackageName,
);
}
void writeFilePrologue(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
});
void writeFileImports(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
});
void writeOpenNamespace(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {}
void writeCloseNamespace(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {}
void writeGeneralUtilities(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {}
void writeEnums(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {
for (final Enum anEnum in root.enums) {
writeEnum(
generatorOptions,
root,
indent,
anEnum,
dartPackageName: dartPackageName,
);
}
}
void writeEnum(
T generatorOptions,
Root root,
Indent indent,
Enum anEnum, {
required String dartPackageName,
}) {}
void writeDataClasses(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {
for (final Class classDefinition in root.classes) {
writeDataClass(
generatorOptions,
root,
indent,
classDefinition,
dartPackageName: dartPackageName,
);
}
}
void writeGeneralCodec(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
});
void writeDataClass(
T generatorOptions,
Root root,
Indent indent,
Class classDefinition, {
required String dartPackageName,
});
void writeClassEncode(
T generatorOptions,
Root root,
Indent indent,
Class classDefinition, {
required String dartPackageName,
}) {}
void writeClassDecode(
T generatorOptions,
Root root,
Indent indent,
Class classDefinition, {
required String dartPackageName,
}) {}
void writeClassEquality(
T generatorOptions,
Root root,
Indent indent,
Class classDefinition, {
required String dartPackageName,
}) {}
void writeApis(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {
for (final Api api in root.apis) {
switch (api) {
case AstHostApi():
writeHostApi(
generatorOptions,
root,
indent,
api,
dartPackageName: dartPackageName,
);
case AstFlutterApi():
writeFlutterApi(
generatorOptions,
root,
indent,
api,
dartPackageName: dartPackageName,
);
case AstProxyApi():
writeProxyApi(
generatorOptions,
root,
indent,
api,
dartPackageName: dartPackageName,
);
case AstEventChannelApi():
writeEventChannelApi(
generatorOptions,
root,
indent,
api,
dartPackageName: dartPackageName,
);
}
}
}
void writeFlutterApi(
T generatorOptions,
Root root,
Indent indent,
AstFlutterApi api, {
required String dartPackageName,
});
void writeHostApi(
T generatorOptions,
Root root,
Indent indent,
AstHostApi api, {
required String dartPackageName,
});
void writeInstanceManager(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {}
void writeInstanceManagerApi(
T generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {}
void writeProxyApiBaseCodec(
T generatorOptions,
Root root,
Indent indent,
) {}
void writeProxyApi(
T generatorOptions,
Root root,
Indent indent,
AstProxyApi api, {
required String dartPackageName,
}) {}
void writeEventChannelApi(
T generatorOptions,
Root root,
Indent indent,
AstEventChannelApi api, {
required String dartPackageName,
}) {}
}