Browse Source

Rename IParsedFile -> IUnresolvedFile to make clear it belongs to the unresolved type system.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
16aa0c6c28
  1. 4
      ICSharpCode.NRefactory.CSharp/Ast/SyntaxTree.cs
  2. 85
      ICSharpCode.NRefactory.CSharp/CSharpProjectContent.cs
  3. 4
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  4. 4
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs
  5. 16
      ICSharpCode.NRefactory.CSharp/Completion/ICompletionContextProvider.cs
  6. 2
      ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
  7. 6
      ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs
  8. 4
      ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs
  9. 2
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/InlineLocalVariableAction.cs
  10. 30
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpAstResolver.cs
  11. 54
      ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs
  12. 16
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs
  13. 40
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
  14. 6
      ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs
  15. 8
      ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpUnresolvedFile.cs
  16. 38
      ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs
  17. 26
      ICSharpCode.NRefactory.ConsistencyCheck/CSharpProject.cs
  18. 10
      ICSharpCode.NRefactory.ConsistencyCheck/FindReferencesConsistencyCheck.cs
  19. 2
      ICSharpCode.NRefactory.ConsistencyCheck/Program.cs
  20. 4
      ICSharpCode.NRefactory.ConsistencyCheck/RandomizedOrderResolverTest.cs
  21. 8
      ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs
  22. 5
      ICSharpCode.NRefactory.ConsistencyCheck/VisitorBenchmark.cs
  23. 16
      ICSharpCode.NRefactory.Demo/CSDemo.cs
  24. 6
      ICSharpCode.NRefactory.GtkDemo/MainWindow.cs
  25. 12
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/TestRefactoringContext.cs
  26. 16
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs
  27. 12
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs
  28. 12
      ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs
  29. 10
      ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs
  30. 4
      ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs
  31. 8
      ICSharpCode.NRefactory.Tests/CSharp/Refactoring/TypeSystemAstBuilderTests.cs
  32. 8
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs
  33. 20
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs
  34. 12
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolverTestBase.cs
  35. 2
      ICSharpCode.NRefactory.Tests/Documentation/CSharpCrefLookupTests.cs
  36. 2
      ICSharpCode.NRefactory.Tests/Documentation/CSharpDocumentationTests.cs
  37. 4
      ICSharpCode.NRefactory.Tests/TypeSystem/GetAllBaseTypesTest.cs
  38. 12
      ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemHelper.cs
  39. 2
      ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
  40. 6
      ICSharpCode.NRefactory/TypeSystem/ExtensionMethods.cs
  41. 2
      ICSharpCode.NRefactory/TypeSystem/IEntity.cs
  42. 42
      ICSharpCode.NRefactory/TypeSystem/IProjectContent.cs
  43. 5
      ICSharpCode.NRefactory/TypeSystem/IUnresolvedFile.cs
  44. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
  45. 8
      ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedEntity.cs
  46. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
  47. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedEvent.cs
  48. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedField.cs
  49. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedMethod.cs
  50. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedProperty.cs
  51. 2
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedTypeDefinition.cs
  52. 2
      doc/XML Documentation.html

4
ICSharpCode.NRefactory.CSharp/Ast/SyntaxTree.cs

@ -146,13 +146,13 @@ namespace ICSharpCode.NRefactory.CSharp
/// <summary> /// <summary>
/// Converts this syntax tree into a parsed file that can be stored in the type system. /// Converts this syntax tree into a parsed file that can be stored in the type system.
/// </summary> /// </summary>
public CSharpParsedFile ToTypeSystem () public CSharpUnresolvedFile ToTypeSystem ()
{ {
if (string.IsNullOrEmpty (this.FileName)) if (string.IsNullOrEmpty (this.FileName))
throw new InvalidOperationException ("Cannot use ToTypeSystem() on a syntax tree without file name."); throw new InvalidOperationException ("Cannot use ToTypeSystem() on a syntax tree without file name.");
var v = new TypeSystemConvertVisitor (this.FileName); var v = new TypeSystemConvertVisitor (this.FileName);
v.VisitSyntaxTree (this); v.VisitSyntaxTree (this);
return v.ParsedFile; return v.UnresolvedFile;
} }
public static SyntaxTree Parse (string program, string fileName = "", CompilerSettings settings = null, CancellationToken cancellationToken = default (CancellationToken)) public static SyntaxTree Parse (string program, string fileName = "", CompilerSettings settings = null, CancellationToken cancellationToken = default (CancellationToken))

85
ICSharpCode.NRefactory.CSharp/CSharpProjectContent.cs

