Eclipse code completion for inner class
I am having a serious problem with Eclipse disabling all code completion in a Java class that is importing a binary. The binary was compiled with a custom compiler for a custom JVM programming language, and the code looks like this:
package dyvil.dyn
import dyvil.lang.Map.Entry
public class Test[A, B] implements Entry[A, B]
{
public A getKey() = null
public B getValue() = null
}
Entry
is an interface within an interface Map
and both are written in Java . The compiler obviously has no problem with this code and produces the following bytecode (from javap
):
public class dyvil.dyn.Test<A extends java.lang.Object, B extends java.lang.Object> extends java.lang.Object implements dyvil.lang.Map$Entry<A, B>
Signature: #3 // <A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;Ldyvil/lang/Map$Entry<TA;TB;>;
InnerClasses:
public static #10= #7 of #9; //Entry=class dyvil/lang/Map$Entry of class dyvil/lang/Map
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Utf8 dyvil/dyn/Test
#2 = Class #1 // dyvil/dyn/Test
#3 = Utf8 <A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;Ldyvil/lang/Map$Entry<TA;TB;>;
#4 = Utf8 java/lang/Object
#5 = Class #4 // java/lang/Object
#6 = Utf8 dyvil/lang/Map$Entry
#7 = Class #6 // dyvil/lang/Map$Entry
#8 = Utf8 dyvil/lang/Map
#9 = Class #8 // dyvil/lang/Map
#10 = Utf8 Entry
#11 = Utf8 <init>
#12 = Utf8 ()V
#13 = NameAndType #11:#12 // "<init>":()V
#14 = Methodref #5.#13 // java/lang/Object."<init>":()V
#15 = Utf8 this
#16 = Utf8 Ldyvil/dyn/Test<TA;TB;>;
#17 = Utf8 Ldyvil/dyn/Test;
#18 = Utf8 getKey
#19 = Utf8 ()Ljava/lang/Object;
#20 = Utf8 getValue
#21 = Utf8 Code
#22 = Utf8 LocalVariableTable
#23 = Utf8 LocalVariableTypeTable
#24 = Utf8 Signature
#25 = Utf8 ()TA;
#26 = Utf8 ()TB;
#27 = Utf8 InnerClasses
{
public dyvil.dyn.Test();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #14 // Method java/lang/Object."<init>":()V
4: return
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 this Ldyvil/dyn/Test;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 4 0 this Ldyvil/dyn/Test<TA;TB;>;
Signature: #12 // ()V
public A getKey();
descriptor: ()Ljava/lang/Object;
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aconst_null
1: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 this Ldyvil/dyn/Test;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 1 0 this Ldyvil/dyn/Test<TA;TB;>;
Signature: #25 // ()TA;
public B getValue();
descriptor: ()Ljava/lang/Object;
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aconst_null
1: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 this Ldyvil/dyn/Test;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 1 0 this Ldyvil/dyn/Test<TA;TB;>;
Signature: #26 // ()TB;
}
Importing a class Test
from any Java class makes Eclipse complain No completions available
and CTRL-Hover
no longer works. To find the problem, I created and javap
modified the Java equivalent of the above class, getting the following results:
Test.java
package dyvil.test;
import dyvil.lang.Map.Entry;
public class Test<A, B> implements Entry<A, B>
{
@Override
public A getKey()
{
return null;
}
@Override
public B getValue()
{
return null;
}
}
Javap output :
public class dyvil.test.Test<A extends java.lang.Object, B extends java.lang.Object> extends java.lang.Object implements dyvil.lang.Map$Entry<A, B>
SourceFile: "Test.java"
Signature: #26 // <A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;Ldyvil/lang/Map$Entry<TA;TB;>;
InnerClasses:
public static #30= #5 of #28; //Entry=class dyvil/lang/Map$Entry of class dyvil/lang/Map
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Class #2 // dyvil/test/Test
#2 = Utf8 dyvil/test/Test
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Class #6 // dyvil/lang/Map$Entry
#6 = Utf8 dyvil/lang/Map$Entry
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Methodref #3.#11 // java/lang/Object."<init>":()V
#11 = NameAndType #7:#8 // "<init>":()V
#12 = Utf8 LineNumberTable
#13 = Utf8 LocalVariableTable
#14 = Utf8 this
#15 = Utf8 Ldyvil/test/Test;
#16 = Utf8 LocalVariableTypeTable
#17 = Utf8 Ldyvil/test/Test<TA;TB;>;
#18 = Utf8 getKey
#19 = Utf8 ()Ljava/lang/Object;
#20 = Utf8 Signature
#21 = Utf8 ()TA;
#22 = Utf8 getValue
#23 = Utf8 ()TB;
#24 = Utf8 SourceFile
#25 = Utf8 Test.java
#26 = Utf8 <A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;Ldyvil/lang/Map$Entry<TA;TB;>;
#27 = Utf8 InnerClasses
#28 = Class #29 // dyvil/lang/Map
#29 = Utf8 dyvil/lang/Map
#30 = Utf8 Entry
{
public dyvil.test.Test();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 5: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Ldyvil/test/Test;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 5 0 this Ldyvil/test/Test<TA;TB;>;
public A getKey();
descriptor: ()Ljava/lang/Object;
flags: ACC_PUBLIC
Signature: #21 // ()TA;
Code:
stack=1, locals=1, args_size=1
0: aconst_null
1: areturn
LineNumberTable:
line 10: 0
LocalVariableTable:
Start Length Slot Name Signature
0 2 0 this Ldyvil/test/Test;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 2 0 this Ldyvil/test/Test<TA;TB;>;
public B getValue();
descriptor: ()Ljava/lang/Object;
flags: ACC_PUBLIC
Signature: #23 // ()TB;
Code:
stack=1, locals=1, args_size=1
0: aconst_null
1: areturn
LineNumberTable:
line 16: 0
LocalVariableTable:
Start Length Slot Name Signature
0 2 0 this Ldyvil/test/Test;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 2 0 this Ldyvil/test/Test<TA;TB;>;
}
I was able to track down the problem caused by that class implements Entry[A, B]
, but I have not yet been able to identify the actual problem in the bytecode. Is there something wrong with the bytecode generated by my compiler? Apart from package names and line numbers, etc. I cannot find a significant difference between the bytecode of the two classes.
If it is not a compiler error, I only have plugins ANTLR 4
, Bytecode Outline
and Eclipse Class Decompiler
.
source to share
No one has answered this question yet
Check out similar questions: