コード例 #1
0
 private static void WriteOverride(IIndentedTextWriterWrapper textWriter, IMethodSymbol symbol)
 {
     if (symbol.IsOverride)
     {
         textWriter.WriteLine("override = true,");
     }
 }
コード例 #2
0
 private static void WriteIsParams(IIndentedTextWriterWrapper textWriter, IMethodSymbol symbol)
 {
     if (symbol.Parameters.LastOrDefault()?.IsParams == true)
     {
         textWriter.WriteLine("isParams = true,");
     }
 }
コード例 #3
0
        public static void Write(this TryStatementSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            textWriter.WriteLine("_M.Try(");
            textWriter.Indent++;

            textWriter.WriteLine("function()");
            syntax.Block.Write(textWriter, context);
            textWriter.WriteLine("end,");
            textWriter.WriteLine("{");
            textWriter.Indent++;

            syntax.Catches.Write(Write, textWriter, context);

            textWriter.Indent--;
            textWriter.WriteLine("},");

            if (syntax.Finally != null)
            {
                textWriter.WriteLine("function()");
                syntax.Finally.Write(textWriter, context);
                textWriter.WriteLine("end");
            }
            else
            {
                textWriter.WriteLine("nil");
            }

            textWriter.Indent--;
            textWriter.WriteLine(");");
        }
コード例 #4
0
        public static void Write(this AccessorDeclarationSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            if (syntax.Body == null)
            {
                return;
            }

            textWriter.Write(syntax.Keyword.Text);
            textWriter.Write(" = function(element");

            var indexerDeclaration = syntax.Parent.Parent as IndexerDeclarationSyntax;

            if (indexerDeclaration != null)
            {
                textWriter.Write(", ");
                indexerDeclaration.ParameterList.Parameters.Write(Write, textWriter, context);
            }

            if (syntax.Keyword.Kind() == SyntaxKind.SetKeyword)
            {
                textWriter.Write(", value");
            }

            textWriter.WriteLine(")");
            syntax.Body.Write(textWriter, context);
            textWriter.WriteLine("end,");
        }
コード例 #5
0
 private static void WriteGenerics(MethodDeclarationSyntax syntax, IIndentedTextWriterWrapper textWriter)
 {
     if (syntax.TypeParameterList != null)
     {
         textWriter.WriteLine("generics = methodGenericsMapping,");
     }
 }
コード例 #6
0
        private static void WriteInitialize(ClassDeclarationSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            if (context.PartialElementState.IsFirst)
            {
                textWriter.WriteLine("local initialize = function(element, values)");
                textWriter.Indent++;

                textWriter.WriteLine("if baseInitialize then baseInitialize(element, values); end");
            }

            foreach (var property in syntax.Members.OfType <PropertyDeclarationSyntax>())
            {
                property.WriteInitializeValue(textWriter, context);
            }

            foreach (var field in syntax.Members.OfType <FieldDeclarationSyntax>())
            {
                field.WriteInitializeValue(textWriter, context);
            }

            if (context.PartialElementState.IsLast)
            {
                textWriter.Indent--;
                textWriter.WriteLine("end");
            }
        }
