public static void Parse(AStructDecl str, AStructDecl clone, List<PType> types, SharedData data) { FixGenericLinks fixer = new FixGenericLinks(clone, types, data) {original = str, clone = clone}; str.Apply(fixer); }
public override void OutAEnumDecl(AEnumDecl node) { AStructDecl replacer = new AStructDecl(node.GetVisibilityModifier(), null, null, null, node.GetEndToken(), node.GetName(), new ArrayList(), null, new ArrayList()); int intVal = 0; //int min = int.MaxValue; //int max = int.MinValue; //List<TIdentifier> types = new List<TIdentifier>(); foreach (AAEnumLocal value in node.GetValues()) { AIntConstExp intConst; if (value.GetValue() != null) { intConst = (AIntConstExp) value.GetValue(); intVal = int.Parse(intConst.GetIntegerLiteral().Text) + 1; } else { intConst = new AIntConstExp(new TIntegerLiteral(intVal.ToString(), value.GetName().Line, value.GetName().Pos)); intVal++; } // min = Math.Min(intVal - 1, min); // max = Math.Max(intVal - 1, max); TIdentifier typeIdentifier = new TIdentifier(replacer.GetName().Text, value.GetName().Line, value.GetName().Pos); // types.Add(typeIdentifier); AALocalDecl localDecl = new AALocalDecl(new APublicVisibilityModifier(), new TStatic("static", value.GetName().Line, value.GetName().Pos), null, null, new TConst("const", value.GetName().Line, value.GetName().Pos), new ANamedType(typeIdentifier, null), value.GetName(), intConst); replacer.GetLocals().Add(localDecl); } /* if (min < 0 || max > 255) foreach (TIdentifier identifier in types) { identifier.Text = "int"; }*/ node.ReplaceBy(replacer); replacer.Apply(this); replacer.GetName().Text = "enum " + replacer.GetName().Text; }
public override void OutAEnumDecl(AEnumDecl node) { AStructDecl replacer = new AStructDecl(node.GetVisibilityModifier(), null, null, null, node.GetEndToken(), node.GetName(), new ArrayList(), null, new ArrayList()); TIdentifier typeIdentifier = new TIdentifier("byte"); ASwitchStm switchStm = new ASwitchStm(new TSwitch("switch"), new ALvalueExp( new AAmbiguousNameLvalue(new AAName(new ArrayList() {new TIdentifier("enum")}))), new ArrayList()); ; AMethodDecl toStringMethod = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("toString"), new ArrayList() { new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(typeIdentifier, null), new TIdentifier("enum"), null) }, new AABlock( new ArrayList() { switchStm, new AValueReturnStm(new TReturn("return"), new ANullExp()) }, new TRBrace("}"))); replacer.GetLocals().Add(new ADeclLocalDecl(toStringMethod)); int intVal = 0; int min = int.MaxValue; int max = int.MinValue; List<TIdentifier> types = new List<TIdentifier>(){typeIdentifier}; Dictionary<int, List<AALocalDecl>> usedValues = new Dictionary<int, List<AALocalDecl>>(); foreach (AAEnumLocal value in node.GetValues()) { AIntConstExp intConst; if (value.GetValue() != null) { intConst = (AIntConstExp) value.GetValue(); intVal = int.Parse(intConst.GetIntegerLiteral().Text) + 1; } else { intConst = new AIntConstExp(new TIntegerLiteral(intVal.ToString(), value.GetName().Line, value.GetName().Pos)); intVal++; } min = Math.Min(intVal - 1, min); max = Math.Max(intVal - 1, max); typeIdentifier = new TIdentifier("byte", value.GetName().Line, value.GetName().Pos); types.Add(typeIdentifier); switchStm.GetCases().Add( new ASwitchCaseStm(new ACaseSwitchCaseType(new TCase("case"), (PExp) intConst.Clone()), new AABlock( new ArrayList() { new AValueReturnStm(new TReturn("return"), new AStringConstExp( new TStringLiteral("\"" + value.GetName().Text + "\""))) }, new TRBrace("}")))); AALocalDecl localDecl = new AALocalDecl(new APublicVisibilityModifier(), new TStatic("static", value.GetName().Line, value.GetName().Pos), null, null, new TConst("const", value.GetName().Line, value.GetName().Pos), new ANamedType(typeIdentifier, null), value.GetName(), intConst); replacer.GetLocals().Add(localDecl); if (!usedValues.ContainsKey(intVal - 1)) usedValues[intVal - 1] = new List<AALocalDecl>(); usedValues[intVal - 1].Add(localDecl); } if (min < 0 || max > 255) foreach (TIdentifier identifier in types) { identifier.Text = "int"; } node.ReplaceBy(replacer); foreach (KeyValuePair<int, List<AALocalDecl>> pair in usedValues) { if (pair.Value.Count <= 1) continue; int value = pair.Key; List<ErrorCollection.Error> subErrors = new List<ErrorCollection.Error>(); foreach (AALocalDecl decl in pair.Value) { subErrors.Add(new ErrorCollection.Error(decl.GetName(), LocRM.GetString("ErrorText179"))); } errors.Add(new ErrorCollection.Error(replacer.GetName(), LocRM.GetString("ErrorText180") + value + ".", false, subErrors.ToArray())); } replacer.Apply(this); data.Enums.Add(replacer, min < 0 || max > 255); }
public Parser(AStructDecl structDecl) { structDecl.Apply(this); }