aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Cochran <Eric@NightlyNexus.com>2018-03-04 04:22:03 -0800
committerJesse Wilson <jesse@swank.ca>2018-03-04 07:22:03 -0500
commitee82208f4bc086e0b1334445f600789879fc7a78 (patch)
treeae7c5c5ae85321235a725c90517ce4555fb7a7b4
parentb314337267eb36462c3bf67a87494e614c9c8b40 (diff)
downloadplatform_external_javapoet-ee82208f4bc086e0b1334445f600789879fc7a78.tar.gz
platform_external_javapoet-ee82208f4bc086e0b1334445f600789879fc7a78.tar.bz2
platform_external_javapoet-ee82208f4bc086e0b1334445f600789879fc7a78.zip
Disable overriding methods in final classes. (#626)
-rw-r--r--src/main/java/com/squareup/javapoet/MethodSpec.java6
-rw-r--r--src/test/java/com/squareup/javapoet/MethodSpecTest.java17
2 files changed, 23 insertions, 0 deletions
diff --git a/src/main/java/com/squareup/javapoet/MethodSpec.java b/src/main/java/com/squareup/javapoet/MethodSpec.java
index eff5410..67a7fb2 100644
--- a/src/main/java/com/squareup/javapoet/MethodSpec.java
+++ b/src/main/java/com/squareup/javapoet/MethodSpec.java
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeParameterElement;
@@ -188,6 +189,11 @@ public final class MethodSpec {
public static Builder overriding(ExecutableElement method) {
checkNotNull(method, "method == null");
+ Element enclosingClass = method.getEnclosingElement();
+ if (enclosingClass.getModifiers().contains(Modifier.FINAL)) {
+ throw new IllegalArgumentException("Cannot override method on final class " + enclosingClass);
+ }
+
Set<Modifier> modifiers = method.getModifiers();
if (modifiers.contains(Modifier.PRIVATE)
|| modifiers.contains(Modifier.FINAL)
diff --git a/src/test/java/com/squareup/javapoet/MethodSpecTest.java b/src/test/java/com/squareup/javapoet/MethodSpecTest.java
index 96923eb..334a6ae 100644
--- a/src/test/java/com/squareup/javapoet/MethodSpecTest.java
+++ b/src/test/java/com/squareup/javapoet/MethodSpecTest.java
@@ -123,6 +123,11 @@ public final class MethodSpecTest {
interface ExtendsIterableWithDefaultMethods extends Iterable<Object> {
}
+ final class FinalClass {
+ void method() {
+ }
+ }
+
@Test public void overrideEverything() {
TypeElement classElement = getElement(Everything.class);
ExecutableElement methodElement = getOnlyElement(methodsIn(classElement.getEnclosedElements()));
@@ -177,6 +182,18 @@ public final class MethodSpecTest {
+ "}\n");
}
+ @Test public void overrideFinalClassMethod() {
+ TypeElement classElement = getElement(FinalClass.class);
+ List<ExecutableElement> methods = methodsIn(elements.getAllMembers(classElement));
+ try {
+ MethodSpec.overriding(findFirst(methods, "method"));
+ fail();
+ } catch (IllegalArgumentException expected) {
+ assertThat(expected).hasMessageThat().isEqualTo(
+ "Cannot override method on final class com.squareup.javapoet.MethodSpecTest.FinalClass");
+ }
+ }
+
@Test public void overrideInvalidModifiers() {
ExecutableElement method = mock(ExecutableElement.class);
when(method.getModifiers()).thenReturn(ImmutableSet.of(Modifier.FINAL));