Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[ve-dev] ve trouble modelling static parametrised inner classes

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)


Back to the top