/* * 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.tools.apichecker; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JField; import java.util.HashSet; import java.util.Set; /** * Immutable class that encapsulates an API Field. Useful for set-operations. An * ApiField is attached to an ApiClass. */ final class ApiField implements Comparable<ApiField>, ApiElement { static String computeApiSignature(JField tempField) { return tempField.getEnclosingType().getQualifiedSourceName() + "::" + tempField.getName(); } private final ApiClass apiClass; private volatile String apiSignature = null; // cached, lazily initialized private final JField field; private volatile String relativeSignature = null; // cached, lazily // initialized ApiField(JField field, ApiClass apiClass) { this.field = field; this.apiClass = apiClass; } public int compareTo(ApiField other) { return getRelativeSignature().compareTo(other.getRelativeSignature()); } /** * Used during set operations. */ @Override public boolean equals(Object o) { if (o instanceof ApiField) { ApiField other = (ApiField) o; return getApiSignature().equals(other.getApiSignature()); } return false; } public ApiClass getApiClass() { return apiClass; } public String getRelativeSignature() { if (relativeSignature == null) { relativeSignature = computeRelativeSignature(); } return relativeSignature; } @Override public int hashCode() { return getApiSignature().hashCode(); } @Override public String toString() { return field.toString(); } String getApiSignature() { if (apiSignature == null) { apiSignature = computeApiSignature(); } return apiSignature; } JField getField() { return field; } Set<ApiChange> getModifierChanges(ApiField newField) { Set<ApiChange> statuses = new HashSet<ApiChange>(); if (!field.isFinal() && newField.getField().isFinal()) { statuses.add(new ApiChange(this, ApiChange.Status.FINAL_ADDED)); } if ((field.isStatic() && !newField.getField().isStatic())) { statuses.add(new ApiChange(this, ApiChange.Status.STATIC_REMOVED)); } return statuses; } private String computeApiSignature() { return computeApiSignature(field); } private String computeRelativeSignature() { String signature = field.getName(); if (ApiCompatibilityChecker.DEBUG) { JClassType enclosingType = field.getEnclosingType(); return apiClass.getClassObject().getQualifiedSourceName() + "::" + signature + " defined in " + (enclosingType == null ? "null enclosing type " : enclosingType .getQualifiedSourceName()); } return apiClass.getClassObject().getQualifiedSourceName() + "::" + signature; } }