Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1481)

Unified Diff: reflectable/lib/src/transformer_implementation.dart

Issue 1181413005: Implement newInstance in the transformer. (Closed) Base URL: https://github.com/dart-lang/reflectable.git@master
Patch Set: Address review Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « reflectable/lib/src/mirrors_unimpl.dart ('k') | test_reflectable/.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: reflectable/lib/src/transformer_implementation.dart
diff --git a/reflectable/lib/src/transformer_implementation.dart b/reflectable/lib/src/transformer_implementation.dart
index 744a395b10e8661ad6303ec789ea187ef1653b6f..7d0812b41a8b740847e32f8af4bd062f12ed258a 100644
--- a/reflectable/lib/src/transformer_implementation.dart
+++ b/reflectable/lib/src/transformer_implementation.dart
@@ -239,6 +239,80 @@ class ClassDomain {
return "new UnmodifiableListView([${metadataParts.join(", ")}])";
}
+ String get newInstanceString {
+ List<String> constructorLines = new List<String>();
+
+ String name(int i) {
+ String alphabet = "abcdefghijklmnopqrstuvwxyz";
+ int alphabetLength = alphabet.length;
+ if (i < alphabetLength) {
+ return "_${alphabet[i]}";
+ }
+ return "_${alphabet[i % alphabetLength]}${i ~/ alphabetLength}";
+ }
+ for (ConstructorElement constructor in constructors) {
+ FunctionType type = constructor.type;
+ int requiredPositionalCount = type.normalParameterTypes.length;
+ int optionalPositionalCount = type.optionalParameterTypes.length;
+ List<String> argumentNames = type.namedParameterTypes.keys.toList();
+ String positionals = new Iterable.generate(
+ requiredPositionalCount, (int i) => name(i)).join(", ");
+ String optionalsWithDefaults = new Iterable.generate(
+ optionalPositionalCount, (int i) {
+ String defaultValueCode = constructor.parameters[
+ requiredPositionalCount + i].defaultValueCode;
+ String defaultValueString =
+ defaultValueCode == null ? "" : " = $defaultValueCode";
+ return "${name(i + requiredPositionalCount)}$defaultValueString";
+ }).join(", ");
+ String namedWithDefaults = new Iterable.generate(argumentNames.length,
+ (int i) {
+ // TODO(eernst, sigurdm, #8): Recreate the default values faithfully.
+ // TODO(eernst, sigurdm, #8): Until that is done, recognize unhandled
+ // cases, and emit error/warning.
+ String defaultValueCode = constructor.parameters[
+ requiredPositionalCount + i].defaultValueCode;
+ String defaultValueString =
+ defaultValueCode == null ? "" : ": $defaultValueCode";
+ return "${argumentNames[i]}$defaultValueString";
+ }).join(", ");
+
+ String optionalArguments = new Iterable.generate(optionalPositionalCount,
+ (int i) => name(i + requiredPositionalCount)).join(", ");
+ String namedArguments =
+ argumentNames.map((String name) => "$name: $name").join(", ");
+ List<String> parameterParts = new List<String>();
+ List<String> argumentParts = new List<String>();
+ if (requiredPositionalCount != 0) {
+ parameterParts.add(positionals);
+ argumentParts.add(positionals);
+ }
+ if (optionalPositionalCount != 0) {
+ parameterParts.add("[$optionalsWithDefaults]");
+ argumentParts.add(optionalArguments);
+ }
+ if (argumentNames.isNotEmpty) {
+ parameterParts.add("{${namedWithDefaults}}");
+ argumentParts.add(namedArguments);
+ }
+ constructorLines.add('case "${constructor.name}": '
+ 'c = (${parameterParts.join(', ')}) => '
+ 'new ${nameOfDeclaration(constructor)}'
+ '(${argumentParts.join(", ")});');
+ constructorLines.add(' break;');
+ }
+ return """newInstance(String constructorName, List positionalArguments,
+ [Map<Symbol, dynamic> namedArguments]) {
+ Function c;
+ switch (constructorName) {
+ ${constructorLines.join("\n ")}
+ default: throw new NoSuchInvokeCapabilityError(${classElement.name},
+ constructorName, positionalArguments, namedArguments);
+ }
+ return Function.apply(c, positionalArguments, namedArguments);
+ }""";
+ }
+
void computeNames(Namer namer) {
staticClassMirrorName = namer.freshName("Static_${baseName}_ClassMirror");
staticInstanceMirrorName =
@@ -910,6 +984,9 @@ class TransformerImplementation {
implementedMembers
.add("List<Object> metadata = ${classDomain.metadataString};");
}
+ if (!classDomain.classElement.isAbstract) {
+ implementedMembers.add(classDomain.newInstanceString);
+ }
return """
class ${classDomain.staticClassMirrorName} extends ClassMirrorUnimpl {
« no previous file with comments | « reflectable/lib/src/mirrors_unimpl.dart ('k') | test_reflectable/.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698