@ -33,13 +33,13 @@ namespace ICSharpCode.NRefactory.CSharp
string assemblyName; string assemblyName;
string projectFileName; string projectFileName;
string location; string location;
Dictionary<string, IParsedFile> parsedFiles; Dictionary<string, IUnresolvedFile> unresolvedFiles;
List<IAssemblyReference> assemblyReferences; List<IAssemblyReference> assemblyReferences;
CompilerSettings compilerSettings; CompilerSettings compilerSettings;
public CSharpProjectContent() public CSharpProjectContent()
{ {
this.parsedFiles = new Dictionary<string, IParsedFile>(Platform.FileNameComparer); this.unresolvedFiles = new Dictionary<string, IUnresolvedFile>(Platform.FileNameComparer);
this.assemblyReferences = new List<IAssemblyReference>(); this.assemblyReferences = new List<IAssemblyReference>();
this.compilerSettings = new CompilerSettings(); this.compilerSettings = new CompilerSettings();
compilerSettings.Freeze(); compilerSettings.Freeze();
@ -50,13 +50,13 @@ namespace ICSharpCode.NRefactory.CSharp
this.assemblyName = pc.assemblyName; this.assemblyName = pc.assemblyName;
this.projectFileName = pc.projectFileName; this.projectFileName = pc.projectFileName;
this.location = pc.location; this.location = pc.location;
this.parsedFiles = new Dictionary<string, IParsedFile>(pc.parsedFiles, Platform.FileNameComparer); this.unresolvedFiles = new Dictionary<string, IUnresolvedFile>(pc.unresolvedFiles, Platform.FileNameComparer);
this.assemblyReferences = new List<IAssemblyReference>(pc.assemblyReferences); this.assemblyReferences = new List<IAssemblyReference>(pc.assemblyReferences);
this.compilerSettings = pc.compilerSettings; this.compilerSettings = pc.compilerSettings;
} }
public IEnumerable<IParsedFile> Files { public IEnumerable<IUnresolvedFile> Files {
get { return parsedFiles.Values; } get { return unresolvedFiles.Values; }
} }
public IEnumerable<IAssemblyReference> AssemblyReferences { public IEnumerable<IAssemblyReference> AssemblyReferences {
@ -101,10 +101,10 @@ namespace ICSharpCode.NRefactory.CSharp
} }
} }
public IParsedFile GetFile(string fileName) public IUnresolvedFile GetFile(string fileName)
{ {
IParsedFile file; IUnresolvedFile file;
if (parsedFiles.TryGetValue(fileName, out file)) if (unresolvedFiles.TryGetValue(fileName, out file))
return file; return file;
else else
return null; return null;
@ -160,6 +160,11 @@ namespace ICSharpCode.NRefactory.CSharp
} }
public IProjectContent AddAssemblyReferences(IEnumerable<IAssemblyReference> references) public IProjectContent AddAssemblyReferences(IEnumerable<IAssemblyReference> references)
{
return AddAssemblyReferences(references.ToArray());
}
public IProjectContent AddAssemblyReferences(params IAssemblyReference[] references)
{ {
CSharpProjectContent pc = Clone(); CSharpProjectContent pc = Clone();
pc.assemblyReferences.AddRange(references); pc.assemblyReferences.AddRange(references);
@ -167,13 +172,62 @@ namespace ICSharpCode.NRefactory.CSharp
} }
public IProjectContent RemoveAssemblyReferences(IEnumerable<IAssemblyReference> references) public IProjectContent RemoveAssemblyReferences(IEnumerable<IAssemblyReference> references)
{
return RemoveAssemblyReferences(references.ToArray());
}
public IProjectContent RemoveAssemblyReferences(params IAssemblyReference[] references)
{
CSharpProjectContent pc = Clone();
foreach (var r in references)
pc.assemblyReferences.Remove(r);
return pc;
}
/// <summary>
/// Adds the specified files to the project content.
/// If a file with the same name already exists, updated the existing file.
/// </summary>
public IProjectContent AddOrUpdateFiles(IEnumerable<IUnresolvedFile> newFiles)
{
CSharpProjectContent pc = Clone();
foreach (var file in newFiles) {
pc.unresolvedFiles[file.FileName] = file;
}
return pc;
}
/// <summary>
/// Adds the specified files to the project content.
/// If a file with the same name already exists, this method updates the existing file.
/// </summary>
public IProjectContent AddOrUpdateFiles(params IUnresolvedFile[] newFiles)
{
return AddOrUpdateFiles((IEnumerable<IUnresolvedFile>)newFiles);
}
/// <summary>
/// Removes the files with the specified names.
/// </summary>
public IProjectContent RemoveFiles(IEnumerable<string> fileNames)
{ {
CSharpProjectContent pc = Clone(); CSharpProjectContent pc = Clone();
pc.assemblyReferences.RemoveAll(r => references.Contains(r)); foreach (var fileName in fileNames) {
pc.unresolvedFiles.Remove(fileName);
}
return pc; return pc;
} }
public IProjectContent UpdateProjectContent(IParsedFile oldFile, IParsedFile newFile) /// <summary>
/// Removes the files with the specified names.
/// </summary>
public IProjectContent RemoveFiles(params string[] fileNames)
{
return RemoveFiles((IEnumerable<string>)fileNames);
}
[Obsolete("Use RemoveFiles/AddOrUpdateFiles instead")]
public IProjectContent UpdateProjectContent(IUnresolvedFile oldFile, IUnresolvedFile newFile)
{ {
if (oldFile == null && newFile == null) if (oldFile == null && newFile == null)
return this; return this;
@ -183,23 +237,24 @@ namespace ICSharpCode.NRefactory.CSharp
} }
CSharpProjectContent pc = Clone(); CSharpProjectContent pc = Clone();
if (newFile == null) if (newFile == null)
pc.parsedFiles.Remove(oldFile.FileName); pc.unresolvedFiles.Remove(oldFile.FileName);
else else
pc.parsedFiles[newFile.FileName] = newFile; pc.unresolvedFiles[newFile.FileName] = newFile;
return pc; return pc;
} }
public IProjectContent UpdateProjectContent(IEnumerable<IParsedFile> oldFiles, IEnumerable<IParsedFile> newFiles) [Obsolete("Use RemoveFiles/AddOrUpdateFiles instead")]
public IProjectContent UpdateProjectContent(IEnumerable<IUnresolvedFile> oldFiles, IEnumerable<IUnresolvedFile> newFiles)
{ {
CSharpProjectContent pc = Clone(); CSharpProjectContent pc = Clone();
if (oldFiles != null) { if (oldFiles != null) {
foreach (var oldFile in oldFiles) { foreach (var oldFile in oldFiles) {
pc.parsedFiles.Remove(oldFile.FileName); pc.unresolvedFiles.Remove(oldFile.FileName);
} }
} }
if (newFiles != null) { if (newFiles != null) {
foreach (var newFile in newFiles) { foreach (var newFile in newFiles) {
pc.parsedFiles.Add(newFile.FileName, newFile); pc.unresolvedFiles.Add(newFile.FileName, newFile);
} }
} }
return pc; return pc;

4
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -723,7 +723,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
// var astResolver = new CSharpAstResolver( // var astResolver = new CSharpAstResolver(
// GetState(), // GetState(),
// identifierStart.Unit, // identifierStart.Unit,
// CSharpParsedFile // CSharpUnresolvedFile
// ); // );
// //
// foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)n)) { // foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)n)) {
@ -1172,7 +1172,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (csResolver == null) { if (csResolver == null) {
if (node != null) { if (node != null) {
csResolver = GetState(); csResolver = GetState();
//var astResolver = new CSharpAstResolver (csResolver, node, xp != null ? xp.Item1 : CSharpParsedFile); //var astResolver = new CSharpAstResolver (csResolver, node, xp != null ? xp.Item1 : CSharpUnresolvedFile);
try { try {
//csResolver = astResolver.GetResolverStateBefore (node); //csResolver = astResolver.GetResolverStateBefore (node);

4
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

@ -494,13 +494,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
state.CurrentMember = currentMember; state.CurrentMember = currentMember;
state.CurrentTypeDefinition = currentType; state.CurrentTypeDefinition = currentType;
state.CurrentUsingScope = CSharpParsedFile.GetUsingScope (location); state.CurrentUsingScope = CSharpUnresolvedFile.GetUsingScope (location);
if (state.CurrentMember != null) { if (state.CurrentMember != null) {
var node = Unit.GetNodeAt (location); var node = Unit.GetNodeAt (location);
if (node == null) if (node == null)
return state; return state;
var navigator = new NodeListResolveVisitorNavigator (new[] { node }); var navigator = new NodeListResolveVisitorNavigator (new[] { node });
var visitor = new ResolveVisitor (state, CSharpParsedFile, navigator); var visitor = new ResolveVisitor (state, CSharpUnresolvedFile, navigator);
Unit.AcceptVisitor (visitor, null); Unit.AcceptVisitor (visitor, null);
try { try {
var newState = visitor.GetResolverStateBefore (node); var newState = visitor.GetResolverStateBefore (node);

16
ICSharpCode.NRefactory.CSharp/Completion/ICompletionContextProvider.cs

@ -1,4 +1,4 @@
// //
// IMemberProvider.cs // IMemberProvider.cs
// //
// Author: // Author:
@ -45,16 +45,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
public class DefaultCompletionContextProvider : ICompletionContextProvider public class DefaultCompletionContextProvider : ICompletionContextProvider
{ {
readonly IDocument document; readonly IDocument document;
readonly CSharpParsedFile parsedFile; readonly CSharpUnresolvedFile unresolvedFile;
public DefaultCompletionContextProvider (IDocument document, CSharpParsedFile parsedFile) public DefaultCompletionContextProvider (IDocument document, CSharpUnresolvedFile unresolvedFile)
{ {
if (document == null) if (document == null)
throw new ArgumentNullException("document"); throw new ArgumentNullException("document");
if (parsedFile == null) if (unresolvedFile == null)
throw new ArgumentNullException("parsedFile"); throw new ArgumentNullException("unresolvedFile");
this.document = document; this.document = document;
this.parsedFile = parsedFile; this.unresolvedFile = unresolvedFile;
} }
public void GetCurrentMembers(int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember) public void GetCurrentMembers(int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember)
@ -64,7 +64,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
currentType = null; currentType = null;
foreach (var type in parsedFile.TopLevelTypeDefinitions) { foreach (var type in unresolvedFile.TopLevelTypeDefinitions) {
if (type.Region.Begin < location) if (type.Region.Begin < location)
currentType = type; currentType = type;
} }
@ -189,7 +189,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
public CSharpAstResolver GetResolver (CSharpResolver resolver, AstNode rootNode) public CSharpAstResolver GetResolver (CSharpResolver resolver, AstNode rootNode)
{ {
return new CSharpAstResolver (resolver, rootNode, parsedFile); return new CSharpAstResolver (resolver, rootNode, unresolvedFile);
} }

2
ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj

@ -300,7 +300,7 @@
<Compile Include="TypeSystem\CSharpAssembly.cs" /> <Compile Include="TypeSystem\CSharpAssembly.cs" />
<Compile Include="TypeSystem\CSharpAttribute.cs" /> <Compile Include="TypeSystem\CSharpAttribute.cs" />
<Compile Include="TypeSystem\CSharpDocumentationComment.cs" /> <Compile Include="TypeSystem\CSharpDocumentationComment.cs" />
<Compile Include="TypeSystem\CSharpParsedFile.cs" /> <Compile Include="TypeSystem\CSharpUnresolvedFile.cs" />
<Compile Include="TypeSystem\CSharpUnresolvedTypeDefinition.cs" /> <Compile Include="TypeSystem\CSharpUnresolvedTypeDefinition.cs" />
<Compile Include="TypeSystem\CSharpTypeResolveContext.cs" /> <Compile Include="TypeSystem\CSharpTypeResolveContext.cs" />
<Compile Include="TypeSystem\ResolvedUsingScope.cs" /> <Compile Include="TypeSystem\ResolvedUsingScope.cs" />

6
ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs

@ -64,19 +64,19 @@ namespace ICSharpCode.NRefactory.CSharp
/// </summary> /// </summary>
/// <param name="syntaxTree">The input syntax tree.</param> /// <param name="syntaxTree">The input syntax tree.</param>
/// <param name="compilation">The current compilation.</param> /// <param name="compilation">The current compilation.</param>
/// <param name="parsedFile">CSharpParsedFile, used for resolving.</param> /// <param name="unresolvedFile">CSharpUnresolvedFile, used for resolving.</param>
/// <returns>Converted CodeCompileUnit</returns> /// <returns>Converted CodeCompileUnit</returns>
/// <remarks> /// <remarks>
/// This conversion process requires a resolver because it needs to distinguish field/property/event references etc. /// This conversion process requires a resolver because it needs to distinguish field/property/event references etc.
/// </remarks> /// </remarks>
public CodeCompileUnit Convert(ICompilation compilation, SyntaxTree syntaxTree, CSharpParsedFile parsedFile) public CodeCompileUnit Convert(ICompilation compilation, SyntaxTree syntaxTree, CSharpUnresolvedFile unresolvedFile)
{ {
if (syntaxTree == null) if (syntaxTree == null)
throw new ArgumentNullException("syntaxTree"); throw new ArgumentNullException("syntaxTree");
if (compilation == null) if (compilation == null)
throw new ArgumentNullException("compilation"); throw new ArgumentNullException("compilation");
CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, parsedFile); CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, unresolvedFile);
return (CodeCompileUnit)Convert(syntaxTree, resolver); return (CodeCompileUnit)Convert(syntaxTree, resolver);
} }

4
ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs

@ -72,9 +72,9 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
} }
} }
public virtual CSharpParsedFile ParsedFile { public virtual CSharpUnresolvedFile UnresolvedFile {
get { get {
return resolver.ParsedFile; return resolver.UnresolvedFile;
} }
} }

2
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/InlineLocalVariableAction.cs

@ -58,7 +58,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
yield break; yield break;
} }
yield return new CodeAction(context.TranslateString("Inline local variable"), script => { yield return new CodeAction(context.TranslateString("Inline local variable"), script => {
refFinder.FindLocalReferences(resolveResult.Variable, context.ParsedFile, unit, context.Compilation, (n, r) => script.Replace(n, initializer.Initializer.Clone()), default(CancellationToken)); refFinder.FindLocalReferences(resolveResult.Variable, context.UnresolvedFile, unit, context.Compilation, (n, r) => script.Replace(n, initializer.Initializer.Clone()), default(CancellationToken));
script.Remove(node); script.Remove(node);
}); });
} }

30
ICSharpCode.NRefactory.CSharp/Resolver/CSharpAstResolver.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{ {
readonly CSharpResolver initialResolverState; readonly CSharpResolver initialResolverState;
readonly AstNode rootNode; readonly AstNode rootNode;
readonly CSharpParsedFile parsedFile; readonly CSharpUnresolvedFile unresolvedFile;
readonly ResolveVisitor resolveVisitor; readonly ResolveVisitor resolveVisitor;
bool resolverInitialized; bool resolverInitialized;
@ -43,19 +43,19 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// </summary> /// </summary>
/// <param name="compilation">The current compilation.</param> /// <param name="compilation">The current compilation.</param>
/// <param name="syntaxTree">The syntax tree corresponding to the specified parsed file.</param> /// <param name="syntaxTree">The syntax tree corresponding to the specified parsed file.</param>
/// <param name="parsedFile"> /// <param name="unresolvedFile">
/// Optional: Result of the <see cref="TypeSystemConvertVisitor"/> for the file being resolved. /// Optional: Result of the <see cref="TypeSystemConvertVisitor"/> for the file being resolved.
/// <para> /// <para>
/// This is used for setting up the context on the resolver. The parsed file must be registered in the compilation. /// This is used for setting up the context on the resolver. The parsed file must be registered in the compilation.
/// </para> /// </para>
/// <para> /// <para>
/// When a parsedFile is specified, the resolver will use the member's StartLocation/EndLocation to identify /// When a unresolvedFile is specified, the resolver will use the member's StartLocation/EndLocation to identify
/// member declarations in the AST with members in the type system. /// member declarations in the AST with members in the type system.
/// When no parsedFile is specified (<c>null</c> value for this parameter), the resolver will instead compare the /// When no unresolvedFile is specified (<c>null</c> value for this parameter), the resolver will instead compare the
/// member's signature in the AST with the signature in the type system. /// member's signature in the AST with the signature in the type system.
/// </para> /// </para>
/// </param> /// </param>
public CSharpAstResolver(ICompilation compilation, SyntaxTree syntaxTree, CSharpParsedFile parsedFile = null) public CSharpAstResolver(ICompilation compilation, SyntaxTree syntaxTree, CSharpUnresolvedFile unresolvedFile = null)
{ {
if (compilation == null) if (compilation == null)
throw new ArgumentNullException("compilation"); throw new ArgumentNullException("compilation");
@ -63,8 +63,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
throw new ArgumentNullException("syntaxTree"); throw new ArgumentNullException("syntaxTree");
this.initialResolverState = new CSharpResolver(compilation); this.initialResolverState = new CSharpResolver(compilation);
this.rootNode = syntaxTree; this.rootNode = syntaxTree;
this.parsedFile = parsedFile; this.unresolvedFile = unresolvedFile;
this.resolveVisitor = new ResolveVisitor(initialResolverState, parsedFile); this.resolveVisitor = new ResolveVisitor(initialResolverState, unresolvedFile);
} }
/// <summary> /// <summary>
@ -73,19 +73,19 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// </summary> /// </summary>
/// <param name="resolver">The resolver state at the root node (to be more precise: just outside the root node).</param> /// <param name="resolver">The resolver state at the root node (to be more precise: just outside the root node).</param>
/// <param name="rootNode">The root node of the resolved tree.</param> /// <param name="rootNode">The root node of the resolved tree.</param>
/// <param name="parsedFile"> /// <param name="unresolvedFile">
/// Optional: Result of the <see cref="TypeSystemConvertVisitor"/> for the file being resolved. /// Optional: Result of the <see cref="TypeSystemConvertVisitor"/> for the file being resolved.
/// <para> /// <para>
/// This is used for setting up the context on the resolver. The parsed file must be registered in the compilation. /// This is used for setting up the context on the resolver. The parsed file must be registered in the compilation.
/// </para> /// </para>
/// <para> /// <para>
/// When a parsedFile is specified, the resolver will use the member's StartLocation/EndLocation to identify /// When a unresolvedFile is specified, the resolver will use the member's StartLocation/EndLocation to identify
/// member declarations in the AST with members in the type system. /// member declarations in the AST with members in the type system.
/// When no parsedFile is specified (<c>null</c> value for this parameter), the resolver will instead compare the /// When no unresolvedFile is specified (<c>null</c> value for this parameter), the resolver will instead compare the
/// member's signature in the AST with the signature in the type system. /// member's signature in the AST with the signature in the type system.
/// </para> /// </para>
/// </param> /// </param>
public CSharpAstResolver(CSharpResolver resolver, AstNode rootNode, CSharpParsedFile parsedFile = null) public CSharpAstResolver(CSharpResolver resolver, AstNode rootNode, CSharpUnresolvedFile unresolvedFile = null)
{ {
if (resolver == null) if (resolver == null)
throw new ArgumentNullException("resolver"); throw new ArgumentNullException("resolver");
@ -93,8 +93,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
throw new ArgumentNullException("rootNode"); throw new ArgumentNullException("rootNode");
this.initialResolverState = resolver; this.initialResolverState = resolver;
this.rootNode = rootNode; this.rootNode = rootNode;
this.parsedFile = parsedFile; this.unresolvedFile = unresolvedFile;
this.resolveVisitor = new ResolveVisitor(initialResolverState, parsedFile); this.resolveVisitor = new ResolveVisitor(initialResolverState, unresolvedFile);
} }
/// <summary> /// <summary>
@ -122,8 +122,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// Gets the parsed file used by this CSharpAstResolver. /// Gets the parsed file used by this CSharpAstResolver.
/// Can return null. /// Can return null.
/// </summary> /// </summary>
public CSharpParsedFile ParsedFile { public CSharpUnresolvedFile UnresolvedFile {
get { return parsedFile; } get { return unresolvedFile; }
} }
/// <summary> /// <summary>

54
ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs

@ -290,7 +290,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// <summary> /// <summary>
/// Gets the file names that possibly contain references to the element being searched for. /// Gets the file names that possibly contain references to the element being searched for.
/// </summary> /// </summary>
public IEnumerable<CSharpParsedFile> GetInterestingFiles(IFindReferenceSearchScope searchScope, ICompilation compilation) public IEnumerable<CSharpUnresolvedFile> GetInterestingFiles(IFindReferenceSearchScope searchScope, ICompilation compilation)
{ {
if (searchScope == null) if (searchScope == null)
throw new ArgumentNullException("searchScope"); throw new ArgumentNullException("searchScope");
@ -303,47 +303,47 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
ITypeDefinition topLevelTypeDef = compilation.Import(searchScope.TopLevelTypeDefinition); ITypeDefinition topLevelTypeDef = compilation.Import(searchScope.TopLevelTypeDefinition);
if (topLevelTypeDef == null) { if (topLevelTypeDef == null) {
// This compilation cannot have references to the target entity. // This compilation cannot have references to the target entity.
return EmptyList<CSharpParsedFile>.Instance; return EmptyList<CSharpUnresolvedFile>.Instance;
} }
switch (searchScope.Accessibility) { switch (searchScope.Accessibility) {
case Accessibility.None: case Accessibility.None:
case Accessibility.Private: case Accessibility.Private:
if (topLevelTypeDef.ParentAssembly == compilation.MainAssembly) if (topLevelTypeDef.ParentAssembly == compilation.MainAssembly)
return topLevelTypeDef.Parts.Select(p => p.ParsedFile).OfType<CSharpParsedFile>().Distinct(); return topLevelTypeDef.Parts.Select(p => p.UnresolvedFile).OfType<CSharpUnresolvedFile>().Distinct();
else else
return EmptyList<CSharpParsedFile>.Instance; return EmptyList<CSharpUnresolvedFile>.Instance;
case Accessibility.Protected: case Accessibility.Protected:
return GetInterestingFilesProtected(topLevelTypeDef); return GetInterestingFilesProtected(topLevelTypeDef);
case Accessibility.Internal: case Accessibility.Internal:
if (topLevelTypeDef.ParentAssembly.InternalsVisibleTo(compilation.MainAssembly)) if (topLevelTypeDef.ParentAssembly.InternalsVisibleTo(compilation.MainAssembly))
return pc.Files.OfType<CSharpParsedFile>(); return pc.Files.OfType<CSharpUnresolvedFile>();
else else
return EmptyList<CSharpParsedFile>.Instance; return EmptyList<CSharpUnresolvedFile>.Instance;
case Accessibility.ProtectedAndInternal: case Accessibility.ProtectedAndInternal:
if (topLevelTypeDef.ParentAssembly.InternalsVisibleTo(compilation.MainAssembly)) if (topLevelTypeDef.ParentAssembly.InternalsVisibleTo(compilation.MainAssembly))
return GetInterestingFilesProtected(topLevelTypeDef); return GetInterestingFilesProtected(topLevelTypeDef);
else else
return EmptyList<CSharpParsedFile>.Instance; return EmptyList<CSharpUnresolvedFile>.Instance;
case Accessibility.ProtectedOrInternal: case Accessibility.ProtectedOrInternal:
if (topLevelTypeDef.ParentAssembly.InternalsVisibleTo(compilation.MainAssembly)) if (topLevelTypeDef.ParentAssembly.InternalsVisibleTo(compilation.MainAssembly))
return pc.Files.OfType<CSharpParsedFile>(); return pc.Files.OfType<CSharpUnresolvedFile>();
else else
return GetInterestingFilesProtected(topLevelTypeDef); return GetInterestingFilesProtected(topLevelTypeDef);
default: default:
return pc.Files.OfType<CSharpParsedFile>(); return pc.Files.OfType<CSharpUnresolvedFile>();
} }
} else { } else {
return pc.Files.OfType<CSharpParsedFile>(); return pc.Files.OfType<CSharpUnresolvedFile>();
} }
} }
IEnumerable<CSharpParsedFile> GetInterestingFilesProtected(ITypeDefinition referencedTypeDefinition) IEnumerable<CSharpUnresolvedFile> GetInterestingFilesProtected(ITypeDefinition referencedTypeDefinition)
{ {
return (from typeDef in referencedTypeDefinition.Compilation.MainAssembly.GetAllTypeDefinitions() return (from typeDef in referencedTypeDefinition.Compilation.MainAssembly.GetAllTypeDefinitions()
where typeDef.IsDerivedFrom(referencedTypeDefinition) where typeDef.IsDerivedFrom(referencedTypeDefinition)
from part in typeDef.Parts from part in typeDef.Parts
select part.ParsedFile select part.UnresolvedFile
).OfType<CSharpParsedFile>().Distinct(); ).OfType<CSharpUnresolvedFile>().Distinct();
} }
#endregion #endregion
@ -352,35 +352,35 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// Finds all references in the given file. /// Finds all references in the given file.
/// </summary> /// </summary>
/// <param name="searchScope">The search scope for which to look.</param> /// <param name="searchScope">The search scope for which to look.</param>
/// <param name="parsedFile">The type system representation of the file being searched.</param> /// <param name="unresolvedFile">The type system representation of the file being searched.</param>
/// <param name="syntaxTree">The syntax tree of the file being searched.</param> /// <param name="syntaxTree">The syntax tree of the file being searched.</param>
/// <param name="compilation">The compilation for the project that contains the file.</param> /// <param name="compilation">The compilation for the project that contains the file.</param>
/// <param name="callback">Callback used to report the references that were found.</param> /// <param name="callback">Callback used to report the references that were found.</param>
/// <param name="cancellationToken">CancellationToken that may be used to cancel the operation.</param> /// <param name="cancellationToken">CancellationToken that may be used to cancel the operation.</param>
public void FindReferencesInFile(IFindReferenceSearchScope searchScope, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, public void FindReferencesInFile(IFindReferenceSearchScope searchScope, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree,
ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken) ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken)
{ {
if (searchScope == null) if (searchScope == null)
throw new ArgumentNullException("searchScope"); throw new ArgumentNullException("searchScope");
FindReferencesInFile(new[] { searchScope }, parsedFile, syntaxTree, compilation, callback, cancellationToken); FindReferencesInFile(new[] { searchScope }, unresolvedFile, syntaxTree, compilation, callback, cancellationToken);
} }
/// <summary> /// <summary>
/// Finds all references in the given file. /// Finds all references in the given file.
/// </summary> /// </summary>
/// <param name="searchScopes">The search scopes for which to look.</param> /// <param name="searchScopes">The search scopes for which to look.</param>
/// <param name="parsedFile">The type system representation of the file being searched.</param> /// <param name="unresolvedFile">The type system representation of the file being searched.</param>
/// <param name="syntaxTree">The syntax tree of the file being searched.</param> /// <param name="syntaxTree">The syntax tree of the file being searched.</param>
/// <param name="compilation">The compilation for the project that contains the file.</param> /// <param name="compilation">The compilation for the project that contains the file.</param>
/// <param name="callback">Callback used to report the references that were found.</param> /// <param name="callback">Callback used to report the references that were found.</param>
/// <param name="cancellationToken">CancellationToken that may be used to cancel the operation.</param> /// <param name="cancellationToken">CancellationToken that may be used to cancel the operation.</param>
public void FindReferencesInFile(IList<IFindReferenceSearchScope> searchScopes, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, public void FindReferencesInFile(IList<IFindReferenceSearchScope> searchScopes, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree,
ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken) ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken)
{ {
if (searchScopes == null) if (searchScopes == null)
throw new ArgumentNullException("searchScopes"); throw new ArgumentNullException("searchScopes");
if (parsedFile == null) if (unresolvedFile == null)
throw new ArgumentNullException("parsedFile"); throw new ArgumentNullException("unresolvedFile");
if (syntaxTree == null) if (syntaxTree == null)
throw new ArgumentNullException("syntaxTree"); throw new ArgumentNullException("syntaxTree");
if (compilation == null) if (compilation == null)
@ -404,7 +404,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
combinedNavigator = new DetectSkippableNodesNavigator(combinedNavigator, syntaxTree); combinedNavigator = new DetectSkippableNodesNavigator(combinedNavigator, syntaxTree);
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, parsedFile); CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, unresolvedFile);
resolver.ApplyNavigator(combinedNavigator, cancellationToken); resolver.ApplyNavigator(combinedNavigator, cancellationToken);
foreach (var n in navigators) { foreach (var n in navigators) {
var frn = n as FindReferenceNavigator; var frn = n as FindReferenceNavigator;
@ -1171,19 +1171,19 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// Finds all references of a given variable. /// Finds all references of a given variable.
/// </summary> /// </summary>
/// <param name="variable">The variable for which to look.</param> /// <param name="variable">The variable for which to look.</param>
/// <param name="parsedFile">The type system representation of the file being searched.</param> /// <param name="unresolvedFile">The type system representation of the file being searched.</param>
/// <param name="syntaxTree">The syntax tree of the file being searched.</param> /// <param name="syntaxTree">The syntax tree of the file being searched.</param>
/// <param name="compilation">The compilation.</param> /// <param name="compilation">The compilation.</param>
/// <param name="callback">Callback used to report the references that were found.</param> /// <param name="callback">Callback used to report the references that were found.</param>
/// <param name="cancellationToken">Cancellation token that may be used to cancel the operation.</param> /// <param name="cancellationToken">Cancellation token that may be used to cancel the operation.</param>
public void FindLocalReferences(IVariable variable, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, public void FindLocalReferences(IVariable variable, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree,
ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken) ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken)
{ {
if (variable == null) if (variable == null)
throw new ArgumentNullException("variable"); throw new ArgumentNullException("variable");
var searchScope = new SearchScope(c => new FindLocalReferencesNavigator(variable)); var searchScope = new SearchScope(c => new FindLocalReferencesNavigator(variable));
searchScope.declarationCompilation = compilation; searchScope.declarationCompilation = compilation;
FindReferencesInFile(searchScope, parsedFile, syntaxTree, compilation, callback, cancellationToken); FindReferencesInFile(searchScope, unresolvedFile, syntaxTree, compilation, callback, cancellationToken);
} }
class FindLocalReferencesNavigator : FindReferenceNavigator class FindLocalReferencesNavigator : FindReferenceNavigator
@ -1225,12 +1225,12 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// Finds all references of a given type parameter. /// Finds all references of a given type parameter.
/// </summary> /// </summary>
/// <param name="typeParameter">The type parameter for which to look.</param> /// <param name="typeParameter">The type parameter for which to look.</param>
/// <param name="parsedFile">The type system representation of the file being searched.</param> /// <param name="unresolvedFile">The type system representation of the file being searched.</param>
/// <param name="syntaxTree">The syntax tree of the file being searched.</param> /// <param name="syntaxTree">The syntax tree of the file being searched.</param>
/// <param name="compilation">The compilation.</param> /// <param name="compilation">The compilation.</param>
/// <param name="callback">Callback used to report the references that were found.</param> /// <param name="callback">Callback used to report the references that were found.</param>
/// <param name="cancellationToken">Cancellation token that may be used to cancel the operation.</param> /// <param name="cancellationToken">Cancellation token that may be used to cancel the operation.</param>
public void FindTypeParameterReferences(IType typeParameter, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, public void FindTypeParameterReferences(IType typeParameter, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree,
ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken) ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken)
{ {
if (typeParameter == null) if (typeParameter == null)
@ -1240,7 +1240,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
var searchScope = new SearchScope(c => new FindTypeParameterReferencesNavigator((ITypeParameter)typeParameter)); var searchScope = new SearchScope(c => new FindTypeParameterReferencesNavigator((ITypeParameter)typeParameter));
searchScope.declarationCompilation = compilation; searchScope.declarationCompilation = compilation;
searchScope.accessibility = Accessibility.Private; searchScope.accessibility = Accessibility.Private;
FindReferencesInFile(searchScope, parsedFile, syntaxTree, compilation, callback, cancellationToken); FindReferencesInFile(searchScope, unresolvedFile, syntaxTree, compilation, callback, cancellationToken);
} }
class FindTypeParameterReferencesNavigator : FindReferenceNavigator class FindTypeParameterReferencesNavigator : FindReferenceNavigator

16
ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs

@ -30,24 +30,24 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// </summary> /// </summary>
public static class ResolveAtLocation public static class ResolveAtLocation
{ {
public static ResolveResult Resolve (ICompilation compilation, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, TextLocation location, public static ResolveResult Resolve (ICompilation compilation, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree, TextLocation location,
CancellationToken cancellationToken = default(CancellationToken)) CancellationToken cancellationToken = default(CancellationToken))
{ {
return Resolve (new Lazy<ICompilation>(() => compilation), parsedFile, syntaxTree, location, cancellationToken); return Resolve (new Lazy<ICompilation>(() => compilation), unresolvedFile, syntaxTree, location, cancellationToken);
} }
public static ResolveResult Resolve(Lazy<ICompilation> compilation, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, TextLocation location, public static ResolveResult Resolve(Lazy<ICompilation> compilation, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree, TextLocation location,
CancellationToken cancellationToken = default(CancellationToken)) CancellationToken cancellationToken = default(CancellationToken))
{ {
AstNode node; AstNode node;
return Resolve(compilation, parsedFile, syntaxTree, location, out node, cancellationToken); return Resolve(compilation, unresolvedFile, syntaxTree, location, out node, cancellationToken);
} }
public static ResolveResult Resolve (ICompilation compilation, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, TextLocation location, out AstNode node, public static ResolveResult Resolve (ICompilation compilation, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree, TextLocation location, out AstNode node,
CancellationToken cancellationToken = default(CancellationToken)) CancellationToken cancellationToken = default(CancellationToken))
{ {
return Resolve (new Lazy<ICompilation>(() => compilation), parsedFile, syntaxTree, location, out node, cancellationToken); return Resolve (new Lazy<ICompilation>(() => compilation), unresolvedFile, syntaxTree, location, out node, cancellationToken);
} }
public static ResolveResult Resolve(Lazy<ICompilation> compilation, CSharpParsedFile parsedFile, SyntaxTree syntaxTree, TextLocation location, out AstNode node, public static ResolveResult Resolve(Lazy<ICompilation> compilation, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree, TextLocation location, out AstNode node,
CancellationToken cancellationToken = default(CancellationToken)) CancellationToken cancellationToken = default(CancellationToken))
{ {
node = syntaxTree.GetNodeAt(location); node = syntaxTree.GetNodeAt(location);
@ -96,7 +96,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
} }
// TODO: I think we should provide an overload so that an existing CSharpAstResolver can be reused // TODO: I think we should provide an overload so that an existing CSharpAstResolver can be reused
CSharpAstResolver resolver = new CSharpAstResolver(compilation.Value, syntaxTree, parsedFile); CSharpAstResolver resolver = new CSharpAstResolver(compilation.Value, syntaxTree, unresolvedFile);
ResolveResult rr = resolver.Resolve(node, cancellationToken); ResolveResult rr = resolver.Resolve(node, cancellationToken);
if (rr is MethodGroupResolveResult && parentInvocation != null) if (rr is MethodGroupResolveResult && parentInvocation != null)
return resolver.Resolve(parentInvocation); return resolver.Resolve(parentInvocation);

40
ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs

@ -64,7 +64,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// <remarks>We do not have to put this into the stored state (resolver) because /// <remarks>We do not have to put this into the stored state (resolver) because
/// query expressions are always resolved in a single operation.</remarks> /// query expressions are always resolved in a single operation.</remarks>
ResolveResult currentQueryResult; ResolveResult currentQueryResult;
readonly CSharpParsedFile parsedFile; readonly CSharpUnresolvedFile unresolvedFile;
readonly Dictionary<AstNode, ResolveResult> resolveResultCache = new Dictionary<AstNode, ResolveResult>(); readonly Dictionary<AstNode, ResolveResult> resolveResultCache = new Dictionary<AstNode, ResolveResult>();
readonly Dictionary<AstNode, CSharpResolver> resolverBeforeDict = new Dictionary<AstNode, CSharpResolver>(); readonly Dictionary<AstNode, CSharpResolver> resolverBeforeDict = new Dictionary<AstNode, CSharpResolver>();
readonly Dictionary<AstNode, CSharpResolver> resolverAfterDict = new Dictionary<AstNode, CSharpResolver>(); readonly Dictionary<AstNode, CSharpResolver> resolverAfterDict = new Dictionary<AstNode, CSharpResolver>();
@ -93,12 +93,12 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// <summary> /// <summary>
/// Creates a new ResolveVisitor instance. /// Creates a new ResolveVisitor instance.
/// </summary> /// </summary>
public ResolveVisitor(CSharpResolver resolver, CSharpParsedFile parsedFile) public ResolveVisitor(CSharpResolver resolver, CSharpUnresolvedFile unresolvedFile)
{ {
if (resolver == null) if (resolver == null)
throw new ArgumentNullException("resolver"); throw new ArgumentNullException("resolver");
this.resolver = resolver; this.resolver = resolver;
this.parsedFile = parsedFile; this.unresolvedFile = unresolvedFile;
this.navigator = skipAllNavigator; this.navigator = skipAllNavigator;
} }
@ -534,12 +534,12 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{ {
CSharpResolver previousResolver = resolver; CSharpResolver previousResolver = resolver;
try { try {
if (parsedFile != null) { if (unresolvedFile != null) {
resolver = resolver.WithCurrentUsingScope(parsedFile.RootUsingScope.Resolve(resolver.Compilation)); resolver = resolver.WithCurrentUsingScope(unresolvedFile.RootUsingScope.Resolve(resolver.Compilation));
} else { } else {
var cv = new TypeSystemConvertVisitor(unit.FileName ?? string.Empty); var cv = new TypeSystemConvertVisitor(unit.FileName ?? string.Empty);
ApplyVisitorToUsings(cv, unit.Children); ApplyVisitorToUsings(cv, unit.Children);
PushUsingScope(cv.ParsedFile.RootUsingScope); PushUsingScope(cv.UnresolvedFile.RootUsingScope);
} }
ScanChildren(unit); ScanChildren(unit);
return voidResult; return voidResult;
@ -567,8 +567,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{ {
CSharpResolver previousResolver = resolver; CSharpResolver previousResolver = resolver;
try { try {
if (parsedFile != null) { if (unresolvedFile != null) {
resolver = resolver.WithCurrentUsingScope(parsedFile.GetUsingScope(namespaceDeclaration.StartLocation).Resolve(resolver.Compilation)); resolver = resolver.WithCurrentUsingScope(unresolvedFile.GetUsingScope(namespaceDeclaration.StartLocation).Resolve(resolver.Compilation));
} else { } else {
string fileName = namespaceDeclaration.GetRegion().FileName ?? string.Empty; string fileName = namespaceDeclaration.GetRegion().FileName ?? string.Empty;
// Fetch parent using scope // Fetch parent using scope
@ -589,7 +589,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
// Last using scope: // Last using scope:
usingScope = new UsingScope(resolver.CurrentUsingScope.UnresolvedUsingScope, identifiers.Last().Name); usingScope = new UsingScope(resolver.CurrentUsingScope.UnresolvedUsingScope, identifiers.Last().Name);
usingScope.Region = region; usingScope.Region = region;
var cv = new TypeSystemConvertVisitor(new CSharpParsedFile(region.FileName ?? string.Empty), usingScope); var cv = new TypeSystemConvertVisitor(new CSharpUnresolvedFile(region.FileName ?? string.Empty), usingScope);
ApplyVisitorToUsings(cv, namespaceDeclaration.Children); ApplyVisitorToUsings(cv, namespaceDeclaration.Children);
PushUsingScope(usingScope); PushUsingScope(usingScope);
} }
@ -673,7 +673,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
for (AstNode node = fieldOrEventDeclaration.FirstChild; node != null; node = node.NextSibling) { for (AstNode node = fieldOrEventDeclaration.FirstChild; node != null; node = node.NextSibling) {
if (node.Role == Roles.Variable) { if (node.Role == Roles.Variable) {
IMember member; IMember member;
if (parsedFile != null) { if (unresolvedFile != null) {
member = GetMemberFromLocation(node); member = GetMemberFromLocation(node);
} else { } else {
string name = ((VariableInitializer)node).Name; string name = ((VariableInitializer)node).Name;
@ -699,7 +699,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
TextLocation location = TypeSystemConvertVisitor.GetStartLocationAfterAttributes(node); TextLocation location = TypeSystemConvertVisitor.GetStartLocationAfterAttributes(node);
return typeDef.GetMembers( return typeDef.GetMembers(
delegate (IUnresolvedMember m) { delegate (IUnresolvedMember m) {
if (m.ParsedFile != parsedFile) if (m.UnresolvedFile != unresolvedFile)
return false; return false;
DomRegion region = m.Region; DomRegion region = m.Region;
return !region.IsEmpty && region.Begin <= location && region.End > location; return !region.IsEmpty && region.Begin <= location && region.End > location;
@ -792,7 +792,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
CSharpResolver oldResolver = resolver; CSharpResolver oldResolver = resolver;
try { try {
IMember member; IMember member;
if (parsedFile != null) { if (unresolvedFile != null) {
member = GetMemberFromLocation(memberDeclaration); member = GetMemberFromLocation(memberDeclaration);
} else { } else {
// Re-discover the method: // Re-discover the method:
@ -855,7 +855,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
CSharpResolver oldResolver = resolver; CSharpResolver oldResolver = resolver;
try { try {
IMember member; IMember member;
if (parsedFile != null) { if (unresolvedFile != null) {
member = GetMemberFromLocation(propertyOrIndexerDeclaration); member = GetMemberFromLocation(propertyOrIndexerDeclaration);
} else { } else {
// Re-discover the property: // Re-discover the property:
@ -911,7 +911,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
CSharpResolver oldResolver = resolver; CSharpResolver oldResolver = resolver;
try { try {
IMember member; IMember member;
if (parsedFile != null) { if (unresolvedFile != null) {
member = GetMemberFromLocation(eventDeclaration); member = GetMemberFromLocation(eventDeclaration);
} else { } else {
string name = eventDeclaration.Name; string name = eventDeclaration.Name;
@ -1034,7 +1034,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
Scan(attributeSection); Scan(attributeSection);
IMember member = null; IMember member = null;
if (parsedFile != null) { if (unresolvedFile != null) {
member = GetMemberFromLocation(enumMemberDeclaration); member = GetMemberFromLocation(enumMemberDeclaration);
} else if (resolver.CurrentTypeDefinition != null) { } else if (resolver.CurrentTypeDefinition != null) {
string name = enumMemberDeclaration.Name; string name = enumMemberDeclaration.Name;
@ -1958,8 +1958,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
DomRegion MakeRegion(AstNode node) DomRegion MakeRegion(AstNode node)
{ {
if (parsedFile != null) if (unresolvedFile != null)
return new DomRegion(parsedFile.FileName, node.StartLocation, node.EndLocation); return new DomRegion(unresolvedFile.FileName, node.StartLocation, node.EndLocation);
else else
return node.GetRegion(); return node.GetRegion();
} }
@ -2148,7 +2148,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
readonly QuerySelectClause selectClause; readonly QuerySelectClause selectClause;
readonly CSharpResolver storedContext; readonly CSharpResolver storedContext;
readonly CSharpParsedFile parsedFile; readonly CSharpUnresolvedFile unresolvedFile;
readonly List<LambdaTypeHypothesis> hypotheses = new List<LambdaTypeHypothesis>(); readonly List<LambdaTypeHypothesis> hypotheses = new List<LambdaTypeHypothesis>();
internal IList<IParameter> parameters = new List<IParameter>(); internal IList<IParameter> parameters = new List<IParameter>();
@ -2186,7 +2186,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{ {
this.parentVisitor = parentVisitor; this.parentVisitor = parentVisitor;
this.storedContext = parentVisitor.resolver; this.storedContext = parentVisitor.resolver;
this.parsedFile = parentVisitor.parsedFile; this.unresolvedFile = parentVisitor.unresolvedFile;
this.bodyResult = parentVisitor.voidResult; this.bodyResult = parentVisitor.voidResult;
} }
@ -2254,7 +2254,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (ok) if (ok)
return h; return h;
} }
ResolveVisitor visitor = new ResolveVisitor(storedContext, parsedFile); ResolveVisitor visitor = new ResolveVisitor(storedContext, unresolvedFile);
var newHypothesis = new LambdaTypeHypothesis(this, parameterTypes, visitor, lambda != null ? lambda.Parameters : null); var newHypothesis = new LambdaTypeHypothesis(this, parameterTypes, visitor, lambda != null ? lambda.Parameters : null);
hypotheses.Add(newHypothesis); hypotheses.Add(newHypothesis);
return newHypothesis; return newHypothesis;

6
ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs

@ -73,9 +73,9 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
return result; return result;
} else { } else {
result = new List<IAttribute>(); result = new List<IAttribute>();
foreach (var parsedFile in projectContent.Files.OfType<CSharpParsedFile>()) { foreach (var unresolvedFile in projectContent.Files.OfType<CSharpUnresolvedFile>()) {
var attributes = assemblyAttributes ? parsedFile.AssemblyAttributes : parsedFile.ModuleAttributes; var attributes = assemblyAttributes ? unresolvedFile.AssemblyAttributes : unresolvedFile.ModuleAttributes;
var context = new CSharpTypeResolveContext(this, parsedFile.RootUsingScope.Resolve(compilation)); var context = new CSharpTypeResolveContext(this, unresolvedFile.RootUsingScope.Resolve(compilation));
foreach (var unresolvedAttr in attributes) { foreach (var unresolvedAttr in attributes) {
result.Add(unresolvedAttr.CreateResolvedAttribute(context)); result.Add(unresolvedAttr.CreateResolvedAttribute(context));
} }

8
ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpParsedFile.cs → ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpUnresolvedFile.cs

@ -30,7 +30,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
/// Represents a file that was parsed and converted for the type system. /// Represents a file that was parsed and converted for the type system.
/// </summary> /// </summary>
[Serializable] [Serializable]
public sealed class CSharpParsedFile : AbstractFreezable, IParsedFile, IUnresolvedDocumentationProvider public sealed class CSharpUnresolvedFile : AbstractFreezable, IUnresolvedFile, IUnresolvedDocumentationProvider
{ {
readonly string fileName; readonly string fileName;
readonly UsingScope rootUsingScope; readonly UsingScope rootUsingScope;
@ -51,7 +51,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
usingScopes = FreezableHelper.FreezeListAndElements(usingScopes); usingScopes = FreezableHelper.FreezeListAndElements(usingScopes);
} }
public CSharpParsedFile(string fileName) public CSharpUnresolvedFile(string fileName)
{ {
if (fileName == null) if (fileName == null)
throw new ArgumentNullException("fileName"); throw new ArgumentNullException("fileName");
@ -59,7 +59,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
this.rootUsingScope = new UsingScope(); this.rootUsingScope = new UsingScope();
} }
public CSharpParsedFile(string fileName, UsingScope rootUsingScope) public CSharpUnresolvedFile(string fileName, UsingScope rootUsingScope)
{ {
if (fileName == null) if (fileName == null)
throw new ArgumentNullException("fileName"); throw new ArgumentNullException("fileName");
@ -178,7 +178,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
return rctx; return rctx;
} }
ITypeResolveContext IParsedFile.GetTypeResolveContext (ICompilation compilation, TextLocation loc) ITypeResolveContext IUnresolvedFile.GetTypeResolveContext (ICompilation compilation, TextLocation loc)
{ {
return GetTypeResolveContext (compilation, loc); return GetTypeResolveContext (compilation, loc);
} }

38
ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs

@ -34,7 +34,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
/// </summary> /// </summary>
public class TypeSystemConvertVisitor : DepthFirstAstVisitor<IUnresolvedEntity> public class TypeSystemConvertVisitor : DepthFirstAstVisitor<IUnresolvedEntity>
{ {
readonly CSharpParsedFile parsedFile; readonly CSharpUnresolvedFile unresolvedFile;
UsingScope usingScope; UsingScope usingScope;
CSharpUnresolvedTypeDefinition currentTypeDefinition; CSharpUnresolvedTypeDefinition currentTypeDefinition;
DefaultUnresolvedMethod currentMethod; DefaultUnresolvedMethod currentMethod;
@ -64,32 +64,32 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
{ {
if (fileName == null) if (fileName == null)
throw new ArgumentNullException("fileName"); throw new ArgumentNullException("fileName");
this.parsedFile = new CSharpParsedFile(fileName); this.unresolvedFile = new CSharpUnresolvedFile(fileName);
this.usingScope = parsedFile.RootUsingScope; this.usingScope = unresolvedFile.RootUsingScope;
} }
/// <summary> /// <summary>
/// Creates a new TypeSystemConvertVisitor and initializes it with a given context. /// Creates a new TypeSystemConvertVisitor and initializes it with a given context.
/// </summary> /// </summary>
/// <param name="parsedFile">The parsed file to which members should be added.</param> /// <param name="unresolvedFile">The parsed file to which members should be added.</param>
/// <param name="currentUsingScope">The current using scope.</param> /// <param name="currentUsingScope">The current using scope.</param>
/// <param name="currentTypeDefinition">The current type definition.</param> /// <param name="currentTypeDefinition">The current type definition.</param>
public TypeSystemConvertVisitor(CSharpParsedFile parsedFile, UsingScope currentUsingScope = null, CSharpUnresolvedTypeDefinition currentTypeDefinition = null) public TypeSystemConvertVisitor(CSharpUnresolvedFile unresolvedFile, UsingScope currentUsingScope = null, CSharpUnresolvedTypeDefinition currentTypeDefinition = null)
{ {
if (parsedFile == null) if (unresolvedFile == null)
throw new ArgumentNullException("parsedFile"); throw new ArgumentNullException("unresolvedFile");
this.parsedFile = parsedFile; this.unresolvedFile = unresolvedFile;
this.usingScope = currentUsingScope ?? parsedFile.RootUsingScope; this.usingScope = currentUsingScope ?? unresolvedFile.RootUsingScope;
this.currentTypeDefinition = currentTypeDefinition; this.currentTypeDefinition = currentTypeDefinition;
} }
public CSharpParsedFile ParsedFile { public CSharpUnresolvedFile UnresolvedFile {
get { return parsedFile; } get { return unresolvedFile; }
} }
DomRegion MakeRegion(TextLocation start, TextLocation end) DomRegion MakeRegion(TextLocation start, TextLocation end)
{ {
return new DomRegion(parsedFile.FileName, start.Line, start.Column, end.Line, end.Column); return new DomRegion(unresolvedFile.FileName, start.Line, start.Column, end.Line, end.Column);
} }
DomRegion MakeRegion(AstNode node) DomRegion MakeRegion(AstNode node)
@ -122,7 +122,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
#region Compilation Unit #region Compilation Unit
public override IUnresolvedEntity VisitSyntaxTree (SyntaxTree unit) public override IUnresolvedEntity VisitSyntaxTree (SyntaxTree unit)
{ {
parsedFile.Errors = unit.Errors; unresolvedFile.Errors = unit.Errors;
return base.VisitSyntaxTree (unit); return base.VisitSyntaxTree (unit);
} }
#endregion #endregion
@ -167,7 +167,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
usingScope.Region = region; usingScope.Region = region;
} }
base.VisitNamespaceDeclaration(namespaceDeclaration); base.VisitNamespaceDeclaration(namespaceDeclaration);
parsedFile.UsingScopes.Add(usingScope); // add after visiting children so that nested scopes come first unresolvedFile.UsingScopes.Add(usingScope); // add after visiting children so that nested scopes come first
usingScope = previousUsingScope; usingScope = previousUsingScope;
return null; return null;
} }
@ -184,9 +184,9 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
currentTypeDefinition.NestedTypes.Add(newType); currentTypeDefinition.NestedTypes.Add(newType);
} else { } else {
newType = new CSharpUnresolvedTypeDefinition(usingScope, name); newType = new CSharpUnresolvedTypeDefinition(usingScope, name);
parsedFile.TopLevelTypeDefinitions.Add(newType); unresolvedFile.TopLevelTypeDefinitions.Add(newType);
} }
newType.ParsedFile = parsedFile; newType.UnresolvedFile = unresolvedFile;
newType.HasExtensionMethods = false; // gets set to true when an extension method is added newType.HasExtensionMethods = false; // gets set to true when an extension method is added
return newType; return newType;
} }
@ -868,9 +868,9 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
{ {
// non-assembly attributes are handled by their parent entity // non-assembly attributes are handled by their parent entity
if (attributeSection.AttributeTarget == "assembly") { if (attributeSection.AttributeTarget == "assembly") {
ConvertAttributes(parsedFile.AssemblyAttributes, attributeSection); ConvertAttributes(unresolvedFile.AssemblyAttributes, attributeSection);
} else if (attributeSection.AttributeTarget == "module") { } else if (attributeSection.AttributeTarget == "module") {
ConvertAttributes(parsedFile.ModuleAttributes, attributeSection); ConvertAttributes(unresolvedFile.ModuleAttributes, attributeSection);
} }
return null; return null;
} }
@ -1197,7 +1197,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
} }
if (documentation != null) { if (documentation != null) {
documentation.Reverse(); // bring documentation in correct order documentation.Reverse(); // bring documentation in correct order
parsedFile.AddDocumentation(entity, string.Join(Environment.NewLine, documentation)); unresolvedFile.AddDocumentation(entity, string.Join(Environment.NewLine, documentation));
} }
} }

26
ICSharpCode.NRefactory.ConsistencyCheck/CSharpProject.cs

@ -91,13 +91,13 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
if (!hasSystemCore && FindAssembly(Program.AssemblySearchPaths, "System.Core") != null) if (!hasSystemCore && FindAssembly(Program.AssemblySearchPaths, "System.Core") != null)
references.Add(Program.LoadAssembly(FindAssembly(Program.AssemblySearchPaths, "System.Core"))); references.Add(Program.LoadAssembly(FindAssembly(Program.AssemblySearchPaths, "System.Core")));
foreach (var item in p.GetItems("ProjectReference")) { foreach (var item in p.GetItems("ProjectReference")) {
references.Add(new ProjectReference(solution, item.GetMetadataValue("Name"))); references.Add(new ProjectReference(item.EvaluatedInclude));
} }
this.ProjectContent = new CSharpProjectContent() this.ProjectContent = new CSharpProjectContent()
.SetAssemblyName(this.AssemblyName) .SetAssemblyName(this.AssemblyName)
.SetCompilerSettings(this.CompilerSettings) .SetCompilerSettings(this.CompilerSettings)
.AddAssemblyReferences(references) .AddAssemblyReferences(references)
.UpdateProjectContent(null, Files.Select(f => f.ParsedFile)); .AddOrUpdateFiles(Files.Select(f => f.UnresolvedFile));
} }
string FindAssembly(IEnumerable<string> assemblySearchPaths, string evaluatedInclude) string FindAssembly(IEnumerable<string> assemblySearchPaths, string evaluatedInclude)
@ -133,24 +133,6 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
} }
} }
public class ProjectReference : IAssemblyReference
{
readonly Solution solution;
readonly string projectTitle;
public ProjectReference(Solution solution, string projectTitle)
{
this.solution = solution;
this.projectTitle = projectTitle;
}
public IAssembly Resolve(ITypeResolveContext context)
{
var project = solution.Projects.Single(p => string.Equals(p.Title, projectTitle, StringComparison.OrdinalIgnoreCase));
return project.ProjectContent.Resolve(context);
}
}
public class CSharpFile public class CSharpFile
{ {
public readonly CSharpProject Project; public readonly CSharpProject Project;
@ -159,7 +141,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
public readonly ITextSource Content; public readonly ITextSource Content;
public readonly int LinesOfCode; public readonly int LinesOfCode;
public SyntaxTree SyntaxTree; public SyntaxTree SyntaxTree;
public CSharpParsedFile ParsedFile; public CSharpUnresolvedFile UnresolvedFile;
public CSharpFile(CSharpProject project, string fileName) public CSharpFile(CSharpProject project, string fileName)
{ {
@ -176,7 +158,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
Console.WriteLine(" " + error.Region + " " + error.Message); Console.WriteLine(" " + error.Region + " " + error.Message);
} }
} }
this.ParsedFile = this.SyntaxTree.ToTypeSystem(); this.UnresolvedFile = this.SyntaxTree.ToTypeSystem();
} }
} }
} }

10
ICSharpCode.NRefactory.ConsistencyCheck/FindReferencesConsistencyCheck.cs

@ -59,7 +59,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
} }
} }
); );
var resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.ParsedFile); var resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.UnresolvedFile);
resolver.ApplyNavigator(navigator); resolver.ApplyNavigator(navigator);
} }
} }
@ -102,9 +102,9 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
HashSet<AstNode> foundReferences = new HashSet<AstNode>(); HashSet<AstNode> foundReferences = new HashSet<AstNode>();
var interestingFiles = new HashSet<CSharpFile>(); var interestingFiles = new HashSet<CSharpFile>();
foreach (var searchScope in searchScopes) { foreach (var searchScope in searchScopes) {
foreach (var parsedFile in fr.GetInterestingFiles(searchScope, project.Compilation)) { foreach (var unresolvedFile in fr.GetInterestingFiles(searchScope, project.Compilation)) {
var file = project.GetFile(parsedFile.FileName); var file = project.GetFile(unresolvedFile.FileName);
Debug.Assert(file.ParsedFile == parsedFile); Debug.Assert(file.UnresolvedFile == unresolvedFile);
// Skip file if it doesn't contain the search term // Skip file if it doesn't contain the search term
if (searchScope.SearchTerm != null && file.Content.IndexOf(searchScope.SearchTerm, 0, file.Content.TextLength, StringComparison.Ordinal) < 0) if (searchScope.SearchTerm != null && file.Content.IndexOf(searchScope.SearchTerm, 0, file.Content.TextLength, StringComparison.Ordinal) < 0)
@ -114,7 +114,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
} }
} }
foreach (var file in interestingFiles) { foreach (var file in interestingFiles) {
fr.FindReferencesInFile(searchScopes, file.ParsedFile, file.SyntaxTree, project.Compilation, fr.FindReferencesInFile(searchScopes, file.UnresolvedFile, file.SyntaxTree, project.Compilation,
delegate(AstNode node, ResolveResult result) { delegate(AstNode node, ResolveResult result) {
foundReferences.Add(node); foundReferences.Add(node);
}, CancellationToken.None); }, CancellationToken.None);

2
ICSharpCode.NRefactory.ConsistencyCheck/Program.cs

@ -63,7 +63,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
using (new Timer("Resolve unresolved members... ")) TypeSystemTests.ResolvedUnresolvedMembers(solution); using (new Timer("Resolve unresolved members... ")) TypeSystemTests.ResolvedUnresolvedMembers(solution);
//RunTestOnAllFiles("Roundtripping test", RoundtripTest.RunTest); //RunTestOnAllFiles("Roundtripping test", RoundtripTest.RunTest);
RunTestOnAllFiles("Resolver test", ResolverTest.RunTest); RunTestOnAllFiles("Resolver test", ResolverTest.RunTest);
RunTestOnAllFiles("Resolver test (no parsed file)", ResolverTest.RunTestWithoutParsedFile); RunTestOnAllFiles("Resolver test (no parsed file)", ResolverTest.RunTestWithoutUnresolvedFile);
RunTestOnAllFiles("Resolver test (randomized order)", RandomizedOrderResolverTest.RunTest); RunTestOnAllFiles("Resolver test (randomized order)", RandomizedOrderResolverTest.RunTest);
new FindReferencesConsistencyCheck(solution).Run(); new FindReferencesConsistencyCheck(solution).Run();

4
ICSharpCode.NRefactory.ConsistencyCheck/RandomizedOrderResolverTest.cs

@ -45,9 +45,9 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
Random rnd = new Random(seed); Random rnd = new Random(seed);
var test = new RandomizedOrderResolverTest(); var test = new RandomizedOrderResolverTest();
// Resolve all nodes, but in a random order without using a navigator. // Resolve all nodes, but in a random order without using a navigator.
test.resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.ParsedFile); test.resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.UnresolvedFile);
// For comparing whether the results are equivalent, we also use a normal 'resolve all' resolver: // For comparing whether the results are equivalent, we also use a normal 'resolve all' resolver:
test.resolveAllResolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.ParsedFile); test.resolveAllResolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.UnresolvedFile);
test.resolveAllResolver.ApplyNavigator(new ResolveAllNavigator(), CancellationToken.None); test.resolveAllResolver.ApplyNavigator(new ResolveAllNavigator(), CancellationToken.None);
// Prepare list of actions that we need to verify: // Prepare list of actions that we need to verify:
var actions = new List<Func<bool>>(); var actions = new List<Func<bool>>();

8
ICSharpCode.NRefactory.ConsistencyCheck/ResolverTest.cs

@ -35,7 +35,7 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
{ {
public static void RunTest(CSharpFile file) public static void RunTest(CSharpFile file)
{ {
CSharpAstResolver resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.ParsedFile); CSharpAstResolver resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.UnresolvedFile);
var navigator = new ValidatingResolveAllNavigator(file.FileName); var navigator = new ValidatingResolveAllNavigator(file.FileName);
resolver.ApplyNavigator(navigator, CancellationToken.None); resolver.ApplyNavigator(navigator, CancellationToken.None);
navigator.Validate(resolver, file.SyntaxTree); navigator.Validate(resolver, file.SyntaxTree);
@ -102,19 +102,19 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
} }
} }
public static void RunTestWithoutParsedFile(CSharpFile file) public static void RunTestWithoutUnresolvedFile(CSharpFile file)
{ {
CSharpAstResolver resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree); CSharpAstResolver resolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree);
var navigator = new ValidatingResolveAllNavigator(file.FileName); var navigator = new ValidatingResolveAllNavigator(file.FileName);
resolver.ApplyNavigator(navigator, CancellationToken.None); resolver.ApplyNavigator(navigator, CancellationToken.None);
navigator.Validate(resolver, file.SyntaxTree); navigator.Validate(resolver, file.SyntaxTree);
CSharpAstResolver originalResolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.ParsedFile); CSharpAstResolver originalResolver = new CSharpAstResolver(file.Project.Compilation, file.SyntaxTree, file.UnresolvedFile);
foreach (var node in file.SyntaxTree.DescendantsAndSelf) { foreach (var node in file.SyntaxTree.DescendantsAndSelf) {
var originalResult = originalResolver.Resolve(node); var originalResult = originalResolver.Resolve(node);
var result = resolver.Resolve(node); var result = resolver.Resolve(node);
if (!RandomizedOrderResolverTest.IsEqualResolveResult(result, originalResult)) { if (!RandomizedOrderResolverTest.IsEqualResolveResult(result, originalResult)) {
Console.WriteLine("Got different without IParsedFile at " + file.FileName + ":" + node.StartLocation); Console.WriteLine("Got different without IUnresolvedFile at " + file.FileName + ":" + node.StartLocation);
} }
} }
} }

