本文整理汇总了C#中Galaxy_Editor_2.Compiler.Generated.node.AMethodDecl.GetBlock方法的典型用法代码示例。如果您正苦于以下问题:C# AMethodDecl.GetBlock方法的具体用法?C# AMethodDecl.GetBlock怎么用?C# AMethodDecl.GetBlock使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Galaxy_Editor_2.Compiler.Generated.node.AMethodDecl
的用法示例。
在下文中一共展示了AMethodDecl.GetBlock方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Create
public static ControlFlowGraph Create(AMethodDecl method)
{
ControlFlowGraph graph = new ControlFlowGraph(method);
CFGGenerator generator = new CFGGenerator();
method.GetBlock().Apply(generator);
graph.Nodes = new List<Node>(generator.Nodes.Count);
graph.Nodes.AddRange(generator.Nodes);
return graph;
}
示例2: CaseAMethodDecl
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);
}
示例3: Analyze
private void Analyze(AMethodDecl method)
{
MethodAnalyzer analyzer = new MethodAnalyzer(method, Methods, data);
method.GetBlock().Apply(this);
Methods[method] = analyzer.SafeData;
/* List of safe variables after each statement
* While statements need a list for first statement in the while, and a list for first statement after the while
* Also need to account for break and continue statments
* If statements need a list for then then branch, and one for the else branch.
*
* CFG:
* Join(v):
* First, set safeList = intersection(pred(stm))
* Parse through expression, do the folloing in the order you get out of nodes
* pointerLvalue: If unsafe, make a test, and restart check ///NO, its an iterative build. do this after
* delete: clear safeList, safeIfTrue and safeIfFalse
* p == null: if p is a pointer, add p to a safeIfTrue list
* p != null: if p is a pointer, add p to a safeIfFalse list
* !<exp>: swap safeIfTrue and safeIfFalse lists
* <exp> || <exp>: intersection between left and right safeIfTrue list
* <exp> && <exp>: intersection between left and right safeIfFalse list
*
* if stm: thenList = safeList U safeIfTrue
* afterList = safeList U safeIfFalse
* if-else stm: thenList = safeList U safeIfTrue
* elseList = safeList U safeIfFalse
* while stm: thenList = safeList U safeIfTrue
*
*
* Problem: if something is safe before a while, it currently can't become safe in the while, since it will not initially be safe at the end of the while.
*
*
*
* -------------------------------
*
* List of unsafe variables after each CFG node.
*
* Preprocess step: List of all used variables (Base: Field/Local, Others:Pointer/StructField)
*
* All those variables are unsafe before first statment
*
*
* Join(v):
*
*
*/
}
示例4: CaseAMethodDecl
public override void CaseAMethodDecl(AMethodDecl node)
{
InAMethodDecl(node);
if (node.GetBlock() != null)
{
node.GetBlock().Apply(this);
}
{
Object[] temp = new Object[node.GetFormals().Count];
node.GetFormals().CopyTo(temp, 0);
for (int i = temp.Length - 1; i >= 0; i--)
{
((PLocalDecl)temp[i]).Apply(this);
}
}
if (node.GetName() != null)
{
node.GetName().Apply(this);
}
if (node.GetReturnType() != null)
{
node.GetReturnType().Apply(this);
}
if (node.GetDelegate() != null)
{
node.GetDelegate().Apply(this);
}
if (node.GetInline() != null)
{
node.GetInline().Apply(this);
}
if (node.GetNative() != null)
{
node.GetNative().Apply(this);
}
if (node.GetStatic() != null)
{
node.GetStatic().Apply(this);
}
if (node.GetTrigger() != null)
{
node.GetTrigger().Apply(this);
}
if (node.GetVisibilityModifier() != null)
{
node.GetVisibilityModifier().Apply(this);
}
OutAMethodDecl(node);
}
示例5: OutAMethodDecl
public override void OutAMethodDecl(AMethodDecl node)
{
//If void return is missing, insert it.
if (node.GetReturnType() is AVoidType && node.GetBlock() != null)
{
AABlock block = (AABlock)node.GetBlock();
bool insertReturn = false;
while (true)
{
if (block.GetStatements().Count == 0)
{
insertReturn = true;
break;
}
PStm lastStm = (PStm)block.GetStatements()[block.GetStatements().Count - 1];
if (lastStm is AVoidReturnStm)
break;
if (lastStm is ABlockStm)
{
block = (AABlock)((ABlockStm)block.GetStatements()[block.GetStatements().Count - 1]).GetBlock();
continue;
}
insertReturn = true;
break;
}
if (insertReturn)
{
block.GetStatements().Add(new AVoidReturnStm(new TReturn("return", block.GetToken().Line, block.GetToken().Pos)));
}
}
//Check if delegate is valid
if (node.GetDelegate() != null)
{
if (node.GetBlock() != null)
errors.Add(new ErrorCollection.Error(node.GetDelegate(), currentSourceFile, LocRM.GetString("ErrorText195")));
if (node.GetInline() != null)
errors.Add(new ErrorCollection.Error(node.GetDelegate(), currentSourceFile, LocRM.GetString("ErrorText196")));
if (node.GetTrigger() != null)
errors.Add(new ErrorCollection.Error(node.GetDelegate(), currentSourceFile, LocRM.GetString("ErrorText197")));
if (node.GetStatic() != null)
errors.Add(new ErrorCollection.Error(node.GetDelegate(), currentSourceFile, LocRM.GetString("ErrorText198")));
if (node.GetNative() != null)
errors.Add(new ErrorCollection.Error(node.GetDelegate(), currentSourceFile, LocRM.GetString("ErrorText199")));
}
//If it's protected, it must be in a struct
if (!Util.HasAncestor<AStructDecl>(node))
{
if (node.GetVisibilityModifier() is AProtectedVisibilityModifier)
errors.Add(new ErrorCollection.Error(node.GetName(),
LocRM.GetString("ErrorText200")));
}
base.OutAMethodDecl(node);
}
示例6: OutAMethodDecl
public override void OutAMethodDecl(AMethodDecl node)
{
if (node.GetTrigger() != null)
{
bool validSignature = IsBoolType(node.GetReturnType());
validSignature &= node.GetFormals().Count == 2;
foreach (AALocalDecl formal in node.GetFormals())
{
validSignature &= IsBoolType(formal.GetType());
validSignature &= formal.GetRef() == null && formal.GetOut() == null;
}
if (!validSignature)
{
errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile,
LocRM.GetString("ErrorText156")));
}
}
//Check that all code paths return a value
if (!(node.GetReturnType() is AVoidType))
{
CheckReturns returnChecker = new CheckReturns();
node.GetBlock().Apply(returnChecker);
if (!returnChecker.Returned)
{
errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText157")));
}
}
//If the return type or the type of any formals is a private struct, and the method is a public context, give an error
{
AStructDecl pStruct = Util.GetAncestor<AStructDecl>(node);
//Is public context
if (pStruct == null && node.GetVisibilityModifier() is APublicVisibilityModifier ||
pStruct != null && pStruct.GetVisibilityModifier() is APublicVisibilityModifier && !(node.GetVisibilityModifier() is APrivateVisibilityModifier))
{
PType type = node.GetReturnType();
int i = 0;
FindPrivateTypes finder = new FindPrivateTypes(data);
while (true)
{
type.Apply(finder);
if (i == node.GetFormals().Count)
break;
AALocalDecl formal = (AALocalDecl) node.GetFormals()[i];
type = formal.GetType();
i++;
}
if (finder.PrivateTypes.Count > 0)
{
List<ErrorCollection.Error> subErrors = new List<ErrorCollection.Error>();
List<PDecl> usedDecls = new List<PDecl>();
foreach (ANamedType namedType in finder.PrivateTypes)
{
if (data.StructTypeLinks.ContainsKey(namedType))
{
AStructDecl decl = data.StructTypeLinks[namedType];
if (usedDecls.Contains(decl))
continue;
usedDecls.Add(decl);
subErrors.Add(new ErrorCollection.Error(decl.GetName(), LocRM.GetString("ErrorText64")));
}
else if (data.DelegateTypeLinks.ContainsKey(namedType))
{
AMethodDecl decl = data.DelegateTypeLinks[namedType];
if (usedDecls.Contains(decl))
continue;
usedDecls.Add(decl);
subErrors.Add(new ErrorCollection.Error(decl.GetName(), LocRM.GetString("ErrorText154")));
}
}
errors.Add(new ErrorCollection.Error(node.GetName(), LocRM.GetString("ErrorText155"), false, subErrors.ToArray()));
}
}
}
base.OutAMethodDecl(node);
}
示例7: foreach
/*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);
}
示例8: CaseAMethodDecl
public override void CaseAMethodDecl(AMethodDecl node)
{
Write("\n");
if (node.GetStatic() != null) Write("static ");
if (node.GetNative() != null) Write("native ");
node.GetReturnType().Apply(this);
Write(" " + node.GetName().Text + "(");
bool first = true;
foreach (AALocalDecl formal in node.GetFormals())
{
if (!first) Write(", ");
formal.Apply(this);
first = false;
}
if (node.GetBlock() != null)
{
Write(")\n");
node.GetBlock().Apply(this);
}
else
Write(");\n\n");
}
示例9: CaseAMethodDecl
//.........这里部分代码省略.........
declStm.ReplaceBy(expStm);
finalTrans.data.LvalueTypes[lvalue] = replacement.GetType();
finalTrans.data.ExpTypes[exp] = replacement.GetType();
finalTrans.data.LocalLinks[lvalue] = replacement;
}
}
}
}
//Unique names
List<string> names = new List<string>();
//Avoid clash with methods/fields/structs
names.AddRange(finalTrans.data.Methods.Select(declItem => declItem.Decl.GetName().Text));
names.AddRange(finalTrans.data.Fields.Select(declItem => declItem.Decl.GetName().Text));
names.AddRange(finalTrans.data.Structs.Select(declItem => declItem.Decl.GetName().Text));
foreach (AALocalDecl local in definedLocals)
{
string name = local.GetName().Text;
int version = 1;
while (names.Contains(name))
{
version++;
name = local.GetName().Text + version;
}
local.GetName().Text = name;
names.Add(name);
}
//Move defined locals to the start of the method
foreach (AALocalDecl formal in node.GetFormals())
{
definedLocals.Remove(formal);
}
AABlock block = (AABlock)node.GetBlock();
for (int i = 0; i < block.GetStatements().Count; i++)
{
ALocalDeclStm stm;
if (block.GetStatements()[i] is ALocalDeclStm)
{
stm = (ALocalDeclStm)block.GetStatements()[i];
definedLocals.Remove((AALocalDecl)stm.GetLocalDecl());
continue;
}
//Add the rest at i
if (definedLocals.Count == 0)
break;
AALocalDecl decl = definedLocals[0];
definedLocals.RemoveAt(0);
if (decl.GetInit() == null)
{
ALocalLvalue lvalue = new ALocalLvalue(new TIdentifier(decl.GetName().Text));
finalTrans.data.LocalLinks[lvalue] = decl;
finalTrans.data.LvalueTypes[lvalue] = decl.GetType();
List<PStm> statements = AssignDefault(lvalue);
PStm pStm = Util.GetAncestor<PStm>(decl);
AABlock pBlock = (AABlock) pStm.Parent();
foreach (PStm statement in statements)
{
pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(pStm), statement);
}
pBlock.RemoveChild(pStm);
}
else
{
//Make an assignment expression before moving
示例10: OutAMethodDecl
public override void OutAMethodDecl(AMethodDecl node)
{
//If void return is missing, insert it.
if (node.GetReturnType() is AVoidType && node.GetBlock() != null)
{
AABlock block = (AABlock)node.GetBlock();
bool insertReturn = false;
while (true)
{
if (block.GetStatements().Count == 0)
{
insertReturn = true;
break;
}
PStm lastStm = (PStm)block.GetStatements()[block.GetStatements().Count - 1];
if (lastStm is AVoidReturnStm)
break;
if (lastStm is ABlockStm)
{
block = (AABlock)((ABlockStm)block.GetStatements()[block.GetStatements().Count - 1]).GetBlock();
continue;
}
insertReturn = true;
break;
}
if (insertReturn)
{
block.GetStatements().Add(new AVoidReturnStm(new TReturn("return", block.GetToken().Line, block.GetToken().Pos)));
}
}
base.OutAMethodDecl(node);
}
示例11: Parse
/*
* 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
//.........这里部分代码省略.........
示例12: CaseAConstructorDecl
public override void CaseAConstructorDecl(AConstructorDecl node)
{
AStructDecl str = Util.GetAncestor<AStructDecl>(node);
AEnrichmentDecl enrichment = Util.GetAncestor<AEnrichmentDecl>(node);
AMethodDecl replacer = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new AVoidType(new TVoid("void")),
node.GetName(), new ArrayList(), node.GetBlock());
replacer.GetName().Text += "_Constructor";
while (node.GetFormals().Count > 0)
{
replacer.GetFormals().Add(node.GetFormals()[0]);
}
//Move the method outside the struct
AASourceFile file = Util.GetAncestor<AASourceFile>(node);
if (str != null)
str.RemoveChild(node.Parent());
else
enrichment.RemoveChild(node);
int i = file.GetDecl().IndexOf(str ?? (PDecl)enrichment);
file.GetDecl().Insert(i/* + 1*/, replacer);
//Add the struct as a parameter
PType type;
if (str != null)
{
ANamedType structType = new ANamedType(new TIdentifier(str.GetName().Text), null);
finalTrans.data.StructTypeLinks[structType] = str;
type = structType;
}
else
{
type = Util.MakeClone(enrichment.GetType(), finalTrans.data);
}
finalTrans.data.ConstructorMap[node] = replacer;
structFormal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new APointerType(new TStar("*"), type), new TIdentifier("currentStruct", replacer.GetName().Line, replacer.GetName().Pos), null);
replacer.GetFormals().Add(structFormal);
finalTrans.data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(file, replacer));
//Add return stm
replacer.SetReturnType(new APointerType(new TStar("*"), Util.MakeClone(type, data)));
replacer.Apply(new TransformConstructorReturns(structFormal, data));
//Insert call to base constructor););
if (finalTrans.data.ConstructorBaseLinks.ContainsKey(node))
{
AMethodDecl baseConstructor = finalTrans.data.ConstructorMap[finalTrans.data.ConstructorBaseLinks[node]];
ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier(baseConstructor.GetName().Text), new ArrayList());
while (node.GetBaseArgs().Count > 0)
{
invoke.GetArgs().Add(node.GetBaseArgs()[0]);
}
AThisLvalue thisLvalue1 = new AThisLvalue(new TThis("this"));
ALvalueExp thisExp1 = new ALvalueExp(thisLvalue1);
invoke.GetArgs().Add(thisExp1);
AThisLvalue thisLvalue2 = new AThisLvalue(new TThis("this"));
AAssignmentExp assignExp = new AAssignmentExp(new TAssign("="), thisLvalue2, invoke);
ANamedType structType = new ANamedType(new TIdentifier(str.GetName().Text), null);
finalTrans.data.StructTypeLinks[structType] = str;
finalTrans.data.LvalueTypes[thisLvalue1] =
finalTrans.data.LvalueTypes[thisLvalue2] =
finalTrans.data.ExpTypes[thisExp1] =
finalTrans.data.ExpTypes[assignExp] =
finalTrans.data.ExpTypes[invoke] = new APointerType(new TStar("*"), structType);
//finalTrans.data.ExpTypes[invoke] = new AVoidType(new TVoid("void"));
finalTrans.data.SimpleMethodLinks[invoke] = baseConstructor;
((AABlock)replacer.GetBlock()).GetStatements().Insert(0, new AExpStm(new TSemicolon(";"), assignExp));
//Inline if base and current are two different kinds of pointer types (int/string)
AStructDecl baseStruct = null;
AConstructorDecl baseC = finalTrans.data.ConstructorBaseLinks[node];
foreach (KeyValuePair<AStructDecl, List<AConstructorDecl>> pair in finalTrans.data.StructConstructors)
{
bool found = false;
foreach (AConstructorDecl decl in pair.Value)
{
if (baseC == decl)
{
found = true;
break;
}
}
if (found)
{
baseStruct = pair.Key;
break;
}
}
if ((str.GetIntDim() == null) != (baseStruct.GetIntDim() == null))
{
//For the inilining, change the type to the type of the caller
AALocalDecl lastFormal = baseConstructor.GetFormals().OfType<AALocalDecl>().Last();
lastFormal.SetRef(new TRef("ref"));
APointerType oldType = (APointerType) lastFormal.GetType();
structType = new ANamedType(new TIdentifier(str.GetName().Text), null);
//.........这里部分代码省略.........
示例13: CaseAMethodDecl
//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)
//.........这里部分代码省略.........
示例14: Parse
public static bool Parse(AMethodDecl method, SharedData data)
{
RemoveSelfAssignments remover = new RemoveSelfAssignments(data);
method.GetBlock().Apply(remover);
return remover.changedSomething;
}