Skip to content

Raw generics for JsPropertyMap cause hard to trace build errors #112

@niloc132

Description

@niloc132

In retrofitting an existing js api to generate typescript, some types may use raw generics (as the Java either doesn't know/care what the type is, and didn't use Any/Object/?):

@JsType
public class MyExportedType {
    public String getName() {
        return null;
    }
    public void handleData(JsPropertyMap array) {
        // Implementation would go here
    }
}

causes

Note: Running doclet.
..api/MyExportedType.java:17: error: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
public class MyExportedType {
       ^
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
        at java.base/java.util.Objects.checkIndex(Objects.java:361)
        at java.base/java.util.ArrayList.get(ArrayList.java:427)
        at com.vertispan.tsdefs.impl.builders.JavaToTsTypeConverter.toTsType(JavaToTsTypeConverter.java:122)
        at com.vertispan.tsdefs.impl.builders.JavaToTsTypeConverter.toTsType(JavaToTsTypeConverter.java:51)
        at com.vertispan.tsdefs.impl.builders.TsElement.getElementTsType(TsElement.java:314)
        at com.vertispan.tsdefs.impl.builders.TsElement.getType(TsElement.java:282)
        at com.vertispan.tsdefs.impl.visitors.ParameterVisitor.visit(ParameterVisitor.java:74)
        at com.vertispan.tsdefs.impl.visitors.ClassMethodVisitor.lambda$visit$0(ClassMethodVisitor.java:68)
        at java.base/java.lang.Iterable.forEach(Iterable.java:75)
        at com.vertispan.tsdefs.impl.visitors.ClassMethodVisitor.visit(ClassMethodVisitor.java:67)
        at com.vertispan.tsdefs.impl.visitors.ClassTypeVisitor.visit(ClassTypeVisitor.java:154)
        at com.vertispan.tsdefs.impl.visitors.ClassTypeVisitor.lambda$visit$2(ClassTypeVisitor.java:59)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
        at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at com.vertispan.tsdefs.impl.visitors.ClassTypeVisitor.visit(ClassTypeVisitor.java:59)
        at com.vertispan.tsdefs.impl.visitors.TypeVisitor.visit(TypeVisitor.java:46)
        at com.vertispan.tsdefs.doclet.TsDoclet.lambda$run$13(TsDoclet.java:168)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1707)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at com.vertispan.tsdefs.doclet.TsDoclet.run(TsDoclet.java:165)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.parseAndExecute(Start.java:556)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:393)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:342)
        at jdk.javadoc/jdk.javadoc.internal.tool.Main.execute(Main.java:63)
        at jdk.javadoc/jdk.javadoc.internal.tool.Main.main(Main.java:52)
error: java.lang.RuntimeException: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
        at com.vertispan.tsdefs.doclet.TsDoclet.lambda$run$13(TsDoclet.java:173)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1707)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at com.vertispan.tsdefs.doclet.TsDoclet.run(TsDoclet.java:165)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.parseAndExecute(Start.java:556)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:393)
        at jdk.javadoc/jdk.javadoc.internal.tool.Start.begin(Start.java:342)
        at jdk.javadoc/jdk.javadoc.internal.tool.Main.execute(Main.java:63)
        at jdk.javadoc/jdk.javadoc.internal.tool.Main.main(Main.java:52)
  Caused by: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
        at java.base/java.util.Objects.checkIndex(Objects.java:361)
        at java.base/java.util.ArrayList.get(ArrayList.java:427)
        at com.vertispan.tsdefs.impl.builders.JavaToTsTypeConverter.toTsType(JavaToTsTypeConverter.java:122)
        at com.vertispan.tsdefs.impl.builders.JavaToTsTypeConverter.toTsType(JavaToTsTypeConverter.java:51)
        at com.vertispan.tsdefs.impl.builders.TsElement.getElementTsType(TsElement.java:314)
        at com.vertispan.tsdefs.impl.builders.TsElement.getType(TsElement.java:282)
        at com.vertispan.tsdefs.impl.visitors.ParameterVisitor.visit(ParameterVisitor.java:74)
        at com.vertispan.tsdefs.impl.visitors.ClassMethodVisitor.lambda$visit$0(ClassMethodVisitor.java:68)
        at java.base/java.lang.Iterable.forEach(Iterable.java:75)
        at com.vertispan.tsdefs.impl.visitors.ClassMethodVisitor.visit(ClassMethodVisitor.java:67)
        at com.vertispan.tsdefs.impl.visitors.ClassTypeVisitor.visit(ClassTypeVisitor.java:154)
        at com.vertispan.tsdefs.impl.visitors.ClassTypeVisitor.lambda$visit$2(ClassTypeVisitor.java:59)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
        at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at com.vertispan.tsdefs.impl.visitors.ClassTypeVisitor.visit(ClassTypeVisitor.java:59)
        at com.vertispan.tsdefs.impl.visitors.TypeVisitor.visit(TypeVisitor.java:46)
        at com.vertispan.tsdefs.doclet.TsDoclet.lambda$run$13(TsDoclet.java:168)
        ... 15 more

In addition to the hard to read stack trace, the error message at the top points only to the class where the error occurred, not the method or the param where it was wrong.

I've also seen this for JsArray, but can't reproduce it right now - the same toTsType() method had an exception in the else that handles arrays.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions