public static Statement FindFirstData(Statement stat) { if (stat.GetExprents() != null) { return(stat); } else if (stat.IsLabeled()) { // FIXME: Why?? return(null); } switch (stat.type) { case Statement.Type_Sequence: case Statement.Type_If: case Statement.Type_Root: case Statement.Type_Switch: case Statement.Type_Syncronized: { return(FindFirstData(stat.GetFirst())); } default: { return(null); } } }
public virtual void CollapseNodesToStatement(Statement stat) { Statement head = stat.GetFirst(); Statement post = stat.GetPost(); VBStyleCollection <Statement, int> setNodes = stat.GetStats(); // post edges if (post != null) { foreach (StatEdge edge in post.GetEdges(Statedge_Direct_All, Direction_Backward)) { if (stat.ContainsStatementStrict(edge.GetSource())) { edge.GetSource().ChangeEdgeType(Direction_Forward, edge, StatEdge.Type_Break); stat.AddLabeledEdge(edge); } } } // regular head edges foreach (StatEdge prededge in head.GetAllPredecessorEdges()) { if (prededge.GetType() != StatEdge.Type_Exception && stat.ContainsStatementStrict (prededge.GetSource())) { prededge.GetSource().ChangeEdgeType(Direction_Forward, prededge, StatEdge.Type_Continue ); stat.AddLabeledEdge(prededge); } head.RemovePredecessor(prededge); prededge.GetSource().ChangeEdgeNode(Direction_Forward, prededge, stat); stat.AddPredecessor(prededge); } if (setNodes.ContainsKey(first.id)) { first = stat; } // exception edges HashSet <Statement> setHandlers = new HashSet <Statement>(head.GetNeighbours(StatEdge .Type_Exception, Direction_Forward)); foreach (Statement node in setNodes) { setHandlers.UnionWith(node.GetNeighbours(StatEdge.Type_Exception, Direction_Forward )); } if (!(setHandlers.Count == 0)) { foreach (StatEdge edge in head.GetEdges(StatEdge.Type_Exception, Direction_Forward )) { Statement handler = edge.GetDestination(); if (setHandlers.Contains(handler)) { if (!setNodes.ContainsKey(handler.id)) { stat.AddSuccessor(new StatEdge(stat, handler, edge.GetExceptions())); } } } foreach (Statement node in setNodes) { foreach (StatEdge edge in node.GetEdges(StatEdge.Type_Exception, Direction_Forward )) { if (setHandlers.Contains(edge.GetDestination())) { node.RemoveSuccessor(edge); } } } } if (post != null && !stat.GetNeighbours(StatEdge.Type_Exception, Direction_Forward ).Contains(post)) { // TODO: second condition redundant? stat.AddSuccessor(new StatEdge(StatEdge.Type_Regular, stat, post)); } // adjust statement collection foreach (Statement st in setNodes) { stats.RemoveWithKey(st.id); } stats.AddWithKey(stat, stat.id); stat.SetAllParent(); stat.SetParent(this); stat.BuildContinueSet(); // monitorenter and monitorexit stat.BuildMonitorFlags(); if (stat.type == Type_Switch) { // special case switch, sorting leaf nodes ((SwitchStatement)stat).SortEdgesAndNodes(); } }
public override TextBuffer ToJava(int indent, BytecodeMappingTracer tracer) { TextBuffer buf = new TextBuffer(); buf.Append(ExprProcessor.ListToJava(varDefinitions, indent, tracer)); buf.Append(first.ToJava(indent, tracer)); if (IsLabeled()) { buf.AppendIndent(indent).Append("label").Append(this.id.ToString()).Append(":").AppendLineSeparator (); tracer.IncrementCurrentSourceLine(); } buf.AppendIndent(indent).Append(headexprent[0].ToJava(indent, tracer)).Append(" {" ).AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); if (ifstat == null) { bool semicolon = false; if (ifedge.@explicit) { semicolon = true; if (ifedge.GetType() == StatEdge.Type_Break) { // break buf.AppendIndent(indent + 1).Append("break"); } else { // continue buf.AppendIndent(indent + 1).Append("continue"); } if (ifedge.labeled) { buf.Append(" label").Append(ifedge.closure.id.ToString()); } } if (semicolon) { buf.Append(";").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); } } else { buf.Append(ExprProcessor.JmpWrapper(ifstat, indent + 1, true, tracer)); } bool elseif = false; if (elsestat != null) { if (elsestat.type == Statement.Type_If && (elsestat.varDefinitions.Count == 0) && (elsestat.GetFirst().GetExprents().Count == 0) && !elsestat.IsLabeled() && ((elsestat .GetSuccessorEdges(Statedge_Direct_All).Count == 0) || !elsestat.GetSuccessorEdges (Statedge_Direct_All)[0].@explicit)) { // else if buf.AppendIndent(indent).Append("} else "); TextBuffer content = ExprProcessor.JmpWrapper(elsestat, indent, false, tracer); content.SetStart(TextUtil.GetIndentString(indent).Length); buf.Append(content); elseif = true; } else { BytecodeMappingTracer else_tracer = new BytecodeMappingTracer(tracer.GetCurrentSourceLine () + 1); TextBuffer content = ExprProcessor.JmpWrapper(elsestat, indent + 1, false, else_tracer ); if (content.Length() > 0) { buf.AppendIndent(indent).Append("} else {").AppendLineSeparator(); tracer.SetCurrentSourceLine(else_tracer.GetCurrentSourceLine()); tracer.AddTracer(else_tracer); buf.Append(content); } } } if (!elseif) { buf.AppendIndent(indent).Append("}").AppendLineSeparator(); tracer.IncrementCurrentSourceLine(); } return(buf); }