blob: c6e4f947d3d03d92b48eee08f328138d9f86b129 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.javac;
import java.io.Serializable;
import java.util.Comparator;
/**
* Comparator to sort the compiler-generated classNames so that they can be
* correlated. Examples of sorting orders by the comparator:
*
* <pre>
* <ul>
* <li> Foo$1 < Foo$2 < Foo$3 < ... < Foo$10
* <li> Foo$1 < Foo$2 < Foo$1$1 < Foo$1$2 < Foo$2$1 < Foo$2$2 < Foo$2$Baz
* </pre>
*/
class GeneratedClassnameComparator implements Comparator<String>, Serializable {
public int compare(String arg0, String arg1) {
String pattern = "\\$";
String splits0[] = arg0.split(pattern);
String splits1[] = arg1.split(pattern);
if (splits0.length != splits1.length) {
return splits0.length - splits1.length;
}
for (int i = 0; i < splits0.length; i++) {
int answer = compareWithoutDollars(splits0[i], splits1[i]);
if (answer != 0) {
return answer;
}
}
return 0;
}
/*
* 3 cases: (i) both can be converted to integer: compare the integral value.
* (ii) only one can be converted to integer: the one with integral value is
* lower. (iii) none can be converted to integer: compare the strings.
*/
private int compareWithoutDollars(String arg0, String arg1) {
boolean arg0IsInt = false;
boolean arg1IsInt = false;
int int0 = 0, int1 = 0;
if ((arg0 == null) != (arg1 == null)) {
return (arg0 == null) ? -1 : 1;
}
if (arg0 == null) {
return 0;
}
if (arg0.charAt(0) != '-') {
try {
int0 = Integer.parseInt(arg0);
arg0IsInt = true;
} catch (NumberFormatException ex) {
// ignored
}
}
if (arg1.charAt(0) != '-') {
try {
int1 = Integer.parseInt(arg1);
arg1IsInt = true;
} catch (NumberFormatException ex) {
// ignored
}
}
if (arg0IsInt != arg1IsInt) {
return arg0IsInt ? -1 : 1;
}
// now either both are int or both are Strings
if (arg0IsInt) {
return int0 - int1;
}
return arg0.compareTo(arg1);
}
}