Hi,
The visual editor seems to dislike static
inner classes with generic type parameters. I haven’t been able to this
exact problem elsewhere, though one
mail thread I found appeared to suggest that making inner classes static
was sufficient to get this to work.
Reproduction is below. The VE says “Parse
error” and refuses to show a preview.
Interesting thing about this one is that if
you comment out the assignment to a local variable in someMethod(), but keep
the constructor invocation, it works.
This all appears to work if the inner classes
are factored out into top level ones, or if you remove all generics. It also
looks like it works if you then add all the generics back in, but then breaks
when you get it to re-parse.
Final note: this would have been a lot
easier to find if there was more debugging information when the designer says “Parse
error”. Is there any way the parsing could be made to be a bit more
verbose? One of the errors given points to the class that I suppose it can’t
instantiate, but with no further information on what’s actually wrong
with it. Stack traces below, for what it’s worth.
Visual Editor 1.4.0.v20090826-1446-777N-CcNBC0BwNk5HZZk
Eclipse 3.5.2.R35x_v20100210-0800-9hEiFzmFst-TiEn9hNYgDWg1XN8ulH_JvCNGB
JDK 1.6.0_18
Thanks,
Joe
============================================================
package vebug;
import
org.eclipse.swt.widgets.Shell;
public class
ScratchFrame {
Shell
shell = null; // @jve:decl-index=0:visual-constraint="10,0"
private
void createShell() {
shell
= new Shell();
}
public
static class X<T> {}
public
static abstract class AbstractGenericClass<T> {
private
final X<T> x;
protected
AbstractGenericClass() {
x
= null;
}
public
AbstractGenericClass(X<T> x) {
this.x
= x;
}
}
public
static class ConcreteImplementation extends AbstractGenericClass<String>
{
public
ConcreteImplementation(X<String> x) {
super(x);
}
}
public
void someMethod() {
ConcreteImplementation
a = new ConcreteImplementation(new X<String>()); // @jve:
}
} // @jve:
============================================================
Error 1:
Exception
thrown.
java.lang.NullPointerException
at
org.eclipse.ve.internal.java.codegen.java.ExpressionDecoderFactory.getExpDecoder(ExpressionDecoderFactory.java:98)
at
org.eclipse.ve.internal.java.codegen.model.BeanPart.setEObject(BeanPart.java:411)
at
org.eclipse.ve.internal.java.codegen.model.BeanPart.createEObject(BeanPart.java:810)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.createAJavaInstance(JavaSourceTranslator.java:616)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.createJavaInstances(JavaSourceTranslator.java:641)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.buildCompositionModel(JavaSourceTranslator.java:707)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.reverseParse(JavaSourceTranslator.java:874)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.decodeDocument(JavaSourceTranslator.java:947)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.loadModel(JavaSourceTranslator.java:597)
at
org.eclipse.ve.internal.java.codegen.editorpart.JavaVisualEditorPart$Setup.run(JavaVisualEditorPart.java:1978)
at
org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
============================================================
Error 2:
IWAV0155E
Introspection failed on class
"vebug.ScratchFrame.ConcreteImplementation." msg="."
java.lang.NullPointerException
at
org.eclipse.jem.internal.beaninfo.adapters.BeaninfoClassAdapter.introspect(BeaninfoClassAdapter.java:636)
at
org.eclipse.jem.internal.beaninfo.adapters.BeaninfoClassAdapter.introspectIfNecessary(BeaninfoClassAdapter.java:428)
at
org.eclipse.jem.internal.beaninfo.adapters.BeaninfoClassAdapter.introspectIfNecessary(BeaninfoClassAdapter.java:415)
at
org.eclipse.jem.java.internal.impl.JavaClassImpl.getEAnnotations(JavaClassImpl.java:372)
at
org.eclipse.ve.internal.cde.emf.ClassDecoratorSourceIterator.findDecorator(ClassDecoratorSourceIterator.java:37)
at
org.eclipse.ve.internal.cde.emf.ClassDecoratorIterator.initialize(ClassDecoratorIterator.java:47)
at
org.eclipse.ve.internal.cde.emf.ClassDecoratorSourceIterator.<init>(ClassDecoratorSourceIterator.java:33)
at
org.eclipse.ve.internal.cde.emf.ClassDecoratorFeatureAccess.getDecoratorWithFeature(ClassDecoratorFeatureAccess.java:67)
at
org.eclipse.ve.internal.java.codegen.java.ExpressionDecoderFactory.getExpDecoder(ExpressionDecoderFactory.java:97)
at
org.eclipse.ve.internal.java.codegen.model.BeanPart.setEObject(BeanPart.java:411)
at
org.eclipse.ve.internal.java.codegen.model.BeanPart.createEObject(BeanPart.java:810)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.createAJavaInstance(JavaSourceTranslator.java:616)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.createJavaInstances(JavaSourceTranslator.java:641)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.buildCompositionModel(JavaSourceTranslator.java:707)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.reverseParse(JavaSourceTranslator.java:874)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.decodeDocument(JavaSourceTranslator.java:947)
at
org.eclipse.ve.internal.java.codegen.core.JavaSourceTranslator.loadModel(JavaSourceTranslator.java:597)
at
org.eclipse.ve.internal.java.codegen.editorpart.JavaVisualEditorPart$Setup.run(JavaVisualEditorPart.java:1978)
at
org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)