private void Parse_SubDeclaration(int class_id, ModifierList ml, ModifierList owner_ml, ClassKind ck) { int num; this.Match("Sub"); this.PushExitKind(ExitKind.Sub); int num2 = 1; this.valid_this_context = true; if (base.IsCurrText("New")) { IntegerList list; bool flag = ml.HasModifier(Modifier.Static); base.CheckModifiers(ml, this.constructor_modifiers); if (flag && this.HasAccessModifier(ml)) { base.RaiseErrorEx(false, "CS0515. '{0}' : access modifiers are not allowed on static constructors.", new object[] { base.GetName(class_id) }); } num = base.NewVar(); this.Call_SCANNER(); this.BeginMethod(num, MemberKind.Constructor, ml, 1); if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { if (flag) { base.RaiseErrorEx(false, "CS0132. '{0}' : a static constructor must be parameterless.", new object[] { base.GetName(class_id) }); } this.Parse_ParameterList(num, false); } this.Match(')'); } this.InitMethod(num); if (flag) { list = this.static_variable_initializers; } else { list = this.variable_initializers; } for (int i = 0; i < list.Count; i++) { int num4 = list[i]; this.Gen(base.code.OP_BEGIN_CALL, num4, 0, 0); this.Gen(base.code.OP_PUSH, base.CurrThisID, 0, 0); this.Gen(base.code.OP_CALL, num4, 0, 0); } base.DECLARE_SWITCH = false; this.MatchLineTerminator(); this.Parse_Block(); this.EndMethod(num); this.valid_this_context = false; if (flag) { this.static_variable_initializers.Clear(); } else { this.has_constructor = true; } base.DECLARE_SWITCH = true; this.Match("End"); this.Match("Sub"); this.PopExitKind(); this.MatchLineTerminator(); } else { num = this.Parse_Ident(); this.CheckMethodModifiers(num, class_id, ml, owner_ml); this.BeginMethod(num, MemberKind.Method, ml, num2); if (this.explicit_intf_id > 0) { this.Gen(base.code.OP_ADD_EXPLICIT_INTERFACE, num, this.explicit_intf_id, 0); } if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(num, false); } this.Match(')'); } if (ml.HasModifier(Modifier.Extern)) { base.RaiseErrorEx(false, "CS0179. '{0}' cannot be extern and declare a body.", new object[] { base.GetName(num) }); } if (ck != ClassKind.Interface) { this.InitMethod(num); if (ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(num); base.RaiseErrorEx(false, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { name }); } if (base.GetName(num) == "Main") { this.Gen(base.code.OP_CHECKED, base.TRUE_id, 0, 0); } if (base.IsCurrText("Handles")) { this.Parse_HandlesClause(); } else if (base.IsCurrText("Implements")) { this.Parse_ImplementsClause(num); } base.DECLARE_SWITCH = false; this.MatchLineTerminator(); this.Parse_Block(); if (base.GetName(num) == "Main") { this.Gen(base.code.OP_RESTORE_CHECKED_STATE, 0, 0, 0); } this.Match("End"); this.Match("Sub"); } this.EndMethod(num); this.valid_this_context = false; base.DECLARE_SWITCH = true; this.PopExitKind(); this.MatchLineTerminator(); } }
private void Parse_VariableDeclarator(ModifierList ml) { ArrayList list = new ArrayList(); ArrayList sl = new ArrayList(); IntegerList list3 = this.Parse_VariableIdentifiers(list, sl); int objectClassId = base.ObjectClassId; if (base.IsCurrText("As")) { this.Match("As"); bool flag = base.curr_token.id == base.DATETIME_CLASS_id; if (base.IsCurrText("New") || flag) { if (base.IsCurrText("New")) { this.Match("New"); flag = base.curr_token.id == base.DATETIME_CLASS_id; objectClassId = this.Parse_Type(); } else { objectClassId = this.Parse_TypeEx(); } if (list3.Count == 1) { string str = (string) sl[0]; if ((str != null) && (str != "")) { base.RaiseError(true, "VB00003. Arrays cannot be declared with 'New'"); } int num2 = list3[0]; this.Gen(base.code.OP_ASSIGN_TYPE, num2, objectClassId, 0); base.BeginField(num2, ml, objectClassId); base.DECLARE_SWITCH = false; int num3 = base.NewVar(); this.BeginMethod(num3, MemberKind.Method, ml, 1); this.InitMethod(num3); int id = num2; if (!ml.HasModifier(Modifier.Static)) { id = base.NewVar(); base.SetName(id, base.GetName(num2)); this.Gen(base.code.OP_EVAL, 0, 0, id); this.variable_initializers.Add(num3); } else { this.static_variable_initializers.Add(num3); } this.Gen(base.code.OP_CREATE_OBJECT, objectClassId, 0, id); if (base.IsCurrText('(')) { this.Match('('); this.Gen(base.code.OP_CALL, objectClassId, this.Parse_ArgumentList(')', objectClassId, id), 0); this.Match(')'); } else { this.Gen(base.code.OP_BEGIN_CALL, objectClassId, 0, 0); if (flag) { this.Gen(base.code.OP_PUSH, base.NewConst(0), 0, objectClassId); } this.Gen(base.code.OP_PUSH, id, 0, 0); this.Gen(base.code.OP_CALL, objectClassId, 0, 0); } this.EndMethod(num3); base.DECLARE_SWITCH = true; base.EndField(num2); } else { base.RaiseError(true, "VB00002. Explicit initialization is not permitted with multiple variables declared with a single type specifier."); } return; } objectClassId = this.Parse_TypeEx(); } else if (this.OPTION_STRICT) { base.RaiseError(false, "VB00006. Option Strict On requires all variable declarations to have an 'As' clause."); } for (int i = 0; i < list3.Count; i++) { int num6 = list3[i]; if (((string) sl[i]) != "") { base.BeginField(num6, ml, objectClassId); int num7 = base.NewVar(); this.BeginMethod(num7, MemberKind.Method, ml, 1); this.InitMethod(num7); int num8 = num6; if (!ml.HasModifier(Modifier.Static)) { num8 = base.NewVar(); base.SetName(num8, base.GetName(num6)); this.Gen(base.code.OP_EVAL, 0, 0, num8); this.variable_initializers.Add(num7); } else { this.static_variable_initializers.Add(num7); } string str2 = (string) sl[i]; int num9 = objectClassId; int num10 = base.NewVar(); base.SetName(num10, base.GetName(num9) + str2); this.Gen(base.code.OP_EVAL_TYPE, num9, 0, num10); this.Gen(base.code.OP_ASSIGN_TYPE, num8, num10, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num6, num10, 0); IntegerList list4 = (IntegerList) list[i]; this.Gen(base.code.OP_CREATE_OBJECT, num10, 0, num8); int count = list4.Count; if (count > 0) { this.Gen(base.code.OP_BEGIN_CALL, num10, 0, 0); for (int j = 0; j < count; j++) { this.Gen(base.code.OP_INC, list4[j], 0, list4[j]); this.Gen(base.code.OP_PUSH, list4[j], 0, num10); } this.Gen(base.code.OP_PUSH, num8, 0, 0); this.Gen(base.code.OP_CALL, num10, count, 0); } objectClassId = num10; this.EndMethod(num7); base.EndField(num6); } else { this.Gen(base.code.OP_ASSIGN_TYPE, num6, objectClassId, 0); base.BeginField(num6, ml, objectClassId); base.EndField(num6); } } if (base.IsCurrText("=")) { this.Match('='); if (list3.Count == 1) { int num13 = list3[0]; this.Gen(base.code.OP_ASSIGN_TYPE, num13, objectClassId, 0); this.Parse_VariableInitializer(num13, objectClassId, ml); } else { base.RaiseError(true, "VB00002. Explicit initialization is not permitted with multiple variables declared with a single type specifier."); } } }
private bool HasAccessModifier(ModifierList ml) { return ml.HasModifier(Modifier.Public); }
public virtual int BeginMethod(int sub_id, MemberKind k, ModifierList ml, int res_type_id) { int level = this.symbol_table[sub_id].Level; this.symbol_table[sub_id].Kind = k; this.NewLabel(); this.level_stack.Push(sub_id); int num2 = this.NewVar(); this.Gen(this.code.OP_ASSIGN_TYPE, num2, res_type_id, 0); this.Gen(this.code.OP_ASSIGN_TYPE, sub_id, res_type_id, 0); int num3 = this.NewVar(); if (!ml.HasModifier(Modifier.Static)) { this.symbol_table[num3].TypeId = level; this.symbol_table[num3].Name = "this"; } this.Gen(this.code.OP_CREATE_METHOD, sub_id, level, 0); for (int i = 0; i < ml.Count; i++) { this.Gen(this.code.OP_ADD_MODIFIER, sub_id, (int) ml[i], 0); } this.Gen(this.code.OP_ASSIGN_TYPE, sub_id, res_type_id, 0); this.BeginBlock(); return sub_id; }
private void Parse_MemberDeclaration(int class_id, ClassKind ck, ModifierList owner_ml) { int num27; int num28; string name = base.GetName(class_id); base.DECLARE_SWITCH = true; if (base.IsCurrText('[')) { this.Parse_Attributes(); } ModifierList ml = this.Parse_Modifiers(); bool flag = ml.HasModifier(Modifier.Static); int k = base.ReadToken(); string text = base.curr_token.Text; k += base.ReadToken(); string str3 = base.curr_token.Text; base.Backup_SCANNER(k); if ((((base.IsCurrText("enum") | base.IsCurrText("class")) | base.IsCurrText("struct")) | base.IsCurrText("interface")) | base.IsCurrText("delegate")) { this.Parse_TypeDeclaration(ml); } else if (!base.IsCurrText("const")) { ModifierList list2; if (!base.IsCurrText("event")) { if (base.IsCurrText("implicit")) { base.CheckModifiers(ml, this.operator_modifiers); this.Match("implicit"); this.Match("operator"); if (!ml.HasModifier(Modifier.Public) || !ml.HasModifier(Modifier.Static)) { base.RaiseErrorEx(false, "CS0558. User-defined operator 'operator' must be declared static and public.", new object[] { "op_Implicit" }); } int num11 = this.Parse_Type(); int num12 = base.NewVar(); base.SetName(num12, "op_Implicit"); this.BeginMethod(num12, MemberKind.Method, ml, num11); this.Match('('); if (this.Parse_FormalParameterList(num12, false) != 1) { base.RaiseErrorEx(false, "CS1535. Overloaded unary operator '{0}' only takes one parameter.", new object[] { "implicit" }); } this.Match(')'); if (base.IsCurrText(';')) { this.Match(';'); } else { this.InitMethod(num12); this.Parse_MethodBlock(); } this.EndMethod(num12); goto Label_1519; } if (base.IsCurrText("explicit")) { base.CheckModifiers(ml, this.operator_modifiers); this.Match("explicit"); this.Match("operator"); if (!ml.HasModifier(Modifier.Public) || !ml.HasModifier(Modifier.Static)) { base.RaiseErrorEx(false, "CS0558. User-defined operator 'operator' must be declared static and public.", new object[] { "op_Explicit" }); } int num14 = this.Parse_Type(); int num15 = base.NewVar(); base.SetName(num15, "op_Explicit"); this.BeginMethod(num15, MemberKind.Method, ml, num14); this.Match('('); if (this.Parse_FormalParameterList(num15, false) != 1) { base.RaiseErrorEx(false, "CS1535. Overloaded unary operator '{0}' only takes one parameter.", new object[] { "explicit" }); } this.Match(')'); string str6 = base.GetName(num14); string str7 = base.GetName(this.param_type_ids[0]); if ((str6 == name) && (str7 == name)) { base.RaiseError(false, "CS0556. User-defined conversion must convert to or from the enclosing type."); } if ((str6 != name) && (str7 != name)) { base.RaiseError(false, "CS0556. User-defined conversion must convert to or from the enclosing type."); } if (base.IsCurrText(';')) { this.Match(';'); } else { this.InitMethod(num15); this.Parse_MethodBlock(); } this.EndMethod(num15); goto Label_1519; } if (base.IsCurrText("~")) { if (ck == ClassKind.Struct) { base.RaiseError(false, "CS0575. Only class types can contain destructors."); } base.CheckModifiers(ml, this.destructor_modifiers); this.Match("~"); int num17 = this.Parse_Ident(); if (base.GetName(class_id) != base.GetName(num17)) { base.RaiseError(false, "CS0574. Name of destructor must match name of class."); } this.BeginMethod(num17, MemberKind.Method, ml, 1); this.Match('('); if (!base.IsCurrText(')')) { this.Parse_FormalParameterList(num17, false); } this.Match(')'); if (base.IsCurrText(';')) { this.Match(';'); } else { this.InitMethod(num17); this.Parse_MethodBlock(); } this.EndMethod(num17); goto Label_1519; } if ((base.GetName(class_id) == base.curr_token.Text) && (text == "(")) { IntegerList list3; base.CheckModifiers(ml, this.constructor_modifiers); if (flag && this.HasAccessModifier(ml)) { base.RaiseErrorEx(false, "CS0515. '{0}' : access modifiers are not allowed on static constructors.", new object[] { base.GetName(class_id) }); } int num18 = this.Parse_Ident(); this.valid_this_context = true; this.BeginMethod(num18, MemberKind.Constructor, ml, 1); this.Match('('); if (!base.IsCurrText(')')) { if (flag) { base.RaiseErrorEx(false, "CS0132. '{0}' : a static constructor must be parameterless.", new object[] { base.GetName(class_id) }); } this.Parse_FormalParameterList(num18, false); } else if (ck == ClassKind.Struct) { base.RaiseError(false, "CS0568. Structs cannot contain explicit parameterless constructors."); } this.Match(')'); this.InitMethod(num18); if (flag) { list3 = this.static_variable_initializers; } else { list3 = this.variable_initializers; } for (int i = 0; i < list3.Count; i++) { int num20 = list3[i]; this.Gen(base.code.OP_BEGIN_CALL, num20, 0, 0); this.Gen(base.code.OP_PUSH, base.CurrThisID, 0, 0); this.Gen(base.code.OP_CALL, num20, 0, 0); } if (base.IsCurrText(':')) { this.Match(':'); if (flag) { base.RaiseErrorEx(false, "CS0514. '{0}' : static constructor cannot have an explicit this or base constructor call.", new object[] { base.GetName(class_id) }); } if (base.IsCurrText("base")) { if (ck == ClassKind.Struct) { base.RaiseErrorEx(false, "CS0522. '{0}' : structs cannot call base class constructors.", new object[] { base.GetName(class_id) }); } this.Match("base"); int num21 = base.NewVar(); int num22 = base.NewVar(); this.Gen(base.code.OP_EVAL_BASE_TYPE, class_id, 0, num22); this.Gen(base.code.OP_ASSIGN_NAME, num21, num22, num21); int num23 = base.NewVar(); this.Gen(base.code.OP_CAST, num22, base.CurrThisID, num23); this.Gen(base.code.OP_CREATE_REFERENCE, num23, 0, num21); base.DECLARE_SWITCH = false; this.Match('('); this.Gen(base.code.OP_CALL_BASE, num21, this.Parse_ArgumentList(")", num21, num23), 0); base.DECLARE_SWITCH = true; this.Match(')'); } else if (base.IsCurrText("this")) { this.Match("this"); base.DECLARE_SWITCH = false; this.Match('('); this.Gen(base.code.OP_CALL, num18, this.Parse_ArgumentList(")", num18, base.CurrThisID), 0); base.DECLARE_SWITCH = true; this.Match(')'); } else { base.RaiseError(true, "CS1018. Keyword this or base expected."); } } else if (!flag) { int num24 = base.NewVar(); int num25 = base.NewVar(); this.Gen(base.code.OP_EVAL_BASE_TYPE, class_id, 0, num25); this.Gen(base.code.OP_ASSIGN_NAME, num24, num25, num24); int num26 = base.NewVar(); this.Gen(base.code.OP_CAST, num25, base.CurrThisID, num26); this.Gen(base.code.OP_CREATE_REFERENCE, num26, 0, num24); this.Gen(base.code.OP_BEGIN_CALL, num24, 0, 0); this.Gen(base.code.OP_PUSH, num26, 0, 0); this.Gen(base.code.OP_CALL, num24, 0, 0); } if (base.IsCurrText(';')) { this.Match(';'); } else { this.Parse_Block(); } this.EndMethod(num18); this.valid_this_context = false; if (flag) { this.static_variable_initializers.Clear(); } else { this.has_constructor = true; } goto Label_1519; } num27 = this.Parse_Type(); num28 = 0; if (!(str3 == ".")) { goto Label_0CD9; } if (ml.HasModifier(Modifier.Public)) { base.RaiseErrorEx(false, "CS0106. The modifier '{0}' is not valid for this item.", new object[] { "public" }); } ml.Add(Modifier.Public); num28 = this.Parse_Ident(); this.Gen(base.code.OP_EVAL_TYPE, 0, 0, num28); while (true) { base.REF_SWITCH = true; if (!base.CondMatch('.')) { goto Label_0CD2; } int num29 = base.ReadToken(); string str8 = base.curr_token.Text; base.Backup_SCANNER(num29); if (str8 != ".") { goto Label_0CD2; } int num30 = num28; num28 = this.Parse_Ident(); this.Gen(base.code.OP_CREATE_TYPE_REFERENCE, num30, 0, num28); } } this.Match("event"); base.CheckModifiers(ml, this.method_modifiers); int num4 = this.Parse_Type(); int id = this.Parse_Ident(); if (ml.HasModifier(Modifier.Abstract) && !owner_ml.HasModifier(Modifier.Abstract)) { string str4 = base.GetName(id); base.RaiseErrorEx(false, "CS0513. '{0}' is abstract but it is contained in nonabstract class '{1}'", new object[] { str4, name }); } if (base.IsCurrText('{')) { base.BeginEvent(id, ml, num4, 0); this.Gen(base.code.OP_ADD_MODIFIER, id, 1, 0); this.param_ids.Clear(); this.param_type_ids.Clear(); this.param_mods.Clear(); this.Parse_EventAccessorDeclarations(id, num4, ml); base.EndEvent(id); goto Label_1519; } Label_0249: list2 = ml.Clone(); list2.Delete(Modifier.Public); base.BeginField(id, list2, num4); string str5 = base.GetName(id); base.SetName(id, "__" + str5); if (base.IsCurrText('=')) { this.Parse_InstanceVariableInitializer(id, num4, ml); } base.EndField(id); int num10 = base.NewVar(); base.SetName(num10, str5); base.BeginEvent(num10, ml, num4, 0); this.Gen(base.code.OP_ADD_EVENT_FIELD, num10, id, 0); int num6 = base.NewVar(); base.SetName(num6, "add_" + str5); this.BeginMethod(num6, MemberKind.Method, list2, 1); int num7 = base.NewVar(); base.SetName(num7, "value"); this.Gen(base.code.OP_ADD_PARAM, num6, num7, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num7, num4, 0); this.InitMethod(num6); int num8 = base.NewVar(); base.SetName(num8, base.GetName(id)); int res = base.NewVar(); this.Gen(base.code.OP_EVAL, 0, 0, num8); this.Gen(base.code.OP_PLUS, num8, num7, res); this.Gen(base.code.OP_ASSIGN, num8, res, num8); this.EndMethod(num6); this.Gen(base.code.OP_ADD_ADD_ACCESSOR, num10, num6, 0); num6 = base.NewVar(); base.SetName(num6, "remove_" + str5); this.BeginMethod(num6, MemberKind.Method, list2, 1); num7 = base.NewVar(); base.SetName(num7, "value"); this.Gen(base.code.OP_ADD_PARAM, num6, num7, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num7, num4, 0); this.InitMethod(num6); num8 = base.NewVar(); base.SetName(num8, base.GetName(id)); res = base.NewVar(); this.Gen(base.code.OP_EVAL, 0, 0, num8); this.Gen(base.code.OP_MINUS, num8, num7, res); this.Gen(base.code.OP_ASSIGN, num8, res, num8); this.EndMethod(num6); this.Gen(base.code.OP_ADD_REMOVE_ACCESSOR, num10, num6, 0); base.EndEvent(num10); if (base.IsCurrText(',')) { this.Call_SCANNER(); id = this.Parse_Ident(); goto Label_0249; } this.Match(';'); } else { this.Match("const"); base.CheckModifiers(ml, this.constant_modifiers); ml.Add(Modifier.Static); int num2 = this.Parse_Type(); do { int num3 = this.Parse_Ident(); if (flag) { base.RaiseErrorEx(false, "CS0504. The constant '{0}' cannot be marked static.", new object[] { base.GetName(num3) }); } if (!base.IsCurrText('=')) { base.RaiseError(true, "CS0145. A const field requires a value to be provided."); } base.BeginField(num3, ml, num2); base.DECLARE_SWITCH = false; this.Parse_InstanceVariableInitializer(num3, num2, ml); base.EndField(num3); base.DECLARE_SWITCH = true; } while (base.CondMatch(',')); this.Match(';'); } goto Label_1519; Label_0CD2: base.REF_SWITCH = false; Label_0CD9: if (base.IsCurrText("this")) { base.CheckModifiers(ml, this.method_modifiers); this.Match("this"); int num31 = base.NewVar(); base.SetName(num31, "Item"); if (num27 == 1) { base.RaiseError(false, "CS0620. Indexers can't have void type."); } if (ml.HasModifier(Modifier.Abstract) && !owner_ml.HasModifier(Modifier.Abstract)) { string str9 = base.GetName(num31); base.RaiseErrorEx(false, "CS0513. '{0}' is abstract but it is contained in nonabstract class '{1}'", new object[] { str9, name }); } this.Match('['); int num32 = this.Parse_FormalParameterList(num31, true); this.Match(']'); this.valid_this_context = true; base.BeginProperty(num31, ml, num27, num32); this.Parse_PropertyAccessorDeclarations(num31, num27, ml); base.EndProperty(num31); this.valid_this_context = false; } else if (!base.IsCurrText("operator")) { int num39; if (base.IsCurrText('(')) { base.RaiseError(true, "CS1520. Class, struct, or interface method must have a return type."); } Label_0F95: num39 = this.Parse_Ident(); if (base.IsCurrText(';')) { if (num27 == 1) { base.RaiseError(false, "CS0670. Field cannot have void type."); } base.CheckModifiers(ml, this.field_modifiers); base.BeginField(num39, ml, num27); this.Add_InstanceVariableInitializer(num39, num27, ml); base.EndField(num39); this.Match(';'); } else if (base.IsCurrText(',')) { base.CheckModifiers(ml, this.field_modifiers); base.BeginField(num39, ml, num27); base.EndField(num39); this.Match(','); do { num39 = this.Parse_Ident(); base.BeginField(num39, ml, num27); if (base.IsCurrText('=')) { if (!ml.HasModifier(Modifier.Static) && (ck == ClassKind.Struct)) { base.RaiseErrorEx(false, "CS0573. '{0}' : cannot have instance field initializers in structs.", new object[] { base.GetName(num39) }); } this.Parse_InstanceVariableInitializer(num39, num27, ml); } else { this.Add_InstanceVariableInitializer(num39, num27, ml); } base.EndField(num39); } while (base.CondMatch(',')); this.Match(';'); } else if (base.IsCurrText('=')) { if (num27 == 1) { base.RaiseError(false, "CS0670. Field cannot have void type."); } if (!ml.HasModifier(Modifier.Static) && (ck == ClassKind.Struct)) { base.RaiseErrorEx(false, "CS0573. '{0}' : cannot have instance field initializers in structs.", new object[] { base.GetName(num39) }); } base.CheckModifiers(ml, this.field_modifiers); base.BeginField(num39, ml, num27); this.Parse_InstanceVariableInitializer(num39, num27, ml); base.EndField(num39); if (base.IsCurrText(',')) { this.Match(','); goto Label_0F95; } this.Match(';'); } else if (base.IsCurrText('(')) { base.CheckModifiers(ml, this.method_modifiers); if (ml.HasModifier(Modifier.Abstract) && !owner_ml.HasModifier(Modifier.Abstract)) { string str12 = base.GetName(num39); base.RaiseErrorEx(false, "CS0513. '{0}' is abstract but it is contained in nonabstract class '{1}'", new object[] { str12, name }); } if (flag && ((ml.HasModifier(Modifier.Abstract) || ml.HasModifier(Modifier.Virtual)) || ml.HasModifier(Modifier.Override))) { base.RaiseErrorEx(false, "CS0112. A static member '{0}' cannot be marked as override, virtual or abstract.", new object[] { base.GetName(num39) }); } if (ml.HasModifier(Modifier.Override) && (ml.HasModifier(Modifier.Virtual) || ml.HasModifier(Modifier.New))) { base.RaiseErrorEx(false, "CS0113. A member '{0}' marked as override cannot be marked as new or virtual.", new object[] { base.GetName(num39) }); } if (ml.HasModifier(Modifier.Extern) && ml.HasModifier(Modifier.Abstract)) { base.RaiseErrorEx(false, "CS0180. '{0}' cannot be both extern and abstract.", new object[] { base.GetName(num39) }); } if (ml.HasModifier(Modifier.Sealed) && !ml.HasModifier(Modifier.Override)) { base.RaiseErrorEx(false, "CS0238. '{0}' cannot be sealed because it is not an override.", new object[] { base.GetName(num39) }); } if (ml.HasModifier(Modifier.Abstract) && ml.HasModifier(Modifier.Virtual)) { base.RaiseErrorEx(false, "CS0503. The abstract method '{0}' cannot be marked virtual.", new object[] { base.GetName(num39) }); } if (ml.HasModifier(Modifier.Virtual) && owner_ml.HasModifier(Modifier.Sealed)) { base.RaiseErrorEx(false, "CS0549. '{0}' is a new virtual member in sealed class '{1}'.", new object[] { base.GetName(num39) }); } int num40 = num39; this.valid_this_context = true; this.BeginMethod(num40, MemberKind.Method, ml, num27); if (num28 > 0) { this.Gen(base.code.OP_ADD_EXPLICIT_INTERFACE, num40, num28, 0); } this.Match('('); if (!base.IsCurrText(')')) { this.Parse_FormalParameterList(num40, false); } this.Match(')'); if (base.IsCurrText(';')) { if (!ml.HasModifier(Modifier.Extern) && !ml.HasModifier(Modifier.Abstract)) { base.RaiseErrorEx(false, "CS0501. '{0}' must declare a body because it is not marked abstract or extern.", new object[] { base.GetName(num40) }); } this.Match(';'); } else { if (ml.HasModifier(Modifier.Extern)) { base.RaiseErrorEx(false, "CS0179. '{0}' cannot be extern and declare a body.", new object[] { base.GetName(num40) }); } this.InitMethod(num40); if (ml.HasModifier(Modifier.Abstract)) { string str13 = base.GetName(num40); base.RaiseErrorEx(false, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { str13 }); } if (base.GetName(num39) == "Main") { this.Gen(base.code.OP_CHECKED, base.TRUE_id, 0, 0); } this.Parse_MethodBlock(); if (base.GetName(num39) == "Main") { this.Gen(base.code.OP_RESTORE_CHECKED_STATE, 0, 0, 0); } } this.EndMethod(num40); this.valid_this_context = false; } else if (base.IsCurrText('{')) { base.CheckModifiers(ml, this.method_modifiers); if (ml.HasModifier(Modifier.Abstract) && !owner_ml.HasModifier(Modifier.Abstract)) { string str14 = base.GetName(num39); base.RaiseErrorEx(false, "CS0513. '{0}' is abstract but it is contained in nonabstract class '{1}'", new object[] { str14, name }); } this.valid_this_context = true; base.BeginProperty(num39, ml, num27, 0); this.param_ids.Clear(); this.param_type_ids.Clear(); this.param_mods.Clear(); this.Parse_PropertyAccessorDeclarations(num39, num27, ml); base.EndProperty(num39); this.valid_this_context = false; } else { this.Parse_TypeDeclaration(ml); } } else { base.CheckModifiers(ml, this.operator_modifiers); this.Match("operator"); if (num27 == 1) { base.RaiseError(false, "CS0590. User-defined operators cannot return void."); } if (!ml.HasModifier(Modifier.Public) || !ml.HasModifier(Modifier.Static)) { base.RaiseErrorEx(false, "CS0558. User-defined operator 'operator' must be declared static and public.", new object[] { base.curr_token.Text }); } string s = base.curr_token.Text; this.Call_SCANNER(); int num33 = base.NewVar(); this.BeginMethod(num33, MemberKind.Method, ml, num27); this.Match('('); int num34 = this.Parse_FormalParameterList(num33, false); string str11 = ""; switch (num34) { case 1: { int index = this.overloadable_unary_operators.IndexOf(s); if (index == -1) { base.RaiseError(true, "CS1019. Overloadable unary operator expected."); } int num36 = (int) this.overloadable_unary_operators.Objects[index]; str11 = (string) base.code.overloadable_unary_operators_str[num36]; break; } case 2: { int num37 = this.overloadable_binary_operators.IndexOf(s); if (num37 == -1) { base.RaiseError(true, "CS1020. Overloadable binary operator expected."); } int num38 = (int) this.overloadable_binary_operators.Objects[num37]; str11 = (string) base.code.overloadable_binary_operators_str[num38]; break; } default: base.RaiseErrorEx(true, "CS1534. Overloaded binary operator '{0}' only takes two parameters.", new object[] { s }); break; } base.SetName(num33, str11); this.Match(')'); if (base.IsCurrText(';')) { this.Match(';'); } else { this.InitMethod(num33); this.Parse_MethodBlock(); } this.EndMethod(num33); } Label_1519: base.DECLARE_SWITCH = false; }
private void Parse_PropertyAccessorDeclarations(int id, int type_id, ModifierList ml) { this.ACCESSOR_SWITCH = true; if (type_id == 1) { base.RaiseError(true, "CS0547. '{0}' : property or indexer cannot have void type."); } this.Match('{'); int num = 0; int num2 = 0; Label_0028: if (base.IsCurrText('[')) { this.Parse_Attributes(); } if (base.IsCurrText("get")) { int num3 = base.NewVar(); base.SetName(num3, "get_" + base.GetName(id)); this.BeginMethod(num3, MemberKind.Method, ml, type_id); num++; if (num > 1) { base.RaiseError(true, "CS1008. Type byte, sbyte, short, ushort, int, uint, long, or ulong expected."); } this.Match("get"); for (int i = 0; i < this.param_ids.Count; i++) { int num5 = base.NewVar(); base.SetName(num5, base.GetName(this.param_ids[i])); this.Gen(base.code.OP_ASSIGN_TYPE, num5, this.param_type_ids[i], 0); this.Gen(base.code.OP_ADD_PARAM, num3, num5, 0); } if (base.IsCurrText(';')) { if (!ml.HasModifier(Modifier.Extern) && !ml.HasModifier(Modifier.Abstract)) { base.RaiseErrorEx(false, "CS0501. '{0}' must declare a body because it is not marked abstract or extern.", new object[] { base.GetName(num3) }); } this.Match(';'); } else { if (ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(num3); base.RaiseErrorEx(true, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { name }); } this.InitMethod(num3); this.Parse_MethodBlock(); } this.EndMethod(num3); this.Gen(base.code.OP_ADD_READ_ACCESSOR, id, num3, 0); goto Label_0028; } if (base.IsCurrText("set")) { int num7; int num6 = base.NewVar(); base.SetName(num6, "set_" + base.GetName(id)); this.BeginMethod(num6, MemberKind.Method, ml, 1); num2++; if (num2 > 1) { base.RaiseError(true, "CS1008. Type byte, sbyte, short, ushort, int, uint, long, or ulong expected."); } this.Match("set"); for (int j = 0; j < this.param_ids.Count; j++) { num7 = base.NewVar(); base.SetName(num7, base.GetName(this.param_ids[j])); this.Gen(base.code.OP_ASSIGN_TYPE, num7, this.param_type_ids[j], 0); this.Gen(base.code.OP_ADD_PARAM, num6, num7, 0); } num7 = base.NewVar(); base.SetName(num7, "value"); this.Gen(base.code.OP_ADD_PARAM, num6, num7, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num7, type_id, 0); if (base.IsCurrText(';')) { if (!ml.HasModifier(Modifier.Extern) && !ml.HasModifier(Modifier.Abstract)) { base.RaiseErrorEx(false, "CS0501. '{0}' must declare a body because it is not marked abstract or extern.", new object[] { base.GetName(num6) }); } this.Match(';'); } else { if (ml.HasModifier(Modifier.Abstract)) { string str2 = base.GetName(num6); base.RaiseErrorEx(true, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { str2 }); } this.InitMethod(num6); this.Parse_MethodBlock(); } this.EndMethod(num6); this.Gen(base.code.OP_ADD_WRITE_ACCESSOR, id, num6, 0); goto Label_0028; } if ((num + num2) == 0) { base.RaiseErrorEx(true, "CS0548. '{0}' : property or indexer must have at least one accessor.", new object[] { base.GetName(id) }); } this.Match('}'); this.ACCESSOR_SWITCH = true; }
private void Parse_ClassMemberDeclaration(int class_id, ModifierList owner_modifiers, bool IsModule, ClassKind ck) { this.Parse_Attributes(); ModifierList ml = new ModifierList(); ml.Add(Modifier.Public); if (base.IsCurrText("private")) { this.Call_SCANNER(); } else if (base.IsCurrText("protected")) { this.Call_SCANNER(); } if (base.IsCurrText("public")) { this.Call_SCANNER(); } if (owner_modifiers.HasModifier(Modifier.Public) && !ml.HasModifier(Modifier.Private)) { ml.Add(Modifier.Public); } if (base.IsCurrText("type")) { this.Parse_TypeDeclaration(class_id, owner_modifiers); } else if (base.IsCurrText("var")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_VariableMemberDeclaration(class_id, ml, owner_modifiers, IsModule); } else if (base.IsCurrText("const")) { ml.Add(Modifier.Static); this.Parse_ConstantMemberDeclaration(class_id, ml, owner_modifiers, IsModule); } else if (base.IsCurrText("constructor")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_MethodMemberDeclaration(class_id, ml, owner_modifiers, ck); } else if (base.IsCurrText("destructor")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_MethodMemberDeclaration(class_id, ml, owner_modifiers, ck); } else if (base.IsCurrText("procedure")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_MethodMemberDeclaration(class_id, ml, owner_modifiers, ck); } else if (base.IsCurrText("function")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_MethodMemberDeclaration(class_id, ml, owner_modifiers, ck); } else if (base.IsCurrText("property")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_PropertyMemberDeclaration(class_id, ml, owner_modifiers, ck); } else { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_VariableMemberDeclaration(class_id, ml, owner_modifiers, IsModule); } }
private void Parse_EventAccessorDeclarations(int id, int type_id, ModifierList ml) { this.ACCESSOR_SWITCH = true; this.Match('{'); int num = 0; int num2 = 0; Label_0018: if (base.IsCurrText('[')) { this.Parse_Attributes(); } if (base.IsCurrText("add")) { int num3 = base.NewVar(); base.SetName(num3, "add_" + base.GetName(id)); this.BeginMethod(num3, MemberKind.Method, ml, type_id); num++; if (num > 1) { base.RaiseError(true, "CS1007. Property accessor already defined."); } this.Match("add"); int num4 = base.NewVar(); base.SetName(num4, "value"); this.Gen(base.code.OP_ADD_PARAM, num3, num4, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num4, type_id, 0); if (base.IsCurrText(';')) { this.Match(';'); } else { if (ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(num3); base.RaiseErrorEx(true, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { name }); } this.InitMethod(num3); this.Parse_MethodBlock(); } this.EndMethod(num3); this.Gen(base.code.OP_ADD_ADD_ACCESSOR, id, num3, 0); goto Label_0018; } if (base.IsCurrText("remove")) { int num5 = base.NewVar(); base.SetName(num5, "remove_" + base.GetName(id)); this.BeginMethod(num5, MemberKind.Method, ml, 1); num2++; if (num2 > 1) { base.RaiseError(true, "CS1007. Property accessor already defined."); } this.Match("remove"); int num6 = base.NewVar(); base.SetName(num6, "value"); this.Gen(base.code.OP_ADD_PARAM, num5, num6, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num6, type_id, 0); if (base.IsCurrText(';')) { this.Match(';'); } else { if (ml.HasModifier(Modifier.Abstract)) { string str2 = base.GetName(num5); base.RaiseErrorEx(true, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { str2 }); } this.InitMethod(num5); this.Parse_MethodBlock(); } this.EndMethod(num5); this.Gen(base.code.OP_ADD_REMOVE_ACCESSOR, id, num5, 0); goto Label_0018; } if ((num == 0) && (num2 == 0)) { base.RaiseError(true, "CS1055. An add or remove accessor expected."); } if ((num == 0) || (num2 == 0)) { base.RaiseErrorEx(true, "CS0065. '{0}' : event property must have both add and remove accessors.", new object[] { base.GetName(id) }); } this.Match('}'); this.ACCESSOR_SWITCH = true; }
private void Parse_ProcedureDeclaration(int class_id, ModifierList ml, ModifierList owner_ml, ClassKind ck) { this.Match("procedure"); int num2 = 1; this.valid_this_context = true; int num = this.BeginMethod(this.Parse_Ident(), MemberKind.Method, ml, num2); if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(num, false); } this.Match(')'); } this.Match(";"); if (!this.Parse_ForwardMethodDeclaration(num)) { if (ck != ClassKind.Interface) { this.InitMethod(num); this.Parse_LocalDeclarationPart(); if (ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(num); base.RaiseErrorEx(false, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { name }); } if (base.GetName(num) == "Main") { this.Gen(base.code.OP_CHECKED, base.TRUE_id, 0, 0); } base.DECLARE_SWITCH = false; this.Parse_CompoundStatement(); this.Match(";"); if (base.GetName(num) == "Main") { this.Gen(base.code.OP_RESTORE_CHECKED_STATE, 0, 0, 0); } } this.EndMethod(num); this.valid_this_context = false; base.DECLARE_SWITCH = true; } }
private void Parse_VariableDeclarator(ModifierList ml, bool IsModule) { base.DECLARE_SWITCH = false; ArrayList list = new ArrayList(); ArrayList sl = new ArrayList(); IntegerList list3 = this.Parse_VariableIdentifiers(list, sl); this.Match(":"); int num = this.Parse_Type(); for (int i = 0; i < list3.Count; i++) { int num3 = list3[i]; if (((string) sl[i]) != "") { base.BeginField(num3, ml, num); int num4 = base.NewVar(); this.BeginMethod(num4, MemberKind.Method, ml, 1); this.InitMethod(num4); int id = num3; if (!ml.HasModifier(Modifier.Static)) { id = base.NewVar(); base.SetName(id, base.GetName(num3)); this.Gen(base.code.OP_EVAL, 0, 0, id); this.variable_initializers.Add(num4); } else { this.static_variable_initializers.Add(num4); } string str = (string) sl[i]; int num6 = num; int num7 = base.NewVar(); base.SetName(num7, base.GetName(num6) + str); this.Gen(base.code.OP_EVAL_TYPE, num6, 0, num7); this.Gen(base.code.OP_ASSIGN_TYPE, id, num7, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num3, num7, 0); IntegerList list4 = (IntegerList) list[i]; this.Gen(base.code.OP_CREATE_OBJECT, num7, 0, id); int count = list4.Count; if (count > 0) { this.Gen(base.code.OP_BEGIN_CALL, num7, 0, 0); for (int j = 0; j < count; j++) { this.Gen(base.code.OP_INC, list4[j], 0, list4[j]); this.Gen(base.code.OP_PUSH, list4[j], 0, num7); } this.Gen(base.code.OP_PUSH, id, 0, 0); this.Gen(base.code.OP_CALL, num7, count, 0); } num = num7; this.EndMethod(num4); base.EndField(num3); } else { this.Gen(base.code.OP_ASSIGN_TYPE, num3, num, 0); base.BeginField(num3, ml, num); base.EndField(num3); } } if (base.IsCurrText("=")) { this.Match('='); if (list3.Count == 1) { int num10 = list3[0]; this.Gen(base.code.OP_ASSIGN_TYPE, num10, num, 0); this.Parse_VariableInitializer(num10, num, ml); } else { base.RaiseError(true, "VB00002. Explicit initialization is not permitted with multiple variables declared with a single type specifier."); } } }
private void Parse_FunctionDeclaration(int class_id, ModifierList ml, ModifierList owner_ml, ClassKind ck) { this.Match("function"); int num = 0x10; this.valid_this_context = true; int num2 = this.BeginMethod(this.Parse_Ident(), MemberKind.Method, ml, num); if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(num2, false); } this.Match(')'); } this.Match(":"); this.Parse_Attributes(); num = this.Parse_Type(); this.Match(";"); if (!this.Parse_ForwardMethodDeclaration(num2)) { base.DiscardInstruction(base.code.OP_ASSIGN_TYPE, num2, -1, -1); base.DiscardInstruction(base.code.OP_ASSIGN_TYPE, base.CurrResultId, -1, -1); this.Gen(base.code.OP_ASSIGN_TYPE, num2, num, 0); this.Gen(base.code.OP_ASSIGN_TYPE, base.CurrResultId, num, 0); if (this.Parse_DirectiveList().IndexOf(1) >= 0) { base.SetForward(num2, true); this.EndMethod(num2); } else { base.SetName(base.CurrResultId, "result"); this.Gen(base.code.OP_DECLARE_LOCAL_VARIABLE, base.CurrResultId, base.CurrSubId, 0); if (ml.HasModifier(Modifier.Extern)) { base.RaiseErrorEx(false, "CS0179. '{0}' cannot be extern and declare a body.", new object[] { base.GetName(num2) }); } if (ck != ClassKind.Interface) { this.InitMethod(num2); this.Parse_LocalDeclarationPart(); if (ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(num2); base.RaiseErrorEx(false, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { name }); } if (base.GetName(num2) == "Main") { this.Gen(base.code.OP_CHECKED, base.TRUE_id, 0, 0); } base.DECLARE_SWITCH = false; this.Parse_CompoundStatement(); this.Match(";"); if (base.GetName(num2) == "Main") { this.Gen(base.code.OP_RESTORE_CHECKED_STATE, 0, 0, 0); } } this.EndMethod(num2); this.valid_this_context = false; base.DECLARE_SWITCH = true; } } }
private void Parse_DestructorDeclaration(int class_id, ModifierList ml, ModifierList owner_ml, ClassKind ck) { this.Match("destructor"); int num = 1; this.valid_this_context = true; int num2 = this.BeginMethod(this.Parse_Ident(), MemberKind.Method, ml, num); this.Match(";"); if (!this.Parse_ForwardMethodDeclaration(num2)) { if (ck != ClassKind.Interface) { this.InitMethod(num2); this.Parse_LocalDeclarationPart(); if (ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(num2); base.RaiseErrorEx(false, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { name }); } base.DECLARE_SWITCH = false; this.Parse_CompoundStatement(); this.Match(";"); } this.EndMethod(num2); this.valid_this_context = false; base.DECLARE_SWITCH = true; } }
private void Parse_ConstructorDeclaration(int class_id, ModifierList ml, ModifierList owner_ml, ClassKind ck) { this.Match("constructor"); this.valid_this_context = true; bool flag = ml.HasModifier(Modifier.Static); int num2 = this.BeginMethod(this.Parse_Ident(), MemberKind.Constructor, ml, 1); if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { if (flag) { base.RaiseErrorEx(false, "CS0132. '{0}' : a static constructor must be parameterless.", new object[] { base.GetName(class_id) }); } this.Parse_ParameterList(num2, false); } this.Match(')'); } this.Match(";"); if (!this.Parse_ForwardMethodDeclaration(num2)) { IntegerList list; this.InitMethod(num2); this.Parse_LocalDeclarationPart(); if (flag) { list = this.static_variable_initializers; } else { list = this.variable_initializers; } for (int i = 0; i < list.Count; i++) { int num4 = list[i]; this.Gen(base.code.OP_BEGIN_CALL, num4, 0, 0); this.Gen(base.code.OP_PUSH, base.CurrThisID, 0, 0); this.Gen(base.code.OP_CALL, num4, 0, 0); } base.DECLARE_SWITCH = false; this.Parse_CompoundStatement(); this.Match(";"); this.EndMethod(num2); this.valid_this_context = false; if (flag) { this.static_variable_initializers.Clear(); } else { this.has_constructor = true; } base.DECLARE_SWITCH = true; } }
private void CheckMethodModifiers(int id, int class_id, ModifierList ml, ModifierList owner_ml) { base.CheckModifiers(ml, this.method_modifiers); if (ml.HasModifier(Modifier.Abstract) && !owner_ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(id); string str2 = base.GetName(class_id); base.RaiseErrorEx(false, "CS0513. '{0}' is abstract but it is contained in nonabstract class '{1}'", new object[] { name, str2 }); } if (ml.HasModifier(Modifier.Static) && ((ml.HasModifier(Modifier.Abstract) || ml.HasModifier(Modifier.Virtual)) || ml.HasModifier(Modifier.Override))) { base.RaiseErrorEx(false, "CS0112. A static member '{0}' cannot be marked as override, virtual or abstract.", new object[] { base.GetName(id) }); } if (ml.HasModifier(Modifier.Override) && (ml.HasModifier(Modifier.Virtual) || ml.HasModifier(Modifier.New))) { base.RaiseErrorEx(false, "CS0113. A member '{0}' marked as override cannot be marked as new or virtual.", new object[] { base.GetName(id) }); } if (ml.HasModifier(Modifier.Extern) && ml.HasModifier(Modifier.Abstract)) { base.RaiseErrorEx(false, "CS0180. '{0}' cannot be both extern and abstract.", new object[] { base.GetName(id) }); } if (ml.HasModifier(Modifier.Sealed) && !ml.HasModifier(Modifier.Override)) { base.RaiseErrorEx(false, "CS0238. '{0}' cannot be sealed because it is not an override.", new object[] { base.GetName(id) }); } if (ml.HasModifier(Modifier.Abstract) && ml.HasModifier(Modifier.Virtual)) { base.RaiseErrorEx(false, "CS0503. The abstract method '{0}' cannot be marked virtual.", new object[] { base.GetName(id) }); } if (ml.HasModifier(Modifier.Virtual) && owner_ml.HasModifier(Modifier.Sealed)) { base.RaiseErrorEx(false, "CS0549. '{0}' is a new virtual member in sealed class '{1}'.", new object[] { base.GetName(id) }); } }
private void Parse_ClassMemberDeclaration(int class_id, ModifierList owner_modifiers, bool IsModule, ClassKind ck) { this.Parse_Attributes(); ModifierList ml = this.Parse_Modifiers(); if (owner_modifiers.HasModifier(Modifier.Public) && !ml.HasModifier(Modifier.Private)) { ml.Add(Modifier.Public); } if (base.IsCurrText("Enum")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Structure")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Interface")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Class")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Delegate")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Event")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_EventMemberDeclaration(class_id, ml, owner_modifiers); } else if (base.IsCurrText("Dim")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_VariableMemberDeclaration(class_id, ml, owner_modifiers); } else if (base.IsCurrText("Const")) { ml.Add(Modifier.Static); this.Parse_ConstantMemberDeclaration(class_id, ml, owner_modifiers); } else if (base.IsCurrText("Property")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_PropertyMemberDeclaration(class_id, ml, owner_modifiers, ck); } else if (base.IsCurrText("Declare")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_MethodMemberDeclaration(class_id, ml, owner_modifiers, ck); } else if (base.IsCurrText("Sub")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_MethodMemberDeclaration(class_id, ml, owner_modifiers, ck); } else if (base.IsCurrText("Function")) { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_MethodMemberDeclaration(class_id, ml, owner_modifiers, ck); } else { if (IsModule) { ml.Add(Modifier.Static); } this.Parse_VariableMemberDeclaration(class_id, ml, owner_modifiers); } }
private bool HasAccessModifier(ModifierList ml) { return ((ml.HasModifier(Modifier.Public) || ml.HasModifier(Modifier.Private)) || ml.HasModifier(Modifier.Protected)); }
private void Parse_EventMemberDeclaration(int class_id, ModifierList ml, ModifierList owner_ml) { int num2; int num3; this.Match("Event"); base.CheckModifiers(ml, this.event_modifiers); int id = this.Parse_Ident(); if (ml.HasModifier(Modifier.Abstract) && !owner_ml.HasModifier(Modifier.Abstract)) { string str = base.GetName(id); string str2 = base.GetName(class_id); base.RaiseErrorEx(false, "CS0513. '{0}' is abstract but it is contained in nonabstract class '{1}'", new object[] { str, str2 }); } if (base.IsCurrText('(')) { int num4 = 1; int num5 = base.NewVar(); base.SetName(num5, base.GetName(id) + "EventHandler"); base.BeginDelegate(num5, ml); num2 = base.NewVar(); this.BeginMethod(num2, MemberKind.Method, ml, num4); this.Gen(base.code.OP_ADD_PATTERN, num5, num2, 0); if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(num2, false); } this.Match(')'); } if (base.IsCurrText("As")) { this.Match("As"); this.Parse_Attributes(); num4 = this.Parse_Type(); this.Gen(base.code.OP_ASSIGN_TYPE, num2, num4, 0); this.Gen(base.code.OP_ASSIGN_TYPE, base.CurrResultId, num4, 0); } this.InitMethod(num2); int num6 = base.NewVar(); int num7 = base.NewVar(); int resultId = base.GetResultId(num2); int thisId = base.GetThisId(num2); int num10 = base.NewLabel(); int l = base.NewLabel(); this.Gen(base.code.OP_FIND_FIRST_DELEGATE, thisId, num6, num7); this.Gen(base.code.OP_GO_NULL, num10, num6, 0); for (int i = 0; i < this.param_ids.Count; i++) { this.Gen(base.code.OP_PUSH, this.param_ids[i], this.param_mods[i], num6); } this.Gen(base.code.OP_PUSH, num7, 0, 0); this.Gen(base.code.OP_CALL_SIMPLE, num6, this.param_ids.Count, resultId); base.SetLabelHere(l); this.Gen(base.code.OP_FIND_NEXT_DELEGATE, thisId, num6, num7); this.Gen(base.code.OP_GO_NULL, num10, num6, 0); for (int j = 0; j < this.param_ids.Count; j++) { this.Gen(base.code.OP_PUSH, this.param_ids[j], this.param_mods[j], num6); } this.Gen(base.code.OP_PUSH, num7, 0, 0); this.Gen(base.code.OP_CALL_SIMPLE, num6, this.param_ids.Count, resultId); this.Gen(base.code.OP_GO, l, 0, 0); base.SetLabelHere(num10); this.EndMethod(num2); base.EndDelegate(num5); num3 = num5; } else { this.Match("As"); num3 = this.Parse_Type(); } ModifierList list = ml.Clone(); list.Delete(Modifier.Public); base.BeginField(id, list, num3); string name = base.GetName(id); base.SetName(id, "__" + name); base.EndField(id); int num17 = base.NewVar(); base.SetName(num17, name); base.BeginEvent(num17, ml, num3, 0); this.Gen(base.code.OP_ADD_EVENT_FIELD, num17, id, 0); num2 = base.NewVar(); base.SetName(num2, "add_" + name); this.BeginMethod(num2, MemberKind.Method, list, 1); int num14 = base.NewVar(); base.SetName(num14, "value"); this.Gen(base.code.OP_ADD_PARAM, num2, num14, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num14, num3, 0); this.InitMethod(num2); int num15 = base.NewVar(); base.SetName(num15, base.GetName(id)); int res = base.NewVar(); this.Gen(base.code.OP_EVAL, 0, 0, num15); this.Gen(base.code.OP_PLUS, num15, num14, res); this.Gen(base.code.OP_ASSIGN, num15, res, num15); this.EndMethod(num2); this.Gen(base.code.OP_ADD_ADD_ACCESSOR, num17, num2, 0); num2 = base.NewVar(); base.SetName(num2, "remove_" + name); this.BeginMethod(num2, MemberKind.Method, list, 1); num14 = base.NewVar(); base.SetName(num14, "value"); this.Gen(base.code.OP_ADD_PARAM, num2, num14, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num14, num3, 0); this.InitMethod(num2); num15 = base.NewVar(); base.SetName(num15, base.GetName(id)); res = base.NewVar(); this.Gen(base.code.OP_EVAL, 0, 0, num15); this.Gen(base.code.OP_MINUS, num15, num14, res); this.Gen(base.code.OP_ASSIGN, num15, res, num15); this.EndMethod(num2); this.Gen(base.code.OP_ADD_REMOVE_ACCESSOR, num17, num2, 0); base.EndEvent(num17); this.MatchLineTerminator(); }
private void Parse_InstanceVariableInitializer(int id, int type_id, ModifierList ml) { base.DECLARE_SWITCH = false; this.Match('='); int num = base.NewVar(); this.BeginMethod(num, MemberKind.Method, ml, 1); this.InitMethod(num); int num2 = id; if (!ml.HasModifier(Modifier.Static)) { num2 = base.NewVar(); base.SetName(num2, base.GetName(id)); this.Gen(base.code.OP_EVAL, 0, 0, num2); this.variable_initializers.Add(num); } else { this.static_variable_initializers.Add(num); } if (base.IsCurrText('{')) { this.Gen(base.code.OP_ASSIGN, num2, this.Parse_ArrayInitializer(type_id), num2); } else { this.Gen(base.code.OP_ASSIGN, num2, this.Parse_Expression(), num2); } this.EndMethod(num); base.DECLARE_SWITCH = true; }
private void Parse_FunctionDeclaration(int class_id, ModifierList ml, ModifierList owner_ml, ClassKind ck) { this.Match("Function"); this.PushExitKind(ExitKind.Function); int id = this.Parse_Ident(); this.CheckMethodModifiers(id, class_id, ml, owner_ml); int num2 = 0x10; this.valid_this_context = true; this.BeginMethod(id, MemberKind.Method, ml, num2); if (this.explicit_intf_id > 0) { this.Gen(base.code.OP_ADD_EXPLICIT_INTERFACE, id, this.explicit_intf_id, 0); } if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(id, false); } this.Match(')'); } if (base.IsCurrText("As")) { this.Match("As"); this.Parse_Attributes(); num2 = this.Parse_Type(); if (base.IsCurrText('(')) { string str = this.Parse_TypeNameModifier(); string str2 = base.GetName(num2) + str; num2 = base.NewVar(); base.SetName(num2, str2); this.Gen(base.code.OP_EVAL_TYPE, 0, 0, num2); } base.DiscardInstruction(base.code.OP_ASSIGN_TYPE, id, -1, -1); base.DiscardInstruction(base.code.OP_ASSIGN_TYPE, base.CurrResultId, -1, -1); this.Gen(base.code.OP_ASSIGN_TYPE, id, num2, 0); this.Gen(base.code.OP_ASSIGN_TYPE, base.CurrResultId, num2, 0); } if (ml.HasModifier(Modifier.Extern)) { base.RaiseErrorEx(false, "CS0179. '{0}' cannot be extern and declare a body.", new object[] { base.GetName(id) }); } if (ck != ClassKind.Interface) { this.InitMethod(id); if (ml.HasModifier(Modifier.Abstract)) { string name = base.GetName(id); base.RaiseErrorEx(false, "CS0500. '{0}' cannot declare a body because it is marked abstract.", new object[] { name }); } if (base.GetName(id) == "Main") { this.Gen(base.code.OP_CHECKED, base.TRUE_id, 0, 0); } if (base.IsCurrText("Handles")) { this.Parse_HandlesClause(); } else if (base.IsCurrText("Implements")) { this.Parse_ImplementsClause(id); } base.DECLARE_SWITCH = false; this.MatchLineTerminator(); this.Parse_Block(); if (base.GetName(id) == "Main") { this.Gen(base.code.OP_RESTORE_CHECKED_STATE, 0, 0, 0); } this.Match("End"); this.Match("Function"); } this.EndMethod(id); this.valid_this_context = false; base.DECLARE_SWITCH = true; this.PopExitKind(); this.MatchLineTerminator(); }
private ModifierList Parse_Modifiers() { int num2; ModifierList list = new ModifierList(); int num = 0; Label_000D: num2 = this.total_modifier_list.IndexOf(base.curr_token.Text); switch (base.curr_token.Text) { case "private": case "protected": case "public": case "internal": num++; break; } if (num2 >= 0) { Modifier m = (Modifier) this.total_modifier_list.Objects[num2]; if (list.HasModifier(m)) { string str2 = this.total_modifier_list[(int) m]; base.RaiseErrorEx(false, "CS1004. Duplicate '{0}' modifier.", new object[] { str2 }); } list.Add(m); this.Call_SCANNER(); goto Label_000D; } if (num > 1) { base.RaiseError(false, "CS0107. More than one protection modifier."); } if (list.HasModifier(Modifier.Private) && (list.HasModifier(Modifier.Virtual) || list.HasModifier(Modifier.Abstract))) { base.RaiseError(false, "CS0621. Virtual or abstract members cannot be private."); } return list; }
private void Parse_InterfaceMember(int interface_id, ModifierList owner_modifiers) { this.Parse_Attributes(); ModifierList ml = this.Parse_Modifiers(); ml.Add(Modifier.Abstract); if (owner_modifiers.HasModifier(Modifier.Public) && !ml.HasModifier(Modifier.Private)) { ml.Add(Modifier.Public); } if (base.IsCurrText("Enum")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Structure")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Interface")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Class")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Delegate")) { this.Parse_NonModuleDeclaration(ml); } else if (base.IsCurrText("Event")) { this.Parse_EventMemberDeclaration(interface_id, ml, owner_modifiers); } else if (base.IsCurrText("Property")) { this.Parse_PropertyMemberDeclaration(interface_id, ml, owner_modifiers, ClassKind.Interface); } else if (base.IsCurrText("Sub")) { this.Parse_MethodMemberDeclaration(interface_id, ml, owner_modifiers, ClassKind.Interface); } else if (base.IsCurrText("Function")) { this.Parse_MethodMemberDeclaration(interface_id, ml, owner_modifiers, ClassKind.Interface); } }
private void Add_InstanceVariableInitializer(int id, int type_id, ModifierList ml) { int num = 0; if (type_id == 2) { num = base.NewConst(false); } else if (type_id == 3) { num = base.NewConst((byte) 0); } else if (type_id == 4) { num = base.NewConst(' '); } else if (type_id == 5) { num = base.NewConst(0M); } else if (type_id == 6) { num = base.NewConst(0.0); } else if (type_id == 7) { num = base.NewConst(0f); } else if (type_id == 8) { num = base.NewConst(0); } else if (type_id == 9) { num = base.NewConst(0L); } else if (type_id == 10) { num = base.NewConst((sbyte) 0); } else if (type_id == 11) { num = base.NewConst((short) 0); } else if (type_id == 12) { num = base.NewConst(""); } else if (type_id == 13) { num = base.NewConst(0); } else if (type_id == 14) { num = base.NewConst((ulong) 0L); } else if (type_id == 15) { num = base.NewConst((ushort) 0); } if (num > 0) { int num2 = base.NewVar(); this.BeginMethod(num2, MemberKind.Method, ml, 1); this.InitMethod(num2); int num3 = id; if (!ml.HasModifier(Modifier.Static)) { num3 = base.NewVar(); base.SetName(num3, base.GetName(id)); this.Gen(base.code.OP_EVAL, 0, 0, num3); this.variable_initializers.Add(num2); } else { this.static_variable_initializers.Add(num2); } this.Gen(base.code.OP_ASSIGN, num3, num, num3); this.EndMethod(num2); } }
private void Parse_PropertyMemberDeclaration(int class_id, ModifierList ml, ModifierList owner_modifiers, ClassKind ck) { this.Match("Property"); int num = this.Parse_Ident(); this.param_ids.Clear(); this.param_type_ids.Clear(); this.param_mods.Clear(); if (base.IsCurrText('(')) { this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(num, false); } this.Match(')'); } int num2 = 0x10; if (base.IsCurrText("As")) { this.Match("As"); this.Parse_Attributes(); num2 = this.Parse_TypeEx(); base.DiscardInstruction(base.code.OP_ASSIGN_TYPE, num, -1, -1); this.Gen(base.code.OP_ASSIGN_TYPE, num, num2, 0); } base.BeginProperty(num, ml, num2, 0); if (ml.HasModifier(Modifier.Default)) { if (this.param_ids.Count == 0) { base.RaiseError(false, "VB00004. Properties with no required parameters cannot be declared 'Default'."); } else { this.Gen(base.code.OP_SET_DEFAULT, num, 0, 0); } } if (base.IsCurrText("Implements")) { this.Parse_ImplementsClause(num); } int num3 = 0; int num4 = 0; Label_0110: this.MatchLineTerminator(); this.Parse_Attributes(); if (base.IsCurrText("Get")) { this.curr_prop_id = num; this.Match("Get"); base.DECLARE_SWITCH = false; this.valid_this_context = true; this.MatchLineTerminator(); int id = base.NewVar(); base.SetName(id, "get_" + base.GetName(num)); this.BeginMethod(id, MemberKind.Method, ml, num2); num3++; if (num3 > 1) { base.RaiseError(true, "CS1008. Type byte, sbyte, short, ushort, int, uint, long, or ulong expected."); } for (int i = 0; i < this.param_ids.Count; i++) { base.DiscardInstruction(base.code.OP_ADD_PARAM, num, -1, -1); int num7 = base.NewVar(); base.SetName(num7, base.GetName(this.param_ids[i])); this.Gen(base.code.OP_ASSIGN_TYPE, num7, this.param_type_ids[i], 0); this.Gen(base.code.OP_ADD_PARAM, id, num7, 0); } this.InitMethod(id); this.Parse_Block(); this.EndMethod(id); this.Gen(base.code.OP_ADD_READ_ACCESSOR, num, id, 0); base.DECLARE_SWITCH = true; this.valid_this_context = false; this.Match("End"); this.Match("Get"); this.curr_prop_id = 0; goto Label_0110; } if (base.IsCurrText("Set")) { this.valid_this_context = true; this.Match("Set"); int num8 = base.NewVar(); base.SetName(num8, "set_" + base.GetName(num)); this.BeginMethod(num8, MemberKind.Method, ml, num2); num4++; if (num4 > 1) { base.RaiseError(true, "CS1008. Type byte, sbyte, short, ushort, int, uint, long, or ulong expected."); } if (this.IsLineTerminator()) { int num9; for (int j = 0; j < this.param_ids.Count; j++) { num9 = base.NewVar(); base.SetName(num9, base.GetName(this.param_ids[j])); this.Gen(base.code.OP_ASSIGN_TYPE, num9, this.param_type_ids[j], 0); this.Gen(base.code.OP_ADD_PARAM, num8, num9, 0); } num9 = base.NewVar(); base.SetName(num9, "value"); this.Gen(base.code.OP_ADD_PARAM, num8, num9, 0); this.Gen(base.code.OP_ASSIGN_TYPE, num9, num2, 0); base.DECLARE_SWITCH = false; this.InitMethod(num8); this.MatchLineTerminator(); } else { if (base.IsCurrText('(')) { for (int k = 0; k < this.param_ids.Count; k++) { int num12 = base.NewVar(); base.SetName(num12, base.GetName(this.param_ids[k])); this.Gen(base.code.OP_ASSIGN_TYPE, num12, this.param_type_ids[k], 0); this.Gen(base.code.OP_ADD_PARAM, num8, num12, 0); } this.Match('('); if (!base.IsCurrText(')')) { this.Parse_ParameterList(num8, false); } this.Match(')'); } base.DECLARE_SWITCH = false; this.InitMethod(num8); this.MatchLineTerminator(); } this.Parse_Block(); this.EndMethod(num8); this.Gen(base.code.OP_ADD_WRITE_ACCESSOR, num, num8, 0); base.DECLARE_SWITCH = true; this.valid_this_context = false; this.Match("End"); this.Match("Set"); goto Label_0110; } base.EndProperty(num); if ((num3 + num4) == 0) { if (ml.HasModifier(Modifier.Abstract)) { return; } base.RaiseErrorEx(true, "CS0548. '{0}' : property or indexer must have at least one accessor.", new object[] { base.GetName(num) }); } this.Match("End"); this.Match("Property"); this.MatchLineTerminator(); }
private void Parse_ClassDeclaration(ModifierList ml) { base.DECLARE_SWITCH = true; this.has_constructor = false; base.CheckModifiers(ml, this.class_modifiers); this.Match("class"); int num = this.Parse_Ident(); if (ml.HasModifier(Modifier.Abstract) && ml.HasModifier(Modifier.Sealed)) { base.RaiseError(false, "CS0502. The class '{0}' is abstract and sealed."); } base.BeginClass(num, ml); if (base.IsCurrText(':')) { this.Parse_ClassBase(num); } else { this.Gen(base.code.OP_ADD_ANCESTOR, num, base.ObjectClassId, 0); } this.Parse_ClassBody(num, ml); if (this.static_variable_initializers.Count > 0) { this.CreateDefaultStaticConstructor(num); } if (!this.has_constructor) { this.CreateDefaultConstructor(num, false); } base.EndClass(num); if (base.IsCurrText(';')) { this.Match(';'); } }
internal void CheckModifiers(ModifierList ml, ModifierList true_list) { for (int i = 0; i < ml.Count; i++) { Modifier m = ml[i]; if (!true_list.HasModifier(m)) { this.RaiseErrorEx(false, "CS0106. The modifier '{0}' is not valid for this item.", new object[] { m.ToString() }); } } }