From ba17b0df273c87edf30151f3c470780cdf5f997e Mon Sep 17 00:00:00 2001 From: Mike Mazur Date: Wed, 23 Jul 2008 02:51:45 +0000 Subject: First version of position mapping between LSL <-> C# implemented. --- .../Shared/CodeTools/CSCodeGenerator.cs | 357 ++++++++++++++------- 1 file changed, 246 insertions(+), 111 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/CodeTools') diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs index 7d7384e..3bdad4d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs @@ -35,56 +35,89 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools public class CSCodeGenerator : ICodeConverter { private SYMBOL m_astRoot = null; - private int m_braceCount; // for indentation + private Dictionary, KeyValuePair> m_positionMap; + private int m_indentWidth = 4; // for indentation + private int m_braceCount; // for indentation + private int m_CSharpLine; // the current line of generated C# code + private int m_CSharpCol; // the current column of generated C# code /// - /// Pass the new CodeGenerator a string containing the LSL source. + /// Creates an 'empty' CSCodeGenerator instance. /// - /// String containing LSL source. public CSCodeGenerator() { + ResetCounters(); } /// - /// Pass the new CodeGenerator an abstract syntax tree. + /// Get the mapping between LSL and C# line/column number. /// - /// The root node of the AST. - public CSCodeGenerator(SYMBOL astRoot) + /// Dictionary\, KeyValuePair\\>. + public Dictionary, KeyValuePair> PositionMap + { + get { return m_positionMap; } + } + + /// + /// Get the mapping between LSL and C# line/column number. + /// + /// SYMBOL pointing to root of the abstract syntax tree. + public SYMBOL ASTRoot + { + get { return m_astRoot; } + } + + /// + /// Resets various counters and metadata. + /// + private void ResetCounters() { m_braceCount = 0; - m_astRoot = astRoot; + m_CSharpLine = 0; + m_CSharpCol = 1; + m_positionMap = new Dictionary, KeyValuePair>(); + m_astRoot = null; } /// /// Generate the code from the AST we have. /// + /// The LSL source as a string. /// String containing the generated C# code. public string Convert(string script) { + ResetCounters(); Parser p = new LSLSyntax(new yyLSLSyntax(), new ErrorHandler(true)); // Obviously this needs to be in a try/except block. LSL2CSCodeTransformer codeTransformer = new LSL2CSCodeTransformer(p.Parse(script)); m_astRoot = codeTransformer.Transform(); + string retstr = String.Empty; // standard preamble - //retstr = "using OpenSim.Region.ScriptEngine.Common;\n"; - //retstr += "using System.Collections.Generic;\n\n"; - //retstr += "namespace SecondLife\n"; - //retstr += "{\n"; - //retstr += " public class Script : OpenSim.Region.ScriptEngine.Common\n"; - //retstr += " {\n"; + //retstr = GenerateLine("using OpenSim.Region.ScriptEngine.Common;"); + //retstr += GenerateLine("using System.Collections.Generic;"); + //retstr += GenerateLine(""); + //retstr += GenerateLine("namespace SecondLife"); + //retstr += GenerateLine("{"); + m_braceCount++; + //retstr += GenerateIndentedLine("public class Script : OpenSim.Region.ScriptEngine.Common"); + //retstr += GenerateIndentedLine("{"); + m_braceCount++; + + // line number + m_CSharpLine += 3; // here's the payload - m_braceCount += 2; - retstr += "\n"; + retstr += GenerateLine(); foreach (SYMBOL s in m_astRoot.kids) retstr += GenerateNode(s); // close braces! - //retstr += " }\n"; - //retstr += "}\n"; - m_braceCount -= 2; + m_braceCount--; + //retstr += GenerateIndentedLine("}"); + m_braceCount--; + //retstr += GenerateLine("}"); return retstr; } @@ -155,11 +188,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools else if (s is Constant) retstr += GenerateConstant((Constant) s); else if (s is IdentDotExpression) - retstr += ((IdentDotExpression) s).Name + "." + ((IdentDotExpression) s).Member; + retstr += Generate(((IdentDotExpression) s).Name + "." + ((IdentDotExpression) s).Member, s); else if (s is IdentExpression) - retstr += ((IdentExpression) s).Name; + retstr += Generate(((IdentExpression) s).Name, s); else if (s is IDENT) - retstr += ((TOKEN) s).yytext; + retstr += Generate(((TOKEN) s).yytext, s); else { foreach (SYMBOL kid in s.kids) @@ -188,13 +221,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools else remainingKids.Add(kid); - retstr += WriteIndented(String.Format("{0} {1}(", gf.ReturnType, gf.Name)); + retstr += GenerateIndented(String.Format("{0} {1}(", gf.ReturnType, gf.Name), gf); // print the state arguments, if any foreach (SYMBOL kid in argumentDeclarationListKids) retstr += GenerateArgumentDeclarationList((ArgumentDeclarationList) kid); - retstr += ")\n"; + retstr += GenerateLine(")"); foreach (SYMBOL kid in remainingKids) retstr += GenerateNode(kid); @@ -215,7 +248,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools { retstr += Indent(); retstr += GenerateNode(s); - retstr += ";\n"; + retstr += GenerateLine(";"); } return retstr; @@ -233,8 +266,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools foreach (SYMBOL kid in s.kids) if (kid is StateEvent) retstr += GenerateStateEvent((StateEvent) kid, s.Name); - else - retstr += String.Format("ERROR: State '{0}' contains a '{1}\n", s.Name, kid.GetType()); return retstr; } @@ -260,13 +291,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools remainingKids.Add(kid); // "state" (function) declaration - retstr += WriteIndented(String.Format("public void {0}_event_{1}(", parentStateName, se.Name)); + retstr += GenerateIndented(String.Format("public void {0}_event_{1}(", parentStateName, se.Name), se); // print the state arguments, if any foreach (SYMBOL kid in argumentDeclarationListKids) retstr += GenerateArgumentDeclarationList((ArgumentDeclarationList) kid); - retstr += ")\n"; + retstr += GenerateLine(")"); foreach (SYMBOL kid in remainingKids) retstr += GenerateNode(kid); @@ -278,7 +309,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for an ArgumentDeclarationList node. /// /// The ArgumentDeclarationList node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for ArgumentDeclarationList adl. private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl) { string retstr = String.Empty; @@ -287,9 +318,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools foreach (Declaration d in adl.kids) { - retstr += String.Format("{0} {1}", d.Datatype, d.Id); + retstr += Generate(String.Format("{0} {1}", d.Datatype, d.Id), d); if (0 < comma--) - retstr += ", "; + retstr += Generate(", "); } return retstr; @@ -299,7 +330,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for an ArgumentList node. /// /// The ArgumentList node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for ArgumentList al. private string GenerateArgumentList(ArgumentList al) { string retstr = String.Empty; @@ -310,7 +341,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools { retstr += GenerateNode(s); if (0 < comma--) - retstr += ", "; + retstr += Generate(", "); } return retstr; @@ -320,13 +351,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a CompoundStatement node. /// /// The CompoundStatement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for CompoundStatement cs. private string GenerateCompoundStatement(CompoundStatement cs) { string retstr = String.Empty; // opening brace - retstr += WriteIndentedLine("{"); + retstr += GenerateIndentedLine("{"); m_braceCount++; foreach (SYMBOL kid in cs.kids) @@ -334,7 +365,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools // closing brace m_braceCount--; - retstr += WriteIndentedLine("}"); + retstr += GenerateIndentedLine("}"); return retstr; } @@ -343,17 +374,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a Declaration node. /// /// The Declaration node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for Declaration d. private string GenerateDeclaration(Declaration d) { - return String.Format("{0} {1}", d.Datatype, d.Id); + return Generate(String.Format("{0} {1}", d.Datatype, d.Id), d); } /// /// Generates the code for a Statement node. /// /// The Statement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for Statement s. private string GenerateStatement(Statement s) { string retstr = String.Empty; @@ -367,7 +398,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools retstr += GenerateNode(kid); if (printSemicolon) - retstr += ";\n"; + retstr += GenerateLine(";"); return retstr; } @@ -376,13 +407,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for an Assignment node. /// /// The Assignment node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for Assignment a. private string GenerateAssignment(Assignment a) { string retstr = String.Empty; retstr += GenerateNode((SYMBOL) a.kids.Pop()); - retstr +=String.Format(" {0} ", a.AssignmentType); + retstr += Generate(String.Format(" {0} ", a.AssignmentType), a); foreach (SYMBOL kid in a.kids) retstr += GenerateNode(kid); @@ -393,12 +424,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a ReturnStatement node. /// /// The ReturnStatement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for ReturnStatement rs. private string GenerateReturnStatement(ReturnStatement rs) { string retstr = String.Empty; - retstr += "return "; + retstr += Generate("return ", rs); foreach (SYMBOL kid in rs.kids) retstr += GenerateNode(kid); @@ -410,34 +441,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a JumpLabel node. /// /// The JumpLabel node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for JumpLabel jl. private string GenerateJumpLabel(JumpLabel jl) { - return String.Format("{0}:\n", jl.LabelName); + return Generate(String.Format("{0}:\n", jl.LabelName), jl); } /// /// Generates the code for a JumpStatement node. /// /// The JumpStatement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for JumpStatement js. private string GenerateJumpStatement(JumpStatement js) { - return String.Format("goto {0}", js.TargetName); + return Generate(String.Format("goto {0}", js.TargetName), js); } /// - /// Generates the code for a IfStatement node. + /// Generates the code for an IfStatement node. /// /// The IfStatement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for IfStatement ifs. private string GenerateIfStatement(IfStatement ifs) { string retstr = String.Empty; - retstr += WriteIndented("if ("); + retstr += GenerateIndented("if (", ifs); retstr += GenerateNode((SYMBOL) ifs.kids.Pop()); - retstr += ")\n"; + retstr += GenerateLine(")"); // CompoundStatement handles indentation itself but we need to do it // otherwise. @@ -448,7 +479,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools if (0 < ifs.kids.Count) // do it again for an else { - retstr += WriteIndentedLine("else"); + retstr += GenerateIndentedLine("else", ifs); indentHere = ifs.kids.Top is Statement; if (indentHere) m_braceCount++; @@ -463,24 +494,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a StateChange node. /// /// The StateChange node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for StateChange sc. private string GenerateStateChange(StateChange sc) { - return String.Format("state(\"{0}\")", sc.NewState); + return Generate(String.Format("state(\"{0}\")", sc.NewState), sc); } /// /// Generates the code for a WhileStatement node. /// /// The WhileStatement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for WhileStatement ws. private string GenerateWhileStatement(WhileStatement ws) { string retstr = String.Empty; - retstr += WriteIndented("while ("); + retstr += GenerateIndented("while (", ws); retstr += GenerateNode((SYMBOL) ws.kids.Pop()); - retstr += ")\n"; + retstr += GenerateLine(")"); // CompoundStatement handles indentation itself but we need to do it // otherwise. @@ -496,12 +527,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a DoWhileStatement node. /// /// The DoWhileStatement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for DoWhileStatement dws. private string GenerateDoWhileStatement(DoWhileStatement dws) { string retstr = String.Empty; - retstr += WriteIndentedLine("do"); + retstr += GenerateIndentedLine("do", dws); // CompoundStatement handles indentation itself but we need to do it // otherwise. @@ -510,9 +541,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools retstr += GenerateNode((SYMBOL) dws.kids.Pop()); if (indentHere) m_braceCount--; - retstr += WriteIndented("while ("); + retstr += GenerateIndented("while (", dws); retstr += GenerateNode((SYMBOL) dws.kids.Pop()); - retstr += ");\n"; + retstr += GenerateLine(");"); return retstr; } @@ -521,25 +552,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a ForLoop node. /// /// The ForLoop node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for ForLoop fl. private string GenerateForLoop(ForLoop fl) { string retstr = String.Empty; - retstr += WriteIndented("for ("); + retstr += GenerateIndented("for (", fl); // for ( x = 0 ; x < 10 ; x++ ) // ^^^^^^^ retstr += GenerateForLoopStatement((ForLoopStatement) fl.kids.Pop()); - retstr += "; "; + retstr += Generate("; "); // for ( x = 0 ; x < 10 ; x++ ) // ^^^^^^^^ retstr += GenerateNode((SYMBOL) fl.kids.Pop()); - retstr += "; "; + retstr += Generate("; "); // for ( x = 0 ; x < 10 ; x++ ) // ^^^^^ retstr += GenerateForLoopStatement((ForLoopStatement) fl.kids.Pop()); - retstr += ")\n"; + retstr += GenerateLine(")"); // CompoundStatement handles indentation itself but we need to do it // otherwise. @@ -555,7 +586,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a ForLoopStatement node. /// /// The ForLoopStatement node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for ForLoopStatement fls. private string GenerateForLoopStatement(ForLoopStatement fls) { string retstr = String.Empty; @@ -566,7 +597,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools { retstr += GenerateNode(s); if (0 < comma--) - retstr += ", "; + retstr += Generate(", "); } return retstr; @@ -576,13 +607,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a BinaryExpression node. /// /// The BinaryExpression node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for BinaryExpression be. private string GenerateBinaryExpression(BinaryExpression be) { string retstr = String.Empty; retstr += GenerateNode((SYMBOL) be.kids.Pop()); - retstr += String.Format(" {0} ", be.ExpressionSymbol); + retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol), be); foreach (SYMBOL kid in be.kids) retstr += GenerateNode(kid); @@ -593,12 +624,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a UnaryExpression node. /// /// The UnaryExpression node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for UnaryExpression ue. private string GenerateUnaryExpression(UnaryExpression ue) { string retstr = String.Empty; - retstr += ue.UnarySymbol; + retstr += Generate(ue.UnarySymbol, ue); retstr += GenerateNode((SYMBOL) ue.kids.Pop()); return retstr; @@ -608,15 +639,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a ParenthesisExpression node. /// /// The ParenthesisExpression node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for ParenthesisExpression pe. private string GenerateParenthesisExpression(ParenthesisExpression pe) { string retstr = String.Empty; - retstr += "("; + retstr += Generate("("); foreach (SYMBOL kid in pe.kids) retstr += GenerateNode(kid); - retstr += ")"; + retstr += Generate(")"); return retstr; } @@ -625,7 +656,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a IncrementDecrementExpression node. /// /// The IncrementDecrementExpression node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for IncrementDecrementExpression ide. private string GenerateIncrementDecrementExpression(IncrementDecrementExpression ide) { string retstr = String.Empty; @@ -633,10 +664,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools if (0 < ide.kids.Count) { IdentDotExpression dot = (IdentDotExpression) ide.kids.Top; - retstr += String.Format("{0}", ide.PostOperation ? dot.Name + "." + dot.Member + ide.Operation : ide.Operation + dot.Name + "." + dot.Member); + retstr += Generate(String.Format("{0}", ide.PostOperation ? dot.Name + "." + dot.Member + ide.Operation : ide.Operation + dot.Name + "." + dot.Member), ide); } else - retstr += String.Format("{0}", ide.PostOperation ? ide.Name + ide.Operation : ide.Operation + ide.Name); + retstr += Generate(String.Format("{0}", ide.PostOperation ? ide.Name + ide.Operation : ide.Operation + ide.Name), ide); return retstr; } @@ -645,15 +676,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a TypecastExpression node. /// /// The TypecastExpression node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for TypecastExpression te. private string GenerateTypecastExpression(TypecastExpression te) { string retstr = String.Empty; // we wrap all typecasted statements in parentheses - retstr += String.Format("({0}) (", te.TypecastType); + retstr += Generate(String.Format("({0}) (", te.TypecastType), te); retstr += GenerateNode((SYMBOL) te.kids.Pop()); - retstr += ")"; + retstr += Generate(")"); return retstr; } @@ -662,17 +693,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a FunctionCall node. /// /// The FunctionCall node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for FunctionCall fc. private string GenerateFunctionCall(FunctionCall fc) { string retstr = String.Empty; - retstr += String.Format("{0}(", fc.Id); + retstr += Generate(String.Format("{0}(", fc.Id), fc); foreach (SYMBOL kid in fc.kids) retstr += GenerateNode(kid); - retstr += ")"; + retstr += Generate(")"); return retstr; } @@ -681,7 +712,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a Constant node. /// /// The Constant node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for Constant c. private string GenerateConstant(Constant c) { string retstr = String.Empty; @@ -697,10 +728,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools // need to quote strings if ("LSL_Types.LSLString" == c.Type) - retstr += "\""; - retstr += c.Value; + retstr += Generate("\""); + retstr += Generate(c.Value, c); if ("LSL_Types.LSLString" == c.Type) - retstr += "\""; + retstr += Generate("\""); return retstr; } @@ -709,18 +740,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a VectorConstant node. /// /// The VectorConstant node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for VectorConstant vc. private string GenerateVectorConstant(VectorConstant vc) { string retstr = String.Empty; - retstr += String.Format("new {0}(", vc.Type); + retstr += Generate(String.Format("new {0}(", vc.Type), vc); retstr += GenerateNode((SYMBOL) vc.kids.Pop()); - retstr += ", "; + retstr += Generate(", "); retstr += GenerateNode((SYMBOL) vc.kids.Pop()); - retstr += ", "; + retstr += Generate(", "); retstr += GenerateNode((SYMBOL) vc.kids.Pop()); - retstr += ")"; + retstr += Generate(")"); return retstr; } @@ -729,20 +760,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a RotationConstant node. /// /// The RotationConstant node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for RotationConstant rc. private string GenerateRotationConstant(RotationConstant rc) { string retstr = String.Empty; - retstr += String.Format("new {0}(", rc.Type); + retstr += Generate(String.Format("new {0}(", rc.Type), rc); retstr += GenerateNode((SYMBOL) rc.kids.Pop()); - retstr += ", "; + retstr += Generate(", "); retstr += GenerateNode((SYMBOL) rc.kids.Pop()); - retstr += ", "; + retstr += Generate(", "); retstr += GenerateNode((SYMBOL) rc.kids.Pop()); - retstr += ", "; + retstr += Generate(", "); retstr += GenerateNode((SYMBOL) rc.kids.Pop()); - retstr += ")"; + retstr += Generate(")"); return retstr; } @@ -751,51 +782,155 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools /// Generates the code for a ListConstant node. /// /// The ListConstant node. - /// String containing C# code for SYMBOL s. + /// String containing C# code for ListConstant lc. private string GenerateListConstant(ListConstant lc) { string retstr = String.Empty; - retstr += String.Format("new {0}(", lc.Type); + retstr += Generate(String.Format("new {0}(", lc.Type), lc); foreach (SYMBOL kid in lc.kids) retstr += GenerateNode(kid); - retstr += ")"; + retstr += Generate(")"); + + return retstr; + } + + /// + /// Prints a newline. + /// + /// A newline. + private string GenerateLine() + { + return GenerateLine(""); + } + + /// + /// Prints text, followed by a newline. + /// + /// String of text to print. + /// String s followed by newline. + private string GenerateLine(string s) + { + return GenerateLine(s, null); + } + + /// + /// Prints text, followed by a newline. + /// + /// String of text to print. + /// Symbol being generated to extract original line + /// number and column from. + /// String s followed by newline. + private string GenerateLine(string s, SYMBOL sym) + { + string retstr = Generate(s, sym) + "\n"; + + m_CSharpLine++; + m_CSharpCol = 1; return retstr; } /// + /// Prints text. + /// + /// String of text to print. + /// String s. + private string Generate(string s) + { + return Generate(s, null); + } + + /// + /// Prints text. + /// + /// String of text to print. + /// Symbol being generated to extract original line + /// number and column from. + /// String s. + private string Generate(string s, SYMBOL sym) + { + if (null != sym) + m_positionMap.Add(new KeyValuePair(m_CSharpLine, m_CSharpCol), new KeyValuePair(sym.Line, sym.Position)); + + m_CSharpCol += s.Length; + + return s; + } + + /// /// Prints text correctly indented, followed by a newline. /// /// String of text to print. - /// String containing C# code for SYMBOL s. - private string WriteIndentedLine(string s) + /// Properly indented string s followed by newline. + private string GenerateIndentedLine(string s) + { + return GenerateIndentedLine(s, null); + } + + /// + /// Prints text correctly indented, followed by a newline. + /// + /// String of text to print. + /// Symbol being generated to extract original line + /// number and column from. + /// Properly indented string s followed by newline. + private string GenerateIndentedLine(string s, SYMBOL sym) { - return WriteIndented(s) + "\n"; + string retstr = GenerateIndented(s, sym) + "\n"; + + m_CSharpLine++; + m_CSharpCol = 1; + + return retstr; } /// /// Prints text correctly indented. /// /// String of text to print. - /// String containing C# code for SYMBOL s. - private string WriteIndented(string s) + /// Properly indented string s. + //private string GenerateIndented(string s) + //{ + // return GenerateIndented(s, null); + //} + // THIS FUNCTION IS COMMENTED OUT TO SUPPRESS WARNINGS + + /// + /// Prints text correctly indented. + /// + /// String of text to print. + /// Symbol being generated to extract original line + /// number and column from. + /// Properly indented string s. + private string GenerateIndented(string s, SYMBOL sym) { - return Indent() + s; + string retstr = Indent() + s; + + if (null != sym) + m_positionMap.Add(new KeyValuePair(m_CSharpLine, m_CSharpCol), new KeyValuePair(sym.Line, sym.Position)); + + m_CSharpCol += s.Length; + + return retstr; } /// /// Prints correct indentation. /// - /// String containing C# code for SYMBOL s. + /// Indentation based on brace count. private string Indent() { string retstr = String.Empty; for (int i = 0; i < m_braceCount; i++) - retstr += " "; + for (int j = 0; j < m_indentWidth; j++) + { + retstr += " "; + m_CSharpCol++; + } return retstr; } -- cgit v1.1