5
ICSharpCode.NRefactory.ConsistencyCheck/VisitorBenchmark.cs

@ -50,11 +50,6 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
visitor.EnterIdentifierExpression += list.Add; visitor.EnterIdentifierExpression += list.Add;
syntaxTree.AcceptVisitor(visitor); syntaxTree.AcceptVisitor(visitor);
}); });
RunTest("ObservableAstVisitor<object, object>", files, (syntaxTree, list) => {
var visitor = new ObservableAstVisitor<object, object>();
visitor.IdentifierExpressionVisited += (id, data) => list.Add(id);
syntaxTree.AcceptVisitor(visitor, null);
});
} }
static void WalkTreeForEach(AstNode node, List<IdentifierExpression> list) static void WalkTreeForEach(AstNode node, List<IdentifierExpression> list)

16
ICSharpCode.NRefactory.Demo/CSDemo.cs

@ -204,8 +204,8 @@ namespace ICSharpCode.NRefactory.Demo
void ResolveButtonClick(object sender, EventArgs e) void ResolveButtonClick(object sender, EventArgs e)
{ {
IProjectContent project = new CSharpProjectContent(); IProjectContent project = new CSharpProjectContent();
var parsedFile = syntaxTree.ToTypeSystem(); var unresolvedFile = syntaxTree.ToTypeSystem();
project = project.UpdateProjectContent(null, parsedFile); project = project.AddOrUpdateFiles(unresolvedFile);
project = project.AddAssemblyReferences(builtInLibs.Value); project = project.AddAssemblyReferences(builtInLibs.Value);
ICompilation compilation = project.CreateCompilation(); ICompilation compilation = project.CreateCompilation();
@ -213,12 +213,12 @@ namespace ICSharpCode.NRefactory.Demo
ResolveResult result; ResolveResult result;
if (csharpTreeView.SelectedNode != null) { if (csharpTreeView.SelectedNode != null) {
var selectedNode = (AstNode)csharpTreeView.SelectedNode.Tag; var selectedNode = (AstNode)csharpTreeView.SelectedNode.Tag;
CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, parsedFile); CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, unresolvedFile);
result = resolver.Resolve(selectedNode); result = resolver.Resolve(selectedNode);
// CSharpAstResolver.Resolve() never returns null // CSharpAstResolver.Resolve() never returns null
} else { } else {
TextLocation location = GetTextLocation(csharpCodeTextBox, csharpCodeTextBox.SelectionStart); TextLocation location = GetTextLocation(csharpCodeTextBox, csharpCodeTextBox.SelectionStart);
result = ResolveAtLocation.Resolve(compilation, parsedFile, syntaxTree, location); result = ResolveAtLocation.Resolve(compilation, unresolvedFile, syntaxTree, location);
if (result == null) { if (result == null) {
MessageBox.Show("Could not find a resolvable node at the caret location."); MessageBox.Show("Could not find a resolvable node at the caret location.");
return; return;
@ -248,12 +248,12 @@ namespace ICSharpCode.NRefactory.Demo
return; return;
IProjectContent project = new CSharpProjectContent(); IProjectContent project = new CSharpProjectContent();
var parsedFile = syntaxTree.ToTypeSystem(); var unresolvedFile = syntaxTree.ToTypeSystem();
project = project.UpdateProjectContent(null, parsedFile); project = project.AddOrUpdateFiles(unresolvedFile);
project = project.AddAssemblyReferences(builtInLibs.Value); project = project.AddAssemblyReferences(builtInLibs.Value);
ICompilation compilation = project.CreateCompilation(); ICompilation compilation = project.CreateCompilation();
CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, parsedFile); CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, unresolvedFile);
AstNode node = (AstNode)csharpTreeView.SelectedNode.Tag; AstNode node = (AstNode)csharpTreeView.SelectedNode.Tag;
IEntity entity; IEntity entity;
@ -276,7 +276,7 @@ namespace ICSharpCode.NRefactory.Demo
var searchScopes = fr.GetSearchScopes(entity); var searchScopes = fr.GetSearchScopes(entity);
Debug.WriteLine("Find references to " + entity.ReflectionName); Debug.WriteLine("Find references to " + entity.ReflectionName);
fr.FindReferencesInFile(searchScopes, parsedFile, syntaxTree, compilation, callback, CancellationToken.None); fr.FindReferencesInFile(searchScopes, unresolvedFile, syntaxTree, compilation, callback, CancellationToken.None);
MessageBox.Show("Found " + referenceCount + " references to " + entity.FullName); MessageBox.Show("Found " + referenceCount + " references to " + entity.FullName);
} }

