34
34
using System.CodeDom;
35
35
using System.CodeDom.Compiler;
36
36
using Microsoft.CSharp;
37
using ICSharpCode.OldNRefactory;
38
using ICSharpCode.OldNRefactory.Parser;
39
using ICSharpCode.OldNRefactory.Visitors;
37
using ICSharpCode.NRefactory.CSharp;
39
using MonoDevelop.Ide.TypeSystem;
40
using ICSharpCode.NRefactory.TypeSystem;
41
42
namespace MonoDevelop.CSharp
58
59
return ParseInternal (codeStream);
62
static readonly Lazy<IUnresolvedAssembly> mscorlib = new Lazy<IUnresolvedAssembly>(
64
return new CecilLoader().LoadAssemblyFile(typeof(object).Assembly.Location);
67
static readonly Lazy<IUnresolvedAssembly> systemCore = new Lazy<IUnresolvedAssembly>(
69
return new CecilLoader().LoadAssemblyFile(typeof(System.Linq.Enumerable).Assembly.Location);
72
static readonly Lazy<ICompilation> Compilation = new Lazy<ICompilation>(
74
var project = new CSharpProjectContent().AddAssemblyReferences (new [] { mscorlib.Value, systemCore.Value });
75
return project.CreateCompilation();
61
78
static CodeCompileUnit ParseInternal (TextReader codeStream)
63
IParser parser = ParserFactory.CreateParser (
64
SupportedLanguage.CSharp,
66
parser.ParseMethodBodies = true;
69
if (parser.Errors.Count > 0)
70
throw new ArgumentException (parser.Errors.ErrorOutput);
72
var cdv = new CodeDomVisitor (); // new CodeDomVisitor (parser.Lexer.SpecialTracker.CurrentSpecials);
73
parser.CompilationUnit.AcceptVisitor (cdv, null);
77
CodeCompileUnit ccu = cdv.codeCompileUnit;
79
//C# parser seems to insist on putting imports in the "Global" namespace; fix it up
80
for (int i = 0; i < ccu.Namespaces.Count; i++) {
81
CodeNamespace global = ccu.Namespaces [i];
82
if ((global.Name == "Global") && (global.Types.Count == 0)) {
84
ccu.Namespaces.RemoveAt (i);
85
ccu.Namespaces.Insert (0, global);
87
//clear out repeat imports...
88
for (int j = 1; j < ccu.Namespaces.Count; j++) {
89
CodeNamespace cn = ccu.Namespaces [j];
91
//why can't we remove imports? will have to collect ones to keep
92
//then clear and refill
93
CodeNamespaceImportCollection imps = new CodeNamespaceImportCollection ();
95
for (int m = 0; m < cn.Imports.Count; m++) {
98
for (int n = 0; n < global.Imports.Count; n++)
99
if (global.Imports [n] == cn.Imports [m])
103
imps.Add (cn.Imports [m]);
108
foreach (CodeNamespaceImport imp in imps)
109
cn.Imports.Add (imp);
80
var cs = codeStream.ReadToEnd ();
81
var tree = SyntaxTree.Parse (cs, "a.cs");
82
if (tree.Errors.Count > 0)
83
throw new ArgumentException ("Stream contained errors.");
85
var convertVisitor = new CodeDomConvertVisitor ();
87
return convertVisitor.Convert (Compilation.Value, tree, tree.ToTypeSystem ());
118
90
private class CodeParser : ICodeParser