Author: mhutch
Date: 2008-01-02 17:50:50 -0500 (Wed, 02 Jan 2008)
New Revision: 92136

Modified:
   trunk/monodevelop/main/src/core/MonoDevelop.Ide/ChangeLog
   
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs
   
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
Log:
* MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs,
  MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs:
  Allow creating files where the name is a language keyword, using
  keyword escaping. Fixes some VB.NET ASP.NET templates. Code in
  templates should use ${EscapedIdentifier} instead of ${Name}, or
  they may create invalid code.

Modified: trunk/monodevelop/main/src/core/MonoDevelop.Ide/ChangeLog
===================================================================
--- trunk/monodevelop/main/src/core/MonoDevelop.Ide/ChangeLog   2008-01-02 
22:14:10 UTC (rev 92135)
+++ trunk/monodevelop/main/src/core/MonoDevelop.Ide/ChangeLog   2008-01-02 
22:50:50 UTC (rev 92136)
@@ -1,3 +1,12 @@
+2008-01-02  Michael Hutchinson <[EMAIL PROTECTED]> 
+
+       * MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs,
+         MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs:
+         Allow creating files where the name is a language keyword, using 
keyword
+         escaping. Fixes some VB.NET ASP.NET templates. Code in templates 
should
+         use ${EscapedIdentifier} instead of ${Name}, or they may create 
invalid
+         code.
+
 2007-12-28  Paul Lange  <[EMAIL PROTECTED]>
 
        * MonoDevelop.Ide.addin.xml: Fix 'Bug 350395 - Use of "New Project/

Modified: 
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs
===================================================================
--- 
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs
 2008-01-02 22:14:10 UTC (rev 92135)
+++ 
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs
 2008-01-02 22:50:50 UTC (rev 92136)
@@ -51,13 +51,14 @@
                CodeDomProvider parserProvider;
                string tempSubstitutedContent;
                bool showAutogenerationNotice = false;
+               string sourceLang;
                
                public override void Load (XmlElement filenode)
                {
                        base.Load (filenode);
                        content = filenode.InnerText;
                        
-                       string sourceLang = filenode.GetAttribute 
("SourceLanguage");
+                       sourceLang = filenode.GetAttribute ("SourceLanguage");
                        if ((sourceLang == null) || (sourceLang.Length == 0))
                                sourceLang = "C#";
                        
@@ -74,7 +75,7 @@
                        if (string.IsNullOrEmpty (filenode.GetAttribute 
("AddStandardHeader")))
                                AddStandardHeader = true;
                        
-                       parserProvider = getProvider (sourceLang);
+                       parserProvider = GetCodeDomProvider (sourceLang);
                }
                
                //Adapted from CodeDomFileDescriptionTemplate.cs
@@ -85,7 +86,7 @@
                        if (language == null || language == "")
                                throw new InvalidOperationException ("Language 
not defined in CodeDom based template.");
                        
-                       CodeDomProvider provider = getProvider (language);
+                       CodeDomProvider provider = GetCodeDomProvider 
(language);
                        
                        //parse the source code
                        if (tempSubstitutedContent == null)
@@ -127,19 +128,6 @@
                        return txt.Substring (i+1);
                }
                
