private static void BuildXpidlMethodParamModifiers(XpidlModifiers<XpidlParamModifier> paramModifiers, ComplexSyntaxNode paramModifiersSyntaxNode)
		{
			switch ((RuleConstants) paramModifiersSyntaxNode.Rule.Index)
			{
				case RuleConstants.XpidlMethodParamModifiersDecl:
				case RuleConstants.XpidlMethodParamModifiersList1:
				case RuleConstants.XpidlMethodParamModifiersList2:
					foreach (SyntaxNode syntaxNode in paramModifiersSyntaxNode)
					{
						if (syntaxNode is ComplexSyntaxNode)
						{
							BuildXpidlMethodParamModifiers(paramModifiers, (ComplexSyntaxNode)syntaxNode);
						}
					}
					break;

				case RuleConstants.XpidlParamModifierArray:
					paramModifiers.Add(XpidlParamModifier.Array);
					break;

				case RuleConstants.XpidlParamModifierSizeIs:
					var paramNameSyntaxNode = (ComplexSyntaxNode) paramModifiersSyntaxNode[2];
					paramModifiers.Add(XpidlParamModifier.SizeIs, ((SimpleSyntaxNode) paramNameSyntaxNode[0]).Text);
					break;

				case RuleConstants.XpidlParamModifierIidIs:
					paramNameSyntaxNode = (ComplexSyntaxNode) paramModifiersSyntaxNode[2];
					paramModifiers.Add(XpidlParamModifier.IidIs, ((SimpleSyntaxNode) paramNameSyntaxNode[0]).Text);
					break;

				case RuleConstants.XpidlParamModifierRetVal:
					paramModifiers.Add(XpidlParamModifier.RetVal);
					break;

				case RuleConstants.XpidlParamModifierConst:
					paramModifiers.Add(XpidlParamModifier.Const);
					break;

				case RuleConstants.XpidlParamModifierShared:
					paramModifiers.Add(XpidlParamModifier.Shared);
					break;

				case RuleConstants.XpidlParamModifierOptional:
					paramModifiers.Add(XpidlParamModifier.Optional);
					break;

				default:
					throw new ArgumentException(mc_InvalidSyntaxNode, "paramModifiersSyntaxNode");
			}
		}
		private static void BuildXpidlInterfaceModifiers(XpidlModifiers<XpidlInterfaceModifier> interfaceModifiers, ComplexSyntaxNode interfaceModifiersSyntaxNode)
		{
			switch ((RuleConstants) interfaceModifiersSyntaxNode.Rule.Index)
			{
				case RuleConstants.XpidlInterfaceModifiersDecl1:
				case RuleConstants.XpidlInterfaceModifiersDecl2:
				case RuleConstants.XpidlInterfaceModifiersList1:
				case RuleConstants.XpidlInterfaceModifiersList2:
					foreach (SyntaxNode syntaxNode in interfaceModifiersSyntaxNode)
					{
						if (syntaxNode is ComplexSyntaxNode)
						{
							BuildXpidlInterfaceModifiers(interfaceModifiers, (ComplexSyntaxNode) syntaxNode);
						}
					}
					break;
				case RuleConstants.XpidlInterfaceModifierScriptable:
					interfaceModifiers.Add(XpidlInterfaceModifier.Scriptable);
					break;
				case RuleConstants.XpidlInterfaceModifierFunction:
					interfaceModifiers.Add(XpidlInterfaceModifier.Function);
					break;
				case RuleConstants.XpidlInterfaceModifierObject:
					interfaceModifiers.Add(XpidlInterfaceModifier.Object);
					break;
				case RuleConstants.XpidlInterfaceModifierNotXpcom:
					interfaceModifiers.Add(XpidlInterfaceModifier.NotXpcom);
					break;
				case RuleConstants.XpidlInterfaceModifierNoScript:
					interfaceModifiers.Add(XpidlInterfaceModifier.NoScript);
					break;
				case RuleConstants.XpidlInterfaceUuid:
					break;
				default:
					throw new ArgumentException(mc_InvalidSyntaxNode, "interfaceModifiersSyntaxNode");
			}
		}
		private static void BuildXpidlMethodModifiers(XpidlModifiers<XpidlMethodModifier> methodModifiers, ComplexSyntaxNode methodModifiersSyntaxNode)
		{
			switch ((RuleConstants) methodModifiersSyntaxNode.Rule.Index)
			{
				case RuleConstants.XpidlMethodModifiersDecl:
				case RuleConstants.XpidlMethodModifiersList1:
				case RuleConstants.XpidlMethodModifiersList2:
					foreach (SyntaxNode syntaxNode in methodModifiersSyntaxNode)
					{
						if (syntaxNode is ComplexSyntaxNode)
						{
							BuildXpidlMethodModifiers(methodModifiers, (ComplexSyntaxNode) syntaxNode);
						}
					}
					break;
				case RuleConstants.XpidlMethodModifier1:
					methodModifiers.Add(XpidlMethodModifier.NoScript);
					break;
				case RuleConstants.XpidlMethodModifier2:
					methodModifiers.Add(XpidlMethodModifier.NotXpcom);
					break;
				case RuleConstants.XpidlMethodModifier3:
					var simpleSyntaxNode = (SimpleSyntaxNode) methodModifiersSyntaxNode[2];
					methodModifiers.Add(XpidlMethodModifier.BinaryName, simpleSyntaxNode.Text);
					break;
				default:
					throw new ArgumentException(mc_InvalidSyntaxNode, "methodModifiersSyntaxNode");
			}
		}
		private static void BuildXpidlNativeTypeModifiers(XpidlModifiers<XpidlNativeTypeModifier> nativeTypeModifiers, ComplexSyntaxNode nativeTypeModifiersSyntaxNode)
		{
			switch ((RuleConstants) nativeTypeModifiersSyntaxNode.Rule.Index)
			{
				case RuleConstants.XpidlNativeTypeModifiersDecl:
				case RuleConstants.XpidlNativeTypeModifiersList1:
				case RuleConstants.XpidlNativeTypeModifiersList2:
					foreach (SyntaxNode syntaxNode in nativeTypeModifiersSyntaxNode)
					{
						if (syntaxNode is ComplexSyntaxNode)
						{
							BuildXpidlNativeTypeModifiers(nativeTypeModifiers, (ComplexSyntaxNode) syntaxNode);
						}
					}
					break;
				case RuleConstants.XpidlNativeTypeModifierRef:
					nativeTypeModifiers.Add(XpidlNativeTypeModifier.Ref);
					break;
				case RuleConstants.XpidlNativeTypeModifierPtr:
					nativeTypeModifiers.Add(XpidlNativeTypeModifier.Ptr);
					break;
				case RuleConstants.XpidlNativeTypeModifierNsId:
					nativeTypeModifiers.Add(XpidlNativeTypeModifier.NsId);
					break;
				case RuleConstants.XpidlNativeTypeModifierDomString:
					nativeTypeModifiers.Add(XpidlNativeTypeModifier.DomString);
					break;
				case RuleConstants.XpidlNativeTypeModifierUtf8String:
					nativeTypeModifiers.Add(XpidlNativeTypeModifier.Utf8String);
					break;
				case RuleConstants.XpidlNativeTypeModifierCString:
					nativeTypeModifiers.Add(XpidlNativeTypeModifier.CString);
					break;
				case RuleConstants.XpidlNativeTypeModifierAString:
					nativeTypeModifiers.Add(XpidlNativeTypeModifier.AString);
					break;
				default:
					throw new ArgumentException(mc_InvalidSyntaxNode, "nativeTypeModifiersSyntaxNode");
			}
		}