public static void Go(HaxeWriter writer, MemberAccessExpressionSyntax expression) { var model = Program.GetModel(expression); var memberName = expression.Name.Identifier.ValueText; var type = model.GetTypeInfo(expression.Expression).ConvertedType; var typeStr = TypeProcessor.GenericTypeName(type); if (expression.Expression is PredefinedTypeSyntax) { //Support int.MaxValue/int.MaxValue/etc. We change MinValue/MaxValue for some types since haXe can't deal with the real MinValue (it's even stricter when compiling to java). Any checks against this should use <= in place of == if (memberName == "Empty" && typeStr == "System.String") { writer.Write("\"\""); } else if (memberName == "MaxValue" && typeStr == "System.Double") { writer.Write("3.4028235e+38"); } else if (memberName == "MinValue" && typeStr == "System.Double") { writer.Write("1.4e-45"); } else if (memberName == "MaxValue" && typeStr == "System.Int64") { writer.Write("999900000000000000"); } else if (memberName == "NaN") { writer.Write("Math.NaN"); } else { var val = System.Type.GetType(typeStr).GetField(memberName).GetValue(null); if (val is string) { writer.Write("\"" + val + "\""); } else { writer.Write(val.ToString()); } } } else { var translate = PropertyTranslation.Get(typeStr, memberName); if (translate != null && translate.ExtensionNamespace != null) { writer.Write(translate.ExtensionNamespace); writer.Write("."); writer.Write(translate.ReplaceWith); writer.Write("("); if (!translate.SkipExtensionParameter) { WriteMember(writer, expression.Expression); } writer.Write(")"); return; } if (translate != null) { memberName = translate.ReplaceWith; } if (type != null) //if type is null, then we're just a namespace. We can ignore these. { WriteMember(writer, expression.Expression); writer.Write("."); } writer.Write(memberName); if (expression.Name is GenericNameSyntax) { var gen = expression.Name.As <GenericNameSyntax>(); writer.Write("<"); bool first = true; foreach (var g in gen.TypeArgumentList.Arguments) { if (first) { first = false; } else { writer.Write(", "); } writer.Write(TypeProcessor.ConvertTypeWithColon(g)); } writer.Write(">"); } } }
public static void Go(ScalaWriter writer, MemberAccessExpressionSyntax expression) { var model = Program.GetModel(expression); var memberName = expression.Name.Identifier.ValueText; var type = model.GetTypeInfo(expression.Expression).ConvertedType; var typeStr = TypeProcessor.GenericTypeName(type); if (expression.Expression is PredefinedTypeSyntax) { if (memberName == "MaxValue" || memberName == "MinValue" || memberName == "NaN") { var predefined = expression.Expression.ToString(); if (predefined.StartsWith("u")) { //Scala does not have unsigned types. Forward these to CsScala writer.Write("System.CsScala."); writer.Write(predefined); writer.Write(memberName); } else { writer.Write(predefined[0].ToString().ToUpper()); writer.Write(predefined.Substring(1)); writer.Write("."); writer.Write(memberName); } } else { var field = System.Type.GetType(typeStr).GetField(memberName); if (field == null) { throw new Exception("Cannot use " + memberName + " as a field. If you're passing a function, wrap a closure around it. " + Utility.Descriptor(expression)); } var val = field.GetValue(null); if (val is string) { writer.Write("\"" + val + "\""); } else { writer.Write(val.ToString()); } } } else if (type.OriginalDefinition is INamedTypeSymbol && type.OriginalDefinition.As <INamedTypeSymbol>().SpecialType == SpecialType.System_Nullable_T) { switch (memberName) { case "HasValue": writer.Write("("); WriteMember(writer, expression.Expression); writer.Write(" != null)"); break; case "Value": var nullableType = TypeProcessor.ConvertType(type.As <INamedTypeSymbol>().TypeArguments.Single()); WriteMember(writer, expression.Expression); if (TypeProcessor.IsPrimitiveType(nullableType)) { writer.Write("."); writer.Write(nullableType[0].ToString().ToLower()); writer.Write(nullableType.Substring(1)); writer.Write("Value()"); } break; default: throw new Exception("Need handler for Nullable." + memberName + " " + Utility.Descriptor(expression)); } } else { var translate = PropertyTranslation.Get(typeStr, memberName); if (translate != null && translate.ExtensionMethod != null) { writer.Write(translate.ExtensionMethod); writer.Write("("); if (!(model.GetSymbolInfo(expression.Expression).Symbol is INamedTypeSymbol)) { Core.Write(writer, expression.Expression); } writer.Write(")"); return; } if (translate != null) { memberName = translate.ReplaceWith; } else { memberName = WriteIdentifierName.TransformIdentifier(memberName); } if (type != null) //if type is null, then we're just a namespace. We can ignore these. { WriteMember(writer, expression.Expression); writer.Write("."); } writer.Write(memberName); if (expression.Name is GenericNameSyntax) { var gen = expression.Name.As <GenericNameSyntax>(); writer.Write("["); bool first = true; foreach (var g in gen.TypeArgumentList.Arguments) { if (first) { first = false; } else { writer.Write(", "); } writer.Write(TypeProcessor.ConvertTypeWithColon(g)); } writer.Write("]"); } } }