[svn] r7382: nemerle/trunk/tools/reflector-addon: . reflector-addon.nproj src/LanguageWriter.n

pbludov svnadmin at nemerle.org
Mon Feb 5 06:24:28 CET 2007


Log:
reflector-addon: void type hacks.

Author: pbludov
Date: Mon Feb  5 06:24:26 2007
New Revision: 7382

Modified:
   nemerle/trunk/tools/reflector-addon/   (props changed)
   nemerle/trunk/tools/reflector-addon/reflector-addon.nproj
   nemerle/trunk/tools/reflector-addon/src/LanguageWriter.n

Modified: nemerle/trunk/tools/reflector-addon/reflector-addon.nproj
==============================================================================
--- nemerle/trunk/tools/reflector-addon/reflector-addon.nproj	(original)
+++ nemerle/trunk/tools/reflector-addon/reflector-addon.nproj	Mon Feb  5 06:24:26 2007
@@ -1,7 +1,6 @@
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <NoStdLib>true</NoStdLib>
-    <Name>Reflector.NemerleLanguage</Name>
+    <Name>reflector-addon</Name>
     <TargetPlatform>v2</TargetPlatform>
   </PropertyGroup>
   <PropertyGroup>

Modified: nemerle/trunk/tools/reflector-addon/src/LanguageWriter.n
==============================================================================
--- nemerle/trunk/tools/reflector-addon/src/LanguageWriter.n	(original)
+++ nemerle/trunk/tools/reflector-addon/src/LanguageWriter.n	Mon Feb  5 06:24:26 2007
@@ -30,7 +30,6 @@
 using Nemerle.Collections;
 using Nemerle.Internal;
 using System;
-using System.Collections;
 using System.Diagnostics;
 using System.Globalization;
 using System.IO;
@@ -56,6 +55,8 @@
 
       base(formatter);
       _configuration = LanguageWriterConfiguration(configuration);
+
+      _voidTypeCache = Hashtable();
     }
 
     #region Module
@@ -1616,30 +1617,29 @@
       {
       | ("Nemerle.Builtins", "Tuple")        =>
         WriteList(typeRef.GenericArguments.ToList(), "(", ")", " * ", WriteType);
+
       | ("Nemerle.Builtins", "Function")     =>
         def (genArgs, retType) = typeRef.GenericArguments.ToList().DivideLast();
+        if (genArgs.IsEmpty)
+        {
+          WriteVoidRef(typeRef.GetAssembly());
+          Write(" -> ");
+        }
+        else
         WriteList(genArgs, null, " -> ", " * ", WriteType);
         WriteType(retType);
-      | ("Nemerle.Builtins", "FunctionVoid") =>
-        WriteList(typeRef.GenericArguments.ToList(), null, " -> ", " * ", WriteType);
 
-        // Extract the return type from the type itself.
-        // We need a reference, not a name.
-        //
-        def found =
-          match (typeRef.Resolve())
-          {
-          | null => false;
-          | d    =>
-            match (d.Methods.Find(m : IMethodDeclaration => m.Name == "apply_void"))
+      | ("Nemerle.Builtins", "FunctionVoid") =>
+        def genArgs = typeRef.GenericArguments.ToList();
+        if (genArgs.IsEmpty)
             {
-            | null => false;
-            | m    => WriteType(m.ReturnType.Type); true;
-            }
+          WriteVoidRef(typeRef.GetAssembly());
+          Write(" -> ");
           }
+        else
+          WriteList(genArgs, null, " -> ", " * ", WriteType);
+        WriteVoidRef(typeRef.GetAssembly());
 
-        unless (found)
-          WriteKeyword("void");
       | _ =>
         def name = Helper.GetUserFriendlyName(typeRef);
         WriteTypeReference(typeRef, name, typeRef);
@@ -1851,11 +1851,12 @@
             })
         }
         else
+        {
           WriteList(attrs, "[", "]", WriteCustomAttribute);
-
         WriteLine();
       }
     }
+    }
 
     private WriteDocumentation(value : IDocumentationProvider ) : void
     {
@@ -2038,9 +2039,9 @@
         | BinaryOperator.ValueEquality      => "==";
         | BinaryOperator.IdentityInequality
         | BinaryOperator.ValueInequality    => "!=";
-        | BinaryOperator.BitwiseOr          => "|";
-        | BinaryOperator.BitwiseAnd         => "&";
-        | BinaryOperator.BitwiseExclusiveOr => "^";
+        | BinaryOperator.BitwiseOr          => "%|";
+        | BinaryOperator.BitwiseAnd         => "%&";
+        | BinaryOperator.BitwiseExclusiveOr => "%^";
         | BinaryOperator.BooleanOr          => "||";
         | BinaryOperator.BooleanAnd         => "&&";
         | BinaryOperator.LessThan           => "<";
@@ -2125,6 +2126,40 @@
     | _                                   => throw NotSupportedException($"Invalid statement type '$(value.GetType().Name)'.");
     }
 
