+//\r
+// Microsoft.VisualBasic.VBCodeGenerator.cs\r
+//\r
+// Author:\r
+// Andreas Nahr (ClassDevelopment@A-SoftTech.com)\r
+// (partially based on CSharpCodeGenerator)\r
+// Jochen Wezel (jwezel@compumaster.de)\r
+//\r
+// (C) 2003 Andreas Nahr\r
+// (C) 2003 Jochen Wezel (http://www.compumaster.de)\r
+//\r
+// Modifications:\r
+// 2003-11-06 JW: some corrections regarding missing spaces in generated code (e. g. "Property ")\r
+// 2003-11-06 JW: QuoteSnippetString implemented\r
+// 2003-11-08 JW: automatically add Microsoft.VisualBasic\r
+// 2003-11-12 JW: some corrections to allow correct compilation\r
+// 2003-11-28 JW: implementing code differences into current build of this file\r
+// 2003-12-10 JW: added "String." for the ChrW method because mbas doesn't support it without the String currently / TODO: remove it ASAP!
+
//
-// Microsoft.VisualBasic.VBCodeGenerator.cs
-//
-// Author:
-// Andreas Nahr (ClassDevelopment@A-SoftTech.com)
-// (partially based on CSharpCodeGenerator)
-//
-// (C) 2003 Andreas Nahr
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-using System;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.CodeDom;
-using System.CodeDom.Compiler;
-using System.IO;
-using System.Reflection;
-using System.Collections;
-
-namespace Microsoft.VisualBasic
-{
- internal class VBCodeGenerator : CodeGenerator
- {
- private string[] Keywords = new string[] {
- "AddHandler", "AddressOf", "Alias", "And",
- "AndAlso", "Ansi", "As", "Assembly",
- "Auto", "Boolean", "ByRef", "Byte",
- "ByVal", "Call", "Case", "Catch",
- "CBool", "CByte", "CChar", "CDate",
- "CDec", "CDbl", "Char", "CInt",
- "Class", "CLng", "CObj", "Const",
- "CShort", "CSng", "CStr", "CType",
- "Date", "Decimal", "Declare", "Default",
- "Delegate", "Dim", "DirectCast", "Do",
- "Double", "Each", "Else", "ElseIf",
- "End", "Enum", "Erase", "Error",
- "Event", "Exit", "False", "Finally",
- "For", "Friend", "Function", "Get",
- "GetType", "GoSub", "GoTo", "Handles",
- "If", "Implements", "Imports", "In",
- "Inherits", "Integer", "Interface", "Is",
- "Let", "Lib", "Like", "Long",
- "Loop", "Me", "Mod", "Module",
- "MustInherit", "MustOverride", "MyBase", "MyClass",
- "Namespace", "New", "Next", "Not",
- "Nothing", "NotInheritable", "NotOverridable", "Object",
- "On", "Option", "Optional", "Or",
- "OrElse", "Overloads", "Overridable", "Overrides",
- "ParamArray", "Preserve", "Private", "Property",
- "Protected", "Public", "RaiseEvent", "ReadOnly",
- "ReDim", "REM", "RemoveHandler", "Resume",
- "Return", "Select", "Set", "Shadows",
- "Shared", "Short", "Single", "Static",
- "Step", "Stop", "String", "Structure",
- "Sub", "SyncLock", "Then", "Throw",
- "To", "True", "Try", "TypeOf",
- "Unicode", "Until", "Variant", "When",
- "While", "With", "WithEvents", "WriteOnly",
- "Xor"
- };
-
- public VBCodeGenerator()
- {
- }
-
- protected override string NullToken {
- get {
- return "Nothing";
- }
- }
-
- protected override void GenerateArrayCreateExpression (CodeArrayCreateExpression expression)
- {
- TextWriter output = Output;
-
- output.Write ("New ");
-
- CodeExpressionCollection initializers = expression.Initializers;
- CodeTypeReference createType = expression.CreateType;
-
- if (initializers.Count > 0) {
-
- OutputType (createType);
-
- output.WriteLine (" {");
- ++Indent;
- OutputExpressionList (initializers, true);
- --Indent;
- output.Write ("}");
-
- }
- else {
- CodeTypeReference arrayType = createType.ArrayElementType;
- while (arrayType != null)
- {
- createType = arrayType;
- arrayType = arrayType.ArrayElementType;
- }
-
- OutputType (createType);
-
- output.Write ('(');
-
- CodeExpression size = expression.SizeExpression;
- if (size != null)
- GenerateExpression (size);
- else
- output.Write (expression.Size);
-
- output.Write (')');
- }
- }
-
- protected override void GenerateBaseReferenceExpression (CodeBaseReferenceExpression expression)
- {
- Output.Write ("MyBase");
- }
-
- protected override void GenerateCastExpression (CodeCastExpression expression)
- {
- TextWriter output = Output;
- // ENHANCE: Use a DirectCast if it is known that expression.Expression is no Value-Type
- output.Write ("CType(");
- GenerateExpression (expression.Expression);
- output.Write (", ");
- OutputType (expression.TargetType);
- output.Write (")");
- }
-
- protected override void GenerateCompileUnitStart (CodeCompileUnit compileUnit)
- {
- GenerateComment (new CodeComment ("------------------------------------------------------------------------------"));
- GenerateComment (new CodeComment (" <autogenerated>"));
- GenerateComment (new CodeComment (" This code was generated by a tool."));
- GenerateComment (new CodeComment (" Mono Runtime Version: " + System.Environment.Version));
- GenerateComment (new CodeComment (""));
- GenerateComment (new CodeComment (" Changes to this file may cause incorrect behavior and will be lost if "));
- GenerateComment (new CodeComment (" the code is regenerated."));
- GenerateComment (new CodeComment (" </autogenerated>"));
- GenerateComment (new CodeComment ("------------------------------------------------------------------------------"));
- Output.WriteLine ();
- }
-
- protected override void GenerateDelegateCreateExpression (CodeDelegateCreateExpression expression)
- {
- TextWriter output = Output;
-
- output.Write ("AddressOf ");
-
- CodeExpression targetObject = expression.TargetObject;
- if (targetObject != null) {
- GenerateExpression (targetObject);
- Output.Write ('.');
- }
- output.Write (expression.MethodName);
- }
-
- protected override void GenerateFieldReferenceExpression (CodeFieldReferenceExpression expression)
- {
- CodeExpression targetObject = expression.TargetObject;
- if (targetObject != null) {
- GenerateExpression (targetObject);
- Output.Write ('.');
- }
- Output.Write (expression.FieldName);
- }
-
- protected override void GenerateArgumentReferenceExpression (CodeArgumentReferenceExpression expression)
- {
- Output.Write (expression.ParameterName);
- }
-
- protected override void GenerateVariableReferenceExpression (CodeVariableReferenceExpression expression)
- {
- Output.Write (expression.VariableName);
- }
-
- protected override void GenerateIndexerExpression (CodeIndexerExpression expression)
- {
- TextWriter output = Output;
-
- GenerateExpression (expression.TargetObject);
- output.Write ('(');
- OutputExpressionList (expression.Indices);
- output.Write (')');
- }
-
- protected override void GenerateArrayIndexerExpression (CodeArrayIndexerExpression expression)
- {
- TextWriter output = Output;
-
- GenerateExpression (expression.TargetObject);
- output.Write ('(');
- OutputExpressionList (expression.Indices);
- output.Write (')');
- }
-
- protected override void GenerateSnippetExpression (CodeSnippetExpression expression)
- {
- Output.Write (expression.Value);
- }
-
- protected override void GenerateMethodInvokeExpression (CodeMethodInvokeExpression expression)
- {
- TextWriter output = Output;
-
- GenerateMethodReferenceExpression (expression.Method);
-
- output.Write ('(');
- OutputExpressionList (expression.Parameters);
- output.Write (')');
- }
-
- protected override void GenerateMethodReferenceExpression (CodeMethodReferenceExpression expression)
- {
- GenerateExpression (expression.TargetObject);
- Output.Write ('.');
- Output.Write (expression.MethodName);
- }
-
- protected override void GenerateEventReferenceExpression (CodeEventReferenceExpression expression)
- {
- GenerateExpression (expression.TargetObject);
- Output.Write ('.');
- Output.Write (expression.EventName);
- }
-
- protected override void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression expression)
- {
- Output.Write ("RaiseEvent ");
- GenerateExpression (expression.TargetObject);
- Output.Write ('(');
- OutputExpressionList (expression.Parameters);
- Output.WriteLine (')');
- }
-
- protected override void GenerateObjectCreateExpression (CodeObjectCreateExpression expression)
- {
- Output.Write( "New " );
- OutputType (expression.CreateType);
- Output.Write ('(');
- OutputExpressionList (expression.Parameters);
- Output.Write (')');
- }
-
- protected override void GenerateParameterDeclarationExpression (CodeParameterDeclarationExpression e)
- {
- if (e.CustomAttributes != null && e.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (e.CustomAttributes);
- OutputDirection (e.Direction);
- OutputTypeNamePair (e.Type, e.Name);
- }
-
- protected override void GeneratePrimitiveExpression (CodePrimitiveExpression e)
- {
- TextWriter output = Output;
-
- if (e.Value == null) {
- output.Write (NullToken);
- return;
- }
-
- Type type = e.Value.GetType ();
- if (type == typeof (bool)) {
- if ((bool)e.Value)
- output.Write ("True");
- else
- output.Write ("False");
- }
- else if (type == typeof (char)) {
- output.Write ("\"" + e.Value.ToString () + "\"c");
- }
- else if (type == typeof (string)) {
- output.Write (QuoteSnippetString ((string) e.Value));
- }
- else if (type == typeof (byte) || type == typeof (sbyte) || type == typeof (short) ||
- type == typeof (int) || type == typeof (long) || type == typeof (float) ||
- type == typeof (double) || type == typeof (decimal)) {
- output.Write (e.Value.ToString ());
- }
- else {
- throw new ArgumentException ("Value type (" + type + ") is not a primitive type");
- }
- }
-
- protected override void GeneratePropertyReferenceExpression (CodePropertyReferenceExpression expression)
- {
- GenerateMemberReferenceExpression (expression.TargetObject, expression.PropertyName);
- }
-
- protected override void GeneratePropertySetValueReferenceExpression (CodePropertySetValueReferenceExpression expression)
- {
- Output.Write ("Value");
- }
-
- protected override void GenerateThisReferenceExpression (CodeThisReferenceExpression expression)
- {
- Output.Write ("Me");
- }
-
- protected override void GenerateExpressionStatement (CodeExpressionStatement statement)
- {
- GenerateExpression (statement.Expression);
- Output.WriteLine (); //start new line
- }
-
- protected override void GenerateIterationStatement (CodeIterationStatement statement)
- {
- TextWriter output = Output;
-
- GenerateStatement (statement.InitStatement);
- output.Write ("Do While ");
- GenerateExpression (statement.TestExpression);
- output.WriteLine ();
- GenerateStatements (statement.Statements);
- GenerateStatement (statement.IncrementStatement);
- output.WriteLine ("Loop");
- }
-
- protected override void GenerateThrowExceptionStatement (CodeThrowExceptionStatement statement)
- {
- Output.Write ("Throw ");
- GenerateExpression (statement.ToThrow);
- }
-
- protected override void GenerateComment (CodeComment comment)
- {
- TextWriter output = Output;
-
- if (comment.DocComment)
- output.Write ("''' ");
- else
- output.Write ("' ");
-
- output.WriteLine (comment.Text);
- }
-
- protected override void GenerateMethodReturnStatement (CodeMethodReturnStatement statement)
- {
- TextWriter output = Output;
-
- output.Write ("Return ");
- GenerateExpression (statement.Expression);
- output.WriteLine ();
- }
-
- protected override void GenerateConditionStatement (CodeConditionStatement statement)
- {
- TextWriter output = Output;
- output.Write ("If (");
-
- GenerateExpression (statement.Condition);
-
- output.WriteLine (") Then");
- ++Indent;
- GenerateStatements (statement.TrueStatements);
- --Indent;
-
- CodeStatementCollection falses = statement.FalseStatements;
- if (falses.Count > 0) {
- output.WriteLine ("Else");
- ++Indent;
- GenerateStatements (falses);
- --Indent;
- }
- else {
- if (Options.ElseOnClosing)
- output.WriteLine ("Else");
- }
- output.WriteLine ("End If");
- }
-
- protected override void GenerateTryCatchFinallyStatement (CodeTryCatchFinallyStatement statement)
- {
- TextWriter output = Output;
- CodeGeneratorOptions options = Options;
-
- output.WriteLine ("Try");
- ++Indent;
- GenerateStatements (statement.TryStatements);
- --Indent;
- output.WriteLine ();
-
- foreach (CodeCatchClause clause in statement.CatchClauses) {
- output.Write ("Catch ");
- OutputTypeNamePair (clause.CatchExceptionType, clause.LocalName);
- output.WriteLine ();
- ++Indent;
- GenerateStatements (clause.Statements);
- --Indent;
- output.WriteLine ();
- }
-
- CodeStatementCollection finallies = statement.FinallyStatements;
- if (finallies.Count > 0) {
-
- output.WriteLine ("Finally");
- ++Indent;
- GenerateStatements (finallies);
- --Indent;
- output.WriteLine ();
- }
-
- if (Options.ElseOnClosing) {
- if (statement.CatchClauses.Count == 0)
- output.WriteLine ("Catch");
- if (statement.FinallyStatements.Count == 0)
- output.WriteLine ("Finally");
- }
-
- output.WriteLine("End Try");
- }
-
- protected override void GenerateAssignStatement (CodeAssignStatement statement)
- {
- TextWriter output = Output;
- GenerateExpression (statement.Left);
- output.Write (" = ");
- GenerateExpression (statement.Right);
- output.WriteLine ();
- }
-
- protected override void GenerateAttachEventStatement (CodeAttachEventStatement statement)
- {
- TextWriter output = Output;
-
- Output.Write ("AddHandler ");
- GenerateEventReferenceExpression (statement.Event);
- Output.Write ( ", ");
- GenerateExpression (statement.Listener);
- output.WriteLine ();
- }
-
- protected override void GenerateRemoveEventStatement (CodeRemoveEventStatement statement)
- {
- TextWriter output = Output;
-
- Output.Write ("RemoveHandler ");
- GenerateEventReferenceExpression (statement.Event);
- Output.Write ( ", ");
- GenerateExpression (statement.Listener);
- output.WriteLine ();
- }
-
- protected override void GenerateGotoStatement (CodeGotoStatement statement)
- {
- TextWriter output = Output;
-
- output.Write ("Goto ");
- output.Write (statement.Label);
- output.WriteLine ();
- }
-
- protected override void GenerateLabeledStatement (CodeLabeledStatement statement)
- {
- TextWriter output = Output;
-
- output.Write (statement.Label + ":");
- GenerateStatement (statement.Statement);
- }
-
- protected override void GenerateTypeOfExpression (CodeTypeOfExpression e)
- {
- TextWriter output = Output;
-
- output.Write ("GetType(");
- OutputType (e.Type);
- output.Write (")");
- }
-
- protected override void GenerateVariableDeclarationStatement( CodeVariableDeclarationStatement statement )
- {
- TextWriter output = Output;
-
- output.Write ("Dim ");
- OutputTypeNamePair (statement.Type, statement.Name);
-
- CodeExpression initExpression = statement.InitExpression;
- if (initExpression != null)
- {
- output.Write (" = ");
- GenerateExpression (initExpression);
- }
-
- output.WriteLine();
- }
-
- protected override void GenerateLinePragmaStart (CodeLinePragma linePragma)
- {
- Output.WriteLine ();
- Output.Write ("#ExternalSource(");
- Output.Write (linePragma.FileName);
- Output.Write (", ");
- Output.Write (linePragma.LineNumber);
- Output.WriteLine (")");
- }
-
- protected override void GenerateLinePragmaEnd (CodeLinePragma linePragma)
- {
- Output.WriteLine ("#End ExternalSource");
- }
-
- protected override void GenerateEvent (CodeMemberEvent eventRef, CodeTypeDeclaration declaration)
- {
- TextWriter output = Output;
-
- if (eventRef.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (eventRef.CustomAttributes);
-
- MemberAttributes attributes = eventRef.Attributes;
-
- OutputMemberAccessModifier (attributes);
- OutputMemberScopeModifier (attributes);
-
- output.Write ("Event ");
- OutputTypeNamePair (eventRef.Type, eventRef.Name);
- output.WriteLine ();
- }
-
- protected override void GenerateField (CodeMemberField field)
- {
- TextWriter output = Output;
-
- if (field.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (field.CustomAttributes);
-
- MemberAttributes attributes = field.Attributes;
- OutputMemberAccessModifier (attributes);
- OutputFieldScopeModifier (attributes);
-
- OutputTypeNamePair (field.Type, field.Name);
-
- CodeExpression initExpression = field.InitExpression;
- if (initExpression != null) {
- output.Write (" = ");
- GenerateExpression (initExpression);
- }
-
- output.WriteLine();
- }
-
- protected override void GenerateSnippetMember (CodeSnippetTypeMember member)
- {
- Output.Write (member.Text);
- }
-
- protected override void GenerateEntryPointMethod( CodeEntryPointMethod method, CodeTypeDeclaration declaration )
- {
- method.Name = "Main";
- GenerateMethod (method, declaration);
- }
-
- [MonoTODO ("partially implemented")]
- protected override void GenerateMethod (CodeMemberMethod method, CodeTypeDeclaration declaration)
- {
- TextWriter output = Output;
-
- if (method.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (method.CustomAttributes);
-
- MemberAttributes attributes = method.Attributes;
-
- OutputMemberAccessModifier (attributes);
- OutputMemberScopeModifier (attributes);
-
- if (method.ReturnType == null)
- output.Write ("Sub ");
- else
- output.Write ("Function ");
-
- output.Write (method.Name);
- output.Write ('(');
- OutputParameters (method.Parameters);
- output.Write (')');
-
- if (method.ReturnType != null) {
- output.Write (" As ");
- OutputType (method.ReturnType);
- }
-
- if (method.ImplementationTypes.Count > 0) {
- output.Write (" Implements ");
- foreach (CodeTypeReference type in method.ImplementationTypes)
- {
- OutputType (type);
- output.Write ('.');
- // TODO implementation incomplete
-
- }
- }
-
- // TODO private implementations
-
- if ((attributes & MemberAttributes.ScopeMask) == MemberAttributes.Abstract)
- output.WriteLine ();
- else {
- output.WriteLine ();
- ++Indent;
- GenerateStatements (method.Statements);
- --Indent;
- if (method.ReturnType == null)
- output.WriteLine ("End Sub");
- else
- output.WriteLine ("End Function");
- }
- }
-
- protected override void GenerateProperty (CodeMemberProperty property, CodeTypeDeclaration declaration)
- {
- TextWriter output = Output;
-
- if (property.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (property.CustomAttributes);
-
- MemberAttributes attributes = property.Attributes;
- OutputMemberAccessModifier (attributes);
- OutputMemberScopeModifier (attributes);
-
- if (property.HasGet && (property.HasSet = false))
- output.Write ("ReadOnly" );
-
- if (property.HasSet && (property.HasGet = false))
- output.Write ("WriteOnly" );
-
- output.Write ("Property" );
-
- OutputTypeNamePair (property.Type, property.Name);
- output.WriteLine ();
- ++Indent;
-
- if (property.HasGet) {
- output.WriteLine ("Get");
- ++Indent;
-
- GenerateStatements (property.GetStatements);
-
- --Indent;
- output.WriteLine ("End Get");
- }
-
- if (property.HasSet) {
- output.WriteLine ("Set");
- ++Indent;
-
- GenerateStatements (property.SetStatements);
-
- --Indent;
- output.WriteLine ("End Set");
- }
-
- --Indent;
- output.WriteLine ("End Property");
- }
-
- [MonoTODO ("not implemented")]
- protected override void GenerateConstructor (CodeConstructor constructor, CodeTypeDeclaration declaration)
- {
- if (constructor.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (constructor.CustomAttributes);
- OutputMemberAccessModifier (constructor.Attributes);
- Output.Write ("Sub New(");
- OutputParameters (constructor.Parameters);
- Output.WriteLine (")");
- // Handle BaseConstructorArgs, ChainedConstructorArgs, ImplementationTypes
- Indent++;
- GenerateStatements (constructor.Statements);
- Indent--;
- Output.WriteLine ("End Sub");
- }
-
- protected override void GenerateTypeConstructor (CodeTypeConstructor constructor)
- {
- Output.WriteLine ("Shared Sub New()");
- Indent++;
- GenerateStatements (constructor.Statements);
- Indent--;
- Output.WriteLine ("End Sub");
- }
-
- [MonoTODO ("not implemented")]
- protected override void GenerateTypeStart (CodeTypeDeclaration declaration)
- {
- TextWriter output = Output;
-
- if (declaration.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (declaration.CustomAttributes);
- TypeAttributes attributes = declaration.TypeAttributes;
- OutputTypeAttributes (attributes,
- declaration.IsStruct,
- declaration.IsEnum);
-
- output.WriteLine (declaration.Name);
-
- ++Indent;
-
- IEnumerator enumerator = declaration.BaseTypes.GetEnumerator();
- if (enumerator.MoveNext())
- {
- CodeTypeReference type = (CodeTypeReference)enumerator.Current;
-
- if (type != null)
- {
- output.Write ("Inherits ");
- OutputType (type);
- output.WriteLine ();
- }
-
- while (enumerator.MoveNext())
- {
- type = (CodeTypeReference)enumerator.Current;
-
- if (type != null)
- {
- output.Write ("Implements ");
- OutputType (type);
- output.WriteLine ();
- }
- }
- }
- }
-
- protected override void GenerateTypeEnd (CodeTypeDeclaration declaration)
- {
- string output = string.Empty;
-
- --Indent;
- if (declaration.IsStruct)
- output = "End Structure";
- if (declaration.IsInterface)
- output = "End Interface";
- if (declaration.IsEnum)
- output = "End Enum";
- if (declaration.IsClass)
- output = "End Class";
-
- Output.WriteLine (output);
- }
-
- protected override void GenerateNamespaceStart (CodeNamespace ns)
- {
- TextWriter output = Output;
-
- string name = ns.Name;
- if (name != null && name != string.Empty) {
- output.Write ("Namespace ");
- output.WriteLine (name);
- ++Indent;
- }
- }
-
- protected override void GenerateNamespaceEnd (CodeNamespace ns)
- {
- string name = ns.Name;
- if (name != null && name != string.Empty) {
- --Indent;
- Output.WriteLine ("End Namespace");
- }
- }
-
- protected override void GenerateNamespaceImport (CodeNamespaceImport import)
- {
- TextWriter output = Output;
-
- output.Write ("Imports ");
- output.Write (import.Namespace);
- output.WriteLine ();
- }
-
- protected override void GenerateAttributeDeclarationsStart (CodeAttributeDeclarationCollection attributes)
- {
- Output.Write ('<');
- }
-
- protected override void GenerateAttributeDeclarationsEnd (CodeAttributeDeclarationCollection attributes)
- {
- Output.WriteLine ('>');
- }
-
- protected override void OutputDirection (FieldDirection direction)
- {
- switch (direction) {
- case FieldDirection.In:
- //there is no "In"
- break;
- case FieldDirection.Out:
- Output.Write ("ByVal ");
- break;
- case FieldDirection.Ref:
- Output.Write ("ByRef ");
- break;
- }
- }
-
- protected override void OutputFieldScopeModifier (MemberAttributes attributes)
- {
- if ((attributes & MemberAttributes.VTableMask) == MemberAttributes.New)
- Output.Write ("New ");
-
- switch (attributes & MemberAttributes.ScopeMask) {
- case MemberAttributes.Static:
- Output.Write ("Shared ");
- break;
- case MemberAttributes.Const:
- Output.Write ("Const ");
- break;
- }
- }
-
- protected override void OutputMemberAccessModifier (MemberAttributes attributes)
- {
- switch (attributes & MemberAttributes.AccessMask) {
- case MemberAttributes.Assembly:
- Output.Write ("Friend ");
- break;
- case MemberAttributes.FamilyAndAssembly:
- Output.Write ("Friend ");
- break;
- case MemberAttributes.Family:
- Output.Write ("Protected ");
- break;
- case MemberAttributes.FamilyOrAssembly:
- Output.Write ("Protected Friend ");
- break;
- case MemberAttributes.Private:
- Output.Write ("Private ");
- break;
- case MemberAttributes.Public:
- Output.Write ("Public ");
- break;
- }
- }
-
- protected override void OutputMemberScopeModifier (MemberAttributes attributes)
- {
- if ((attributes & MemberAttributes.VTableMask) == MemberAttributes.New)
- Output.Write ("New ");
-
- switch (attributes & MemberAttributes.ScopeMask) {
- case MemberAttributes.Abstract:
- Output.Write ("MustOverride ");
- break;
- case MemberAttributes.Final:
- Output.Write ("NotOverridable ");
- break;
- case MemberAttributes.Static:
- Output.Write ("Shared ");
- break;
- case MemberAttributes.Override:
- Output.Write ("Overrides ");
- break;
- default:
- //
- // FUNNY! if the scope value is
- // rubbish (0 or >Const), and access
- // is public or protected, make it
- // "virtual".
- //
- // i'm not sure whether this is 100%
- // correct, but it seems to be MS
- // behavior.
- //
- MemberAttributes access = attributes & MemberAttributes.AccessMask;
- if ( access == MemberAttributes.Public ||
- access == MemberAttributes.Family )
- Output.Write ("Overridable ");
- break;
- }
- }
-
- protected override void OutputOperator (CodeBinaryOperatorType op)
- {
- switch (op) {
- case CodeBinaryOperatorType.Add:
- Output.Write ("+");
- break;
- case CodeBinaryOperatorType.Subtract:
- Output.Write ("-");
- break;
- case CodeBinaryOperatorType.Multiply:
- Output.Write ("*");
- break;
- case CodeBinaryOperatorType.Divide:
- Output.Write ("/");
- break;
- case CodeBinaryOperatorType.Modulus:
- Output.Write ("Mod");
- break;
- case CodeBinaryOperatorType.Assign:
- Output.Write ("=");
- break;
- case CodeBinaryOperatorType.IdentityInequality:
- Output.Write ("<>");
- break;
- case CodeBinaryOperatorType.IdentityEquality:
- Output.Write ("Is");
- break;
- case CodeBinaryOperatorType.ValueEquality:
- Output.Write ("=");
- break;
- case CodeBinaryOperatorType.BitwiseOr:
- Output.Write ("Or");
- break;
- case CodeBinaryOperatorType.BitwiseAnd:
- Output.Write ("And");
- break;
- case CodeBinaryOperatorType.BooleanOr:
- Output.Write ("OrElse");
- break;
- case CodeBinaryOperatorType.BooleanAnd:
- Output.Write ("AndAlso");
- break;
- case CodeBinaryOperatorType.LessThan:
- Output.Write ("<");
- break;
- case CodeBinaryOperatorType.LessThanOrEqual:
- Output.Write ("<=");
- break;
- case CodeBinaryOperatorType.GreaterThan:
- Output.Write (">");
- break;
- case CodeBinaryOperatorType.GreaterThanOrEqual:
- Output.Write (">=");
- break;
- }
- }
-
- protected override void OutputTypeAttributes (TypeAttributes attributes, bool isStruct, bool isEnum)
- {
- TextWriter output = Output;
-
- switch (attributes & TypeAttributes.VisibilityMask) {
- case TypeAttributes.NotPublic:
- // Does this mean friend access?
- output.Write ("Friend ");
- break;
-
- case TypeAttributes.Public:
- case TypeAttributes.NestedPublic:
- output.Write ("Public ");
- break;
-
- case TypeAttributes.NestedPrivate:
- output.Write ("Private ");
- break;
- case TypeAttributes.NestedAssembly:
- output.Write ("Friend ");
- break;
- case TypeAttributes.NestedFamily:
- output.Write ("Protected ");
- break;
- case TypeAttributes.NestedFamORAssem:
- output.Write ("Protected Friend");
- break;
- case TypeAttributes.NestedFamANDAssem:
- output.Write ("Friend ");
- break;
- }
-
- if (isStruct)
- output.Write ("Structure ");
-
- else if (isEnum)
- output.Write ("Enumeration ");
-
- else {
- if ((attributes & TypeAttributes.Interface) != 0)
- output.Write ("Interface ");
-
- else {
- if ((attributes & TypeAttributes.Sealed) != 0)
- output.Write ("NotInheritable ");
-
- if ((attributes & TypeAttributes.Abstract) != 0)
- output.Write ("MustInherit ");
-
- output.Write ("Class ");
- }
- }
- }
-
- protected override void OutputTypeNamePair (CodeTypeReference typeRef, String name)
- {
- Output.Write (name + " As " + GetTypeOutput (typeRef));
- }
-
- protected override void OutputType (CodeTypeReference type)
- {
- Output.Write (GetTypeOutput (type));
- }
-
- [MonoTODO ("not implemented")]
- protected override string QuoteSnippetString (string value)
- {
- // FIXME: escape ASCII chars that are not code compatible (e.g. vbcrlf)
- return value;
- }
-
- private void GenerateDeclaration (CodeTypeReference type, string name, CodeExpression initExpression)
- {
- TextWriter output = Output;
-
- OutputTypeNamePair (type, name);
-
- if (initExpression != null) {
- output.Write (" = ");
- GenerateExpression (initExpression);
- }
-
- output.WriteLine ();
- }
-
- private void GenerateMemberReferenceExpression (CodeExpression targetObject, string memberName)
- {
- GenerateExpression (targetObject);
- Output.Write ('.');
- Output.Write (memberName);
- }
-
- /*
- * ICodeGenerator
- */
-
- protected override string CreateEscapedIdentifier (string value)
- {
- for (int x = 0; x < Keywords.Length; x++)
- if (value.ToLower().Equals (Keywords[x].ToLower()))
- return "[" + value + "]";
- return value;
- }
-
- protected override string CreateValidIdentifier (string value)
- {
- for (int x = 0; x < Keywords.Length; x++)
- if (value.ToLower().Equals (Keywords[x].ToLower()))
- return "_" + value;
- return value;
- }
-
- protected override string GetTypeOutput (CodeTypeReference type)
- {
- string output;
- CodeTypeReference arrayType;
-
- arrayType = type.ArrayElementType;
- if (arrayType != null)
- output = GetTypeOutput (arrayType);
- else {
- switch (type.BaseType) {
-
- case "System.Decimal":
- output = "Decimal";
- break;
- case "System.Double":
- output = "Double";
- break;
- case "System.Single":
- output = "Single";
- break;
-
- case "System.Byte":
- output = "Byte";
- break;
- case "System.SByte":
- output = "SByte";
- break;
- case "System.Int32":
- output = "Integer";
- break;
- case "System.UInt32":
- output = "UInt32";
- break;
- case "System.Int64":
- output = "Long";
- break;
- case "System.UInt64":
- output = "UInt64";
- break;
- case "System.Int16":
- output = "Short";
- break;
- case "System.UInt16":
- output = "UInt16";
- break;
-
- case "System.Boolean":
- output = "Boolean";
- break;
-
- case "System.Char":
- output = "Char";
- break;
-
- case "System.String":
- output = "String";
- break;
- case "System.Object":
- output = "Object";
- break;
-
- case "System.Void":
- output = "Nothing";
- break;
-
- default:
- output = type.BaseType;
- break;
- }
- }
-
- int rank = type.ArrayRank;
- if (rank > 0) {
- output += "(";
- for (--rank; rank > 0; --rank)
- output += ",";
- output += ")";
- }
-
- return output;
- }
-
- protected override bool IsValidIdentifier (string identifier)
- {
- for (int x = 0; x < Keywords.Length; x++)
- if (identifier.ToLower().Equals (Keywords[x].ToLower()))
- return false;
- return true;
- }
-
- protected override bool Supports (GeneratorSupport supports)
- {
- return true;
- }
- }
-}
+\r
+using System;\r
+using System.Text;\r
+using System.Text.RegularExpressions;\r
+using System.CodeDom;\r
+using System.CodeDom.Compiler;\r
+using System.IO;\r
+using System.Reflection;\r
+using System.Collections;\r
+\r
+namespace Microsoft.VisualBasic\r
+{\r
+ internal class VBCodeGenerator : CodeGenerator\r
+ {\r
+ private string[] Keywords = new string[] {\r
+ "AddHandler", "AddressOf", "Alias", "And",\r
+ "AndAlso", "Ansi", "As", "Assembly",\r
+ "Auto", "Boolean", "ByRef", "Byte", \r
+ "ByVal", "Call", "Case", "Catch", \r
+ "CBool", "CByte", "CChar", "CDate", \r
+ "CDec", "CDbl", "Char", "CInt", \r
+ "Class", "CLng", "CObj", "Const", \r
+ "CShort", "CSng", "CStr", "CType", \r
+ "Date", "Decimal", "Declare", "Default", \r
+ "Delegate", "Dim", "DirectCast", "Do", \r
+ "Double", "Each", "Else", "ElseIf", \r
+ "End", "Enum", "Erase", "Error", \r
+ "Event", "Exit", "False", "Finally", \r
+ "For", "Friend", "Function", "Get", \r
+ "GetType", "GoSub", "GoTo", "Handles", \r
+ "If", "Implements", "Imports", "In", \r
+ "Inherits", "Integer", "Interface", "Is", \r
+ "Let", "Lib", "Like", "Long", \r
+ "Loop", "Me", "Mod", "Module", \r
+ "MustInherit", "MustOverride", "MyBase", "MyClass", \r
+ "Namespace", "New", "Next", "Not", \r
+ "Nothing", "NotInheritable", "NotOverridable", "Object", \r
+ "On", "Option", "Optional", "Or", \r
+ "OrElse", "Overloads", "Overridable", "Overrides", \r
+ "ParamArray", "Preserve", "Private", "Property", \r
+ "Protected", "Public", "RaiseEvent", "ReadOnly", \r
+ "ReDim", "REM", "RemoveHandler", "Resume", \r
+ "Return", "Select", "Set", "Shadows", \r
+ "Shared", "Short", "Single", "Static", \r
+ "Step", "Stop", "String", "Structure", \r
+ "Sub", "SyncLock", "Then", "Throw", \r
+ "To", "True", "Try", "TypeOf", \r
+ "Unicode", "Until", "Variant", "When", \r
+ "While", "With", "WithEvents", "WriteOnly", \r
+ "Xor" \r
+ };\r
+\r
+ public VBCodeGenerator()\r
+ {\r
+ }\r
+\r
+ protected override string NullToken {\r
+ get {\r
+ return "Nothing";\r
+ }\r
+ }\r
+\r
+ protected override void GenerateArrayCreateExpression (CodeArrayCreateExpression expression)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write ("New ");\r
+\r
+ CodeExpressionCollection initializers = expression.Initializers;\r
+ CodeTypeReference createType = expression.CreateType;\r
+\r
+ if (initializers.Count > 0) {\r
+\r
+ OutputType (createType);\r
+ \r
+ output.WriteLine (" {");\r
+ ++Indent;\r
+ OutputExpressionList (initializers, true);\r
+ --Indent;\r
+ output.Write ("}");\r
+\r
+ } \r
+ else {\r
+ CodeTypeReference arrayType = createType.ArrayElementType;\r
+ while (arrayType != null) \r
+ {\r
+ createType = arrayType;\r
+ arrayType = arrayType.ArrayElementType;\r
+ }\r
+\r
+ OutputType (createType);\r
+\r
+ output.Write ('(');\r
+\r
+ CodeExpression size = expression.SizeExpression;\r
+ if (size != null)\r
+ GenerateExpression (size);\r
+ else\r
+ output.Write (expression.Size);\r
+\r
+ output.Write (')');\r
+ }\r
+ }\r
+\r
+ protected override void GenerateBaseReferenceExpression (CodeBaseReferenceExpression expression)\r
+ {\r
+ Output.Write ("MyBase");\r
+ }\r
+\r
+ protected override void GenerateCastExpression (CodeCastExpression expression)\r
+ {\r
+ TextWriter output = Output;\r
+ // ENHANCE: Use a DirectCast if it is known that expression.Expression is no Value-Type\r
+ output.Write ("CType(");\r
+ GenerateExpression (expression.Expression);\r
+ output.Write (", ");\r
+ OutputType (expression.TargetType);\r
+ output.Write (")");\r
+ }\r
+\r
+ private bool AsBool(object datavalue)\r
+ {\r
+ return datavalue != null && datavalue is bool && (bool)datavalue;\r
+ }\r
+ \r
+ private string OnOff(bool datavalue)\r
+ {\r
+ return datavalue?"On":"Off";\r
+ }\r
+\r
+ protected override void GenerateCompileUnitStart (CodeCompileUnit compileUnit)\r
+ {\r
+ GenerateComment (new CodeComment ("------------------------------------------------------------------------------"));\r
+ GenerateComment (new CodeComment (" <autogenerated>"));\r
+ GenerateComment (new CodeComment (" This code was generated by a tool."));\r
+ GenerateComment (new CodeComment (" Mono Runtime Version: " + System.Environment.Version));\r
+ GenerateComment (new CodeComment (""));\r
+ GenerateComment (new CodeComment (" Changes to this file may cause incorrect behavior and will be lost if "));\r
+ GenerateComment (new CodeComment (" the code is regenerated."));\r
+ GenerateComment (new CodeComment (" </autogenerated>"));\r
+ GenerateComment (new CodeComment ("------------------------------------------------------------------------------"));\r
+ Output.WriteLine ();\r
+ Output.WriteLine("Option Explicit {0}",OnOff(AsBool(compileUnit.UserData["RequireVariableDeclaration"])));\r
+ Output.WriteLine("Option Strict {0}",OnOff(!AsBool(compileUnit.UserData["AllowLateBound"])));\r
+ Output.WriteLine (); \r
+ }\r
+\r
+ protected override void GenerateDelegateCreateExpression (CodeDelegateCreateExpression expression)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write ("AddressOf ");\r
+\r
+ CodeExpression targetObject = expression.TargetObject;\r
+ if (targetObject != null) {\r
+ GenerateExpression (targetObject);\r
+ Output.Write ('.');\r
+ }\r
+ output.Write (expression.MethodName);\r
+ }\r
+\r
+ protected override void GenerateFieldReferenceExpression (CodeFieldReferenceExpression expression)\r
+ {\r
+ CodeExpression targetObject = expression.TargetObject;\r
+ if (targetObject != null) {\r
+ GenerateExpression (targetObject);\r
+ Output.Write ('.');\r
+ }\r
+ Output.Write (expression.FieldName);\r
+ }\r
+ \r
+ protected override void GenerateArgumentReferenceExpression (CodeArgumentReferenceExpression expression)\r
+ {\r
+ Output.Write (expression.ParameterName);\r
+ }\r
+\r
+ protected override void GenerateVariableReferenceExpression (CodeVariableReferenceExpression expression)\r
+ {\r
+ Output.Write (expression.VariableName);\r
+ }\r
+ \r
+ protected override void GenerateIndexerExpression (CodeIndexerExpression expression)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ GenerateExpression (expression.TargetObject);\r
+ output.Write ('(');\r
+ OutputExpressionList (expression.Indices);\r
+ output.Write (')');\r
+ }\r
+ \r
+ protected override void GenerateArrayIndexerExpression (CodeArrayIndexerExpression expression)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ GenerateExpression (expression.TargetObject);\r
+ output.Write (".Item(");\r
+ OutputExpressionList (expression.Indices);\r
+ output.Write (')');\r
+ }\r
+ \r
+ protected override void GenerateSnippetExpression (CodeSnippetExpression expression)\r
+ {\r
+ Output.Write (expression.Value);\r
+ }\r
+ \r
+ protected override void GenerateMethodInvokeExpression (CodeMethodInvokeExpression expression)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ GenerateMethodReferenceExpression (expression.Method);\r
+\r
+ output.Write ('(');\r
+ OutputExpressionList (expression.Parameters);\r
+ output.Write (')');\r
+ }\r
+\r
+ protected override void GenerateMethodReferenceExpression (CodeMethodReferenceExpression expression)\r
+ {\r
+ GenerateExpression (expression.TargetObject);\r
+ Output.Write ('.');\r
+ Output.Write (expression.MethodName);\r
+ }\r
+\r
+ protected override void GenerateEventReferenceExpression (CodeEventReferenceExpression expression)\r
+ {\r
+ GenerateExpression (expression.TargetObject);\r
+ Output.Write ('.');\r
+ Output.Write (expression.EventName);\r
+ }\r
+\r
+ protected override void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression expression)\r
+ {\r
+ Output.Write ("RaiseEvent ");\r
+ GenerateExpression (expression.TargetObject);\r
+ Output.Write ('(');\r
+ OutputExpressionList (expression.Parameters);\r
+ Output.WriteLine (')');\r
+ }\r
+ \r
+ protected override void GenerateObjectCreateExpression (CodeObjectCreateExpression expression)\r
+ {\r
+ Output.Write( "New " );\r
+ OutputType (expression.CreateType);\r
+ Output.Write ('(');\r
+ OutputExpressionList (expression.Parameters);\r
+ Output.Write (')');\r
+ }\r
+\r
+ protected override void GenerateParameterDeclarationExpression (CodeParameterDeclarationExpression e)\r
+ {\r
+ if (e.CustomAttributes != null && e.CustomAttributes.Count > 0)\r
+ OutputAttributeDeclarations (e.CustomAttributes);\r
+ OutputDirection (e.Direction);\r
+ OutputTypeNamePair (e.Type, e.Name);\r
+ }\r
+\r
+ protected override void GeneratePrimitiveExpression (CodePrimitiveExpression e)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ if (e.Value == null) {\r
+ output.Write (NullToken);\r
+ return;\r
+ }\r
+\r
+ Type type = e.Value.GetType ();\r
+ if (type == typeof (bool)) {\r
+ if ((bool)e.Value)\r
+ output.Write ("True");\r
+ else\r
+ output.Write ("False");\r
+ } \r
+ else if (type == typeof (char)) {\r
+ output.Write ("\"" + e.Value.ToString () + "\"c");\r
+ } \r
+ else if (type == typeof (string)) {\r
+ output.Write (QuoteSnippetString ((string) e.Value));\r
+ } \r
+ else if (type == typeof (byte) || type == typeof (sbyte) || type == typeof (short) ||\r
+ type == typeof (int) || type == typeof (long) || type == typeof (float) ||\r
+ type == typeof (double) || type == typeof (decimal)) {\r
+ output.Write (e.Value.ToString ());\r
+ } \r
+ else {\r
+ throw new ArgumentException ("Value type (" + type + ") is not a primitive type");\r
+ }\r
+ }\r
+\r
+ protected override void GeneratePropertyReferenceExpression (CodePropertyReferenceExpression expression)\r
+ {\r
+ GenerateMemberReferenceExpression (expression.TargetObject, expression.PropertyName);\r
+ }\r
+\r
+ protected override void GeneratePropertySetValueReferenceExpression (CodePropertySetValueReferenceExpression expression)\r
+ {\r
+ Output.Write ("Value"); \r
+ }\r
+\r
+ protected override void GenerateThisReferenceExpression (CodeThisReferenceExpression expression)\r
+ {\r
+ Output.Write ("Me");\r
+ }\r
+\r
+ protected override void GenerateExpressionStatement (CodeExpressionStatement statement)\r
+ {\r
+ GenerateExpression (statement.Expression);\r
+ Output.WriteLine (); //start new line\r
+ }\r
+\r
+ protected override void GenerateIterationStatement (CodeIterationStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ GenerateStatement (statement.InitStatement);\r
+ output.Write ("Do While ");\r
+ GenerateExpression (statement.TestExpression);\r
+ output.WriteLine ();\r
+ GenerateStatements (statement.Statements);\r
+ GenerateStatement (statement.IncrementStatement);\r
+ output.WriteLine ("Loop");\r
+ }\r
+\r
+ protected override void GenerateThrowExceptionStatement (CodeThrowExceptionStatement statement)\r
+ {\r
+ Output.Write ("Throw ");\r
+ GenerateExpression (statement.ToThrow);\r
+ }\r
+\r
+ protected override void GenerateComment (CodeComment comment)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ if (comment.DocComment)\r
+ output.Write ("''' ");\r
+ else\r
+ output.Write ("' ");\r
+\r
+ output.WriteLine (comment.Text);\r
+ }\r
+\r
+ protected override void GenerateMethodReturnStatement (CodeMethodReturnStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write ("Return ");\r
+ GenerateExpression (statement.Expression);\r
+ output.WriteLine ();\r
+ }\r
+\r
+ protected override void GenerateConditionStatement (CodeConditionStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+ output.Write ("If (");\r
+\r
+ GenerateExpression (statement.Condition);\r
+\r
+ output.WriteLine (") Then");\r
+ ++Indent;\r
+ GenerateStatements (statement.TrueStatements);\r
+ --Indent;\r
+\r
+ CodeStatementCollection falses = statement.FalseStatements;\r
+ if (falses.Count > 0) {\r
+ output.WriteLine ("Else");\r
+ ++Indent;\r
+ GenerateStatements (falses);\r
+ --Indent;\r
+ }\r
+ else {\r
+ if (Options.ElseOnClosing)\r
+ output.WriteLine ("Else");\r
+ }\r
+ output.WriteLine ("End If");\r
+ }\r
+\r
+ protected override void GenerateTryCatchFinallyStatement (CodeTryCatchFinallyStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.WriteLine ("Try");\r
+ ++Indent;\r
+ GenerateStatements (statement.TryStatements);\r
+ --Indent;\r
+ output.WriteLine ();\r
+ \r
+ foreach (CodeCatchClause clause in statement.CatchClauses) {\r
+ output.Write ("Catch ");\r
+ OutputTypeNamePair (clause.CatchExceptionType, clause.LocalName);\r
+ output.WriteLine ();\r
+ ++Indent;\r
+ GenerateStatements (clause.Statements);\r
+ --Indent;\r
+ output.WriteLine ();\r
+ }\r
+\r
+ CodeStatementCollection finallies = statement.FinallyStatements;\r
+ if (finallies.Count > 0) {\r
+\r
+ output.WriteLine ("Finally");\r
+ ++Indent;\r
+ GenerateStatements (finallies);\r
+ --Indent;\r
+ output.WriteLine ();\r
+ }\r
+\r
+ if (Options.ElseOnClosing) {\r
+ if (statement.CatchClauses.Count == 0)\r
+ output.WriteLine ("Catch");\r
+ if (statement.FinallyStatements.Count == 0)\r
+ output.WriteLine ("Finally");\r
+ }\r
+\r
+ output.WriteLine("End Try");\r
+ }\r
+\r
+ protected override void GenerateAssignStatement (CodeAssignStatement statement)\r
+ { \r
+ TextWriter output = Output;\r
+ GenerateExpression (statement.Left);\r
+ output.Write (" = ");\r
+ GenerateExpression (statement.Right);\r
+ output.WriteLine ();\r
+ }\r
+\r
+ protected override void GenerateAttachEventStatement (CodeAttachEventStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ Output.Write ("AddHandler ");\r
+ GenerateEventReferenceExpression (statement.Event);\r
+ Output.Write ( ", ");\r
+ GenerateExpression (statement.Listener);\r
+ output.WriteLine ();\r
+ }\r
+\r
+ protected override void GenerateRemoveEventStatement (CodeRemoveEventStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ Output.Write ("RemoveHandler ");\r
+ GenerateEventReferenceExpression (statement.Event);\r
+ Output.Write ( ", ");\r
+ GenerateExpression (statement.Listener);\r
+ output.WriteLine ();\r
+ }\r
+\r
+ protected override void GenerateGotoStatement (CodeGotoStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write ("Goto ");\r
+ output.Write (statement.Label);\r
+ output.WriteLine ();\r
+ }\r
+ \r
+ protected override void GenerateLabeledStatement (CodeLabeledStatement statement)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write (statement.Label + ":");\r
+ GenerateStatement (statement.Statement);\r
+ }\r
+\r
+ protected override void GenerateTypeOfExpression (CodeTypeOfExpression e)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write ("GetType(");\r
+ OutputType (e.Type);\r
+ output.Write (")");\r
+ }\r
+\r
+ protected override void GenerateVariableDeclarationStatement( CodeVariableDeclarationStatement statement )\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write ("Dim ");\r
+ OutputTypeNamePair (statement.Type, statement.Name);\r
+\r
+ CodeExpression initExpression = statement.InitExpression;\r
+ if (initExpression != null) \r
+ {\r
+ output.Write (" = ");\r
+ GenerateExpression (initExpression);\r
+ }\r
+\r
+ output.WriteLine();\r
+ }\r
+\r
+ protected override void GenerateLinePragmaStart (CodeLinePragma linePragma)\r
+ {\r
+ Output.WriteLine ();\r
+ Output.Write ("#ExternalSource(");\r
+ Output.Write (linePragma.FileName);\r
+ Output.Write (", ");\r
+ Output.Write (linePragma.LineNumber);\r
+ Output.WriteLine (")");\r
+ }\r
+\r
+ protected override void GenerateLinePragmaEnd (CodeLinePragma linePragma)\r
+ {\r
+ Output.WriteLine ("#End ExternalSource");\r
+ }\r
+\r
+ protected override void GenerateEvent (CodeMemberEvent eventRef, CodeTypeDeclaration declaration)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ if (eventRef.CustomAttributes.Count > 0)\r
+ OutputAttributeDeclarations (eventRef.CustomAttributes);\r
+\r
+ MemberAttributes attributes = eventRef.Attributes;\r
+\r
+ OutputMemberAccessModifier (attributes);\r
+ OutputMemberScopeModifier (attributes);\r
+\r
+ output.Write ("Event ");\r
+ OutputTypeNamePair (eventRef.Type, eventRef.Name);\r
+ output.WriteLine ();\r
+ }\r
+\r
+ protected override void GenerateField (CodeMemberField field)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ if (field.CustomAttributes.Count > 0)\r
+ OutputAttributeDeclarations (field.CustomAttributes);\r
+\r
+ MemberAttributes attributes = field.Attributes;\r
+ OutputMemberAccessModifier (attributes);\r
+ OutputFieldScopeModifier (attributes);\r
+\r
+ OutputTypeNamePair (field.Type, field.Name);\r
+\r
+ CodeExpression initExpression = field.InitExpression;\r
+ if (initExpression != null) {\r
+ output.Write (" = ");\r
+ GenerateExpression (initExpression);\r
+ }\r
+\r
+ output.WriteLine();\r
+ }\r
+ \r
+ protected override void GenerateSnippetMember (CodeSnippetTypeMember member)\r
+ {\r
+ Output.Write (member.Text);\r
+ }\r
+ \r
+ protected override void GenerateEntryPointMethod( CodeEntryPointMethod method, CodeTypeDeclaration declaration )\r
+ {\r
+ method.Name = "Main";\r
+ GenerateMethod (method, declaration);\r
+ }\r
+ \r
+ [MonoTODO ("partially implemented")]\r
+ protected override void GenerateMethod (CodeMemberMethod method, CodeTypeDeclaration declaration)\r
+ {\r
+ bool isSub = method.ReturnType == null || method.ReturnType.BaseType == "System.Void";\r
+\r
+ TextWriter output = Output;\r
+\r
+ if (method.CustomAttributes.Count > 0)\r
+ OutputAttributeDeclarations (method.CustomAttributes);\r
+\r
+ MemberAttributes attributes = method.Attributes;\r
+\r
+ OutputMemberAccessModifier (attributes);\r
+ OutputMemberScopeModifier (attributes);\r
+\r
+ if (isSub)\r
+ output.Write ("Sub ");\r
+ else\r
+ output.Write ("Function ");\r
+\r
+ output.Write (method.Name);\r
+ output.Write ('(');\r
+ OutputParameters (method.Parameters);\r
+ output.Write (')');\r
+\r
+ if (!isSub) {\r
+ output.Write (" As ");\r
+ OutputType (method.ReturnType);\r
+ }\r
+\r
+ if (method.ImplementationTypes.Count > 0) {\r
+ output.Write (" Implements ");\r
+ foreach (CodeTypeReference type in method.ImplementationTypes)\r
+ {\r
+ OutputType (type);\r
+ output.Write ('.');\r
+ // TODO implementation incomplete\r
+\r
+ }\r
+ }\r
+\r
+ // TODO private implementations\r
+\r
+ if ((attributes & MemberAttributes.ScopeMask) == MemberAttributes.Abstract)\r
+ output.WriteLine ();\r
+ else {\r
+ output.WriteLine ();\r
+ ++Indent;\r
+ GenerateStatements (method.Statements);\r
+ --Indent;\r
+ if (isSub)\r
+ output.WriteLine ("End Sub");\r
+ else\r
+ output.WriteLine ("End Function");\r
+ }\r
+ }\r
+\r
+ protected override void GenerateProperty (CodeMemberProperty property, CodeTypeDeclaration declaration)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ if (property.CustomAttributes.Count > 0)\r
+ OutputAttributeDeclarations (property.CustomAttributes);\r
+\r
+ MemberAttributes attributes = property.Attributes;\r
+ OutputMemberAccessModifier (attributes);\r
+ OutputMemberScopeModifier (attributes);\r
+\r
+ if (property.HasGet && (!property.HasSet))\r
+ output.Write ("ReadOnly " );\r
+\r
+ if (property.HasSet && (!property.HasGet))\r
+ output.Write ("WriteOnly " );\r
+\r
+ output.Write ("Property " );\r
+ \r
+ OutputTypeNamePair (property.Type, property.Name);\r
+ output.WriteLine ();\r
+ ++Indent;\r
+\r
+ if (property.HasGet) {\r
+ output.WriteLine ("Get");\r
+ ++Indent;\r
+\r
+ GenerateStatements (property.GetStatements);\r
+\r
+ --Indent;\r
+ output.WriteLine ("End Get");\r
+ }\r
+ \r
+ if (property.HasSet) {\r
+ output.Write ("Set (");\r
+ OutputTypeNamePair (property.Type, "Value");
+ output.WriteLine (")");
+ ++Indent;\r
+\r
+ GenerateStatements (property.SetStatements);\r
+\r
+ --Indent;\r
+ output.WriteLine ("End Set");\r
+ }\r
+\r
+ --Indent;\r
+ output.WriteLine ("End Property");\r
+ }\r
+\r
+ [MonoTODO ("not implemented")]\r
+ protected override void GenerateConstructor (CodeConstructor constructor, CodeTypeDeclaration declaration)\r
+ {\r
+ if (constructor.CustomAttributes.Count > 0)\r
+ OutputAttributeDeclarations (constructor.CustomAttributes);\r
+ OutputMemberAccessModifier (constructor.Attributes);\r
+ Output.Write ("Sub New(");\r
+ OutputParameters (constructor.Parameters);\r
+ Output.WriteLine (")");\r
+ // Handle BaseConstructorArgs, ChainedConstructorArgs, ImplementationTypes\r
+ Indent++;\r
+ GenerateStatements (constructor.Statements);\r
+ Indent--;\r
+ Output.WriteLine ("End Sub");\r
+ }\r
+ \r
+ protected override void GenerateTypeConstructor (CodeTypeConstructor constructor)\r
+ {\r
+ Output.WriteLine ("Shared Sub New()");\r
+ Indent++;\r
+ GenerateStatements (constructor.Statements);\r
+ Indent--;\r
+ Output.WriteLine ("End Sub");\r
+ }\r
+\r
+ [MonoTODO ("not implemented")]\r
+ protected override void GenerateTypeStart (CodeTypeDeclaration declaration)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ if (declaration.CustomAttributes.Count > 0)\r
+ OutputAttributeDeclarations (declaration.CustomAttributes);\r
+ TypeAttributes attributes = declaration.TypeAttributes;\r
+ OutputTypeAttributes (attributes,\r
+ declaration.IsStruct,\r
+ declaration.IsEnum);\r
+\r
+ output.WriteLine (declaration.Name);\r
+\r
+ ++Indent;\r
+ \r
+ IEnumerator enumerator = declaration.BaseTypes.GetEnumerator();\r
+ if (enumerator.MoveNext()) \r
+ {\r
+ CodeTypeReference type = (CodeTypeReference)enumerator.Current;\r
+ \r
+ if (type != null)\r
+ {\r
+ output.Write ("Inherits ");\r
+ OutputType (type);\r
+ output.WriteLine ();\r
+ }\r
+ \r
+ while (enumerator.MoveNext()) \r
+ {\r
+ type = (CodeTypeReference)enumerator.Current;\r
+ \r
+ if (type != null)\r
+ {\r
+ output.Write ("Implements ");\r
+ OutputType (type);\r
+ output.WriteLine ();\r
+ }\r
+ }\r
+ } \r
+ }\r
+\r
+ protected override void GenerateTypeEnd (CodeTypeDeclaration declaration)\r
+ {\r
+ string output = string.Empty;\r
+\r
+ --Indent;\r
+ if (declaration.IsStruct)\r
+ output = "End Structure";\r
+ if (declaration.IsInterface)\r
+ output = "End Interface";\r
+ if (declaration.IsEnum)\r
+ output = "End Enum";\r
+ if (declaration.IsClass)\r
+ output = "End Class";\r
+\r
+ Output.WriteLine (output);\r
+ }\r
+\r
+ protected override void GenerateNamespace(CodeNamespace ns)\r
+ {\r
+ GenerateCommentStatements (ns.Comments);\r
+ \r
+ bool Imports2MSVBFound;\r
+ Imports2MSVBFound = false;\r
+ if (null != ns.Imports) \r
+ {\r
+ foreach (CodeNamespaceImport import in ns.Imports)\r
+ {\r
+ if (string.Compare (import.Namespace, "Microsoft.VisualBasic", true, System.Globalization.CultureInfo.InvariantCulture) == 0)\r
+ Imports2MSVBFound = true;\r
+ }\r
+ }\r
+ // add standard import to Microsoft.VisualBasic if missing\r
+ if (Imports2MSVBFound == false)\r
+ Output.WriteLine ("Imports Microsoft.VisualBasic");\r
+ // add regular imports\r
+ GenerateNamespaceImports (ns);\r
+\r
+ TextWriter output = Output;\r
+ output.WriteLine(); \r
+ GenerateNamespaceStart (ns); \r
+ GenerateTypes (ns);\r
+ GenerateNamespaceEnd (ns);\r
+ }\r
+\r
+\r
+ protected override void GenerateNamespaceStart (CodeNamespace ns)\r
+ {\r
+ TextWriter output = Output;\r
+ \r
+ string name = ns.Name;\r
+ if (name != null && name != string.Empty) {\r
+ output.Write ("Namespace ");\r
+ output.WriteLine (name);\r
+ ++Indent;\r
+ }\r
+ }\r
+\r
+ protected override void GenerateNamespaceEnd (CodeNamespace ns)\r
+ {\r
+ string name = ns.Name;\r
+ if (name != null && name != string.Empty) {\r
+ --Indent;\r
+ Output.WriteLine ("End Namespace");\r
+ }\r
+ }\r
+\r
+ protected override void GenerateNamespaceImport (CodeNamespaceImport import)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ output.Write ("Imports ");\r
+ output.Write (import.Namespace);\r
+ output.WriteLine ();\r
+ }\r
+ \r
+ protected override void GenerateAttributeDeclarationsStart (CodeAttributeDeclarationCollection attributes)\r
+ {\r
+ Output.Write ('<');\r
+ }\r
+ \r
+ protected override void GenerateAttributeDeclarationsEnd (CodeAttributeDeclarationCollection attributes)\r
+ {\r
+ Output.WriteLine ("> _");\r
+ }\r
+\r
+ protected override void OutputDirection (FieldDirection direction)\r
+ {\r
+ switch (direction) {\r
+ case FieldDirection.In:\r
+ //there is no "In"\r
+ break;\r
+ case FieldDirection.Out:\r
+ Output.Write ("ByVal ");\r
+ break;\r
+ case FieldDirection.Ref:\r
+ Output.Write ("ByRef ");\r
+ break;\r
+ }\r
+ }\r
+\r
+ protected override void OutputFieldScopeModifier (MemberAttributes attributes)\r
+ {\r
+ if ((attributes & MemberAttributes.VTableMask) == MemberAttributes.New)\r
+ Output.Write ("New ");\r
+\r
+ switch (attributes & MemberAttributes.ScopeMask) {\r
+ case MemberAttributes.Static:\r
+ Output.Write ("Shared ");\r
+ break;\r
+ case MemberAttributes.Const:\r
+ Output.Write ("Const ");\r
+ break;\r
+ }\r
+ }\r
+\r
+ protected override void OutputMemberAccessModifier (MemberAttributes attributes)\r
+ {\r
+ switch (attributes & MemberAttributes.AccessMask) {\r
+ case MemberAttributes.Assembly:\r
+ Output.Write ("Friend ");\r
+ break;\r
+ case MemberAttributes.FamilyAndAssembly:\r
+ Output.Write ("Friend "); \r
+ break;\r
+ case MemberAttributes.Family:\r
+ Output.Write ("Protected ");\r
+ break;\r
+ case MemberAttributes.FamilyOrAssembly:\r
+ Output.Write ("Protected Friend ");\r
+ break;\r
+ case MemberAttributes.Private:\r
+ Output.Write ("Private ");\r
+ break;\r
+ case MemberAttributes.Public:\r
+ Output.Write ("Public ");\r
+ break;\r
+ }\r
+ }\r
+\r
+ protected override void OutputMemberScopeModifier (MemberAttributes attributes)\r
+ {\r
+ if ((attributes & MemberAttributes.VTableMask) == MemberAttributes.New)\r
+ Output.Write ("New ");\r
+\r
+ switch (attributes & MemberAttributes.ScopeMask) {\r
+ case MemberAttributes.Abstract:\r
+ Output.Write ("MustOverride ");\r
+ break;\r
+ case MemberAttributes.Final:\r
+ //JW 2004-06-03: seems to be the "sealed" keyword in C# and the "NotOverridable" keyword in VB, but conflicts with ASP.NET generation
+ //Output.Write ("NotOverridable ");\r
+ break;\r
+ case MemberAttributes.Static:\r
+ Output.Write ("Shared ");\r
+ break;\r
+ case MemberAttributes.Override:\r
+ Output.Write ("Overrides ");\r
+ break;\r
+ case MemberAttributes.Overloaded:
+ // based on http://gendotnet.com/Code%20Gen%20Articles/codedom.htm
+ Output.Write ("Overloads ");
+ MemberAttributes access_ovl = attributes & MemberAttributes.AccessMask;
+ if ( access_ovl == MemberAttributes.Public ||
+ access_ovl == MemberAttributes.Family )
+ Output.Write ("Overridable ");
+ break;
+ default:\r
+ //\r
+ // FUNNY! if the scope value is\r
+ // rubbish (0 or >Const), and access\r
+ // is public or protected, make it\r
+ // "virtual".\r
+ //\r
+ // i'm not sure whether this is 100%\r
+ // correct, but it seems to be MS\r
+ // behavior. \r
+ //\r
+ MemberAttributes access = attributes & MemberAttributes.AccessMask;\r
+ if ( access == MemberAttributes.Public || \r
+ access == MemberAttributes.Family )\r
+ Output.Write ("Overridable ");\r
+ break;\r
+ }\r
+ }\r
+\r
+ protected override void OutputOperator (CodeBinaryOperatorType op)\r
+ {\r
+ switch (op) {\r
+ case CodeBinaryOperatorType.Add:\r
+ Output.Write ("+");\r
+ break;\r
+ case CodeBinaryOperatorType.Subtract:\r
+ Output.Write ("-");\r
+ break;\r
+ case CodeBinaryOperatorType.Multiply:\r
+ Output.Write ("*");\r
+ break;\r
+ case CodeBinaryOperatorType.Divide:\r
+ Output.Write ("/");\r
+ break;\r
+ case CodeBinaryOperatorType.Modulus:\r
+ Output.Write ("Mod");\r
+ break;\r
+ case CodeBinaryOperatorType.Assign:\r
+ Output.Write ("=");\r
+ break;\r
+ case CodeBinaryOperatorType.IdentityInequality:\r
+ Output.Write ("<>");\r
+ break;\r
+ case CodeBinaryOperatorType.IdentityEquality:\r
+ Output.Write ("Is");\r
+ break;\r
+ case CodeBinaryOperatorType.ValueEquality:\r
+ Output.Write ("=");\r
+ break;\r
+ case CodeBinaryOperatorType.BitwiseOr:\r
+ Output.Write ("Or");\r
+ break;\r
+ case CodeBinaryOperatorType.BitwiseAnd:\r
+ Output.Write ("And");\r
+ break;\r
+ case CodeBinaryOperatorType.BooleanOr:\r
+ Output.Write ("OrElse");\r
+ break;\r
+ case CodeBinaryOperatorType.BooleanAnd:\r
+ Output.Write ("AndAlso");\r
+ break;\r
+ case CodeBinaryOperatorType.LessThan:\r
+ Output.Write ("<");\r
+ break;\r
+ case CodeBinaryOperatorType.LessThanOrEqual:\r
+ Output.Write ("<=");\r
+ break;\r
+ case CodeBinaryOperatorType.GreaterThan:\r
+ Output.Write (">");\r
+ break;\r
+ case CodeBinaryOperatorType.GreaterThanOrEqual:\r
+ Output.Write (">=");\r
+ break;\r
+ }\r
+ }\r
+\r
+ protected override void OutputTypeAttributes (TypeAttributes attributes, bool isStruct, bool isEnum)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ switch (attributes & TypeAttributes.VisibilityMask) {\r
+ case TypeAttributes.NotPublic:\r
+ // Does this mean friend access?\r
+ output.Write ("Friend ");\r
+ break; \r
+\r
+ case TypeAttributes.Public:\r
+ case TypeAttributes.NestedPublic:\r
+ output.Write ("Public ");\r
+ break;\r
+\r
+ case TypeAttributes.NestedPrivate:\r
+ output.Write ("Private ");\r
+ break;\r
+ case TypeAttributes.NestedAssembly:\r
+ output.Write ("Friend ");\r
+ break;\r
+ case TypeAttributes.NestedFamily:\r
+ output.Write ("Protected ");\r
+ break;\r
+ case TypeAttributes.NestedFamORAssem:\r
+ output.Write ("Protected Friend ");\r
+ break;\r
+ case TypeAttributes.NestedFamANDAssem:\r
+ output.Write ("Friend ");\r
+ break;\r
+ }\r
+\r
+ if (isStruct)\r
+ output.Write ("Structure ");\r
+\r
+ else if (isEnum)\r
+ output.Write ("Enumeration ");\r
+\r
+ else {\r
+ if ((attributes & TypeAttributes.Interface) != 0) \r
+ output.Write ("Interface ");\r
+\r
+ else {\r
+ if ((attributes & TypeAttributes.Sealed) != 0)\r
+ output.Write ("NotInheritable ");\r
+\r
+ if ((attributes & TypeAttributes.Abstract) != 0)\r
+ output.Write ("MustInherit ");\r
+ \r
+ output.Write ("Class ");\r
+ }\r
+ }\r
+ }\r
+\r
+ protected override void OutputTypeNamePair (CodeTypeReference typeRef, String name)\r
+ {\r
+ Output.Write (name + " As " + GetTypeOutput (typeRef));\r
+ }\r
+\r
+ protected override void OutputType (CodeTypeReference type)\r
+ {\r
+ Output.Write (GetTypeOutput (type));\r
+ }\r
+\r
+ protected override string QuoteSnippetString (string value)\r
+ {\r
+ StringBuilder mySBuilder = new StringBuilder(value.Length);\r
+ mySBuilder.Append ("\"");\r
+ bool inQuotes = true;\r
+ for (int MyCounter = 0; MyCounter < value.Length; MyCounter++)\r
+ {\r
+ if (value[MyCounter] == 34) //quotation mark\r
+ {\r
+ if (!inQuotes)\r
+ {\r
+ mySBuilder.Append ("&\"");\r
+ inQuotes = true;\r
+ }\r
+ mySBuilder.Append (value[MyCounter]);\r
+ mySBuilder.Append (value[MyCounter]);\r
+ }\r
+ else if (value[MyCounter] >= 32) //standard ansi/unicode characters\r
+ {\r
+ if (!inQuotes)\r
+ {\r
+ mySBuilder.Append ("&\"");\r
+ inQuotes = true;\r
+ }\r
+ mySBuilder.Append (value[MyCounter]);\r
+ }\r
+ else //special chars, e.g. line break\r
+ {\r
+ if (inQuotes)\r
+ { \r
+ mySBuilder.Append ("\"");\r
+ inQuotes = false;\r
+ }\r
+ mySBuilder.Append ("&Microsoft.VisualBasic.ChrW(");\r
+ mySBuilder.Append ((int)value[MyCounter]); \r
+ mySBuilder.Append (")");\r
+ } \r
+ }\r
+ if (inQuotes)\r
+ mySBuilder.Append ("\"");\r
+ return mySBuilder.ToString();\r
+ }\r
+\r
+ private void GenerateDeclaration (CodeTypeReference type, string name, CodeExpression initExpression)\r
+ {\r
+ TextWriter output = Output;\r
+\r
+ OutputTypeNamePair (type, name);\r
+\r
+ if (initExpression != null) {\r
+ output.Write (" = ");\r
+ GenerateExpression (initExpression);\r
+ }\r
+\r
+ output.WriteLine ();\r
+ }\r
+ \r
+ private void GenerateMemberReferenceExpression (CodeExpression targetObject, string memberName)\r
+ {\r
+ GenerateExpression (targetObject);\r
+ Output.Write ('.');\r
+ Output.Write (memberName);\r
+ }\r
+ \r
+ /* \r
+ * ICodeGenerator\r
+ */\r
+\r
+ protected override string CreateEscapedIdentifier (string value)\r
+ {\r
+ for (int x = 0; x < Keywords.Length; x++)\r
+ if (value.ToLower().Equals (Keywords[x].ToLower()))\r
+ return "[" + value + "]";\r
+ return value;\r
+ }\r
+\r
+ protected override string CreateValidIdentifier (string value)\r
+ {\r
+ for (int x = 0; x < Keywords.Length; x++)\r
+ if (value.ToLower().Equals (Keywords[x].ToLower()))\r
+ return "_" + value;\r
+ return value;\r
+ }\r
+\r
+ protected override string GetTypeOutput (CodeTypeReference type)\r
+ {\r
+ string output;\r
+ CodeTypeReference arrayType;\r
+\r
+ arrayType = type.ArrayElementType;\r
+ if (arrayType != null)\r
+ output = GetTypeOutput (arrayType);\r
+ else { \r
+ switch (type.BaseType) {\r
+\r
+ case "System.Decimal":\r
+ output = "Decimal";\r
+ break;\r
+ case "System.Double":\r
+ output = "Double";\r
+ break;\r
+ case "System.Single":\r
+ output = "Single";\r
+ break;\r
+ \r
+ case "System.Byte":\r
+ output = "Byte";\r
+ break;\r
+ case "System.SByte":\r
+ output = "SByte";\r
+ break;\r
+ case "System.Int32":\r
+ output = "Integer";\r
+ break;\r
+ case "System.UInt32":\r
+ output = "UInt32";\r
+ break;\r
+ case "System.Int64":\r
+ output = "Long";\r
+ break;\r
+ case "System.UInt64":\r
+ output = "UInt64";\r
+ break;\r
+ case "System.Int16":\r
+ output = "Short";\r
+ break;\r
+ case "System.UInt16":\r
+ output = "UInt16";\r
+ break;\r
+\r
+ case "System.Boolean":\r
+ output = "Boolean";\r
+ break;\r
+ \r
+ case "System.Char":\r
+ output = "Char";\r
+ break;\r
+\r
+ case "System.String":\r
+ output = "String";\r
+ break;\r
+ case "System.Object":\r
+ output = "Object";\r
+ break;\r
+\r
+ case "System.Void":\r
+ output = "Nothing";\r
+ break;\r
+\r
+ default:\r
+ output = type.BaseType;\r
+ break;\r
+ }\r
+ }\r
+\r
+ int rank = type.ArrayRank;\r
+ if (rank > 0) {\r
+ output += "(";\r
+ for (--rank; rank > 0; --rank)\r
+ output += ",";\r
+ output += ")";\r
+ }\r
+\r
+ return output;\r
+ }\r
+\r
+ protected override bool IsValidIdentifier (string identifier)\r
+ {\r
+ for (int x = 0; x < Keywords.Length; x++)\r
+ if (identifier.ToLower().Equals (Keywords[x].ToLower()))\r
+ return false;\r
+ return true;\r
+ }\r
+\r
+ protected override bool Supports (GeneratorSupport supports)\r
+ {\r
+ return true;\r
+ }\r
+ }\r
+}\r