6
ICSharpCode.NRefactory.GtkDemo/MainWindow.cs

@ -223,14 +223,14 @@ namespace ICSharpCode.NRefactory.GtkDemo
var parser = new CSharpParser (); var parser = new CSharpParser ();
var unit = parser.Parse (textview1.Buffer.Text, "dummy.cs"); var unit = parser.Parse (textview1.Buffer.Text, "dummy.cs");
var parsedFile = unit.ToTypeSystem(); var unresolvedFile = unit.ToTypeSystem();
IProjectContent project = new CSharpProjectContent (); IProjectContent project = new CSharpProjectContent ();
project = project.UpdateProjectContent (null, parsedFile); project = project.AddOrUpdateFiles (unresolvedFile);
project = project.AddAssemblyReferences (builtInLibs.Value); project = project.AddAssemblyReferences (builtInLibs.Value);
CSharpAstResolver resolver = new CSharpAstResolver(project.CreateCompilation (), unit, parsedFile); CSharpAstResolver resolver = new CSharpAstResolver(project.CreateCompilation (), unit, unresolvedFile);
ShowUnit (unit, resolver); ShowUnit (unit, resolver);
} }

12
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/TestRefactoringContext.cs

@ -158,7 +158,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
{ {
FindReferences refFinder = new FindReferences (); FindReferences refFinder = new FindReferences ();
refFinder.FindReferencesInFile (refFinder.GetSearchScopes (entity), refFinder.FindReferencesInFile (refFinder.GetSearchScopes (entity),
context.ParsedFile, context.UnresolvedFile,
context.RootNode as SyntaxTree, context.RootNode as SyntaxTree,
context.Compilation, (n, r) => Rename (n, name), context.Compilation, (n, r) => Rename (n, name),
context.CancellationToken); context.CancellationToken);
@ -168,7 +168,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
{ {
FindReferences refFinder = new FindReferences (); FindReferences refFinder = new FindReferences ();
refFinder.FindLocalReferences (variable, refFinder.FindLocalReferences (variable,
context.ParsedFile, context.UnresolvedFile,
context.RootNode as SyntaxTree, context.RootNode as SyntaxTree,
context.Compilation, (n, r) => Rename (n, name), context.Compilation, (n, r) => Rename (n, name),
context.CancellationToken); context.CancellationToken);
@ -178,7 +178,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
{ {
FindReferences refFinder = new FindReferences (); FindReferences refFinder = new FindReferences ();
refFinder.FindTypeParameterReferences (type, refFinder.FindTypeParameterReferences (type,
context.ParsedFile, context.UnresolvedFile,
context.RootNode as SyntaxTree, context.RootNode as SyntaxTree,
context.Compilation, (n, r) => Rename (n, name), context.Compilation, (n, r) => Rename (n, name),
context.CancellationToken); context.CancellationToken);
@ -258,14 +258,14 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
Console.WriteLine (error.Message); Console.WriteLine (error.Message);
Assert.IsFalse (parser.HasErrors, "File contains parsing errors."); Assert.IsFalse (parser.HasErrors, "File contains parsing errors.");
unit.Freeze (); unit.Freeze ();
var parsedFile = unit.ToTypeSystem (); var unresolvedFile = unit.ToTypeSystem ();
IProjectContent pc = new CSharpProjectContent (); IProjectContent pc = new CSharpProjectContent ();
pc = pc.UpdateProjectContent (null, parsedFile); pc = pc.AddOrUpdateFiles (unresolvedFile);
pc = pc.AddAssemblyReferences (new[] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); pc = pc.AddAssemblyReferences (new[] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore });
var compilation = pc.CreateCompilation (); var compilation = pc.CreateCompilation ();
var resolver = new CSharpAstResolver (compilation, unit, parsedFile); var resolver = new CSharpAstResolver (compilation, unit, unresolvedFile);
TextLocation location = TextLocation.Empty; TextLocation location = TextLocation.Empty;
if (idx >= 0) if (idx >= 0)
location = doc.GetLocation (idx); location = doc.GetLocation (idx);

16
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

@ -225,16 +225,16 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
var syntaxTree = new CSharpParser().Parse(parsedText, "program.cs"); var syntaxTree = new CSharpParser().Parse(parsedText, "program.cs");
syntaxTree.Freeze(); syntaxTree.Freeze();
var parsedFile = syntaxTree.ToTypeSystem(); var unresolvedFile = syntaxTree.ToTypeSystem();
pctx = pctx.UpdateProjectContent(null, parsedFile); pctx = pctx.AddOrUpdateFiles(unresolvedFile);
var cmp = pctx.CreateCompilation(); var cmp = pctx.CreateCompilation();
var loc = cursorPosition > 0 ? doc.GetLocation(cursorPosition) : new TextLocation (1, 1); var loc = cursorPosition > 0 ? doc.GetLocation(cursorPosition) : new TextLocation (1, 1);
var rctx = new CSharpTypeResolveContext(cmp.MainAssembly); var rctx = new CSharpTypeResolveContext(cmp.MainAssembly);
rctx = rctx.WithUsingScope(parsedFile.GetUsingScope(loc).Resolve(cmp)); rctx = rctx.WithUsingScope(unresolvedFile.GetUsingScope(loc).Resolve(cmp));
var curDef = parsedFile.GetInnermostTypeDefinition(loc); var curDef = unresolvedFile.GetInnermostTypeDefinition(loc);
if (curDef != null) { if (curDef != null) {
var resolvedDef = curDef.Resolve(rctx).GetDefinition(); var resolvedDef = curDef.Resolve(rctx).GetDefinition();
rctx = rctx.WithCurrentTypeDefinition(resolvedDef); rctx = rctx.WithCurrentTypeDefinition(resolvedDef);
@ -243,7 +243,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
rctx = rctx.WithCurrentMember(curMember); rctx = rctx.WithCurrentMember(curMember);
} }
} }
var mb = new DefaultCompletionContextProvider(doc, parsedFile); var mb = new DefaultCompletionContextProvider(doc, unresolvedFile);
var engine = new CSharpCompletionEngine(doc, mb, new TestFactory(), pctx, rctx); var engine = new CSharpCompletionEngine(doc, mb, new TestFactory(), pctx, rctx);
engine.EolMarker = Environment.NewLine; engine.EolMarker = Environment.NewLine;
@ -270,12 +270,12 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
var doc = new ReadOnlyDocument(text); var doc = new ReadOnlyDocument(text);
IProjectContent pctx = new CSharpProjectContent(); IProjectContent pctx = new CSharpProjectContent();
pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore });
var parsedFile = syntaxTree.ToTypeSystem(); var unresolvedFile = syntaxTree.ToTypeSystem();
pctx = pctx.UpdateProjectContent(null, parsedFile); pctx = pctx.AddOrUpdateFiles(unresolvedFile);
var cmp = pctx.CreateCompilation(); var cmp = pctx.CreateCompilation();
var mb = new DefaultCompletionContextProvider(doc, parsedFile); var mb = new DefaultCompletionContextProvider(doc, unresolvedFile);
var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly)); var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly));
engine.EolMarker = Environment.NewLine; engine.EolMarker = Environment.NewLine;
engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); engine.FormattingPolicy = FormattingOptionsFactory.CreateMono ();

