'master' is now SharpDevelop 5.0; SharpDevelop 4.x is continued on the 4.x branch.pull/59/merge
@ -0,0 +1,212 @@
				@@ -0,0 +1,212 @@
					 | 
				
			||||
 | 
				
			||||
Commented code, needs to be ported and re-enabled: | 
				
			||||
	ParseProjectContent | 
				
			||||
	Class Browser (removed from source tree; to be reimplemented using WPF) | 
				
			||||
	NRefactoryLanguageConverter | 
				
			||||
	Context Actions (EditorContext etc.) | 
				
			||||
	RefactoringService | 
				
			||||
	FindReferencesAndRenameHelper | 
				
			||||
	NamespaceRefactoringService | 
				
			||||
	RefactoringMenuBuilder | 
				
			||||
	TaskService.UpdateCommentTags | 
				
			||||
	CodeManipulation.cs (btw, I think this doesn't belong into AvalonEdit.AddIn - more a job for a language binding) | 
				
			||||
 | 
				
			||||
--> See TODO-list on Google Docs | 
				
			||||
 | 
				
			||||
Important features (self-hosting): | 
				
			||||
	Ctrl+Space Completion | 
				
			||||
	ctor snippet | 
				
			||||
	Rename refactoring | 
				
			||||
	Run unit test from icon bar margin | 
				
			||||
	"Add using" context action (and other resolve error MD context actions) | 
				
			||||
	ILSpy-AddIn | 
				
			||||
 | 
				
			||||
Stuff that was renamed/moved: | 
				
			||||
	ICSharpCode.SharpDevelop.Dom -> the type system and resolvers now are part of ICSharpCode.NRefactory | 
				
			||||
	IDocument -> moved to ICSharpCode.NRefactory.Editor | 
				
			||||
	IClass -> ITypeDefinition | 
				
			||||
	ICompilationUnit -> IUnresolvedFile | 
				
			||||
	ITextBuffer -> ITextSource (in ICSharpCode.NRefactory.Editor) | 
				
			||||
	IReturnType -> ITypeReference (unresolved) or IType (resolved) | 
				
			||||
	Location -> TextLocation in ICSharpCode.NRefactory | 
				
			||||
	TextLocation -> moved to ICSharpCode.NRefactory | 
				
			||||
 | 
				
			||||
Functionality changes: | 
				
			||||
	 | 
				
			||||
	SharpDevelop.Dom was replaced by NRefactory 5: | 
				
			||||
		Apart from plenty of API changes, there are also a couple of architectural changes | 
				
			||||
		to look out for. | 
				
			||||
		Most importantly, the type system has been split up into an unresolved and a resolved | 
				
			||||
		version. When porting code using SD.Dom, be careful which one of the two you choose. | 
				
			||||
		 | 
				
			||||
		If possible, try to avoid using the unresolved type system. The planned observable code model | 
				
			||||
		(will be implemented for the 5.0 class browser) might be a better alternative in some cases. | 
				
			||||
		Features related to the type system / refactorings should probably wait for this code model | 
				
			||||
		before they are ported to 5.0. | 
				
			||||
 | 
				
			||||
		NRefactory 5 introduction: http://www.codeproject.com/Articles/408663/Using-NRefactory-for-analyzing-Csharp-code | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	Static services replaced with interfaces: | 
				
			||||
		To make writing unit tests easier, the static services in SharpDevelop are getting | 
				
			||||
		replaced with interfaces. The class "SD" has static properties to get references | 
				
			||||
		to the services, so the call "ResourceService.GetString()" becomes "SD.ResourceService.GetString()". | 
				
			||||
		 | 
				
			||||
		In unit tests, Rhino.Mocks can be used to easily create mocks of the services: | 
				
			||||
			SD.InitializeForUnitTests(); // initialize container and remove services from previous test cases | 
				
			||||
			SD.Services.AddService(typeof(IParserService), MockRepository.GenerateStrictMock<IParserService>()); | 
				
			||||
			SD.ParserService.Stub(p => p.GetCachedParseInformation(textEditor.FileName)).Return(parseInfo); | 
				
			||||
			SD.ParserService.Stub(p => p.GetCompilationForFile(textEditor.FileName)).Return(compilation); | 
				
			||||
		 | 
				
			||||
		It is possible to define a service interface in ICSharpCode.SharpDevelop.dll and have the implementation | 
				
			||||
		somewhere else (SD will find it using the AddInTree). | 
				
			||||
		This allows for AddIns to consume each other's functionality (e.g. debugger accessing the decompiler service) | 
				
			||||
		without having to define a custom AddIn tree path. | 
				
			||||
		The long-term goal is to have only interfaces and helper classes in ICSharpCode.SharpDevelop.dll (the API for AddIns) | 
				
			||||
		and have the implementation details in SharpDevelop.exe (which AddIns aren't supposed to reference). | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	ICSharpCode.Core.WinForms hidden behind service interfaces: | 
				
			||||
		This is an extension of the previous point. | 
				
			||||
		The whole assembly ICSharpCode.Core.WinForms still exists and has the old static services, | 
				
			||||
		which makes porting old AddIns a bit easier. | 
				
			||||
		However, it should no longer be used in new code and AddIns should get rid of the reference | 
				
			||||
		to ICSharpCode.Core.WinForms if possible. | 
				
			||||
		The services in SD.WinForms provide the same functionality. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	Namespaces in ICSharpCode.SharpDevelop reorganized: | 
				
			||||
		I'm currently moving types around in ICSharpCode.SharpDevelop, so you'll have to update | 
				
			||||
		plenty of usings. | 
				
			||||
		The idea behind the new namespaces is that grouping the code into 'Gui' and 'Services' | 
				
			||||
		isn't very useful; so I'm getting rid of those namespaces and the old folder structure, | 
				
			||||
		and re-group the types into feature areas. | 
				
			||||
		 | 
				
			||||
		Within the ICSharpCode.SharpDevelop project, the 'Src' folder contains the old code | 
				
			||||
		that hasn't been cleaned up yet and may still be in an old namespace. | 
				
			||||
		 | 
				
			||||
		When I'm done cleaning up a code file, I'm moving to out of the 'Src' folder into one of | 
				
			||||
		the new folders corresponding to the new namespace. | 
				
			||||
		As part of this cleanup, I'm also replacing static services with service interfaces (see above). | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	AddInTree paths reorganized | 
				
			||||
		Plenty of AddIn tree paths have been changed to better match the new namespace structure. | 
				
			||||
		 | 
				
			||||
		I used a global replace operation for renaming paths; so AddIns that are in the SharpDevelop | 
				
			||||
		repository but not in the SharpDevelop solution (because they haven't been ported yet) | 
				
			||||
		have been adjusted as well. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	SD.MainThread: | 
				
			||||
		The new best way to invoke a call on the main thread is: | 
				
			||||
			SD.MainThread.InvokeAsync(delegate { ... }).FireAndForget(); | 
				
			||||
		 | 
				
			||||
		Note that InvokeAsync returns a Task (like all .NET 4.5 *Async APIs). If any exceptions occur while | 
				
			||||
		executing the delegate, they will get stored in the task object. This can cause the exception to get | 
				
			||||
		silently ignored if the task object isn't used later. The "FireAndForget()" extension method solves | 
				
			||||
		this problem by reporting any (future) errors to the message service. | 
				
			||||
		 | 
				
			||||
		It is also often possible to avoid explicit thread switches alltogether by using the C# 5 async/await feature. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	ICSharpCode.Core.ICommand replaced with WPF ICommand | 
				
			||||
		New menu commands should derive from 'SimpleCommand' instead of 'AbstractMenuCommand'. | 
				
			||||
		If 'IsEnabled'-handling is required, new commands should just implement ICommand directly without using any base class. | 
				
			||||
		 | 
				
			||||
		The old class AbstractMenuCommand still exist and simulates the old API, which makes porting AddIns a bit easier. | 
				
			||||
		I'm thinking about writing a tool that automatically ports AbstractMenuCommand-derived classes to SimpleCommand, | 
				
			||||
		so you don't need to bother updating your commands manually. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	SD.PropertyService: | 
				
			||||
		The Get()/Set() methods no longer support nested Properties objects or lists of elements - | 
				
			||||
		you will need to use the new dedicated GetList()/SetList()/NestedProperties() methods for that. | 
				
			||||
		 | 
				
			||||
		The Get() method no longer causes the default value to be stored in the container; and GetList() | 
				
			||||
		results in a read-only list - an explicit SetList() call is required to store the resulting value again. | 
				
			||||
		 | 
				
			||||
		However, a nested properties container still is connected with its parent, and any changes done | 
				
			||||
		to the nested container will get saves without having to call the SetNestedProperties() method. | 
				
			||||
		 | 
				
			||||
		The property service now uses XAML serialization instead of XML serialization. This might require | 
				
			||||
		some changes to your classes to ensure they get serialized correctly, for example | 
				
			||||
		you need to use public properties instead of public fields. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	SD.ParserService: | 
				
			||||
		The result of a parser run (ParseInformation) now may contain a fully parsed AST. | 
				
			||||
		The ParserService may cache such full ASTs, but may also drop them from memory at any time. | 
				
			||||
		This will be implemented by keeping the last N accessed files in the cache. (currently we just keep the caches around forever) | 
				
			||||
		Every parse information also contains an IUnresolvedFile instance with the type system information. | 
				
			||||
		The IUnresolvedFile is stored permanently (both in ParserService and in the IProjectContents). | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	Solution model: | 
				
			||||
		The class 'Solution' has been replaced with the interface 'ISolution'. | 
				
			||||
		The static events that report changes to the solution (e.g. project added) no longer exist on IProjectService; | 
				
			||||
		instead the ISolution.Projects collection itself has a changed event. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	Text editor and document services: | 
				
			||||
		In SharpDevelop 4.x it was possible to use IDocument.GetService(typeof(ITextEditor)) to find the | 
				
			||||
		editor that presents the document. | 
				
			||||
		This is no longer possible in SharpDevelop 5, as the same IDocument may be used by | 
				
			||||
		multiple editors (e.g. split view). | 
				
			||||
		 | 
				
			||||
		ITextEditor and IDocument now use separate service containers. | 
				
			||||
		ITextEditor.GetService() will also return document services, but not the other way around. | 
				
			||||
		 | 
				
			||||
		The attributes [DocumentService] and [TextEditorService] are used to mark the service interfaces | 
				
			||||
		that are available in the document and in the editor respectively. | 
				
			||||
		The attributes exist purely for documentation, and some services may not use them | 
				
			||||
		(for example the service interfaces defined in AvalonEdit, where the attributes aren't referenced). | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	View content services: | 
				
			||||
		Instead of casting a view content to an interface "var x = viewContent as IEditable;", | 
				
			||||
		code should use the viewContent.GetService() method. | 
				
			||||
		This allows the view content implementation to be flexible where the interface is implemented, | 
				
			||||
		it no longer is necessary to implement everything in the same class. | 
				
			||||
		 | 
				
			||||
		Interfaces that are supposed to be used as view content services are marked with the | 
				
			||||
		[ViewContentService] attribute. | 
				
			||||
		 | 
				
			||||
		In the case of the AvalonEditViewContent, all text editor and document services are | 
				
			||||
		also available via IViewContent.GetService(). | 
				
			||||
		If split view is in use, the view content will return the services from the editor that has the focus. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	XML Forms: | 
				
			||||
		Classic .xfrm still exists and can be used in SD 5.0. | 
				
			||||
		However XML forms support should be considered a temporary feature for making AddIns easier to port, | 
				
			||||
		we still plan to get rid of all .xfrms and the associated infrastructure by the time SD 5.0 ships. | 
				
			||||
		 | 
				
			||||
		Simply porting an .xfrm to a regular WinForms control with InitializeComponents() is acceptable, | 
				
			||||
		but porting it to WPF is preferred. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
What wasn't changed: | 
				
			||||
 | 
				
			||||
	SD-1234 still makes implementing view contents difficult by preventing them from loading/saving | 
				
			||||
	files when they want to. I'd like to fix this, but this likely won't fit into 5.0 and will have to wait for 5.1. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
	The IProject/ProjectItem model is mostly unchanged and still does not provide proper change notifications | 
				
			||||
	(apart from those in the static ProjectService). | 
				
			||||
	Lacking a good project model, we also haven't started moving the project browser to WPF. | 
				
			||||
	This is a major refactoring on top of the already existing major changes in 5.0, so it doesn't fit. | 
				
			||||
	But it's definitely a goal for 5.1. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
Context Actions vs. Member Context Menu: | 
				
			||||
	Members context menu should include refactoring options that can be applied from the outside, | 
				
			||||
	for example in the classes pad when the code file isn't open. | 
				
			||||
	Refactorings that don't make sense without opening the file shouldn't be in the member menu. | 
				
			||||
	 | 
				
			||||
	The context actions menu should show all refactorings (even those that are also in the members context menu). | 
				
			||||
 | 
				
			||||
Automatic Translation: | 
				
			||||
	WorkbenchSingleton.AssertMainThread() -> SD.MainThread.VerifyAccess() | 
				
			||||
	AbstractMenuCommand-derived classes that do not override IsEnabled -> SimpleCommand | 
				
			||||
@ -1,8 +0,0 @@
				@@ -1,8 +0,0 @@
					 | 
				
			||||
<SharpDevelopProperties> | 
				
			||||
  <ShowTipsAtStartup value="True" /> | 
				
			||||
  <Properties name="WorkbenchMemento"> | 
				
			||||
    <bounds value="10,10,780,560" /> | 
				
			||||
    <windowstate value="Maximized" /> | 
				
			||||
    <defaultstate value="Maximized" /> | 
				
			||||
  </Properties> | 
				
			||||
</SharpDevelopProperties> | 
				
			||||
| 
		 Before Width: | Height: | Size: 436 B After Width: | Height: | Size: 436 B  | 
| 
		 Before Width: | Height: | Size: 628 B After Width: | Height: | Size: 628 B  | 
| 
		 After Width: | Height: | Size: 663 B  | 
| 
		 After Width: | Height: | Size: 609 B  | 
| 
		 After Width: | Height: | Size: 713 B  | 
| 
		 After Width: | Height: | Size: 777 B  | 
| 
		 After Width: | Height: | Size: 729 B  | 
| 
		 After Width: | Height: | Size: 749 B  | 
| 
		 After Width: | Height: | Size: 822 B  | 
| 
		 After Width: | Height: | Size: 706 B  | 
| 
		 After Width: | Height: | Size: 525 B  | 
| 
		 After Width: | Height: | Size: 620 B  | 
| 
		 After Width: | Height: | Size: 427 B  | 
| 
		 After Width: | Height: | Size: 449 B  | 
| 
		 After Width: | Height: | Size: 436 B  | 
| 
		 Before Width: | Height: | Size: 656 B After Width: | Height: | Size: 656 B  | 
| 
		 Before Width: | Height: | Size: 786 B After Width: | Height: | Size: 786 B  | 
| 
		 Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB  | 
| 
		 Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 763 B After Width: | Height: | Size: 763 B  | 
| 
		 Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB  | 
| 
		 Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB  | 
| 
		 Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB  | 
| 
		 Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB  | 
| 
		 Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB  | 
| 
		 Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB  | 
| 
		 Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB  | 
| 
		 Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB  | 
| 
		 Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB  | 
| 
		 Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB  | 
| 
		 Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB  | 
| 
		 Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB  | 
| 
		 Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB  | 
| 
		 Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB  | 
| 
		 Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB  | 
| 
		 Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB  | 
| 
		 Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB  | 
| 
		 Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB  | 
| 
		 Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB  | 
| 
		 Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB  | 
@ -1,3 +1,3 @@
				@@ -1,3 +1,3 @@
					 | 
				
			||||
resasm BitmapResources.res | 
				
			||||
move BitmapResources.resources ..\..\..\..\Src\Main\StartUp\Project\Resources\BitmapResources.resources | 
				
			||||
move BitmapResources.resources ..\..\..\..\src\Main\SharpDevelop\Resources\BitmapResources.resources | 
				
			||||
pause | 
				
			||||
@ -1,5 +0,0 @@
				@@ -1,5 +0,0 @@
					 | 
				
			||||
<Categories> | 
				
			||||
	<Category Name="C#"> | 
				
			||||
		<Category Name="${res:Templates.File.Categories.WindowsApplications}" SortOrder="10"/> | 
				
			||||
	</Category> | 
				
			||||
</Categories> | 
				
			||||
@ -1,5 +0,0 @@
				@@ -1,5 +0,0 @@
					 | 
				
			||||
<Categories> | 
				
			||||
	<Category Name="VB"> | 
				
			||||
		<Category Name="${res:Templates.File.Categories.WindowsApplications}" SortOrder="10"/> | 
				
			||||
	</Category> | 
				
			||||
</Categories> | 
				
			||||
@ -1,5 +0,0 @@
				@@ -1,5 +0,0 @@
					 | 
				
			||||
<Categories> | 
				
			||||
	<Category Name="C#"> | 
				
			||||
		<Category Name="${res:Templates.File.Categories.WindowsApplications}" SortOrder="10"/> | 
				
			||||
	</Category> | 
				
			||||
</Categories> | 
				
			||||