summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2013-04-01 17:07:37 -0700
committerJeff Brown <jeffbrown@google.com>2013-04-01 17:14:25 -0700
commit722ac6ad427cab1d8d6daba6bd100afa9dd94fb7 (patch)
treeda7e686177477a2c7ae2c1d62d8d0cd783cc17e1
parent43d2ac8017a651b5678c8a9753248663d8bfe9a7 (diff)
downloadandroid_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.java4
-rw-r--r--src/com/google/doclava/MethodInfo.java15
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");