12
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

@ -275,23 +275,23 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
var syntaxTree = new CSharpParser().Parse(parsedText, "program.cs"); var syntaxTree = new CSharpParser().Parse(parsedText, "program.cs");
syntaxTree.Freeze(); syntaxTree.Freeze();
var parsedFile = syntaxTree.ToTypeSystem(); var unresolvedFile = syntaxTree.ToTypeSystem();
pctx = pctx.UpdateProjectContent(null, parsedFile); pctx = pctx.AddOrUpdateFiles(unresolvedFile);
var cmp = pctx.CreateCompilation(); var cmp = pctx.CreateCompilation();
var loc = doc.GetLocation(cursorPosition); var loc = doc.GetLocation(cursorPosition);
var rctx = new CSharpTypeResolveContext(cmp.MainAssembly); var rctx = new CSharpTypeResolveContext(cmp.MainAssembly);
rctx = rctx.WithUsingScope(parsedFile.GetUsingScope(loc).Resolve(cmp)); rctx = rctx.WithUsingScope(unresolvedFile.GetUsingScope(loc).Resolve(cmp));
var curDef = parsedFile.GetInnermostTypeDefinition(loc); var curDef = unresolvedFile.GetInnermostTypeDefinition(loc);
if (curDef != null) { if (curDef != null) {
rctx = rctx.WithCurrentTypeDefinition(curDef.Resolve(rctx).GetDefinition()); rctx = rctx.WithCurrentTypeDefinition(curDef.Resolve(rctx).GetDefinition());
var curMember = parsedFile.GetMember(loc); var curMember = unresolvedFile.GetMember(loc);
if (curMember != null) { if (curMember != null) {
rctx = rctx.WithCurrentMember(curMember.CreateResolved(rctx)); rctx = rctx.WithCurrentMember(curMember.CreateResolved(rctx));
} }
} }
var mb = new DefaultCompletionContextProvider(doc, parsedFile); var mb = new DefaultCompletionContextProvider(doc, unresolvedFile);
var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx); var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx);
return engine.GetParameterDataProvider (cursorPosition, doc.GetCharAt (cursorPosition - 1)); return engine.GetParameterDataProvider (cursorPosition, doc.GetCharAt (cursorPosition - 1));
} }

