messageFromMethodInvocation method
Create a MainMessage from node
using the name and
parameters of the last function/method declaration we encountered
and the parameters to the Intl.message call.
Implementation
Message? messageFromMethodInvocation(MethodInvocation node) {
SubMessage? message;
switch (node.methodName.name) {
case "gender":
message = Gender();
break;
case "plural":
message = Plural();
break;
case "select":
message = Select();
break;
default:
throw IntlMessageExtractionException(
"Invalid plural/gender/select message ${node.methodName.name} "
"in $node",
);
}
message.parent = parent;
var arguments = message.argumentsOfInterestFor(node);
arguments.forEach((key, value) {
try {
var interpolation = InterpolationVisitor(message, extraction);
value.accept(interpolation);
// Might be null due to previous errors.
// Continue collecting errors, but don't build message.
if (message != null) {
message![key] = interpolation.pieces;
}
} on IntlMessageExtractionException catch (e) {
message = null;
var err =
StringBuffer()
..writeAll(["Error ", e, "\nProcessing <", node, ">"])
..write(extraction._reportErrorLocation(node));
var errString = err.toString();
extraction.onMessage(errString);
extraction.warnings.add(errString);
}
});
var mainArg = node.argumentList.arguments.firstWhere(
(each) => each is! NamedExpression,
);
if (mainArg is SimpleStringLiteral) {
message?.mainArgument = mainArg.toString();
} else if (mainArg is SimpleIdentifier) {
message?.mainArgument = mainArg.name;
} else {
var err =
StringBuffer()
..write(
"Error (Invalid argument to plural/gender/select, "
"must be simple variable reference) "
"\nProcessing <$node>",
)
..write(extraction._reportErrorLocation(node));
var errString = err.toString();
extraction.onMessage(errString);
extraction.warnings.add(errString);
}
return message;
}