/*public override void InAMethodDecl(AMethodDecl node) * { * AABlock block = (AABlock) node.GetBlock(); * if (block != null) * { * if (!data.Locals.ContainsKey(block)) * data.Locals.Add(block, new List<AALocalDecl>()); * foreach (AALocalDecl formal in node.GetFormals()) * { * data.Locals[block].Add(formal); * } * } * } * * public override void InAConstructorDecl(AConstructorDecl node) * { * AABlock block = (AABlock)node.GetBlock(); * if (block != null) * { * if (!data.Locals.ContainsKey(block)) * data.Locals.Add(block, new List<AALocalDecl>()); * foreach (AALocalDecl formal in node.GetFormals()) * { * data.Locals[block].Add(formal); * } * } * }*/ public override void OutAMethodDecl(AMethodDecl node) { AStructDecl parentStruct = Util.GetAncestor <AStructDecl>(node); AEnrichmentDecl parentEnrichment = Util.GetAncestor <AEnrichmentDecl>(node); if (parentStruct != null) { //Struct method data.StructMethods[parentStruct].Add(node); } else if (parentEnrichment == null) {//Global method //Dont care about abstract methods - will add them later if (node.GetBlock() != null || node.GetNative() != null) { data.Methods.Add(new SharedData.DeclItem <AMethodDecl>(currentSourceFile, node)); data.UserMethods.Add(node); } else if (node.GetDelegate() != null) { data.Delegates.Add(new SharedData.DeclItem <AMethodDecl>(currentSourceFile, node)); } else { node.Parent().RemoveChild(node); return; } } base.OutAMethodDecl(node); }
public override void CaseAMethodDecl(AMethodDecl node) { if (node.GetInline() != null) { bool canAlwaysInline = true; foreach (KeyValuePair <ASimpleInvokeExp, AMethodDecl> pair in data.SimpleMethodLinks) { if (pair.Value == node && !Util.HasAncestor <AABlock>(pair.Key)) { canAlwaysInline = false; break; } } if (canAlwaysInline) { node.Parent().RemoveChild(node); if (finalTrans.data.Methods.Any(item => item.Decl == node)) { finalTrans.data.Methods.Remove(finalTrans.data.Methods.First(item => item.Decl == node)); } } } else { base.CaseAMethodDecl(node); } }
public override void CaseAMethodDecl(AMethodDecl node) { if (node.GetNative() == null && node.GetBlock() == null) { return; } if (node.GetStatic() != null) { return; } string inputStr = "native " + TypeToString(node.GetReturnType()) + " " + node.GetName().Text + "("; bool first = true; foreach (AALocalDecl formal in node.GetFormals()) { if (!first) { inputStr += ", "; } inputStr += TypeToString(formal.GetType()) + " " + formal.GetName().Text; first = false; } inputStr += ");"; writer.WriteLine(inputStr); AStructDecl str = Util.GetAncestor <AStructDecl>(node); List <AMethodDecl> methodList; if (str != null) { methodList = StructMethods[str]; } else { methodList = Methods; } string sig = Util.GetMethodSignature(node); if (methodList.Any(otherMethod => Util.GetMethodSignature(otherMethod) == sig)) { return; } methodList.Add(node); node.SetBlock(null); node.Parent().RemoveChild(node); }
public MethodDescription(AMethodDecl method) { Parser parser = new Parser(method); Start = parser.Start; End = parser.End; ReturnType = parser.ReturnType; Name = parser.Name; Formals = parser.Formals; Locals = parser.Locals; if (method.Parent() != null) { method.Parent().RemoveChild(method); } IsDelegate = method.GetDelegate() != null; //if (!IsDelegate) Decl = method; IsStatic = method.GetStatic() != null; Visibility = method.GetVisibilityModifier(); realType = (PType)method.GetReturnType().Clone(); Position = TextPoint.FromCompilerCoords(method.GetName()); }
public static void Parse(FinalTransformations finalTrans) { SharedData data = finalTrans.data; for (int i = 0; i < data.Methods.Count; i++) { for (int j = i + 1; j < data.Methods.Count; j++) { AMethodDecl m1 = data.Methods[i].Decl; AMethodDecl m2 = data.Methods[j].Decl; bool switched = false; if (finalTrans.mainEntry == m1 || m1.GetTrigger() != null) { if (finalTrans.mainEntry == m2 || m2.GetTrigger() != null) { continue; } } else if (finalTrans.mainEntry == m2 || m2.GetTrigger() != null) { AMethodDecl temp = m1; m1 = m2; m2 = temp; switched = true; } MergeSameMethods merger = new MergeSameMethods(m2, data); m1.Apply(merger); if (merger.canMerge) { merger.otherNode = m1; m2.Apply(merger); if (merger.canMerge) { var arr = data.SimpleMethodLinks.ToArray(); foreach (KeyValuePair <ASimpleInvokeExp, AMethodDecl> link in arr) { if (link.Value == m2) { data.SimpleMethodLinks[link.Key] = m1; link.Key.SetName(new TIdentifier(m1.GetName().Text)); } } m2.Parent().RemoveChild(m2); if (switched) { data.Methods.RemoveAt(i); i--; break; } else { data.Methods.RemoveAt(j); j--; continue; } } } } } }
//private List<ErrorCollection.Error> multipleEntryCandidates = new List<ErrorCollection.Error>(); public override void CaseAMethodDecl(AMethodDecl node) { //Done in a previous iteration /*if (node.GetName().Text == "InitMap" && node.GetFormals().Count == 0) * { * if (finalTrans.multipleMainEntries) * { * multipleEntryCandidates.Add(new ErrorCollection.Error(node.GetName(), Util.GetAncestor<AASourceFile>(node.GetName()), "Candidate")); * } * else if (finalTrans.mainEntry != null) * { * multipleEntryCandidates.Add(new ErrorCollection.Error(finalTrans.mainEntry.GetName(), Util.GetAncestor<AASourceFile>(finalTrans.mainEntry.GetName()), "Candidate")); * multipleEntryCandidates.Add(new ErrorCollection.Error(node.GetName(), Util.GetAncestor<AASourceFile>(node.GetName()), "Candidate")); * //finalTrans.errors.Add(new ErrorCollection.Error(node.GetName(), Util.GetAncestor<AASourceFile>(node), "Found multiple candidates for a main entry", true)); * finalTrans.multipleMainEntries = true; * finalTrans.mainEntry = null; * } * else * finalTrans.mainEntry = node; * }*/ AStructDecl str = Util.GetAncestor <AStructDecl>(node); if (str != null) { if (node.GetStatic() == null) { structMethods.Add(node); } //Move the method outside the struct str.RemoveChild(node.Parent()); AASourceFile file = (AASourceFile)str.Parent(); int i = file.GetDecl().IndexOf(str); file.GetDecl().Insert(i /* + 1*/, node); node.GetName().Text = GetUniqueStructMethodName(str.GetName().Text + "_" + node.GetName().Text); if (node.GetStatic() == null) { //Add the struct as a parameter PType structType = new ANamedType(new TIdentifier(str.GetName().Text), null); finalTrans.data.StructTypeLinks[(ANamedType)structType] = str; if (str.GetClassToken() != null) { structType = new APointerType(new TStar("*"), structType); } structFormal = new AALocalDecl(new APublicVisibilityModifier(), null, str.GetClassToken() == null ? new TRef("ref") : null, null, null, structType, new TIdentifier("currentStruct", node.GetName().Line, node.GetName().Pos), null); node.GetFormals().Add(structFormal); data.Locals[(AABlock)node.GetBlock()].Add(structFormal); } else { node.SetStatic(null); } finalTrans.data.Methods.Add(new SharedData.DeclItem <AMethodDecl>(file, node)); if (node.GetStatic() == null) { OldParentStruct[node] = str; } //Fix refferences to other struct stuff); base.CaseAMethodDecl(node); //Will visit later, since it's added after the struct //base.CaseAMethodDecl(node); //if (str.GetLocals().Count == 0) // str.Parent().RemoveChild(str); return; } AEnrichmentDecl enrichment = Util.GetAncestor <AEnrichmentDecl>(node); if (enrichment != null) { if (node.GetStatic() == null) { structMethods.Add(node); } //Move the method outside the struct enrichment.RemoveChild(node); AASourceFile file = (AASourceFile)enrichment.Parent(); int i = file.GetDecl().IndexOf(enrichment); file.GetDecl().Insert(i /* + 1*/, node); node.GetName().Text = GetUniqueStructMethodName(Util.TypeToIdentifierString(enrichment.GetType()) + "_" + node.GetName().Text); if (node.GetStatic() == null) { //Add the struct as a parameter PType structType = Util.MakeClone(enrichment.GetType(), finalTrans.data); structFormal = new AALocalDecl(new APublicVisibilityModifier(), null, new TRef("ref"), null, null, structType, new TIdentifier("currentEnrichment", node.GetName().Line, node.GetName().Pos), null); node.GetFormals().Add(structFormal); } finalTrans.data.Methods.Add(new SharedData.DeclItem <AMethodDecl>(file, node)); //Fix refferences to other struct stuff); base.CaseAMethodDecl(node); //Will visit later, since it's added after the struct //base.CaseAMethodDecl(node); //if (str.GetLocals().Count == 0) // str.Parent().RemoveChild(str); return; } //Build a list of overloads List <AMethodDecl> overloads = new List <AMethodDecl>(); List <string> prefixMatches = new List <string>(); foreach (SharedData.DeclItem <AMethodDecl> declItem in finalTrans.data.Methods) { if (!Util.IsSameNamespace(declItem.Decl, node)) { continue; } if (declItem.Decl.GetName().Text == node.GetName().Text) { overloads.Add(declItem.Decl); } if (declItem.Decl.GetName().Text.StartsWith(node.GetName().Text + "O")) { prefixMatches.Add(declItem.Decl.GetName().Text); } } foreach (AMethodDecl method in finalTrans.data.Libraries.Methods) { if (method.GetBlock() != null || method.GetNative() != null) { if (method.GetName().Text == node.GetName().Text) { overloads.Add(method); } if (method.GetName().Text.StartsWith(node.GetName().Text + "O")) { prefixMatches.Add(method.GetName().Text); } } } //Add fields foreach (SharedData.DeclItem <AFieldDecl> declItem in finalTrans.data.Fields) { if (declItem.Decl.GetName().Text.StartsWith(node.GetName().Text + "O")) { prefixMatches.Add(declItem.Decl.GetName().Text); } } foreach (AFieldDecl field in finalTrans.data.Libraries.Fields) { if (field.GetName().Text.StartsWith(node.GetName().Text + "O")) { prefixMatches.Add(field.GetName().Text); } } //Dont want to hit another method by appending O# string postfix = ""; while (true) { postfix += "O"; if (prefixMatches.Any(text => text.StartsWith(node.GetName().Text + postfix))) { continue; } break; } if (overloads.Count > 1) { int i = 0; foreach (AMethodDecl method in overloads) { if (node == finalTrans.mainEntry || (node.GetTrigger() != null && finalTrans.data.HasUnknownTrigger)) { continue; } i++; method.GetName().Text += postfix + i; } } if (node != finalTrans.mainEntry && (node.GetTrigger() == null || !finalTrans.data.HasUnknownTrigger)) { node.GetName().Text = namespacePrefix + node.GetName().Text; } base.CaseAMethodDecl(node); }