From ee82208f4bc086e0b1334445f600789879fc7a78 Mon Sep 17 00:00:00 2001 From: Eric Cochran Date: Sun, 4 Mar 2018 04:22:03 -0800 Subject: Disable overriding methods in final classes. (#626) --- src/main/java/com/squareup/javapoet/MethodSpec.java | 6 ++++++ src/test/java/com/squareup/javapoet/MethodSpecTest.java | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) (limited to 'src') 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 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 { } + 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 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)); -- cgit v1.2.3