12
ICSharpCode.NRefactory.Tests/CSharp/CodeDomConvertVisitorTests.cs

@ -34,15 +34,15 @@ namespace ICSharpCode.NRefactory.CSharp
public class CodeDomConvertVisitorTests : ResolverTestBase public class CodeDomConvertVisitorTests : ResolverTestBase
{ {
CodeDomConvertVisitor convertVisitor; CodeDomConvertVisitor convertVisitor;
CSharpParsedFile parsedFile; CSharpUnresolvedFile unresolvedFile;
public override void SetUp() public override void SetUp()
{ {
base.SetUp(); base.SetUp();
parsedFile = new CSharpParsedFile("test.cs"); unresolvedFile = new CSharpUnresolvedFile("test.cs");
parsedFile.RootUsingScope.Usings.Add(MakeReference("System")); unresolvedFile.RootUsingScope.Usings.Add(MakeReference("System"));
parsedFile.RootUsingScope.Usings.Add(MakeReference("System.Collections.Generic")); unresolvedFile.RootUsingScope.Usings.Add(MakeReference("System.Collections.Generic"));
parsedFile.RootUsingScope.Usings.Add(MakeReference("System.Linq")); unresolvedFile.RootUsingScope.Usings.Add(MakeReference("System.Linq"));
convertVisitor = new CodeDomConvertVisitor(); convertVisitor = new CodeDomConvertVisitor();
convertVisitor.AllowSnippetNodes = false; convertVisitor.AllowSnippetNodes = false;
@ -53,7 +53,7 @@ namespace ICSharpCode.NRefactory.CSharp
string ConvertHelper(AstNode node, Action<CSharpCodeProvider, CodeObject, TextWriter, CodeGeneratorOptions> action) string ConvertHelper(AstNode node, Action<CSharpCodeProvider, CodeObject, TextWriter, CodeGeneratorOptions> action)
{ {
CSharpResolver resolver = new CSharpResolver(compilation); CSharpResolver resolver = new CSharpResolver(compilation);
resolver = resolver.WithCurrentUsingScope(parsedFile.RootUsingScope.Resolve(compilation)); resolver = resolver.WithCurrentUsingScope(unresolvedFile.RootUsingScope.Resolve(compilation));
resolver = resolver.WithCurrentTypeDefinition(compilation.FindType(KnownTypeCode.Object).GetDefinition()); resolver = resolver.WithCurrentTypeDefinition(compilation.FindType(KnownTypeCode.Object).GetDefinition());
var codeObj = convertVisitor.Convert(node, new CSharpAstResolver(resolver, node)); var codeObj = convertVisitor.Convert(node, new CSharpAstResolver(resolver, node));

10
ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs

@ -54,15 +54,15 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan)) { using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan)) {
syntaxTree = parser.Parse(fs, fileName); syntaxTree = parser.Parse(fs, fileName);
} }
var parsedFile = syntaxTree.ToTypeSystem(); var unresolvedFile = syntaxTree.ToTypeSystem();
foreach (var td in parsedFile.GetAllTypeDefinitions()) { foreach (var td in unresolvedFile.GetAllTypeDefinitions()) {
Assert.AreSame(parsedFile, td.ParsedFile); Assert.AreSame(unresolvedFile, td.UnresolvedFile);
foreach (var member in td.Members) { foreach (var member in td.Members) {
Assert.AreSame(parsedFile, member.ParsedFile); Assert.AreSame(unresolvedFile, member.UnresolvedFile);
Assert.AreSame(td, member.DeclaringTypeDefinition); Assert.AreSame(td, member.DeclaringTypeDefinition);
} }
} }
pc = pc.UpdateProjectContent(null, parsedFile); pc = pc.AddOrUpdateFiles(unresolvedFile);
} }
} }

