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