Commit 19be370
authored
[Java.Interop.Tools.Generator] Improve ExtractApiLevel() resiliency (#1365)
Context: f07b538
Context: https://github.com/jpobst/BindingStudio
While using jpobst/BindingStudio to enumify API-36.1, it would crash:
System.NotSupportedException: Could not parse `W` as an ApiLevel.
at Java.Interop.Tools.Generator.AndroidSdkVersion.Parse(String value) in W:\src\jpobst\BindingStudio\external\Java.Interop\src\Java.Interop.Tools.Generator\Utilities\AndroidSdkVersion.cs:line 124
at Java.Interop.Tools.Generator.NamingConverter.ParseApiLevel(String value) in W:\src\jpobst\BindingStudio\external\Java.Interop\src\Java.Interop.Tools.Generator\Utilities\NamingConverter.cs:line 21
at Java.Interop.Tools.Generator.NamingConverter.ParseApiLevel(XElement element) in W:\src\jpobst\BindingStudio\external\Java.Interop\src\Java.Interop.Tools.Generator\Utilities\NamingConverter.cs:line 60
at Java.Interop.Tools.Generator.Enumification.MethodMapEntry.FromElement(XElement element, String parameterName) in W:\src\jpobst\BindingStudio\external\Java.Interop\src\Java.Interop.Tools.Generator\Enumification\MethodMapEntry.cs:line 41
at Java.Interop.Tools.Generator.Enumification.MethodMapEntry.FromElement(XElement element, String parameterName) in W:\src\jpobst\BindingStudio\external\Java.Interop\src\Java.Interop.Tools.Generator\Enumification\MethodMapEntry.cs:line 54
at Java.Interop.Tools.Generator.Enumification.MethodMapEntry.FromXml(XElement element)+MoveNext() in W:\src\jpobst\BindingStudio\external\Java.Interop\src\Java.Interop.Tools.Generator\Enumification\MethodMapEntry.cs:line 31
The cause of the crash is that the `api-36.1.xml` file it was
processing had `//@merge.SourceFile` attributes with the value:
merge.SourceFile="…Xamarin-Work/src/dotnet/android/build-tools/create-android-api/../../bin/BuildDebug/api/api-36.1.xml.in"
Notice the `-Work` in the value. This was used by `ExtractApiLevel()`
to try to find numbers after the `-`, but `W` was after the `-`, not
numbers.
This didn't previously matter because f07b538 noted:
> *Note*: Changes to `NamingConverter.ParseApiLevel()` are largely a
> nothing-burger because the dotnet/android side usually has metadata:
>
> <attr
> api-since="36.1"
> path="/api//*[contains(@merge.SourceFile,'api-CANARY.xml.in')]"
> name="api-since">36.1</attr
>
> which explicitly adds/sets `//@api-since` based on the
> `//@merge.SourceFile` value.
However, when jpobst/BindingStudio is used, `src/Mono.Android/metadata`
is *not* used, and `//@merge.SourceFile` is instead used.
Improve `ParseApiLevel()` to check for an `api-` prefix before
looking for trailing numeric data.1 parent 02bceb0 commit 19be370
File tree
2 files changed
+11
-4
lines changed- src/Java.Interop.Tools.Generator/Utilities
- tests/Java.Interop.Tools.Generator-Tests/Utilities
2 files changed
+11
-4
lines changedLines changed: 7 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
30 | | - | |
31 | | - | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
32 | 34 | | |
| 35 | + | |
33 | 36 | | |
34 | | - | |
| 37 | + | |
35 | 38 | | |
36 | 39 | | |
37 | 40 | | |
| |||
46 | 49 | | |
47 | 50 | | |
48 | 51 | | |
49 | | - | |
| 52 | + | |
50 | 53 | | |
51 | 54 | | |
52 | 55 | | |
| |||
Lines changed: 4 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
25 | 29 | | |
26 | 30 | | |
27 | 31 | | |
| |||
0 commit comments