@Test public void getRegisterSizeWithBuilderTypeListReturnsExpectedValue() { List<BuilderTypeReference> types = new LinkedList<BuilderTypeReference>(); BuilderTypeReference typeRef1 = mock(BuilderTypeReference.class); BuilderTypeReference typeRef2 = mock(BuilderTypeReference.class); when(typeRef1.getType()).thenReturn("I"); when(typeRef2.getType()).thenReturn("J"); types.add(typeRef1); types.add(typeRef2); BuilderTypeList typeList = new BuilderTypeList(types); int registerSize = Utils.getRegisterSize(typeList); assertEquals(3, registerSize); }
public static List<String> builderTypeListToTypeNames(BuilderTypeList typeList) { return typeList.stream().map(BuilderTypeReference::getType).collect(Collectors.toCollection(LinkedList::new)); }
@Override public int size() { return interfaces.size(); } };
@Nonnull @Override public Iterator<String> iterator() { return Iterators.transform(interfaces.iterator(), Functions.toStringFunction()); }
@Override public int getNullableItemOffset(@Nullable BuilderTypeList key) { return (key==null||key.size()==0)?DexWriter.NO_OFFSET:key.offset; }
@Test public void builderTypeListToStringListReturnsExpected() { List<BuilderTypeReference> types = new LinkedList<BuilderTypeReference>(); BuilderTypeReference typeRef1 = mock(BuilderTypeReference.class); BuilderTypeReference typeRef2 = mock(BuilderTypeReference.class); when(typeRef1.getType()).thenReturn("typeRef1"); when(typeRef2.getType()).thenReturn("typeRef2"); types.add(typeRef1); types.add(typeRef2); BuilderTypeList typeList = new BuilderTypeList(types); List<String> typeNames = Utils.builderTypeListToTypeNames(typeList); assertEquals(2, typeNames.size()); assertEquals("typeRef1", typeNames.get(0)); assertEquals("typeRef2", typeNames.get(1)); }
@Override public int getNullableItemOffset(@Nullable BuilderTypeList key) { return (key==null||key.size()==0)?DexWriter.NO_OFFSET:key.offset; }
/** * Get list of types for objects in parameter registers for a given method signature. * This is different {@code Utils.getParameterTypes} in that non-static methods also have * the 'this' (p0) parse virtual in the return value. * Note: For non-static method, * * @return list of internal format parameter types */ @Override public List<String> getParameterTypeNames() { List<String> parameterTypes = method.getParameterTypes().stream().map(BuilderTypeReference::getType).collect(Collectors.toList()); if (!isStatic()) { // First "parameter" for non-static methods is instance parse parameterTypes.add(0, type.getName()); } return parameterTypes; }
@Nonnull public BuilderTypeList internTypeList(@Nullable List<? extends CharSequence> types) { if (types == null || types.size() == 0) { return BuilderTypeList.EMPTY; } BuilderTypeList ret = internedItems.get(types); if (ret != null) { return ret; } BuilderTypeList typeList = new BuilderTypeList( ImmutableList.copyOf(Iterables.transform(types, new Function<CharSequence, BuilderTypeReference>() { @Nonnull @Override public BuilderTypeReference apply(CharSequence input) { return dexBuilder.typeSection.internType(input.toString()); } }))); ret = internedItems.putIfAbsent(typeList, typeList); return ret==null?typeList:ret; }
@Override public int getNullableItemOffset(@Nullable BuilderTypeList key) { return (key==null||key.size()==0)?DexWriter.NO_OFFSET:key.offset; }
@Nonnull public BuilderTypeList internTypeList(@Nullable List<? extends CharSequence> types) { if (types == null || types.size() == 0) { return BuilderTypeList.EMPTY; } BuilderTypeList ret = internedItems.get(types); if (ret != null) { return ret; } BuilderTypeList typeList = new BuilderTypeList( ImmutableList.copyOf(Iterables.transform(types, new Function<CharSequence, BuilderTypeReference>() { @Nonnull @Override public BuilderTypeReference apply(CharSequence input) { return dexBuilder.typeSection.internType(input.toString()); } }))); ret = internedItems.putIfAbsent(typeList, typeList); return ret==null?typeList:ret; }
@Nonnull public BuilderTypeList internTypeList(@Nullable List<? extends CharSequence> types) { if (types == null || types.size() == 0) { return BuilderTypeList.EMPTY; } BuilderTypeList ret = internedItems.get(types); if (ret != null) { return ret; } BuilderTypeList typeList = new BuilderTypeList( ImmutableList.copyOf(Iterables.transform(types, new Function<CharSequence, BuilderTypeReference>() { @Nonnull @Override public BuilderTypeReference apply(CharSequence input) { return context.typePool.internType(input.toString()); } }))); ret = internedItems.putIfAbsent(typeList, typeList); return ret==null?typeList:ret; }