-               CodeDomProvider getProvider (string language)
-               {
-                       CodeDomProvider provider = null;
-                       IDotNetLanguageBinding binding = GetLanguageBinding 
(language) as IDotNetLanguageBinding;
-                       if (binding == null)
-                               throw new InvalidOperationException ("No 
LanguageBinding was found for the language '" + language + "'.");
-                       
-                       provider = binding.GetCodeDomProvider ();
-                       if (provider == null)
-                               throw new InvalidOperationException ("No 
CodeDomProvider was found for the language '" + language + "'.");
-                       return provider;
-               }
-               
                public override void ModifyTags (Project project, string 
language, string identifier, string fileName, ref Hashtable tags)
                {
                        //prevent parser breakage from missing tags, which 
SingleFile only provides for DotNetProject
@@ -148,11 +136,36 @@
                        
                        base.ModifyTags (project, language, identifier, 
fileName, ref tags);
                        
+                       //swap out the escaped keyword identifiers for the 
target language with the source language
+                       //CodeDOM should take care of handling it for the 
target language
+                       System.CodeDom.Compiler.CodeDomProvider provider = 
GetCodeDomProvider (sourceLang);
+                       tags ["EscapedIdentifier"] = 
provider.CreateEscapedIdentifier ((string) tags ["Name"]);
+                       
                        //This is a bit hacky doing it here instead of in 
CreateContent, but need to
                        //substitute all tags in code before language is 
translated, because language
                        //translation gets confused by unsubstituted  
substitution tokens.
                        string [,] tagsArr = HashtableToStringArray (tags);
                        tempSubstitutedContent = StringParserService.Parse 
(content, tagsArr);
                }
+               
+               private System.CodeDom.Compiler.CodeDomProvider 
GetCodeDomProvider (string language)
+               {
+                       System.CodeDom.Compiler.CodeDomProvider provider = null;
+                       IDotNetLanguageBinding binding = GetLanguageBinding 
(language) as IDotNetLanguageBinding;
+                       if (binding == null)
+                               throw new InvalidOperationException ("No 
LanguageBinding was found for the language '" + language + "'.");
+                       
+                       provider = binding.GetCodeDomProvider ();
+                       if (provider == null)
+                               throw new InvalidOperationException ("No 
CodeDomProvider was found for the language '" + language + "'.");
+                       return provider;
+               }
+               
+               //CodeDOM escapes keywords for us, so escaped keywords are 
valid too. Need to override to allow this,
+               //and also to check for validity in source language
+               public override bool IsValidName (string name, string language)
+               {
+                       return base.IsValidName (name, language) && 
base.IsValidName (name, sourceLang);
+               }
        }
 }

Modified: 
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
===================================================================
--- 
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
  2008-01-02 22:14:10 UTC (rev 92135)
+++ 
trunk/monodevelop/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
  2008-01-02 22:50:50 UTC (rev 92136)
@@ -227,8 +227,9 @@
                {
                        DotNetProject netProject = project as DotNetProject;
                        string languageExtension = "";
+                       ILanguageBinding binding = null;
                        if (!string.IsNullOrEmpty (language)) {
-                               ILanguageBinding binding = GetLanguageBinding 
(language);
+                               binding = GetLanguageBinding (language);
                                if (binding != null)
                                        languageExtension = Path.GetExtension 
(binding.GetFileName ("Default")).Remove (0, 1);
                        }
@@ -248,7 +249,17 @@
                                
                                tags ["Name"] = identifier;
                                tags ["FullName"] = ns.Length > 0 ? ns + "." + 
identifier : identifier;
-                       }                       
+                               
+                               //some .NET languages may be able to use 
keywords as identifiers if they're escaped
+                               //for simplicity, we escape the identifier in 
"Name" and provide "UnescapedName"
+                               IDotNetLanguageBinding dnb = binding as 
IDotNetLanguageBinding;
+                               if (dnb != null) {
+                                       System.CodeDom.Compiler.CodeDomProvider 
provider = dnb.GetCodeDomProvider ();
+                                       if (provider != null) {
+                                               tags ["EscapedIdentifier"] = 
provider.CreateEscapedIdentifier (identifier);
+                                       }
+                               }
+                       }
                        
                        if (ns.Length > 0)
                                tags ["Namespace"] = ns;
@@ -301,7 +312,7 @@
                                        if (binding != null) {
                                                
System.CodeDom.Compiler.CodeDomProvider provider = binding.GetCodeDomProvider 
();
                                                if (provider != null)
-                                                       return 
provider.IsValidIdentifier (name);
+                                                       return 
provider.IsValidIdentifier (provider.CreateEscapedIdentifier (name));
                                        }
                                }
                                return name.IndexOfAny 
(Path.GetInvalidFileNameChars ()) == -1;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to