Workaround для NemerleCodeGenerator
От: Mace Windu  
Дата: 20.05.11 11:03
Оценка:
Столкнулся со следующей ситуацией с CodeTypeReference:
ctr.BaseType = "SomeType<OtherType>" // неправильный формат!
ctr.TypeArguments.Count = 0

Соответственно генератор кода на Nemerle в таком виде тип и записывал в исходник.

Проблема в том, что бравые ребята из мелкософта вместо того, чтобы почитать документацию на CodeTypeReference, достали шашку и создали такой код:
public class MvcCSharpRazorCodeGenerator : CSharpRazorCodeGenerator
{
...
    private void SetBaseType(string modelTypeName)
    {
            CodeTypeReference reference = new CodeTypeReference(base.Host.DefaultBaseClass + "<" + modelTypeName + ">");
            base.GeneratedClass.BaseTypes.Clear();
            base.GeneratedClass.BaseTypes.Add(reference);
    }
...
}

А между тем в MSDN белым по желтому написано:

You must use square brackets ([]) and not the C# angle brackets (<>) to delimit generic parameters.

Патч спорный — проблема то не в Nemerle, наверное не стоит его добавлять, но пусть хотя бы описание проблемы с решением на форуме будет.
Index: ncc/codedom/NemerleCodeGenerator.n
===================================================================
--- ncc/codedom/NemerleCodeGenerator.n    (revision 9845)
+++ ncc/codedom/NemerleCodeGenerator.n    (working copy)
@@ -1403,11 +1403,21 @@
                   else
                     s;
                 }
+                
+                def fixBrackets (s : string)
+                {
+                    // BaseType could have a record like this: "namespaces.SomeType<SomeOtherType>" without explicit TypeArguments
+                    // We must replace <> brackets with [], used by Nemerle
+                    // Side effect: I suppose that type names with <> brackets could be broken, 
+                    // but such names usually introduced by obfuscators so I think it will be a minor problem :)
+                    // Other way, I don't know how to fix it better, cause we have only a type name string
+                    s.Replace('<', '[').Replace('>', ']');
+                }
 
                 def init =  trimApostroph(r.BaseType.Trim());
 
                 if (r.TypeArguments.Count == 0)
-                  init;
+                  fixBrackets(init);
                 else
                 {
                   def typeArgs = array(r.TypeArguments.Count);
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.