Author: spouliot
Date: 2008-01-21 09:19:26 -0500 (Mon, 21 Jan 2008)
New Revision: 93391

Added:
   
trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/UseSTAThreadAttributeOnSWFEntryPointsRule.cs
Modified:
   trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/ChangeLog
   trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Gendarme.Rules.Ui.xml.in
   trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Makefile.am
Log:
2008-01-21  Sebastien Pouliot  <[EMAIL PROTECTED]>

        * UseSTAThreadAttributeOnSWFEntryPointsRule.cs: New. Rule to check
        that SWF apps have the [STAThread] attribute on their entry point.
        [Daniel Abramov]
        * Makefile.am: Add rule and test to the build.
        * Gendarme.Rules.Ui.xml.in: Add rule description.



Modified: trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/ChangeLog
===================================================================
--- trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/ChangeLog      2008-01-21 
14:18:41 UTC (rev 93390)
+++ trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/ChangeLog      2008-01-21 
14:19:26 UTC (rev 93391)
@@ -1,3 +1,11 @@
+2008-01-21  Sebastien Pouliot  <[EMAIL PROTECTED]>
+
+       * UseSTAThreadAttributeOnSWFEntryPointsRule.cs: New. Rule to check
+       that SWF apps have the [STAThread] attribute on their entry point.
+       [Daniel Abramov]
+       * Makefile.am: Add rule and test to the build.
+       * Gendarme.Rules.Ui.xml.in: Add rule description.
+
 2007-11-29  Sebastien Pouliot  <[EMAIL PROTECTED]>
 
        * ExecutableTargetRule.cs: Move assembly reference checking code in

Modified: trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Gendarme.Rules.Ui.xml.in
===================================================================
--- trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Gendarme.Rules.Ui.xml.in       
2008-01-21 14:18:41 UTC (rev 93390)
+++ trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Gendarme.Rules.Ui.xml.in       
2008-01-21 14:19:26 UTC (rev 93391)
@@ -11,4 +11,10 @@
                <problem>The assembly '{0}' refers to System.Windows.Forms 
assembly but isn't compiled using /target:winexe. A console windows will be 
shown under Windows.</problem>
                <solution>Recompile the assembly using /target:winexe</solution>
        </rule>
+       <rule   Name="UseSTAThreadAttributeOnSWFEntryPointsRule" 
+               
Type="Gendarme.Rules.Ui.UseSTAThreadAttributeOnSWFEntryPointsRule, 
Gendarme.Rules.Ui, [EMAIL PROTECTED]@, Culture=neutral, PublicKeyToken=null"
+               
Uri="http://www.mono-project.com/Gendarme#UseSTAThreadAttributeOnSWFEntryPointsRule";
 >
+               <problem>The System.Windows.Forms applications '{0}' 
entry-point (Main) is missing an [STAThread] attribute.</problem>
+               <solution>Add a [STAThread] attribute to your application Main 
method.</solution>
+       </rule>
 </rules>

Modified: trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Makefile.am
===================================================================
--- trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Makefile.am    2008-01-21 
14:18:41 UTC (rev 93390)
+++ trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/Makefile.am    2008-01-21 
14:19:26 UTC (rev 93391)
@@ -10,7 +10,7 @@
 ui_rules_sources_in = ../../AssemblyInfo.cs.in
 ui_rules_generated_sources = $(ui_rules_sources_in:.in=)
 ui_rules_sources = ExecutableTargetRule.cs GtkSharpExecutableTargetRule.cs \
-       SystemWindowsFormsExecutableTargetRule.cs
+       SystemWindowsFormsExecutableTargetRule.cs 
UseSTAThreadAttributeOnSWFEntryPointsRule.cs
 
 ui_rules_build_sources = $(addprefix $(srcdir)/, $(ui_rules_sources))
 ui_rules_build_sources += $(ui_rules_generated_sources)
@@ -34,7 +34,7 @@
        done;
 
 ui_test_sources = ExecutableTargetTest.cs GtkSharpExecutableTargetTest.cs \
-       SystemWindowsFormsExecutableTargetTest.cs
+       SystemWindowsFormsExecutableTargetTest.cs 
UseSTAThreadAttributeOnSWFEntryPointsTest.cs
 
 ui_test_build_sources = $(addprefix $(srcdir)/Test/, $(ui_test_sources))
 

Added: 
trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/UseSTAThreadAttributeOnSWFEntryPointsRule.cs
===================================================================
--- 
trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/UseSTAThreadAttributeOnSWFEntryPointsRule.cs
   2008-01-21 14:18:41 UTC (rev 93390)
+++ 
trunk/cecil/gendarme/rules/Gendarme.Rules.Ui/UseSTAThreadAttributeOnSWFEntryPointsRule.cs
   2008-01-21 14:19:26 UTC (rev 93391)
@@ -0,0 +1,79 @@
+//
+// Gendarme.Rules.UI.UseSTAThreadAttributeOnSWFEntryPointsRule
+//
+// Authors:
+//     Daniel Abramov <[EMAIL PROTECTED]>
+//
+//  (C) 2008 Daniel Abramov
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+
+using Gendarme.Framework;
+using Gendarme.Framework.Rocks;
+
+using Mono.Cecil;
+
+namespace Gendarme.Rules.UI {
+
+       public class UseSTAThreadAttributeOnSWFEntryPointsRule : IAssemblyRule {
+               private const string SystemWindowsForms = 
"System.Windows.Forms";
+
+               private const string STAThread = "System.STAThreadAttribute";
+               private const string MTAThread = "System.MTAThreadAttribute";
+
+               public MessageCollection CheckAssembly (AssemblyDefinition 
assembly, Runner runner)
+               {
+                       if (assembly.EntryPoint == null)
+                               return runner.RuleSuccess;
+
+                       bool referencesSWF = false;
+                       foreach (AssemblyNameReference assRef in 
assembly.MainModule.AssemblyReferences) {
+                               if (assRef.Name == SystemWindowsForms) { // SWF 
referenced
+                                       referencesSWF = true;
+                                       break;
+                               }
+                       }
+
+                       if (!referencesSWF)
+                               return runner.RuleSuccess;
+
+                       MethodDefinition entryPoint = assembly.EntryPoint;
+                       bool hasSTA = entryPoint.HasAttribute (STAThread);
+                       bool hasMTA = entryPoint.HasAttribute (MTAThread);
+
+                       if (hasSTA && !hasMTA)
+                               return runner.RuleSuccess;
+
+                       string text = string.Empty;
+                       if (!hasSTA && hasMTA)
+                               text = "In order for Windows Forms to work 
properly, replace [System.MTAThread] attribute with [System.STAThread] on the 
entry point.";
+                       else if (hasSTA && hasMTA)
+                               text = "In order for Windows Forms to work 
properly, remove [System.MTAThread] attribute from the entry point, leaving 
[System.STAThread] there.";
+                       else if (!hasSTA && !hasMTA)
+                               text = "In order for Windows Forms to work 
properly, place [System.STAThread] attribute upon the entry point.";
+
+                       Location loc = new Location (entryPoint);
+                       Message msg = new Message (text, loc, 
MessageType.Error);
+                       return new MessageCollection (msg);
+               }
+       }
+}

_______________________________________________
Mono-patches maillist  -  Mono-patches@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to