// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Ast;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem;
namespace ICSharpCode.ILSpyAddIn
{
///
/// Description of ILSpyUnresolvedFile.
///
public class ILSpyUnresolvedFile : IUnresolvedFile
{
DecompiledTypeReference name;
StringWriter writer;
IList errors;
IList topLevel;
public static ILSpyUnresolvedFile Create(DecompiledTypeReference name, AstBuilder builder)
{
var writer = new StringWriter();
var target = new TextWriterTokenWriter(writer) { IndentationString = "\t" };
var output = new DebugInfoTokenWriterDecorator(target, target);
builder.RunTransformations();
var syntaxTree = builder.SyntaxTree;
syntaxTree.AcceptVisitor(new InsertParenthesesVisitor { InsertParenthesesForReadability = true });
var outputFormatter = TokenWriter.WrapInWriterThatSetsLocationsInAST(output);
syntaxTree.AcceptVisitor(new CSharpOutputVisitor(outputFormatter, FormattingOptionsFactory.CreateSharpDevelop()));
ILSpyUnresolvedFile file = new ILSpyUnresolvedFile(name, builder.SyntaxTree.Errors);
builder.SyntaxTree.FileName = name.ToFileName();
var ts = builder.SyntaxTree.ToTypeSystem();
file.topLevel = ts.TopLevelTypeDefinitions;
file.MemberLocations = output.MemberLocations;
file.DebugSymbols = output.DebugSymbols;
file.writer = writer;
return file;
}
ILSpyUnresolvedFile(DecompiledTypeReference name, IList errors)
{
this.name = name;
this.errors = errors;
}
public Dictionary MemberLocations { get; private set; }
public Dictionary DebugSymbols { get; private set; }
public StringWriter Writer {
get { return writer; }
}
public FileName AssemblyFile {
get { return name.AssemblyFile; }
}
public IUnresolvedTypeDefinition GetTopLevelTypeDefinition(TextLocation location)
{
throw new NotImplementedException();
}
public IUnresolvedTypeDefinition GetInnermostTypeDefinition(TextLocation location)
{
throw new NotImplementedException();
}
public IUnresolvedMember GetMember(TextLocation location)
{
throw new NotImplementedException();
}
public string FileName {
get { return name.ToFileName(); }
}
public DateTime? LastWriteTime {
get {
throw new NotImplementedException();
}
set {
throw new NotImplementedException();
}
}
public IList TopLevelTypeDefinitions {
get {
return topLevel;
}
}
public IList AssemblyAttributes {
get {
throw new NotImplementedException();
}
}
public IList ModuleAttributes {
get {
throw new NotImplementedException();
}
}
public IList Errors {
get { return errors; }
}
}
}