public static void Go(ScalaWriter writer, SyntaxTokenList modifiers, string name, TypeSyntax type, EqualsValueClauseSyntax initializerOpt = null) { writer.WriteIndent(); var isConst = IsConst(modifiers, initializerOpt, type); WriteFieldModifiers(writer, modifiers); if (isConst) { writer.Write("final val "); } else { writer.Write("var "); } writer.Write(name); writer.Write(TypeProcessor.ConvertTypeWithColon(type)); writer.Write(" = "); if (initializerOpt != null) { Core.Write(writer, initializerOpt.Value); } else { writer.Write(TypeProcessor.DefaultValue(type)); } writer.Write(";"); writer.WriteLine(); }
public static void Go(ScalaWriter writer, LocalDeclarationStatementSyntax declaration) { foreach (var variable in declaration.Declaration.Variables) { var symbol = Program.GetModel(declaration).GetDeclaredSymbol(variable); var isRef = UsedAsRef(variable, symbol); writer.WriteIndent(); writer.Write("var "); writer.Write(WriteIdentifierName.TransformIdentifier(variable.Identifier.ValueText)); if (isRef) { var typeStr = TypeProcessor.ConvertType(declaration.Declaration.Type); writer.Write(":CsRef["); writer.Write(typeStr); writer.Write("]"); Program.RefOutSymbols.TryAdd(symbol, null); writer.Write(" = new CsRef["); writer.Write(typeStr); writer.Write("]("); if (variable.Initializer == null) { writer.Write(TypeProcessor.DefaultValue(declaration.Declaration.Type)); } else { Core.Write(writer, variable.Initializer.As <EqualsValueClauseSyntax>().Value); } writer.Write(")"); } else { writer.Write(TypeProcessor.ConvertTypeWithColon(declaration.Declaration.Type)); writer.Write(" = "); if (variable.Initializer != null) { Core.Write(writer, variable.Initializer.As <EqualsValueClauseSyntax>().Value); } else { writer.Write(TypeProcessor.DefaultValue(declaration.Declaration.Type)); } } writer.Write(";\r\n"); } }
private static void Go(ScalaWriter writer, IEnumerable <ParameterSyntax> parameters, SyntaxNode body, TypeInfo type) { var methodSymbol = type.ConvertedType.As <INamedTypeSymbol>().DelegateInvokeMethod.As <IMethodSymbol>(); writer.Write("("); for (int pi = 0; pi < parameters.Count(); pi++) { var parameter = parameters.ElementAt(pi); if (pi > 0) { writer.Write(", "); } writer.Write(WriteIdentifierName.TransformIdentifier(parameter.Identifier.ValueText)); if (parameter.Type != null) { writer.Write(TypeProcessor.ConvertTypeWithColon(parameter.Type)); } else { writer.Write(TypeProcessor.ConvertTypeWithColon(methodSymbol.Parameters[pi].Type)); } } writer.Write(") => "); bool returnsVoid = methodSymbol.ReturnType.ToString() == "void"; if (body is BlockSyntax) { writer.Write("\r\n"); writer.WriteOpenBrace(); var statements = body.As <BlockSyntax>().Statements; var lastStatement = statements.LastOrDefault() as ReturnStatementSyntax; var returnStatements = FindReturnStatements(body); if (returnStatements.Count > 0 && (lastStatement == null || returnStatements.Except(lastStatement).Any())) { //Lambda has branching returns. We must use a breakable block since scala can't return from a lambda like C# can TypeState.Instance.InLambdaBreakable++; writer.WriteLine("val __lambdabreak = new Breaks;"); if (!returnsVoid) { writer.WriteIndent(); writer.Write("var __lambdareturn:"); writer.Write(TypeProcessor.ConvertType(methodSymbol.ReturnType)); writer.Write(" = "); writer.Write(TypeProcessor.DefaultValue(methodSymbol.ReturnType)); writer.Write(";\r\n"); } writer.WriteLine("__lambdabreak.breakable"); writer.WriteOpenBrace(); foreach (var statement in statements) { if (statement == lastStatement && !returnsVoid) { //Manually write it so we avoid the final break that WriteReturnStatement does writer.WriteIndent(); writer.Write("__lambdareturn = "); Core.Write(writer, lastStatement.Expression); writer.Write(";\r\n"); } else { Core.Write(writer, statement); } } TriviaProcessor.ProcessTrivias(writer, body.DescendantTrivia()); writer.WriteCloseBrace(); if (!returnsVoid) { writer.WriteLine("__lambdareturn;"); } TypeState.Instance.InLambdaBreakable--; } else { foreach (var statement in statements) { if (statement == lastStatement) { writer.WriteIndent(); Core.Write(writer, lastStatement.Expression); writer.Write(";\r\n"); } else { Core.Write(writer, statement); } } } writer.Indent--; writer.WriteIndent(); writer.Write("}"); } else { writer.Write(" { "); Core.Write(writer, body); writer.Write("; }"); } if (!returnsVoid) { writer.Write(TypeProcessor.ConvertTypeWithColon(methodSymbol.ReturnType)); } }