diff options
author | Jeff Brown <jeffbrown@google.com> | 2013-04-01 17:07:37 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2013-04-01 17:14:25 -0700 |
commit | 722ac6ad427cab1d8d6daba6bd100afa9dd94fb7 (patch) | |
tree | da7e686177477a2c7ae2c1d62d8d0cd783cc17e1 | |
parent | 43d2ac8017a651b5678c8a9753248663d8bfe9a7 (diff) | |
download | android_external_doclava-722ac6ad427cab1d8d6daba6bd100afa9dd94fb7.tar.gz android_external_doclava-722ac6ad427cab1d8d6daba6bd100afa9dd94fb7.tar.bz2 android_external_doclava-722ac6ad427cab1d8d6daba6bd100afa9dd94fb7.zip |
apicheck: Handle more special cases for final.
It's ok to make a method final if it belongs to a class
that is effectively final (no public constructors).
Change-Id: I6c497e68a91f99eee124e9dbe3d075c6672c4615
-rw-r--r-- | src/com/google/doclava/ClassInfo.java | 4 | ||||
-rw-r--r-- | src/com/google/doclava/MethodInfo.java | 15 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/com/google/doclava/ClassInfo.java b/src/com/google/doclava/ClassInfo.java index f3993eb..d3ed434 100644 --- a/src/com/google/doclava/ClassInfo.java +++ b/src/com/google/doclava/ClassInfo.java @@ -247,6 +247,10 @@ public class ClassInfo extends DocInfo implements ContainerInfo, Comparable, Sco return mIsFinal; } + public boolean isEffectivelyFinal() { + return mIsFinal || mApiCheckConstructors.isEmpty(); + } + public boolean isIncluded() { return mIsIncluded; } diff --git a/src/com/google/doclava/MethodInfo.java b/src/com/google/doclava/MethodInfo.java index b6a5cc3..fc8959f 100644 --- a/src/com/google/doclava/MethodInfo.java +++ b/src/com/google/doclava/MethodInfo.java @@ -624,8 +624,15 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv return mIsVarargs; } - public boolean isFinalOrBelongsToFinalClass() { - return mIsFinal || (containingClass() != null && containingClass().isFinal()); + public boolean isEffectivelyFinal() { + if (mIsFinal) { + return true; + } + ClassInfo containingClass = containingClass(); + if (containingClass != null && containingClass.isEffectivelyFinal()) { + return true; + } + return false; } @Override @@ -738,11 +745,11 @@ public class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolv // the compiler, so this check needs to be quite narrow. A change in 'final' // status of a method is only relevant if (a) the method is not declared 'static' // and (b) the method is not already inferred to be 'final' by virtue of its class. - if (!isFinalOrBelongsToFinalClass() && mInfo.isFinalOrBelongsToFinalClass()) { + if (!isEffectivelyFinal() && mInfo.isEffectivelyFinal()) { consistent = false; Errors.error(Errors.ADDED_FINAL, mInfo.position(), "Method " + mInfo.qualifiedName() + " has added 'final' qualifier"); - } else if (isFinalOrBelongsToFinalClass() && !mInfo.isFinalOrBelongsToFinalClass()) { + } else if (isEffectivelyFinal() && !mInfo.isEffectivelyFinal()) { consistent = false; Errors.error(Errors.REMOVED_FINAL, mInfo.position(), "Method " + mInfo.qualifiedName() + " has removed 'final' qualifier"); |