forked from dotnet/java-interop
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[generator] Only skip generic "overloads" of bound types
Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=57828 The #runtime team is attempting to update xamarin-android to use the [mono/2017-06][0] and [mono/2017-08][1] (and...) branches, and when doing so they are seeing a unit test fail in `Xamarin.Android.Build.Tests.BuildTest.GeneratorValidateMultiMethodEventName()`: no `BG850*` warnings are expected but they are produced. After much analysis, the cause of ght `BG850*` warnings is that the mono/2017-06 branch introduces a non-generic "overload" of `System.Collections.Generic.KeyValuePair`: namespace System.Collections.Generic { // New with mono/2017-06 partial class KeyValuePair { public static KeyValuePair<TKey, TValue> Create<TKey, TValue>(TKey key, TValue value); } // Existing since forever partial struct KeyValuePair<TKey, TValue> { } } Specifically, the above "`KeyValuePair` overload" type runs into a FIXME within `CodeGenerator.cs`: // FIXME: at some stage we want to import generic types. // For now generator fails to load generic types that have conflicting type e.g. // AdapterView`1 and AdapterView cannot co-exist. // It is mostly because generator primarily targets jar (no real generics land). The problem is that the check that is performed is too strict: given a type `AdapterView<T>`, we only check to see if `AdapterView` exists as well. If it does exist, then we *ignore* the `AdapterView<T>` type, and only use the `AdapterView` type for code generation. This check causes us to skip type registration for `KeyValuePair<TKey, TValue>`, which in turn causes us to invalidate e.g. `IDictionary<TKey, TValue>` -- as it implements `ICollection<KeyValuePair<TKey, TValue>>` -- and everything promply falls apart from there: warning BG8C00: For type System.Collections.Generic.IDictionary`2, base interface System.Collections.Generic.ICollection`1<System.Collections.Generic.KeyValuePair`2<TKey,TValue>> is invalid. warning BG8C00: For type System.Collections.Generic.IDictionary`2, base interface System.Collections.Generic.IEnumerable`1<System.Collections.Generic.KeyValuePair`2<TKey,TValue>> is invalid. warning BG8502: Invalidating System.Collections.Generic.IDictionary`2 and all nested types because some of its interfaces were invalid. warning BG8801: Invalid parameter type System.Collections.Generic.IDictionary`2<System.String,System.Collections.Generic.IList`1<System.String>> in method MapEquivalents in managed type Java.Util.Locale.LanguageRange. warning BG8801: Invalid parameter type System.Collections.Generic.IDictionary`2<System.String,System.Collections.Generic.IList`1<System.String>> in method Parse in managed type Java.Util.Locale.LanguageRange. warning BG8801: Invalid parameter type System.Collections.Generic.IDictionary`2<System.String,System.Object> in method NewFileSystem in managed type Java.Nio.FileNio.Spi.FileSystemProvider. warning BG8801: Invalid parameter type System.Collections.Generic.IDictionary`2<System.String,System.Object> in method NewFileSystem in managed type Java.Nio.FileNio.Spi.FileSystemProvider. warning BG8801: Invalid parameter type System.Collections.Generic.IDictionary`2<System.String,System.String> in method .ctor in managed type Java.Security.Provider.Service. warning BG8801: Invalid parameter type System.Collections.Generic.IDictionary`2<System.Object,System.Object> in method PutAll in managed type Java.Security.Provider. I still don't fully understand the scenario that the check was attempting to solve, so in lieu of actually fixing the FIXME, make the check *stricter* so that we only ignore "generically overloaded" types if they bind the *same* Java type. Since `KeyValuePair<TKey, TValue>` binds *no* Java type, it will no longer be skipped, thus removing the BG8502 and related warnings. Additionally, a bit of code cleanup for consistency: some parts of the code use `HAVE_CECIL`, and others use `USE_CECIL`. Standardize on `HAVE_CECIL` for consistency and sanity. [0]: dotnet/android#631 [1]: dotnet/android#723
- Loading branch information
Showing
11 changed files
with
38 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters