#region license // Copyright (c) 2004, Daniel Grunwald (daniel@danielgrunwald.de) // All rights reserved. // // BooBinding is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // BooBinding is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with BooBinding; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #endregion /* namespace BooBinding import System import System.Collections import System.Text import MonoDevelop.Projects.Parser import MonoDevelop.Core import MonoDevelop.Core.Properties import MonoDevelop.Projects.Ambience class BooAmbience(Ambience): [Getter(TypeConversionTable)] static _typeConversionTable = { 'System.Void' : 'void', 'System.Object' : 'object', 'System.Boolean' : 'bool', 'System.Byte' : 'byte', 'System.SByte' : 'sbyte', //'System.Char' : 'char', //'System.Enum' : 'enum', 'System.Int16' : 'short', 'System.Int32' : 'int', 'System.Int64' : 'long', 'System.UInt16' : 'ushort', 'System.UInt32' : 'uint', 'System.UInt64' : 'ulong', 'System.Single' : 'single', 'System.Double' : 'double', 'System.Decimal' : 'decimal', 'System.String' : 'string', 'System.DateTime' : 'date', 'System.TimeSpan' : 'timespan', 'System.Type' : 'type', 'System.Array' : 'array', 'System.Text.RegularExpressions.Regex' : 'regex' } static _reverseTypeConversionTable as Hashtable static ReverseTypeConversionTable: get: if _reverseTypeConversionTable == null: _reverseTypeConversionTable = Hashtable() for e as DictionaryEntry in _typeConversionTable: _reverseTypeConversionTable.Add(e.Value, e.Key) return _reverseTypeConversionTable private def ModifierIsSet(modifier as ModifierEnum, query as ModifierEnum) as bool: return (modifier & query) == query override def Convert(modifier as ModifierEnum, conversionFlags as ConversionFlags) as string: if ShowAccessibility(conversionFlags): if ModifierIsSet(modifier, ModifierEnum.Public): return 'public ' elif ModifierIsSet(modifier, ModifierEnum.Private): return 'private ' elif ModifierIsSet(modifier, ModifierEnum.ProtectedAndInternal): return 'protected internal ' elif ModifierIsSet(modifier, ModifierEnum.ProtectedOrInternal): return 'internal protected ' elif ModifierIsSet(modifier, ModifierEnum.Internal): return 'internal ' elif ModifierIsSet(modifier, ModifierEnum.Protected): return 'protected ' return '' private def GetModifier(decoration as IDecoration, conversionFlags as ConversionFlags) as string: ret as string = '' if IncludeHTMLMarkup(conversionFlags) or IncludePangoMarkup(conversionFlags): ret += '' if decoration.IsStatic: ret += 'static ' elif decoration.IsFinal: ret += 'final ' elif decoration.IsVirtual: ret += 'virtual ' elif decoration.IsOverride: ret += 'override ' elif decoration.IsNew: ret += 'new ' if IncludeHTMLMarkup(conversionFlags) or IncludePangoMarkup(conversionFlags): ret += '' return ret override def Convert(c as IClass, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() builder.Append(Convert(c.Modifiers, conversionFlags)) cType = c.ClassType if ShowClassModifiers(conversionFlags): if c.IsSealed: if cType == ClassType.Delegate or cType == ClassType.Enum: pass else: //builder.Append('final ') AppendPangoHtmlTag (builder, 'final ', 'i', conversionFlags) elif c.IsAbstract and cType != ClassType.Interface: //builder.Append('abstract ') AppendPangoHtmlTag (builder, 'abstract ', 'i', conversionFlags) if ShowClassModifiers(conversionFlags): if cType == ClassType.Delegate: builder.Append('callable ') elif cType == ClassType.Class: builder.Append('class ') elif cType == ClassType.Struct: builder.Append('struct ') elif cType == ClassType.Interface: builder.Append('interface ') elif cType == ClassType.Enum: builder.Append('enum ') if cType == ClassType.Delegate and c.Methods.Count > 0: for m as IMethod in c.Methods: if m.Name == 'Invoke': builder.Append(Convert(m.ReturnType, conversionFlags)) builder.Append(' ') if UseFullyQualifiedMemberNames(conversionFlags): AppendPangoHtmlTag (builder, c.FullyQualifiedName, 'b', conversionFlags) else: AppendPangoHtmlTag (builder, c.Name, 'b', conversionFlags) if c.ClassType == ClassType.Delegate: builder.Append(' (') if IncludeHTMLMarkup(conversionFlags): builder.Append('
') for m as IMethod in c.Methods: if m.Name == 'Invoke': for i in range(m.Parameters.Count): if IncludeHTMLMarkup(conversionFlags): builder.Append('   ') builder.Append(Convert(m.Parameters[i], conversionFlags)) if i + 1 < m.Parameters.Count: builder.Append(', ') if IncludeHTMLMarkup: builder.Append('
') builder.Append(Char.Parse(')')) elif ShowInheritanceList(conversionFlags): if c.BaseTypes.Count > 0: builder.Append('(') for i in range(c.BaseTypes.Count): builder.Append(c.BaseTypes[i]) if i + 1 < c.BaseTypes.Count: builder.Append(', ') builder.Append(')') if IncludeBodies(conversionFlags): builder.Append(':\n') return builder.ToString() override def ConvertEnd(c as IClass, conversionFlags as ConversionFlags) as string: return '' override def Convert(field as IField, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() builder.Append(Convert(field.Modifiers, conversionFlags)) if ShowMemberModifiers(conversionFlags): if field.IsStatic and field.IsLiteral: AppendPangoHtmlTag (builder, 'const ', 'i', conversionFlags) elif field.IsStatic: AppendPangoHtmlTag (builder, 'static ', 'i', conversionFlags) if field.IsReadonly: AppendPangoHtmlTag (builder, 'readonly ', 'i', conversionFlags) if UseFullyQualifiedMemberNames(conversionFlags): AppendPangoHtmlTag (builder, field.FullyQualifiedName, 'b', conversionFlags) else: AppendPangoHtmlTag (builder, field.Name, 'b', conversionFlags) if field.ReturnType != null: AppendPangoHtmlTag (builder, ' as ' + Convert (field.ReturnType, conversionFlags), 'b', conversionFlags) return builder.ToString() override def Convert(property as IProperty, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() builder.Append(Convert(property.Modifiers, conversionFlags)) if ShowMemberModifiers(conversionFlags): builder.Append(GetModifier(property, conversionFlags)) if UseFullyQualifiedMemberNames(conversionFlags): AppendPangoHtmlTag (builder, property.FullyQualifiedName, 'b', conversionFlags) else: AppendPangoHtmlTag (builder, property.Name, 'b', conversionFlags) if property.Parameters.Count > 0: builder.Append('(') if IncludeHTMLMarkup(conversionFlags): builder.Append('
') for i in range(property.Parameters.Count): if IncludeHTMLMarkup(conversionFlags): builder.Append('   ') builder.Append(Convert(property.Parameters[i], conversionFlags)) if i + 1 < property.Parameters.Count: builder.Append(', ') if IncludeHTMLMarkup(conversionFlags): builder.Append('
') builder.Append(')') if property.ReturnType != null: builder.Append(' as ') builder.Append(Convert(property.ReturnType, conversionFlags)) if IncludeBodies(conversionFlags): builder.Append(': ') if property.CanGet: builder.Append('get ') if property.CanSet: builder.Append('set ') return builder.ToString() override def Convert(e as IEvent, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() builder.Append(Convert(e.Modifiers, conversionFlags)) if ShowMemberModifiers(conversionFlags): builder.Append(GetModifier(e, conversionFlags)) if UseFullyQualifiedMemberNames(conversionFlags): AppendPangoHtmlTag (builder, e.FullyQualifiedName, 'b', conversionFlags) else: AppendPangoHtmlTag (builder, e.Name, 'b', conversionFlags) if e.ReturnType != null: builder.Append(' as ') builder.Append(Convert(e.ReturnType, conversionFlags)) return builder.ToString() override def Convert(m as IIndexer, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() builder.Append(Convert(m.Modifiers, conversionFlags)) if ShowMemberModifiers(conversionFlags) and m.IsStatic: AppendPangoHtmlTag (builder, 'static ', 'i', conversionFlags) if m.ReturnType != null: builder.Append(Convert(m.ReturnType, conversionFlags)) builder.Append(' ') if UseFullyQualifiedMemberNames(conversionFlags): AppendPangoHtmlTag (builder, m.FullyQualifiedName, 'b', conversionFlags) else: AppendPangoHtmlTag (builder, m.Name, 'b', conversionFlags) builder.Append('Indexer(') if IncludeHTMLMarkup: builder.Append('
') for i in range(m.Parameters.Count): if IncludeHTMLMarkup(conversionFlags): builder.Append('   ') builder.Append(Convert(m.Parameters[i], conversionFlags)) if i + 1 < m.Parameters.Count: builder.Append(', ') if IncludeHTMLMarkup(conversionFlags): builder.Append('
') builder.Append(')') return builder.ToString() override def Convert(m as IMethod, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() builder.Append(Convert(m.Modifiers, conversionFlags)) if ShowMemberModifiers(conversionFlags): builder.Append(GetModifier(m, conversionFlags)) //builder.Append('def ') if ShowReturnType if m.IsConstructor: AppendPangoHtmlTag (builder, 'constructor', 'b', conversionFlags) else: if UseFullyQualifiedMemberNames(conversionFlags): AppendPangoHtmlTag (builder, m.FullyQualifiedName, 'b', conversionFlags) else: AppendPangoHtmlTag (builder, m.Name, 'b', conversionFlags) builder.Append('(') if IncludeHTMLMarkup(conversionFlags): builder.Append('
') for i in range(m.Parameters.Count): if IncludeHTMLMarkup(conversionFlags): builder.Append('   ') builder.Append(Convert(m.Parameters[i], conversionFlags)) if i + 1 < m.Parameters.Count: builder.Append(', ') if IncludeHTMLMarkup(conversionFlags): builder.Append('
') builder.Append(')') //if m.ReturnType != null and ShowReturnType and not m.IsConstructor: if m.ReturnType != null and not m.IsConstructor: builder.Append(' as ') builder.Append(Convert(m.ReturnType, conversionFlags)) if IncludeBodies(conversionFlags): if m.DeclaringType != null: if m.DeclaringType.ClassType != ClassType.Interface: builder.Append(': ') else: builder.Append(': ') return builder.ToString() override def ConvertEnd(m as IMethod, conversionFlags as ConversionFlags) as string: return '' override def Convert(returnType as IReturnType, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: if returnType == null: return '' builder as StringBuilder = StringBuilder() for i in range(returnType.ArrayCount): builder.Append('(') if returnType.FullyQualifiedName != null and _typeConversionTable[returnType.FullyQualifiedName] != null: builder.Append(_typeConversionTable[returnType.FullyQualifiedName]) else: if UseFullyQualifiedNames(conversionFlags): builder.Append(returnType.FullyQualifiedName) else: builder.Append(returnType.Name) //if linkSet: // builder.Append('') if returnType.PointerNestingLevel > 0: // Sometimes there are negative pointer nesting levels // (especially in exception constructors in the BCL for i in range(returnType.PointerNestingLevel): builder.Append('*') for i in range(returnType.ArrayCount): if returnType.ArrayDimensions[i] > 1: builder.Append(',') builder.Append(returnType.ArrayDimensions[i]) builder.Append(')') return builder.ToString() override def Convert(param as IParameter, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() if param.IsRef: AppendPangoHtmlTag (builder, 'ref ', 'i', conversionFlags) elif param.IsOut: AppendPangoHtmlTag (builder, 'out ', 'i', conversionFlags) elif param.IsParams: AppendPangoHtmlTag (builder, 'params ', 'i', conversionFlags) if ShowParameterNames(conversionFlags): builder.Append(param.Name) builder.Append(' as ') builder.Append(Convert(param.ReturnType, conversionFlags)) return builder.ToString() override def Convert(localVariable as LocalVariable, conversionFlags as ConversionFlags, resolver as ITypeNameResolver) as string: builder as StringBuilder = StringBuilder() builder.Append(localVariable.Name) builder.Append(' as ') builder.Append(Convert(localVariable.ReturnType, conversionFlags)) return builder.ToString() private def AppendPangoHtmlTag (sb as StringBuilder, text as string, tag as string, conversionFlags as ConversionFlags): sb.Append ('<').Append (tag).Append ('>') if IncludeHTMLMarkup(conversionFlags) or IncludePangoMarkup(conversionFlags) sb.Append (text) sb.Append ('') if IncludeHTMLMarkup(conversionFlags) or IncludePangoMarkup(conversionFlags) override def WrapAttribute(attribute as string) as string: return '[' + attribute + ']' override def WrapComment(comment as string) as string: return '// ' + comment override def GetIntrinsicTypeName(dotNetTypeName as string) as string: if _typeConversionTable[dotNetTypeName] != null: return _typeConversionTable[dotNetTypeName] return dotNetTypeName */