// // 2002-2005 AlphaSierraPapa // GNU General Public License // // $Revision$ // using System; using System.Collections; using System.Text; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.Core; namespace VBNetBinding { public class VBNetAmbience : AbstractAmbience { static string[,] typeConversionList = new string[,] { {"System.String", "String"}, {"System.Single", "Single"}, {"System.Int16", "Short"}, {"System.Void", "Void"}, {"System.Object", "Object"}, {"System.Int64", "Long"}, {"System.Int32", "Integer"}, {"System.Double", "Double"}, {"System.Char", "Char"}, {"System.Boolean", "Boolean"}, {"System.Byte", "Byte"}, {"System.Decimal", "Decimal"}, {"System.DateTime", "Date"}, }; static Hashtable typeConversionTable = new Hashtable(); static VBNetAmbience() { for (int i = 0; i < typeConversionList.GetLength(0); ++i) { typeConversionTable[typeConversionList[i, 0]] = typeConversionList[i, 1]; } } static VBNetAmbience instance; public static VBNetAmbience Instance { get { if (instance == null) instance = new VBNetAmbience(); return instance; } } string GetModifier(IDecoration decoration) { StringBuilder builder = new StringBuilder(); if (IncludeHTMLMarkup) { builder.Append(""); } if (decoration.IsStatic) { builder.Append("Shared "); } if (decoration.IsAbstract) { builder.Append("MustOverride "); } else if (decoration.IsSealed) { builder.Append("NotOverridable "); } else if (decoration.IsVirtual) { builder.Append("Overridable "); } else if (decoration.IsOverride) { builder.Append("Overrides "); } else if (decoration.IsNew) { builder.Append("Shadows "); } if (IncludeHTMLMarkup) { builder.Append(""); } return builder.ToString(); } public override string Convert(ModifierEnum modifier) { StringBuilder builder = new StringBuilder(); if (ShowAccessibility) { if ((modifier & ModifierEnum.Public) == ModifierEnum.Public) { builder.Append("Public"); } else if ((modifier & ModifierEnum.Private) == ModifierEnum.Private) { builder.Append("Private"); } else if ((modifier & (ModifierEnum.Protected | ModifierEnum.Internal)) == (ModifierEnum.Protected | ModifierEnum.Internal)) { builder.Append("Protected Friend"); } else if ((modifier & ModifierEnum.ProtectedOrInternal) == ModifierEnum.ProtectedOrInternal) { builder.Append("Protected Friend"); } else if ((modifier & ModifierEnum.Internal) == ModifierEnum.Internal) { builder.Append("Friend"); } else if ((modifier & ModifierEnum.Protected) == ModifierEnum.Protected) { builder.Append("Protected"); } builder.Append(' '); } return builder.ToString(); } public override string Convert(IClass c) { StringBuilder builder = new StringBuilder(); builder.Append(Convert(c.Modifiers)); if (IncludeHTMLMarkup) { builder.Append(""); } if (ShowModifiers) { if (c.IsSealed) { if (c.ClassType == ClassType.Class) { builder.Append("NotInheritable "); } } else if (c.IsAbstract && c.ClassType != ClassType.Interface) { builder.Append("MustInherit "); } } if (IncludeHTMLMarkup) { builder.Append(""); } if (ShowModifiers) { switch (c.ClassType) { case ClassType.Delegate: builder.Append("Delegate "); if (ShowReturnType) { foreach (IMethod m in c.Methods) { if (m.Name != "Invoke") { continue; } if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { builder.Append("Sub"); } else { builder.Append("Function"); } } } break; case ClassType.Class: builder.Append("Class"); break; case ClassType.Module: builder.Append("Module"); break; case ClassType.Struct: builder.Append("Structure"); break; case ClassType.Interface: builder.Append("Interface"); break; case ClassType.Enum: builder.Append("Enum"); break; } builder.Append(' '); } if (IncludeHTMLMarkup) { builder.Append(""); } if (UseFullyQualifiedMemberNames) { builder.Append(c.FullyQualifiedName); } else { builder.Append(c.Name); } if (IncludeHTMLMarkup) { builder.Append(""); } if (c.TypeParameters.Count > 0) { builder.Append("(Of "); for (int i = 0; i < c.TypeParameters.Count; ++i) { if (i > 0) builder.Append(", "); builder.Append(c.TypeParameters[i].Name); } builder.Append(')'); } if (c.ClassType == ClassType.Delegate) { builder.Append("("); if (IncludeHTMLMarkup) builder.Append("
"); foreach (IMethod m in c.Methods) { if (m.Name != "Invoke") continue; for (int i = 0; i < m.Parameters.Count; ++i) { if (IncludeHTMLMarkup) builder.Append("   "); builder.Append(Convert(m.Parameters[i])); if (i + 1 < m.Parameters.Count) builder.Append(", "); if (IncludeHTMLMarkup) builder.Append("
"); } } builder.Append(")"); foreach (IMethod m in c.Methods) { if (m.Name != "Invoke") continue; if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { } else { if (ShowReturnType) { builder.Append(" As "); builder.Append(Convert(m.ReturnType)); } } } } else if (ShowInheritanceList) { if (c.BaseTypes.Count > 0) { builder.Append(" Inherits "); for (int i = 0; i < c.BaseTypes.Count; ++i) { builder.Append(c.BaseTypes[i]); if (i + 1 < c.BaseTypes.Count) { builder.Append(", "); } } } } return builder.ToString(); } public override string ConvertEnd(IClass c) { StringBuilder builder = new StringBuilder(); builder.Append("End "); switch (c.ClassType) { case ClassType.Delegate: builder.Append("Delegate"); break; case ClassType.Class: builder.Append("Class"); break; case ClassType.Module: builder.Append("Module"); break; case ClassType.Struct: builder.Append("Structure"); break; case ClassType.Interface: builder.Append("Interface"); break; case ClassType.Enum: builder.Append("Enum"); break; } return builder.ToString(); } public override string Convert(IField field) { StringBuilder builder = new StringBuilder(); builder.Append(Convert(field.Modifiers)); if (IncludeHTMLMarkup) { builder.Append(""); } if (ShowModifiers) { if (field.IsStatic && field.IsLiteral) { builder.Append("Const "); } else if (field.IsStatic) { builder.Append("Shared "); } } if (IncludeHTMLMarkup) { builder.Append(""); builder.Append(""); } if (UseFullyQualifiedMemberNames) { builder.Append(field.FullyQualifiedName); } else { builder.Append(field.Name); } if (IncludeHTMLMarkup) { builder.Append(""); } if (field.ReturnType != null && ShowReturnType) { builder.Append(" As "); builder.Append(Convert(field.ReturnType)); } return builder.ToString(); } public override string Convert(IProperty property) { StringBuilder builder = new StringBuilder(); builder.Append(Convert(property.Modifiers)); if (ShowModifiers) { builder.Append(GetModifier(property)); } if (property.IsIndexer) { builder.Append("Default "); } if (property.CanGet && !property.CanSet) { builder.Append("ReadOnly "); } if (property.CanSet && !property.CanGet) { builder.Append("WriteOnly "); } if (IncludeHTMLMarkup) { builder.Append(""); } if (UseFullyQualifiedMemberNames) { builder.Append(property.FullyQualifiedName); } else { builder.Append(property.Name); } if (IncludeHTMLMarkup) { builder.Append(""); } if (property.Parameters.Count > 0) { builder.Append("("); if (IncludeHTMLMarkup) builder.Append("
"); for (int i = 0; i < property.Parameters.Count; ++i) { if (IncludeHTMLMarkup) builder.Append("   "); builder.Append(Convert(property.Parameters[i])); if (i + 1 < property.Parameters.Count) { builder.Append(", "); } if (IncludeHTMLMarkup) builder.Append("
"); } builder.Append(')'); } if (property.ReturnType != null && ShowReturnType) { builder.Append(" As "); builder.Append(Convert(property.ReturnType)); } return builder.ToString(); } public override string Convert(IEvent e) { StringBuilder builder = new StringBuilder(); builder.Append(Convert(e.Modifiers)); if (ShowModifiers) { builder.Append(GetModifier(e)); } builder.Append("Event "); if (IncludeHTMLMarkup) { builder.Append(""); } if (UseFullyQualifiedMemberNames) { builder.Append(e.FullyQualifiedName); } else { builder.Append(e.Name); } if (IncludeHTMLMarkup) { builder.Append(""); } if (e.ReturnType != null && ShowReturnType) { builder.Append(" As "); builder.Append(Convert(e.ReturnType)); } return builder.ToString(); } public override string Convert(IMethod m) { StringBuilder builder = new StringBuilder(); builder.Append(Convert(m.Modifiers)); if (ShowModifiers) { builder.Append(GetModifier(m)); } if (ShowReturnType) { if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { builder.Append("Sub "); } else { builder.Append("Function "); } } string dispName = UseFullyQualifiedMemberNames ? m.FullyQualifiedName : m.Name; if (m.Name == "#ctor" || m.Name == "#cctor" || m.IsConstructor) { dispName = "New"; } if (IncludeHTMLMarkup) { builder.Append(""); } builder.Append(dispName); if (IncludeHTMLMarkup) { builder.Append(""); } if (m.TypeParameters.Count > 0) { builder.Append("(Of "); for (int i = 0; i < m.TypeParameters.Count; ++i) { if (i > 0) builder.Append(", "); builder.Append(m.TypeParameters[i].Name); } builder.Append(')'); } builder.Append("("); if (IncludeHTMLMarkup) builder.Append("
"); for (int i = 0; i < m.Parameters.Count; ++i) { if (IncludeHTMLMarkup) builder.Append("   "); builder.Append(Convert(m.Parameters[i])); if (i + 1 < m.Parameters.Count) { builder.Append(", "); } if (IncludeHTMLMarkup) builder.Append("
"); } builder.Append(')'); if (ShowReturnType && m.ReturnType != null && m.ReturnType.FullyQualifiedName != "System.Void") { builder.Append(" As "); builder.Append(Convert(m.ReturnType)); } return builder.ToString(); } public override string ConvertEnd(IMethod m) { if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { return "End Sub"; } else { return "End Function"; } } public override string Convert(IReturnType returnType) { if (returnType == null) { return String.Empty; } StringBuilder builder = new StringBuilder(); string fullName = returnType.FullyQualifiedName; if (fullName != null && typeConversionTable[fullName] != null) { builder.Append(typeConversionTable[fullName].ToString()); } else { if (UseFullyQualifiedNames) { builder.Append(fullName); } else { builder.Append(returnType.Name); } } UnpackNestedType(builder, returnType); return builder.ToString(); } void UnpackNestedType(StringBuilder builder, IReturnType returnType) { ArrayReturnType art = returnType as ArrayReturnType; if (art != null) { builder.Append('('); for (int i = 1; i < art.ArrayDimensions; ++i) { builder.Append(','); } builder.Append(')'); UnpackNestedType(builder, art.ElementType); } else if (returnType is SpecificReturnType) { SpecificReturnType rt = (SpecificReturnType)returnType; UnpackNestedType(builder, rt.BaseType); builder.Append("(Of "); for (int i = 0; i < rt.TypeParameters.Count; ++i) { if (i > 0) builder.Append(", "); builder.Append(Convert(rt.TypeParameters[i])); } builder.Append(')'); } } public override string Convert(IParameter param) { StringBuilder builder = new StringBuilder(); if (ShowParameterNames) { if (IncludeHTMLMarkup) { builder.Append(""); } if (param.IsOptional) { builder.Append("Optional "); } if (param.IsRef || param.IsOut) { builder.Append("ByRef "); } else if (param.IsParams) { builder.Append("ParamArray "); } if (IncludeHTMLMarkup) { builder.Append(""); } builder.Append(param.Name); builder.Append(" As "); } builder.Append(Convert(param.ReturnType)); return builder.ToString(); } public override string WrapAttribute(string attribute) { return "<" + attribute + ">"; } public override string WrapComment(string comment) { return "' " + comment; } public override string GetIntrinsicTypeName(string dotNetTypeName) { if (typeConversionTable[dotNetTypeName] != null) { return (string)typeConversionTable[dotNetTypeName]; } return dotNetTypeName; } } }