// // // // // $Revision$ // using System; using System.Collections.Generic; using System.Text; using ICSharpCode.SharpDevelop.Dom; namespace Grunwald.BooBinding { public class BooAmbience : AbstractAmbience { // Fields static Dictionary reverseTypeConversionTable = new Dictionary(); static Dictionary typeConversionTable = new Dictionary(); /// /// Gets a dictionary with boo's short names as keys and /// the fully qualified type names as values. /// public static Dictionary ReverseTypeConversionTable { get { return reverseTypeConversionTable; } } /// /// Gets a dictionary with the fully qualified type names as keys and /// boo's short names as values. /// public static Dictionary TypeConversionTable { get { return typeConversionTable; } } static BooAmbience() { typeConversionTable.Add("System.Void", "void"); typeConversionTable.Add("System.Boolean", "bool"); typeConversionTable.Add("System.Char", "char"); typeConversionTable.Add("System.DateTime", "date"); typeConversionTable.Add("System.TimeSpan", "timespan"); typeConversionTable.Add("System.String", "string"); typeConversionTable.Add("System.Object", "object"); typeConversionTable.Add("System.Text.RegularExpressions.Regex", "regex"); typeConversionTable.Add("System.Byte", "byte"); typeConversionTable.Add("System.SByte", "sbyte"); typeConversionTable.Add("System.Int16", "short"); typeConversionTable.Add("System.Int32", "int"); typeConversionTable.Add("System.Int64", "long"); typeConversionTable.Add("System.UInt16", "ushort"); typeConversionTable.Add("System.UInt32", "uint"); typeConversionTable.Add("System.UInt64", "ulong"); typeConversionTable.Add("System.Single", "single"); typeConversionTable.Add("System.Double", "double"); typeConversionTable.Add("System.Decimal", "decimal"); typeConversionTable.Add("Boo.Lang.ICallable", "callable"); foreach (KeyValuePair pair in typeConversionTable) { reverseTypeConversionTable.Add(pair.Value, pair.Key); } } public override string GetIntrinsicTypeName(string typeName) { if (typeConversionTable.ContainsKey(typeName)) return typeConversionTable[typeName]; else return typeName; } public static string GetFullTypeName(string shortName) { if (reverseTypeConversionTable.ContainsKey(shortName)) return reverseTypeConversionTable[shortName]; else return shortName; } public static IEnumerable> BooSpecialTypes { get { return typeConversionTable; } } // Methods bool ModifierIsSet(ModifierEnum modifier, ModifierEnum query) { return (modifier & query) == query; } public override string ConvertAccessibility(ModifierEnum accessibility) { if (ShowAccessibility) { if (ModifierIsSet(accessibility, ModifierEnum.Public)) { return "public "; } else if (ModifierIsSet(accessibility, ModifierEnum.Private)) { return "private "; } else if (ModifierIsSet(accessibility, ModifierEnum.ProtectedAndInternal)) { return "protected internal "; } else if (ModifierIsSet(accessibility, ModifierEnum.Internal)) { return "internal "; } else if (ModifierIsSet(accessibility, ModifierEnum.Protected)) { return "protected "; } } return string.Empty; } string GetModifier(IEntity decoration) { string ret = ""; if (IncludeHtmlMarkup) { ret += ""; } if (decoration.IsStatic) { ret += "static "; } else if (decoration.IsSealed) { ret += "final "; } else if (decoration.IsOverride) { ret += "override "; } else if (decoration.IsNew) { ret += "new "; } if (IncludeHtmlMarkup) { ret += ""; } return ret; } public override string Convert(IClass c) { StringBuilder builder = new StringBuilder(); builder.Append(ConvertAccessibility(c.Modifiers)); if (IncludeHtmlMarkup) { builder.Append(""); } if (ShowModifiers) { if (c.IsSealed) { switch (c.ClassType) { case ClassType.Delegate: case ClassType.Struct: case ClassType.Enum: break; default: builder.Append("final "); break; } } else if (c.IsAbstract && c.ClassType != ClassType.Interface) { builder.Append("abstract "); } } if (IncludeHtmlMarkup) { builder.Append(""); } if (ShowDefinitionKeyWord) { switch (c.ClassType) { case ClassType.Delegate: builder.Append("callable"); break; case ClassType.Class: case ClassType.Module: builder.Append("class"); break; case ClassType.Struct: builder.Append("struct"); 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 (ShowTypeParameterList && 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 (ShowParameterList && 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(')'); } if (ShowReturnType && c.ClassType == ClassType.Delegate) { foreach(IMethod m in c.Methods) { if (m.Name != "Invoke") continue; builder.Append(" as "); builder.Append(Convert(m.ReturnType)); } } else if (ShowInheritanceList && c.ClassType != ClassType.Delegate) { if (c.BaseTypes.Count > 0) { builder.Append("("); for (int i = 0; i < c.BaseTypes.Count; ++i) { builder.Append(c.BaseTypes[i]); if (i + 1 < c.BaseTypes.Count) { builder.Append(", "); } } builder.Append(")"); } } if (IncludeBody) { builder.Append(":\n"); } return builder.ToString(); } public override string ConvertEnd(IClass c) { return ""; } public override string Convert(IField field) { StringBuilder builder = new StringBuilder(); builder.Append(ConvertAccessibility(field.Modifiers)); if (IncludeHtmlMarkup) { builder.Append(""); } if (ShowModifiers) { if (field.IsConst) { builder.Append("static final "); } else if (field.IsStatic) { builder.Append("static "); } if (field.IsReadonly) { builder.Append("final "); } } if (IncludeHtmlMarkup) { builder.Append(""); } if (IncludeHtmlMarkup) { 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(ConvertAccessibility(property.Modifiers)); if (ShowModifiers) { builder.Append(GetModifier(property)); } if (property.IsIndexer) { if (property.DeclaringType != null) { if (UseFullyQualifiedMemberNames) { builder.Append(property.DeclaringType.FullyQualifiedName); } else { builder.Append(property.DeclaringType.Name); } builder.Append('.'); } builder.Append("self"); } else { if (IncludeHtmlMarkup) { builder.Append(""); } if (UseFullyQualifiedMemberNames) { builder.Append(property.FullyQualifiedName); } else { builder.Append(property.Name); } if (IncludeHtmlMarkup) { builder.Append(""); } } if (ShowParameterList && 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)); } if (IncludeBody) { builder.Append(":"); if (property.CanGet) { builder.Append(" get"); } if (property.CanSet) { builder.Append(" set"); } } return builder.ToString(); } public override string Convert(IEvent e) { StringBuilder builder = new StringBuilder(); builder.Append(ConvertAccessibility(e.Modifiers)); if (ShowModifiers) { builder.Append(GetModifier(e)); } if (ShowDefinitionKeyWord) { 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(); if (ShowModifiers && m.IsExtensionMethod) { builder.Append("[Extension] "); } builder.Append(ConvertAccessibility(m.Modifiers)); if (ShowModifiers) { builder.Append(GetModifier(m)); } if (ShowDefinitionKeyWord) { builder.Append("def "); } if (IncludeHtmlMarkup) { builder.Append(""); } if (m.IsConstructor) { builder.Append("constructor"); } else { if (UseFullyQualifiedMemberNames) { builder.Append(m.FullyQualifiedName); } else { builder.Append(m.Name); } } if (IncludeHtmlMarkup) { builder.Append(""); } if (ShowTypeParameterList && 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(']'); } if (ShowParameterList) { 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 (m.ReturnType != null && ShowReturnType) { builder.Append(" as "); builder.Append(Convert(m.ReturnType)); } return builder.ToString(); } public override string ConvertEnd(IMethod m) { return ""; } public override string Convert(IReturnType returnType) { if (returnType == null) { return String.Empty; } StringBuilder builder = new StringBuilder(); UnpackNestedType(builder, returnType); return builder.ToString(); } void UnpackNestedType(StringBuilder builder, IReturnType returnType) { if (returnType.IsArrayReturnType) { ArrayReturnType art = returnType.CastToArrayReturnType(); builder.Append('('); UnpackNestedType(builder, art.ArrayElementType); if (art.ArrayDimensions > 1) { builder.Append(','); builder.Append(art.ArrayDimensions); } builder.Append(')'); } else if (returnType.IsConstructedReturnType) { ConstructedReturnType crt = returnType.CastToConstructedReturnType(); UnpackNestedType(builder, crt.UnboundType); builder.Append("[of "); for (int i = 0; i < crt.TypeArguments.Count; ++i) { if (i > 0) builder.Append(", "); builder.Append(Convert(crt.TypeArguments[i])); } builder.Append(']'); } else { string fullName = returnType.FullyQualifiedName; if (fullName != null && typeConversionTable.ContainsKey(fullName)) { builder.Append(typeConversionTable[fullName].ToString()); } else { if (UseFullyQualifiedTypeNames) { builder.Append(fullName); } else { builder.Append(returnType.Name); } } } } public override string Convert(IParameter param) { StringBuilder builder = new StringBuilder(); if (IncludeHtmlMarkup) { builder.Append(""); } if (param.IsRef) { builder.Append("ref "); } else if (param.IsOut) { builder.Append("ref "); } else if (param.IsParams) { builder.Append("*"); } if (IncludeHtmlMarkup) { builder.Append(""); } if (ShowParameterNames) { 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; } } }