private static ComplexArgStyleNode BuildPluralStyleNode(MessagePattern pattern, int start, int limit, MessagePatternArgType argType) { ComplexArgStyleNode node = new ComplexArgStyleNode(argType); MessagePatternPart offset = pattern.GetPart(start); if (offset.Type.HasNumericValue()) { node.HasExplicitOffset = true; node.Offset = pattern.GetNumericValue(offset); ++start; } while (start < limit) { MessagePatternPart selector = pattern.GetPart(start++); double value = MessagePattern.NoNumericValue; MessagePatternPart part = pattern.GetPart(start); if (part.Type.HasNumericValue()) { value = pattern.GetNumericValue(part); ++start; } int msgLimit = pattern.GetLimitPartIndex(start); VariantNode variant = new VariantNode(); variant.Selector = pattern.GetSubstring(selector); variant.SelectorValue = value; variant.Message = BuildMessageNode(pattern, start, msgLimit); node.AddVariant(variant); start = msgLimit + 1; } return(node.Freeze()); }
internal ExpectComplexArgNode ExpectComplexArg(Object name, MessagePatternArgType argType) { ExpectComplexArgNode complexArg = new ExpectComplexArgNode(this, name, argType); contents.Add(complexArg); return(complexArg); }
internal ExpectComplexArgNode(ExpectMessageNode parent, Object name, MessagePatternArgType argType) : base(name, argType.ToString().ToLowerInvariant()) { this.argType = argType; this.parent = parent; }
private static ArgNode BuildArgNode(MessagePattern pattern, int start, int limit) { ArgNode node = ArgNode.CreateArgNode(); MessagePatternPart part = pattern.GetPart(start); MessagePatternArgType argType = node.ArgType = part.ArgType; part = pattern.GetPart(++start); // ARG_NAME or ARG_NUMBER node.Name = pattern.GetSubstring(part); if (part.Type == MessagePatternPartType.ArgNumber) { node.Number = part.Value; } ++start; switch (argType) { case MessagePatternArgType.Simple: // ARG_TYPE node.TypeName = pattern.GetSubstring(pattern.GetPart(start++)); if (start < limit) { // ARG_STYLE node.SimpleStyle = pattern.GetSubstring(pattern.GetPart(start)); } break; case MessagePatternArgType.Choice: node.TypeName = "choice"; node.ComplexStyle = BuildChoiceStyleNode(pattern, start, limit); break; case MessagePatternArgType.Plural: node.TypeName = "plural"; node.ComplexStyle = BuildPluralStyleNode(pattern, start, limit, argType); break; case MessagePatternArgType.Select: node.TypeName = "select"; node.ComplexStyle = BuildSelectStyleNode(pattern, start, limit); break; case MessagePatternArgType.SelectOrdinal: node.TypeName = "selectordinal"; node.ComplexStyle = BuildPluralStyleNode(pattern, start, limit, argType); break; default: // NONE type, nothing else to do break; } return(node); }
internal ComplexArgStyleNode(MessagePatternArgType argType) { this.argType = argType; }