public static bool IsStaticContext(Node node) { //Must be in a struct/enrichment, and in a static method/property/localdecl if (HasAncestor <AStructDecl>(node) || HasAncestor <AEnrichmentDecl>(node)) { AMethodDecl pMethod = GetAncestor <AMethodDecl>(node); APropertyDecl pProperty = GetAncestor <APropertyDecl>(node); AALocalDecl pLocalDecl = GetAncestor <AALocalDecl>(node); return(pMethod != null && pMethod.GetStatic() != null || pProperty != null && pProperty.GetStatic() != null || pLocalDecl != null && pLocalDecl.GetStatic() != null); } return(false); }
public VariableDescription(APropertyDecl property) { Name = property.GetName().Text; IsArrayProperty = Name == "array property"; if (IsArrayProperty) { Name = ""; } Type = Util.TypeToString(property.GetType()); PlacementPrefix = "Property"; VariableType = VariableTypes.Field; Const = false; IsStatic = property.GetStatic() != null; Visibility = property.GetVisibilityModifier(); realType = (PType)property.GetType().Clone(); Line = property.GetName().Line; Position = TextPoint.FromCompilerCoords(property.GetName()); }
/* * Apply before Transform method decls, and remove dead code * * Convert properties to methods */ public static void Parse(FinalTransformations finalTrans) { OldEnrichmentParents.Clear(); OldStructParents.Clear(); SharedData data = finalTrans.data; foreach (APropertyDecl property in data.Properties.Select(p => p.Decl)) { AASourceFile parent = (AASourceFile)property.Parent(); if (property.GetGetter() != null) { AMethodDecl getter = new AMethodDecl(new APublicVisibilityModifier(), null, property.GetStatic() == null ? null : (TStatic)property.GetStatic().Clone(), null, null, null, Util.MakeClone(property.GetType(), data), new TIdentifier("Get" + property.GetName().Text, property.GetName().Line, 0), new ArrayList(), property.GetGetter()); data.Methods.Add(new SharedData.DeclItem <AMethodDecl>(parent, getter)); parent.GetDecl().Insert(parent.GetDecl().IndexOf(property), getter); data.Getters[property] = getter; } if (property.GetSetter() != null) { AALocalDecl valueLocal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, Util.MakeClone(property.GetType(), data), new TIdentifier("value"), null); AMethodDecl setter = new AMethodDecl(new APublicVisibilityModifier(), null, property.GetStatic() == null ? null : (TStatic)property.GetStatic().Clone(), null, null, null, new AVoidType(new TVoid("void")), new TIdentifier("Set" + property.GetName().Text, property.GetName().Line, 0), new ArrayList() { valueLocal }, property.GetSetter()); data.Methods.Add(new SharedData.DeclItem <AMethodDecl>(parent, setter)); parent.GetDecl().Insert(parent.GetDecl().IndexOf(property), setter); setter.GetBlock().Apply(new FixValue(valueLocal, data)); data.Setters[property] = setter; } property.Parent().RemoveChild(property); } foreach (AStructDecl structDecl in data.Structs.Select(s => s.Decl)) { foreach (APropertyDecl property in data.StructProperties[structDecl]) { //Due to enheritance, they might not be in same struct if (structDecl != Util.GetAncestor <AStructDecl>(property)) { continue; } OldStructParents[property] = structDecl; if (property.GetGetter() != null) { AALocalDecl indexLocal = null; string methodName = "Get" + property.GetName().Text; if (property.GetName().Text == "") { methodName = "GetThis"; indexLocal = data.ArrayPropertyLocals[property][0]; } AMethodDecl getter = new AMethodDecl(new APublicVisibilityModifier(), null, property.GetStatic() == null ? null : (TStatic)property.GetStatic().Clone(), null, null, null, Util.MakeClone(property.GetType(), data), new TIdentifier(methodName, property.GetName().Line, 0), new ArrayList(), property.GetGetter()); if (indexLocal != null) { indexLocal.Parent().Parent().RemoveChild(indexLocal.Parent()); //data.Locals[(AABlock) getter.GetBlock()].Remove(indexLocal); getter.GetFormals().Insert(0, indexLocal); } data.StructMethods[structDecl].Add(getter); structDecl.GetLocals().Insert(structDecl.GetLocals().IndexOf(property.Parent()), new ADeclLocalDecl(getter)); data.Getters[property] = getter; } if (property.GetSetter() != null) { AALocalDecl indexLocal = null; string methodName = "Set" + property.GetName().Text; if (property.GetName().Text == "") { methodName = "SetThis"; indexLocal = data.ArrayPropertyLocals[property][data.ArrayPropertyLocals[property].Length - 1]; } AALocalDecl valueLocal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, Util.MakeClone(property.GetType(), data), new TIdentifier("value"), null); AMethodDecl setter = new AMethodDecl(new APublicVisibilityModifier(), null, property.GetStatic() == null ? null : (TStatic)property.GetStatic().Clone(), null, null, null, new AVoidType(new TVoid("void")), new TIdentifier(methodName, property.GetName().Line, 0), new ArrayList() { valueLocal }, property.GetSetter()); if (indexLocal != null) { indexLocal.Parent().Parent().RemoveChild(indexLocal.Parent()); //data.Locals[(AABlock)setter.GetBlock()].Remove(indexLocal); setter.GetFormals().Insert(0, indexLocal); } data.StructMethods[structDecl].Add(setter); structDecl.GetLocals().Insert(structDecl.GetLocals().IndexOf(property.Parent()), new ADeclLocalDecl(setter)); setter.GetBlock().Apply(new FixValue(valueLocal, data)); data.Setters[property] = setter; } structDecl.RemoveChild(property.Parent()); } } foreach (AEnrichmentDecl enrichment in data.Enrichments) { for (int i = 0; i < enrichment.GetDecl().Count; i++) { if (!(enrichment.GetDecl()[i] is APropertyDecl)) { continue; } APropertyDecl property = (APropertyDecl)enrichment.GetDecl()[i]; OldEnrichmentParents[property] = enrichment; if (property.GetGetter() != null) { AALocalDecl indexLocal = null; string methodName = "Get" + property.GetName().Text; if (property.GetName().Text == "") { methodName = "GetThis"; indexLocal = data.ArrayPropertyLocals[property][0]; } AMethodDecl getter = new AMethodDecl(new APublicVisibilityModifier(), null, property.GetStatic() == null ? null : (TStatic)property.GetStatic().Clone(), null, null, null, Util.MakeClone(property.GetType(), data), new TIdentifier(methodName, property.GetName().Line, 0), new ArrayList(), property.GetGetter()); if (indexLocal != null) { indexLocal.Parent().Parent().RemoveChild(indexLocal.Parent()); //data.Locals[(AABlock)getter.GetBlock()].Remove(indexLocal); getter.GetFormals().Insert(0, indexLocal); } enrichment.GetDecl().Insert(enrichment.GetDecl().IndexOf(property), getter); data.Getters[property] = getter; } if (property.GetSetter() != null) { AALocalDecl indexLocal = null; string methodName = "Set" + property.GetName().Text; if (property.GetName().Text == "") { methodName = "SetThis"; indexLocal = data.ArrayPropertyLocals[property][data.ArrayPropertyLocals[property].Length - 1]; } AALocalDecl valueLocal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, Util.MakeClone(property.GetType(), data), new TIdentifier("value"), null); AMethodDecl setter = new AMethodDecl(new APublicVisibilityModifier(), null, property.GetStatic() == null ? null : (TStatic)property.GetStatic().Clone(), null, null, null, new AVoidType(new TVoid("void")), new TIdentifier(methodName, property.GetName().Line, 0), new ArrayList() { valueLocal }, property.GetSetter()); if (indexLocal != null) { indexLocal.Parent().Parent().RemoveChild(indexLocal.Parent()); data.Locals[(AABlock)setter.GetBlock()].Remove(indexLocal); setter.GetFormals().Insert(0, indexLocal); } enrichment.GetDecl().Insert(enrichment.GetDecl().IndexOf(property), setter); setter.GetBlock().Apply(new FixValue(valueLocal, data)); data.Setters[property] = setter; } enrichment.RemoveChild(property); } } }