+    private _voidTypeCache : Hashtable[IAssemblyReference, ITypeReference];
+
+    private WriteVoidRef(asmRef : IAssemblyReference) : void
+    {
+      def voidTypeRef = _voidTypeCache.GetValue(asmRef, fun()
+        {
+          mutable voidTypeRef = null;
+
+          def asm = asmRef.Resolve();
+          unless (asm == null)
+          {
+            mutable asmMsCorLibRef = null;
+            for (mutable i = 0; asmMsCorLibRef == null && i < asm.Modules.Count; ++i)
+              asmMsCorLibRef = asm.Modules[0].AssemblyReferences.Find(a : IAssemblyReference => a.Name == "mscorlib");
+
+            unless (asmMsCorLibRef == null)
+            {
+              def asmMsCorLib = asmMsCorLibRef.Resolve();
+              unless (asmMsCorLib == null)
+              {
+                for (mutable i = 0; voidTypeRef == null && i < asmMsCorLib.Modules.Count; ++i)
+                  voidTypeRef = asmMsCorLib.Modules[i].Types.Find(t : ITypeDeclaration => t.Namespace == "System" && t.Name == "Void");
+              }
+            }
+          }
+          voidTypeRef;
+        });
+
+      if (voidTypeRef != null)
+        WriteType(voidTypeRef);
+      else
+        Write("void");
+    }
+
     #endregion
 
     #region Keywords
@@ -2180,36 +2215,57 @@
         ;
       }
 
+    // Copy'n'pasted from MethodBuilder.OperatorLongName.
+    // See ncc\hierarchy\ClassMembers.n
+    //
+    // Note that some operators like op_True, op_PointerDereference,
+    // op_UnsignedRightShiftAssignment and some other are not supported
+    // in Nemerle and are passed as is.
+    //
+    // See ECMA TC39/TG3 part I, chapter 9,
+    // "Name and Type Rules for the Common Language Specification"
+    // for complete list of operator names.
+    //
     protected override GetSpecialMethods() : Map[string, string]
     {
       Map()
-        .Add("op_UnaryPlus", "+")
         .Add("op_Addition", "+")
-        .Add("op_Increment", "++")
-        .Add("op_UnaryNegation", "-")
-        .Add("op_Subtraction", "-")
-        .Add("op_Decrement", "--")
-        .Add("op_Multiply", "*")
-        .Add("op_Division", "/")
-        .Add("op_Modulus", "%")
+        .Add("op_AdditionAssignment",       "+=")
+        .Add("op_Assign",                   "=")
         .Add("op_BitwiseAnd", "&")
+        .Add("op_BitwiseAndAssignment",     "&=")
         .Add("op_BitwiseOr", "|")
-        .Add("op_ExclusiveOr", "^")
-        .Add("op_Negation", "!")
-        .Add("op_OnesComplement", "~")
-        .Add("op_LeftShift", "<<")
-        .Add("op_RightShift", ">>")
+        .Add("op_BitwiseOrAssignment",      "|=")
+        .Add("op_Comma",                    ",")
+        .Add("op_Decrement",                "--")
+        .Add("op_Division",                 "/")
+        .Add("op_DivisionAssignment",       "/=")
         .Add("op_Equality", "==")
-        .Add("op_Inequality", "!=")
-        .Add("op_GreaterThanOrEqual", ">=")
-        .Add("op_LessThanOrEqual", "<=")
+        .Add("op_ExclusiveOr",               "^")
+        .Add("op_ExclusiveOrAssignment",    "^=")
+        .Add("op_Explicit",                 ":>")
         .Add("op_GreaterThan", ">")
+        .Add("op_GreaterThanOrEqual",       ">=")
+        .Add("op_Implicit",                 ":")
+        .Add("op_Increment",                "++")
+        .Add("op_Inequality",               "!=")
+        .Add("op_LeftShift",                "<<")
+        .Add("op_LeftShiftAssignment",      "<<=")
         .Add("op_LessThan", "<")
-        .Add("op_True", "true")
-        .Add("op_False", "false")
-        .Add("op_Implicit", "implicit")
-        .Add("op_Explicit", "explicit")
-        ;
+        .Add("op_LessThanOrEqual",          "<=")
+        .Add("op_LogicalAnd",               "&&")
+        .Add("op_LogicalNot",               "!")
+        .Add("op_LogicalOr",                "||")
+        .Add("op_Modulus",                  "%")
+        .Add("op_ModulusAssignment",        "%=")
+        .Add("op_MultiplicationAssignment", "*=")
+        .Add("op_Multiply",                 "*")
+        .Add("op_OnesComplement",           "~")
+        .Add("op_RightShift",               ">>")
+        .Add("op_Subtraction",              "-")
+        .Add("op_SubtractionAssignment",    "-=")
+        .Add("op_UnaryNegation",            "-")
+        .Add("op_UnaryPlus",                "+")
     }
 
     #endregion



More information about the svn mailing list