public void WriteConditionalEmit(CodeScopeStatement con, InstructionForm overridenForm, bool ignoreOtherOverrides = false)
		{
			if (Conditions.Count == 0)
				throw new Exception("There are no conditions to the override!");
			if (!ignoreOtherOverrides && CanGenSegmentSwitch(overridenForm))
			{
				CodeSwitchStatement sw = new CodeSwitchStatement(
					new CodeFieldReferenceExpression(
						new CodeThisReferenceExpression(),
						overridenForm.GetArgName(FieldTypeRegistry.Segment.ID, 1, Conditions[0].ArgIndexToCheck)
					)
				);
				for (int i = 0; i < overridenForm.Overrides.Count; i++)
				{
					CodeCaseStatement cs = new CodeCaseStatement(
						new CodeFieldReferenceExpression(
							StaticTypeReferences.SegmentExpression,
							overridenForm.Overrides[i].Conditions[0].RegisterToCompareTo
						)
					);
					CodeScopeStatement cst = new CodeScopeStatement();
					overridenForm.Overrides[i].NewForm.WriteEmit(cst, true);
					cst.Statements.Add(new CodeBreakStatement());
					cs.Statements.Add(cst);
					sw.Cases.Add(cs);
				}
				CodeDefaultCaseStatement defStat = new CodeDefaultCaseStatement();
				CodeScopeStatement defCont = new CodeScopeStatement();
				overridenForm.WriteEmit(defCont, true);
				defStat.Statements.Add(defCont);
				if (overridenForm.WriteOperations[0].Type != WriteOperationType.Throw)
				{
					defStat.Statements.Add(new CodeBreakStatement());
				}
				sw.Cases.Add(defStat);
				con.Statements.Add(sw);
			}
			else
			{
				CodeScopeStatement tCont = new CodeScopeStatement();
				CodeScopeStatement fCont = new CodeScopeStatement();
				CodeExpression condition = Conditions[0].GetConditionExpression(this, overridenForm);
				for (int i = 1; i < Conditions.Count; i++)
				{
					condition = new CodeBinaryOperatorExpression(
						condition, 
						CodeBinaryOperatorType.BooleanAnd, 
						Conditions[i].GetConditionExpression(this, overridenForm)
					);
				}
				CodeConditionStatement condStat = new CodeConditionStatement(condition, new CodeStatement[] { tCont });
				NewForm.WriteEmit(tCont, true);
				if (!ignoreOtherOverrides)
				{
					condStat.FalseStatements.Add(fCont);
					if (overridenForm.Overrides.Count > 1)
					{
						// If we've gotten here, we know that we are the override at index 0.
						for (int i = 1; i < overridenForm.Overrides.Count; i++)
						{
							CodeScopeStatement eICont = new CodeScopeStatement();
							overridenForm.Overrides[i].WriteConditionalEmit(eICont, overridenForm, true);
							fCont.Statements.Add(eICont);
							fCont = new CodeScopeStatement();
							((CodeConditionStatement)eICont.Statements[0]).FalseStatements.Add(fCont);
						}
					}
					overridenForm.WriteEmit(fCont, true);
				}
				con.Statements.Add(condStat);
			}
		}
예제 #2
0
		protected override void GenerateConditionStatement(CodeConditionStatement statement)
		{
			TextWriter output = base.Output;
			output.Write("if (");
			base.GenerateExpression(statement.Condition);
			output.Write(")");
			this.OutputStartBrace();
			base.Indent++;
			base.GenerateStatements(statement.TrueStatements);
			base.Indent--;
			CodeStatementCollection falseStatements = statement.FalseStatements;
			bool genned = false;
			if (falseStatements.Count > 0)
			{
				output.Write('}');
				if (base.Options.ElseOnClosing)
				{
					output.Write(' ');
				}
				else
				{
					output.WriteLine();
				}
				output.Write("else ");
				if (falseStatements.Count == 1)
				{
					CodeStatement stat = falseStatements[0];
					CheckSingleCondition:
					if (stat is CodeScopeStatement)
					{
						if (((CodeScopeStatement)stat).Statements.Count == 1)
						{
							stat = ((CodeScopeStatement)stat).Statements[0];
							goto CheckSingleCondition;
						}
					}
					if (stat is CodeConditionStatement)
					{
						genned = true;
						GenerateStatement(stat);
					}
				}
				if (!genned)
				{
					this.OutputStartBrace();
					base.Indent++;
					base.GenerateStatements(falseStatements);
					base.Indent--;
				}
			}
			if (!genned)
			{
				output.WriteLine('}');
			}
		}
예제 #3
0
		public void WriteToString(CodeScopeStatement con)
		{
			if (Arg1.ArgType == InstructionArgType.None)
			{
				con.Statements.Add(
					new CodeMethodReturnStatement(
						new CodePrimitiveExpression(Mnemonic)
					)
				);
			}
			else if (Arg2.ArgType == InstructionArgType.None)
			{
				if (ExcludeCondition != null)
				{
					CodeConditionStatement f = new CodeConditionStatement(ExcludeCondition.GetConditionExpression(this));
					f.TrueStatements.Add(
						new CodeMethodReturnStatement(
							new CodeBinaryOperatorExpression(
								new CodePrimitiveExpression(Mnemonic + " "),
								CodeBinaryOperatorType.StringConcat,
								Arg1.ArgType.GetToStringForArg(this, 0)
							)
						)
					);
					f.FalseStatements.Add(
						new CodeMethodReturnStatement(
							new CodePrimitiveExpression(Mnemonic)
						)
					);
					con.Statements.Add(f);
				}
				else
				{
					
					con.Statements.Add(
						new CodeMethodReturnStatement(
							new CodeBinaryOperatorExpression(
								new CodePrimitiveExpression(Mnemonic + " "),
								CodeBinaryOperatorType.StringConcat,
								Arg1.ArgType.GetToStringForArg(this, 0)
							)
						)
					);
				}
			}
			else if (Arg3.ArgType == InstructionArgType.None)
			{
				con.Statements.Add(
					new CodeMethodReturnStatement(
						new CodeBinaryOperatorExpression(
							new CodePrimitiveExpression(Mnemonic + " "),
							CodeBinaryOperatorType.StringConcat,
							new CodeBinaryOperatorExpression(
								Arg1.ArgType.GetToStringForArg(this, 0),
								CodeBinaryOperatorType.StringConcat,
								new CodeBinaryOperatorExpression(
									new CodePrimitiveExpression(", "),
									CodeBinaryOperatorType.StringConcat,
									Arg2.ArgType.GetToStringForArg(this, 1)
								)
							)
						)
					)
				);
			}
			else
			{
				con.Statements.Add(
					new CodeMethodReturnStatement(
						new CodeBinaryOperatorExpression(
							new CodePrimitiveExpression(Mnemonic + " "),
							CodeBinaryOperatorType.StringConcat,
							new CodeBinaryOperatorExpression(
								Arg1.ArgType.GetToStringForArg(this, 0),
								CodeBinaryOperatorType.StringConcat,
								new CodeBinaryOperatorExpression(
									new CodeBinaryOperatorExpression(
										new CodePrimitiveExpression(", "),
										CodeBinaryOperatorType.StringConcat,
										Arg2.ArgType.GetToStringForArg(this, 1)
									),
									CodeBinaryOperatorType.StringConcat,
									new CodeBinaryOperatorExpression(
										new CodePrimitiveExpression(", "),
										CodeBinaryOperatorType.StringConcat,
										Arg3.ArgType.GetToStringForArg(this, 2)
									)
								)
							)
						)
					)
				);
			}
		}