private PType LvalueToType(PLvalue lvalue, IList dynamicOpList, TLt genericToken, IList genericTypes) { PType type = LvalueToType(lvalue); if (genericToken != null) { type = new AGenericType(genericToken, type, new ArrayList()); while (genericTypes.Count > 0) { ((AGenericType)type).GetGenericTypes().Add(genericTypes[0]); } } foreach (PShadyDynamicOps op in dynamicOpList) { if (op is APointerShadyDynamicOps) { APointerShadyDynamicOps aop = (APointerShadyDynamicOps)op; type = new APointerType(aop.GetToken(), type); } else if (op is AArrayShadyDynamicOps) { AArrayShadyDynamicOps aop = (AArrayShadyDynamicOps)op; if (aop.GetExp() == null) { type = new ADynamicArrayType(aop.GetToken(), type); } else { type = new AArrayTempType(aop.GetToken(), type, aop.GetExp(), null); } } } return(type); }
public static string TypeToIdentifierString(PType type) { if (type is AVoidType) { return("void"); } /*if (type is AArrayType) * { * AArrayType aType = (AArrayType)type; * return TypeToString(aType.GetType()) + "[" + aType.GetDimention().Text + "]"; * }*/ if (type is AArrayTempType) { AArrayTempType aType = (AArrayTempType)type; return(TypeToIdentifierString(aType.GetType()) + "Ar" + (aType.GetIntDim() == null ? "" : aType.GetIntDim().Text)); } if (type is ANamedType) { ANamedType aType = (ANamedType)type; return(((AAName)aType.GetName()).AsString().Replace('.', '_')); } if (type is APointerType) { APointerType aType = (APointerType)type; return("p" + TypeToIdentifierString(aType.GetType())); } if (type is ADynamicArrayType) { ADynamicArrayType aType = (ADynamicArrayType)type; return(TypeToIdentifierString(aType.GetType()) + "DAr"); } if (type is AGenericType) { AGenericType aType = (AGenericType)type; string ret = TypeToIdentifierString(aType.GetBase()) + "G_"; bool first = true; foreach (PType t in aType.GetGenericTypes()) { if (first) { first = false; } else { ret += "_"; } ret += TypeToIdentifierString(t); } return(ret + "_G"); } throw new Exception("Unknown type"); }
public override void OutAGenericType(AGenericType node) { if (!(node.GetBase() is ANamedType)) { errors.Add(new ErrorCollection.Error(node.GetToken(), LocRM.GetString("ErrorText44"))); return; } ANamedType Base = (ANamedType)node.GetBase(); if (!data.StructTypeLinks.ContainsKey(Base)) { errors.Add(new ErrorCollection.Error(node.GetToken(), LocRM.GetString("ErrorText44"))); return; } AStructDecl str = data.StructTypeLinks[Base]; if (str.GetGenericVars().Count != node.GetGenericTypes().Count) { errors.Add(new ErrorCollection.Error(node.GetToken(), LocRM.GetString("ErrorText45"), false, new ErrorCollection.Error(str.GetName(), LocRM.GetString("ErrorText46") + Util.GetTypeName(str)))); return; } LookForGenericVar finder = new LookForGenericVar(); foreach (PType genericType in node.GetGenericTypes()) { genericType.Apply(finder); if (finder.ContainsGenericVar || finder.ContainsNestedGenerics) { //if (finder.ContainsGenericVar) structsWithGenerics.Add(Util.GetAncestor <AStructDecl>(node)); if (finder.ContainsNestedGenerics) { if (!Util.HasAncestor <AStructDecl>(node) || Util.GetAncestor <AStructDecl>(node).GetGenericVars().Count == 0) { needAnotherPass = true; } } return; } } if (!Refferences.ContainsKey(str)) { Refferences[str] = new List <AGenericType>(); } Refferences[str].Add(node); base.OutAGenericType(node); }
public override void CaseAGenericType(AGenericType node) { ContainsNestedGenerics = true; base.CaseAGenericType(node); }
public static StringBuilder TypeToStringBuilder(PType type) { if (type is AVoidType) { return(new StringBuilder("void")); } /*if (type is AArrayType) * { * AArrayType aType = (AArrayType)type; * return TypeToString(aType.GetType()) + "[" + aType.GetDimention().Text + "]"; * }*/ if (type is AArrayTempType) { AArrayTempType aType = (AArrayTempType)type; StringBuilder builder = new StringBuilder(); builder.Append(TypeToStringBuilder(aType.GetType())); builder.Append("["); if (aType.GetIntDim() != null) { builder.Append(aType.GetIntDim().Text); } builder.Append("]"); return(builder); } if (type is ANamedType) { ANamedType aType = (ANamedType)type; StringBuilder builder = new StringBuilder(); foreach (TIdentifier identifier in ((AAName)aType.GetName()).GetIdentifier()) { if (builder.Length != 0) { builder.Append("."); } builder.Append(identifier.Text); } return(builder); } if (type is APointerType) { APointerType aType = (APointerType)type; StringBuilder builder = new StringBuilder(); builder.Append(TypeToStringBuilder(aType.GetType())); builder.Append("*"); return(builder); } if (type is ADynamicArrayType) { ADynamicArrayType aType = (ADynamicArrayType)type; StringBuilder builder = new StringBuilder(); builder.Append(TypeToStringBuilder(aType.GetType())); builder.Append("[]"); return(builder); } if (type is AGenericType) { AGenericType aType = (AGenericType)type; StringBuilder builder = new StringBuilder(); builder.Append(TypeToStringBuilder(aType.GetBase())); builder.Append("<"); bool first = true; foreach (PType t in aType.GetGenericTypes()) { if (first) { first = false; } else { builder.Append(", "); } builder.Append(TypeToStringBuilder(t)); } builder.Append(">"); return(builder); } throw new Exception("Unknown type. Got " + type); }
public static bool TypesEqual(PType t1, PType t2, SharedData data) { if (t1.GetType() != t2.GetType()) { return(false); } if (t1 is AVoidType) { return(true); } if (t1 is AArrayTempType) { AArrayTempType aT1 = (AArrayTempType)t1; AArrayTempType aT2 = (AArrayTempType)t2; return(TypesEqual(aT1.GetType(), aT2.GetType(), data) && ReturnsTheSame(aT1.GetDimention(), aT2.GetDimention(), data)); } if (t1 is ADynamicArrayType) { ADynamicArrayType aT1 = (ADynamicArrayType)t1; ADynamicArrayType aT2 = (ADynamicArrayType)t2; return(TypesEqual(aT1.GetType(), aT2.GetType(), data)); } if (t1 is ANamedType) { ANamedType aT1 = (ANamedType)t1; ANamedType aT2 = (ANamedType)t2; if (aT1.IsPrimitive() && aT2.IsPrimitive()) { return(((AAName)aT1.GetName()).AsString() == ((AAName)aT2.GetName()).AsString()); } if (data.StructTypeLinks.ContainsKey(aT1) != data.StructTypeLinks.ContainsKey(aT2)) { return(false); } if (data.StructTypeLinks.ContainsKey(aT1) && data.StructTypeLinks[aT1] != data.StructTypeLinks[aT2]) { return(false); } if (data.DelegateTypeLinks.ContainsKey(aT1) != data.DelegateTypeLinks.ContainsKey(aT2)) { return(false); } if (data.DelegateTypeLinks.ContainsKey(aT1) && data.DelegateTypeLinks[aT1] != data.DelegateTypeLinks[aT2]) { return(false); } return(true); } if (t1 is ANullType) { return(true); } if (t1 is APointerType) { APointerType aT1 = (APointerType)t1; APointerType aT2 = (APointerType)t2; return(TypesEqual(aT1.GetType(), aT2.GetType(), data)); } if (t1 is AGenericType) { AGenericType aT1 = (AGenericType)t1; AGenericType aT2 = (AGenericType)t2; if (!TypesEqual(aT1.GetBase(), aT2.GetBase(), data)) { return(false); } if (aT1.GetGenericTypes().Count != aT2.GetGenericTypes().Count) { return(false); } for (int i = 0; i < aT1.GetGenericTypes().Count; i++) { if (!TypesEqual((PType)aT1.GetGenericTypes()[i], (PType)aT2.GetGenericTypes()[i], data)) { return(false); } } return(true); } throw new Exception("Util.TypesEqual: Unexpected type. Got + " + t1.GetType()); }