You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fixes: #739Fixes: #852Fixes: #853
Context: #789
Context: #814
Context: #815
Today, we use a process called `ApiXmlAdjuster` to convert our "new"
`class-parse` format to the old `jar2xml` format. This process
attempts to resolve every Java type referenced by the library we
intend to bind. However, performing this as a separate step has
some disadvantages:
- It duplicates work by reading in `api.xml.class-parse`
and Cecil'ing all reference assemblies, then writing it back out
as `api.xml`.
`generator` then reads in `api.xml` and Cecils all the reference
assemblies again.
- This work is performed as a separate step before `generator` and
thus cannot be influenced by `metadata`.
- This work is cached, which is "good", but it creates issues for
users because they only see warnings from it for full Rebuilds.
"Replace" `ApiXmlAdjuster` with `Java.Interop.Tools.JavaTypeSystem`,
which is a much more robust Java model to perform this work, and
contains enough information to be reused by `generator`.
This prevents us from needing to have a second Java and Cecil import
step, and we can run `metadata` directly on `api.xml.class-parse`
before the import.
NOTE: This commit sets the groundwork for the above benefits, but
does not achieve them yet. Initially we are only focused on
achieving parity with `ApiXmlAdjuster` to make correctness
comparisons possible.
The new `JavaTypeSystem` infrastructure is used by default; the
previous `ApiXmlAdjuster` system can be used instead by using:
generator --use-legacy-java-resolver=true …
We will provide an MSBuild property to control this when we integrate
with xamarin-android in the future.
~~ Warning Messages ~~
In order to better surface potentially real errors to users, we have
tweaked the warnings displayed. Errors we encounter during the
initial phase of Java type resolution are emitted as warnings.
These are missing external Java types and generally indicate the user
is missing a reference `.jar` or binding NuGet:
warning BG8605: The Java type 'androidx.appcompat.widget.AppCompatTextView' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)
The remaining resolution errors are generally the fallout from those
missing external types. For example, if the above missing type
caused us to remove `com.example.MyTextView`, then that may result in
us removing the method `GetMyTextView()` due to a missing return type.
Today these messages are only displayed in a Diagnostic log and are
often missed. Instead, we are going to write them to a log file
called `java-resolution-report.log`, and then display a warning
notifying the user that some types could not be bound, which can be
double clicked to view the log file.
warning BG8606: Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.
Example `java-resolution-report.log`:
==== Cycle 1 ====
'[Class] com.example.MyTextView' was removed because the Java type 'androidx.appcompat.widget.AppCompatTextView' could not be found.
==== Cycle 2 ====
'[Method] com.example.MyActivity.getMyTextView' was removed because the Java type 'com.example.MyTextView' could not be found.
"Cycles" represent the passes through the type collection when
resolving the collection. For example:
- Cycle 1 removed type `com.example.MyType` because its external
base type `android.util.List` was missing
- Cycle 2 removed type `com.example.MyDerivedType` because its base
type `com.example.MyType` is now missing
- Cycle 3 removed method `com.example.Foo.getBar()` because it
returns `com.example.MyDerivedType`, which is now missing
This distinction can be interesting, because Cycle 1 removals are
generally due to missing `.jar` dependencies, whereas the remaining
cycles are just the internal fallout from previous cycles, which will
largely be fixed by fixing the first cycle issues.
~~ Additional Fixes ~~
There are several issues with the `ApiXmlAdjuster` process that *can*
be fixed by this change. For the initial purpose of being able to
verify that we produce the same output, these have been disabled in
the new `JavaTypeSystem` code.
* [ApiXmlAdjuster removes required methods from interfaces][0] -
Currently disabled via flag
`TypeResolutionOptions.RemoveInterfacesWithUnresolvableMembers`.
* [ApiXmlAdjuster fails to resolve parent type parameters for nested types][1] -
Currently commented out in `JavaTypeModel.GetApplicableTypeParameters()`.
* [ApiXmlAdjuster doesn't remove nested types][2] -
Currently enabled, compares have been done with a custom
`ApiXmlAdjuster` where this has been fixed.
* [ApiXmlAdjuster prefers JavaList over ArrayList][3] -
Currently enabled, compares have been done with a custom
`ApiXmlAdjuster` where this has been fixed.
~~ Performance ~~
Although performance isn't really a focus, there are wins here as well,
largely due to only resolving reference types that are actually
referenced. Example: `ApiXmlAdjuster` fully resolves all 5K+ types in
`Mono.Android.dll`, while `JavaTypeSystem` only resolves the ones
needed by the library being bound.
Time to resolve `androidx.appcompat.appcompat`:
* ApiXmlAdjuster: 2849ms
* JavaTypeSystem: 1514ms
~~ Testing ~~
- Unit tests have been ported from `ApiXmlAdjuster-Tests`
- Tested for identical output for 136 current AndroidX packages
- Tested for identical output for 140 current GPS/FB packages
Note `Mono.Android.dll` does not use `ApiXmlAdjuster`, so no testing
was performed with it.
[0]: #814
[1]: #815
[2]: #852
[3]: #853
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/Resources.resx
+8Lines changed: 8 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -253,6 +253,14 @@ The following terms should not be translated: <package>.</comment>
253
253
<value>Could not find top ancestor type '{0}' for nested type '{1}'.</value>
254
254
<comment>{0}, {1} - .NET types.</comment>
255
255
</data>
256
+
<dataname="Generator_BG8605"xml:space="preserve">
257
+
<value>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</value>
258
+
<comment>{0} - Java type.</comment>
259
+
</data>
260
+
<dataname="Generator_BG8606"xml:space="preserve">
261
+
<value>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</value>
262
+
<comment>The following terms should not be translated: java-resolution-report.log</comment>
263
+
</data>
256
264
<dataname="Generator_BG8700"xml:space="preserve">
257
265
<value>Unknown return type '{0}' for member '{1}'.</value>
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/xlf/Resources.cs.xlf
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -167,6 +167,16 @@ The following terms should not be translated: <package>.</note>
167
167
<targetstate="new">Could not find top ancestor type '{0}' for nested type '{1}'.</target>
168
168
<note>{0}, {1} - .NET types.</note>
169
169
</trans-unit>
170
+
<trans-unitid="Generator_BG8605">
171
+
<source>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</source>
172
+
<targetstate="new">The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</target>
173
+
<note>{0} - Java type.</note>
174
+
</trans-unit>
175
+
<trans-unitid="Generator_BG8606">
176
+
<source>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</source>
177
+
<targetstate="new">Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</target>
178
+
<note>The following terms should not be translated: java-resolution-report.log</note>
179
+
</trans-unit>
170
180
<trans-unitid="Generator_BG8700">
171
181
<source>Unknown return type '{0}' for member '{1}'.</source>
172
182
<targetstate="new">Unknown return type '{0}' for member '{1}'.</target>
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/xlf/Resources.de.xlf
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -167,6 +167,16 @@ The following terms should not be translated: <package>.</note>
167
167
<targetstate="new">Could not find top ancestor type '{0}' for nested type '{1}'.</target>
168
168
<note>{0}, {1} - .NET types.</note>
169
169
</trans-unit>
170
+
<trans-unitid="Generator_BG8605">
171
+
<source>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</source>
172
+
<targetstate="new">The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</target>
173
+
<note>{0} - Java type.</note>
174
+
</trans-unit>
175
+
<trans-unitid="Generator_BG8606">
176
+
<source>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</source>
177
+
<targetstate="new">Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</target>
178
+
<note>The following terms should not be translated: java-resolution-report.log</note>
179
+
</trans-unit>
170
180
<trans-unitid="Generator_BG8700">
171
181
<source>Unknown return type '{0}' for member '{1}'.</source>
172
182
<targetstate="new">Unknown return type '{0}' for member '{1}'.</target>
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/xlf/Resources.es.xlf
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -167,6 +167,16 @@ The following terms should not be translated: <package>.</note>
167
167
<targetstate="new">Could not find top ancestor type '{0}' for nested type '{1}'.</target>
168
168
<note>{0}, {1} - .NET types.</note>
169
169
</trans-unit>
170
+
<trans-unitid="Generator_BG8605">
171
+
<source>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</source>
172
+
<targetstate="new">The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</target>
173
+
<note>{0} - Java type.</note>
174
+
</trans-unit>
175
+
<trans-unitid="Generator_BG8606">
176
+
<source>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</source>
177
+
<targetstate="new">Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</target>
178
+
<note>The following terms should not be translated: java-resolution-report.log</note>
179
+
</trans-unit>
170
180
<trans-unitid="Generator_BG8700">
171
181
<source>Unknown return type '{0}' for member '{1}'.</source>
172
182
<targetstate="new">Unknown return type '{0}' for member '{1}'.</target>
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/xlf/Resources.fr.xlf
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -167,6 +167,16 @@ The following terms should not be translated: <package>.</note>
167
167
<targetstate="new">Could not find top ancestor type '{0}' for nested type '{1}'.</target>
168
168
<note>{0}, {1} - .NET types.</note>
169
169
</trans-unit>
170
+
<trans-unitid="Generator_BG8605">
171
+
<source>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</source>
172
+
<targetstate="new">The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</target>
173
+
<note>{0} - Java type.</note>
174
+
</trans-unit>
175
+
<trans-unitid="Generator_BG8606">
176
+
<source>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</source>
177
+
<targetstate="new">Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</target>
178
+
<note>The following terms should not be translated: java-resolution-report.log</note>
179
+
</trans-unit>
170
180
<trans-unitid="Generator_BG8700">
171
181
<source>Unknown return type '{0}' for member '{1}'.</source>
172
182
<targetstate="new">Unknown return type '{0}' for member '{1}'.</target>
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/xlf/Resources.it.xlf
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -167,6 +167,16 @@ The following terms should not be translated: <package>.</note>
167
167
<targetstate="new">Could not find top ancestor type '{0}' for nested type '{1}'.</target>
168
168
<note>{0}, {1} - .NET types.</note>
169
169
</trans-unit>
170
+
<trans-unitid="Generator_BG8605">
171
+
<source>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</source>
172
+
<targetstate="new">The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</target>
173
+
<note>{0} - Java type.</note>
174
+
</trans-unit>
175
+
<trans-unitid="Generator_BG8606">
176
+
<source>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</source>
177
+
<targetstate="new">Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</target>
178
+
<note>The following terms should not be translated: java-resolution-report.log</note>
179
+
</trans-unit>
170
180
<trans-unitid="Generator_BG8700">
171
181
<source>Unknown return type '{0}' for member '{1}'.</source>
172
182
<targetstate="new">Unknown return type '{0}' for member '{1}'.</target>
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/xlf/Resources.ja.xlf
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -167,6 +167,16 @@ The following terms should not be translated: <package>.</note>
167
167
<targetstate="new">Could not find top ancestor type '{0}' for nested type '{1}'.</target>
168
168
<note>{0}, {1} - .NET types.</note>
169
169
</trans-unit>
170
+
<trans-unitid="Generator_BG8605">
171
+
<source>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</source>
172
+
<targetstate="new">The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</target>
173
+
<note>{0} - Java type.</note>
174
+
</trans-unit>
175
+
<trans-unitid="Generator_BG8606">
176
+
<source>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</source>
177
+
<targetstate="new">Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</target>
178
+
<note>The following terms should not be translated: java-resolution-report.log</note>
179
+
</trans-unit>
170
180
<trans-unitid="Generator_BG8700">
171
181
<source>Unknown return type '{0}' for member '{1}'.</source>
172
182
<targetstate="new">Unknown return type '{0}' for member '{1}'.</target>
Copy file name to clipboardExpand all lines: src/Java.Interop.Localization/xlf/Resources.ko.xlf
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -167,6 +167,16 @@ The following terms should not be translated: <package>.</note>
167
167
<targetstate="new">Could not find top ancestor type '{0}' for nested type '{1}'.</target>
168
168
<note>{0}, {1} - .NET types.</note>
169
169
</trans-unit>
170
+
<trans-unitid="Generator_BG8605">
171
+
<source>The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</source>
172
+
<targetstate="new">The Java type '{0}' could not be found (are you missing a Java reference jar/aar or a Java binding library NuGet?)</target>
173
+
<note>{0} - Java type.</note>
174
+
</trans-unit>
175
+
<trans-unitid="Generator_BG8606">
176
+
<source>Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</source>
177
+
<targetstate="new">Some types or members could not be bound because referenced Java types could not be found. See the 'java-resolution-report.log' file for details.</target>
178
+
<note>The following terms should not be translated: java-resolution-report.log</note>
179
+
</trans-unit>
170
180
<trans-unitid="Generator_BG8700">
171
181
<source>Unknown return type '{0}' for member '{1}'.</source>
172
182
<targetstate="new">Unknown return type '{0}' for member '{1}'.</target>
0 commit comments