Skip to content

Commit 0541fe7

Browse files
author
Nathanael Anderson
committed
Fix for extra MetaData duplication and invalid rehydration with Kotlin extensions if more than one method with the same name exists.
1 parent 18c896c commit 0541fe7

File tree

5 files changed

+197
-43
lines changed

5 files changed

+197
-43
lines changed

test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Builder.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ static TreeNode build(List<String> paths) throws Exception {
9898
}
9999
}
100100

101+
System.out.println("Added Properties "+TreeNode.addedProperties);
102+
System.out.println("Ignored Properties "+TreeNode.skippedProperties+" duplicates.");
103+
System.out.println("Added Methods "+TreeNode.addedMethods);
104+
System.out.println("Ignored Methods "+TreeNode.skippedMethods+" duplicates.");
105+
System.out.println("Added Fields "+TreeNode.addedFields);
106+
System.out.println("Ignored Fields "+TreeNode.skippedFields+" duplicates.");
107+
108+
101109

102110
return root;
103111
}
@@ -161,7 +169,7 @@ private static void setNodeMembers(NativeClassDescriptor clazz, TreeNode node, T
161169
node.setWentThroughSettingMembers(true);
162170

163171
Map<String, MethodInfo> existingMethods = new HashMap<>();
164-
for (MethodInfo mi : node.instanceMethods) {
172+
for (MethodInfo mi : node.getInstanceMethods()) {
165173
existingMethods.put(mi.name + mi.sig, mi);
166174
}
167175
NativeMethodDescriptor[] extensionFunctions = ExtensionFunctionsStorage.getInstance().retrieveFunctions(clazz.getClassName()).toArray(new NativeMethodDescriptor[0]);
@@ -228,7 +236,7 @@ private static void setMethodsInfo(TreeNode root, TreeNode node, NativeClassDesc
228236
if (isStatic) {
229237
if (!mi.isExtensionFunction) {
230238
mi.declaringType = getOrCreateNode(root, clazz, null);
231-
node.staticMethods.add(mi);
239+
node.addStaticFunction(mi);
232240
} else {
233241
mi.declaringType = getOrCreateNode(root, ownMethod.getDeclaringClass(), null);
234242
node.addExtensionFunction(mi);
@@ -238,13 +246,13 @@ private static void setMethodsInfo(TreeNode root, TreeNode node, NativeClassDesc
238246
if (existingNodeMethods.containsKey(sig)) {
239247
continue;
240248
}
241-
node.instanceMethods.add(mi);
249+
node.addInstanceMethod(mi);
242250
}
243251
}
244252

245-
if (mi.isResolved) {
246-
node.resolvedMethods.add(mi);
247-
}
253+
/* if (mi.isResolved) {
254+
node.addResolvedMethod(mi);
255+
} */
248256
}
249257
}
250258

@@ -301,9 +309,9 @@ private static void setFieldInfo(NativeClassDescriptor clazz, TreeNode node, Tre
301309
} else {
302310
fi.declaringType = getOrCreateNode(root, clazz, null);
303311
}
304-
node.staticFields.add(fi);
312+
node.addStaticField(fi);
305313
} else {
306-
node.instanceFields.add(fi);
314+
node.addInstanceField(fi);
307315
}
308316
}
309317
}

test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Generator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
import java.util.ArrayList;
1515
import java.util.List;
1616

17+
import static java.lang.System.exit;
18+
1719
public class Generator {
1820

1921
private static final String VERBOSE_FLAG_NAME = "verbose";
22+
private static final String SKIP_FLAG_NAME = "skip";
2023
private static final String ANALYTICS_ARGUMENT_BEGINNING = "analyticsFilePath=";
2124
private static final String MDG_OUTPUT_DIR = "mdg-output-dir.txt";
2225
private static final String MDG_JAVA_DEPENDENCIES = "mdg-java-dependencies.txt";
@@ -61,7 +64,7 @@ public static void main(String[] args) {
6164
} catch (Throwable ex) {
6265
System.err.println(String.format("Error executing Metadata Generator: %s", ex.getMessage()));
6366
ex.printStackTrace(System.out);
64-
System.exit(1);
67+
exit(1);
6568
}
6669
}
6770

