~halega/+junk/sharpdevelop

« back to all changes in this revision

Viewing changes to src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooCodeGenerator.cs

  • Committer: sk
  • Date: 2011-09-10 05:17:57 UTC
  • Revision ID: halega@halega.com-20110910051757-qfouz1llya9m6boy
4.1.0.7915 Release Candidate 1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
 
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
 
3
 
 
4
using System;
 
5
using System.IO;
 
6
using System.Text;
 
7
 
 
8
using Boo.Lang.Compiler;
 
9
using Boo.Lang.Compiler.Ast;
 
10
using Boo.Lang.Compiler.Ast.Visitors;
 
11
using ICSharpCode.Core;
 
12
using ICSharpCode.NRefactory.Ast;
 
13
using ICSharpCode.SharpDevelop.Dom;
 
14
using ICSharpCode.SharpDevelop.Dom.Refactoring;
 
15
using ICSharpCode.SharpDevelop.Editor;
 
16
using NRefactoryToBooConverter;
 
17
 
 
18
namespace Grunwald.BooBinding
 
19
{
 
20
        /// <summary>
 
21
        /// Description of BooCodeGenerator.
 
22
        /// </summary>
 
23
        public class BooCodeGenerator : CodeGenerator
 
24
        {
 
25
                public override void InsertCodeAtEnd(DomRegion region, IRefactoringDocument document, params AbstractNode[] nodes)
 
26
                {
 
27
                        InsertCodeAfter(region.EndLine, document,
 
28
                                        GetIndentation(document, region.BeginLine) + '\t', nodes);
 
29
                }
 
30
                
 
31
                public override string GenerateCode(AbstractNode node, string indentation)
 
32
                {
 
33
                        StringBuilder errorBuilder = new StringBuilder();
 
34
                        ConverterSettings settings = new ConverterSettings("codegeneration.cs");
 
35
                        string output = null;
 
36
                        
 
37
                        Node booNode = (Node)node.AcceptVisitor(new ConvertVisitor(settings), null);
 
38
                        
 
39
                        if (settings.Errors.Count > 0) {
 
40
                                foreach (CompilerError error in settings.Errors) {
 
41
                                        errorBuilder.AppendLine(error.ToString());
 
42
                                }
 
43
                        } else {
 
44
                                if (settings.Warnings.Count > 0) {
 
45
                                        foreach (CompilerWarning warning in settings.Warnings) {
 
46
                                                errorBuilder.AppendLine(warning.ToString());
 
47
                                        }
 
48
                                }
 
49
                                booNode.Accept(new RemoveRedundantTypeReferencesVisitor());
 
50
                                using (StringWriter w = new StringWriter()) {
 
51
                                        BooPrinterVisitor printer = new BooPrinterVisitor(w);
 
52
                                        int indentCount = 0;
 
53
                                        foreach (char c in indentation) {
 
54
                                                if (c == '\t')
 
55
                                                        indentCount += 4;
 
56
                                                else
 
57
                                                        indentCount += 1;
 
58
                                        }
 
59
                                        indentCount /= 4;
 
60
                                        while (indentCount-- > 0)
 
61
                                                printer.Indent();
 
62
                                        booNode.Accept(printer);
 
63
                                        output = w.ToString();
 
64
                                }
 
65
                        }
 
66
                        if (errorBuilder.Length > 0) {
 
67
                                MessageService.ShowMessage(errorBuilder.ToString());
 
68
                        }
 
69
                        return output;
 
70
                }
 
71
                
 
72
                public static readonly BooCodeGenerator Instance = new BooCodeGenerator();
 
73
        }
 
74
}