Browse Source

Getting AssemblyModel from opened project instead of loading it from compiled assembly in BaseTypesTreeNode. Also taking care that a project's AssemblyModel always has updated references to other assemblies.

pull/80/head
Andreas Weizel 13 years ago
parent
commit
e3e415fc10
  1. 31
      src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs
  2. 12
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  3. 1
      src/Main/SharpDevelop/Parser/AssemblyParserService.cs

31
src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs

@ -8,6 +8,7 @@ using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.TreeView; using ICSharpCode.TreeView;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
@ -67,19 +68,38 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition mainTypeDefinition, ITypeDefinition baseTypeDefinition) ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition mainTypeDefinition, ITypeDefinition baseTypeDefinition)
{ {
ITypeDefinitionModel resolveTypeDefModel = null; ITypeDefinitionModel resolveTypeDefModel = null;
var assemblyFileName = mainTypeDefinition.ParentAssembly.GetRuntimeAssemblyLocation();
IAssemblyModel assemblyModel = null;
try {
// Try to get AssemblyModel
IProjectService projectService = SD.GetRequiredService<IProjectService>();
if (projectService.CurrentSolution != null) {
var projectOfAssembly = projectService.CurrentSolution.Projects.FirstOrDefault(p => p.AssemblyModel.Location == assemblyFileName);
if (projectOfAssembly != null) {
// We automatically have an AssemblyModel from project
assemblyModel = projectOfAssembly.AssemblyModel;
}
}
var assemblyParserService = SD.GetService<IAssemblyParserService>(); var assemblyParserService = SD.GetService<IAssemblyParserService>();
if (assemblyModel == null) {
if (assemblyParserService != null) { if (assemblyParserService != null) {
var assemblyFileName = mainTypeDefinition.ParentAssembly.GetRuntimeAssemblyLocation();
if (assemblyFileName != null) { if (assemblyFileName != null) {
try { assemblyModel = assemblyParserService.GetAssemblyModel(assemblyFileName);
}
}
}
if (assemblyModel != null) {
// Look in the type's AssemblyModel // Look in the type's AssemblyModel
var assemblyModel = assemblyParserService.GetAssemblyModel(assemblyFileName);
resolveTypeDefModel = assemblyModel.TopLevelTypeDefinitions[baseTypeDefinition.FullTypeName]; resolveTypeDefModel = assemblyModel.TopLevelTypeDefinitions[baseTypeDefinition.FullTypeName];
if (resolveTypeDefModel != null) { if (resolveTypeDefModel != null) {
return resolveTypeDefModel; return resolveTypeDefModel;
} }
if (assemblyModel.References != null) { // Look at referenced assemblies
if ((assemblyModel.References != null) && (assemblyParserService != null)) {
foreach (var referencedAssemblyName in assemblyModel.References) { foreach (var referencedAssemblyName in assemblyModel.References) {
DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyModel.Location); DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyModel.Location);
var resolvedFile = searcher.FindAssembly(referencedAssemblyName); var resolvedFile = searcher.FindAssembly(referencedAssemblyName);
@ -90,11 +110,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
} }
} }
}
} catch (Exception) { } catch (Exception) {
// TODO Can't load the type, what to do? // TODO Can't load the type, what to do?
} }
}
}
return resolveTypeDefModel; return resolveTypeDefModel;
} }

12
src/Main/Base/Project/Src/Project/CompilableProject.cs

@ -354,19 +354,24 @@ namespace ICSharpCode.SharpDevelop.Project
public override IAssemblyModel AssemblyModel { public override IAssemblyModel AssemblyModel {
get { get {
SD.MainThread.VerifyAccess(); SD.MainThread.VerifyAccess();
var pc = ProjectContent;
if (assemblyModel == null) { if (assemblyModel == null) {
assemblyModel = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(new ProjectEntityModelContext(this, ".cs")); assemblyModel = SD.GetRequiredService<IModelFactory>().CreateAssemblyModel(new ProjectEntityModelContext(this, ".cs"));
var pc = ProjectContent;
if (pc != null && assemblyModel is IUpdateableAssemblyModel) { if (pc != null && assemblyModel is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel)assemblyModel).AssemblyName = AssemblyName; ((IUpdateableAssemblyModel)assemblyModel).AssemblyName = AssemblyName;
((IUpdateableAssemblyModel)assemblyModel).References = pc.AssemblyReferences
.Select(ResolveReference).Where(r => r != null).ToList();
// Add the already loaded files into the model // Add the already loaded files into the model
foreach (var file in pc.Files) { foreach (var file in pc.Files) {
((IUpdateableAssemblyModel)assemblyModel).Update(null, file); ((IUpdateableAssemblyModel)assemblyModel).Update(null, file);
} }
} }
} }
// Update references on every access
if (pc != null && assemblyModel is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel)assemblyModel).References = pc.AssemblyReferences
.Select(ResolveReference).Where(r => r != null).ToList();
}
return assemblyModel; return assemblyModel;
} }
} }
@ -393,7 +398,6 @@ namespace ICSharpCode.SharpDevelop.Project
SD.MainThread.InvokeAsyncAndForget(delegate { SD.MainThread.InvokeAsyncAndForget(delegate {
if (assemblyModel is IUpdateableAssemblyModel) { if (assemblyModel is IUpdateableAssemblyModel) {
((IUpdateableAssemblyModel)assemblyModel).Update(args.OldUnresolvedFile, args.NewUnresolvedFile); ((IUpdateableAssemblyModel)assemblyModel).Update(args.OldUnresolvedFile, args.NewUnresolvedFile);
// TODO : update references as well?
} }
ParseInformationUpdated(null, args); ParseInformationUpdated(null, args);
}); });

1
src/Main/SharpDevelop/Parser/AssemblyParserService.cs

@ -18,6 +18,7 @@ using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.NRefactory.Utils; using ICSharpCode.NRefactory.Utils;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.ClassBrowser; using ICSharpCode.SharpDevelop.Dom.ClassBrowser;
using ICSharpCode.SharpDevelop.Project;
using Mono.Cecil; using Mono.Cecil;
namespace ICSharpCode.SharpDevelop.Parser namespace ICSharpCode.SharpDevelop.Parser

Loading…
Cancel
Save