blob: 0808afede88319ba190ffcaa661ab163bf42b9e3 [file] [log] [blame]
/*
* Copyright 2014 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.util.log;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.TreeLogger.Type;
import com.google.gwt.thirdparty.guava.common.base.Preconditions;
import java.util.regex.Pattern;
/**
* Defines a name for each performance-related metric.
*/
public enum MetricName {
/**
* The number of types that UnifyAst considers to be part of the module being compiled.
*/
DECLARED_TYPES_IN_MODULE("DeclaredTypesInModule");
// Note: this constraint is used in JobEvent which is a public API (for Super Dev Mode).
// Allowing more characters in keys may break data collection.
private static final Pattern VALID_KEY = Pattern.compile("^[A-Z][A-Za-z0-9]*$");
static {
// Cannot check this in the enum constructor.
for (MetricName counter : values()) {
Preconditions.checkState(isValidKey(counter.key), "invalid key: %s", counter.key);
}
}
final String key;
/**
* @param key the string key to appear in output. Must be an identifier beginning
* with a capital letter and not containing underscores.
*/
MetricName(String key) {
this.key = key;
}
/**
* Adds the given amount to the counter.
* @param logger the destination where the count will be logged.
*/
public void setAmount(TreeLogger logger, long amount) {
Preconditions.checkNotNull(logger);
Preconditions.checkArgument(amount >= 0, "attempted to set a negative amount");
if (logger instanceof CanUpdateMetrics) {
((CanUpdateMetrics) logger).setAmount(this, amount);
} else {
// Just log it.
logger.log(Type.DEBUG, "Metric: " + key + " = " + amount);
}
}
/**
* Returns true if the given name can be used as a key for a compiler counter.
*/
public static boolean isValidKey(String name) {
return VALID_KEY.matcher(name).matches();
}
}