Skip to content

Conversation

@jonpryor
Copy link
Contributor

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.

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.
@jonathanpeppers jonathanpeppers enabled auto-merge (squash) September 19, 2025 19:11
@jonathanpeppers
Copy link
Member

/azp run

@azure-pipelines
Copy link

No pipelines are associated with this pull request.

@jonathanpeppers jonathanpeppers merged commit 19be370 into dotnet:main Sep 19, 2025
2 checks passed
@github-actions github-actions bot locked and limited conversation to collaborators Oct 20, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants