[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