//------------------------------------------------------------ // CParser.ParseObjectInitializer // /// <summary></summary> /// <param name="newNode"></param> //------------------------------------------------------------ internal void ParseObjectInitializer(NEWNODE newNode) { DebugUtil.Assert(CurrentTokenID() == TOKENID.OPENCURLY); NextToken(); DECLSTMTNODE stmtNode = AllocNode(NODEKIND.DECLSTMT, newNode) as DECLSTMTNODE; CListMaker list = new CListMaker(this); int comma = -1; while ( CurrentTokenID() != TOKENID.CLOSECURLY && CurrentTokenID() != TOKENID.ENDFILE) { if (CurrentTokenID() == TOKENID.IDENTIFIER && PeekToken(1) == TOKENID.EQUAL) { list.Add( ParseVariableDeclarator( stmtNode, stmtNode, (uint)PARSEDECLFLAGS.LOCAL, false, // isFirst, -1), comma); } else { Error(CSCERRID.ERR_InvalidInitializerDeclarator); TOKENID tid = CurrentTokenID(); while ( tid != TOKENID.COMMA && tid != TOKENID.CLOSECURLY && tid != TOKENID.ENDFILE) { NextToken(); tid = CurrentTokenID(); } } if (CurrentTokenID() != TOKENID.COMMA) { break; } comma = CurrentTokenIndex(); NextToken(); } Eat(TOKENID.CLOSECURLY); stmtNode.VariablesNode = list.GetList(stmtNode); newNode.InitialNode = stmtNode; newNode.Flags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; if (newNode.ParentNode != null && newNode.ParentNode.Kind == NODEKIND.VARDECL) { VARDECLNODE vdNode = newNode.ParentNode as VARDECLNODE; if (vdNode != null) { newNode.Flags |= NODEFLAGS.NEW_IN_VARDECL; vdNode.NewFlags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; } } else if (newNode.ParentNode != null && newNode.ParentNode.Kind == NODEKIND.BINOP && newNode.Operator == OPERATOR.ASSIGN) { VARDECLNODE vdNode = newNode.ParentNode.ParentNode as VARDECLNODE; if (vdNode != null) { newNode.Flags |= NODEFLAGS.NEW_IN_VARDECL; vdNode.NewFlags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; } } BASENODE node = newNode.ParentNode; while (node != null && !node.IsStatement) { node = node.ParentNode; } if (node != null) { (node as STATEMENTNODE).NewFlags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; } }
//------------------------------------------------------------ // CParser.ParseCollectionInitializer // /// <summary></summary> /// <param name="newNode"></param> //------------------------------------------------------------ internal void ParseCollectionInitializer(NEWNODE newNode) { DebugUtil.Assert(CurrentTokenID() == TOKENID.OPENCURLY); NextToken(); UNOPNODE initNode = AllocNode(NODEKIND.COLLECTIONINIT, newNode).AsCOLLECTIONINIT; CListMaker list = new CListMaker(this); int comma = -1; while (CurrentTokenID() != TOKENID.CLOSECURLY) { BASENODE nd = ParseVariableInitializer(initNode, false, -1); if (nd.Kind == NODEKIND.BINOP && nd.Operator == OPERATOR.ASSIGN) { Error(CSCERRID.ERR_InvalidInitializerDeclarator); } else { list.Add(nd, comma); } if (CurrentTokenID() != TOKENID.COMMA) { break; } comma = CurrentTokenIndex(); NextToken(); } Eat(TOKENID.CLOSECURLY); initNode.Operand = list.GetList(initNode); if (initNode.Operand == null) { newNode.InitialNode = null; return; } newNode.InitialNode = initNode; newNode.Flags |= NODEFLAGS.NEW_HAS_COLLECTION_INITIALIZER; if (newNode.ParentNode != null && newNode.ParentNode.Kind == NODEKIND.VARDECL) { VARDECLNODE vdNode = newNode.ParentNode as VARDECLNODE; if (vdNode != null) { newNode.Flags |= NODEFLAGS.NEW_IN_VARDECL; vdNode.NewFlags |= NODEFLAGS.NEW_HAS_COLLECTION_INITIALIZER; } } else if (newNode.ParentNode != null && newNode.ParentNode.Kind == NODEKIND.BINOP && newNode.Operator == OPERATOR.ASSIGN) { VARDECLNODE vdNode = newNode.ParentNode.ParentNode as VARDECLNODE; if (vdNode != null) { newNode.Flags |= NODEFLAGS.NEW_IN_VARDECL; vdNode.NewFlags |= NODEFLAGS.NEW_HAS_COLLECTION_INITIALIZER; } } BASENODE node = newNode.ParentNode; while (node != null && !node.IsStatement) { node = node.ParentNode; } if (node != null) { (node as STATEMENTNODE).NewFlags |= NODEFLAGS.NEW_HAS_COLLECTION_INITIALIZER; } }