diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs index a825eff..5100f23 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs | |||
@@ -214,11 +214,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
214 | else if (s is Constant) | 214 | else if (s is Constant) |
215 | retstr += GenerateConstant((Constant) s); | 215 | retstr += GenerateConstant((Constant) s); |
216 | else if (s is IdentDotExpression) | 216 | else if (s is IdentDotExpression) |
217 | retstr += Generate(((IdentDotExpression) s).Name + "." + ((IdentDotExpression) s).Member, s); | 217 | retstr += Generate(CheckName(((IdentDotExpression) s).Name) + "." + ((IdentDotExpression) s).Member, s); |
218 | else if (s is IdentExpression) | 218 | else if (s is IdentExpression) |
219 | retstr += Generate(((IdentExpression) s).Name, s); | 219 | retstr += Generate(CheckName(((IdentExpression) s).Name), s); |
220 | else if (s is IDENT) | 220 | else if (s is IDENT) |
221 | retstr += Generate(((TOKEN) s).yytext, s); | 221 | retstr += Generate(CheckName(((TOKEN) s).yytext), s); |
222 | else | 222 | else |
223 | { | 223 | { |
224 | foreach (SYMBOL kid in s.kids) | 224 | foreach (SYMBOL kid in s.kids) |
@@ -247,7 +247,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
247 | else | 247 | else |
248 | remainingKids.Add(kid); | 248 | remainingKids.Add(kid); |
249 | 249 | ||
250 | retstr += GenerateIndented(String.Format("{0} {1}(", gf.ReturnType, gf.Name), gf); | 250 | retstr += GenerateIndented(String.Format("{0} {1}(", gf.ReturnType, CheckName(gf.Name)), gf); |
251 | 251 | ||
252 | // print the state arguments, if any | 252 | // print the state arguments, if any |
253 | foreach (SYMBOL kid in argumentDeclarationListKids) | 253 | foreach (SYMBOL kid in argumentDeclarationListKids) |
@@ -344,7 +344,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
344 | 344 | ||
345 | foreach (Declaration d in adl.kids) | 345 | foreach (Declaration d in adl.kids) |
346 | { | 346 | { |
347 | retstr += Generate(String.Format("{0} {1}", d.Datatype, d.Id), d); | 347 | retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d); |
348 | if (0 < comma--) | 348 | if (0 < comma--) |
349 | retstr += Generate(", "); | 349 | retstr += Generate(", "); |
350 | } | 350 | } |
@@ -403,7 +403,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
403 | /// <returns>String containing C# code for Declaration d.</returns> | 403 | /// <returns>String containing C# code for Declaration d.</returns> |
404 | private string GenerateDeclaration(Declaration d) | 404 | private string GenerateDeclaration(Declaration d) |
405 | { | 405 | { |
406 | return Generate(String.Format("{0} {1}", d.Datatype, d.Id), d); | 406 | return Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d); |
407 | } | 407 | } |
408 | 408 | ||
409 | /// <summary> | 409 | /// <summary> |
@@ -694,10 +694,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
694 | if (0 < ide.kids.Count) | 694 | if (0 < ide.kids.Count) |
695 | { | 695 | { |
696 | IdentDotExpression dot = (IdentDotExpression) ide.kids.Top; | 696 | IdentDotExpression dot = (IdentDotExpression) ide.kids.Top; |
697 | retstr += Generate(String.Format("{0}", ide.PostOperation ? dot.Name + "." + dot.Member + ide.Operation : ide.Operation + dot.Name + "." + dot.Member), ide); | 697 | retstr += Generate(String.Format("{0}", ide.PostOperation ? CheckName(dot.Name) + "." + dot.Member + ide.Operation : ide.Operation + CheckName(dot.Name) + "." + dot.Member), ide); |
698 | } | 698 | } |
699 | else | 699 | else |
700 | retstr += Generate(String.Format("{0}", ide.PostOperation ? ide.Name + ide.Operation : ide.Operation + ide.Name), ide); | 700 | retstr += Generate(String.Format("{0}", ide.PostOperation ? CheckName(ide.Name) + ide.Operation : ide.Operation + CheckName(ide.Name)), ide); |
701 | 701 | ||
702 | return retstr; | 702 | return retstr; |
703 | } | 703 | } |
@@ -728,7 +728,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
728 | { | 728 | { |
729 | string retstr = String.Empty; | 729 | string retstr = String.Empty; |
730 | 730 | ||
731 | retstr += Generate(String.Format("{0}(", fc.Id), fc); | 731 | retstr += Generate(String.Format("{0}(", CheckName(fc.Id)), fc); |
732 | 732 | ||
733 | foreach (SYMBOL kid in fc.kids) | 733 | foreach (SYMBOL kid in fc.kids) |
734 | retstr += GenerateNode(kid); | 734 | retstr += GenerateNode(kid); |
@@ -968,5 +968,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
968 | 968 | ||
969 | return retstr; | 969 | return retstr; |
970 | } | 970 | } |
971 | |||
972 | /// <summary> | ||
973 | /// Returns the passed name with an underscore prepended if that name is a reserved word in C# | ||
974 | /// and not resevered in LSL otherwise it just returns the passed name. | ||
975 | /// | ||
976 | /// This makes no attempt to cache the results to minimise future lookups. For a non trivial | ||
977 | /// scripts the number of unique identifiers could easily grow to the size of the reserved word | ||
978 | /// list so maintaining a list or dictionary and doing the lookup there firstwould probably not | ||
979 | /// give any real speed advantage. | ||
980 | /// | ||
981 | /// I believe there is a class Microsoft.CSharp.CSharpCodeProvider that has a function | ||
982 | /// CreateValidIdentifier(str) that will return either the value of str if it is not a C# | ||
983 | /// key word or "_"+str if it is. But availability under Mono? | ||
984 | /// </summary> | ||
985 | private string CheckName(string s) | ||
986 | { | ||
987 | if (CSReservedWords.IsReservedWord(s)) | ||
988 | return "_" + s; | ||
989 | else | ||
990 | return s; | ||
991 | } | ||
971 | } | 992 | } |
972 | } | 993 | } |