4
ICSharpCode.NRefactory.Tests/CSharp/Parser/TypeSystemConvertVisitorTests.cs

@ -47,9 +47,9 @@ namespace ICSharpCode.NRefactory.CSharp.Parser
syntaxTree = parser.Parse(s, fileName); syntaxTree = parser.Parse(s, fileName);
} }
var parsedFile = syntaxTree.ToTypeSystem(); var unresolvedFile = syntaxTree.ToTypeSystem();
return new CSharpProjectContent() return new CSharpProjectContent()
.UpdateProjectContent(null, parsedFile) .AddOrUpdateFiles(unresolvedFile)
.AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib }) .AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib })
.SetAssemblyName(typeof(TypeSystemTests).Assembly.GetName().Name); .SetAssemblyName(typeof(TypeSystemTests).Assembly.GetName().Name);
} }

8
ICSharpCode.NRefactory.Tests/CSharp/Refactoring/TypeSystemAstBuilderTests.cs

@ -56,15 +56,15 @@ namespace OtherNS {
IProjectContent pc; IProjectContent pc;
ICompilation compilation; ICompilation compilation;
ITypeDefinition baseClass, derivedClass, nestedClass, systemClass; ITypeDefinition baseClass, derivedClass, nestedClass, systemClass;
CSharpParsedFile parsedFile; CSharpUnresolvedFile unresolvedFile;
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
pc = new CSharpProjectContent(); pc = new CSharpProjectContent();
pc = pc.SetAssemblyName("MyAssembly"); pc = pc.SetAssemblyName("MyAssembly");
parsedFile = SyntaxTree.Parse(program, "program.cs").ToTypeSystem(); unresolvedFile = SyntaxTree.Parse(program, "program.cs").ToTypeSystem();
pc = pc.UpdateProjectContent(null, parsedFile); pc = pc.AddOrUpdateFiles(unresolvedFile);
pc = pc.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib }); pc = pc.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib });
compilation = pc.CreateCompilation(); compilation = pc.CreateCompilation();
@ -77,7 +77,7 @@ namespace OtherNS {
TypeSystemAstBuilder CreateBuilder(ITypeDefinition currentTypeDef = null) TypeSystemAstBuilder CreateBuilder(ITypeDefinition currentTypeDef = null)
{ {
UsingScope usingScope = currentTypeDef != null ? parsedFile.GetUsingScope(currentTypeDef.Region.Begin) : parsedFile.RootUsingScope; UsingScope usingScope = currentTypeDef != null ? unresolvedFile.GetUsingScope(currentTypeDef.Region.Begin) : unresolvedFile.RootUsingScope;
return new TypeSystemAstBuilder(new CSharpResolver( return new TypeSystemAstBuilder(new CSharpResolver(
new CSharpTypeResolveContext(compilation.MainAssembly, usingScope.Resolve(compilation), currentTypeDef))); new CSharpTypeResolveContext(compilation.MainAssembly, usingScope.Resolve(compilation), currentTypeDef)));
} }

8
ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs

@ -31,15 +31,15 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
public class FindReferencesTest public class FindReferencesTest
{ {
SyntaxTree syntaxTree; SyntaxTree syntaxTree;
CSharpParsedFile parsedFile; CSharpUnresolvedFile unresolvedFile;
ICompilation compilation; ICompilation compilation;
FindReferences findReferences; FindReferences findReferences;
void Init(string code) void Init(string code)
{ {
syntaxTree = SyntaxTree.Parse(code, "test.cs"); syntaxTree = SyntaxTree.Parse(code, "test.cs");
parsedFile = syntaxTree.ToTypeSystem(); unresolvedFile = syntaxTree.ToTypeSystem();
compilation = TypeSystemHelper.CreateCompilation(parsedFile); compilation = TypeSystemHelper.CreateCompilation(unresolvedFile);
findReferences = new FindReferences(); findReferences = new FindReferences();
} }
@ -47,7 +47,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{ {
var result = new List<AstNode>(); var result = new List<AstNode>();
var searchScopes = findReferences.GetSearchScopes(entity); var searchScopes = findReferences.GetSearchScopes(entity);
findReferences.FindReferencesInFile(searchScopes, parsedFile, syntaxTree, compilation, findReferences.FindReferencesInFile(searchScopes, unresolvedFile, syntaxTree, compilation,
(node, rr) => result.Add(node), CancellationToken.None); (node, rr) => result.Add(node), CancellationToken.None);
return result.OrderBy(n => n.StartLocation).ToArray(); return result.OrderBy(n => n.StartLocation).ToArray();
} }

20
ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

@ -38,13 +38,13 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
lookup = new MemberLookup(null, compilation.MainAssembly); lookup = new MemberLookup(null, compilation.MainAssembly);
} }
CSharpParsedFile Parse(string program) CSharpUnresolvedFile Parse(string program)
{ {
SyntaxTree syntaxTree = SyntaxTree.Parse(program, "test.cs"); SyntaxTree syntaxTree = SyntaxTree.Parse(program, "test.cs");
CSharpParsedFile parsedFile = syntaxTree.ToTypeSystem(); CSharpUnresolvedFile unresolvedFile = syntaxTree.ToTypeSystem();
project = project.UpdateProjectContent(null, parsedFile); project = project.AddOrUpdateFiles(unresolvedFile);
compilation = project.CreateCompilation(); compilation = project.CreateCompilation();
return parsedFile; return unresolvedFile;
} }
[Test] [Test]
@ -60,8 +60,8 @@ class Middle : Base {
class Derived : Middle { class Derived : Middle {
public override void Method() {} public override void Method() {}
}"; }";
var parsedFile = Parse(program); var unresolvedFile = Parse(program);
ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(parsedFile.TopLevelTypeDefinitions[2]); ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(unresolvedFile.TopLevelTypeDefinitions[2]);
var rr = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList<IType>.Instance, true) as MethodGroupResolveResult; var rr = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList<IType>.Instance, true) as MethodGroupResolveResult;
Assert.AreEqual(2, rr.MethodsGroupedByDeclaringType.Count()); Assert.AreEqual(2, rr.MethodsGroupedByDeclaringType.Count());
@ -87,8 +87,8 @@ class Derived : Base<int> {
public override void Method(int a) {} public override void Method(int a) {}
public override void Method(string a) {} public override void Method(string a) {}
}"; }";
var parsedFile = Parse(program); var unresolvedFile = Parse(program);
ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(parsedFile.TopLevelTypeDefinitions[1]); ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(unresolvedFile.TopLevelTypeDefinitions[1]);
var rr = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList<IType>.Instance, true) as MethodGroupResolveResult; var rr = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList<IType>.Instance, true) as MethodGroupResolveResult;
Assert.AreEqual(2, rr.MethodsGroupedByDeclaringType.Count()); Assert.AreEqual(2, rr.MethodsGroupedByDeclaringType.Count());
@ -115,8 +115,8 @@ class Base {
class Derived : Base { class Derived : Base {
public override void Method<S>(S a) {} public override void Method<S>(S a) {}
}"; }";
var parsedFile = Parse(program); var unresolvedFile = Parse(program);
ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(parsedFile.TopLevelTypeDefinitions[1]); ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(unresolvedFile.TopLevelTypeDefinitions[1]);
var rr = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList<IType>.Instance, true) as MethodGroupResolveResult; var rr = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList<IType>.Instance, true) as MethodGroupResolveResult;
Assert.AreEqual(1, rr.MethodsGroupedByDeclaringType.Count()); Assert.AreEqual(1, rr.MethodsGroupedByDeclaringType.Count());

12
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolverTestBase.cs

@ -168,11 +168,11 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
SetUp(); SetUp();
CSharpParsedFile parsedFile = syntaxTree.ToTypeSystem(); CSharpUnresolvedFile unresolvedFile = syntaxTree.ToTypeSystem();
project = project.UpdateProjectContent(null, parsedFile); project = project.AddOrUpdateFiles(unresolvedFile);
compilation = project.CreateCompilation(); compilation = project.CreateCompilation();
CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, parsedFile); CSharpAstResolver resolver = new CSharpAstResolver(compilation, syntaxTree, unresolvedFile);
return Tuple.Create(resolver, FindNode(syntaxTree, dollars[0], dollars[1])); return Tuple.Create(resolver, FindNode(syntaxTree, dollars[0], dollars[1]));
} }
@ -253,11 +253,11 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
SetUp(); SetUp();
CSharpParsedFile parsedFile = syntaxTree.ToTypeSystem(); CSharpUnresolvedFile unresolvedFile = syntaxTree.ToTypeSystem();
project = project.UpdateProjectContent(null, parsedFile); project = project.AddOrUpdateFiles(unresolvedFile);
compilation = project.CreateCompilation(); compilation = project.CreateCompilation();
ResolveResult rr = Resolver.ResolveAtLocation.Resolve(compilation, parsedFile, syntaxTree, dollars[0]); ResolveResult rr = Resolver.ResolveAtLocation.Resolve(compilation, unresolvedFile, syntaxTree, dollars[0]);
return rr; return rr;
} }

2
ICSharpCode.NRefactory.Tests/Documentation/CSharpCrefLookupTests.cs

@ -56,7 +56,7 @@ class Impl<T> : IGeneric<List<string>[,], T> {
var pc = new CSharpProjectContent().AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib }); var pc = new CSharpProjectContent().AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib });
var syntaxTree = SyntaxTree.Parse(program, "program.cs"); var syntaxTree = SyntaxTree.Parse(program, "program.cs");
var compilation = pc.UpdateProjectContent(null, syntaxTree.ToTypeSystem()).CreateCompilation(); var compilation = pc.AddOrUpdateFiles(syntaxTree.ToTypeSystem()).CreateCompilation();
var typeDefinition = compilation.MainAssembly.TopLevelTypeDefinitions.First(); var typeDefinition = compilation.MainAssembly.TopLevelTypeDefinitions.First();
IEntity entity = typeDefinition.Documentation.ResolveCref(cref); IEntity entity = typeDefinition.Documentation.ResolveCref(cref);
Assert.IsNotNull(entity, "ResolveCref() returned null."); Assert.IsNotNull(entity, "ResolveCref() returned null.");

2
ICSharpCode.NRefactory.Tests/Documentation/CSharpDocumentationTests.cs

@ -36,7 +36,7 @@ namespace ICSharpCode.NRefactory.Documentation
{ {
var pc = new CSharpProjectContent().AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib }); var pc = new CSharpProjectContent().AddAssemblyReferences(new[] { CecilLoaderTests.Mscorlib });
var syntaxTree = SyntaxTree.Parse(program, "program.cs"); var syntaxTree = SyntaxTree.Parse(program, "program.cs");
compilation = pc.UpdateProjectContent(null, syntaxTree.ToTypeSystem()).CreateCompilation(); compilation = pc.AddOrUpdateFiles(syntaxTree.ToTypeSystem()).CreateCompilation();
typeDefinition = compilation.MainAssembly.TopLevelTypeDefinitions.FirstOrDefault(); typeDefinition = compilation.MainAssembly.TopLevelTypeDefinitions.FirstOrDefault();
} }

4
ICSharpCode.NRefactory.Tests/TypeSystem/GetAllBaseTypesTest.cs

@ -67,8 +67,8 @@ namespace System.Collections.Generic {
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
var parsedFile = new CSharpParser().Parse(corlib, "corlib.cs").ToTypeSystem(); var unresolvedFile = new CSharpParser().Parse(corlib, "corlib.cs").ToTypeSystem();
compilation = new CSharpProjectContent().SetAssemblyName("mscorlib").UpdateProjectContent(null, parsedFile).CreateCompilation(); compilation = new CSharpProjectContent().SetAssemblyName("mscorlib").AddOrUpdateFiles(unresolvedFile).CreateCompilation();
} }
IType[] GetAllBaseTypes(Type type) IType[] GetAllBaseTypes(Type type)

12
ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemHelper.cs