コード例 #7
0
 public static void Write(this ElementAccessExpressionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
 {
     textWriter.Write("(");
     syntax.Expression.Write(textWriter, context);
     textWriter.Write(" % _M.DOT)");
     syntax.ArgumentList.Write(textWriter, context);
 }
コード例 #8
0
        public void WriteInteractionElementReference(T type, IIndentedTextWriterWrapper textWriter)
        {
            if (this.semanticAdaptor.IsArray(type))
            {
                textWriter.Write("System.Array[{");
                this.WriteTypeReference(this.semanticAdaptor.GetArrayGeneric(type), textWriter);
                textWriter.Write("}]");
                return;
            }

            if (this.semanticAdaptor.IsGenericType(type))
            {
                if (this.semanticAdaptor.IsMethodGeneric(type))
                {
                    textWriter.Write("methodGenerics[methodGenericsMapping['{0}']]", this.semanticAdaptor.GetName(type));
                    return;
                }
                textWriter.Write("generics[genericsMapping['{0}']]", this.semanticAdaptor.GetName(type));
                return;
            }

            textWriter.Write(this.semanticAdaptor.GetFullName(type));

            if (this.semanticAdaptor.HasTypeGenerics(type))
            {
                var generics = this.semanticAdaptor.GetGenerics(type);
                this.WriteTypeReferences(generics, textWriter);
            }
        }
コード例 #9
0
        private static void TryWriteNameOfOrTypeOf(
            this InvocationExpressionSyntax syntax,
            IIndentedTextWriterWrapper textWriter,
            IContext context)
        {
            switch (syntax.Expression.ToFullString())
            {
            case "nameof":
                var symbol = context.SemanticModel.GetSymbolInfo(syntax.ArgumentList.Arguments.Single().Expression).Symbol;

                var typeSymbol = symbol as ITypeSymbol;
                if (typeSymbol == null)
                {
                    typeSymbol = ((IParameterSymbol)symbol).Type;
                }

                if (context.SemanticAdaptor.IsGenericType(typeSymbol))
                {
                    context.TypeReferenceWriter.WriteTypeReference(typeSymbol, textWriter);
                    textWriter.Write(".name");
                }
                else
                {
                    textWriter.Write($"\"{context.SemanticAdaptor.GetName(typeSymbol)}\"");
                }

                break;

            case "typeof":
                break;

            default:
                throw new Exception("No symbol found for invocation expression.");
            }
        }
コード例 #10
0
        private static void WriteAsExtensionMethodCall(
            InvocationExpressionSyntax syntax,
            IIndentedTextWriterWrapper textWriter,
            IContext context,
            IMethodSymbol symbol)
        {
            textWriter.Write("(({0} % _M.DOT).", context.SemanticAdaptor.GetFullName(symbol.ContainingType));

            var signatureTextWriter  = textWriter.CreateTextWriterAtSameIndent();
            var signatureHasGenerics =
                context.SignatureWriter.WriteSignature(
                    symbol.ReducedFrom.Parameters.Select(p => p.Type).ToArray(),
                    signatureTextWriter);

            if (signatureHasGenerics)
            {
                textWriter.Write("['");
            }

            textWriter.Write("{0}_M_{1}_", symbol.Name, symbol.TypeArguments.Length);

            if (signatureHasGenerics)
            {
                textWriter.Write("'..(");
            }

            textWriter.AppendTextWriter(signatureTextWriter);

            if (signatureHasGenerics)
            {
                textWriter.Write(")]");
            }

            if (symbol.TypeArguments.Any())
            {
                context.TypeReferenceWriter.WriteTypeReferences(symbol.TypeArguments.ToArray(), textWriter);
            }

            textWriter.Write(" % _M.DOT)");

            var argWriter = textWriter.CreateTextWriterAtSameIndent();

            syntax.ArgumentList.Write(argWriter, context);

            var targetWriter = textWriter.CreateTextWriterAtSameIndent();

            syntax.Expression.Write(targetWriter, context);
            var targetStr = targetWriter.ToString();

            textWriter.Write(targetStr.Substring(0, targetStr.LastIndexOf(" % _M.DOT)")));

            var argStr = argWriter.ToString();

            if (argStr.Length > 2)
            {
                textWriter.Write(", ");
            }

            textWriter.Write(argStr.Substring(1)); // Skip the opening (
        }
コード例 #11
0
        public static void Write(this ConditionalAccessExpressionSyntax syntax,
                                 IIndentedTextWriterWrapper textWriter,
                                 IContext context)
        {
            textWriter.Write("_M.CA(");
            syntax.Expression.Write(textWriter, context);
            textWriter.Write(",function(obj) return ");
            var stringWriter  = new StringWriter();
            var newTextWriter = new IndentedTextWriterWrapper(stringWriter);

            syntax.WhenNotNull.Write(newTextWriter, context);

            if (stringWriter.ToString().StartsWith("("))
            {
                textWriter.Write("((obj % _M.DOT)");
                textWriter.Write(newTextWriter.ToString().Substring(1));
            }
            else
            {
                textWriter.Write("(obj % _M.DOT)");
                textWriter.AppendTextWriter(newTextWriter);
            }

            textWriter.Write("; end)");
        }
コード例 #12
0
        public static void Write(PrefixUnaryExpressionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            var kind = syntax.Kind();

            if (kind == SyntaxKind.UnaryMinusExpression)
            {
                textWriter.Write("-");
                syntax.Operand.Write(textWriter, context);
            }
            else if (kind == SyntaxKind.UnaryPlusExpression)// TODO handle LogicalNotExpression as well.
            {
                textWriter.Write("+");
                syntax.Operand.Write(textWriter, context);
            }
            else if (kind == SyntaxKind.LogicalNotExpression)
            {
                textWriter.Write("not(");
                syntax.Operand.Write(textWriter, context);
                textWriter.Write(")");
            }
            else
            {
                throw new Exception($"Unhandled PrefixUnaryExpressionSyntax kind {kind}.");
            }
        }
コード例 #13
0
        public static void Write(this ConstructorInitializerSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            var symbol = (IMethodSymbol)context.SemanticModel.GetSymbolInfo(syntax).Symbol;

            if (syntax.Kind() == SyntaxKind.BaseConstructorInitializer)
            {
                textWriter.Write("(element % _M.DOT_LVL(typeObject.Level - 1))._C_0_");
                context.SignatureWriter.WriteSignature(symbol.Parameters.Select(p => p.Type).ToArray(), textWriter);
            }
            else if (syntax.Kind() == SyntaxKind.ThisConstructorInitializer)
            {
                textWriter.Write("(element % _M.DOT_LVL(typeObject.Level))");

                var signatureWriter      = textWriter.CreateTextWriterAtSameIndent();
                var hasGenericComponents = context.SignatureWriter.WriteSignature(symbol.Parameters.Select(p => p.Type).ToArray(), signatureWriter);

                if (hasGenericComponents)
                {
                    textWriter.Write("['_C_0_'..(");
                    textWriter.AppendTextWriter(signatureWriter);
                    textWriter.Write(")]");
                }
                else
                {
                    textWriter.Write("._C_0_");
                    textWriter.AppendTextWriter(signatureWriter);
                }
            }

            syntax.ArgumentList.Write(textWriter, context);

            textWriter.WriteLine(";");
        }
コード例 #14
0
        private static void WriteAccessExpression(
            MemberAccessExpressionSyntax syntax,
            IIndentedTextWriterWrapper textWriter,
            IContext context)
        {
            var symbol = context.SemanticModel.GetSymbolInfo(syntax).Symbol;

            if (symbol == null)
            {
                syntax.Expression.Write(textWriter, context);
                return;
            }

            if (symbol is ITypeSymbol)
            {
                context.TypeReferenceWriter.WriteInteractionElementReference((ITypeSymbol)symbol, textWriter);
                return;
            }

            if (!symbol.IsStatic)
            {
                syntax.Expression.Write(textWriter, context);
                return;
            }

            context.TypeReferenceWriter.WriteInteractionElementReference(symbol.ContainingType, textWriter);
        }
コード例 #15
0
        private static void WriteBodyFunc(MethodDeclarationSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context, IMethodSymbol symbol)
        {
            if (syntax.Body == null)
            {
                return;
            }

            textWriter.Write("func = function(element");

            if (syntax.TypeParameterList != null)
            {
                textWriter.Write(", methodGenericsMapping, methodGenerics");
            }

            syntax.ParameterList.Write(textWriter, context);

            textWriter.WriteLine(")");

            if (symbol.Parameters.LastOrDefault()?.IsParams == true)
            {
                textWriter.Indent++;
                WriteParamVariableInit(textWriter, context, symbol);
                textWriter.Indent--;
            }

            syntax.Body.Write(textWriter, context);
            textWriter.WriteLine("end");
        }
コード例 #16
0
        private static void WriteBaseInheritance(ITypeSymbol symbol, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            textWriter.Write("local baseTypeObject, getBaseMembers, baseConstructors, baseElementGenerator, implements, baseInitialize = ");

            context.TypeReferenceWriter.WriteInteractionElementReference(symbol.BaseType, textWriter);

            textWriter.WriteLine(".__meta(staticValues);");
        }
コード例 #17
0
        public static void Write(this DefaultExpressionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            textWriter.Write("_M.DV(");
            var symbol = (ITypeSymbol)context.SemanticModel.GetSymbolInfo(syntax.Type).Symbol;

            context.TypeReferenceWriter.WriteTypeReference(symbol, textWriter);
            textWriter.Write(")");
        }
コード例 #18
0
 public static void Write(this SwitchStatementSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
 {
     textWriter.Write("local switchValue = ");
     syntax.Expression.Write(textWriter, context);
     textWriter.WriteLine(";");
     syntax.Sections.Write(Write, textWriter, context, () => textWriter.Write("else"));
     textWriter.WriteLine("end");
 }
コード例 #19
0
 public void WriteTypeReference(T type, IIndentedTextWriterWrapper textWriter)
 {
     this.WriteInteractionElementReference(type, textWriter);
     if (!this.semanticAdaptor.IsGenericType(type))
     {
         textWriter.Write(".__typeof");
     }
 }
コード例 #20
0
 public static void Write(this WhileStatementSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
 {
     textWriter.Write("while (");
     syntax.Condition.Write(textWriter, context);
     textWriter.WriteLine(") do");
     syntax.Statement.Write(textWriter, context);
     textWriter.WriteLine("end");
 }
コード例 #21
0
 private static void WriteClose(IIndentedTextWriterWrapper textWriter, IContext context)
 {
     if (context.PartialElementState.IsLast)
     {
         textWriter.WriteLine("return 'Class', typeObject, getMembers, constructors, elementGenerator, nil, initialize;");
         textWriter.Indent--;
         textWriter.WriteLine("end,");
     }
 }
コード例 #22
0
        public static void Write(this ImplicitArrayCreationExpressionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            var typeInfo = context.SemanticModel.GetTypeInfo(syntax);

            textWriter.Write("(");
            context.TypeReferenceWriter.WriteInteractionElementReference(typeInfo.Type, textWriter);
            textWriter.Write("._C_0_0() % _M.DOT)");
            syntax.Initializer.Write(textWriter, context);
        }
コード例 #23
0
 private void WriteFooter(IEnumerable <NamespaceMember> members, IIndentedTextWriterWrapper textWriter)
 {
     foreach (var classMember in members.Where(member => member.Syntax is ClassDeclarationSyntax))
     {
         this.context.SemanticModel = classMember.SemanticModel;
         this.context.PartialElementState.CurrentState = (int)ClassState.Footer;
         classMember.Syntax.Write(textWriter, this.context);
     }
 }
コード例 #24
0
 public static void Write(this SwitchSectionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
 {
     textWriter.Write("if (");
     syntax.Labels.Write(Write, textWriter, context, () => textWriter.Write(" or "));
     textWriter.WriteLine(") then");
     textWriter.Indent++;
     syntax.Statements.Write(StatementExtensions.Write, textWriter, context, null, s => !(s is BreakStatementSyntax));
     textWriter.Indent--;
 }
コード例 #25
0
        public static void Write(
            this InitializerExpressionSyntax syntax,
            IIndentedTextWriterWrapper textWriter,
            IContext context)
        {
            // Note, there are 4 different implementations using InitializerExpressionSyntax

            if (syntax.Kind() == SyntaxKind.ComplexElementInitializerExpression)
            {
                textWriter.Write("[");
                syntax.Expressions.First().Write(textWriter, context);
                textWriter.Write("] = ");
                syntax.Expressions.Last().Write(textWriter, context);
                return;
            }

            textWriter.Write(".__Initialize({");

            if (syntax.Kind() == SyntaxKind.ArrayInitializerExpression)
            {
                if (syntax.Expressions.Any())
                {
                    textWriter.Write("[0] = ");
                }
            }
            else if (syntax.Expressions.Count > 1 || GetKind(syntax) == SyntaxKind.CollectionInitializerExpression)
            {
                textWriter.WriteLine();
            }


            textWriter.Indent++;
            if (GetKind(syntax) == SyntaxKind.CollectionInitializerExpression)
            {
                syntax.Expressions.Write(
                    ExpressionExtensions.Write,
                    textWriter,
                    context,
                    () => textWriter.WriteLine(","));
            }
            else
            {
                syntax.Expressions.Write(ExpressionExtensions.Write, textWriter, context);
            }

            textWriter.Indent--;

            if (syntax.Kind() == SyntaxKind.ArrayInitializerExpression)
            {
            }
            else if (syntax.Expressions.Count > 1 || GetKind(syntax) == SyntaxKind.CollectionInitializerExpression)
            {
                textWriter.WriteLine();
            }

            textWriter.Write("})");
        }
コード例 #26
0
 public static void Write(
     ParenthesizedExpressionSyntax syntax,
     IIndentedTextWriterWrapper textWriter,
     IContext context)
 {
     textWriter.Write("(");
     syntax.Expression.Write(textWriter, context);
     textWriter.Write(")");
 }
コード例 #27
0
        public static void Write(ArrayTypeSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            var symbol = (ITypeSymbol)context.SemanticModel.GetSymbolInfo(syntax.ElementType).Symbol;

            textWriter.Write("System.Array[{");
            context.TypeReferenceWriter.WriteTypeReference(symbol, textWriter);
            textWriter.Write("}]");
            syntax.RankSpecifiers.Single().Write(textWriter, context);
        }
コード例 #28
0
        public static void Write(this ForEachStatementSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            textWriter.Write("for _,{0} in (", syntax.Identifier.Text);
            syntax.Expression.Write(textWriter, context);
            textWriter.WriteLine(" % _M.DOT).GetEnumerator() do");

            syntax.Statement.Write(textWriter, context);
            textWriter.WriteLine("end");
        }
コード例 #29
0
        public static void Write(this ParameterListSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context)
        {
            if (syntax.Parameters.Any() && (syntax.Parent is ConstructorDeclarationSyntax || syntax.Parent is MethodDeclarationSyntax))
            {
                textWriter.Write(", ");
            }

            syntax.Parameters.Write(SyntaxNodeExtensions.Write, textWriter, context);
        }
コード例 #30
0
 private static void WriteSignatureHash(
     IIndentedTextWriterWrapper textWriter,
     IContext context,
     IMethodSymbol symbol)
 {
     textWriter.Write("signatureHash = ");
     context.SignatureWriter.WriteSignature(symbol.Parameters.Select(p => p.Type).ToArray(), textWriter);
     textWriter.WriteLine(",");
 }