diff --git a/SharpDevelop.Tests.sln b/SharpDevelop.Tests.sln
index 8e508b6a4e..0d6a23d328 100644
--- a/SharpDevelop.Tests.sln
+++ b/SharpDevelop.Tests.sln
@@ -145,6 +145,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "src\AddIns\A
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting.Tests", "src\AddIns\Analysis\UnitTesting\Test\UnitTesting.Tests.csproj", "{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortSD4AddInToSD5", "samples\PortSD4AddInToSD5\PortSD4AddInToSD5.csproj", "{E2FD63DA-8478-4066-934C-DA82A852C83A}"
+EndProject
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "src\Tools\Tools.build", "{3DF4060F-5EE0-41CF-8096-F27355FD5511}"
EndProject
Global
@@ -555,6 +557,14 @@ Global
{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}.Release|Any CPU.ActiveCfg = Release|Any CPU
{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}.Release|x86.Build.0 = Release|Any CPU
{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}.Release|x86.ActiveCfg = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|x86.Build.0 = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|x86.Build.0 = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -588,6 +598,7 @@ Global
{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{AF5E0DC1-1FA0-4346-A436-0C817C68F7C1} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{B3352C08-3CB4-4DD9-996F-B9DCE4356BB9} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
+ {E2FD63DA-8478-4066-934C-DA82A852C83A} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{83F15BA7-8478-4664-81BB-A82F146D88B3} = {F208FF4F-E5D8-41D5-A7C7-B463976F156E}
{17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {F208FF4F-E5D8-41D5-A7C7-B463976F156E}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {E0646C25-36F2-4524-969F-FA621353AB94}
diff --git a/SharpDevelop.sln b/SharpDevelop.sln
index 5f16852dfa..4c0c87a32a 100644
--- a/SharpDevelop.sln
+++ b/SharpDevelop.sln
@@ -99,6 +99,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "src\AddIns\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegExpTk", "src\AddIns\Misc\RegExpTk\Project\RegExpTk.csproj", "{64A3E5E6-90BF-47F6-94DF-68C94B62C817}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortSD4AddInToSD5", "samples\PortSD4AddInToSD5\PortSD4AddInToSD5.csproj", "{E2FD63DA-8478-4066-934C-DA82A852C83A}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
@@ -465,6 +467,14 @@ Global
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.Build.0 = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.ActiveCfg = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|x86.Build.0 = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|x86.Build.0 = Release|Any CPU
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -508,6 +518,7 @@ Global
{80F76D10-0B44-4D55-B4BD-DAEB5464090C} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{F93E52FD-DA66-4CE5-A0CB-BCD902811122} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{64A3E5E6-90BF-47F6-94DF-68C94B62C817} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
+ {E2FD63DA-8478-4066-934C-DA82A852C83A} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{6B1CFE35-DA17-4DEB-9C6E-227E5E251DA0} = {59A30AA6-D600-41AB-B7A1-9543469DBE36}
{0008FCE9-9EB4-4E2E-979B-553278E5BBA6} = {59A30AA6-D600-41AB-B7A1-9543469DBE36}
{0162E499-42D0-409B-AA25-EED21F75336B} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
diff --git a/samples/PortSD4AddInToSD5/Configuration/AssemblyInfo.cs b/samples/PortSD4AddInToSD5/Configuration/AssemblyInfo.cs
new file mode 100644
index 0000000000..5c67a9af8c
--- /dev/null
+++ b/samples/PortSD4AddInToSD5/Configuration/AssemblyInfo.cs
@@ -0,0 +1,31 @@
+#region Using directives
+
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+#endregion
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("PortSD4AddInToSD5")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("PortSD4AddInToSD5")]
+[assembly: AssemblyCopyright("Copyright 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible(false)]
+
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.*")]
diff --git a/samples/PortSD4AddInToSD5/PortSD4AddInToSD5.addin b/samples/PortSD4AddInToSD5/PortSD4AddInToSD5.addin
new file mode 100644
index 0000000000..311f184320
--- /dev/null
+++ b/samples/PortSD4AddInToSD5/PortSD4AddInToSD5.addin
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/PortSD4AddInToSD5/PortSD4AddInToSD5.csproj b/samples/PortSD4AddInToSD5/PortSD4AddInToSD5.csproj
new file mode 100644
index 0000000000..5b10f809db
--- /dev/null
+++ b/samples/PortSD4AddInToSD5/PortSD4AddInToSD5.csproj
@@ -0,0 +1,90 @@
+
+
+
+ {E2FD63DA-8478-4066-934C-DA82A852C83A}
+ Debug
+ AnyCPU
+ Library
+ PortSD4AddInToSD5
+ PortSD4AddInToSD5
+ v4.5
+ False
+ False
+ 4
+ false
+ ..\..\AddIns\
+
+
+ AnyCPU
+ False
+ Auto
+ 4194304
+ 4096
+
+
+ true
+ Full
+ False
+ True
+ DEBUG;TRACE
+
+
+ False
+ None
+ True
+ False
+ TRACE
+
+
+
+
+
+
+ 3.5
+
+
+
+ 3.5
+
+
+
+
+
+
+ 3.5
+
+
+
+
+
+ Always
+
+
+
+
+
+
+
+
+ {53DCA265-3C3C-42F9-B647-F72BA678122B}
+ ICSharpCode.NRefactory.CSharp
+ False
+
+
+ {3B2A5653-EC97-4001-BB9B-D90F1AF2C371}
+ ICSharpCode.NRefactory
+ False
+
+
+ {2748AD25-9C63-4E12-877B-4DCE96FBED54}
+ ICSharpCode.SharpDevelop
+ False
+
+
+ {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
+ ICSharpCode.Core
+ False
+
+
+
+
\ No newline at end of file
diff --git a/samples/PortSD4AddInToSD5/WorkbenchSingletonIssueProvider.cs b/samples/PortSD4AddInToSD5/WorkbenchSingletonIssueProvider.cs
new file mode 100644
index 0000000000..b450e961a1
--- /dev/null
+++ b/samples/PortSD4AddInToSD5/WorkbenchSingletonIssueProvider.cs
@@ -0,0 +1,81 @@
+/*
+ * Created by SharpDevelop.
+ * User: Daniel
+ * Date: 9/22/2012
+ * Time: 12:42 PM
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using ICSharpCode.NRefactory.CSharp;
+using ICSharpCode.NRefactory.CSharp.Refactoring;
+using ICSharpCode.NRefactory.CSharp.Resolver;
+using ICSharpCode.SharpDevelop;
+
+namespace PortSD4AddInToSD5
+{
+ [IssueDescription ("Usage of SD4 WorkbenchSingleton",
+ Description = "Usage of SD4 WorkbenchSingleton",
+ Category = IssueCategories.Notifications,
+ Severity = Severity.Warning,
+ IssueMarker = IssueMarker.Underline)]
+ public class WorkbenchSingletonIssueProvider : ICodeIssueProvider
+ {
+ public IEnumerable GetIssues (BaseRefactoringContext context)
+ {
+ foreach (var invocationExpression in context.RootNode.Descendants.OfType()) {
+ var rr = context.Resolve(invocationExpression);
+ var irr = rr as CSharpInvocationResolveResult;
+ if (irr == null)
+ continue;
+ switch (irr.Member.FullName) {
+ case "ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.AssertMainThread":
+ yield return Issue(
+ invocationExpression,
+ script => {
+ script.Replace(invocationExpression,
+ new IdentifierExpression("SD").Member("MainThread").Invoke("VerifyAccess"));
+ });
+ break;
+ case "ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.SafeThreadAsyncCall":
+ if (invocationExpression.Arguments.Count == 1) {
+ // SD.MainThread.InvokeAsync(argument).FireAndForget();
+ yield return Issue(
+ invocationExpression,
+ script => {
+ script.Replace(invocationExpression,
+ new IdentifierExpression("SD").Member("MainThread")
+ .Invoke("InvokeAsync", invocationExpression.Arguments.Single().Clone())
+ .Invoke("FireAndForget"));
+ });
+ } else {
+ yield return Issue(invocationExpression);
+ }
+ break;
+ case "ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.SafeThreadCall":
+ case "ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.SafeThreadFunction":
+ if (invocationExpression.Arguments.Count == 1) {
+ // SD.MainThread.InvokeIfRequired(argument);
+ yield return Issue(
+ invocationExpression,
+ script => {
+ script.Replace(invocationExpression.Target,
+ new IdentifierExpression("SD").Member("MainThread").Member("InvokeIfRequired"));
+ });
+ } else {
+ yield return Issue(invocationExpression);
+ }
+ break;
+ }
+ }
+ }
+
+ CodeIssue Issue(AstNode node, Action