Browse Source

Fail during compile if required methods are missing (#18924)

A ComponentConnector must override either getWidget or createWidget for
the framework to know the type of the component's widget. Similarly
either getRenderer och createRenderer must be overridden for
AbstractRendererConnector.

Prior to this patch, the compilation succeeded when critical methods
were missing - the user just got various hard-to-debug issues when the
broken connector was used.

Change-Id: I6ec07e2f1c1b15047802e64208485b1d999c0aee
tags/7.6.0.beta2
Leif Åstrand 8 years ago
parent
commit
715d9ed846

+ 7
- 1
client-compiler/src/com/vaadin/server/widgetsetutils/metadata/RendererVisitor.java View File

@@ -52,7 +52,7 @@ public class RendererVisitor extends TypeVisitor {
}

private static void doRendererType(TreeLogger logger, JClassType type,
ConnectorBundle bundle) {
ConnectorBundle bundle) throws UnableToCompleteException {
// The class in which createRenderer is implemented
JClassType createRendererClass = ConnectorBundle.findInheritedMethod(
type, "createRenderer").getEnclosingType();
@@ -63,6 +63,12 @@ public class RendererVisitor extends TypeVisitor {

JMethod getRenderer = ConnectorBundle.findInheritedMethod(type,
"getRenderer");
if (getRenderer.getEnclosingType().getQualifiedSourceName()
.equals(AbstractRendererConnector.class.getCanonicalName())) {
logger.log(Type.ERROR, type.getQualifiedSourceName()
+ " must override either createRenderer or getRenderer");
throw new UnableToCompleteException();
}
JClassType rendererType = getRenderer.getReturnType().isClass();

bundle.setNeedsGwtConstructor(rendererType);

+ 10
- 0
client-compiler/src/com/vaadin/server/widgetsetutils/metadata/WidgetInitVisitor.java View File

@@ -42,6 +42,16 @@ public class WidgetInitVisitor extends TypeVisitor {
// Needs GWT constructor if createWidget is not overridden
if (createWidgetClass.getQualifiedSourceName().equals(
AbstractComponentConnector.class.getCanonicalName())) {
if (getWidget
.getEnclosingType()
.getQualifiedSourceName()
.equals(AbstractComponentConnector.class
.getCanonicalName())) {
logger.log(Type.ERROR, type.getQualifiedSourceName()
+ " must override either createWidget or getWidget");
throw new UnableToCompleteException();
}

bundle.setNeedsGwtConstructor(widgetType);

// Also needs widget type to find the right GWT constructor

Loading…
Cancel
Save