blob: bcb3bbeb95390d2574fdf7c9f4f33e0a221c6e81 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2013 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core;
import java.util.Map;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.core.compiler.InvalidInputException;
import org.eclipse.jdt.internal.codeassist.impl.AssistOptions;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.parser.Scanner;
import org.eclipse.jdt.internal.compiler.parser.ScannerHelper;
import org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
import org.eclipse.jdt.internal.compiler.util.SimpleSetOfCharArray;
public class InternalNamingConventions {
private static final char[] DEFAULT_NAME = "name".toCharArray(); //$NON-NLS-1$
private static Scanner getNameScanner(CompilerOptions compilerOptions) {
return
new Scanner(
false /*comment*/,
false /*whitespace*/,
false /*nls*/,
compilerOptions.sourceLevel /*sourceLevel*/,
null /*taskTags*/,
null/*taskPriorities*/,
true/*taskCaseSensitive*/);
}
private static void acceptName(
char[] name,
char[] prefix,
char[] suffix,
boolean isFirstPrefix,
boolean isFirstSuffix,
int reusedCharacters,
INamingRequestor requestor) {
if(prefix.length > 0 && suffix.length > 0) {
requestor.acceptNameWithPrefixAndSuffix(name, isFirstPrefix, isFirstSuffix, reusedCharacters);
} else if(prefix.length > 0){
requestor.acceptNameWithPrefix(name, isFirstPrefix, reusedCharacters);
} else if(suffix.length > 0){
requestor.acceptNameWithSuffix(name, isFirstSuffix, reusedCharacters);
} else {
requestor.acceptNameWithoutPrefixAndSuffix(name, reusedCharacters);
}
}
private static char[][] computeBaseTypeNames(char[] typeName, boolean isConstantField, char[][] excludedNames){
if (isConstantField) {
return computeNonBaseTypeNames(typeName, isConstantField, false);
} else {
char[] name = computeBaseTypeNames(typeName[0], excludedNames);
if(name != null) {
return new char[][]{name};
} else {
// compute variable name like from non base type
return computeNonBaseTypeNames(typeName, isConstantField, false);
}
}
}
private static char[] computeBaseTypeNames(char firstName, char[][] excludedNames){
char[] name = new char[]{firstName};
for(int i = 0 ; i < excludedNames.length ; i++){
if(CharOperation.equals(name, excludedNames[i], false)) {
name[0]++;
if(name[0] > 'z')
name[0] = 'a';
if(name[0] == firstName)
return null;
i = 0;
}
}
return name;
}
private static char[][] computeNonBaseTypeNames(char[] sourceName, boolean isConstantField, boolean onlyLongest){
int length = sourceName.length;
if (length == 0) {
return CharOperation.NO_CHAR_CHAR;
}
if (length == 1) {
if (isConstantField) {
return generateConstantName(new char[][]{CharOperation.toLowerCase(sourceName)}, 0, onlyLongest);
} else {
return generateNonConstantName(new char[][]{CharOperation.toLowerCase(sourceName)}, 0, onlyLongest);
}
}
char[][] nameParts = new char[length][];
int namePartsPtr = -1;
int endIndex = length;
char c = sourceName[length - 1];
final int IS_LOWER_CASE = 1;
final int IS_UPPER_CASE = 2;
final int IS_UNDERSCORE = 3;
final int IS_OTHER = 4;
int previousCharKind =
ScannerHelper.isLowerCase(c) ? IS_LOWER_CASE :
ScannerHelper.isUpperCase(c) ? IS_UPPER_CASE :
c == '_' ? IS_UNDERSCORE : IS_OTHER;
for(int i = length - 1 ; i >= 0 ; i--){
c = sourceName[i];
int charKind =
ScannerHelper.isLowerCase(c) ? IS_LOWER_CASE :
ScannerHelper.isUpperCase(c) ? IS_UPPER_CASE :
c == '_' ? IS_UNDERSCORE : IS_OTHER;
switch (charKind) {
case IS_LOWER_CASE:
if (previousCharKind == IS_UPPER_CASE) {
nameParts[++namePartsPtr] = CharOperation.subarray(sourceName, i + 1, endIndex);
endIndex = i + 1;
}
previousCharKind = IS_LOWER_CASE;
break;
case IS_UPPER_CASE:
if (previousCharKind == IS_LOWER_CASE) {
nameParts[++namePartsPtr] = CharOperation.subarray(sourceName, i, endIndex);
if (i > 0) {
char pc = sourceName[i - 1];
previousCharKind =
ScannerHelper.isLowerCase(pc) ? IS_LOWER_CASE :
ScannerHelper.isUpperCase(pc) ? IS_UPPER_CASE :
pc == '_' ? IS_UNDERSCORE : IS_OTHER;
}
endIndex = i;
} else {
previousCharKind = IS_UPPER_CASE;
}
break;
case IS_UNDERSCORE:
switch (previousCharKind) {
case IS_UNDERSCORE:
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=283539
// Process consecutive underscores only for constant types
if (isConstantField) {
if (i > 0) {
char pc = sourceName[i - 1];
previousCharKind =
ScannerHelper.isLowerCase(pc) ? IS_LOWER_CASE :
ScannerHelper.isUpperCase(pc) ? IS_UPPER_CASE :
pc == '_' ? IS_UNDERSCORE : IS_OTHER;
}
endIndex = i;
}
break;
case IS_LOWER_CASE:
case IS_UPPER_CASE:
nameParts[++namePartsPtr] = CharOperation.subarray(sourceName, i + 1, endIndex);
if (i > 0) {
char pc = sourceName[i - 1];
previousCharKind =
ScannerHelper.isLowerCase(pc) ? IS_LOWER_CASE :
ScannerHelper.isUpperCase(pc) ? IS_UPPER_CASE :
pc == '_' ? IS_UNDERSCORE : IS_OTHER;
}
// Include the '_' also. E.g. My_word -> "My_" and "word".
endIndex = i+1;
break;
default:
previousCharKind = IS_UNDERSCORE;
break;
}
break;
default:
previousCharKind = IS_OTHER;
break;
}
}
if (endIndex > 0) {
nameParts[++namePartsPtr] = CharOperation.subarray(sourceName, 0, endIndex);
}
if (namePartsPtr == -1) {
return new char[][] { sourceName };
}
if (isConstantField) {
return generateConstantName(nameParts, namePartsPtr, onlyLongest);
} else {
return generateNonConstantName(nameParts, namePartsPtr, onlyLongest);
}
}
private static char[] excludeNames(
char[] suffixName,
char[] prefixName,
char[] suffix,
char[][] excludedNames) {
int count = 2;
int m = 0;
while (m < excludedNames.length) {
if(CharOperation.equals(suffixName, excludedNames[m], false)) {
suffixName = CharOperation.concat(
prefixName,
String.valueOf(count++).toCharArray(),
suffix
);
m = 0;
} else {
m++;
}
}
return suffixName;
}
private static char[][] generateNonConstantName(char[][] nameParts, int namePartsPtr, boolean onlyLongest) {
char[][] names;
if (onlyLongest) {
names = new char[1][];
} else {
names = new char[namePartsPtr + 1][];
}
char[] namePart = nameParts[0];
char[] name = CharOperation.toLowerCase(namePart);
if (!onlyLongest) {
names[namePartsPtr] = name;
}
char[] nameSuffix = namePart;
for (int i = 1; i <= namePartsPtr; i++) {
namePart = nameParts[i];
name = CharOperation.concat(CharOperation.toLowerCase(namePart), nameSuffix);
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=283539
// Only the first word is converted to lower case and the rest of them are not changed for non-constants
if (!onlyLongest) {
names[namePartsPtr - i] = name;
}
nameSuffix = CharOperation.concat(namePart, nameSuffix);
}
if (onlyLongest) {
names[0] = name;
}
return names;
}
private static char[][] generateConstantName(char[][] nameParts, int namePartsPtr, boolean onlyLongest) {
char[][] names;
if (onlyLongest) {
names = new char[1][];
} else {
names = new char[namePartsPtr + 1][];
}
char[] namePart = CharOperation.toUpperCase(nameParts[0]);
int namePartLength = namePart.length;
System.arraycopy(namePart, 0, namePart, 0, namePartLength);
char[] name = namePart;
if (!onlyLongest) {
names[namePartsPtr] = name;
}
for (int i = 1; i <= namePartsPtr; i++) {
namePart = CharOperation.toUpperCase(nameParts[i]);
namePartLength = namePart.length;
if (namePart[namePartLength - 1] != '_') {
name = CharOperation.concat(namePart, name, '_');
} else {
name = CharOperation.concat(namePart, name);
}
if (!onlyLongest) {
names[namePartsPtr - i] = name;
}
}
if (onlyLongest) {
names[0] = name;
}
return names;
}
public static char[] getBaseName(
int variableKind,
IJavaProject javaProject,
char[] name,
boolean updateFirstCharacter) {
AssistOptions assistOptions;
if (javaProject != null) {
assistOptions = new AssistOptions(javaProject.getOptions(true));
} else {
assistOptions = new AssistOptions(JavaCore.getOptions());
}
char[][] prefixes = null;
char[][] suffixes = null;
switch (variableKind) {
case VK_INSTANCE_FIELD:
prefixes = assistOptions.fieldPrefixes;
suffixes = assistOptions.fieldSuffixes;
break;
case VK_STATIC_FIELD:
prefixes = assistOptions.staticFieldPrefixes;
suffixes = assistOptions.staticFieldSuffixes;
break;
case VK_STATIC_FINAL_FIELD:
prefixes = assistOptions.staticFinalFieldPrefixes;
suffixes = assistOptions.staticFinalFieldSuffixes;
break;
case VK_LOCAL:
prefixes = assistOptions.localPrefixes;
suffixes = assistOptions.localSuffixes;
break;
case VK_PARAMETER:
prefixes = assistOptions.argumentPrefixes;
suffixes = assistOptions.argumentSuffixes;
break;
}
return getBaseName(name, prefixes, suffixes, variableKind == VK_STATIC_FINAL_FIELD, updateFirstCharacter);
}
private static char[] getBaseName(char[] name, char[][] prefixes, char[][] suffixes, boolean isConstant, boolean updateFirstCharacter) {
char[] nameWithoutPrefixAndSiffix = removeVariablePrefixAndSuffix(name, prefixes, suffixes, updateFirstCharacter);
char[] baseName;
if (isConstant) {
int length = nameWithoutPrefixAndSiffix.length;
baseName = new char[length];
int baseNamePtr = -1;
boolean previousIsUnderscore = false;
for (int i = 0; i < length; i++) {
char c = nameWithoutPrefixAndSiffix[i];
if (c != '_') {
if (previousIsUnderscore) {
baseName[++baseNamePtr] = ScannerHelper.toUpperCase(c);
previousIsUnderscore = false;
} else {
baseName[++baseNamePtr] = ScannerHelper.toLowerCase(c);
}
} else {
previousIsUnderscore = true;
}
}
System.arraycopy(baseName, 0, baseName = new char[baseNamePtr + 1], 0, baseNamePtr + 1);
} else {
baseName = nameWithoutPrefixAndSiffix;
}
return baseName;
}
public static char[] removeVariablePrefixAndSuffix(
int variableKind,
IJavaProject javaProject,
char[] name) {
AssistOptions assistOptions;
if (javaProject != null) {
assistOptions = new AssistOptions(javaProject.getOptions(true));
} else {
assistOptions = new AssistOptions(JavaCore.getOptions());
}
char[][] prefixes = null;
char[][] suffixes = null;
switch (variableKind) {
case VK_INSTANCE_FIELD:
prefixes = assistOptions.fieldPrefixes;
suffixes = assistOptions.fieldSuffixes;
break;
case VK_STATIC_FIELD:
prefixes = assistOptions.staticFieldPrefixes;
suffixes = assistOptions.staticFieldSuffixes;
break;
case VK_STATIC_FINAL_FIELD:
prefixes = assistOptions.staticFinalFieldPrefixes;
suffixes = assistOptions.staticFinalFieldSuffixes;
break;
case VK_LOCAL:
prefixes = assistOptions.localPrefixes;
suffixes = assistOptions.localSuffixes;
break;
case VK_PARAMETER:
prefixes = assistOptions.argumentPrefixes;
suffixes = assistOptions.argumentSuffixes;
break;
}
return InternalNamingConventions.removeVariablePrefixAndSuffix(name, prefixes, suffixes, true);
}
private static char[] removeVariablePrefixAndSuffix(char[] name, char[][] prefixes, char[][] suffixes, boolean updateFirstCharacter) {
// remove longer prefix
char[] withoutPrefixName = name;
if (prefixes != null) {
int bestLength = 0;
for (int i= 0; i < prefixes.length; i++) {
char[] prefix = prefixes[i];
if (CharOperation.prefixEquals(prefix, name)) {
int currLen = prefix.length;
boolean lastCharIsLetter = ScannerHelper.isLetter(prefix[currLen - 1]);
if(!lastCharIsLetter || (lastCharIsLetter && name.length > currLen && ScannerHelper.isUpperCase(name[currLen]))) {
if (bestLength < currLen && name.length != currLen) {
withoutPrefixName = CharOperation.subarray(name, currLen, name.length);
bestLength = currLen;
}
}
}
}
}
// remove longer suffix
char[] withoutSuffixName = withoutPrefixName;
if(suffixes != null) {
int bestLength = 0;
for (int i = 0; i < suffixes.length; i++) {
char[] suffix = suffixes[i];
if(CharOperation.endsWith(withoutPrefixName, suffix)) {
int currLen = suffix.length;
if(bestLength < currLen && withoutPrefixName.length != currLen) {
withoutSuffixName = CharOperation.subarray(withoutPrefixName, 0, withoutPrefixName.length - currLen);
bestLength = currLen;
}
}
}
}
if (updateFirstCharacter) withoutSuffixName[0] = ScannerHelper.toLowerCase(withoutSuffixName[0]);
return withoutSuffixName;
}
private static char[] removePrefix(char[] name, char[][] prefixes) {
// remove longer prefix
char[] withoutPrefixName = name;
if (prefixes != null) {
int bestLength = 0;
int nameLength = name.length;
for (int i= 0; i < prefixes.length; i++) {
char[] prefix = prefixes[i];
int prefixLength = prefix.length;
if(prefixLength <= nameLength) {
if(CharOperation.prefixEquals(prefix, name, false)) {
if (prefixLength > bestLength) {
bestLength = prefixLength;
}
}
} else {
int currLen = 0;
for (; currLen < nameLength; currLen++) {
if(ScannerHelper.toLowerCase(prefix[currLen]) != ScannerHelper.toLowerCase(name[currLen])) {
if (currLen > bestLength) {
bestLength = currLen;
}
break;
}
}
if(currLen == nameLength && currLen > bestLength) {
bestLength = currLen;
}
}
}
if(bestLength > 0) {
if(bestLength == nameLength) {
withoutPrefixName = CharOperation.NO_CHAR;
} else {
withoutPrefixName = CharOperation.subarray(name, bestLength, nameLength);
}
}
}
//
//
// // remove longer prefix
// char[] withoutPrefixName = name;
// if (prefixes != null) {
// int bestLength = 0;
// for (int i= 0; i < prefixes.length; i++) {
// char[] prefix = prefixes[i];
// int max = prefix.length < name.length ? prefix.length : name.length;
// int currLen = 0;
// for (; currLen < max; currLen++) {
// if(Character.toLowerCase(prefix[currLen]) != Character.toLowerCase(name[currLen])) {
// if (currLen > bestLength) {
// bestLength = currLen;
// }
// break;
// }
// }
// if(currLen == max && currLen > bestLength) {
// bestLength = max;
// }
// }
// if(bestLength > 0) {
// if(bestLength == name.length) {
// withoutPrefixName = CharOperation.NO_CHAR;
// } else {
// withoutPrefixName = CharOperation.subarray(name, bestLength, name.length);
// }
// }
// }
return withoutPrefixName;
}
public static final int VK_STATIC_FIELD = 1;
public static final int VK_INSTANCE_FIELD = 2;
public static final int VK_STATIC_FINAL_FIELD = 3;
public static final int VK_PARAMETER = 4;
public static final int VK_LOCAL = 5;
public static final int BK_SIMPLE_NAME = 1;
public static final int BK_SIMPLE_TYPE_NAME = 2;
public static void suggestVariableNames(
int variableKind,
int baseNameKind,
char[] baseName,
IJavaProject javaProject,
int dim,
char[] internalPrefix,
char[][] excluded,
boolean evaluateDefault,
INamingRequestor requestor) {
if(baseName == null || baseName.length == 0)
return;
Map<String, String> options;
if (javaProject != null) {
options = javaProject.getOptions(true);
} else {
options = JavaCore.getOptions();
}
CompilerOptions compilerOptions = new CompilerOptions(options);
AssistOptions assistOptions = new AssistOptions(options);
boolean isConstantField = false;
char[][] prefixes = null;
char[][] suffixes = null;
switch (variableKind) {
case VK_INSTANCE_FIELD:
prefixes = assistOptions.fieldPrefixes;
suffixes = assistOptions.fieldSuffixes;
break;
case VK_STATIC_FIELD:
prefixes = assistOptions.staticFieldPrefixes;
suffixes = assistOptions.staticFieldSuffixes;
break;
case VK_STATIC_FINAL_FIELD:
isConstantField = true;
prefixes = assistOptions.staticFinalFieldPrefixes;
suffixes = assistOptions.staticFinalFieldSuffixes;
break;
case VK_LOCAL:
prefixes = assistOptions.localPrefixes;
suffixes = assistOptions.localSuffixes;
break;
case VK_PARAMETER:
prefixes = assistOptions.argumentPrefixes;
suffixes = assistOptions.argumentSuffixes;
break;
}
if(prefixes == null || prefixes.length == 0) {
prefixes = new char[1][0];
} else {
int length = prefixes.length;
System.arraycopy(prefixes, 0, prefixes = new char[length+1][], 0, length);
prefixes[length] = CharOperation.NO_CHAR;
}
if(suffixes == null || suffixes.length == 0) {
suffixes = new char[1][0];
} else {
int length = suffixes.length;
System.arraycopy(suffixes, 0, suffixes = new char[length+1][], 0, length);
suffixes[length] = CharOperation.NO_CHAR;
}
if(internalPrefix == null) {
internalPrefix = CharOperation.NO_CHAR;
} else {
internalPrefix = removePrefix(internalPrefix, prefixes);
}
char[][] tempNames = null;
Scanner nameScanner = getNameScanner(compilerOptions);
if (baseNameKind == BK_SIMPLE_TYPE_NAME) {
boolean isBaseType = false;
try{
nameScanner.setSource(baseName);
switch (nameScanner.getNextToken()) {
case TerminalTokens.TokenNameint :
case TerminalTokens.TokenNamebyte :
case TerminalTokens.TokenNameshort :
case TerminalTokens.TokenNamechar :
case TerminalTokens.TokenNamelong :
case TerminalTokens.TokenNamefloat :
case TerminalTokens.TokenNamedouble :
case TerminalTokens.TokenNameboolean :
isBaseType = true;
break;
}
} catch(InvalidInputException e){
// ignore
}
if (isBaseType) {
// compute variable name from base type
if (internalPrefix.length > 0) return;
tempNames = computeBaseTypeNames(baseName, isConstantField, excluded);
} else {
// compute variable name for non base type
tempNames = computeNonBaseTypeNames(baseName, isConstantField, false);
}
} else {
tempNames = computeNonBaseTypeNames(baseName, isConstantField, true);
}
boolean acceptDefaultName = true;
SimpleSetOfCharArray foundNames = new SimpleSetOfCharArray();
for (int i = 0; i < tempNames.length; i++) {
char[] tempName = tempNames[i];
// add English plural form is necessary
if(dim > 0) {
int length = tempName.length;
if (isConstantField) {
if (tempName[length-1] == 'S'){
if(tempName.length > 1 && tempName[length-2] == 'S') {
System.arraycopy(tempName, 0, tempName = new char[length + 2], 0, length);
tempName[length] = 'E';
tempName[length+1] = 'S';
}
} else if(tempName[length-1] == 'Y') {
boolean precededByAVowel = false;
if(tempName.length > 1) {
switch (tempName[length-2]) {
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
precededByAVowel = true;
break;
}
}
if (precededByAVowel) {
System.arraycopy(tempName, 0, tempName = new char[length + 1], 0, length);
tempName[length] = 'S';
} else {
System.arraycopy(tempName, 0, tempName = new char[length + 2], 0, length);
tempName[length-1] = 'I';
tempName[length] = 'E';
tempName[length+1] = 'S';
}
} else {
System.arraycopy(tempName, 0, tempName = new char[length + 1], 0, length);
tempName[length] = 'S';
}
} else {
if (tempName[length-1] == 's'){
if(tempName.length > 1 && tempName[length-2] == 's') {
System.arraycopy(tempName, 0, tempName = new char[length + 2], 0, length);
tempName[length] = 'e';
tempName[length+1] = 's';
}
} else if(tempName[length-1] == 'y') {
boolean precededByAVowel = false;
if(tempName.length > 1) {
switch (tempName[length-2]) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
precededByAVowel = true;
break;
}
}
if (precededByAVowel) {
System.arraycopy(tempName, 0, tempName = new char[length + 1], 0, length);
tempName[length] = 's';
} else {
System.arraycopy(tempName, 0, tempName = new char[length + 2], 0, length);
tempName[length-1] = 'i';
tempName[length] = 'e';
tempName[length+1] = 's';
}
} else {
System.arraycopy(tempName, 0, tempName = new char[length + 1], 0, length);
tempName[length] = 's';
}
}
}
char[] unprefixedName = tempName;
int matchingIndex = -1;
if (!isConstantField) {
unprefixedName[0] = ScannerHelper.toUpperCase(unprefixedName[0]);
done : for (int j = 0; j <= internalPrefix.length; j++) {
if(j == internalPrefix.length ||
CharOperation.prefixEquals(CharOperation.subarray(internalPrefix, j, -1), unprefixedName, j != 0 /*do not check case when there is no prefix*/)) {
matchingIndex = j;
break done;
}
}
} else {
done : for (int j = 0; j <= internalPrefix.length; j++) {
if(j == internalPrefix.length) {
matchingIndex = j;
break done;
} else if(CharOperation.prefixEquals(CharOperation.subarray(internalPrefix, j, -1), unprefixedName, j != 0 /*do not check case when there is no prefix*/)) {
if (j == 0 || internalPrefix[j - 1] == '_') {
matchingIndex = j;
break done;
}
}
}
}
if(matchingIndex > -1) {
if (!isConstantField) {
tempName = CharOperation.concat(CharOperation.subarray(internalPrefix, 0, matchingIndex), unprefixedName);
if(matchingIndex == 0) tempName[0] = ScannerHelper.toLowerCase(tempName[0]);
} else {
if(matchingIndex != 0 && tempName[0] != '_' && internalPrefix[matchingIndex - 1] != '_') {
tempName = CharOperation.concat(CharOperation.subarray(CharOperation.toUpperCase(internalPrefix), 0, matchingIndex), unprefixedName, '_');
} else {
tempName = CharOperation.concat(CharOperation.subarray(CharOperation.toUpperCase(internalPrefix), 0, matchingIndex), unprefixedName);
}
}
for (int k = 0; k < prefixes.length; k++) {
if (!isConstantField) {
if(prefixes[k].length > 0
&& ScannerHelper.isLetterOrDigit(prefixes[k][prefixes[k].length - 1])) {
tempName[0] = ScannerHelper.toUpperCase(tempName[0]);
} else {
tempName[0] = ScannerHelper.toLowerCase(tempName[0]);
}
}
char[] prefixName = CharOperation.concat(prefixes[k], tempName);
for (int l = 0; l < suffixes.length; l++) {
char[] suffixName = CharOperation.concat(prefixName, suffixes[l]);
suffixName =
excludeNames(
suffixName,
prefixName,
suffixes[l],
excluded);
try{
nameScanner.setSource(suffixName);
switch (nameScanner.getNextToken()) {
case TerminalTokens.TokenNameIdentifier :
int token = nameScanner.getNextToken();
if (token == TerminalTokens.TokenNameEOF && nameScanner.startPosition == suffixName.length) {
if (!foundNames.includes(suffixName)) {
acceptName(suffixName, prefixes[k], suffixes[l], k == 0, l == 0, internalPrefix.length - matchingIndex, requestor);
foundNames.add(suffixName);
acceptDefaultName = false;
}
}
break;
default:
suffixName = CharOperation.concat(
prefixName,
String.valueOf(1).toCharArray(),
suffixes[l]
);
suffixName =
excludeNames(
suffixName,
prefixName,
suffixes[l],
excluded);
nameScanner.setSource(suffixName);
switch (nameScanner.getNextToken()) {
case TerminalTokens.TokenNameIdentifier :
token = nameScanner.getNextToken();
if (token == TerminalTokens.TokenNameEOF && nameScanner.startPosition == suffixName.length) {
if (!foundNames.includes(suffixName)) {
acceptName(suffixName, prefixes[k], suffixes[l], k == 0, l == 0, internalPrefix.length - matchingIndex, requestor);
foundNames.add(suffixName);
acceptDefaultName = false;
}
}
}
}
} catch(InvalidInputException e){
// ignore
}
}
}
}
}
// if no names were found
if(evaluateDefault && acceptDefaultName) {
char[] name = excludeNames(DEFAULT_NAME, DEFAULT_NAME, CharOperation.NO_CHAR, excluded);
requestor.acceptNameWithoutPrefixAndSuffix(name, 0);
}
}
}