8005046: Provide checking for a default method in javax.lang.model
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Mon Dec 17 15:19:38 2012 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Tue Dec 18 00:24:54 2012 -0800
@@ -1353,7 +1353,7 @@
return defaultValue;
}
- public List<VarSymbol> getParameters() {
+ public List<VarSymbol> getParameters() {
return params();
}
@@ -1361,6 +1361,10 @@
return (flags() & VARARGS) != 0;
}
+ public boolean isDefault() {
+ return (flags() & DEFAULT) != 0;
+ }
+
public <R, P> R accept(ElementVisitor<R, P> v, P p) {
return v.visitExecutable(this, p);
}
--- a/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java Mon Dec 17 15:19:38 2012 -0800
+++ b/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java Tue Dec 18 00:24:54 2012 -0800
@@ -78,6 +78,16 @@
boolean isVarArgs();
/**
+ * Returns {@code true} if this method is a default method and
+ * returns {@code false} otherwise.
+ *
+ * @return {@code true} if this method is a default method and
+ * {@code false} otherwise
+ * @since 1.8
+ */
+ boolean isDefault();
+
+ /**
* Returns the exceptions and other throwables listed in this
* method or constructor's {@code throws} clause in declaration
* order.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/element/TestExecutableElement.java Tue Dec 18 00:24:54 2012 -0800
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8005046
+ * @summary Test basic properties of javax.lang.element.Element
+ * @author Joseph D. Darcy
+ * @library /tools/javac/lib
+ * @build JavacTestingAbstractProcessor TestExecutableElement
+ * @compile -processor TestExecutableElement -proc:only TestExecutableElement.java
+ */
+
+import java.lang.annotation.*;
+import java.util.Formatter;
+import java.util.Set;
+import java.util.Objects;
+import javax.annotation.processing.*;
+import javax.lang.model.SourceVersion;
+import static javax.lang.model.SourceVersion.*;
+import javax.lang.model.element.*;
+import javax.lang.model.util.*;
+import static javax.lang.model.util.ElementFilter.*;
+import static javax.tools.Diagnostic.Kind.*;
+import static javax.tools.StandardLocation.*;
+
+/**
+ * Test some basic workings of javax.lang.element.ExecutableElement
+ */
+public class TestExecutableElement extends JavacTestingAbstractProcessor implements ProviderOfDefault {
+ @IsDefault(false)
+ public boolean process(Set<? extends TypeElement> annotations,
+ RoundEnvironment roundEnv) {
+ int errors = 0;
+ if (!roundEnv.processingOver()) {
+ boolean hasRun = false;
+ for (Element element : roundEnv.getRootElements()) {
+ for (ExecutableElement method : methodsIn(element.getEnclosedElements())) {
+ hasRun = true;
+ errors += checkIsDefault(method);
+ }
+ }
+
+ if (!hasRun) {
+ messager.printMessage(ERROR, "No test cases run; test fails.");
+ }
+ }
+ return true;
+ }
+
+ @IsDefault(false)
+ int checkIsDefault(ExecutableElement method) {
+ System.out.println("Testing " + method);
+ IsDefault expectedIsDefault = method.getAnnotation(IsDefault.class);
+
+ boolean expectedDefault = (expectedIsDefault != null) ?
+ expectedIsDefault.value() :
+ false;
+
+ boolean methodIsDefault = method.isDefault();
+
+ if (methodIsDefault != expectedDefault) {
+ messager.printMessage(ERROR,
+ new Formatter().format("Unexpected Executable.isDefault result: got %s, expected %s",
+ expectedDefault,
+ methodIsDefault).toString(),
+ method);
+ return 1;
+ }
+ return 0;
+ }
+}
+
+/**
+ * Expected value of the ExecutableElement.isDefault method.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@interface IsDefault {
+ boolean value();
+}
+
+/**
+ * Test interface to provide a default method.
+ */
+interface ProviderOfDefault {
+ @IsDefault(false)
+ boolean process(Set<? extends TypeElement> annotations,
+ RoundEnvironment roundEnv);
+
+ @IsDefault(true)
+ default void quux() {};
+}