Skip to content

Commit

Permalink
ROASTER-51: Improved parameter naming algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Sep 11, 2015
1 parent 7067926 commit 9536b43
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 2 deletions.
40 changes: 40 additions & 0 deletions api/src/main/java/org/jboss/forge/roaster/model/util/Methods.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,44 @@ public static MethodSource<?>[] addInheritedAbstractMethods(final Class<?> sourc
return methods.toArray(new MethodSource<?>[methods.size()]);
}

/**
* Generate the parameter names of a given {@link Method}
*/
public static String[] generateParameterNames(Class<?>[] parameterTypes)
{
List<String> parameterNames = new ArrayList<String>();
for (Class<?> paramType : parameterTypes)
{
// Check if we haven't already used it.
String name = toParamName(paramType.getSimpleName());
String paramName = name;
int idx = 1;
while (parameterNames.contains(paramName))
{
paramName = name + idx++;
}
parameterNames.add(paramName);
}
return parameterNames.toArray(new String[parameterNames.size()]);
}

static String toParamName(String type)
{
StringBuilder name = new StringBuilder(type);
int i;
for (i = 0; i < name.length(); i++)
{
if (!Character.isUpperCase(name.charAt(i)))
{
// Go back one index
i--;
break;
}
}
if (i == 0)
name.setCharAt(0, Character.toLowerCase(name.charAt(0)));
else if (i > 0)
name.replace(0, i, name.substring(0, i).toLowerCase());
return name.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.roaster.model.util;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

import java.awt.List;
import java.util.Arrays;
import java.util.Map;

import org.hamcrest.CoreMatchers;
import org.junit.Test;

/**
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
public class MethodsTest
{

@Test
public void testParamNameSingleUpperCase()
{
assertEquals("facesContext", Methods.toParamName("FacesContext"));
}

@Test
public void testParamNameMultipleUpperCase()
{
assertEquals("uiComponent", Methods.toParamName("UIComponent"));
}

@Test
public void testParamNameAllLowerCase()
{
assertEquals("myclass", Methods.toParamName("myclass"));
}

@Test
public void testParametersSameTypes()
{
String[] paramNames = Methods.generateParameterNames(new Class[] { List.class, List.class });
assertThat(Arrays.asList(paramNames), CoreMatchers.hasItems("list", "list1"));
}

@Test
public void testParametersDifferentTypes()
{
String[] paramNames = Methods.generateParameterNames(new Class[] { Map.class, List.class });
assertThat(Arrays.asList(paramNames), CoreMatchers.hasItems("map", "list"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.jboss.forge.roaster.model.source.MethodSource;
import org.jboss.forge.roaster.model.source.ParameterSource;
import org.jboss.forge.roaster.model.source.TypeVariableSource;
import org.jboss.forge.roaster.model.util.Methods;
import org.jboss.forge.roaster.model.util.Strings;
import org.jboss.forge.roaster.model.util.Types;

Expand Down Expand Up @@ -109,9 +110,11 @@ else if (Modifier.isPrivate(mod))
// Set method name
setName(reflectMethod.getName());
// Set method parameters
for (Class<?> paramType : reflectMethod.getParameterTypes())
Class<?>[] paramTypes = reflectMethod.getParameterTypes();
String[] paramNames = Methods.generateParameterNames(paramTypes);
for (int i = 0; i < paramTypes.length; i++)
{
addParameter(paramType, "arg" + method.parameters().size());
addParameter(paramTypes[i], paramNames[i]);
}
// Set method body
{
Expand Down

0 comments on commit 9536b43

Please sign in to comment.