예제 #1
0
        private void WriteCachedInvocation(IndentedTextWriter writer, CakeScriptAlias alias)
        {
            // If
            writer.Write("if (_");
            writer.Write(alias.Method.Name);
            writer.Write("==null)");
            writer.WriteLine();

            writer.Write("{");
            using (writer.BeginScope())
            {
                // Assignment
                writer.Write("_");
                writer.Write(alias.Method.Name);
                writer.Write(" = ");
                WriteInvocation(writer, alias);
            }
            writer.Write("}");
        }
예제 #2
0
        private void Generate(IndentedTextWriter writer, CakeScriptAlias alias)
        {
            // XML documentation
            WriteDocs(writer, alias.Documentation);

            // Access modifier
            writer.Write("public ");

            // Return type
            if (alias.Method.ReturnType != null)
            {
                if (alias.Method.ReturnType.Namespace.Name == "System" && alias.Method.ReturnType.Name == "Void")
                {
                    writer.Write("void");
                }
                else
                {
                    _typeEmitter.Write(writer, alias.Method.ReturnType);
                }
                writer.Write(" ");
            }

            // Render the method signature.
            writer.Write(alias.Method.Name);

            // Generic arguments?
            if (alias.Method.GenericParameters.Count > 0)
            {
                writer.Write("<");
                writer.Write(string.Join(",", alias.Method.GenericParameters.Select(p => p.Name)));
                writer.Write(">");
            }

            // Arguments
            writer.Write("(");
            WriteMethodParameters(writer, alias, invocation: false);
            writer.Write(")");

            // Generic constraints
            if (alias.Method.GenericParameters.Count > 0)
            {
                foreach (var genericParameter in alias.Method.GenericParameters)
                {
                    if (genericParameter.Constraints.Count > 0)
                    {
                        writer.Write(" where ");
                        writer.Write(genericParameter.Name);
                        writer.Write(" : ");
                        writer.Write(string.Join(",", genericParameter.Constraints));
                    }
                }
            }

            // Block start
            writer.WriteLine();
            writer.Write("{");
            using (writer.BeginScope())
            {
                // Method is obsolete?
                var performInvocation = true;
                if (alias.Obsolete != null)
                {
                    var message = GetObsoleteMessage(alias);

                    if (alias.Obsolete.IsError)
                    {
                        // Error
                        performInvocation = false;
                        writer.Write($"throw new Cake.ScriptServer.CakeException(\"{message}\");");
                    }
                    else
                    {
                        // Warning
                        writer.Write($"Context.Log.Warning(\"Warning: {message}\");");
                    }
                }

                // Render the method invocation?
                if (performInvocation)
                {
                    if (alias.Obsolete != null)
                    {
                        writer.WriteLine();
                        writer.Write("#pragma warning disable 0618");
                        writer.WriteLine();
                    }

                    WriteInvocation(writer, alias);

                    if (alias.Obsolete != null)
                    {
                        writer.WriteLine();
                        writer.Write("#pragma warning restore 0618");
                    }
                }
            }
            writer.Write("}");
        }
예제 #3
0
        private void Generate(IndentedTextWriter writer, CakeScriptAlias alias)
        {
            // XML documentation
            WriteDocs(writer, alias.Documentation);

            var shouldThrow = alias.Obsolete?.IsError ?? false;

            if (alias.Cached && !shouldThrow)
            {
                WriteBackingField(writer, alias);
            }

            // Access modifier
            writer.Write("public ");

            // Return type
            _typeEmitter.Write(writer, alias.Method.ReturnType);
            writer.Write(" ");

            // Name
            writer.Write(alias.Method.Name);
            writer.WriteLine();

            writer.Write("{");
            using (writer.BeginScope())
            {
                writer.Write("get");
                writer.WriteLine();

                writer.Write("{");
                using (writer.BeginScope())
                {
                    // Obsolete warning?
                    if (alias.Obsolete != null)
                    {
                        var message = GetObsoleteMessage(alias);
                        if (!alias.Obsolete.IsError)
                        {
                            writer.Write($"Context.Log.Warning(\"Warning: {message}\");");
                            writer.WriteLine();
                        }
                    }

                    if (shouldThrow)
                    {
                        var message = GetObsoleteMessage(alias);
                        writer.Write($"throw new Cake.ScriptServer.CakeException(\"{message}\");");
                    }
                    else if (alias.Cached)
                    {
                        WriteCachedInvocation(writer, alias);

                        // Return
                        writer.WriteLine();
                        writer.Write("return ");
                        writer.Write("_");
                        writer.Write(alias.Method.Name);
                        if (alias.Method.ReturnType.IsValueType)
                        {
                            writer.Write(".Value");
                        }
                        writer.Write(";");
                    }
                    else
                    {
                        // Return
                        writer.Write("return ");
                        WriteInvocation(writer, alias);
                    }
                }
                writer.Write("}");
            }
            writer.Write("}");
        }