[packages/mono-tools] - updated to 3.10 - removed obsolete git patch - added build patch (don't try to install non-existin
qboosh
qboosh at pld-linux.org
Tue Nov 25 18:53:35 CET 2014
commit 7dd103429b4c3275e73bb6035cdaff037e130d18
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date: Tue Nov 25 18:53:32 2014 +0100
- updated to 3.10
- removed obsolete git patch
- added build patch (don't try to install non-existing files)
mono-tools-build.patch | 40 +
mono-tools-git-partial.diff | 28420 ------------------------------------------
mono-tools.spec | 20 +-
3 files changed, 51 insertions(+), 28429 deletions(-)
---
diff --git a/mono-tools.spec b/mono-tools.spec
index 8318203..f707ea0 100644
--- a/mono-tools.spec
+++ b/mono-tools.spec
@@ -1,32 +1,34 @@
-# NOTE: upstream 2.11 tarball is broken; it seems 2.11 isn't finished yet
#
# Conditional build:
-%bcond_with gecko # don't build gecko html renderer
+%bcond_with gecko # gecko html renderer
#
%include /usr/lib/rpm/macros.mono
Summary: Mono Tools
Summary(pl.UTF-8): Narzędzia do mono
Name: mono-tools
-Version: 2.10
-Release: 6
+Version: 3.10
+Release: 1
License: GPL v2+
Group: Development/Tools
-Source0: http://download.mono-project.com/sources/mono-tools/%{name}-%{version}.tar.bz2
-# Source0-md5: da178df2c119c696c08c09dc9eb01994
-Patch0: %{name}-git-partial.diff
+#Source0: http://download.mono-project.com/sources/mono-tools/%{name}-%{version}.tar.gz
+# 3.10 tarball is broken, temporarily use github
+Source0: https://github.com/mono/mono-tools/archive/%{version}/%{name}-%{version}.tar.gz
+# Source0-md5: 8df1eed41d5ff6dc6d48541f1c593319
+Patch0: %{name}-build.patch
Patch1: %{name}-pwd.patch
Patch2: %{name}-configure.patch
Patch3: %{name}-sdkver.patch
URL: http://www.mono-project.com/
BuildRequires: autoconf
BuildRequires: automake
+BuildRequires: dotnet-gconf-sharp-devel >= 2.16.0
%{?with_gecko:BuildRequires: dotnet-gecko-sharp2-devel >= 0.12}
-BuildRequires: dotnet-gnome-desktop-sharp-devel
BuildRequires: dotnet-gnome-sharp-devel >= 2.16.0
+# gtk-sharp-2.0, glade-sharp-2.0
BuildRequires: dotnet-gtk-sharp2-devel
BuildRequires: dotnet-webkit-sharp-devel >= 0.2-1
BuildRequires: gettext-devel
-BuildRequires: glib2-devel
+BuildRequires: glib2-devel >= 2.0
BuildRequires: libgdiplus
BuildRequires: mono-compat-links
BuildRequires: mono-csharp
diff --git a/mono-tools-build.patch b/mono-tools-build.patch
new file mode 100644
index 0000000..462e0ce
--- /dev/null
+++ b/mono-tools-build.patch
@@ -0,0 +1,40 @@
+--- mono-tools-3.10/webdoc/Makefile.am.orig 2014-10-04 11:56:43.000000000 +0200
++++ mono-tools-3.10/webdoc/Makefile.am 2014-11-25 16:44:07.806396575 +0100
+@@ -22,18 +22,13 @@
+ $(wildcard App_Code/Plugins/*.cs) \
+ $(wildcard views/*.css) \
+ $(wildcard views/*.js) \
+- $(wildcard views/*.html) \
+ $(wildcard views/images/*.png) \
+- $(wildcard views/images/*.gif) \
+ $(wildcard skins/mono-external/header*) \
+ $(wildcard skins/mono-external/footer*) \
+ $(wildcard skins/mono-external/*.css) \
+- $(wildcard skins/mono-external/*.js) \
+ $(wildcard skins/mono-external/images/*.png) \
+ $(wildcard skins/mono-external/images/*.gif) \
+ $(wildcard plugins/iframe-plugin/*.js) \
+- $(wildcard plugins/iframe-plugin/*.css) \
+- $(wildcard plugins/iframe-plugin/*.html) \
+ $(wildcard plugins/tooltip-plugin/*.js) \
+ $(wildcard plugins/sidebar-plugin/*.js) \
+ $(wildcard plugins/sidebar-plugin/*.css) \
+@@ -117,18 +116,13 @@
+ $(INSTALL_DATA) $(srcdir)/App_Code/Plugins/*cs $(DESTDIR)$(webdir)/App_Code/Plugins
+ $(INSTALL_DATA) $(srcdir)/views/*css $(DESTDIR)$(webdir)/views
+ $(INSTALL_DATA) $(srcdir)/views/*js $(DESTDIR)$(webdir)/views
+- $(INSTALL_DATA) $(srcdir)/views/*html $(DESTDIR)$(webdir)/views
+ $(INSTALL_DATA) $(srcdir)/views/images/*png $(DESTDIR)$(webdir)/views/images
+- $(INSTALL_DATA) $(srcdir)/views/images/*gif $(DESTDIR)$(webdir)/views/images
+ $(INSTALL_DATA) $(srcdir)/skins/mono-external/header* $(DESTDIR)$(webdir)/skins/mono-external
+ $(INSTALL_DATA) $(srcdir)/skins/mono-external/footer* $(DESTDIR)$(webdir)/skins/mono-external
+ $(INSTALL_DATA) $(srcdir)/skins/mono-external/*css $(DESTDIR)$(webdir)/skins/mono-external
+- $(INSTALL_DATA) $(srcdir)/skins/mono-external/*js $(DESTDIR)$(webdir)/skins/mono-external
+ $(INSTALL_DATA) $(srcdir)/skins/mono-external/images/*png $(DESTDIR)$(webdir)/skins/mono-external/images
+ $(INSTALL_DATA) $(srcdir)/skins/mono-external/images/*gif $(DESTDIR)$(webdir)/skins/mono-external/images
+- $(INSTALL_DATA) $(srcdir)/plugins/iframe-plugins/*css $(DESTDIR)$(webdir)/plugins/iframe-plugin
+ $(INSTALL_DATA) $(srcdir)/plugins/iframe-plugin/*js $(DESTDIR)$(webdir)/plugins/iframe-plugin
+- $(INSTALL_DATA) $(srcdir)/plugins/iframe-plugin/*html $(DESTDIR)$(webdir)/plugins/iframe-plugin
+ $(INSTALL_DATA) $(srcdir)/plugins/tooltip-plugin/*js $(DESTDIR)$(webdir)/plugins/tooltip-plugin
+ $(INSTALL_DATA) $(srcdir)/plugins/sidebar-plugin/*css $(DESTDIR)$(webdir)/plugins/sidebar-plugin
+ $(INSTALL_DATA) $(srcdir)/plugins/sidebar-plugin/*js $(DESTDIR)$(webdir)/plugins/sidebar-plugin
diff --git a/mono-tools-git-partial.diff b/mono-tools-git-partial.diff
deleted file mode 100644
index d6f8baf..0000000
--- a/mono-tools-git-partial.diff
+++ /dev/null
@@ -1,28420 +0,0 @@
-diff --git a/Mono.Profiler/Mono.Profiler.Widgets/Makefile.am b/Mono.Profiler/Mono.Profiler.Widgets/Makefile.am
-index 7b91e6b..f0bf1ec 100644
---- a/Mono.Profiler/Mono.Profiler.Widgets/Makefile.am
-+++ b/Mono.Profiler/Mono.Profiler.Widgets/Makefile.am
-@@ -9,7 +9,8 @@ CSFLAGS = -noconfig -codepage:utf8 -warn:4
- ASSEMBLY_MDB =
- endif
-
--pkglib_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-+programfilesdir = $(pkglibdir)
-+programfiles_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-
- CLEANFILES = $(ASSEMBLY) $(ASSEMBLY_MDB)
-
-diff --git a/Mono.Profiler/heap-snapshot-explorer/Makefile.am b/Mono.Profiler/heap-snapshot-explorer/Makefile.am
-index 2bb2401..a9f34a3 100644
---- a/Mono.Profiler/heap-snapshot-explorer/Makefile.am
-+++ b/Mono.Profiler/heap-snapshot-explorer/Makefile.am
-@@ -9,7 +9,8 @@ CSFLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+
- ASSEMBLY_MDB =
- endif
-
--pkglib_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-+programfilesdir = $(pkglibdir)
-+programfiles_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-
- CLEANFILES = $(ASSEMBLY) $(ASSEMBLY_MDB)
-
-diff --git a/Mono.Profiler/heap-snapshot-viewer/Makefile.am b/Mono.Profiler/heap-snapshot-viewer/Makefile.am
-index 3b488be..f7b0888 100644
---- a/Mono.Profiler/heap-snapshot-viewer/Makefile.am
-+++ b/Mono.Profiler/heap-snapshot-viewer/Makefile.am
-@@ -8,7 +8,8 @@ CSFLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+
- ASSEMBLY_MDB =
- endif
-
--pkglib_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-+programfilesdir = $(pkglibdir)
-+programfiles_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
- bin_SCRIPTS = mprof-heap-viewer
- man_MANS=man/man1/mprof-heap-viewer.1
-
-diff --git a/Mono.Profiler/mprof-gui/Makefile.am b/Mono.Profiler/mprof-gui/Makefile.am
-index 5b00ea9..0369c2c 100644
---- a/Mono.Profiler/mprof-gui/Makefile.am
-+++ b/Mono.Profiler/mprof-gui/Makefile.am
-@@ -8,7 +8,8 @@ CSFLAGS = -noconfig -codepage:utf8 -warn:4
- ASSEMBLY_MDB =
- endif
-
--pkglib_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-+programfilesdir = $(pkglibdir)
-+programfiles_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
- bin_SCRIPTS = emveepee
-
- CLEANFILES = $(ASSEMBLY) $(ASSEMBLY_MDB)
-diff --git a/Mono.Profiler/profiler-decoder-library/Makefile.am b/Mono.Profiler/profiler-decoder-library/Makefile.am
-index 115f1a7..71d49ac 100644
---- a/Mono.Profiler/profiler-decoder-library/Makefile.am
-+++ b/Mono.Profiler/profiler-decoder-library/Makefile.am
-@@ -9,7 +9,8 @@ CSFLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+
- ASSEMBLY_MDB =
- endif
-
--pkglib_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-+programfilesdir = $(pkglibdir)
-+programfiles_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-
- CLEANFILES = $(ASSEMBLY) $(ASSEMBLY_MDB)
-
-diff --git a/Mono.Profiler/profiler-file-decoder/Makefile.am b/Mono.Profiler/profiler-file-decoder/Makefile.am
-index 285267f..2365dc7 100644
---- a/Mono.Profiler/profiler-file-decoder/Makefile.am
-+++ b/Mono.Profiler/profiler-file-decoder/Makefile.am
-@@ -9,7 +9,8 @@ CSFLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+
- ASSEMBLY_MDB =
- endif
-
--pkglib_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
-+programfilesdir = $(pkglibdir)
-+programfiles_DATA = $(ASSEMBLY) $(ASSEMBLY_MDB)
- bin_SCRIPTS = mprof-decoder
- man_MANS = man/man1/mprof-decoder.1
-
-diff --git a/README b/README
-index 3ad3752..a01a518 100644
---- a/README
-+++ b/README
-@@ -23,3 +23,12 @@ automatically executed):
- make
- make install
-
-+Building on OSX with homebrew:
-+------------------------------
-+
-+Have the following packages installed:
-+autoconf pkg-config readline automake gettext glib intltool libtool
-+
-+Run autogen like this:
-+PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/ ./autogen.sh
-+
-diff --git a/configure.in b/configure.in
-index 2a8870f..4771a2e 100644
---- a/configure.in
-+++ b/configure.in
-@@ -1,4 +1,4 @@
--AC_INIT([mono-tools], [2.10])
-+AC_INIT([mono-tools], [2.11])
- AC_CONFIG_SRCDIR([README])
- AC_CANONICAL_SYSTEM
- AM_INIT_AUTOMAKE([tar-ustar -Wno-portability])
-@@ -272,6 +272,7 @@ gendarme/swf-wizard-runner/Makefile
- gendarme/tools/Makefile
- gendarme/tools/supported/Makefile
- gendarme/tools/supported/gd2i/Makefile
-+gendarme/tools/supported/templates/Makefile
- gendarme/tools/unsupported/Makefile
- gendarme/tools/unsupported/mapper/Makefile
- gendarme/tools/unsupported/typeref/Makefile
-diff --git a/docbrowser/Makefile.am b/docbrowser/Makefile.am
-index a1a2626..065c430 100644
---- a/docbrowser/Makefile.am
-+++ b/docbrowser/Makefile.am
-@@ -40,6 +40,7 @@ browser_sources = \
- $(srcdir)/list.cs \
- $(srcdir)/elabel.cs \
- $(srcdir)/history.cs \
-+ $(srcdir)/editing.cs \
- $(srcdir)/Contributions.cs \
- $(srcdir)/XmlNodeWriter.cs \
- $(srcdir)/IHtmlRender.cs \
-@@ -67,7 +68,7 @@ admin_sources = \
- $(srcdir)/admin.cs \
- $(srcdir)/Contributions.cs
-
--browser_assemblies = $(GTK_SHARP_LIBS) $(MONODOC_LIBS) $(GNOME_SHARP_LIBS) -r:System.Web.Services
-+browser_assemblies = $(GTK_SHARP_LIBS) $(MONODOC_LIBS) $(GNOME_SHARP_LIBS) -r:System.Web.Services -r:System.Web
- # we insert gtkhtml libs if we have them for printing
- geckorender_assemblies = $(GTK_SHARP_LIBS) $(GTKHTML_SHARP_LIBS) $(GECKO_SHARP_LIBS) $(GNOME_SHARP_LIBS) $(MONODOC_LIBS) -r:browser.exe
- gtkhtmlrender_assemblies = $(GTK_SHARP_LIBS) $(GTKHTML_SHARP_LIBS) $(GNOME_SHARP_LIBS) $(MONODOC_LIBS) -r:browser.exe
-diff --git a/docbrowser/browser.cs b/docbrowser/browser.cs
-index 5cc85e2..b9eb66f 100644
---- a/docbrowser/browser.cs
-+++ b/docbrowser/browser.cs
-@@ -60,7 +60,7 @@ class Driver {
- v => sources.Add (v) },
- { "edit=",
- "Edit mdoc(5) XML documentation found within {PATH}.",
-- v => RootTree.UncompiledHelpSources.Add (v) },
-+ v => RootTree.AddUncompiledSource (v) },
- { "engine=",
- "Specify which HTML rendering {ENGINE} to use:\n" +
- " " + string.Join ("\n ", engines) + "\n" +
-@@ -119,6 +119,9 @@ class Driver {
-
- List<string> topics = p.Parse (args);
-
-+ if (basedir == null)
-+ basedir = Directory.GetParent (System.Reflection.Assembly.GetExecutingAssembly ().Location).FullName;
-+
- if (show_version) {
- Console.WriteLine ("Mono Documentation Browser");
- Version ver = Assembly.GetExecutingAssembly ().GetName ().Version;
-@@ -132,7 +135,7 @@ class Driver {
- return r;
- }
-
-- if (mergeConfigFile != null) {
-+ /*if (mergeConfigFile != null) {
- ArrayList targetDirs = new ArrayList ();
-
- for (int i = 0; i < topics.Count; i++)
-@@ -145,7 +148,7 @@ class Driver {
-
- e.Merge ();
- return 0;
-- }
-+ }*/
-
- if (r != 0 || !show_gui)
- return r;
-@@ -257,6 +260,7 @@ public class Browser {
- TreeView search_tree;
- TreeStore search_store;
- SearchableIndex search_index;
-+ ArrayList searchResults = new ArrayList (20);
- string highlight_text;
- [Glade.Widget] VBox search_vbox;
- ProgressPanel ppanel;
-@@ -578,6 +582,7 @@ public class Browser {
- Result r = search_index.Search (term);
- if (r == null)
- return; //There was a problem with the index
-+ searchResults.Add (r);
- //insert the results in the tree
- TreeIter iter;
-
-@@ -622,7 +627,7 @@ public class Browser {
- return;
- int i_0 = p.Indices [0];
- int i_1 = p.Indices [1];
-- Result res = (Result) search_index.Results [i_0];
-+ Result res = (Result) searchResults [i_0];
- TreeIter parent;
- model.IterParent (out parent, iter);
- string term = (string) search_store.GetValue (parent, 0);
-@@ -648,21 +653,21 @@ public class Browser {
- void TextLarger (object obj, EventArgs args)
- {
- SettingsHandler.Settings.preferred_font_size += 10;
-- HelpSource.CssCode = null;
-+ //HelpSource.CssCode = null;
- Reload ();
- SettingsHandler.Save ();
- }
- void TextSmaller (object obj, EventArgs args)
- {
- SettingsHandler.Settings.preferred_font_size -= 10;
-- HelpSource.CssCode = null;
-+ //HelpSource.CssCode = null;
- Reload ();
- SettingsHandler.Save ();
- }
- void TextNormal (object obj, EventArgs args)
- {
- SettingsHandler.Settings.preferred_font_size = 100;
-- HelpSource.CssCode = null;
-+ //HelpSource.CssCode = null;
- Reload ();
- SettingsHandler.Save ();
- }
-@@ -733,6 +738,15 @@ public class Browser {
-
- Node node;
-
-+ /*
-+ * The webkit library converts the url titles (N:, T:, etc.) to lower case (n:, t:, etc.)
-+ * when clicking on a link. Therefore we need to convert them to upper case, since the
-+ * monodoc backend only understands upper case titles (except for root:, afaik).
-+ */
-+ string[] urlParts = url.Split (':');
-+ if (urlParts [0].Length == 1)
-+ url = urlParts [0].ToUpper () + url.Substring (1);
-+
- Console.Error.WriteLine ("Trying: {0}", url);
- try {
- string res = Browser.GetHtml (url, null, help_tree, out node);
-@@ -785,8 +799,8 @@ public class Browser {
- //
- string tabTitle;
- tabTitle = matched_node.Caption; //Normal title
-- string[] parts = matched_node.URL.Split('/', '#');
-- if(matched_node.URL != null && matched_node.URL.StartsWith("ecma:")) {
-+ string[] parts = matched_node.PublicUrl.Split('/', '#');
-+ if(matched_node.PublicUrl != null && matched_node.PublicUrl.StartsWith("ecma:")) {
- if(parts.Length == 3 && parts[2] != String.Empty) { //List of Members, properties, events, ...
- tabTitle = parts[1] + ": " + matched_node.Caption;
- } else if(parts.Length >= 4) { //Showing a concrete Member, property, ...
-@@ -937,6 +951,7 @@ ExtLoop:
- void delete_event_cb (object o, DeleteEventArgs args)
- {
- Application.Quit ();
-+ args.RetVal = true;
- }
- void on_print_activate (object sender, EventArgs e)
- {
-@@ -1691,7 +1706,7 @@ ExtLoop:
-
- void OnOkClicked (object sender, EventArgs a)
- {
-- CommentService service = new CommentService();
-+ //CommentService service = new CommentService();
- // todo
- newcomment.Hide ();
- }
-@@ -2010,7 +2025,7 @@ public class TreeBrowser {
- if (tree_view.Selection.GetSelected (out model, out iter)){
- Node n = (Node) iter_to_node [iter];
-
-- string url = n.URL;
-+ string url = n.PublicUrl;
- Node match;
- string s;
-
-@@ -2038,7 +2053,7 @@ public class TreeBrowser {
- return;
- }
-
-- ((Browser)browser).Render ("<h1>Unhandled URL</h1>" + "<p>Functionality to view the resource <i>" + n.URL + "</i> is not available on your system or has not yet been implemented.</p>", null, url);
-+ ((Browser)browser).Render ("<h1>Unhandled URL</h1>" + "<p>Functionality to view the resource <i>" + n.PublicUrl + "</i> is not available on your system or has not yet been implemented.</p>", null, url);
- }
- }
- }
-@@ -2702,7 +2717,7 @@ public class Tab : Notebook {
- string [] uSplit = EditingUtils.ParseEditUrl (edit_url);
-
- if (uSplit[0].StartsWith ("monodoc:"))
-- EditingUtils.SaveChange (edit_url, browser.help_tree, edit_node, EcmaHelpSource.GetNiceUrl (browser.CurrentTab.CurrentNode));
-+ EditingUtils.SaveChange (edit_url, browser.help_tree, edit_node, GetNiceUrl (browser.CurrentTab.CurrentNode));
- else if (uSplit[0].StartsWith ("file:"))
- EditingUtils.SaveChange (edit_url, browser.help_tree, edit_node, String.Empty);
- else
-@@ -2711,6 +2726,49 @@ public class Tab : Notebook {
- history.ActivateCurrent ();
- }
-
-+ public static string GetNiceUrl (Node node) {
-+ if (node.Element.StartsWith("N:"))
-+ return node.Element;
-+ string name, full;
-+ int bk_pos = node.Caption.IndexOf (' ');
-+ // node from an overview
-+ if (bk_pos != -1) {
-+ name = node.Caption.Substring (0, bk_pos);
-+ full = node.Parent.Caption + "." + name.Replace ('.', '+');
-+ return "T:" + full;
-+ }
-+ // node that lists constructors, methods, fields, ...
-+ if ((node.Caption == "Constructors") || (node.Caption == "Fields") || (node.Caption == "Events")
-+ || (node.Caption == "Members") || (node.Caption == "Properties") || (node.Caption == "Methods")
-+ || (node.Caption == "Operators")) {
-+ bk_pos = node.Parent.Caption.IndexOf (' ');
-+ name = node.Parent.Caption.Substring (0, bk_pos);
-+ full = node.Parent.Parent.Caption + "." + name.Replace ('.', '+');
-+ return "T:" + full + "/" + node.Element;
-+ }
-+ int pr_pos = node.Caption.IndexOf ('(');
-+ // node from a constructor
-+ if (node.Parent.Element == "C") {
-+ name = node.Parent.Parent.Parent.Caption;
-+ int idx = node.PublicUrl.IndexOf ('/');
-+ return node.PublicUrl[idx+1] + ":" + name + "." + node.Caption.Replace ('.', '+');
-+ // node from a method with one signature, field, property, operator
-+ } else if (pr_pos == -1) {
-+ bk_pos = node.Parent.Parent.Caption.IndexOf (' ');
-+ name = node.Parent.Parent.Caption.Substring (0, bk_pos);
-+ full = node.Parent.Parent.Parent.Caption + "." + name.Replace ('.', '+');
-+ int idx = node.PublicUrl.IndexOf ('/');
-+ return node.PublicUrl[idx+1] + ":" + full + "." + node.Caption;
-+ // node from a method with several signatures
-+ } else {
-+ bk_pos = node.Parent.Parent.Parent.Caption.IndexOf (' ');
-+ name = node.Parent.Parent.Parent.Caption.Substring (0, bk_pos);
-+ full = node.Parent.Parent.Parent.Parent.Caption + "." + name.Replace ('.', '+');
-+ int idx = node.PublicUrl.IndexOf ('/');
-+ return node.PublicUrl[idx+1] + ":" + full + "." + node.Caption;
-+ }
-+ }
-+
- void OnCancelEdits (object sender, EventArgs a)
- {
- SetMode (Mode.Viewer);
-@@ -2737,6 +2795,7 @@ public class Tab : Notebook {
-
- StringWriter sw = new StringWriter ();
- XmlWriter w = new XmlTextWriter (sw);
-+ var converter = new Monodoc.Generators.Html.Ecma2Html ();
-
- try {
- edit_node.InnerXml = text_editor.Buffer.Text;
-@@ -2750,7 +2809,7 @@ public class Tab : Notebook {
- }
- browser.statusbar.Pop (browser.context_id);
- browser.statusbar.Push (browser.context_id, "XML OK");
-- string s = HelpSource.BuildHtml (EcmaHelpSource.css_ecma_code, sw.ToString ());
-+ string s = converter.Export (sw.ToString (), new Dictionary<string, string> ());
- html_preview.Render(s);
-
- return false;
-diff --git a/docbrowser/editing.cs b/docbrowser/editing.cs
-new file mode 100644
-index 0000000..d7c1e32
---- /dev/null
-+++ b/docbrowser/editing.cs
-@@ -0,0 +1,519 @@
-+//
-+// editing.cs
-+//
-+// Author:
-+// Ben Maurer (bmaurer at users.sourceforge.net)
-+//
-+// (C) 2003 Ben Maurer
-+//
-+
-+using System;
-+using System.Collections;
-+using System.Collections.Specialized;
-+using System.IO;
-+using System.Text;
-+using System.Xml;
-+using System.Xml.Serialization;
-+using System.Xml.XPath;
-+using System.Web;
-+
-+namespace Monodoc {
-+ public class EditingUtils {
-+
-+ public static string FormatEditUri (string document_identifier, string xpath)
-+ {
-+ return String.Format ("edit:{0}@{1}", HttpUtility.UrlEncode (document_identifier),
-+ HttpUtility.UrlEncode (xpath));
-+ }
-+
-+ public static string GetXPath (XPathNavigator n)
-+ {
-+ switch (n.NodeType) {
-+ case XPathNodeType.Root: return "/";
-+ case XPathNodeType.Attribute: {
-+ string ret = "@" + n.Name;
-+ n.MoveToParent ();
-+ string s = GetXPath (n);
-+ return s + (s == "/" ? "" : "/") + ret;
-+ }
-+
-+ case XPathNodeType.Element: {
-+ string ret = n.Name;
-+ int i = 1;
-+ while (n.MoveToPrevious ()) {
-+ if (n.NodeType == XPathNodeType.Element && n.Name == ret)
-+ i++;
-+ }
-+ ret += "[" + i + "]";
-+ if (n.MoveToParent ()) {
-+ string s = GetXPath (n);
-+ return s + (s == "/" ? "" : "/") + ret;
-+ }
-+ }
-+ break;
-+ }
-+ throw new Exception ("node type not supported for editing");
-+
-+ }
-+
-+ public static XmlNode GetNodeFromUrl (string url, RootTree tree)
-+ {
-+ Console.WriteLine ("Url is: {0}", url);
-+ string [] uSplit = ParseEditUrl (url);
-+ Console.WriteLine ("Results are: {0}\n{1}\n{2}", uSplit [0], uSplit [1], uSplit [2]);
-+
-+ string xp = uSplit [2];
-+ string id = uSplit [1];
-+
-+ XmlDocument d;
-+
-+ if (uSplit[0].StartsWith("monodoc:///")) {
-+ int prov = int.Parse (uSplit [0].Substring("monodoc:///".Length));
-+ d = tree.GetHelpSourceFromId (prov).GetHelpXmlWithChanges (id);
-+ } else if (uSplit[0].StartsWith("file:")) {
-+ d = new XmlDocument();
-+ d.PreserveWhitespace = true;
-+ d.Load(uSplit[0].Substring(5));
-+ } else {
-+ throw new NotImplementedException("Don't know how to load " + url);
-+ }
-+
-+ return d.SelectSingleNode (xp);
-+
-+ }
-+
-+ public static void SaveChange (string url, RootTree tree, XmlNode node, string node_url)
-+ {
-+ /*string [] uSplit = ParseEditUrl (url);
-+
-+ string xp = uSplit [2];
-+ string id = uSplit [1];
-+
-+ if (uSplit[0].StartsWith("monodoc:///")) {
-+ int prov = int.Parse (uSplit [0].Substring("monodoc:///".Length));
-+ HelpSource hs = tree.GetHelpSourceFromId (prov);
-+
-+ changes.AddChange (hs.Name, hs.GetRealPath (id), xp, node, node_url);
-+ changes.Save ();
-+ } else if (uSplit[0].StartsWith("file:")) {
-+ uSplit[0] = uSplit[0].Substring(5);
-+
-+ XmlDocument d = new XmlDocument();
-+ d.PreserveWhitespace = true;
-+ d.Load(uSplit[0]);
-+
-+ XmlNode original = d.SelectSingleNode(xp);
-+ original.ParentNode.ReplaceChild(d.ImportNode(node, true), original);
-+
-+ d.Save(uSplit[0]);
-+ } else {
-+ throw new NotImplementedException("Don't know how to save to " + url);
-+ }*/
-+ }
-+
-+ public static void RemoveChange (string url, RootTree tree)
-+ {
-+ /*string [] uSplit = ParseEditUrl (url);
-+
-+ string xp = uSplit [2];
-+ string id = uSplit [1];
-+
-+ if (uSplit[0].StartsWith("monodoc:///")) {
-+ int prov = int.Parse (uSplit [0].Substring("monodoc:///".Length));
-+ HelpSource hs = tree.GetHelpSourceFromId (prov);
-+
-+ changes.RemoveChange (hs.Name, hs.GetRealPath (id), xp);
-+ changes.Save ();
-+ } else if (uSplit[0].StartsWith("file:")) {
-+ //TODO: Not implemented
-+ }*/
-+ }
-+
-+ public static void RenderEditPreview (string url, RootTree tree, XmlNode new_node, XmlWriter w)
-+ {
-+ string [] uSplit = ParseEditUrl (url);
-+
-+ if (uSplit[0].StartsWith("monodoc:///")) {
-+ int prov = int.Parse (uSplit [0].Substring("monodoc:///".Length));
-+ HelpSource hs = tree.GetHelpSourceFromId (prov);
-+ hs.RenderPreviewDocs (new_node, w);
-+ } else {
-+ foreach (HelpSource hs in tree.HelpSources) {
-+ if (hs is Monodoc.Providers.EcmaUncompiledHelpSource) {
-+ // It doesn't matter which EcmaHelpSource is chosen.
-+ hs.RenderPreviewDocs (new_node, w);
-+ break;
-+ }
-+ }
-+ }
-+ }
-+
-+ public static string [] ParseEditUrl (string url)
-+ {
-+ if (!url.StartsWith ("edit:"))
-+ throw new Exception ("wtf");
-+
-+ string [] parts = url.Split ('@');
-+ if (parts.Length != 2)
-+ throw new Exception (String.Format ("invalid editing url {0}", parts.Length));
-+
-+ string xp = HttpUtility.UrlDecode (parts [1]);
-+ parts = HttpUtility.UrlDecode (parts [0]).Substring ("edit:".Length).Split ('@');
-+ if (parts.Length == 1) {
-+ string p = parts[0];
-+ parts = new string[2];
-+ parts[0] = p;
-+ parts[1] = "";
-+ }
-+
-+ return new string [] {parts [0], parts [1], xp};
-+ }
-+
-+ public static void AccountForChanges (XmlDocument d, string doc_set, string real_file)
-+ {
-+ try {
-+ FileChangeset fcs = changes.GetChangeset (doc_set, real_file);
-+ if (fcs == null)
-+ return;
-+
-+ foreach (Change c in fcs.Changes) {
-+ // Filter out old changes
-+ if (c.FromVersion != RootTree.MonodocVersion)
-+ continue;
-+
-+ XmlNode old = d.SelectSingleNode (c.XPath);
-+ if (old != null)
-+ old.ParentNode.ReplaceChild (d.ImportNode (c.NewNode, true), old);
-+ }
-+ } catch {
-+ return;
-+ }
-+ }
-+
-+ public static GlobalChangeset changes = GlobalChangeset.Load ();
-+
-+ static public GlobalChangeset GetChangesFrom (int starting_serial_id)
-+ {
-+ return changes.GetFrom (starting_serial_id);
-+ }
-+ }
-+
-+#region Data Model
-+ public class GlobalChangeset {
-+
-+ public static XmlSerializer serializer = new XmlSerializer (typeof (GlobalChangeset));
-+ static string changeset_file = Path.Combine (SettingsHandler.Path, "changeset.xml");
-+ static string changeset_backup_file = Path.Combine (SettingsHandler.Path, "changeset.xml~");
-+
-+ public static GlobalChangeset Load ()
-+ {
-+ try {
-+ if (File.Exists (changeset_file))
-+ return LoadFromFile (changeset_file);
-+ } catch {}
-+
-+ return new GlobalChangeset ();
-+ }
-+
-+ public static GlobalChangeset LoadFromFile (string fileName)
-+ {
-+ using (Stream s = File.OpenRead (fileName)) {
-+ return (GlobalChangeset) serializer.Deserialize (s);
-+ }
-+ }
-+
-+ public void Save ()
-+ {
-+ SettingsHandler.EnsureSettingsDirectory ();
-+
-+ try {
-+ if (File.Exists(changeset_file)) // create backup copy
-+ File.Copy (changeset_file, changeset_backup_file, true);
-+
-+ using (FileStream fs = File.Create (changeset_file)){
-+ serializer.Serialize (fs, this);
-+ }
-+ } catch (Exception e) {
-+ Console.WriteLine ("Error while saving changes. " + e);
-+ if (File.Exists(changeset_backup_file)) // if saving fails then use backup if we have one
-+ File.Copy (changeset_backup_file, changeset_file, true);
-+ else
-+ File.Delete (changeset_file); // if no backup, delete invalid changeset
-+ }
-+ }
-+
-+ static void VerifyDirectoryExists (DirectoryInfo d) {
-+ if (d.Exists)
-+ return;
-+
-+ VerifyDirectoryExists (d.Parent);
-+ d.Create ();
-+ }
-+
-+ [XmlElement ("DocSetChangeset", typeof (DocSetChangeset))]
-+ public ArrayList DocSetChangesets = new ArrayList ();
-+
-+ public FileChangeset GetChangeset (string doc_set, string real_file)
-+ {
-+ foreach (DocSetChangeset dscs in DocSetChangesets) {
-+ if (dscs.DocSet != doc_set)
-+ continue;
-+
-+ foreach (FileChangeset fcs in dscs.FileChangesets) {
-+ if (fcs.RealFile == real_file)
-+ return fcs;
-+ }
-+ }
-+
-+ return null;
-+ }
-+
-+ public int Count {
-+ get {
-+ int count = 0;
-+
-+ foreach (DocSetChangeset dscs in DocSetChangesets){
-+ foreach (FileChangeset fcs in dscs.FileChangesets){
-+ count += fcs.Changes.Count;
-+ }
-+ }
-+
-+ return count;
-+ }
-+ }
-+
-+ Change NewChange (string xpath, XmlNode new_node, string node_url)
-+ {
-+ Change new_change = new Change ();
-+ new_change.XPath = xpath;
-+ new_change.NewNode = new_node;
-+ new_change.NodeUrl = node_url;
-+
-+ Console.WriteLine ("New serial:" + SettingsHandler.Settings.SerialNumber);
-+ new_change.Serial = SettingsHandler.Settings.SerialNumber;
-+
-+ return new_change;
-+ }
-+
-+ public void AddChange (string doc_set, string real_file, string xpath, XmlNode new_node, string node_url)
-+ {
-+ FileChangeset new_file_change_set;
-+ Change new_change = NewChange (xpath, new_node, node_url);
-+
-+ if (real_file == null)
-+ throw new Exception ("Could not find real_file. Please talk to Miguel or Ben about this");
-+
-+ foreach (DocSetChangeset dscs in DocSetChangesets) {
-+ if (dscs.DocSet != doc_set)
-+ continue;
-+
-+ foreach (FileChangeset fcs in dscs.FileChangesets) {
-+ if (fcs.RealFile != real_file)
-+ continue;
-+
-+ foreach (Change c in fcs.Changes) {
-+ if (c.XPath == xpath) {
-+ c.NewNode = new_node;
-+ c.Serial = SettingsHandler.Settings.SerialNumber;
-+ return;
-+ }
-+ }
-+
-+ fcs.Changes.Add (new_change);
-+ return;
-+
-+ }
-+
-+ new_file_change_set = new FileChangeset ();
-+ new_file_change_set.RealFile = real_file;
-+ new_file_change_set.Changes.Add (new_change);
-+ dscs.FileChangesets.Add (new_file_change_set);
-+ return;
-+
-+ }
-+
-+ DocSetChangeset new_dcs = new DocSetChangeset ();
-+ new_dcs.DocSet = doc_set;
-+
-+ new_file_change_set = new FileChangeset ();
-+ new_file_change_set.RealFile = real_file;
-+
-+ new_file_change_set.Changes.Add (new_change);
-+ new_dcs.FileChangesets.Add (new_file_change_set);
-+ DocSetChangesets.Add (new_dcs);
-+ }
-+
-+ public void RemoveChange (string doc_set, string real_file, string xpath)
-+ {
-+ if (real_file == null)
-+ throw new Exception ("Could not find real_file. Please talk to Miguel or Ben about this");
-+
-+ for (int i = 0; i < DocSetChangesets.Count; i++) {
-+ DocSetChangeset dscs = DocSetChangesets [i] as DocSetChangeset;
-+ if (dscs.DocSet != doc_set)
-+ continue;
-+
-+ for (int j = 0; j < dscs.FileChangesets.Count; j++) {
-+ FileChangeset fcs = dscs.FileChangesets [j] as FileChangeset;
-+ if (fcs.RealFile != real_file)
-+ continue;
-+
-+ for (int k = 0; k < fcs.Changes.Count; k++) {
-+ Change c = fcs.Changes [k] as Change;
-+ if (c.XPath == xpath) {
-+ fcs.Changes.Remove (c);
-+ break;
-+ }
-+ }
-+ if (fcs.Changes.Count == 0)
-+ dscs.FileChangesets.Remove (fcs);
-+ }
-+
-+ if (dscs.FileChangesets.Count == 0)
-+ DocSetChangesets.Remove (dscs);
-+ }
-+ }
-+
-+ public GlobalChangeset GetFrom (int starting_serial_id)
-+ {
-+ GlobalChangeset s = null;
-+
-+ foreach (DocSetChangeset dscs in DocSetChangesets){
-+ object o = dscs.GetFrom (starting_serial_id);
-+ if (o == null)
-+ continue;
-+ if (s == null)
-+ s = new GlobalChangeset ();
-+ s.DocSetChangesets.Add (o);
-+ }
-+ return s;
-+ }
-+ }
-+
-+ public class DocSetChangeset {
-+ [XmlAttribute] public string DocSet;
-+
-+ [XmlElement ("FileChangeset", typeof (FileChangeset))]
-+ public ArrayList FileChangesets = new ArrayList ();
-+
-+ public DocSetChangeset GetFrom (int starting_serial_id)
-+ {
-+ DocSetChangeset dsc = null;
-+
-+ foreach (FileChangeset fcs in FileChangesets){
-+ object o = fcs.GetFrom (starting_serial_id);
-+ if (o == null)
-+ continue;
-+ if (dsc == null){
-+ dsc = new DocSetChangeset ();
-+ dsc.DocSet = DocSet;
-+ }
-+ dsc.FileChangesets.Add (o);
-+ }
-+ return dsc;
-+ }
-+ }
-+
-+ public class FileChangeset {
-+ [XmlAttribute] public string RealFile;
-+
-+ [XmlElement ("Change", typeof (Change))]
-+ public ArrayList Changes = new ArrayList ();
-+
-+ public FileChangeset GetFrom (int starting_serial_id)
-+ {
-+ FileChangeset fcs = null;
-+
-+ foreach (Change c in Changes){
-+ if (c.Serial < starting_serial_id)
-+ continue;
-+ if (fcs == null){
-+ fcs = new FileChangeset ();
-+ fcs.RealFile = RealFile;
-+ }
-+ fcs.Changes.Add (c);
-+ }
-+ return fcs;
-+ }
-+ }
-+
-+ public class Change {
-+ [XmlAttribute] public string XPath;
-+ [XmlAttribute] public int FromVersion = RootTree.MonodocVersion;
-+ [XmlAttribute] public string NodeUrl;
-+
-+ public XmlNode NewNode;
-+
-+ public int Serial;
-+
-+ bool applied = false;
-+
-+ //
-+ // These are not a property, because we dont want them serialized;
-+ // Only used by the Admin Client.
-+ //
-+ public bool Applied ()
-+ {
-+ return applied;
-+ }
-+
-+ public void SetApplied (bool value)
-+ {
-+ applied = value;
-+ }
-+ }
-+#endregion
-+
-+ public class EditMerger {
-+ GlobalChangeset changeset;
-+ ArrayList targetDirs;
-+
-+ public EditMerger (GlobalChangeset changeset, ArrayList targetDirs)
-+ {
-+ this.changeset = changeset;
-+ this.targetDirs = targetDirs;
-+ }
-+
-+ public void Merge ()
-+ {
-+ foreach (DocSetChangeset dsc in changeset.DocSetChangesets) {
-+ bool merged = false;
-+ foreach (string path in targetDirs) {
-+ if (File.Exists (Path.Combine (path, dsc.DocSet + ".source"))) {
-+ Merge (dsc, path);
-+ merged = true;
-+ break;
-+ }
-+ }
-+ if (!merged) Console.WriteLine ("Could not merge docset {0}", dsc.DocSet);
-+ }
-+ }
-+
-+ void Merge (DocSetChangeset dsc, string path)
-+ {
-+ Console.WriteLine ("Merging changes in {0} ({1})", dsc.DocSet, path);
-+
-+ foreach (FileChangeset fcs in dsc.FileChangesets) {
-+ if (File.Exists (Path.Combine (path, fcs.RealFile)))
-+ Merge (fcs, path);
-+ else
-+ Console.WriteLine ("\tCould not find file {0}", Path.Combine (path, fcs.RealFile));
-+ }
-+ }
-+
-+ void Merge (FileChangeset fcs, string path)
-+ {
-+ XmlDocument d = new XmlDocument ();
-+ d.Load (Path.Combine (path, fcs.RealFile));
-+
-+ foreach (Change c in fcs.Changes) {
-+ XmlNode old = d.SelectSingleNode (c.XPath);
-+ if (old != null)
-+ old.ParentNode.ReplaceChild (d.ImportNode (c.NewNode, true), old);
-+ }
-+
-+ d.Save (Path.Combine (path, fcs.RealFile));
-+ }
-+ }
-+}
-+
-diff --git a/docbrowser/monodoc.in b/docbrowser/monodoc.in
-index a532918..806b163 100644
---- a/docbrowser/monodoc.in
-+++ b/docbrowser/monodoc.in
-@@ -75,7 +75,7 @@ elif test x at MOZILLA_HOME@ != x; then
- if [ -f @MOZILLA_HOME@/chrome/comm.jar ]; then
- MOZILLA_HOME=@MOZILLA_HOME@
- fi
--elif grep GRE_PATH /etc/gre.d/*.conf > /dev/null ; then
-+elif grep -qs GRE_PATH /etc/gre.d/*.conf > /dev/null ; then
- MOZILLA_HOME=$(grep -h GRE_PATH= /etc/gre.d/*.conf | cut -d '"' -f 2 -d = | head -n 1)
- elif [ $(which xulrunner 2> /dev/null) ] > /dev/null ; then
- MOZILLA_FIVE_HOME=`getdirectory xulrunner`
-diff --git a/gendarme/AssemblyStaticInfo.cs b/gendarme/AssemblyStaticInfo.cs
-index 2ca215e..130eb9d 100644
---- a/gendarme/AssemblyStaticInfo.cs
-+++ b/gendarme/AssemblyStaticInfo.cs
-@@ -18,10 +18,9 @@ using System.Security.Permissions;
- [assembly: AssemblyCopyright ("Copyright (C) 2005-2011 Novell, Inc. and contributors")]
- [assembly: AssemblyCompany ("Novell, Inc.")]
-
--[assembly: PermissionSet (SecurityAction.RequestMinimum, Unrestricted = true)]
- [assembly: CLSCompliant (false)]
- [assembly: ComVisible (false)]
-
- #if RELEASE
--[assembly: AssemblyVersion ("2.10.0.0")]
-+[assembly: AssemblyVersion ("2.11.0.0")]
- #endif
-diff --git a/gendarme/MIT.X11 b/gendarme/MIT.X11
-index 8d90e9d..b3e59de 100644
---- a/gendarme/MIT.X11
-+++ b/gendarme/MIT.X11
-@@ -1,4 +1,4 @@
--Copyright (c) 2005-2010 Novell, Inc and the individuals listed on the
-+Copyright (c) 2005-2011 Novell, Inc and the individuals listed on the
- ChangeLog entries.
-
- Permission is hereby granted, free of charge, to any person obtaining
-diff --git a/gendarme/Makefile.am b/gendarme/Makefile.am
-index 890f0f2..2d96376 100644
---- a/gendarme/Makefile.am
-+++ b/gendarme/Makefile.am
-@@ -45,7 +45,8 @@ check-test: all bin/gendarme.exe.config test
- --ignore=unit-test.ignore --severity=all --confidence=all @unit-test.list
-
- test-regress: all
-- mono --debug bin/gendarme.exe --config rules/rules.xml --set self-test --log regress.log testcases/*.dll testcases/*.exe
-+ mono --debug bin/gendarme.exe --config rules/rules.xml --set self-test --log regress.log \
-+ --severity=all --confidence=all testcases/*.dll testcases/*.exe
-
- TEST1 ?= AvoidVisibleConstantFieldTest
- test1_file = $(shell find rules -name "\.svn" -prune -o -name "*$(TEST1)*" -print)
-@@ -101,16 +102,3 @@ zip-bin: bin extra-bin
- cd ..; \
- rm -rf gendarme.$(GENDARME_VERSION);
-
--instruct.xsd:
-- wget http://www.ohloh.net/instruct.xsd
--
--push: instruct.xsd
-- xmllint --schema instruct.xsd gendarme.xml
--# scp gendarme-2.8preview1-bin.zip $(USER)@upload.ohloh.net:gendarme/files; \
--# scp gendarme-2.8preview1-win32-setup.zip $(USER)@upload.ohloh.net:gendarme/files; \
--# scp gendarme.xml $(USER)@upload.ohloh.net:gendarme/instructs
--
--pull-log:
-- scp $(USER)@upload.ohloh.net:gendarme/logs/upload.log .
-- cat upload.log
--
-diff --git a/gendarme/console/ConsoleRunner.cs b/gendarme/console/ConsoleRunner.cs
-index 97afccb..bf9814c 100644
---- a/gendarme/console/ConsoleRunner.cs
-+++ b/gendarme/console/ConsoleRunner.cs
-@@ -29,6 +29,7 @@
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
-+using System.Globalization;
- using System.IO;
- using System.Linq;
- using System.Reflection;
-@@ -53,21 +54,23 @@ namespace Gendarme {
- private string log_file;
- private string xml_file;
- private string ignore_file;
-- private string limit;
-- private string severity_filter;
-- private string confidence_filter;
- private bool help;
- private bool quiet;
- private bool version;
-+ private bool console;
- private List<string> assembly_names;
-
-+ static string [] SplitOptions (string value)
-+ {
-+ return value.ToUpperInvariant ().Split (new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries);
-+ }
-+
- // parse severity filter
- // e.g. Audit,High+ == Audit, High and Critical
-- void ParseSeverity ()
-+ bool ParseSeverity (string filter)
- {
- SeverityBitmask.ClearAll ();
-- string [] options = severity_filter.ToUpperInvariant ().Split (',');
-- foreach (string option in options) {
-+ foreach (string option in SplitOptions (filter)) {
- Severity severity;
-
- switch (option) {
-@@ -101,28 +104,26 @@ namespace Gendarme {
- SeverityBitmask.SetAll ();
- continue;
- default:
-- continue;
-+ string msg = String.Format (CultureInfo.CurrentCulture, "Unknown severity level '{0}'", option);
-+ throw new OptionException (msg, "severity");
- }
-
- char end = option [option.Length - 1];
- if (end == '+') {
- SeverityBitmask.SetDown (severity);
-- Console.WriteLine ("SetDown {0} -> {1}", severity, SeverityBitmask);
- } else if (end == '-') {
- SeverityBitmask.SetUp (severity);
-- Console.WriteLine ("SetUp {0} -> {1}", severity, SeverityBitmask);
- } else {
- SeverityBitmask.Set (severity);
-- Console.WriteLine ("Set {0} -> {1}", severity, SeverityBitmask);
- }
- }
-+ return true;
- }
-
-- void ParseConfidence ()
-+ bool ParseConfidence (string filter)
- {
- ConfidenceBitmask.ClearAll ();
-- string [] options = confidence_filter.ToUpperInvariant ().Split (',');
-- foreach (string option in options) {
-+ foreach (string option in SplitOptions (filter)) {
- Confidence confidence;
-
- switch (option) {
-@@ -151,7 +152,8 @@ namespace Gendarme {
- ConfidenceBitmask.SetAll ();
- continue;
- default:
-- continue;
-+ string msg = String.Format (CultureInfo.CurrentCulture, "Unknown confidence level '{0}'", option);
-+ throw new OptionException (msg, "confidence");
- }
-
- char end = option [option.Length - 1];
-@@ -163,48 +165,104 @@ namespace Gendarme {
- ConfidenceBitmask.Set (confidence);
- }
- }
-+ return true;
-+ }
-+
-+ static string ValidateInputFile (string option, string file)
-+ {
-+ if (!File.Exists (file)) {
-+ string msg = String.Format (CultureInfo.CurrentCulture, "File '{0}' could not be found", file);
-+ throw new OptionException (msg, option);
-+ }
-+ return file;
-+ }
-+
-+ static string ValidateOutputFile (string option, string file)
-+ {
-+ string msg = String.Empty;
-+ if (file.Length > 0) {
-+ string path = Path.GetDirectoryName (file);
-+ if (path.Length > 0) {
-+ if (path.IndexOfAny (Path.GetInvalidPathChars ()) != -1)
-+ msg = String.Format (CultureInfo.CurrentCulture, "Invalid path '{0}'", file);
-+ else if (!Directory.Exists (path))
-+ msg = String.Format (CultureInfo.CurrentCulture, "Path '{0}' does not exists", file);
-+ }
-+ }
-+
-+ string fname = Path.GetFileName (file);
-+ if ((fname.Length == 0) || (fname.IndexOfAny (Path.GetInvalidFileNameChars ()) != -1)) {
-+ msg = String.Format (CultureInfo.CurrentCulture, "Filename '{0}' is not valid", fname);
-+ }
-+
-+ if (msg.Length > 0)
-+ throw new OptionException (msg, option);
-+
-+ return file;
-+ }
-+
-+ static string ValidateRuleSet (string ruleSet)
-+ {
-+ if (String.IsNullOrEmpty (ruleSet)) {
-+ throw new OptionException ("Missing rule set name", "set");
-+ }
-+ return ruleSet;
-+ }
-+
-+ static int ValidateLimit (string limit)
-+ {
-+ int defects_limit;
-+ if (String.IsNullOrEmpty (limit) || !Int32.TryParse (limit, out defects_limit)) {
-+ string msg = String.Format (CultureInfo.CurrentCulture, "Invalid value '{0}' to limit defects", limit);
-+ throw new OptionException (msg, "limit");
-+ }
-+ return defects_limit;
- }
-
- byte Parse (string [] args)
- {
-+ bool severity = false;
-+ bool confidence = false;
-+ // if supplied, use the user limit on defects (otherwise 2^31 is used)
-+ DefectsLimit = Int32.MaxValue;
-+
- var p = new OptionSet () {
-- { "config=", v => config_file = v },
-- { "set=", v => rule_set = v },
-- { "log=", v => log_file = v },
-- { "xml=", v => xml_file = v },
-- { "html=", v => html_file = v },
-- { "ignore=", v => ignore_file = v },
-- { "limit=", v => limit = v },
-- { "severity=", v => severity_filter = v },
-- { "confidence=",v => confidence_filter = v },
-+ { "config=", v => config_file = ValidateInputFile ("config", v) },
-+ { "set=", v => rule_set = ValidateRuleSet (v) },
-+ { "log=", v => log_file = ValidateOutputFile ("log", v) },
-+ { "xml=", v => xml_file = ValidateOutputFile ("xml", v) },
-+ { "html=", v => html_file = ValidateOutputFile ("html", v) },
-+ { "ignore=", v => ignore_file = ValidateInputFile ("ignore", v) },
-+ { "limit=", v => DefectsLimit = ValidateLimit (v) },
-+ { "severity=", v => severity = ParseSeverity (v) },
-+ { "confidence=",v => confidence = ParseConfidence (v) },
- { "v|verbose", v => ++VerbosityLevel },
-+ { "console", v => console = v != null },
- { "quiet", v => quiet = v != null },
- { "version", v => version = v != null },
- { "h|?|help", v => help = v != null },
- };
-- assembly_names = p.Parse (args);
-
-- // if supplied, use the user limit on defects (otherwise 2^31 is used)
-- int defects_limit;
-- if (String.IsNullOrEmpty (limit) || !Int32.TryParse (limit, out defects_limit))
-- defects_limit = Int32.MaxValue;
-- DefectsLimit = defects_limit;
-+ try {
-+ assembly_names = p.Parse (args);
-+ }
-+ catch (OptionException e) {
-+ Console.WriteLine ("Error parsing option '{0}' : {1}", e.OptionName, e.Message);
-+ Console.WriteLine ();
-+ return 1;
-+ }
-
- // by default the runner will ignore Audit and Low severity defects
-- if (String.IsNullOrEmpty (severity_filter)) {
-+ if (!severity) {
- SeverityBitmask.SetAll ();
- SeverityBitmask.Clear (Severity.Audit);
- SeverityBitmask.Clear (Severity.Low);
-- } else {
-- ParseSeverity ();
- }
-
- // by default the runner will ignore Low confidence defects
-- if (String.IsNullOrEmpty (confidence_filter)) {
-+ if (!confidence) {
- ConfidenceBitmask.SetAll ();
- ConfidenceBitmask.Clear (Confidence.Low);
-- } else {
-- ParseConfidence ();
- }
-
- return (byte) ((assembly_names.Count > 0) ? 0 : 1);
-@@ -281,7 +339,7 @@ namespace Gendarme {
- }
-
- // generate text report (default, to console, if xml and html aren't specified)
-- if ((log_file != null) || ((xml_file == null) && (html_file == null))) {
-+ if (console || (log_file != null) || ((xml_file == null) && (html_file == null))) {
- using (TextResultWriter writer = new TextResultWriter (this, log_file)) {
- writer.Report ();
- }
-@@ -380,7 +438,7 @@ namespace Gendarme {
- private static string TimeToString (TimeSpan time)
- {
- if (time >= TimeSpan.FromMilliseconds (100))
-- return string.Format ("{0:0.0} seconds", time.TotalSeconds);
-+ return String.Format (CultureInfo.CurrentCulture, "{0:0.0} seconds", time.TotalSeconds);
- else
- return "<0.1 seconds";
- }
-@@ -441,9 +499,10 @@ namespace Gendarme {
- if (null != log_file || null != xml_file || null != html_file) {
- List<string> files = new List<string> (new string [] { log_file, xml_file, html_file });
- files.RemoveAll (string.IsNullOrEmpty);
-- hint = string.Format ("Report{0} written to: {1}.",
-+ hint = String.Format (CultureInfo.CurrentCulture, "Report{0} written to: {1}.",
- (files.Count > 1) ? "s" : string.Empty,
-- string.Join (",", files.Select (file => string.Format ("`{0}'", file)).ToArray ()));
-+ string.Join (",", files.Select (file =>
-+ String.Format (CultureInfo.CurrentCulture, "`{0}'", file)).ToArray ()));
- }
-
- if (Defects.Count == 0)
-@@ -519,6 +578,7 @@ namespace Gendarme {
- Console.WriteLine (" --confidence [all | [[low | normal | high | total][+|-]],...");
- Console.WriteLine ("\t\t\tFilter defects for the specified confidence levels.");
- Console.WriteLine ("\t\t\tDefault is 'normal+'");
-+ Console.WriteLine (" --console\t\tShow defects on the console even if --log, --xml or --html are specified.");
- Console.WriteLine (" --quiet\t\tUsed to disable progress and other information which is normally written to stdout.");
- Console.WriteLine (" --v\t\t\tWhen present additional progress information is written to stdout (can be used multiple times).");
- Console.WriteLine (" assemblies\t\tSpecify the assemblies to verify.");
-diff --git a/gendarme/console/Helpers.cs b/gendarme/console/Helpers.cs
-index c399452..3ef8361 100644
---- a/gendarme/console/Helpers.cs
-+++ b/gendarme/console/Helpers.cs
-@@ -38,7 +38,7 @@ namespace Gendarme {
- {
- Assembly executing = Assembly.GetExecutingAssembly ();
- foreach (string resource in executing.GetManifestResourceNames ()) {
-- if (resource.EndsWith (resourceName))
-+ if (resource.EndsWith (resourceName, StringComparison.Ordinal))
- return executing.GetManifestResourceStream (resource);
- }
- return null;
-diff --git a/gendarme/console/IgnoreFileList.cs b/gendarme/console/IgnoreFileList.cs
-index acf0d1d..b714ded 100644
---- a/gendarme/console/IgnoreFileList.cs
-+++ b/gendarme/console/IgnoreFileList.cs
-@@ -61,13 +61,13 @@ namespace Gendarme {
-
- private void Parse ()
- {
-+ char [] buffer = new char [4096];
- while (files.Count > 0) {
- string fileName = files.Pop ();
-- using (StreamReader sr = new StreamReader (fileName)) {
-- string s = sr.ReadLine ();
-- while (s != null) {
-- ProcessLine (s);
-- s = sr.ReadLine ();
-+ using (StreamLineReader sr = new StreamLineReader (fileName)) {
-+ while (!sr.EndOfStream) {
-+ int length = sr.ReadLine (buffer, 0, buffer.Length);
-+ ProcessLine (buffer, length);
- }
- }
- }
-@@ -87,19 +87,33 @@ namespace Gendarme {
- rules.Add (rule);
- }
-
-- private void ProcessLine (string line)
-+ static string GetString (char [] buffer, int length)
- {
-- if (line.Length < 1)
-+ // skip the 'type' + ':' characters when looking for whitespace separator(s)
-+ int start = 2;
-+ while (Char.IsWhiteSpace (buffer [start]) && (start < buffer.Length))
-+ start++;
-+
-+ int end = length;
-+ while (Char.IsWhiteSpace (buffer [end]) && (end >= start))
-+ end--;
-+
-+ return new string (buffer, start, end - start);
-+ }
-+
-+ private void ProcessLine (char [] buffer, int length)
-+ {
-+ if (length < 1)
- return;
-
-- switch (line [0]) {
-+ switch (buffer [0]) {
- case '#': // comment
- break;
- case 'R': // rule
-- current_rule = line.Substring (line.LastIndexOf (' ') + 1);
-+ current_rule = GetString (buffer, length);
- break;
- case 'A': // assembly - we support Name, FullName and *
-- string target = line.Substring (2).Trim ();
-+ string target = GetString (buffer, length);
- if (target == "*") {
- foreach (AssemblyDefinition assembly in Runner.Assemblies) {
- Add (assemblies, current_rule, assembly.Name.FullName);
-@@ -109,19 +123,19 @@ namespace Gendarme {
- }
- break;
- case 'T': // type (no space allowed)
-- Add (types, current_rule, line.Substring (line.LastIndexOf (' ') + 1));
-+ Add (types, current_rule, GetString (buffer, length));
- break;
- case 'M': // method
-- Add (methods, current_rule, line.Substring (2).Trim ());
-+ Add (methods, current_rule, GetString (buffer, length));
- break;
- case 'N': // namespace - special case (no need to resolve)
-- base.Add (current_rule, NamespaceDefinition.GetDefinition (line.Substring (2).Trim ()));
-+ base.Add (current_rule, NamespaceDefinition.GetDefinition (GetString (buffer, length)));
- break;
- case '@': // include file
-- files.Push (line.Substring (2).Trim ());
-+ files.Push (GetString (buffer, length));
- break;
- default:
-- Console.Error.WriteLine ("Bad ignore entry : '{0}'", line);
-+ Console.Error.WriteLine ("Bad ignore entry : '{0}'", new string (buffer));
- break;
- }
- }
-@@ -148,14 +162,13 @@ namespace Gendarme {
-
- foreach (ModuleDefinition module in assembly.Modules) {
- foreach (TypeDefinition type in module.GetAllTypes ()) {
-- if (types.TryGetValue (type.FullName, out rules)) {
-+ if (types.TryGetValue (type.GetFullName (), out rules)) {
- AddList (type, rules);
- }
-
- if (type.HasMethods) {
- foreach (MethodDefinition method in type.Methods) {
-- // FIXME avoid (allocations in) ToString call
-- if (methods.TryGetValue (method.ToString (), out rules)) {
-+ if (methods.TryGetValue (method.GetFullName (), out rules)) {
- AddList (method, rules);
- }
- }
-diff --git a/gendarme/console/Makefile.am b/gendarme/console/Makefile.am
-index f74ab23..43c0a4a 100644
---- a/gendarme/console/Makefile.am
-+++ b/gendarme/console/Makefile.am
-@@ -30,7 +30,7 @@ gendarme_prefix_resources = $(addprefix $(srcdir)/, $(gendarme_resources))
- gendarme_build_resources = $(foreach res,$(gendarme_prefix_resources), $(addprefix -resource:,$(res)),$(notdir $(res)))
-
- ../bin/gendarme.exe: $(gendarme_build_sources) $(gendarme_prefix_resources)
-- $(GMCS) $(GENDARME_OPTIONS) -r:$(CECIL_ASM) -r:System.Xml.Linq -r:../bin/Gendarme.Framework.dll \
-+ $(MCS) $(GENDARME_OPTIONS) -r:$(CECIL_ASM) -r:System.Xml.Linq -r:../bin/Gendarme.Framework.dll \
- -out:$@ $(gendarme_build_sources) $(gendarme_build_resources)
-
- self-test: ../bin/gendarme.exe
-diff --git a/gendarme/console/Settings.cs b/gendarme/console/Settings.cs
-index 3ecafec..23b5429 100644
---- a/gendarme/console/Settings.cs
-+++ b/gendarme/console/Settings.cs
-@@ -4,7 +4,7 @@
- // Authors:
- // Sebastien Pouliot <sebastien at ximian.com>
- //
--// Copyright (C) 2008 Novell, Inc (http://www.novell.com)
-+// Copyright (C) 2008, 2011 Novell, Inc (http://www.novell.com)
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
-@@ -27,6 +27,7 @@
- //
-
- using System;
-+using System.Globalization;
- using System.IO;
- using System.Reflection;
- using System.Collections.Generic;
-@@ -150,7 +151,8 @@ namespace Gendarme {
-
- private void OnValidationErrors (object sender, ValidationEventArgs args)
- {
-- validation_errors.Add (args.Exception.Message.Replace ("XmlSchema error", String.Format ("Error in the configuration file {0}", config_file)));
-+ validation_errors.Add (args.Exception.Message.Replace ("XmlSchema error",
-+ String.Format (CultureInfo.CurrentCulture, "Error in the configuration file {0}", config_file)));
- }
-
- private void ValidateXmlDocument ()
-@@ -228,7 +230,8 @@ namespace Gendarme {
-
- static Exception GetException (string message, string ruleName, string propertyName, string value)
- {
-- return new XmlException (String.Format (message + ". Review your configuration file.", ruleName, propertyName, value));
-+ return new XmlException (String.Format (CultureInfo.CurrentCulture,
-+ message + ". Review your configuration file.", ruleName, propertyName, value));
- }
-
- public bool Load ()
-diff --git a/gendarme/console/XmlResultWriter.cs b/gendarme/console/XmlResultWriter.cs
-index 3a5e0f4..3dcdff1 100644
---- a/gendarme/console/XmlResultWriter.cs
-+++ b/gendarme/console/XmlResultWriter.cs
-@@ -31,6 +31,7 @@
- //
-
- using System;
-+using System.Globalization;
- using System.IO;
- using System.Linq;
- using System.Text;
-@@ -70,7 +71,7 @@ namespace Gendarme {
- {
- writer.WriteStartDocument ();
- writer.WriteStartElement ("gendarme-output");
-- writer.WriteAttributeString ("date", DateTime.UtcNow.ToString ());
-+ writer.WriteAttributeString ("date", DateTime.UtcNow.ToString (CultureInfo.InvariantCulture));
- }
-
- protected override void Write ()
-diff --git a/gendarme/console/gendarme.csproj b/gendarme/console/gendarme.csproj
-index 4f70bf5..eefae5e 100755
---- a/gendarme/console/gendarme.csproj
-+++ b/gendarme/console/gendarme.csproj
-@@ -1,5 +1,5 @@
- <?xml version="1.0" encoding="utf-8"?>
--<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-@@ -12,9 +12,13 @@
- <AssemblyName>gendarme</AssemblyName>
- <FileUpgradeFlags>
- </FileUpgradeFlags>
-- <OldToolsVersion>2.0</OldToolsVersion>
-+ <OldToolsVersion>3.5</OldToolsVersion>
- <UpgradeBackupLocation>
- </UpgradeBackupLocation>
-+ <IsWebBootstrapper>true</IsWebBootstrapper>
-+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-+ <SignAssembly>false</SignAssembly>
-+ <AssemblyOriginatorKeyFile>gendarme.snk</AssemblyOriginatorKeyFile>
- <PublishUrl>http://localhost/gendarme/</PublishUrl>
- <Install>true</Install>
- <InstallFrom>Web</InstallFrom>
-@@ -27,12 +31,9 @@
- <MapFileExtensions>true</MapFileExtensions>
- <ApplicationRevision>0</ApplicationRevision>
- <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-- <IsWebBootstrapper>true</IsWebBootstrapper>
- <UseApplicationTrust>false</UseApplicationTrust>
- <BootstrapperEnabled>true</BootstrapperEnabled>
-- <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-- <SignAssembly>false</SignAssembly>
-- <AssemblyOriginatorKeyFile>gendarme.snk</AssemblyOriginatorKeyFile>
-+ <TargetFrameworkProfile />
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DebugSymbols>true</DebugSymbols>
-@@ -42,6 +43,7 @@
- <DefineConstants>TRACE;DEBUG</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
-+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DebugType>pdbonly</DebugType>
-@@ -50,6 +52,7 @@
- <DefineConstants>TRACE;RELEASE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
-+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="System" />
-@@ -88,6 +91,10 @@
- <Project>{CD6818D5-B398-486C-B180-92A07B143AFD}</Project>
- <Name>Gendarme.Framework</Name>
- </ProjectReference>
-+ <ProjectReference Include="..\..\..\cecil\symbols\mdb\Mono.Cecil.Mdb.csproj">
-+ <Project>{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}</Project>
-+ <Name>Mono.Cecil.Mdb</Name>
-+ </ProjectReference>
- </ItemGroup>
- <ItemGroup>
- <None Include="ChangeLog" />
-@@ -95,30 +102,53 @@
- <EmbeddedResource Include="gendarme.xsl" />
- </ItemGroup>
- <ItemGroup>
-+ <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-+ <Visible>False</Visible>
-+ <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-+ <Install>false</Install>
-+ </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
- <Visible>False</Visible>
-+ <ProductName>
-+ </ProductName>
-+ <Install>false</Install>
- </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
- <Visible>False</Visible>
-+ <ProductName>
-+ </ProductName>
-+ <Install>false</Install>
- </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
- <Visible>False</Visible>
-+ <ProductName>
-+ </ProductName>
-+ <Install>false</Install>
-+ </BootstrapperPackage>
-+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-+ <Visible>False</Visible>
-+ <ProductName>.NET Framework 3.5 SP1</ProductName>
-+ <Install>false</Install>
- </BootstrapperPackage>
- </ItemGroup>
- <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
- Other similar extension points exist, see Microsoft.Common.targets.
-- <Target Name="BeforeBuild">
-- </Target>
-- <Target Name="AfterBuild">
-- </Target>
-+ <Target Name="BeforeBuild">
-+ </Target>
- -->
-+ <Target Name="AfterBuild">
-+ <Copy
-+ SourceFiles="$(TargetDir)..\..\..\rules\rules.xml"
-+ DestinationFolder="$(TargetDir)"
-+ SkipUnchangedFiles="True"
-+ />
-+ </Target>
- <PropertyGroup>
- <PreBuildEvent>
- </PreBuildEvent>
-- <PostBuildEvent>copy "$(TargetDir)..\..\..\rules\rules.xml" "$(TargetDir)"
--copy "$(TargetDir)..\..\..\..\..\cecil\bin\net_3_5_Release\Mono.Cecil.Pdb.*" "$(TargetDir)"
--copy "$(TargetDir)..\..\..\..\..\cecil\bin\net_3_5_Release\Mono.Cecil.Mdb.*" "$(TargetDir)"</PostBuildEvent>
-+ <PostBuildEvent>
-+ </PostBuildEvent>
- </PropertyGroup>
- <ProjectExtensions>
- <MonoDevelop>
-diff --git a/gendarme/framework/Gendarme.Framework.Engines/SuppressMessageEngine.cs b/gendarme/framework/Gendarme.Framework.Engines/SuppressMessageEngine.cs
-index a98a6bc..70ef7ba 100644
---- a/gendarme/framework/Gendarme.Framework.Engines/SuppressMessageEngine.cs
-+++ b/gendarme/framework/Gendarme.Framework.Engines/SuppressMessageEngine.cs
-@@ -71,7 +71,7 @@ namespace Gendarme.Framework.Engines {
- {
- // we only need to check the custom attributes if [SuppressMessage] is referenced (note: won't work for mscorlib)
- AssemblyDefinition assembly = (sender as AssemblyDefinition);
-- if (assembly.MainModule.HasTypeReference (SuppressMessage)) {
-+ if (assembly.MainModule.AnyTypeReference ((TypeReference tr) => { return tr.IsNamed ("System.Diagnostics.CodeAnalysis", "SuppressMessageAttribute"); })) {
- Controller.BuildingCustomAttributes += new EventHandler<EngineEventArgs> (OnCustomAttributes);
- } else {
- Controller.BuildingCustomAttributes -= new EventHandler<EngineEventArgs> (OnCustomAttributes);
-@@ -103,7 +103,7 @@ namespace Gendarme.Framework.Engines {
- foreach (CustomAttribute ca in cap.CustomAttributes) {
- if (!ca.HasConstructorArguments)
- continue;
-- if (ca.AttributeType.FullName != SuppressMessage)
-+ if (!ca.AttributeType.IsNamed ("System.Diagnostics.CodeAnalysis", "SuppressMessageAttribute"))
- continue;
-
- var arguments = ca.ConstructorArguments;
-@@ -200,7 +200,7 @@ namespace Gendarme.Framework.Engines {
- foreach (ModuleDefinition module in assembly.Modules) {
- // TODO ...
- foreach (TypeDefinition type in module.GetAllTypes ()) {
-- if (targets.TryGetValue (type.FullName, out rules))
-+ if (targets.TryGetValue (type.GetFullName (), out rules))
- Add (type, rules);
-
- if (type.HasMethods) {
-@@ -213,11 +213,11 @@ namespace Gendarme.Framework.Engines {
- targets.Clear ();
- }
-
-- private void ResolveMethod (IMetadataTokenProvider method)
-+ private void ResolveMethod (MemberReference method)
- {
- HashSet<string> rules;
-
-- string m = method.ToString ();
-+ string m = method.GetFullName ();
- m = m.Substring (m.IndexOf (' ') + 1);
-
- if (targets.TryGetValue (m, out rules))
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/Log.cs b/gendarme/framework/Gendarme.Framework.Helpers/Log.cs
-index 262c7e9..759ba9f 100644
---- a/gendarme/framework/Gendarme.Framework.Helpers/Log.cs
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/Log.cs
-@@ -30,6 +30,7 @@ using System.Diagnostics;
- using System.Collections.Generic;
-
- using Mono.Cecil;
-+using Gendarme.Framework.Rocks;
-
- namespace Gendarme.Framework.Helpers {
-
-@@ -83,9 +84,9 @@ namespace Gendarme.Framework.Helpers {
- }
-
- [Conditional ("DEBUG")]
-- public static void WriteLine<T> (T category, MethodDefinition method)
-+ public static void WriteLine<T> (T category, MemberReference member)
- {
-- WriteLine (typeof (T).Name, method);
-+ WriteLine (typeof (T).Name, member);
- }
-
- // WriteLine (string)
-@@ -104,10 +105,15 @@ namespace Gendarme.Framework.Helpers {
- }
-
- [Conditional ("DEBUG")]
-- public static void WriteLine (string category, MethodDefinition method)
-+ public static void WriteLine (string category, MemberReference member)
- {
-- if (IsEnabled (category))
-- Debug.WriteLine (new MethodPrinter (method).ToString ());
-+ if (IsEnabled (category)) {
-+ MethodDefinition md = (member as MethodDefinition);
-+ if (md != null)
-+ Debug.WriteLine (new MethodPrinter (md).ToString ());
-+ else
-+ Debug.WriteLine (member.GetFullName ());
-+ }
- }
-
- // Misc
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/MethodPrinter.cs b/gendarme/framework/Gendarme.Framework.Helpers/MethodPrinter.cs
-index af3638c..ef40dcc 100644
---- a/gendarme/framework/Gendarme.Framework.Helpers/MethodPrinter.cs
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/MethodPrinter.cs
-@@ -15,6 +15,7 @@ using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Diagnostics;
-+using System.Globalization;
- using System.Text;
- using Mono.Cecil;
- using Mono.Cecil.Cil;
-@@ -60,17 +61,28 @@ namespace Gendarme.Framework.Helpers {
- buffer.Append ("* ");
- else
- buffer.Append (" ");
-- buffer.AppendFormat (" {0}: {1}", instr.Offset.ToString ("X4"),
-- instr.OpCode.Name);
-+
-+ buffer.Append (" ");
-+ buffer.Append (instr.Offset.ToString ("X4", CultureInfo.InvariantCulture));
-+ buffer.Append (": ");
-+ buffer.Append (instr.OpCode.Name);
-+
- int[] targets = BranchTargets (instr);
-- if (targets != null)
-- foreach (int target in targets)
-- buffer.AppendFormat (" {0}", target.ToString ("X4"));
-- else if (instr.Operand is string)
-- buffer.AppendFormat (" \"{0}\"", instr.Operand.ToString ());
-- else if (instr.Operand != null)
-- buffer.AppendFormat (" {0}", instr.Operand.ToString ());
-- buffer.AppendLine (string.Empty);
-+ if (targets != null) {
-+ foreach (int target in targets) {
-+ buffer.Append (' ');
-+ buffer.Append (target.ToString ("X4", CultureInfo.InvariantCulture));
-+ }
-+ } else if (instr.Operand is string) {
-+ buffer.Append (" \"");
-+ buffer.Append (instr.Operand);
-+ buffer.Append ('"');
-+ } else if (instr.Operand != null) {
-+ buffer.Append (" ");
-+ buffer.Append (instr.Operand);
-+ }
-+ buffer.AppendLine ();
-+
- prevInstr = instr;
- if (EndsTryRegion (instr) != null)
- buffer.AppendLine ("} (Try)");
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/MethodSignature.cs b/gendarme/framework/Gendarme.Framework.Helpers/MethodSignature.cs
-index e6fd265..a17ae07 100644
---- a/gendarme/framework/Gendarme.Framework.Helpers/MethodSignature.cs
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/MethodSignature.cs
-@@ -34,6 +34,7 @@ using System.Collections.Generic;
- using System.Text;
-
- using Mono.Cecil;
-+using Gendarme.Framework.Rocks;
-
- namespace Gendarme.Framework.Helpers {
-
-@@ -49,7 +50,7 @@ namespace Gendarme.Framework.Helpers {
- /// }
- /// </code>
- /// </example>
-- // <seealso cref="Gendarme.Framework.Helpers.MethodSignatures"/>
-+ /// <seealso cref="Gendarme.Framework.Helpers.MethodSignatures"/>
- public class MethodSignature {
-
- /// <summary>
-@@ -121,7 +122,7 @@ namespace Gendarme.Framework.Helpers {
- if (Name != null && method.Name != Name)
- return false;
-
-- if (ReturnType != null && method.ReturnType.FullName != ReturnType)
-+ if (ReturnType != null && !method.ReturnType.IsNamed (ReturnType))
- return false;
-
- if (Parameters != null) {
-@@ -132,7 +133,7 @@ namespace Gendarme.Framework.Helpers {
- for (int i = 0; i < Parameters.Count; i++) {
- if (Parameters [i] == null)
- continue;//ignore parameter
-- if (Parameters [i] != pdc [i].ParameterType.FullName) {
-+ if (!pdc [i].ParameterType.IsNamed (Parameters [i])) {
- return false;
- }
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/MethodSignatures.cs b/gendarme/framework/Gendarme.Framework.Helpers/MethodSignatures.cs
-index 3b8b4ad..27116fa 100644
---- a/gendarme/framework/Gendarme.Framework.Helpers/MethodSignatures.cs
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/MethodSignatures.cs
-@@ -32,6 +32,7 @@ using System;
- using System.Collections.Generic;
-
- using Mono.Cecil;
-+using Gendarme.Framework.Rocks;
-
- namespace Gendarme.Framework.Helpers {
-
-@@ -120,19 +121,23 @@ namespace Gendarme.Framework.Helpers {
- // TryParse
- public static readonly MethodSignature TryParse = new MethodSignature ("TryParse",
- delegate (MethodReference method) {
-- if (method.ReturnType.FullName != "System.Boolean")
-+ if (!method.ReturnType.IsNamed ("System", "Boolean"))
- return false;
-
- IList<ParameterDefinition> pdc = method.Parameters;
-- if (pdc [0].ParameterType.FullName != "System.String")
-+ if (!pdc [0].ParameterType.IsNamed ("System", "String"))
- return false;
-
- TypeReference last = pdc [pdc.Count - 1].ParameterType;
- if (!last.IsByReference)
- return false;
-
-- string pt_name = last.FullName;
-- return (String.Compare (pt_name, 0, method.DeclaringType.FullName, 0, pt_name.Length - 1) == 0);
-+ TypeReference mtype = method.DeclaringType;
-+ if (last.Namespace != mtype.Namespace)
-+ return false;
-+
-+ string pt_name = last.Name;
-+ return (String.Compare (pt_name, 0, mtype.Name, 0, pt_name.Length - 1, StringComparison.Ordinal) == 0);
- }
- );
-
-@@ -141,9 +146,9 @@ namespace Gendarme.Framework.Helpers {
- delegate (MethodReference method) {
- if (!method.HasParameters)
- return false;
-- if (method.ReturnType.FullName != method.DeclaringType.FullName)
-+ if (!method.ReturnType.IsNamed (method.DeclaringType.Namespace, method.DeclaringType.Name))
- return false;
-- return (method.Parameters [0].ParameterType.FullName == "System.String");
-+ return method.Parameters [0].ParameterType.IsNamed ("System", "String");
- }
- );
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/OpCodeBitmask.cs b/gendarme/framework/Gendarme.Framework.Helpers/OpCodeBitmask.cs
-index f7ceeac..6058fbe 100644
---- a/gendarme/framework/Gendarme.Framework.Helpers/OpCodeBitmask.cs
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/OpCodeBitmask.cs
-@@ -26,6 +26,7 @@
- //
-
- using System;
-+using System.Globalization;
- using System.Text;
-
- using Mono.Cecil.Cil;
-@@ -144,12 +145,12 @@ namespace Gendarme.Framework.Helpers {
- return Equals (obj as OpCodeBitmask);
- }
-
-- public bool Equals (OpCodeBitmask set)
-+ public bool Equals (OpCodeBitmask other)
- {
-- if (set == null)
-+ if (other == null)
- return false;
-- return ((mask [0] == set.mask [0]) || (mask [1] == set.mask [1]) ||
-- (mask [2] == set.mask [2]) || (mask [3] == set.mask [3]));
-+ return ((mask [0] == other.mask [0]) || (mask [1] == other.mask [1]) ||
-+ (mask [2] == other.mask [2]) || (mask [3] == other.mask [3]));
- }
-
- public override int GetHashCode ()
-@@ -159,7 +160,8 @@ namespace Gendarme.Framework.Helpers {
-
- public override string ToString ()
- {
-- return String.Format ("0x{0:X}:0x{1:X}:0x{2:X}:0x{3:X}", mask [0], mask [1], mask [2], mask [3]);
-+ return String.Format (CultureInfo.InvariantCulture, "0x{0:X}:0x{1:X}:0x{2:X}:0x{3:X}",
-+ mask [0], mask [1], mask [2], mask [3]);
- }
-
-
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/StackEntryAnalysis.cs b/gendarme/framework/Gendarme.Framework.Helpers/StackEntryAnalysis.cs
-index 61d5f9b..156aef1 100644
---- a/gendarme/framework/Gendarme.Framework.Helpers/StackEntryAnalysis.cs
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/StackEntryAnalysis.cs
-@@ -97,9 +97,9 @@ namespace Gendarme.Framework.Helpers {
- return this == other;
- }
-
-- public bool Equals (StoreSlot storeSlot)
-+ public bool Equals (StoreSlot other)
- {
-- return this == storeSlot;
-+ return this == other;
- }
-
- public override int GetHashCode ()
-@@ -182,40 +182,14 @@ namespace Gendarme.Framework.Helpers {
- return false;
- }
-
-- public bool Equals (InstructionWithLeave iwl)
-+ public bool Equals (InstructionWithLeave other)
- {
-- if (Instruction != iwl.Instruction)
-- return false;
--
-- if (LeaveStack == null)
-- return (iwl.LeaveStack == null);
--
-- if (iwl.LeaveStack == null)
-- return false;
--
-- if (LeaveStack.Length != iwl.LeaveStack.Length)
-- return false;
--
-- for (int i = 0; i < LeaveStack.Length; i++) {
-- if (LeaveStack [i] != iwl.LeaveStack [i])
-- return false;
-- }
-- return true;
-+ return (Instruction == other.Instruction);
- }
-
- public override int GetHashCode ()
- {
-- int hc = 0;
--
-- unchecked {
-- hc ^= Instruction.GetHashCode ();
-- if (LeaveStack != null) {
-- foreach (Instruction ins in LeaveStack)
-- hc ^= ins.GetHashCode ();
-- }
-- }
--
-- return hc;
-+ return Instruction.GetHashCode ();
- }
-
- public static bool operator == (InstructionWithLeave left, InstructionWithLeave right)
-@@ -527,7 +501,7 @@ namespace Gendarme.Framework.Helpers {
- return new StoreSlot (StoreType.Argument, ins.OpCode.Code - Code.Ldarg_0);
- case Code.Ldarg_S:
- case Code.Ldarg: {
-- int sequence = ((ParameterDefinition) ins.Operand).GetSequence ();
-+ int sequence = ((ParameterDefinition) ins.Operand).Index + 1;
- if (!this.Method.HasThis)
- sequence--;
- return new StoreSlot (StoreType.Argument, sequence);
-@@ -581,7 +555,7 @@ namespace Gendarme.Framework.Helpers {
-
- case Code.Starg_S: //store arg (not ref / out etc)
- case Code.Starg: {
-- int sequence = ((ParameterDefinition) ins.Operand).GetSequence ();
-+ int sequence = ((ParameterDefinition) ins.Operand).Index + 1;
- if (!this.Method.HasThis)
- sequence--;
- return new StoreSlot (StoreType.Argument, sequence);
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/StackEntryUsageResult.cs b/gendarme/framework/Gendarme.Framework.Helpers/StackEntryUsageResult.cs
-index 1fa302f..9c69872 100644
---- a/gendarme/framework/Gendarme.Framework.Helpers/StackEntryUsageResult.cs
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/StackEntryUsageResult.cs
-@@ -61,9 +61,9 @@ namespace Gendarme.Framework.Helpers {
- return false;
- }
-
-- public bool Equals (StackEntryUsageResult usageResult)
-+ public bool Equals (StackEntryUsageResult other)
- {
-- return (Instruction == usageResult.Instruction) && (StackOffset == usageResult.StackOffset);
-+ return (Instruction == other.Instruction) && (StackOffset == other.StackOffset);
- }
-
- public override int GetHashCode ()
-diff --git a/gendarme/framework/Gendarme.Framework.Helpers/StreamLineReader.cs b/gendarme/framework/Gendarme.Framework.Helpers/StreamLineReader.cs
-new file mode 100644
-index 0000000..3242474
---- /dev/null
-+++ b/gendarme/framework/Gendarme.Framework.Helpers/StreamLineReader.cs
-@@ -0,0 +1,122 @@
-+//
-+// StreamLineReader - A StringReader-like class that avoid creating string
-+//
-+// Authors:
-+// Sebastien Pouliot <sebastien at ximian.com>
-+//
-+// Copyright (C) 2011 Novell, Inc (http://www.novell.com)
-+//
-+// 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 System;
-+using System.IO;
-+
-+namespace Gendarme.Framework.Helpers {
-+
-+ // note: inheriting from StreamReader was not possible since we cannot
-+ // override EndOfStream and ensure integrity with other Read ops
-+ public class StreamLineReader : IDisposable {
-+
-+ StreamReader sr;
-+ char [] buff;
-+ int n;
-+ int max;
-+
-+ public StreamLineReader (string fileName)
-+ {
-+ sr = new StreamReader (fileName);
-+ Initialize ();
-+ }
-+
-+ public StreamLineReader (Stream stream)
-+ {
-+ sr = new StreamReader (stream);
-+ Initialize ();
-+ }
-+
-+ void Initialize ()
-+ {
-+ buff = new char [4096];
-+ max = n = buff.Length;
-+ }
-+
-+ public bool EndOfStream {
-+ get { return (n == max || max == 0) && sr.EndOfStream; }
-+ }
-+
-+ public int ReadLine (char [] buffer, int index, int count)
-+ {
-+ if (Disposed)
-+ throw new ObjectDisposedException ("StreamLineReader");
-+ if (buffer == null)
-+ throw new ArgumentNullException ("buffer");
-+ if (index < 0)
-+ throw new ArgumentOutOfRangeException ("index", "< 0");
-+ if (count < 0)
-+ throw new ArgumentOutOfRangeException ("count", "< 0");
-+ // ordered to avoid possible integer overflow
-+ if (index > buffer.Length - count)
-+ throw new ArgumentException ("index + count > buffer.Length");
-+
-+ int len = 0;
-+ while (len < count) {
-+ if (n == max) {
-+ max = sr.ReadBlock (buff, 0, buff.Length);
-+ if (max == 0) break;
-+ n = 0;
-+ }
-+ char c = buff [n++];
-+ switch (c) {
-+ case '\r':
-+ continue;
-+ case '\n':
-+ Array.Clear (buffer, len, buffer.Length - len);
-+ return len;
-+ default:
-+ buffer [index++] = c;
-+ len++;
-+ break;
-+ }
-+ }
-+ return len;
-+ }
-+
-+ public void Dispose ()
-+ {
-+ Dispose (true);
-+ GC.SuppressFinalize (this);
-+ }
-+
-+ protected virtual void Dispose (bool disposing)
-+ {
-+ try {
-+ if (!Disposed)
-+ sr.Dispose ();
-+ }
-+ finally {
-+ Disposed = true;
-+ }
-+ }
-+
-+ protected bool Disposed { get; private set; }
-+ }
-+}
-+
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/CecilRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/CecilRocks.cs
-index a1b2cfc..12c6345 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/CecilRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/CecilRocks.cs
-@@ -27,6 +27,7 @@
- //
-
- using System;
-+using System.Collections.Generic;
-
- using Mono.Cecil;
- using Mono.Cecil.Metadata;
-@@ -157,5 +158,30 @@ namespace Gendarme.Framework.Rocks {
- // compare assemblies tokens (but do not recurse)
- return other == null ? false : self_assembly.MetadataToken.Equals (other_assembly.MetadataToken);
- }
-+
-+ static Dictionary<MemberReference, string> full_name_cache = new Dictionary<MemberReference, string> ();
-+
-+ /// <summary>
-+ /// Get the string value of the MemberReference FullName property without the cost
-+ /// of allocating a new string for each (or most) calls.
-+ /// </summary>
-+ /// <param name="self">The MemberReference instance where the method is applied.</param>
-+ /// <returns>The cached FullName property of the MemberReference</returns>
-+ /// <remarks>Cecil needs to rebuild most of the FullName properties on each call in order to
-+ /// be able to write assemblies. However this is a waste of memory when an application, like
-+ /// Gendarme, use it for read-only purposes.</remarks>
-+ public static string GetFullName (this MemberReference self)
-+ {
-+ if (self == null)
-+ return String.Empty;
-+
-+ string full_name;
-+ if (!full_name_cache.TryGetValue (self, out full_name)) {
-+ full_name = self.FullName;
-+ full_name_cache.Add (self, full_name);
-+ }
-+
-+ return full_name;
-+ }
- }
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/CustomAttributeRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/CustomAttributeRocks.cs
-index 26b6401..ebfb1ba 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/CustomAttributeRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/CustomAttributeRocks.cs
-@@ -44,51 +44,16 @@ namespace Gendarme.Framework.Rocks {
- /// </summary>
- public static class CustomAttributeRocks {
-
-- internal static string [] GeneratedCodeAttributes = {
-- "System.CodeDom.Compiler.GeneratedCodeAttribute",
-- "System.Runtime.CompilerServices.CompilerGeneratedAttribute"
-- };
--
-- /// <summary>
-- /// Check if the custom attribute collection contains an attribute of a specified type.
-- /// </summary>
-- /// <param name="self">The CustomAttribute enumerable on which the extension method can be called.</param>
-- /// <param name="attributeTypeName">Full type name of the attribute class.</param>
-- /// <returns>True if the collection contains an attribute of the same name,
-- /// False otherwise.</returns>
-- public static bool ContainsType (this IEnumerable<CustomAttribute> self, string attributeTypeName)
-+ internal static bool HasAnyGeneratedCodeAttribute (this ICustomAttributeProvider self)
- {
-- if (attributeTypeName == null)
-- throw new ArgumentNullException ("attributeTypeName");
-- if (self == null)
-+ if ((self == null) || !self.HasCustomAttributes)
- return false;
-
-- foreach (CustomAttribute ca in self) {
-- if (ca.AttributeType.FullName == attributeTypeName)
-+ foreach (CustomAttribute ca in self.CustomAttributes) {
-+ TypeReference cat = ca.AttributeType;
-+ if (cat.IsNamed ("System.CodeDom.Compiler", "GeneratedCodeAttribute") ||
-+ cat.IsNamed ("System.Runtime.CompilerServices", "CompilerGeneratedAttribute")) {
- return true;
-- }
-- return false;
-- }
--
-- /// <summary>
-- /// Check if the custom attribute collection contains any of the specified type.
-- /// </summary>
-- /// <param name="self">The CustomAttribute enumerable on which the extension method can be called.</param>
-- /// <param name="attributeTypeNames">A strings array of full type names of the attributes.</param>
-- /// <returns>True if the collection contains any attribute matching one specified,
-- /// False otherwise.</returns>
-- public static bool ContainsAnyType (this IEnumerable<CustomAttribute> self, string[] attributeTypeNames)
-- {
-- if (attributeTypeNames == null)
-- throw new ArgumentNullException ("attributeTypeNames");
-- if (self == null)
-- return false;
--
-- foreach (CustomAttribute ca in self) {
-- string fullname = ca.AttributeType.FullName;
-- foreach (string attribute_full_name in attributeTypeNames) {
-- if (fullname == attribute_full_name)
-- return true;
- }
- }
- return false;
-@@ -99,17 +64,25 @@ namespace Gendarme.Framework.Rocks {
- /// </summary>
- /// <param name="self">The ICustomAttributeProvider (e.g. AssemblyDefinition, TypeReference, MethodReference,
- /// FieldReference...) on which the extension method can be called.</param>
-- /// <param name="attributeName">Full name of the attribute class</param>
-+ /// <param name="nameSpace">The namespace of the attribute to be matched</param>
-+ /// <param name="name">The name of the attribute to be matched</param>
- /// <returns>True if the provider contains an attribute of the same name,
- /// False otherwise.</returns>
-- public static bool HasAttribute (this ICustomAttributeProvider self, string attributeName)
-+ public static bool HasAttribute (this ICustomAttributeProvider self, string nameSpace, string name)
- {
-- if (attributeName == null)
-- throw new ArgumentNullException ("attributeName");
-+ if (nameSpace == null)
-+ throw new ArgumentNullException ("nameSpace");
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
-
- if ((self == null) || !self.HasCustomAttributes)
- return false;
-- return self.CustomAttributes.ContainsType (attributeName);
-+
-+ foreach (CustomAttribute ca in self.CustomAttributes) {
-+ if (ca.AttributeType.IsNamed (nameSpace, name))
-+ return true;
-+ }
-+ return false;
- }
- }
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/FieldRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/FieldRocks.cs
-index 39641f5..bf3b30b 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/FieldRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/FieldRocks.cs
-@@ -49,10 +49,9 @@ namespace Gendarme.Framework.Rocks {
- if (field == null)
- return false;
-
-- if (field.HasCustomAttributes) {
-- if (field.CustomAttributes.ContainsAnyType (CustomAttributeRocks.GeneratedCodeAttributes))
-- return true;
-- }
-+ if (field.HasAnyGeneratedCodeAttribute ())
-+ return true;
-+
- return field.DeclaringType.IsGeneratedCode ();
- }
-
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/InstructionRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/InstructionRocks.cs
-index 6c8aaf6..aef546a 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/InstructionRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/InstructionRocks.cs
-@@ -27,6 +27,7 @@
- // THE SOFTWARE.
-
- using System;
-+using System.Globalization;
-
- using Mono.Cecil;
- using Mono.Cecil.Cil;
-@@ -291,7 +292,7 @@ namespace Gendarme.Framework.Rocks {
- case StackBehaviour.Varpop:
- switch (self.OpCode.FlowControl) {
- case FlowControl.Return:
-- return method.ReturnType.FullName == "System.Void" ? 0 : 1;
-+ return method.ReturnType.IsNamed ("System", "Void") ? 0 : 1;
-
- case FlowControl.Call:
- IMethodSignature calledMethod = (IMethodSignature) self.Operand;
-@@ -310,7 +311,8 @@ namespace Gendarme.Framework.Rocks {
- case StackBehaviour.PopAll:
- return -1;
- default:
-- string unknown = String.Format ("'{0}' is not a valid value for instruction '{1}'.",
-+ string unknown = String.Format (CultureInfo.InvariantCulture,
-+ "'{0}' is not a valid value for instruction '{1}'.",
- self.OpCode.StackBehaviourPush, self.OpCode);
- throw new InvalidOperationException (unknown);
- }
-@@ -344,11 +346,12 @@ namespace Gendarme.Framework.Rocks {
- case StackBehaviour.Varpush:
- IMethodSignature calledMethod = (IMethodSignature) self.Operand;
- if (calledMethod != null)
-- return (calledMethod.ReturnType.FullName == "System.Void") ? 0 : 1;
-+ return calledMethod.ReturnType.IsNamed ("System", "Void") ? 0 : 1;
-
- throw new NotImplementedException ("Varpush not supported for this Instruction.");
- default:
-- string unknown = String.Format ("'{0}' is not a valid value for instruction '{1}'.",
-+ string unknown = String.Format (CultureInfo.InvariantCulture,
-+ "'{0}' is not a valid value for instruction '{1}'.",
- self.OpCode.StackBehaviourPush, self.OpCode);
- throw new InvalidOperationException (unknown);
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/MethodRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/MethodRocks.cs
-index f4a604c..eace40a 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/MethodRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/MethodRocks.cs
-@@ -55,6 +55,15 @@ namespace Gendarme.Framework.Rocks {
- /// </summary>
- public static class MethodRocks {
-
-+ public static bool IsNamed (this MemberReference self, string nameSpace, string typeName, string methodName)
-+ {
-+ if (methodName == null)
-+ throw new ArgumentNullException ("methodName");
-+ if (self == null)
-+ return false;
-+ return ((self.Name == methodName) && self.DeclaringType.IsNamed (nameSpace, typeName));
-+ }
-+
- /// <summary>
- /// Check if the MethodReference is defined as the entry point of it's assembly.
- /// </summary>
-@@ -76,7 +85,7 @@ namespace Gendarme.Framework.Rocks {
- return false;
-
- return (self.HasThis && !self.HasParameters && (self.Name == "Finalize") &&
-- (self.ReturnType.FullName == "System.Void"));
-+ self.ReturnType.IsNamed ("System", "Void"));
- }
-
- /// <summary>
-@@ -91,10 +100,9 @@ namespace Gendarme.Framework.Rocks {
- return false;
-
- MethodDefinition method = self.Resolve ();
-- if ((method != null) && method.HasCustomAttributes) {
-- if (method.CustomAttributes.ContainsAnyType (CustomAttributeRocks.GeneratedCodeAttributes))
-- return true;
-- }
-+ if (method.HasAnyGeneratedCodeAttribute ())
-+ return true;
-+
- return self.DeclaringType.IsGeneratedCode ();
- }
-
-@@ -161,27 +169,10 @@ namespace Gendarme.Framework.Rocks {
- TypeDefinition parent = declaring.BaseType != null ? declaring.BaseType.Resolve () : null;
- while (parent != null) {
- string name = method.Name;
-- string retval = method.ReturnType.FullName;
-- int pcount = method.HasParameters ? method.Parameters.Count : 0;
- foreach (MethodDefinition md in parent.Methods) {
- if (name != md.Name)
- continue;
-- if (retval != md.ReturnType.FullName)
-- continue;
-- if (md.HasParameters && (pcount == 0))
-- continue;
-- IList<ParameterDefinition> ppdc = md.Parameters;
-- if (pcount != ppdc.Count)
-- continue;
--
-- bool ok = true;
-- for (int i = 0; i < pcount; i++) {
-- if (method.Parameters [i].ParameterType.FullName != ppdc [i].ParameterType.FullName) {
-- ok = false;
-- break;
-- }
-- }
-- if (!ok)
-+ if (!method.CompareSignature (md))
- continue;
-
- return md.IsVirtual;
-@@ -246,11 +237,11 @@ namespace Gendarme.Framework.Rocks {
- TypeReference type = parameters [1].ParameterType;
- GenericParameter gp = (type as GenericParameter);
- if (gp == null)
-- return type.Inherits ("System.EventArgs");
-+ return type.Inherits ("System", "EventArgs");
-
- if (gp.HasConstraints) {
- IList<TypeReference> cc = gp.Constraints;
-- return ((cc.Count == 1) && (cc [0].FullName == "System.EventArgs"));
-+ return ((cc.Count == 1) && cc [0].IsNamed ("System", "EventArgs"));
- }
-
- return false;
-@@ -283,7 +274,7 @@ namespace Gendarme.Framework.Rocks {
-
- private static bool AreSameElementTypes (TypeReference a, TypeReference b)
- {
-- return a.GetElementType ().FullName == b.GetElementType ().FullName;
-+ return a.IsGenericParameter || b.IsGenericParameter || b.IsNamed (a.Namespace, a.Name);
- }
-
- /// <summary>
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/ModuleRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/ModuleRocks.cs
-index 06a946c..3aad117 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/ModuleRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/ModuleRocks.cs
-@@ -4,7 +4,7 @@
- // Authors:
- // Sebastien Pouliot <sebastien at ximian.com>
- //
--// Copyright (C) 2008 Novell, Inc (http://www.novell.com)
-+// Copyright (C) 2008, 2011 Novell, Inc (http://www.novell.com)
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
-@@ -155,19 +155,58 @@ namespace Gendarme.Framework.Rocks {
- yield return type;
- }
-
-- public static bool HasAnyTypeReference (this ModuleDefinition self, string [] typeNames)
-+ static Dictionary<ModuleDefinition, IEnumerable<MemberReference>> member_ref_cache = new Dictionary<ModuleDefinition, IEnumerable<MemberReference>> ();
-+
-+ /// <summary>
-+ /// Check if any MemberReference, referenced by the current ModuleDefinition, satisfies the
-+ /// specified predicate.
-+ /// </summary>
-+ /// <param name="self">The ModuleDefinition on which the extension method can be called.</param>
-+ /// <param name="predicate">The condition to execute on a provided MemberReference</param>
-+ /// <returns>True if 'predicate' returns true for any MemberReference in the module's referenced types.</returns>
-+ /// <remarks>Cecil's GetMemberReferences method will allocate a new array each time it is called.
-+ /// This extension method will cache the IEnumerable, on the first use, to reduce memory consumption.</remarks>
-+ public static bool AnyMemberReference (this ModuleDefinition self, Func<MemberReference, bool> predicate)
- {
- if (self == null)
- return false;
-
-- if (typeNames == null)
-- throw new ArgumentNullException ("typeNames");
-+ // since ModuleDefinition.GetMemberReferences allocates an array (always identical if the
-+ // assembly is opened "read-only", like Gendarme does) we'll cache and retrieve the array
-+ IEnumerable<MemberReference> refs;
-+ if (!member_ref_cache.TryGetValue (self, out refs)) {
-+ refs = self.GetMemberReferences ();
-+ member_ref_cache.Add (self, refs);
-+ }
-+
-+ return refs.Any (predicate);
-+ }
-+
-+ static Dictionary<ModuleDefinition, IEnumerable<TypeReference>> type_ref_cache = new Dictionary<ModuleDefinition, IEnumerable<TypeReference>> ();
-
-- foreach (var typeName in typeNames)
-- if (self.HasTypeReference (typeName))
-- return true;
-+ /// <summary>
-+ /// Check if any TypeReference, referenced by the current ModuleDefinition, satisfies the
-+ /// specified predicate.
-+ /// </summary>
-+ /// <param name="self">The ModuleDefinition on which the extension method can be called.</param>
-+ /// <param name="predicate">The condition to execute on a provided TypeReference</param>
-+ /// <returns>True if 'predicate' returns true for any TypeReference in the module's referenced types.</returns>
-+ /// <remarks>Cecil's GetTypeReferences method will allocate a new array each time it is called.
-+ /// This extension method will cache the IEnumerable, on the first use, to reduce memory consumption.</remarks>
-+ public static bool AnyTypeReference (this ModuleDefinition self, Func<TypeReference, bool> predicate)
-+ {
-+ if (self == null)
-+ return false;
-+
-+ // since ModuleDefinition.GetTypeReferences allocates an array (always identical if the
-+ // assembly is opened "read-only", like Gendarme does) we'll cache and retrieve the array
-+ IEnumerable<TypeReference> refs;
-+ if (!type_ref_cache.TryGetValue (self, out refs)) {
-+ refs = self.GetTypeReferences ();
-+ type_ref_cache.Add (self, refs);
-+ }
-
-- return false;
-+ return refs.Any (predicate);
- }
- }
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/ParameterRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/ParameterRocks.cs
-index cfc87ca..7a41c01 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/ParameterRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/ParameterRocks.cs
-@@ -39,22 +39,7 @@ namespace Gendarme.Framework.Rocks {
- /// <returns>True if the parameter represents a list of parameters, false otherwise.</returns>
- public static bool IsParams (this ParameterDefinition self)
- {
-- if (self == null || !self.HasCustomAttributes)
-- return false;
-- return self.CustomAttributes.ContainsType ("System.ParamArrayAttribute");
-- }
--
-- /// <summary>
-- /// Returns the sequence number as found in the metadata
-- /// </summary>
-- /// <param name="self">The ParameterDefinition on which the extension method can be called.</param>
-- /// <returns>The integer value of the sequence number of the parameter.</returns>
-- public static int GetSequence (this ParameterReference self)
-- {
-- if (self == null)
-- return -1;
--
-- return self.Index + 1;
-+ return self.HasAttribute ("System", "ParamArrayAttribute");
- }
- }
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/PropertyRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/PropertyRocks.cs
-index 293f9db..112d323 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/PropertyRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/PropertyRocks.cs
-@@ -59,10 +59,9 @@ namespace Gendarme.Framework.Rocks {
- if (self == null)
- return false;
-
-- if (self.HasCustomAttributes) {
-- if (self.CustomAttributes.ContainsAnyType (CustomAttributeRocks.GeneratedCodeAttributes))
-- return true;
-- }
-+ if (self.HasAnyGeneratedCodeAttribute ())
-+ return true;
-+
- return self.DeclaringType.IsGeneratedCode ();
- }
- }
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs
-index d549c63..efdcc0f 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs
-@@ -84,51 +84,6 @@ namespace Gendarme.Framework.Rocks {
- }
-
- /// <summary>
-- /// Check if a type reference collection contains a type of a specific name.
-- /// </summary>
-- /// <param name="self">The TypeReferenceCollection on which the extension method can be called.</param>
-- /// <param name="typeName">Full name of the type.</param>
-- /// <returns>True if the collection contains an type of the same name,
-- /// False otherwise.</returns>
-- public static bool ContainsType (this IEnumerable<TypeReference> self, string typeName)
-- {
-- if (typeName == null)
-- throw new ArgumentNullException ("typeName");
-- if (self == null)
-- return false;
--
-- foreach (TypeReference type in self) {
-- if (type.FullName == typeName)
-- return true;
-- }
-- return false;
-- }
--
-- /// <summary>
-- /// Check if a type reference collection contains any of the specified type names.
-- /// </summary>
-- /// <param name="self">The TypeReferenceCollection on which the extension method can be called.</param>
-- /// <param name="typeNames">A string array of full type names.</param>
-- /// <returns>True if the collection contains any types matching one specified,
-- /// False otherwise.</returns>
-- public static bool ContainsAnyType (this IEnumerable<TypeReference> self, string [] typeNames)
-- {
-- if (typeNames == null)
-- throw new ArgumentNullException ("typeNames");
-- if (self == null)
-- return false;
--
-- foreach (TypeReference type in self) {
-- string fullname = type.FullName;
-- foreach (string type_full_name in typeNames) {
-- if (fullname == type_full_name)
-- return true;
-- }
-- }
-- return false;
-- }
--
-- /// <summary>
- /// Returns the first MethodDefinition that satisfies a given MethodSignature.
- /// </summary>
- /// <param name="self">The TypeReference on which the extension method can be called.</param>
-@@ -177,7 +132,7 @@ namespace Gendarme.Framework.Rocks {
- continue;
- if ((method.Attributes & attributes) != attributes)
- continue;
-- if (returnType != null && method.ReturnType.FullName != returnType)
-+ if (returnType != null && !method.ReturnType.IsNamed (returnType))
- continue;
- if (parameters != null) {
- if (method.HasParameters) {
-@@ -188,7 +143,7 @@ namespace Gendarme.Framework.Rocks {
- for (int i = 0; i < parameters.Length; i++) {
- if (parameters [i] == null)
- continue;//ignore parameter
-- if (parameters [i] != pdc [i].ParameterType.GetElementType ().FullName) {
-+ if (!pdc [i].ParameterType.GetElementType ().IsNamed (parameters [i])) {
- parameterError = true;
- break;
- }
-@@ -284,13 +239,16 @@ namespace Gendarme.Framework.Rocks {
- /// where the information resides could be unavailable. False is returned in this case.
- /// </summary>
- /// <param name="self">The TypeDefinition on which the extension method can be called.</param>
-- /// <param name="interfaceName">Full name of the interface</param>
-+ /// <param name="nameSpace">The namespace of the interface to be matched</param>
-+ /// <param name="name">The name of the interface to be matched</param>
- /// <returns>True if we found that the type implements the interface, False otherwise (either it
- /// does not implement it, or we could not find where it does).</returns>
-- public static bool Implements (this TypeReference self, string interfaceName)
-+ public static bool Implements (this TypeReference self, string nameSpace, string name)
- {
-- if (interfaceName == null)
-- throw new ArgumentNullException ("interfaceName");
-+ if (nameSpace == null)
-+ throw new ArgumentNullException ("nameSpace");
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
- if (self == null)
- return false;
-
-@@ -299,23 +257,22 @@ namespace Gendarme.Framework.Rocks {
- return false; // not enough information available
-
- // special case, check if we implement ourselves
-- if (type.IsInterface && (type.FullName == interfaceName))
-+ if (type.IsInterface && type.IsNamed (nameSpace, name))
- return true;
-
-- return Implements (type, interfaceName, (interfaceName.IndexOf ('`') >= 0));
-+ return Implements (type, nameSpace, name);
- }
-
-- private static bool Implements (TypeDefinition type, string interfaceName, bool generic)
-+ private static bool Implements (TypeDefinition type, string nameSpace, string iname)
- {
- while (type != null) {
- // does the type implements it itself
- if (type.HasInterfaces) {
- foreach (TypeReference iface in type.Interfaces) {
-- string fullname = (generic) ? iface.GetElementType ().FullName : iface.FullName;
-- if (fullname == interfaceName)
-+ if (iface.IsNamed (nameSpace, iname))
- return true;
- //if not, then maybe one of its parent interfaces does
-- if (Implements (iface.Resolve (), interfaceName, generic))
-+ if (Implements (iface.Resolve (), nameSpace, iname))
- return true;
- }
- }
-@@ -331,21 +288,23 @@ namespace Gendarme.Framework.Rocks {
- /// where the information resides could be unavailable.
- /// </summary>
- /// <param name="self">The TypeReference on which the extension method can be called.</param>
-- /// <param name="className">Full name of the base class</param>
-+ /// <param name="nameSpace">The namespace of the base class to be matched</param>
-+ /// <param name="name">The name of the base class to be matched</param>
- /// <returns>True if the type inherits from specified class, False otherwise</returns>
-- public static bool Inherits (this TypeReference self, string className)
-+ public static bool Inherits (this TypeReference self, string nameSpace, string name)
- {
-- if (className == null)
-- throw new ArgumentNullException ("className");
-+ if (nameSpace == null)
-+ throw new ArgumentNullException ("nameSpace");
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
- if (self == null)
- return false;
-
- TypeReference current = self.Resolve ();
- while (current != null) {
-- string fullname = current.FullName;
-- if (fullname == className)
-+ if (current.IsNamed (nameSpace, name))
- return true;
-- if (fullname == "System.Object")
-+ if (current.IsNamed ("System", "Object"))
- return false;
-
- TypeDefinition td = current.Resolve ();
-@@ -357,6 +316,70 @@ namespace Gendarme.Framework.Rocks {
- }
-
- /// <summary>
-+ /// Check if the type and its namespace are named like the provided parameters.
-+ /// This is preferred to checking the FullName property since the later can allocate (string) memory.
-+ /// </summary>
-+ /// <param name="self">The TypeReference on which the extension method can be called.</param>
-+ /// <param name="nameSpace">The namespace to be matched</param>
-+ /// <param name="name">The type name to be matched</param>
-+ /// <returns>True if the type is namespace and name match the arguments, False otherwise</returns>
-+ public static bool IsNamed (this TypeReference self, string nameSpace, string name)
-+ {
-+ if (nameSpace == null)
-+ throw new ArgumentNullException ("nameSpace");
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
-+ if (self == null)
-+ return false;
-+
-+ if (self.IsNested) {
-+ int spos = name.LastIndexOf ('/');
-+ if (spos == -1)
-+ return false;
-+ // GetFullName could be optimized away but it's a fairly uncommon case
-+ return (nameSpace + "." + name == self.GetFullName ());
-+ }
-+
-+ return ((self.Namespace == nameSpace) && (self.Name == name));
-+ }
-+
-+ /// <summary>
-+ /// Check if the type full name match the provided parameter.
-+ /// Note: prefer the overload where the namespace and type name can be supplied individually
-+ /// </summary>
-+ /// <param name="self">The TypeReference on which the extension method can be called.</param>
-+ /// <param name="fullName">The full name to be matched</param>
-+ /// <returns>True if the type is namespace and name match the arguments, False otherwise</returns>
-+ public static bool IsNamed (this TypeReference self, string fullName)
-+ {
-+ if (fullName == null)
-+ throw new ArgumentNullException ("fullName");
-+ if (self == null)
-+ return false;
-+
-+ if (self.IsNested) {
-+ int spos = fullName.LastIndexOf ('/');
-+ if (spos == -1)
-+ return false;
-+ // FIXME: GetFullName could be optimized away but it's a fairly uncommon case
-+ return (fullName == self.GetFullName ());
-+ }
-+
-+ int dpos = fullName.LastIndexOf ('.');
-+ string nspace = self.Namespace;
-+ if (dpos != nspace.Length)
-+ return false;
-+
-+ if (String.CompareOrdinal (nspace, 0, fullName, 0, dpos) != 0)
-+ return false;
-+
-+ string name = self.Name;
-+ if (fullName.Length - dpos - 1 != name.Length)
-+ return false;
-+ return (String.CompareOrdinal (name, 0, fullName, dpos + 1, fullName.Length - dpos - 1) == 0);
-+ }
-+
-+ /// <summary>
- /// Checks if type is attribute. Note that it is possible that
- /// we might now be able to know all inheritance since the assembly where
- /// the information resides could be unavailable.
-@@ -369,7 +392,7 @@ namespace Gendarme.Framework.Rocks {
- if (self == null)
- return false;
-
-- return self.Inherits ("System.Attribute");
-+ return self.Inherits ("System", "Attribute");
- }
-
- /// <summary>
-@@ -387,13 +410,11 @@ namespace Gendarme.Framework.Rocks {
- if (null == type || type.BaseType == null)
- return false;
-
-- switch (type.BaseType.FullName) {
-- case "System.Delegate":
-- case "System.MulticastDelegate":
-- return true;
-- default:
-+ if (type.BaseType.Namespace != "System")
- return false;
-- }
-+
-+ string name = type.BaseType.Name;
-+ return ((name == "Delegate") || (name == "MulticastDelegate"));
- }
-
- /// <summary>
-@@ -410,7 +431,7 @@ namespace Gendarme.Framework.Rocks {
- if ((type == null) || !type.IsEnum || !type.HasCustomAttributes)
- return false;
-
-- return type.HasAttribute ("System.FlagsAttribute");
-+ return type.HasAttribute ("System", "FlagsAttribute");
- }
-
- /// <summary>
-@@ -423,9 +444,11 @@ namespace Gendarme.Framework.Rocks {
- if (self == null)
- return false;
-
-- string full_name = self.FullName;
-- return ((full_name == "System.Single") ||
-- (full_name == "System.Double"));
-+ if (self.Namespace != "System")
-+ return false;
-+
-+ string name = self.Name;
-+ return ((name == "Single") || (name == "Double"));
- }
-
- /// <summary>
-@@ -443,7 +466,7 @@ namespace Gendarme.Framework.Rocks {
- TypeDefinition type = self.Resolve ();
- // both helpful attributes only exists in 2.0 and more recent frameworks
- if (type.Module.Runtime >= TargetRuntime.Net_2_0) {
-- if (type.CustomAttributes.ContainsAnyType (CustomAttributeRocks.GeneratedCodeAttributes))
-+ if (type.HasAnyGeneratedCodeAttribute ())
- return true;
- }
- }
-@@ -471,14 +494,11 @@ namespace Gendarme.Framework.Rocks {
- if (self == null)
- return false;
-
-- switch (self.FullName) {
-- case "System.IntPtr":
-- case "System.UIntPtr":
-- case "System.Runtime.InteropServices.HandleRef":
-- return true;
-- default:
-- return false;
-+ if (self.Namespace == "System") {
-+ string name = self.Name;
-+ return ((name == "IntPtr") || (name == "UIntPtr"));
- }
-+ return self.IsNamed ("System.Runtime.InteropServices", "HandleRef");
- }
-
- /// <summary>
-diff --git a/gendarme/framework/Gendarme.Framework.Rocks/VariableDefinitionRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/VariableDefinitionRocks.cs
-index 6749ebd..73e03e4 100644
---- a/gendarme/framework/Gendarme.Framework.Rocks/VariableDefinitionRocks.cs
-+++ b/gendarme/framework/Gendarme.Framework.Rocks/VariableDefinitionRocks.cs
-@@ -24,8 +24,9 @@
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
-
--using Mono.Cecil.Cil;
- using System;
-+using System.Globalization;
-+using Mono.Cecil.Cil;
-
- namespace Gendarme.Framework.Rocks {
-
-@@ -53,7 +54,7 @@ namespace Gendarme.Framework.Rocks {
- {
- if (self == null)
- return String.Empty;
-- return !string.IsNullOrEmpty (self.Name) ? self.Name : "V_" + self.Index.ToString ();
-+ return !string.IsNullOrEmpty (self.Name) ? self.Name : "V_" + self.Index.ToString (CultureInfo.InvariantCulture);
- }
- }
- }
-diff --git a/gendarme/framework/Gendarme.Framework.csproj b/gendarme/framework/Gendarme.Framework.csproj
-index f9976af..ff5851b 100755
---- a/gendarme/framework/Gendarme.Framework.csproj
-+++ b/gendarme/framework/Gendarme.Framework.csproj
-@@ -1,5 +1,5 @@
- <?xml version="1.0" encoding="utf-8"?>
--<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-@@ -12,9 +12,11 @@
- <AssemblyName>Gendarme.Framework</AssemblyName>
- <FileUpgradeFlags>
- </FileUpgradeFlags>
-- <OldToolsVersion>2.0</OldToolsVersion>
-+ <OldToolsVersion>3.5</OldToolsVersion>
- <UpgradeBackupLocation>
- </UpgradeBackupLocation>
-+ <IsWebBootstrapper>true</IsWebBootstrapper>
-+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
- <PublishUrl>http://localhost/Gendarme.Framework/</PublishUrl>
- <Install>true</Install>
- <InstallFrom>Web</InstallFrom>
-@@ -27,10 +29,9 @@
- <MapFileExtensions>true</MapFileExtensions>
- <ApplicationRevision>0</ApplicationRevision>
- <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-- <IsWebBootstrapper>true</IsWebBootstrapper>
- <UseApplicationTrust>false</UseApplicationTrust>
- <BootstrapperEnabled>true</BootstrapperEnabled>
-- <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-+ <TargetFrameworkProfile />
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DebugSymbols>true</DebugSymbols>
-@@ -41,6 +42,7 @@
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>3</WarningLevel>
- <StartupObject />
-+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DebugType>pdbonly</DebugType>
-@@ -50,6 +52,7 @@
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <StartupObject />
-+ <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="System" />
-@@ -58,12 +61,17 @@
- </Reference>
- </ItemGroup>
- <ItemGroup>
-+ <ProjectReference Include="..\..\..\cecil\Mono.Cecil.csproj">
-+ <Project>{D68133BD-1E63-496E-9EDE-4FBDBF77B486}</Project>
-+ <Name>Mono.Cecil</Name>
-+ </ProjectReference>
- </ItemGroup>
- <ItemGroup>
- <Compile Include="..\AssemblyStaticInfo.cs" />
- <Compile Include="Gendarme.Framework.Engines\SuppressMessageEngine.cs" />
- <Compile Include="Gendarme.Framework.Helpers\Log.cs" />
- <Compile Include="Gendarme.Framework.Helpers\MethodPrinter.cs" />
-+ <Compile Include="Gendarme.Framework.Helpers\StreamLineReader.cs" />
- <Compile Include="Gendarme.Framework.Rocks\ParameterRocks.cs" />
- <Compile Include="Gendarme.Framework.Rocks\PropertyRocks.cs" />
- <Compile Include="Gendarme.Framework.Rocks\VariableDefinitionRocks.cs" />
-@@ -118,21 +126,34 @@
- <None Include="ChangeLog" />
- </ItemGroup>
- <ItemGroup>
-+ <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-+ <Visible>False</Visible>
-+ <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-+ <Install>false</Install>
-+ </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
- <Visible>False</Visible>
-+ <ProductName>
-+ </ProductName>
-+ <Install>false</Install>
- </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
- <Visible>False</Visible>
-+ <ProductName>
-+ </ProductName>
-+ <Install>false</Install>
- </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
- <Visible>False</Visible>
-+ <ProductName>
-+ </ProductName>
-+ <Install>false</Install>
-+ </BootstrapperPackage>
-+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-+ <Visible>False</Visible>
-+ <ProductName>.NET Framework 3.5 SP1</ProductName>
-+ <Install>false</Install>
- </BootstrapperPackage>
-- </ItemGroup>
-- <ItemGroup>
-- <ProjectReference Include="..\..\..\cecil\Mono.Cecil.csproj">
-- <Project>{D68133BD-1E63-496E-9EDE-4FBDBF77B486}</Project>
-- <Name>Mono.Cecil</Name>
-- </ProjectReference>
- </ItemGroup>
- <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-diff --git a/gendarme/framework/Gendarme.Framework/Symbols.cs b/gendarme/framework/Gendarme.Framework/Symbols.cs
-index 5e76c20..f572643 100644
---- a/gendarme/framework/Gendarme.Framework/Symbols.cs
-+++ b/gendarme/framework/Gendarme.Framework/Symbols.cs
-@@ -39,7 +39,7 @@ namespace Gendarme.Framework {
- // http://blogs.msdn.com/jmstall/archive/2005/06/19/FeeFee_SequencePoints.aspx
- private const int PdbHiddenLine = 0xFEEFEE;
-
-- private static string AlmostEqualTo = new string (new char [] { '\u2248' });
-+ private const string AlmostEqualTo = "\u2248";
-
- private static Instruction ExtractFirst (TypeDefinition type)
- {
-@@ -55,7 +55,7 @@ namespace Gendarme.Framework {
-
- private static Instruction ExtractFirst (MethodDefinition method)
- {
-- if ((method == null) || !method.HasBody)
-+ if ((method == null) || !method.HasBody || method.Body.Instructions.Count == 0)
- return null;
- Instruction ins = method.Body.Instructions [0];
- // note that the first instruction often does not have a sequence point
-@@ -69,11 +69,11 @@ namespace Gendarme.Framework {
- {
- MethodDefinition method = (location as MethodDefinition);
- if (method != null)
-- return (method.DeclaringType as TypeDefinition);
-+ return method.DeclaringType;
-
- FieldDefinition field = (location as FieldDefinition);
- if (field != null)
-- return (field.DeclaringType as TypeDefinition);
-+ return field.DeclaringType;
-
- ParameterDefinition parameter = (location as ParameterDefinition);
- if (parameter != null)
-@@ -112,7 +112,7 @@ namespace Gendarme.Framework {
- // include line and column.
- private static string FormatSequencePoint (string document, int line, int column, bool exact)
- {
-- string sline = (line == PdbHiddenLine) ? "unavailable" : line.ToString ();
-+ string sline = (line == PdbHiddenLine) ? "unavailable" : line.ToString (CultureInfo.InvariantCulture);
-
- // MDB (mono symbols) does not provide any column information (so we don't show any)
- // there's also no point in showing a column number if we're not totally sure about the line
-@@ -177,7 +177,7 @@ namespace Gendarme.Framework {
- return FormatSource (candidate);
-
- // we may still be lucky to find the (a) source file for the type itself
-- type = (method.DeclaringType as TypeDefinition);
-+ type = method.DeclaringType;
- }
-
- // TypeDefinition, FieldDefinition
-diff --git a/gendarme/framework/Gendarme.Framework/ThreadModelAttribute.cs b/gendarme/framework/Gendarme.Framework/ThreadModelAttribute.cs
-index e40e34c..4c76f63 100644
---- a/gendarme/framework/Gendarme.Framework/ThreadModelAttribute.cs
-+++ b/gendarme/framework/Gendarme.Framework/ThreadModelAttribute.cs
-@@ -27,6 +27,7 @@
- //
-
- using System;
-+using System.Globalization;
-
- // Note that these types are extended version of what we recommend
- // that users use. See DecorateThreadsRule documentation for a smaller version
-@@ -82,7 +83,7 @@ namespace Gendarme.Framework {
- public override string ToString ()
- {
- if (AllowsEveryCaller)
-- return string.Format ("{0} | AllowEveryCaller", Model);
-+ return String.Format (CultureInfo.InvariantCulture, "{0} | AllowEveryCaller", Model);
-
- return Model.ToString ();
- }
-@@ -96,9 +97,9 @@ namespace Gendarme.Framework {
- return this == rhs;
- }
-
-- public bool Equals (ThreadModelAttribute rhs)
-+ public bool Equals (ThreadModelAttribute other)
- {
-- return this == rhs;
-+ return this == other;
- }
-
- public static bool operator== (ThreadModelAttribute lhs, ThreadModelAttribute rhs)
-diff --git a/gendarme/framework/Makefile.am b/gendarme/framework/Makefile.am
-index afbf5d9..13cbf9e 100644
---- a/gendarme/framework/Makefile.am
-+++ b/gendarme/framework/Makefile.am
-@@ -40,6 +40,7 @@ framework_sources = \
- Gendarme.Framework.Helpers/PrimitiveReferences.cs \
- Gendarme.Framework.Helpers/StackEntryAnalysis.cs \
- Gendarme.Framework.Helpers/StackEntryUsageResult.cs \
-+ Gendarme.Framework.Helpers/StreamLineReader.cs \
- Gendarme.Framework.Rocks/AssemblyRocks.cs \
- Gendarme.Framework.Rocks/CecilRocks.cs \
- Gendarme.Framework.Rocks/CommonRocks.cs \
-@@ -86,7 +87,7 @@ framework_build_sources += $(framework_generated_sources)
-
- ../bin/Gendarme.Framework.dll: $(framework_build_sources) $(CECIL_ASM)
- test -d ../bin || mkdir ../bin
-- $(GMCS) $(GENDARME_OPTIONS) -target:library -doc:$(framework_SCRIPTS).doc -r:$(CECIL_ASM) \
-+ $(MCS) $(GENDARME_OPTIONS) -target:library -doc:$(framework_SCRIPTS).doc -r:$(CECIL_ASM) \
- -out:$@ $(framework_build_sources)
-
- framework_test_sources = \
-@@ -108,14 +109,14 @@ framework_test_sources = \
- framework_test_build_sources = $(addprefix $(srcdir)/Test/, $(framework_test_sources))
-
- Test.Framework.dll: $(framework_test_build_sources) $(framework_rules_SCRIPTS) ../bin/Gendarme.Framework.dll $(CECIL_ASM)
-- $(GMCS) $(TESTS_OPTIONS) -target:library -d:CODE_ANALYSIS -pkg:mono-nunit \
-+ $(MCS) $(TESTS_OPTIONS) -target:library -d:CODE_ANALYSIS -pkg:mono-nunit \
- -r:$(CECIL_ASM) -r:../bin/Gendarme.Framework.dll -r:../rules/Test.Rules/Test.Rules.dll \
- -out:$@ $(framework_test_build_sources)
-
- test: Test.Framework.dll
-
- run-test: test
-- MONO_PATH=../bin/:../rules/Test.Rules/:$(MONO_PATH) nunit-console2 -noshadow Test.Framework.dll
-+ MONO_PATH=../bin/:../rules/Test.Rules/:$(MONO_PATH) $(prefix)/bin/mono $(prefix)/lib/mono/4.0/nunit-console.exe Test.Framework.dll
-
- self-test: $(framework_SCRIPTS)
- mono --debug ../bin/gendarme.exe $(framework_SCRIPTS)
-diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/AssemblyRocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/AssemblyRocksTest.cs
-index c4bbafd..061bccd 100644
---- a/gendarme/framework/Test/Gendarme.Framework.Rocks/AssemblyRocksTest.cs
-+++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/AssemblyRocksTest.cs
-@@ -49,16 +49,23 @@ namespace Test.Framework.Rocks {
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void HasAttribute_Null ()
-+ public void HasAttribute_Namespace_Null ()
- {
-- assembly.HasAttribute (null);
-+ assembly.HasAttribute (null, "a");
-+ }
-+
-+ [Test]
-+ [ExpectedException (typeof (ArgumentNullException))]
-+ public void HasAttribute_Name_Null ()
-+ {
-+ assembly.HasAttribute ("a", null);
- }
-
- [Test]
- public void HasAttribute ()
- {
-- Assert.IsTrue (assembly.HasAttribute ("System.Runtime.CompilerServices.RuntimeCompatibilityAttribute"), "System.Runtime.CompilerServices.RuntimeCompatibilityAttribute");
-- Assert.IsFalse (assembly.HasAttribute ("NUnit.Framework.TestFixtureAttribute"), "TestFixtureAttribute");
-+ Assert.IsTrue (assembly.HasAttribute ("System.Runtime.CompilerServices", "RuntimeCompatibilityAttribute"), "System.Runtime.CompilerServices.RuntimeCompatibilityAttribute");
-+ Assert.IsFalse (assembly.HasAttribute ("NUnit.Framework", "TestFixtureAttribute"), "TestFixtureAttribute");
- }
- }
- }
-diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/CustomAttributeRocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/CustomAttributeRocksTest.cs
-index 65a868e..78c6f81 100644
---- a/gendarme/framework/Test/Gendarme.Framework.Rocks/CustomAttributeRocksTest.cs
-+++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/CustomAttributeRocksTest.cs
-@@ -50,59 +50,29 @@ namespace Test.Framework.Rocks {
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void Contains_Null ()
-- {
-- Collection<CustomAttribute> cac = new Collection<CustomAttribute> ();
-- cac.ContainsType ((string) null);
-- }
--
-- [Test]
-- public void Contains ()
-- {
-- TypeDefinition type = assembly.MainModule.GetType ("Test.Framework.Rocks.CustomAttributeRocksTest");
-- Collection<CustomAttribute> cac = type.CustomAttributes;
-- Assert.IsTrue (cac.ContainsType ("NUnit.Framework.TestFixtureAttribute"), "NUnit.Framework.TestFixtureAttribute");
-- Assert.IsFalse (cac.ContainsType ("NUnit.Framework.TestFixture"), "NUnit.Framework.TestFixture");
-- }
--
-- [Test]
-- [ExpectedException (typeof (ArgumentNullException))]
-- public void ContainsAny_Null ()
-- {
-- Collection<CustomAttribute> cac = new Collection<CustomAttribute> ();
-- cac.ContainsAnyType (null);
-- }
--
-- [Test]
-- public void ContainsAny ()
-+ public void HasAttribute_Namespace_Null ()
- {
- TypeDefinition type = assembly.MainModule.GetType ("Test.Framework.Rocks.CustomAttributeRocksTest");
-- Collection<CustomAttribute> cac = type.CustomAttributes;
-- Assert.IsTrue (cac.ContainsAnyType (new string[] {
-- "NUnit.Framework.TestFixtureAttribute",
-- null,
-- "System.ICloneable"
-- }), "NUnit.Framework.TestFixtureAttribute");
-- Assert.IsFalse (cac.ContainsAnyType (new string[] {}), "NUnit.Framework.TestFixture");
-+ type.HasAttribute (null, "a");
- }
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void HasAttribute_Null ()
-+ public void HasAttribute_Name_Null ()
- {
- TypeDefinition type = assembly.MainModule.GetType ("Test.Framework.Rocks.CustomAttributeRocksTest");
-- type.HasAttribute (null);
-+ type.HasAttribute ("a", null);
- }
-
- [Test]
- public void HasAttribute ()
- {
- TypeDefinition type = null;
-- Assert.IsFalse (type.HasAttribute ("NUnit.Framework.TestFixtureAttribute"), "null-type");
-+ Assert.IsFalse (type.HasAttribute ("NUnit.Framework", "TestFixtureAttribute"), "null-type");
-
- type = assembly.MainModule.GetType ("Test.Framework.Rocks.CustomAttributeRocksTest");
-- Assert.IsTrue (type.HasAttribute ("NUnit.Framework.TestFixtureAttribute"), "true");
-- Assert.IsFalse (type.HasAttribute ("NUnit.Framework.TestAttribute"), "false");
-+ Assert.IsTrue (type.HasAttribute ("NUnit.Framework", "TestFixtureAttribute"), "true");
-+ Assert.IsFalse (type.HasAttribute ("NUnit.Framework", "TestAttribute"), "false");
- }
- }
- }
-diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/FieldRocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/FieldRocksTest.cs
-index a790ed2..69ea851 100644
---- a/gendarme/framework/Test/Gendarme.Framework.Rocks/FieldRocksTest.cs
-+++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/FieldRocksTest.cs
-@@ -74,16 +74,23 @@ namespace Test.Framework.Rocks {
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void HasAttribute_Null ()
-+ public void HasAttribute_Namespace_Null ()
- {
-- GetField ("assembly").HasAttribute (null);
-+ GetField ("assembly").HasAttribute (null, "a");
-+ }
-+
-+ [Test]
-+ [ExpectedException (typeof (ArgumentNullException))]
-+ public void HasAttribute_Name_Null ()
-+ {
-+ GetField ("assembly").HasAttribute ("a", null);
- }
-
- [Test]
- public void HasAttribute ()
- {
-- Assert.IsTrue (GetField ("cga").HasAttribute ("System.Runtime.CompilerServices.CompilerGeneratedAttribute"), "CompilerGeneratedAttribute");
-- Assert.IsFalse (GetField ("cga").HasAttribute ("NUnit.Framework.TestFixtureAttribute"), "TestFixtureAttribute");
-+ Assert.IsTrue (GetField ("cga").HasAttribute ("System.Runtime.CompilerServices", "CompilerGeneratedAttribute"), "CompilerGeneratedAttribute");
-+ Assert.IsFalse (GetField ("cga").HasAttribute ("NUnit.Framework", "TestFixtureAttribute"), "TestFixtureAttribute");
- }
-
- [Test]
-diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/MethodRocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/MethodRocksTest.cs
-index c43d680..3202358 100644
---- a/gendarme/framework/Test/Gendarme.Framework.Rocks/MethodRocksTest.cs
-+++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/MethodRocksTest.cs
-@@ -112,18 +112,26 @@ namespace Test.Framework.Rocks {
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void HasAttribute_Null ()
-+ public void HasAttribute_Namespace_Null ()
- {
- MethodDefinition method = GetMethod ("FixtureSetUp");
-- method.HasAttribute ((string) null);
-+ method.HasAttribute (null, "a");
-+ }
-+
-+ [Test]
-+ [ExpectedException (typeof (ArgumentNullException))]
-+ public void HasAttribute_Name_Null ()
-+ {
-+ MethodDefinition method = GetMethod ("FixtureSetUp");
-+ method.HasAttribute ("a", null);
- }
-
- [Test]
- public void HasAttribute ()
- {
- MethodDefinition method = GetMethod ("FixtureSetUp");
-- Assert.IsTrue (method.HasAttribute ("NUnit.Framework.TestFixtureSetUpAttribute"), "NUnit.Framework.TestFixtureSetUpAttribute");
-- Assert.IsFalse (method.HasAttribute ("NUnit.Framework.TestFixtureSetUp"), "NUnit.Framework.TestFixtureSetUp");
-+ Assert.IsTrue (method.HasAttribute ("NUnit.Framework", "TestFixtureSetUpAttribute"), "NUnit.Framework.TestFixtureSetUpAttribute");
-+ Assert.IsFalse (method.HasAttribute ("NUnit.Framework", "TestFixtureSetUp"), "NUnit.Framework.TestFixtureSetUp");
- }
-
- [Test]
-diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs
-index ed62b9c..4c746fa 100644
---- a/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs
-+++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs
-@@ -49,6 +49,9 @@ namespace Test.Framework.Rocks {
- public abstract void PublicMethod ();
- protected abstract void ProtectedMethod ();
- private void PrivateMethod () { }
-+
-+ public abstract class NestedNestedPublicType {
-+ }
- }
-
- protected abstract class NestedProtectedType {
-diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs
-index 51f782f..99366be 100644
---- a/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs
-+++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs
-@@ -179,20 +179,27 @@ namespace Test.Framework.Rocks {
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void HasAttribute_Null ()
-+ public void HasAttribute_Namespace_Null ()
- {
-- GetType (String.Empty).HasAttribute (null);
-+ GetType (String.Empty).HasAttribute (null, "a");
-+ }
-+
-+ [Test]
-+ [ExpectedException (typeof (ArgumentNullException))]
-+ public void HasAttribute_Name_Null ()
-+ {
-+ GetType (String.Empty).HasAttribute ("a", null);
- }
-
- [Test]
- public void HasAttribute ()
- {
-- Assert.IsTrue (GetType (String.Empty).HasAttribute ("NUnit.Framework.TestFixtureAttribute"), "TypeRocksTest");
-- Assert.IsFalse (GetType ("/Enum").HasAttribute ("System.FlagsAttribute"), "Enum/System.FlagsAttribute");
-- Assert.IsTrue (GetType ("/Flags").HasAttribute ("System.FlagsAttribute"), "Flags/System.FlagsAttribute");
-+ Assert.IsTrue (GetType (String.Empty).HasAttribute ("NUnit.Framework", "TestFixtureAttribute"), "TypeRocksTest");
-+ Assert.IsFalse (GetType ("/Enum").HasAttribute ("System", "FlagsAttribute"), "Enum/System.FlagsAttribute");
-+ Assert.IsTrue (GetType ("/Flags").HasAttribute ("System", "FlagsAttribute"), "Flags/System.FlagsAttribute");
- // fullname is required
-- Assert.IsFalse (GetType ("/Flags").HasAttribute ("System.Flags"), "Flags/System.Flags");
-- Assert.IsFalse (GetType ("/Flags").HasAttribute ("FlagsAttribute"), "Flags/FlagsAttribute");
-+ Assert.IsFalse (GetType ("/Flags").HasAttribute ("System", "Flags"), "Flags/System.Flags");
-+ Assert.IsFalse (GetType ("/Flags").HasAttribute ("", "FlagsAttribute"), "Flags/FlagsAttribute");
- }
-
- [Test]
-@@ -204,51 +211,65 @@ namespace Test.Framework.Rocks {
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void Implements_Null ()
-+ public void Implements_Namespace_Null ()
-+ {
-+ GetType (String.Empty).Implements (null, "a");
-+ }
-+
-+ [Test]
-+ [ExpectedException (typeof (ArgumentNullException))]
-+ public void Implements_Name_Null ()
- {
-- GetType (String.Empty).Implements (null);
-+ GetType (String.Empty).Implements ("a", null);
- }
-
- [Test]
- public void Implements ()
- {
-- Assert.IsFalse (GetType (String.Empty).Implements ("System.ICloneable"), "ICloneable");
-- Assert.IsTrue (GetType ("/IDeepCloneable").Implements ("Test.Framework.Rocks.TypeRocksTest/IDeepCloneable"), "itself");
-- Assert.IsTrue (GetType ("/IDeepCloneable").Implements ("System.ICloneable"), "interface inheritance");
-- Assert.IsTrue (GetType ("/Deep").Implements ("Test.Framework.Rocks.TypeRocksTest/IDeepCloneable"), "IDeepCloneable");
-- Assert.IsTrue (GetType ("/Deep").Implements ("System.ICloneable"), "second-level ICloneable");
-- Assert.IsTrue (GetType ("/Mixin").Implements ("Test.Framework.Rocks.TypeRocksTest/IDeepCloneable"), "parent interface inheritance");
-+ Assert.IsFalse (GetType (String.Empty).Implements ("System", "ICloneable"), "ICloneable");
-+ Assert.IsTrue (GetType ("/IDeepCloneable").Implements ("Test.Framework.Rocks", "TypeRocksTest/IDeepCloneable"), "itself");
-+ Assert.IsTrue (GetType ("/IDeepCloneable").Implements ("System", "ICloneable"), "interface inheritance");
-+ Assert.IsTrue (GetType ("/Deep").Implements ("Test.Framework.Rocks", "TypeRocksTest/IDeepCloneable"), "IDeepCloneable");
-+ Assert.IsTrue (GetType ("/Deep").Implements ("System", "ICloneable"), "second-level ICloneable");
-+ Assert.IsTrue (GetType ("/Mixin").Implements ("Test.Framework.Rocks", "TypeRocksTest/IDeepCloneable"), "parent interface inheritance");
- }
-
- [Test]
- [ExpectedException (typeof (ArgumentNullException))]
-- public void Inherits_Null ()
-+ public void Inherits_Namespace_Null ()
- {
-- GetType (String.Empty).Inherits (null);
-+ GetType (String.Empty).Inherits (null, "a");
-+ }
-+
-+ [Test]
-+ [ExpectedException (typeof (ArgumentNullException))]
-+ public void Inherits_Name_Null ()
-+ {
-+ GetType (String.Empty).Inherits ("a", null);
- }
-
- [Test]
- public void Inherits ()
- {
-- Assert.IsFalse (GetType ("/NotAttribute").Inherits ("System.Attribute"), "NotAttribute");
-- Assert.IsTrue (GetType ("/AnAttribute").Inherits ("System.Attribute"), "AnAttribute");
-- Assert.IsFalse (GetType ("/ClassInheritsNotAttribute").Inherits ("System.Attribute"), "ClassInheritsNotAttribute");
-- Assert.IsTrue (GetType ("/AttributeInheritsAnAttribute").Inherits ("System.Attribute"), "AttributeInheritsAnAttribute");
-+ Assert.IsFalse (GetType ("/NotAttribute").Inherits ("System", "Attribute"), "NotAttribute");
-+ Assert.IsTrue (GetType ("/AnAttribute").Inherits ("System", "Attribute"), "AnAttribute");
-+ Assert.IsFalse (GetType ("/ClassInheritsNotAttribute").Inherits ("System", "Attribute"), "ClassInheritsNotAttribute");
-+ Assert.IsTrue (GetType ("/AttributeInheritsAnAttribute").Inherits ("System", "Attribute"), "AttributeInheritsAnAttribute");
- }
-
- [Test]
- public void Inherits_FromAnotherAssembly ()
- {
- // we can't be sure here so to avoid false positives return false
-- Assert.IsTrue (GetType ("/AttributeInheritsOuterAttribute").Inherits ("System.Attribute"), "AttributeInheritsOuterAttribute");
-- Assert.IsTrue (GetType ("/AttributeInheritsOuterAttributeDerivingAttribute").Inherits ("System.Attribute"), "AttributeInheritsOuterAttributeDerivingAttribute");
-+ Assert.IsTrue (GetType ("/AttributeInheritsOuterAttribute").Inherits ("System", "Attribute"), "AttributeInheritsOuterAttribute");
-+ Assert.IsTrue (GetType ("/AttributeInheritsOuterAttributeDerivingAttribute").Inherits ("System", "Attribute"), "AttributeInheritsOuterAttributeDerivingAttribute");
- }
-
- [Test]
- public void Inherits_Itself ()
- {
- TypeDefinition type = GetType (String.Empty);
-- Assert.IsTrue (type.Inherits (type.FullName), "itself");
-+ Assert.IsTrue (type.Inherits (type.Namespace, type.Name), "itself");
- }
-
- [Test]
-@@ -322,6 +343,50 @@ namespace Test.Framework.Rocks {
- }
-
- [Test]
-+ public void IsNamed ()
-+ {
-+ string name = "Test.Framework.Rocks.PublicType";
-+ TypeDefinition type = assembly.MainModule.GetType (name);
-+
-+ Assert.IsTrue (type.IsNamed ( "Test.Framework.Rocks.PublicType"));
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.P"));//Missing Text
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.PublicTypeExtraText"));
-+
-+ Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks", "PublicType"));
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "P"));//Missing Text
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "PublicTypeExtraText"));
-+ }
-+
-+ [Test]
-+ public void IsNamedNestedType ()
-+ {
-+ string name = "Test.Framework.Rocks.PublicType/NestedPublicType";
-+ TypeDefinition type = assembly.MainModule.GetType (name);
-+
-+ Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks.PublicType/NestedPublicType"));
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.PublicType/N"));//Missing Text
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.PublicType/NestedPublicTypeExtaStuff"));
-+
-+ Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks", "PublicType/NestedPublicType"));
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "PublicType/N"));//Missing Text
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "PublicType/NestedPublicTypeExtraText"));
-+
-+ Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "NestedPublicType"));
-+ Assert.IsFalse (type.IsNamed ("", "NestedPublicType"));
-+ }
-+
-+ [Test]
-+ public void IsNamedDoubleNestedType ()
-+ {
-+ string name = "Test.Framework.Rocks.PublicType/NestedPublicType/NestedNestedPublicType";
-+ TypeDefinition type = assembly.MainModule.GetType (name);
-+
-+ Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks.PublicType/NestedPublicType/NestedNestedPublicType"));
-+
-+ Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks", "PublicType/NestedPublicType/NestedNestedPublicType"));
-+ }
-+
-+ [Test]
- public void IsVisible ()
- {
- string name = "Test.Framework.Rocks.PublicType";
-diff --git a/gendarme/man/gendarme.1.in b/gendarme/man/gendarme.1.in
-index 0389780..cc1989f 100644
---- a/gendarme/man/gendarme.1.in
-+++ b/gendarme/man/gendarme.1.in
-@@ -33,8 +33,7 @@ Specify the rule sets and rule settings. Default is 'rules.xml'.
- Specify a rule set from configfile. Defaults to 'default'.
- .TP
- .I "--log file"
--Save the report to the specified file. If none of --log, --xml, or --html are used
--then the report is written to stdout.
-+Save the report, as a text file, to the specified file.
- .TP
- .I "--xml file"
- Save the report, formatted as XML, to the specified file.
-@@ -42,6 +41,11 @@ Save the report, formatted as XML, to the specified file.
- .I "--html file"
- Save the report, formatted as HTML, to the specified file.
- .TP
-+.I "--console"
-+Write the defects on stdout. This is the default (implicit) behavior if none of
-+--log, --xml, or --html options are specified. If (explicitely) specified then
-+the defects will be shown on both stdout and inside text/xml/html report(s).
-+.TP
- .I "--ignore ignore-file"
- Do not report defects listed in the specified file.
- .TP
-diff --git a/gendarme/mono-options.ignore b/gendarme/mono-options.ignore
-index c48ca1a..aa1799a 100644
---- a/gendarme/mono-options.ignore
-+++ b/gendarme/mono-options.ignore
-@@ -67,3 +67,15 @@ T: NDesk.Options.OptionSet
- R: Gendarme.Rules.Smells.AvoidCodeDuplicatedInSameClassRule
- T: NDesk.Options.OptionSet
-
-+R: Gendarme.Rules.Globalization.PreferStringComparisonOverrideRule
-+M: System.String NDesk.Options.OptionSet::GetArgumentName(System.Int32,System.Int32,System.String)
-+
-+R: Gendarme.Rules.Globalization.PreferIFormatProviderOverrideRule
-+M: System.Void NDesk.Options.Option::AddSeparators(System.String,System.Int32,System.Collections.Generic.ICollection`1<System.String>)
-+M: System.Boolean NDesk.Options.OptionSet::ParseBundledValue(System.String,System.String,NDesk.Options.OptionContext)
-+M: System.Void NDesk.Options.OptionValueCollection::AssertValid(System.Int32)
-+M: System.Void NDesk.Options.Option::.ctor(System.String,System.String,System.Int32)
-+M: NDesk.Options.OptionValueType NDesk.Options.Option::ParsePrototype()
-+M: T NDesk.Options.Option::Parse(System.String,NDesk.Options.OptionContext)
-+M: System.Void NDesk.Options.OptionSet::ParseValue(System.String,NDesk.Options.OptionContext)
-+
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/AvoidAssemblyVersionMismatchRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidAssemblyVersionMismatchRule.cs
-index 3b2ba33..dc43d09 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/AvoidAssemblyVersionMismatchRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidAssemblyVersionMismatchRule.cs
-@@ -25,6 +25,7 @@
- // THE SOFTWARE.
-
- using System;
-+using System.Globalization;
-
- using Mono.Cecil;
- using Mono.Cecil.Cil;
-@@ -61,26 +62,6 @@ namespace Gendarme.Rules.BadPractice {
- [Solution ("This situation can be confusing once deployed. Make sure both version are identical.")]
- public class AvoidAssemblyVersionMismatchRule : Rule, IAssemblyRule {
-
-- static bool VersionTryParse (string input, out Version result)
-- {
-- result = null;
-- if (String.IsNullOrEmpty (input))
-- return false;
--
-- try {
-- result = new Version (input);
-- return true;
-- }
-- catch (ArgumentException) {
-- // also cover ArgumentOutOfRangeException
-- }
-- catch (FormatException) {
-- }
-- catch (OverflowException) {
-- }
-- return false;
-- }
--
- public RuleResult CheckAssembly (AssemblyDefinition assembly)
- {
- if (!assembly.HasCustomAttributes)
-@@ -100,11 +81,10 @@ namespace Gendarme.Rules.BadPractice {
- // any attribute without arguments can be skipped
- if (!ca.HasConstructorArguments)
- continue;
-- if (ca.AttributeType.FullName != "System.Reflection.AssemblyFileVersionAttribute")
-+ if (!ca.AttributeType.IsNamed ("System.Reflection", "AssemblyFileVersionAttribute"))
- continue;
-
-- // FIXME: replace with Version.TryParse once we upgrade to FX4.0
-- VersionTryParse (ca.ConstructorArguments [0].Value as string, out file_version);
-+ Version.TryParse (ca.ConstructorArguments [0].Value as string, out file_version);
- break;
- }
-
-@@ -127,9 +107,11 @@ namespace Gendarme.Rules.BadPractice {
- else if (assembly_version.Revision == file_version.Revision)
- return RuleResult.Success;
-
-- string msg = String.Format ("Assembly version is '{0}' while file version is '{1}'.", assembly_version, file_version);
-+ string msg = String.Format (CultureInfo.InvariantCulture,
-+ "Assembly version is '{0}' while file version is '{1}'.", assembly_version, file_version);
- Runner.Report (assembly, s, Confidence.High, msg);
- return RuleResult.Failure;
- }
- }
- }
-+
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/AvoidCallingProblematicMethodsRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidCallingProblematicMethodsRule.cs
-index 777cc02..87d00c2 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/AvoidCallingProblematicMethodsRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidCallingProblematicMethodsRule.cs
-@@ -27,8 +27,9 @@
- //
-
- using System;
--using System.Reflection;
-+using System.Globalization;
- using System.Collections.Generic;
-+using System.Reflection;
-
- using Mono.Cecil;
- using Mono.Cecil.Cil;
-@@ -100,22 +101,22 @@ namespace Gendarme.Rules.BadPractice {
- public AvoidCallingProblematicMethodsRule ()
- {
- problematicMethods.Add ("Collect", (m, i) =>
-- (m.DeclaringType.FullName == "System.GC") ? Severity.Critical : (Severity?) null);
-+ m.DeclaringType.IsNamed ("System", "GC") ? Severity.Critical : (Severity?) null);
- problematicMethods.Add ("Suspend", (m, i) =>
-- (m.DeclaringType.FullName == "System.Threading.Thread") ? Severity.Medium : (Severity?) null);
-+ m.DeclaringType.IsNamed ("System.Threading", "Thread") ? Severity.Medium : (Severity?) null);
- problematicMethods.Add ("Resume", (m, i) =>
-- (m.DeclaringType.FullName == "System.Threading.Thread") ? Severity.Medium : (Severity?) null);
-+ m.DeclaringType.IsNamed ("System.Threading", "Thread") ? Severity.Medium : (Severity?) null);
- problematicMethods.Add ("DangerousGetHandle", (m, i) =>
-- (m.DeclaringType.FullName == "System.Runtime.InteropServices.SafeHandle") ? Severity.Critical : (Severity?) null);
-+ m.DeclaringType.IsNamed ("System.Runtime.InteropServices", "SafeHandle") ? Severity.Critical : (Severity?) null);
- problematicMethods.Add ("LoadFrom", (m, i) =>
-- (m.DeclaringType.FullName == "System.Reflection.Assembly") ? Severity.High : (Severity?) null);
-+ m.DeclaringType.IsNamed ("System.Reflection", "Assembly") ? Severity.High : (Severity?) null);
- problematicMethods.Add ("LoadFile", (m, i) =>
-- (m.DeclaringType.FullName == "System.Reflection.Assembly") ? Severity.High : (Severity?) null);
-+ m.DeclaringType.IsNamed ("System.Reflection", "Assembly") ? Severity.High : (Severity?) null);
- problematicMethods.Add ("LoadWithPartialName", (m, i) =>
-- (m.DeclaringType.FullName == "System.Reflection.Assembly") ? Severity.High : (Severity?) null);
-+ m.DeclaringType.IsNamed ("System.Reflection", "Assembly") ? Severity.High : (Severity?) null);
- problematicMethods.Add ("InvokeMember", (m, i) =>
-- (m.DeclaringType.FullName != "System.Type") ? (Severity?) null :
-- IsAccessingWithNonPublicModifiers (i) ? Severity.Critical : (Severity?) null);
-+ !m.DeclaringType.IsNamed ("System", "Type") ? (Severity?) null :
-+ IsAccessingWithNonPublicModifiers (i) ? Severity.Critical : (Severity?) null);
- }
-
- private static bool OperandIsNonPublic (BindingFlags operand)
-@@ -166,7 +167,8 @@ namespace Gendarme.Rules.BadPractice {
-
- Severity? severity = IsProblematicCall (instruction);
- if (severity.HasValue) {
-- string msg = String.Format ("You are calling to {0}, which is a potentially problematic method",
-+ string msg = String.Format (CultureInfo.InvariantCulture,
-+ "You are calling to {0}, which is a potentially problematic method",
- instruction.Operand);
- Runner.Report (method, instruction, severity.Value, Confidence.High, msg);
- }
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/AvoidNullCheckWithAsOperatorRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidNullCheckWithAsOperatorRule.cs
-new file mode 100644
-index 0000000..26394d9
---- /dev/null
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidNullCheckWithAsOperatorRule.cs
-@@ -0,0 +1,141 @@
-+//
-+// Gendarme.Rules.BadPractice.AvoidNullCheckWithAsOperatorRule
-+//
-+// Authors:
-+// Sebastien Pouliot <sebastien at ximian.com>
-+//
-+// Copyright (C) 2011 Novell, Inc (http://www.novell.com)
-+//
-+// 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 System;
-+
-+using Mono.Cecil;
-+using Mono.Cecil.Cil;
-+
-+using Gendarme.Framework;
-+using Gendarme.Framework.Engines;
-+using Gendarme.Framework.Helpers;
-+using Gendarme.Framework.Rocks;
-+
-+namespace Gendarme.Rules.BadPractice {
-+
-+ /// <summary>
-+ /// The rule will detect if a null check is done before using the <c>as</c> operator.
-+ /// This null check is not needed, a <c>null</c> instance will return <c>null</c>,
-+ /// and the code will need to deal with <c>as</c> returning a null value anyway.
-+ /// </summary>
-+ /// <example>
-+ /// Bad example:
-+ /// <code>
-+ /// public string AsString (object obj)
-+ /// {
-+ /// return (o == null) ? null : o as string;
-+ /// }
-+ /// </code>
-+ /// </example>
-+ /// <example>
-+ /// Good example:
-+ /// <code>
-+ /// public string AsString (object obj)
-+ /// {
-+ /// return (o as string);
-+ /// }
-+ /// </code>
-+ /// </example>
-+ // as suggested in https://bugzilla.novell.com/show_bug.cgi?id=651305
-+ [Problem ("An unneeded null check is done before using the 'as' operator.")]
-+ [Solution ("Remove the extraneous null check")]
-+ [EngineDependency (typeof (OpCodeEngine))]
-+ public class AvoidNullCheckWithAsOperatorRule : Rule, IMethodRule {
-+
-+ OpCodeBitmask mask = new OpCodeBitmask (0x100000, 0x10000000000000, 0x0, 0x0);
-+
-+ static bool CheckFalseBranch (Instruction ins)
-+ {
-+ Instruction next = ins.Next;
-+ if (!next.Is (ins.Previous.OpCode.Code))
-+ return false;
-+
-+ if (!(ins.Operand as Instruction).Is (Code.Ldnull))
-+ return false;
-+
-+ return CheckIsinst (next.Next);
-+ }
-+
-+ static bool CheckTrueBranch (Instruction ins)
-+ {
-+ if (!ins.Next.Is (Code.Ldnull))
-+ return false;
-+
-+ Instruction br = (ins.Operand as Instruction);
-+ if (ins.Previous.OpCode.Code != br.OpCode.Code)
-+ return false;
-+
-+ return CheckIsinst (br.Next);
-+ }
-+
-+ static bool CheckIsinst (Instruction ins)
-+ {
-+ if (!ins.Is (Code.Isinst))
-+ return false;
-+ return (ins.Next.OpCode.FlowControl != FlowControl.Cond_Branch);
-+ }
-+
-+ public RuleResult CheckMethod (MethodDefinition method)
-+ {
-+ // rule only applies to methods with IL...
-+ if (!method.HasBody)
-+ return RuleResult.DoesNotApply;
-+
-+ // and when the IL contains both a isinst and ldnull
-+ if (!mask.IsSubsetOf (OpCodeEngine.GetBitmask (method)))
-+ return RuleResult.DoesNotApply;
-+
-+ foreach (Instruction ins in method.Body.Instructions) {
-+ bool detected = false;
-+ switch (ins.OpCode.Code) {
-+ case Code.Brfalse_S:
-+ case Code.Brfalse:
-+ detected = CheckFalseBranch (ins);
-+ break;
-+ case Code.Brtrue_S:
-+ case Code.Brtrue:
-+ detected = CheckTrueBranch (ins);
-+ break;
-+ }
-+ if (detected)
-+ Runner.Report (method, ins, Severity.Medium, Confidence.Normal);
-+ }
-+
-+ return Runner.CurrentRuleResult;
-+ }
-+#if false
-+ public void Bitmask ()
-+ {
-+ OpCodeBitmask mask = new OpCodeBitmask ();
-+ mask.Set (Code.Isinst);
-+ mask.Set (Code.Ldnull);
-+ Console.WriteLine (mask);
-+ }
-+#endif
-+ }
-+}
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/AvoidVisibleConstantFieldRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidVisibleConstantFieldRule.cs
-index 0831682..c18be47 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/AvoidVisibleConstantFieldRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/AvoidVisibleConstantFieldRule.cs
-@@ -24,6 +24,8 @@
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
-
-+using System.Globalization;
-+
- using Mono.Cecil;
- using Mono.Cecil.Cil;
-
-@@ -80,11 +82,12 @@ namespace Gendarme.Rules.BadPractice {
-
- // we let null constant for all reference types (since they can't be changed to anything else)
- // except for strings (which can be modified later)
-- string type_name = field.FieldType.FullName;
-- if (!field.FieldType.IsValueType && (type_name != "System.String"))
-+ TypeReference ftype = field.FieldType;
-+ if (!ftype.IsValueType && !ftype.IsNamed ("System", "String"))
- continue;
-
-- string msg = string.Format ("'{0}' of type {1}.", field.Name, type_name);
-+ string msg = string.Format (CultureInfo.InvariantCulture, "'{0}' of type {1}.",
-+ field.Name, ftype.GetFullName ());
- Runner.Report (field, Severity.High, Confidence.High, msg);
-
- }
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewExceptionWithoutThrowingRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewExceptionWithoutThrowingRule.cs
-index e40aed6..183a18c 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewExceptionWithoutThrowingRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewExceptionWithoutThrowingRule.cs
-@@ -96,7 +96,7 @@ namespace Gendarme.Rules.BadPractice {
-
- MethodReference constructor = (MethodReference) ins.Operand;
-
-- if (!constructor.DeclaringType.Inherits ("System.Exception"))
-+ if (!constructor.DeclaringType.Inherits ("System", "Exception"))
- continue;
-
- // quick check to save resources
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewThreadWithoutStartRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewThreadWithoutStartRule.cs
-index 3f01bb1..ac0c146 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewThreadWithoutStartRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/CheckNewThreadWithoutStartRule.cs
-@@ -110,8 +110,6 @@ namespace Gendarme.Rules.BadPractice {
- return false;
- }
-
-- private const string Thread = "System.Threading.Thread";
--
- public override void Initialize (IRunner runner)
- {
- base.Initialize (runner);
-@@ -119,8 +117,10 @@ namespace Gendarme.Rules.BadPractice {
- // if the module does not reference (sealed) System.Threading.Thread
- // then no code inside the module will instanciate it
- Runner.AnalyzeModule += delegate (object o, RunnerEventArgs e) {
-- Active = (e.CurrentAssembly.Name.Name == "mscorlib") ||
-- e.CurrentModule.HasTypeReference (Thread);
-+ Active = (e.CurrentAssembly.Name.Name == "mscorlib" ||
-+ e.CurrentModule.AnyTypeReference ((TypeReference tr) => {
-+ return tr.IsNamed ("System.Threading", "Thread");
-+ }));
- };
- }
-
-@@ -141,11 +141,11 @@ namespace Gendarme.Rules.BadPractice {
-
- MethodReference constructor = (MethodReference) ins.Operand;
-
-- if (constructor.DeclaringType.FullName != Thread)
-+ if (!constructor.DeclaringType.IsNamed ("System.Threading", "Thread"))
- continue;
- if (ins.Next != null && (ins.Next.OpCode.Code == Code.Call || ins.Next.OpCode.Code == Code.Callvirt)) { //quick check to safe resources
- MethodReference calledMethod = (MethodReference) ins.Next.Operand;
-- if ((calledMethod.DeclaringType.FullName == Thread) && (calledMethod.Name == "Start"))
-+ if (calledMethod.IsNamed ("System.Threading", "Thread", "Start"))
- continue;
- }
-
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/CloneMethodShouldNotReturnNullRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/CloneMethodShouldNotReturnNullRule.cs
-index eff7ae0..e740a02 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/CloneMethodShouldNotReturnNullRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/CloneMethodShouldNotReturnNullRule.cs
-@@ -69,8 +69,6 @@ namespace Gendarme.Rules.BadPractice {
- [Solution ("Return an appropriate object instead of returning null.")]
- public class CloneMethodShouldNotReturnNullRule : ReturnNullRule, IMethodRule {
-
-- private const string ICloneable = "System.ICloneable";
--
- public override void Initialize (IRunner runner)
- {
- base.Initialize (runner);
-@@ -78,8 +76,10 @@ namespace Gendarme.Rules.BadPractice {
- // if the module does not reference System.ICloneable then
- // no type inside will be implementing it
- Runner.AnalyzeModule += delegate (object o, RunnerEventArgs e) {
-- Active = (e.CurrentAssembly.Name.Name == "mscorlib") ||
-- e.CurrentModule.HasTypeReference (ICloneable);
-+ Active = (e.CurrentAssembly.Name.Name == "mscorlib" ||
-+ e.CurrentModule.AnyTypeReference ((TypeReference tr) => {
-+ return tr.IsNamed ("System", "ICloneable");
-+ }));
- };
- }
-
-@@ -90,7 +90,7 @@ namespace Gendarme.Rules.BadPractice {
- return RuleResult.DoesNotApply;
-
- // where the type implements ICloneable
-- if (!method.DeclaringType.Implements (ICloneable))
-+ if (!method.DeclaringType.Implements ("System", "ICloneable"))
- return RuleResult.DoesNotApply;
-
- // call base class to detect if the method can return null
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/ConstructorShouldNotCallVirtualMethodsRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/ConstructorShouldNotCallVirtualMethodsRule.cs
-index d3758bb..7f47cf5 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/ConstructorShouldNotCallVirtualMethodsRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/ConstructorShouldNotCallVirtualMethodsRule.cs
-@@ -28,6 +28,7 @@
-
- using System;
- using System.Collections.Generic;
-+using System.Globalization;
- using System.Linq;
-
- using Mono.Cecil;
-@@ -177,7 +178,7 @@ namespace Gendarme.Rules.BadPractice {
- if (mr.HasThis)
- parameters++;
- parameters += mr.Parameters.Count;
-- if (mr.ReturnType.FullName != "System.Void")
-+ if (!mr.ReturnType.IsNamed ("System", "Void"))
- parameters--;
- }
- break;
-@@ -196,7 +197,7 @@ namespace Gendarme.Rules.BadPractice {
- if (!OpCodeBitmask.Calls.Intersect (OpCodeEngine.GetBitmask (method)))
- return;
-
-- string method_name = method.ToString ();
-+ string method_name = method.GetFullName ();
- // check to avoid constructors calling recursive methods
- if (stack.Contains (method_name))
- return;
-@@ -216,12 +217,14 @@ namespace Gendarme.Rules.BadPractice {
- continue;
-
- // check that we're not calling the method on another object
-- if (!IsCallFromInstance (current.Previous, md.Parameters.Count))
-+ int n = md.HasParameters ? md.Parameters.Count : 0;
-+ if (!IsCallFromInstance (current.Previous, n))
- continue;
-
- if (md.IsVirtual && !md.IsFinal) {
- string s = stack.Count == 0 ? method_name : stack.Aggregate ((a1, a2) => a1 + ", " + Environment.NewLine + a2);
-- s = String.Format ("Calling a virtual method, '{0}' from {1}.", md, s);
-+ s = String.Format (CultureInfo.InvariantCulture,
-+ "Calling a virtual method, '{0}' from {1}.", md, s);
- Runner.Report (method, current, Severity.High, Confidence.High, s);
- } else {
- stack.Push (method_name);
-diff --git a/gendarme/rules/Gendarme.Rules.BadPractice/DisableDebuggingCodeRule.cs b/gendarme/rules/Gendarme.Rules.BadPractice/DisableDebuggingCodeRule.cs
-index f1c6049..9534ca5 100644
---- a/gendarme/rules/Gendarme.Rules.BadPractice/DisableDebuggingCodeRule.cs
-+++ b/gendarme/rules/Gendarme.Rules.BadPractice/DisableDebuggingCodeRule.cs
-@@ -89,9 +89,6 @@ namespace Gendarme.Rules.BadPractice {
- [EngineDependency (typeof (OpCodeEngine))]
- public class DisableDebuggingCodeRule : Rule, IMethodRule {
-
-- private const string ConditionalAttribute = "System.Diagnostics.ConditionalAttribute";
-- private const string Console = "System.Console";
--
- // note: there can be multiple [Conditional] attribute on a method
- private static bool HasConditionalAttributeForDebugging (IList<CustomAttribute> cac)
- {
-@@ -101,7 +98,7 @@ namespace Gendarme.Rules.BadPractice {
- // any attribute without arguments can be skipped
- if (!ca.HasConstructorArguments)
- continue;
-- if (ca.AttributeType.FullName == ConditionalAttribute) {
-+ if (ca.AttributeType.IsNamed ("System.Diagnostics", "ConditionalAttribute")) {
- switch (ca.ConstructorArguments [0].Value as string) {
- case "DEBUG":
- case "TRACE":
<Skipped 24548 lines>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/mono-tools.git/commitdiff/7dd103429b4c3275e73bb6035cdaff037e130d18
More information about the pld-cvs-commit
mailing list