class NameAllocator : Cloneable
Assigns Kotlin identifier names to avoid collisions, keywords, and invalid characters. To use, first create an instance and allocate all of the names that you need. Typically this is a mix of user-supplied names and constants:
NameAllocator nameAllocator = new NameAllocator();
for (MyProperty property : properties) {
nameAllocator.newName(property.name(), property);
}
nameAllocator.newName("sb", "string builder");
Pass a unique tag object to each allocation. The tag scopes the name, and can be used to look up
the allocated name later. Typically the tag is the object that is being named. In the above
example we use property for the user-supplied property names, and "string builder" for our
constant string builder.
Once we've allocated names we can use them when generating code:
FunSpec.Builder builder = FunSpec.builder("toString")
.addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC)
.returns(String.class);
builder.addStatement("%1T %2N = new %1T()",
StringBuilder.class, nameAllocator.get("string builder"));
for (MyProperty property : properties) {
builder.addStatement("%N.append(%N)",
nameAllocator.get("string builder"), nameAllocator.get(property));
}
builder.addStatement("return %N", nameAllocator.get("string builder"));
return builder.build();
The above code generates unique names if presented with conflicts. Given user-supplied properties
with names ab and sb this generates the following:
@Override public String toString() {
StringBuilder sb_ = new StringBuilder();
sb_.append(ab);
sb_.append(sb);
return sb_.toString();
}
The underscore is appended to sb to avoid conflicting with the user-supplied sb property.
Underscores are also prefixed for names that start with a digit, and used to replace name-unsafe
characters like space or dash.
When dealing with multiple independent inner scopes, use a clone of the NameAllocator used for the outer scope to further refine name allocation for a specific inner scope.
| <init> |
NameAllocator() |
| clone |
fun clone(): NameAllocator
Create a deep copy of this NameAllocator. Useful to create multiple independent refinements of a NameAllocator to be used in the respective definition of multiples, independently-scoped, inner code blocks. |
| get |
fun get(tag: Any): String
Retrieve a name created with NameAllocator.newName. |
| newName |
fun newName(suggestion: String, tag: Any = UUID.randomUUID().toString()): String
Return a new name using |