protected override void ImplementFSMMetaData() { Debug.Assert(this.clrTypeInfo.HasElementWildCard); if (this.fsmNameSource != null) { this.fsmNameSource.Reset(); } else { this.fsmNameSource = new StateNameSource(); } FSM fsm = this.clrTypeInfo.CreateFSM(this.fsmNameSource); this.decl.Members.Add(CodeDomHelper.CreateMemberField("validationStates", "FSM", MemberAttributes.Abstract | MemberAttributes.Final | MemberAttributes.Static | MemberAttributes.Assembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Private, false)); CodeMemberMethod getFSM = CodeDomHelper.CreateInterfaceImplMethod("GetValidationStates", "IXMetaData", new CodeTypeReference("FSM")); getFSM.Statements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(null, "validationStates"))); this.decl.Members.Add(getFSM); CodeMemberMethod initFSM = CodeDomHelper.CreateMethod("InitFSM", MemberAttributes.Abstract | MemberAttributes.Final | MemberAttributes.Static | MemberAttributes.Assembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Private, new CodeTypeReference()); FSMCodeDomHelper.CreateFSMStmt(fsm, initFSM.Statements); this.decl.Members.Add(initFSM); this.CreateStaticConstructor(); this.declItemsInfo.staticConstructor.Statements.Add(CodeDomHelper.CreateMethodCall(null, "InitFSM", null)); }
internal static void AddTransitions(FSM fsm, int state, CodeStatementCollection stmts, Set <int> visited) { if (!visited.Contains(state)) { visited.Add(state); Transitions currTrans = null; fsm.Trans.TryGetValue(state, out currTrans); if ((currTrans == null ? false : currTrans.Count != 0)) { FSMCodeDomHelper.CreateAddTransitionStmts(fsm, stmts, state, currTrans, visited); } } }
internal static void CreateFSMStmt(FSM fsm, CodeStatementCollection stmts) { string[] strArrays = new string[] { "System.Int32", "Transitions" }; CodeTypeReference typeRef = CodeDomHelper.CreateGenericTypeReference("Dictionary", strArrays); stmts.Add(new CodeVariableDeclarationStatement(typeRef, "transitions", new CodeObjectCreateExpression(typeRef, new CodeExpression[0]))); Set <int> visited = new Set <int>(); FSMCodeDomHelper.AddTransitions(fsm, fsm.Start, stmts, visited); Set <int> reachableAccept = new Set <int>(); foreach (int state in fsm.Accept) { if (visited.Contains(state)) { reachableAccept.Add(state); } } CodeVariableReferenceExpression codeVariableReferenceExpression = new CodeVariableReferenceExpression("validationStates"); CodeTypeReference codeTypeReference = new CodeTypeReference("FSM"); CodeExpression[] codePrimitiveExpression = new CodeExpression[] { new CodePrimitiveExpression((object)fsm.Start), FSMCodeDomHelper.CreateSetCreateExpression(reachableAccept), new CodeVariableReferenceExpression("transitions") }; stmts.Add(new CodeAssignStatement(codeVariableReferenceExpression, new CodeObjectCreateExpression(codeTypeReference, codePrimitiveExpression))); }
internal static void CreateAddTransitionStmts(FSM fsm, CodeStatementCollection stmts, int state, Transitions currTrans, Set <int> visited) { Set <int> subStates = new Set <int>(); CodeExpression[] initializers = new CodeExpression[currTrans.Count]; int index = 0; if (currTrans.nameTransitions != null) { foreach (KeyValuePair <XName, int> s1Trans in currTrans.nameTransitions) { int num = index; index = num + 1; initializers[num] = FSMCodeDomHelper.CreateSingleTransitionExpr(FSMCodeDomHelper.CreateXNameExpr(s1Trans.Key), s1Trans.Value); subStates.Add(s1Trans.Value); } } if (currTrans.wildCardTransitions != null) { foreach (KeyValuePair <WildCard, int> s1Trans in currTrans.wildCardTransitions) { int num1 = index; index = num1 + 1; initializers[num1] = FSMCodeDomHelper.CreateSingleTransitionExpr(FSMCodeDomHelper.CreateWildCardExpr(s1Trans.Key), s1Trans.Value); subStates.Add(s1Trans.Value); } } CodeVariableReferenceExpression codeVariableReferenceExpression = new CodeVariableReferenceExpression("transitions"); CodeExpression[] codePrimitiveExpression = new CodeExpression[] { new CodePrimitiveExpression((object)state), new CodeObjectCreateExpression("Transitions", initializers) }; stmts.Add(CodeDomHelper.CreateMethodCall(codeVariableReferenceExpression, "Add", codePrimitiveExpression)); foreach (int s in subStates) { FSMCodeDomHelper.AddTransitions(fsm, s, stmts, visited); } }