@@ -72,6 +75,9 @@ private static void enableFlaggedFeatures(String[] args) {
7275
AnalyticsConfiguration.enableAnalytics(filePath);
7376
} else if (VERBOSE_FLAG_NAME.equals(arg)) {
7477
MetadataFilterConsoleLogger.INSTANCE.setEnabled(true);
78+
} else if (SKIP_FLAG_NAME.equals(arg)) {
79+
System.out.println("Exiting");
80+
exit(0);
7581
}
7682
}
7783
}

test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/TreeNode.java

Lines changed: 132 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
import java.util.Optional;
1111

1212
public class TreeNode {
13+
public static int skippedMethods=0;
14+
public static int skippedProperties=0;
15+
public static int skippedFields=0;
16+
public static int addedMethods=0;
17+
public static int addedProperties=0;
18+
public static int addedFields=0;
19+
1320
public static class MethodInfo {
1421
public MethodInfo(NativeMethodDescriptor m) {
1522
this.name = m.getName();
@@ -97,7 +104,7 @@ public TreeNode() {
97104
staticFields = new ArrayList<>();
98105
properties = new ArrayList<>();
99106
extensionFunctions = new ArrayList<>();
100-
resolvedMethods = new ArrayList<>();
107+
//resolvedMethods = new ArrayList<>();
101108
}
102109

103110
public static final TreeNode BYTE = getPrimitive("B", (byte) 1);
@@ -222,40 +229,155 @@ public void setName(String value) {
222229
//
223230
public TreeNode arrayElement;
224231
//
225-
public ArrayList<MethodInfo> instanceMethods;
226-
public ArrayList<MethodInfo> staticMethods;
227-
public ArrayList<FieldInfo> instanceFields;
228-
public ArrayList<FieldInfo> staticFields;
229-
ArrayList<PropertyInfo> properties;
230-
ArrayList<MethodInfo> extensionFunctions;
231-
ArrayList<MethodInfo> resolvedMethods;
232+
private ArrayList<MethodInfo> instanceMethods;
233+
private ArrayList<MethodInfo> staticMethods;
234+
private ArrayList<FieldInfo> instanceFields;
235+
private ArrayList<FieldInfo> staticFields;
236+
private ArrayList<PropertyInfo> properties;
237+
private ArrayList<MethodInfo> extensionFunctions;
238+
//private ArrayList<MethodInfo> resolvedMethods;
232239
public TreeNode baseClassNode;
233240
TreeNode parentNode;
234241
//
235242

236243
void addProperty(PropertyInfo propertyInfo) {
244+
for (int i=0;i<properties.size();i++) {
245+
PropertyInfo pi = properties.get(i);
246+
if (pi.propertyName.equals(propertyInfo.propertyName)) {
247+
if (pi.getterMethod != null || propertyInfo.getterMethod != null) {
248+
if (pi.getterMethod != null && propertyInfo.getterMethod != null) {
249+
if (pi.getterMethod.sig != propertyInfo.getterMethod.sig) {
250+
continue;
251+
}
252+
} else {
253+
continue;
254+
}
255+
}
256+
if (pi.setterMethod != null || propertyInfo.setterMethod != null) {
257+
if (pi.setterMethod != null && propertyInfo.setterMethod != null) {
258+
if (pi.setterMethod.sig != propertyInfo.setterMethod.sig) {
259+
continue;
260+
}
261+
} else {
262+
continue;
263+
}
264+
}
265+
skippedProperties++;
266+
return;
267+
}
268+
}
237269
properties.add(propertyInfo);
270+
addedProperties++;
271+
}
272+
273+
void addStaticField(FieldInfo fieldInfo) {
274+
for (int i=0;i<staticFields.size();i++) {
275+
FieldInfo fi = staticFields.get(i);
276+
if (fi.name.equals(fieldInfo.name) && fi.isFinalType == fieldInfo.isFinalType) {
277+
if (fi.declaringType == fieldInfo.declaringType && fi.valueType == fieldInfo.valueType) {
278+
skippedFields++;
279+
return;
280+
}
281+
}
282+
}
283+
staticFields.add(fieldInfo);
284+
addedFields++;
285+
}
286+
287+
288+
void addInstanceField(FieldInfo fieldInfo) {
289+
for (int i=0;i<instanceFields.size();i++) {
290+
FieldInfo fi = instanceFields.get(i);
291+
if (fi.name.equals(fieldInfo.name) && fi.isFinalType == fieldInfo.isFinalType) {
292+
if (fi.declaringType == fieldInfo.declaringType && fi.valueType == fieldInfo.valueType) {
293+
skippedFields++;
294+
return;
295+
}
296+
}
297+
}
298+
instanceFields.add(fieldInfo);
299+
addedFields++;
238300
}
239301

240302
void addExtensionFunction(MethodInfo methodInfo) {
303+
for (int i=0;i<extensionFunctions.size();i++) {
304+
MethodInfo mi = extensionFunctions.get(i);
305+
if (mi.name.equals(methodInfo.name) && mi.sig.equals(methodInfo.sig)) {
306+
if (mi.isResolved == methodInfo.isResolved) {
307+
if (mi.declaringType == methodInfo.declaringType) {
308+
skippedMethods++;
309+
return;
310+
}
311+
}
312+
}
313+
}
241314
extensionFunctions.add(methodInfo);
315+
addedMethods++;
316+
}
317+
318+
void addStaticFunction(MethodInfo methodInfo) {
319+
for (int i=0;i<staticMethods.size();i++) {
320+
MethodInfo mi = staticMethods.get(i);
321+
if (mi.name.equals(methodInfo.name) && mi.sig.equals(methodInfo.sig)) {
322+
if (mi.isResolved == methodInfo.isResolved) {
323+
if (mi.declaringType == methodInfo.declaringType) {
324+
skippedMethods++;
325+
return;
326+
}
327+
}
328+
}
329+
}
330+
this.staticMethods.add(methodInfo);
331+
addedMethods++;
332+
}
333+
334+
void addInstanceMethod(MethodInfo methodInfo) {
335+
for (int i=0;i<instanceMethods.size();i++) {
336+
MethodInfo mi = instanceMethods.get(i);
337+
if (mi.name.equals(methodInfo.name) && mi.sig.equals(methodInfo.sig)) {
338+
if (mi.isResolved == methodInfo.isResolved) {
339+
if (mi.declaringType == methodInfo.declaringType) {
340+
skippedMethods++;
341+
return;
342+
}
343+
}
344+
}
345+
}
346+
instanceMethods.add(methodInfo);
347+
addedMethods++;
242348
}
243349

244350
List<PropertyInfo> getProperties() {
245351
return properties;
246352
}
247353

354+
List<FieldInfo> getInstanceFields() {
355+
return instanceFields;
356+
}
357+
358+
List<FieldInfo> getStaticFields() {
359+
return staticFields;
360+
}
361+
248362
List<MethodInfo> getExtensionFunctions() {
249363
return extensionFunctions;
250364
}
251365

252-
void addResolvedMethod(MethodInfo resolvedMethod) {
366+
List<MethodInfo> getInstanceMethods() {
367+
return instanceMethods;
368+
}
369+
370+
List<MethodInfo> getStaticMethods() {
371+
return staticMethods;
372+
}
373+
374+
/* void addResolvedMethod(MethodInfo resolvedMethod) {
253375
resolvedMethods.add(resolvedMethod);
254376
}
255377
256378
List<MethodInfo> getResolvedMethods() {
257379
return resolvedMethods;
258-
}
380+
} */
259381

260382
private boolean wentThroughSettingMembers = false;
261383

test-app/build-tools/android-metadata-generator/src/src/com/telerik/metadata/Writer.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,16 @@ public void writeClassValue(StreamWriter writer,
123123
writeTreeNodeId(extensionFunction.declaringType, writer);
124124
}
125125

126-
int len = writeLength(n.instanceMethods.size(), writer);
126+
List<MethodInfo> instanceMethods = n.getInstanceMethods();
127+
int len = writeLength(instanceMethods.size(), writer);
127128
for (int i = 0; i < len; i++) {
128-
writeMethodInfo(n.instanceMethods.get(i), stringsMap, writer);
129+
writeMethodInfo(instanceMethods.get(i), stringsMap, writer);
129130
}
130131

131-
len = writeLength(n.instanceFields.size(), writer);
132+
List<FieldInfo> instanceFields = n.getInstanceFields();
133+
len = writeLength(instanceFields.size(), writer);
132134
for (int i = 0; i < len; i++) {
133-
FieldInfo fi = n.instanceFields.get(i);
135+
FieldInfo fi = instanceFields.get(i);
134136
int pos = stringsMap.get(fi.name).intValue(); // get start position
135137
// of the name
136138
writeInt(pos, writer); // write start position of the name of the
@@ -168,16 +170,18 @@ public void writeClassValue(StreamWriter writer,
168170
}
169171
}
170172

171-
len = writeLength(n.staticMethods.size(), writer);
173+
List<MethodInfo> staticMethods = n.getStaticMethods();
174+
len = writeLength(staticMethods.size(), writer);
172175
for (int i = 0; i < len; i++) {
173-
MethodInfo mi = n.staticMethods.get(i);
176+
MethodInfo mi = staticMethods.get(i);
174177
writeMethodInfo(mi, stringsMap, writer);
175178
writeTreeNodeId(mi.declaringType, writer);
176179
}
177180

178-
len = writeLength(n.staticFields.size(), writer);
181+
List<FieldInfo> staticFields = n.getStaticFields();
182+
len = writeLength(staticFields.size(), writer);
179183
for (int i = 0; i < len; i++) {
180-
FieldInfo fi = n.staticFields.get(i);
184+
FieldInfo fi = staticFields.get(i);
181185
int pos = stringsMap.get(fi.name).intValue();
182186
writeInt(pos, writer);
183187
writeTreeNodeId(fi.valueType, writer);
@@ -222,26 +226,30 @@ public void writeTree(TreeNode root) throws Exception {
222226

223227
if (((n.nodeType & TreeNode.Interface) == TreeNode.Interface)
224228
|| ((n.nodeType & TreeNode.Class) == TreeNode.Class)) {
225-
for (int i = 0; i < n.instanceMethods.size(); i++) {
226-
name = n.instanceMethods.get(i).name;
229+
List<MethodInfo> instanceMethods = n.getInstanceMethods();
230+
for (int i = 0; i < instanceMethods.size(); i++) {
231+
name = instanceMethods.get(i).name;
227232
if (!uniqueStrings.containsKey(name)) {
228233
writeUniqueName(name, uniqueStrings, outStringsStream);
229234
}
230235
}
231-
for (int i = 0; i < n.staticMethods.size(); i++) {
232-
name = n.staticMethods.get(i).name;
236+
List<MethodInfo> staticMethods = n.getStaticMethods();
237+
for (int i = 0; i < staticMethods.size(); i++) {
238+
name = staticMethods.get(i).name;
233239
if (!uniqueStrings.containsKey(name)) {
234240
writeUniqueName(name, uniqueStrings, outStringsStream);
235241
}
236242
}
237-
for (int i = 0; i < n.instanceFields.size(); i++) {
238-
name = n.instanceFields.get(i).name;
243+
List<FieldInfo> instanceFields = n.getInstanceFields();
244+
for (int i = 0; i < instanceFields.size(); i++) {
245+
name = instanceFields.get(i).name;
239246
if (!uniqueStrings.containsKey(name)) {
240247
writeUniqueName(name, uniqueStrings, outStringsStream);
241248
}
242249
}
243-
for (int i = 0; i < n.staticFields.size(); i++) {
244-
name = n.staticFields.get(i).name;
250+
List<FieldInfo> staticFields = n.getStaticFields();
251+
for (int i = 0; i < staticFields.size(); i++) {
252+
name = staticFields.get(i).name;
245253
if (!uniqueStrings.containsKey(name)) {
246254
writeUniqueName(name, uniqueStrings, outStringsStream);
247255
}

0 commit comments

Comments
 (0)