@ -27,20 +27,20 @@ namespace ICSharpCode.NRefactory.TypeSystem
{ {
public static ICompilation CreateCompilation() public static ICompilation CreateCompilation()
{ {
return CreateCompilation(new IParsedFile[0]); return CreateCompilation(new IUnresolvedFile[0]);
} }
public static ICompilation CreateCompilation(params IUnresolvedTypeDefinition[] unresolvedTypeDefinitions) public static ICompilation CreateCompilation(params IUnresolvedTypeDefinition[] unresolvedTypeDefinitions)
{ {
var parsedFile = new CSharpParsedFile("dummy.cs"); var unresolvedFile = new CSharpUnresolvedFile("dummy.cs");
foreach (var typeDef in unresolvedTypeDefinitions) foreach (var typeDef in unresolvedTypeDefinitions)
parsedFile.TopLevelTypeDefinitions.Add(typeDef); unresolvedFile.TopLevelTypeDefinitions.Add(typeDef);
return CreateCompilation(parsedFile); return CreateCompilation(unresolvedFile);
} }
public static ICompilation CreateCompilation(params IParsedFile[] parsedFiles) public static ICompilation CreateCompilation(params IUnresolvedFile[] unresolvedFiles)
{ {
var pc = new CSharpProjectContent().UpdateProjectContent(null, parsedFiles); var pc = new CSharpProjectContent().AddOrUpdateFiles(unresolvedFiles);
pc = pc.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); pc = pc.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore });
return pc.CreateCompilation(); return pc.CreateCompilation();
} }

2
ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

@ -206,7 +206,7 @@
<Compile Include="TypeSystem\IntersectionType.cs" /> <Compile Include="TypeSystem\IntersectionType.cs" />
<Compile Include="TypeSystem\IParameter.cs" /> <Compile Include="TypeSystem\IParameter.cs" />
<Compile Include="TypeSystem\IParameterizedMember.cs" /> <Compile Include="TypeSystem\IParameterizedMember.cs" />
<Compile Include="TypeSystem\IParsedFile.cs" /> <Compile Include="TypeSystem\IUnresolvedFile.cs" />
<Compile Include="TypeSystem\IProjectContent.cs" /> <Compile Include="TypeSystem\IProjectContent.cs" />
<Compile Include="TypeSystem\IProperty.cs" /> <Compile Include="TypeSystem\IProperty.cs" />
<Compile Include="TypeSystem\ISolutionSnapshot.cs" /> <Compile Include="TypeSystem\ISolutionSnapshot.cs" />

6
ICSharpCode.NRefactory/TypeSystem/ExtensionMethods.cs

@ -268,7 +268,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Gets all unresolved type definitions from the file. /// Gets all unresolved type definitions from the file.
/// For partial classes, each part is returned. /// For partial classes, each part is returned.
/// </summary> /// </summary>
public static IEnumerable<IUnresolvedTypeDefinition> GetAllTypeDefinitions (this IParsedFile file) public static IEnumerable<IUnresolvedTypeDefinition> GetAllTypeDefinitions (this IUnresolvedFile file)
{ {
return TreeTraversal.PreOrder(file.TopLevelTypeDefinitions, t => t.NestedTypes); return TreeTraversal.PreOrder(file.TopLevelTypeDefinitions, t => t.NestedTypes);
} }
@ -300,7 +300,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Gets the type (potentially a nested type) defined at the specified location. /// Gets the type (potentially a nested type) defined at the specified location.
/// Returns null if no type is defined at that location. /// Returns null if no type is defined at that location.
/// </summary> /// </summary>
public static IUnresolvedTypeDefinition GetInnermostTypeDefinition (this IParsedFile file, int line, int column) public static IUnresolvedTypeDefinition GetInnermostTypeDefinition (this IUnresolvedFile file, int line, int column)
{ {
return file.GetInnermostTypeDefinition (new TextLocation (line, column)); return file.GetInnermostTypeDefinition (new TextLocation (line, column));
} }
@ -309,7 +309,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Gets the member defined at the specified location. /// Gets the member defined at the specified location.
/// Returns null if no member is defined at that location. /// Returns null if no member is defined at that location.
/// </summary> /// </summary>
public static IUnresolvedMember GetMember (this IParsedFile file, int line, int column) public static IUnresolvedMember GetMember (this IUnresolvedFile file, int line, int column)
{ {
return file.GetMember (new TextLocation (line, column)); return file.GetMember (new TextLocation (line, column));
} }

2
ICSharpCode.NRefactory/TypeSystem/IEntity.cs

@ -54,7 +54,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Gets the parsed file in which this entity is defined. /// Gets the parsed file in which this entity is defined.
/// Returns null if this entity wasn't parsed from source code (e.g. loaded from a .dll with CecilLoader). /// Returns null if this entity wasn't parsed from source code (e.g. loaded from a .dll with CecilLoader).
/// </summary> /// </summary>
IParsedFile ParsedFile { get; } IUnresolvedFile UnresolvedFile { get; }
/// <summary> /// <summary>
/// Gets the attributes on this entity. /// Gets the attributes on this entity.

42
ICSharpCode.NRefactory/TypeSystem/IProjectContent.cs

@ -35,12 +35,12 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// <summary> /// <summary>
/// Gets a parsed file by its file name. /// Gets a parsed file by its file name.
/// </summary> /// </summary>
IParsedFile GetFile(string fileName); IUnresolvedFile GetFile(string fileName);
/// <summary> /// <summary>
/// Gets the list of all parsed files in the project content. /// Gets the list of all parsed files in the project content.
/// </summary> /// </summary>
IEnumerable<IParsedFile> Files { get; } IEnumerable<IUnresolvedFile> Files { get; }
/// <summary> /// <summary>
/// Gets the referenced assemblies. /// Gets the referenced assemblies.
@ -94,20 +94,54 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// </summary> /// </summary>
IProjectContent AddAssemblyReferences(IEnumerable<IAssemblyReference> references); IProjectContent AddAssemblyReferences(IEnumerable<IAssemblyReference> references);
/// <summary>
/// Add assembly references to this project content.
/// </summary>
IProjectContent AddAssemblyReferences(params IAssemblyReference[] references);
/// <summary> /// <summary>
/// Removes assembly references from this project content. /// Removes assembly references from this project content.
/// </summary> /// </summary>
IProjectContent RemoveAssemblyReferences(IEnumerable<IAssemblyReference> references); IProjectContent RemoveAssemblyReferences(IEnumerable<IAssemblyReference> references);
/// <summary>
/// Removes assembly references from this project content.
/// </summary>
IProjectContent RemoveAssemblyReferences(params IAssemblyReference[] references);
/// <summary>
/// Adds the specified files to the project content.
/// If a file with the same name already exists, updated the existing file.
/// </summary>
IProjectContent AddOrUpdateFiles(IEnumerable<IUnresolvedFile> newFiles);
/// <summary>
/// Adds the specified files to the project content.
/// If a file with the same name already exists, this method updates the existing file.
/// </summary>
IProjectContent AddOrUpdateFiles(params IUnresolvedFile[] newFiles);
/// <summary>
/// Removes the files with the specified names.
/// </summary>
IProjectContent RemoveFiles(IEnumerable<string> fileNames);
/// <summary>
/// Removes the files with the specified names.
/// </summary>
IProjectContent RemoveFiles(params string[] fileNames);
/// <summary> /// <summary>
/// Removes types and attributes from oldFile from the project, and adds those from newFile. /// Removes types and attributes from oldFile from the project, and adds those from newFile.
/// </summary> /// </summary>
IProjectContent UpdateProjectContent(IParsedFile oldFile, IParsedFile newFile); [Obsolete("Use RemoveFiles()/AddOrUpdateFiles() instead")]
IProjectContent UpdateProjectContent(IUnresolvedFile oldFile, IUnresolvedFile newFile);
/// <summary> /// <summary>
/// Removes types and attributes from oldFiles from the project, and adds those from newFiles. /// Removes types and attributes from oldFiles from the project, and adds those from newFiles.
/// </summary> /// </summary>
IProjectContent UpdateProjectContent(IEnumerable<IParsedFile> oldFiles, IEnumerable<IParsedFile> newFiles); [Obsolete("Use RemoveFiles()/AddOrUpdateFiles() instead")]
IProjectContent UpdateProjectContent(IEnumerable<IUnresolvedFile> oldFiles, IEnumerable<IUnresolvedFile> newFiles);
/// <summary> /// <summary>
/// Sets the compiler settings object. /// Sets the compiler settings object.

5
ICSharpCode.NRefactory/TypeSystem/IParsedFile.cs → ICSharpCode.NRefactory/TypeSystem/IUnresolvedFile.cs

@ -21,10 +21,13 @@ using System.Collections.Generic;
namespace ICSharpCode.NRefactory.TypeSystem namespace ICSharpCode.NRefactory.TypeSystem
{ {
[Obsolete("IParsedFile was renamed to IUnresolvedFile", true)]
public interface IParsedFile {}
/// <summary> /// <summary>
/// Represents a single file that was parsed. /// Represents a single file that was parsed.
/// </summary> /// </summary>
public interface IParsedFile public interface IUnresolvedFile
{ {
/// <summary> /// <summary>
/// Returns the full path of the file. /// Returns the full path of the file.

2
ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs

@ -92,7 +92,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public override DocumentationComment Documentation { public override DocumentationComment Documentation {
get { get {
IUnresolvedDocumentationProvider docProvider = unresolved.ParsedFile as IUnresolvedDocumentationProvider; IUnresolvedDocumentationProvider docProvider = unresolved.UnresolvedFile as IUnresolvedDocumentationProvider;
if (docProvider != null) { if (docProvider != null) {
var doc = docProvider.GetDocumentation(unresolved, this); var doc = docProvider.GetDocumentation(unresolved, this);
if (doc != null) if (doc != null)

8
ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedEntity.cs

@ -101,7 +101,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{ {
internal DomRegion region; internal DomRegion region;
internal DomRegion bodyRegion; internal DomRegion bodyRegion;
internal IParsedFile parsedFile; internal IUnresolvedFile unresolvedFile;
protected internal virtual void FreezeInternal() protected internal virtual void FreezeInternal()
{ {
@ -148,11 +148,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
} }
} }
public IParsedFile ParsedFile { public IUnresolvedFile UnresolvedFile {
get { return rareFields != null ? rareFields.parsedFile : null; } get { return rareFields != null ? rareFields.unresolvedFile : null; }
set { set {
if (value != null || rareFields != null) if (value != null || rareFields != null)
WriteRareFields().parsedFile = value; WriteRareFields().unresolvedFile = value;
} }
} }

2
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

@ -589,7 +589,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public virtual DocumentationComment Documentation { public virtual DocumentationComment Documentation {
get { get {
foreach (var part in parts) { foreach (var part in parts) {
var unresolvedProvider = part.ParsedFile as IUnresolvedDocumentationProvider; var unresolvedProvider = part.UnresolvedFile as IUnresolvedDocumentationProvider;
if (unresolvedProvider != null) { if (unresolvedProvider != null) {
var doc = unresolvedProvider.GetDocumentation(part, this); var doc = unresolvedProvider.GetDocumentation(part, this);
if (doc != null) if (doc != null)

2
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedEvent.cs

@ -55,7 +55,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
this.DeclaringTypeDefinition = declaringType; this.DeclaringTypeDefinition = declaringType;
this.Name = name; this.Name = name;
if (declaringType != null) if (declaringType != null)
this.ParsedFile = declaringType.ParsedFile; this.UnresolvedFile = declaringType.UnresolvedFile;
} }
public bool CanAdd { public bool CanAdd {

2
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedField.cs

@ -51,7 +51,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
this.DeclaringTypeDefinition = declaringType; this.DeclaringTypeDefinition = declaringType;
this.Name = name; this.Name = name;
if (declaringType != null) if (declaringType != null)
this.ParsedFile = declaringType.ParsedFile; this.UnresolvedFile = declaringType.UnresolvedFile;
} }
public bool IsConst { public bool IsConst {

2
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedMethod.cs

@ -63,7 +63,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
this.DeclaringTypeDefinition = declaringType; this.DeclaringTypeDefinition = declaringType;
this.Name = name; this.Name = name;
if (declaringType != null) if (declaringType != null)
this.ParsedFile = declaringType.ParsedFile; this.UnresolvedFile = declaringType.UnresolvedFile;
} }
public IList<IUnresolvedAttribute> ReturnTypeAttributes { public IList<IUnresolvedAttribute> ReturnTypeAttributes {

2
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedProperty.cs

@ -58,7 +58,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
this.DeclaringTypeDefinition = declaringType; this.DeclaringTypeDefinition = declaringType;
this.Name = name; this.Name = name;
if (declaringType != null) if (declaringType != null)
this.ParsedFile = declaringType.ParsedFile; this.UnresolvedFile = declaringType.UnresolvedFile;
} }
public bool IsIndexer { public bool IsIndexer {

2
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedTypeDefinition.cs

@ -72,7 +72,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
this.DeclaringTypeDefinition = declaringTypeDefinition; this.DeclaringTypeDefinition = declaringTypeDefinition;
this.namespaceName = declaringTypeDefinition.Namespace; this.namespaceName = declaringTypeDefinition.Namespace;
this.Name = name; this.Name = name;
this.ParsedFile = declaringTypeDefinition.ParsedFile; this.UnresolvedFile = declaringTypeDefinition.UnresolvedFile;
} }
public TypeKind Kind { public TypeKind Kind {

2
doc/XML Documentation.html

@ -20,7 +20,7 @@
property is accessed.<br/> property is accessed.<br/>
For this purpose, the type system casts the parsed file to <code>IUnresolvedDocumentationProvider</code> For this purpose, the type system casts the parsed file to <code>IUnresolvedDocumentationProvider</code>
and tries to get the documentation. and tries to get the documentation.
This way, the <code>CSharpParsedFile</code> can provide the documentation from the XML comments.<br/> This way, the <code>CSharpUnresolvedFile</code> can provide the documentation from the XML comments.<br/>
If this fails, the type system casts the unresolved assembly/project content to <code>IDocumentationProvider</code>. If this fails, the type system casts the unresolved assembly/project content to <code>IDocumentationProvider</code>.
This is the way the request for documentation gets to the <code>CecilLoader</code>, This is the way the request for documentation gets to the <code>CecilLoader</code>,
which in turn forwards it to the user-provided <code>IDocumentationProvider</code>. which in turn forwards it to the user-provided <code>IDocumentationProvider</code>.

Loading…
Cancel
Save