[Mono-devel-list] [PATCH] Check for assembly attributes
Marek Safar
marek.safar at seznam.cz
Fri Aug 5 03:29:26 EDT 2005
Hello Carlos
>>+ string [] args = a.GetString ().Trim ().Split (new char [] {','});
>>
>>a.GetString () can return null.
>>
>>
>>
>
>I don't think so. When the emtpy string is passed, it shows no errors.
>When you don't pass any argument, it will complain about the
>parameter. Or I'm missing something?
>
>
Sorry, you are right.
>
>
>>+ CheckAttributeValid (a);
>>
>>Could you rename the method to be more explicit ?
>>
>>
>>
>
>I changed it to CheckAttributeValidity, but I'm not very sure about
>it. Do you have any better idea?
>
>
What about 'CheckInternalsVisibleAttribute' ?
>
>The other things were applied. I attached two test cases. Do you think
>we could need more tests?
>
>
They look fine.
BTW: Could not we use AssemblyName class from corlib to avoid this
parsing code ?
Marek
>------------------------------------------------------------------------
>
>Index: typemanager.cs
>===================================================================
>--- typemanager.cs (revisión: 47987)
>+++ typemanager.cs (copia de trabajo)
>@@ -106,6 +106,7 @@
> static internal Type compiler_generated_attr_type;
> static internal Type fixed_buffer_attr_type;
> static internal Type default_charset_type;
>+ static public Type internals_visible_attr_type;
>
> //
> // An empty array of types
>@@ -1232,6 +1233,7 @@
> compiler_generated_attr_type = CoreLookupType ("System.Runtime.CompilerServices.CompilerGeneratedAttribute");
> fixed_buffer_attr_type = CoreLookupType ("System.Runtime.CompilerServices.FixedBufferAttribute");
> default_charset_type = CoreLookupType ("System.Runtime.InteropServices.DefaultCharSetAttribute");
>+ internals_visible_attr_type = CoreLookupType ("System.Runtime.CompilerServices.InternalsVisibleToAttribute");
> //
> // When compiling corlib, store the "real" types here.
> //
>Index: ChangeLog
>===================================================================
>--- ChangeLog (revisión: 47987)
>+++ ChangeLog (copia de trabajo)
>@@ -1,3 +1,9 @@
>+2005-08-03 Carlos Alberto Cortez <calberto at gmail.com>
>+
>+ * codegen.cs
>+ (AssemblyClass.CheckAttributeValid): New method to check
>+ validity in assembly attributes.
>+
> 2005-08-03 Martin Baulig <martin at ximian.com>
>
> Make iterators in generic methods work; see gtest-191.cs.
>Index: codegen.cs
>===================================================================
>--- codegen.cs (revisión: 47987)
>+++ codegen.cs (copia de trabajo)
>@@ -1186,6 +1186,42 @@
> Report.Error (1548, "Error during assembly signing. " + text);
> }
>
>+ void CheckAttributeValidity (Attribute a)
>+ {
>+ Type t = a.Type;
>+ if (t == TypeManager.internals_visible_attr_type) {
>+ string [] args = a.GetString ().Trim ().Split (new char [] {','});
>+
>+ bool is_name_valid = true;
>+ bool version = false, culture = false, key_token = false;
>+ for (int i = 1; i < args.Length; i++) {
>+ string [] values = args [i].Split (new char [] {'='});
>+ if (values.Length < 2 || values [1] == String.Empty) {
>+ is_name_valid = false;
>+ break;
>+ }
>+
>+ if (String.CompareOrdinal (values [0], "Version") == 0)
>+ version = true;
>+ else if (String.CompareOrdinal (values [0], "Culture") == 0)
>+ culture = true;
>+ else if (String.CompareOrdinal (values [0], "PublicKeyToken") == 0)
>+ key_token = true;
>+ // PublicKey is the only valid entry
>+ else if (String.CompareOrdinal (values [0], "PublicKey") != 0) {
>+ is_name_valid = false;
>+ break;
>+ }
>+ }
>+
>+ // If the name is invalid, report CS1700
>+ if (!is_name_valid || args [0] == "")
>+ Report.Warning (1700, 3, a.Location, "Assembly reference '" + a.GetString () + "' is invalid and cannot be resolved");
>+ else if (culture || key_token || version)
>+ throw new Exception ("Friend assembly '" + a.GetString () + "' is invalid. InternalsVisibleTo cannot have version, culture or key token specified.");
>+ }
>+ }
>+
> public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder customBuilder)
> {
> if (a.Type.IsSubclassOf (TypeManager.security_attr_type) && a.CheckSecurityActionValidity (true)) {
>@@ -1196,6 +1232,7 @@
> return;
> }
>
>+ CheckAttributeValidity (a);
> Builder.SetCustomAttribute (customBuilder);
> }
>
>
>
>------------------------------------------------------------------------
>
>// gcs0647.cs: Error during emitting `System.Runtime.CompilerServices.InternalsVisibleToAttribute' attribute.
>// The reason is `Friend assembly 'AssemblySomething,Version=1.2.3.4,Culture=neutral,PublicKeyToken=27576a8182a18822' is invalid.
>// InternalsVisibleTo cannot have version, culture or key token specified.'
>// Line: 8
>using System;
>using System.Runtime.CompilerServices;
>
>[assembly: InternalsVisibleTo ("AssemblySomething,Version=1.2.3.4,Culture=neutral,PublicKeyToken=27576a8182a18822")]
>
>public class InternalsVisibleToTest {
>
> static void Main ()
> {
> }
>
>}
>
>
>
>------------------------------------------------------------------------
>
>// gcs0647-2.cs: Error during emitting `System.Runtime.CompilerServices.InternalsVisibleToAttribute' attribute.
>// The reason is `Friend assembly 'AssemblySomething,PublicKeyToken=27576a8182a18822' is invalid.
>// InternalsVisibleTo cannot have version, culture or key token specified.'
>// Line: 8
>using System;
>using System.Runtime.CompilerServices;
>
>[assembly: InternalsVisibleTo ("AssemblySomething,PublicKeyToken=27576a8182a18822")]
>
>public class InternalsVisibleToTest {
>
> static void Main ()
> {
> }
>
>}
>
>
>
More information about the Mono-devel-list
mailing list