| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255 |
- //
- // Microsoft.VisualBasic.VBCodeGenerator.cs
- //
- // Author:
- // Andreas Nahr ([email protected])
- // (partially based on CSharpCodeGenerator)
- // Jochen Wezel ([email protected])
- //
- // (C) 2003 Andreas Nahr
- // (C) 2003 Jochen Wezel (http://www.compumaster.de)
- //
- // Modifications:
- // 2003-11-06 JW: some corrections regarding missing spaces in generated code (e. g. "Property ")
- // 2003-11-06 JW: QuoteSnippetString implemented
- // 2003-11-08 JW: automatically add Microsoft.VisualBasic
- // 2003-11-12 JW: some corrections to allow correct compilation
- // 2003-11-28 JW: implementing code differences into current build of this file
- // 2003-12-10 JW: added "String." for the ChrW method because mbas doesn't support it without the String currently / TODO: remove it ASAP!
- //
- // 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 (")");
- }
- private bool AsBool(object datavalue)
- {
- return datavalue != null && datavalue is bool && (bool)datavalue;
- }
-
- private string OnOff(bool datavalue)
- {
- return datavalue?"On":"Off";
- }
- 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 ();
- Output.WriteLine("Option Explicit {0}",OnOff(AsBool(compileUnit.UserData["RequireVariableDeclaration"])));
- Output.WriteLine("Option Strict {0}",OnOff(!AsBool(compileUnit.UserData["AllowLateBound"])));
- 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 (".Item(");
- 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)
- {
- bool isSub = method.ReturnType == null || method.ReturnType.BaseType == "System.Void";
- TextWriter output = Output;
- if (method.CustomAttributes.Count > 0)
- OutputAttributeDeclarations (method.CustomAttributes);
- MemberAttributes attributes = method.Attributes;
- OutputMemberAccessModifier (attributes);
- OutputMemberScopeModifier (attributes);
- if (isSub)
- output.Write ("Sub ");
- else
- output.Write ("Function ");
- output.Write (method.Name);
- output.Write ('(');
- OutputParameters (method.Parameters);
- output.Write (')');
- if (!isSub) {
- 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 (isSub)
- 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))
- output.Write ("ReadOnly " );
- if (property.HasSet && (!property.HasGet))
- 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.Write ("Set (");
- OutputTypeNamePair (property.Type, "Value");
- output.WriteLine (")");
- ++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 GenerateNamespace(CodeNamespace ns)
- {
- GenerateCommentStatements (ns.Comments);
-
- bool Imports2MSVBFound;
- Imports2MSVBFound = false;
- if (null != ns.Imports)
- {
- foreach (CodeNamespaceImport import in ns.Imports)
- {
- if (string.Compare (import.Namespace, "Microsoft.VisualBasic", true, System.Globalization.CultureInfo.InvariantCulture) == 0)
- Imports2MSVBFound = true;
- }
- }
- // add standard import to Microsoft.VisualBasic if missing
- if (Imports2MSVBFound == false)
- Output.WriteLine ("Imports Microsoft.VisualBasic");
- // add regular imports
- GenerateNamespaceImports (ns);
- TextWriter output = Output;
- output.WriteLine();
- GenerateNamespaceStart (ns);
- GenerateTypes (ns);
- GenerateNamespaceEnd (ns);
- }
- 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:
- //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 ");
- break;
- case MemberAttributes.Static:
- Output.Write ("Shared ");
- break;
- case MemberAttributes.Override:
- Output.Write ("Overrides ");
- break;
- 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:
- //
- // 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));
- }
- protected override string QuoteSnippetString (string value)
- {
- StringBuilder mySBuilder = new StringBuilder(value.Length);
- mySBuilder.Append ("\"");
- bool inQuotes = true;
- for (int MyCounter = 0; MyCounter < value.Length; MyCounter++)
- {
- if (value[MyCounter] == 34) //quotation mark
- {
- if (!inQuotes)
- {
- mySBuilder.Append ("&\"");
- inQuotes = true;
- }
- mySBuilder.Append (value[MyCounter]);
- mySBuilder.Append (value[MyCounter]);
- }
- else if (value[MyCounter] >= 32) //standard ansi/unicode characters
- {
- if (!inQuotes)
- {
- mySBuilder.Append ("&\"");
- inQuotes = true;
- }
- mySBuilder.Append (value[MyCounter]);
- }
- else //special chars, e.g. line break
- {
- if (inQuotes)
- {
- mySBuilder.Append ("\"");
- inQuotes = false;
- }
- mySBuilder.Append ("&Microsoft.VisualBasic.ChrW(");
- mySBuilder.Append ((int)value[MyCounter]);
- mySBuilder.Append (")");
- }
- }
- if (inQuotes)
- mySBuilder.Append ("\"");
- return mySBuilder.ToString();
- }
- 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;
- }
- }
- }
|