From 11570d6b957e887e06a33a53e55fca84bc1a6c8f Mon Sep 17 00:00:00 2001
From: SuspiciousActivity
<38253929+SuspiciousActivity@users.noreply.github.com>
Date: Sat, 7 Jul 2018 20:59:46 +0200
Subject: [PATCH] Added descriptions to all keywords
---
src/me/ByteEdit/main/Main.java | 70 +-
src/me/ByteEdit/main/OpcodesReverse.java | 638 +++++++++++++++++-
.../AutoCompleteDescWindow.properties | 1 +
.../AutoCompleteDescWindow_ar.properties | 1 +
.../AutoCompleteDescWindow_de.properties | 1 +
.../AutoCompleteDescWindow_es.properties | 1 +
.../AutoCompleteDescWindow_fr.properties | 1 +
.../AutoCompleteDescWindow_hu.properties | 1 +
.../AutoCompleteDescWindow_in.properties | 1 +
.../AutoCompleteDescWindow_it.properties | 1 +
.../AutoCompleteDescWindow_ja.properties | 1 +
.../AutoCompleteDescWindow_ko.properties | 1 +
.../AutoCompleteDescWindow_nl.properties | 1 +
.../AutoCompleteDescWindow_pl.properties | 1 +
.../AutoCompleteDescWindow_pt_BR.properties | 1 +
.../AutoCompleteDescWindow_ru.properties | 1 +
.../AutoCompleteDescWindow_tr.properties | 1 +
.../AutoCompleteDescWindow_zh_CN.properties | 1 +
.../AutoCompleteDescWindow_zh_TW.properties | 1 +
.../fife/ui/autocomplete/CompletionXml.dtd | 30 +
src/org/fife/ui/autocomplete/arrow_left.png | Bin 0 -> 345 bytes
src/org/fife/ui/autocomplete/arrow_right.png | Bin 0 -> 349 bytes
src/org/fife/ui/autocomplete/bullet_black.png | Bin 0 -> 221 bytes
src/org/fife/ui/autocomplete/osx_sizegrip.png | Bin 0 -> 4876 bytes
24 files changed, 731 insertions(+), 24 deletions(-)
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ar.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_de.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_es.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_fr.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_hu.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_in.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_it.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ja.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ko.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_nl.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pl.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pt_BR.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ru.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_tr.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_CN.properties
create mode 100644 src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_TW.properties
create mode 100644 src/org/fife/ui/autocomplete/CompletionXml.dtd
create mode 100644 src/org/fife/ui/autocomplete/arrow_left.png
create mode 100644 src/org/fife/ui/autocomplete/arrow_right.png
create mode 100644 src/org/fife/ui/autocomplete/bullet_black.png
create mode 100644 src/org/fife/ui/autocomplete/osx_sizegrip.png
diff --git a/src/me/ByteEdit/main/Main.java b/src/me/ByteEdit/main/Main.java
index 1370e70..96d6bf0 100644
--- a/src/me/ByteEdit/main/Main.java
+++ b/src/me/ByteEdit/main/Main.java
@@ -107,35 +107,58 @@ public class Main extends JFrame {
for (int i = 0; i < 200; i++) {
String s = OpcodesReverse.reverseOpcode(i);
if (!s.startsWith("Unknown "))
- provider.addCompletion(new BasicCompletion(provider, s));
+ provider.addCompletion(
+ new BasicCompletion(provider, s, null, OpcodesReverse.generateCompletionDesc(s)));
}
- provider.addCompletion(new BasicCompletion(provider, "public"));
- provider.addCompletion(new BasicCompletion(provider, "private"));
- provider.addCompletion(new BasicCompletion(provider, "protected"));
- provider.addCompletion(new BasicCompletion(provider, "final"));
- provider.addCompletion(new BasicCompletion(provider, "class"));
- provider.addCompletion(new BasicCompletion(provider, "enum"));
- provider.addCompletion(new BasicCompletion(provider, "static"));
- provider.addCompletion(new BasicCompletion(provider, "strictfp"));
- provider.addCompletion(new BasicCompletion(provider, "throws"));
- provider.addCompletion(new BasicCompletion(provider, "synthetic"));
- provider.addCompletion(new BasicCompletion(provider, "bridge"));
- provider.addCompletion(new BasicCompletion(provider, "label"));
- provider.addCompletion(new BasicCompletion(provider, "line"));
- provider.addCompletion(new BasicCompletion(provider, "extends"));
- provider.addCompletion(new BasicCompletion(provider, "implements"));
+ provider.addCompletion(
+ new BasicCompletion(provider, "public", null, OpcodesReverse.generateCompletionDesc("public")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "private", null, OpcodesReverse.generateCompletionDesc("private")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "protected", null, OpcodesReverse.generateCompletionDesc("protected")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "final", null, OpcodesReverse.generateCompletionDesc("final")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "class", null, OpcodesReverse.generateCompletionDesc("class")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "enum", null, OpcodesReverse.generateCompletionDesc("enum")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "static", null, OpcodesReverse.generateCompletionDesc("static")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "strictfp", null, OpcodesReverse.generateCompletionDesc("strictfp")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "throws", null, OpcodesReverse.generateCompletionDesc("throws")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "synthetic", null, OpcodesReverse.generateCompletionDesc("synthetic")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "bridge", null, OpcodesReverse.generateCompletionDesc("bridge")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "label", null, OpcodesReverse.generateCompletionDesc("label")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "line", null, OpcodesReverse.generateCompletionDesc("line")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "extends", null, OpcodesReverse.generateCompletionDesc("extends")));
+ provider.addCompletion(
+ new BasicCompletion(provider, "implements", null, OpcodesReverse.generateCompletionDesc("implements")));
- provider.addCompletion(new ShorthandCompletion(provider, "invvi", "invokevirtual desc owner/name"));
- provider.addCompletion(new ShorthandCompletion(provider, "invif", "invokeinterface desc owner/name"));
- provider.addCompletion(new ShorthandCompletion(provider, "invst", "invokestatic desc owner/name"));
- provider.addCompletion(new ShorthandCompletion(provider, "invsp", "invokespecial desc owner/name"));
+ provider.addCompletion(new ShorthandCompletion(provider, "invvi", "invokevirtual desc owner/name", null,
+ "invvi
Creates an example invokevirtual"));
+ provider.addCompletion(new ShorthandCompletion(provider, "invif", "invokeinterface desc owner/name", null,
+ "invif
Creates an example invokeinterface"));
+ provider.addCompletion(new ShorthandCompletion(provider, "invst", "invokestatic desc owner/name", null,
+ "invst
Creates an example invokestatic"));
+ provider.addCompletion(new ShorthandCompletion(provider, "invsp", "invokespecial desc owner/name", null,
+ "invsp
Creates an example invokespecial"));
provider.addCompletion(new ShorthandCompletion(provider, "sysout",
- "getstatic Ljava/io/PrintStream; java/lang/System/out\n\t\tldc \"text\"\n\t\tinvokevirtual (Ljava/lang/String;)V java/io/PrintStream/println"));
+ "getstatic Ljava/io/PrintStream; java/lang/System/out\n\t\tldc \"text\"\n\t\tinvokevirtual (Ljava/lang/String;)V java/io/PrintStream/println",
+ null, "sysout
Writes a System.out.println(\"text\"); as bytecode"));
provider.addCompletion(new ShorthandCompletion(provider, "clazz",
- "// #Annotations\n// #Class v:52\n// #Signature: null\n// #OuterClass: null\n// #InnerClasses:\npublic class Main extends java/lang/Object {\n// #SourceFile: Main.java\n\n// #Fields\n\n// #Methods\n\n}\n"));
+ "// #Annotations\n// #Class v:52\n// #Signature: null\n// #OuterClass: null\n// #InnerClasses:\npublic class Main extends java/lang/Object {\n// #SourceFile: Main.java\n\n// #Fields\n\n// #Methods\n\n}\n",
+ null, "clazz
Creates an example class"));
provider.addCompletion(new ShorthandCompletion(provider, "method",
- "// #Max: l:0 s:0\n\t// #TryCatch:\n\t// #LocalVars:\n\tpublic static method ()V {\n\t\treturn\n\t}"));
+ "// #Max: l:0 s:0\n\t// #TryCatch:\n\t// #LocalVars:\n\tpublic static method ()V {\n\t\treturn\n\t}",
+ null, "method
Creates an example method"));
return provider;
@@ -176,6 +199,7 @@ public class Main extends JFrame {
CompletionProvider provider = createCompletionProvider();
AutoCompletion ac = new AutoCompletion(provider);
+ ac.setShowDescWindow(true);
ac.install(textArea);
textArea.addKeyListener(new KeyAdapter() {
diff --git a/src/me/ByteEdit/main/OpcodesReverse.java b/src/me/ByteEdit/main/OpcodesReverse.java
index 4e3272e..27b217a 100644
--- a/src/me/ByteEdit/main/OpcodesReverse.java
+++ b/src/me/ByteEdit/main/OpcodesReverse.java
@@ -318,10 +318,646 @@ public class OpcodesReverse {
return "ifnull";
case 199:
return "ifnonnull";
-
default:
return "Unknown Opcode: " + opcode;
}
}
+ public static String generateCompletionDesc(String opcode) {
+ return "" + opcode + "
" + generateDesc(opcode) + "
Arguments:
"
+ + generateByteDesc(opcode) + "
Stack:
" + generateStackDesc(opcode)
+ + "";
+ }
+
+ private static String generateDesc(String opcode) {
+ switch (opcode) {
+ case "dcmpl":
+ case "dcmpg":
+ return "compare two doubles";
+ case "fcmpl":
+ case "fcmpg":
+ return "compare two floats";
+ case "lookupswitch":
+ return "a target address is looked up from a table using a key and execution continues from the instruction at that address";
+ case "isub":
+ return "int subtract";
+ case "if_icmpeq":
+ return "if ints are equal, go to instruction at label id";
+ case "aaload":
+ return "load onto the stack a reference from an array";
+ case "ior":
+ return "bitwise int OR";
+ case "laload":
+ return "load a long from an array";
+ case "iconst_m1":
+ return "load the int value -1 onto the stack";
+ case "if_icmpne":
+ return "if ints are not equal, go to instruction at label id";
+ case "invokevirtual":
+ return "invoke virtual method on object objectref and puts the result on the stack (might be void), identified by desc and name";
+ case "freturn":
+ return "return a float";
+ case "lstore":
+ return "store a long value in a local variable index";
+ case "multianewarray":
+ return "create a new array of dimension dimensions of type identified by class reference in constant pool desc";
+ case "fsub":
+ return "subtract two floats";
+ case "monitorenter":
+ return "enter monitor for object (grab the lock - start of synchronized() section)";
+ case "sastore":
+ return "store short to array";
+ case "astore":
+ return "store a reference into a local variable index";
+ case "bastore":
+ return "store a byte or Boolean value into an array";
+ case "if_icmpge":
+ return "if value1 is greater than or equal to value2, go to instruction at label id";
+ case "iload":
+ return "load an int value from a local variable index";
+ case "pop2":
+ return "discard the top two values on the stack (or one value, if it is a double or long)";
+ case "putfield":
+ return "set field to value in an object objectref, where the field is identified by desc";
+ case "anewarray":
+ return "create a new array of references of length count and component type the constant pool";
+ case "athrow":
+ return "throws an error or exception (notice that the rest of the stack is cleared, leaving only a reference to the Throwable)";
+ case "dup2":
+ return "duplicate top two stack words (two values, if value1 is not double nor long; a single value, if value1 is double or long)";
+ case "caload":
+ return "load a char from an array";
+ case "fconst_0":
+ return "push 0.0f on the stack";
+ case "if_icmpgt":
+ return "if value1 is greater than value2, go to instruction at label id";
+ case "fconst_1":
+ return "push 1.0f on the stack";
+ case "fdiv":
+ return "divide two floats";
+ case "frem":
+ return "get the remainder from a division between two floats";
+ case "iaload":
+ return "load an int from an array";
+ case "jsr":
+ return "jump to subroutine at label id and place the return address on the stack";
+ case "sipush":
+ return "push a short onto the stack as an integer value";
+ case "getfield":
+ return "get a field value of an object objectref, where the field is identified by desc";
+ case "aconst_null":
+ return "push a null reference onto the stack";
+ case "aload":
+ return "load a reference onto the stack from a local variable index";
+ case "invokespecial":
+ return "invoke instance method on object objectref and puts the result on the stack (might be void), identified by desc and name";
+ case "lor":
+ return "bitwise OR of two longs";
+ case "pop":
+ return "discard the top value on the stack";
+ case "goto":
+ return "goes to another instruction at label id";
+ case "fadd":
+ return "add two floats";
+ case "iflt":
+ return "if value is less than 0, go to instruction at label id";
+ case "monitorexit":
+ return "exit monitor for object (release the lock - end of synchronized() section)";
+ case "f2d":
+ return "convert a float to a double";
+ case "castore":
+ return "store a char into an array";
+ case "fneg":
+ return "negate a float";
+ case "areturn":
+ return "return a reference from a method";
+ case "f2i":
+ return "convert a float to an int";
+ case "lxor":
+ return "bitwise XOR of two longs";
+ case "fconst_2":
+ return "push 2.0f on the stack";
+ case "baload":
+ return "load a byte or Boolean value from an array";
+ case "f2l":
+ return "convert a float to a long";
+ case "ixor":
+ return "int xor";
+ case "ireturn":
+ return "return an integer from a method";
+ case "lsub":
+ return "subtract two longs";
+ case "ifle":
+ return "if value is less than or equal to 0, go to instruction at label id";
+ case "lcmp":
+ return "push 0 if the two longs are the same, 1 if value1 is greater than value2, -1 otherwise";
+ case "dsub":
+ return "subtract a double from another";
+ case "ifnonnull":
+ return "if value is not null, go to instruction at label id";
+ case "if_acmpeq":
+ return "if references are equal, go to instruction at label id";
+ case "lload":
+ return "load a long value from a local variable index";
+ case "arraylength":
+ return "get the length of an array";
+ case "if_acmpne":
+ return "if references are not equal, go to instruction at label id";
+ case "return":
+ return "return void from method";
+ case "ddiv":
+ return "divide two doubles";
+ case "dneg":
+ return "negate a double";
+ case "dastore":
+ return "store a double into an array";
+ case "ishr":
+ return "int arithmetic shift right";
+ case "ladd":
+ return "add two longs";
+ case "ifge":
+ return "if value is greater than or equal to 0, go to instruction at label id";
+ case "imul":
+ return "multiply two integers";
+ case "newarray":
+ return "create new array with count elements of primitive type identified by type";
+ case "aastore":
+ return "store into a reference in an array";
+ case "invokestatic":
+ return "invoke a static method and puts the result on the stack (might be void), identified by desc and name";
+ case "checkcast":
+ return "checks whether an objectref is of a certain type, the class reference identified by desc";
+ case "dadd":
+ return "add two doubles";
+ case "lneg":
+ return "negate a long";
+ case "ldiv":
+ return "divide two longs";
+ case "i2b":
+ return "convert an int into a byte";
+ case "drem":
+ return "get the remainder from a division between two doubles";
+ case "i2d":
+ return "convert an int into a double";
+ case "i2c":
+ return "convert an int into a character";
+ case "fload":
+ return "load a float value from a local variable index";
+ case "i2f":
+ return "convert an int into a float";
+ case "lrem":
+ return "remainder of division of two longs";
+ case "ishl":
+ return "int shift left";
+ case "irem":
+ return "logical int remainder";
+ case "ret":
+ return "continue execution from address taken from a local variable index (the asymmetry with jsr is intentional)";
+ case "new":
+ return "create new object of type identified by desc";
+ case "fstore":
+ return "store a float value into a local variable index";
+ case "i2l":
+ return "convert an int into a long";
+ case "ifne":
+ return "if value is not 0, go to instruction at label id";
+ case "swap":
+ return "swaps two top words on the stack (note that value1 and value2 must not be double or long)";
+ case "dreturn":
+ return "return a double from a method";
+ case "iadd":
+ return "add two ints";
+ case "i2s":
+ return "convert an int into a short";
+ case "invokedynamic":
+ return "invokes a dynamic method and puts the result on the stack (might be void), identified by desc and name";
+ case "fmul":
+ return "multiply two floats";
+ case "istore":
+ return "store int value into variable index";
+ case "dup_x1":
+ return "insert a copy of the top value into the stack two values from the top. value1 and value2 must not be of the type double or long.";
+ case "dup_x2":
+ return "insert a copy of the top value into the stack two (if value2 is double or long it takes up the entry of value3, too) or three values (if value2 is neither double nor long) from the top";
+ case "faload":
+ return "load a float from an array";
+ case "iastore":
+ return "store an int into an array";
+ case "ineg":
+ return "negate int";
+ case "ifeq":
+ return "if value is 0, go to instruction at label id";
+ case "idiv":
+ return "divide two integers";
+ case "lushr":
+ return "bitwise shift right of a long value1 by int value2 positions, unsigned";
+ case "dup2_x1":
+ return "duplicate two words and insert beneath third word (see explanation above)";
+ case "dup2_x2":
+ return "duplicate two words and insert beneath fourth word";
+ case "lastore":
+ return "store a long to an array";
+ case "iconst_5":
+ return "load the int value 5 onto the stack";
+ case "getstatic":
+ return "get a static field value of a class, where the field is identified by desc";
+ case "putstatic":
+ return "set static field to value in a class, where the field is identified by desc";
+ case "fastore":
+ return "store a float in an array";
+ case "daload":
+ return "load a double from an array";
+ case "nop":
+ return "perform no operation";
+ case "dmul":
+ return "multiply two doubles";
+ case "dstore":
+ return "store a double value into a local variable index";
+ case "if_icmple":
+ return "if value1 is less than or equal to value2, go to instruction at label id";
+ case "bipush":
+ return "push a byte onto the stack as an integer value";
+ case "d2f":
+ return "convert a double to a float";
+ case "iconst_0":
+ return "load the int value 0 onto the stack";
+ case "ifnull":
+ return "if value is null, go to instruction at label id";
+ case "land":
+ return "bitwise AND of two longs";
+ case "d2i":
+ return "convert a double to an int";
+ case "dconst_0":
+ return "push the constant 0.0 (a double) onto the stack";
+ case "iconst_3":
+ return "load the int value 3 onto the stack";
+ case "lconst_1":
+ return "push 1L (the number one with type long) onto the stack";
+ case "dconst_1":
+ return "push the constant 1.0 (a double) onto the stack";
+ case "iconst_4":
+ return "load the int value 4 onto the stack";
+ case "lconst_0":
+ return "push 0L (the number zero with type long) onto the stack";
+ case "iconst_1":
+ return "load the int value 1 onto the stack";
+ case "d2l":
+ return "convert a double to a long";
+ case "iconst_2":
+ return "load the int value 2 onto the stack";
+ case "l2d":
+ return "convert a long to a double";
+ case "l2f":
+ return "convert a long to a float";
+ case "l2i":
+ return "convert a long to a int";
+ case "lshr":
+ return "bitwise shift right of a long value1 by int value2 positions";
+ case "iinc":
+ return "increment local variable index by const";
+ case "ldc":
+ return "push a constant value";
+ case "lmul":
+ return "multiply two longs";
+ case "if_icmplt":
+ return "if value1 is less than value2, go to instruction at label id";
+ case "instanceof":
+ return "determines if an object objectref is of a given type, identified by desc";
+ case "iushr":
+ return "int logical shift right";
+ case "saload":
+ return "load short from array";
+ case "lreturn":
+ return "return a long value";
+ case "tableswitch":
+ return "a target address is looked up from a table using a key and execution continues from the instruction at that address";
+ case "dload":
+ return "load a double value from a local variable index";
+ case "lshl":
+ return "bitwise shift left of a long value1 by int value2 positions";
+ case "ifgt":
+ return "if value is greater than 0, go to instruction at label id";
+ case "invokeinterface":
+ return "invokes an interface method on object objectref and puts the result on the stack (might be void), identified by desc and name";
+ case "dup":
+ return "duplicate the value on top of the stack";
+ case "iand":
+ return "perform a bitwise AND on two integers";
+ case "public":
+ return "access modifier public";
+ case "private":
+ return "access modifier private";
+ case "protected":
+ return "access modifier protected";
+ case "final":
+ return "access modifier final";
+ case "class":
+ return "keyword class";
+ case "enum":
+ return "keyword enum";
+ case "static":
+ return "access modifier static";
+ case "strictfp":
+ return "keyword strictfp";
+ case "throws":
+ return "keyword throws";
+ case "synthetic":
+ return "access modifier synthetic";
+ case "bridge":
+ return "access modifier bridge";
+ case "label":
+ return "creates a label with id label id, use with
// label [label id]";
+ case "line":
+ return "creates a line number with number line number, use with
// line [number]";
+ case "extends":
+ return "keyword extends";
+ case "implements":
+ return "keyword implements";
+ default:
+ return "No description available.";
+ }
+ }
+
+ private static String generateByteDesc(String opcode) {
+ switch (opcode) {
+ case "if_icmpeq":
+ case "if_icmpne":
+ case "if_icmpge":
+ case "if_icmpgt":
+ case "jsr":
+ case "goto":
+ case "iflt":
+ case "ifle":
+ case "ifnonnull":
+ case "if_acmpeq":
+ case "if_acmpne":
+ case "ifge":
+ case "ifne":
+ case "ifeq":
+ case "if_icmple":
+ case "ifnull":
+ case "if_icmplt":
+ case "ifgt":
+ case "label":
+ return "label id";
+ case "lstore":
+ case "astore":
+ case "iload":
+ case "aload":
+ case "lload":
+ case "fload":
+ case "ret":
+ case "fstore":
+ case "istore":
+ case "dstore":
+ case "dload":
+ return "index";
+ case "invokevirtual":
+ case "putfield":
+ case "getfield":
+ case "invokespecial":
+ case "invokestatic":
+ case "invokedynamic":
+ case "getstatic":
+ case "putstatic":
+ case "invokeinterface":
+ return "desc, name";
+ case "anewarray":
+ case "checkcast":
+ case "new":
+ return "classname";
+ case "multianewarray":
+ return "desc, dimension";
+ case "lookupswitch":
+ return "lookupswitch node";
+ case "sipush":
+ return "short";
+ case "newarray":
+ return "type";
+ case "bipush":
+ return "byte";
+ case "iinc":
+ return "index, const";
+ case "ldc":
+ return "value";
+ case "instanceof":
+ return "desc";
+ case "tableswitch":
+ return "tableswitch node";
+ case "line":
+ return "line number";
+ default:
+ return "No arguments.";
+ }
+ }
+
+ private static String generateStackDesc(String opcode) {
+ switch (opcode) {
+ case "isub":
+ case "ior":
+ case "fsub":
+ case "fdiv":
+ case "frem":
+ case "lor":
+ case "fadd":
+ case "lxor":
+ case "ixor":
+ case "lsub":
+ case "lcmp":
+ case "dsub":
+ case "fcmpl":
+ case "ddiv":
+ case "ishr":
+ case "ladd":
+ case "imul":
+ case "fcmpg":
+ case "dadd":
+ case "ldiv":
+ case "drem":
+ case "lrem":
+ case "ishl":
+ case "irem":
+ case "iadd":
+ case "fmul":
+ case "idiv":
+ case "lushr":
+ case "dmul":
+ case "land":
+ case "lshr":
+ case "dcmpl":
+ case "dcmpg":
+ case "lmul":
+ case "iushr":
+ case "lshl":
+ case "iand":
+ return "value1, value2 -> result";
+ case "sastore":
+ case "bastore":
+ case "castore":
+ case "dastore":
+ case "aastore":
+ case "iastore":
+ case "lastore":
+ case "fastore":
+ return "arrayref, index, value ->";
+ case "monitorenter":
+ case "astore":
+ case "monitorexit":
+ return "objectref ->";
+ case "f2d":
+ case "fneg":
+ case "f2i":
+ case "f2l":
+ case "dneg":
+ case "lneg":
+ case "i2b":
+ case "i2d":
+ case "i2c":
+ case "i2f":
+ case "i2l":
+ case "i2s":
+ case "ineg":
+ case "d2f":
+ case "d2i":
+ case "d2l":
+ case "l2d":
+ case "l2f":
+ case "l2i":
+ return "value -> result";
+ case "iload":
+ case "sipush":
+ case "lload":
+ case "fload":
+ case "getstatic":
+ case "bipush":
+ case "ldc":
+ case "dload":
+ return "-> value";
+ case "lstore":
+ case "pop":
+ case "iflt":
+ case "ifle":
+ case "ifnonnull":
+ case "ifge":
+ case "fstore":
+ case "ifne":
+ case "istore":
+ case "ifeq":
+ case "putstatic":
+ case "dstore":
+ case "ifnull":
+ case "ifgt":
+ return "value ->";
+ case "freturn":
+ case "ireturn":
+ case "dreturn":
+ case "lreturn":
+ return "value -> [empty]";
+ case "if_icmpeq":
+ case "if_icmpne":
+ case "if_icmpge":
+ case "if_icmpgt":
+ case "if_acmpeq":
+ case "if_acmpne":
+ case "if_icmple":
+ case "if_icmplt":
+ return "value1, value2 ->";
+ case "aaload":
+ case "laload":
+ case "caload":
+ case "iaload":
+ case "baload":
+ case "faload":
+ case "daload":
+ case "saload":
+ return "arrayref, index -> value";
+ case "invokevirtual":
+ case "invokespecial":
+ case "invokeinterface":
+ return "objectref, [arg1, arg2, ...] -> result";
+ case "anewarray":
+ case "newarray":
+ return "count -> arrayref";
+ case "aload":
+ case "new":
+ return "-> objectref";
+ case "lookupswitch":
+ return "key ->";
+ case "iconst_m1":
+ return "-> -1";
+ case "multianewarray":
+ return "count1, [count2,...] -> arrayref";
+ case "pop2":
+ return "{value2, value1} ->";
+ case "putfield":
+ return "objectref, value ->";
+ case "athrow":
+ return "objectref -> [empty], objectref";
+ case "dup2":
+ return "{value2, value1} -> {value2, value1}, {value2, value1}";
+ case "fconst_0":
+ return "-> 0.0f";
+ case "fconst_1":
+ return "-> 1.0f";
+ case "jsr":
+ return "-> address";
+ case "getfield":
+ return "objectref -> value";
+ case "aconst_null":
+ return "-> null";
+ case "areturn":
+ return "objectref -> [empty]";
+ case "fconst_2":
+ return "-> 2.0f";
+ case "arraylength":
+ return "arrayref -> length";
+ case "return":
+ return "-> [empty]";
+ case "invokestatic":
+ return "[arg1, arg2, ...] -> result";
+ case "checkcast":
+ return "objectref -> objectref";
+ case "swap":
+ return "value2, value1 -> value1, value2";
+ case "invokedynamic":
+ return "[arg1, [arg2 ...]] -> result";
+ case "dup_x1":
+ return "value2, value1 -> value1, value2, value1";
+ case "dup_x2":
+ return "value3, value2, value1 -> value1, value3, value2, value1";
+ case "dup2_x1":
+ return "value3, {value2, value1} -> {value2, value1}, value3, {value2, value1}";
+ case "dup2_x2":
+ return "{value4, value3}, {value2, value1} -> {value2, value1}, {value4, value3}, {value2, value1}";
+ case "iconst_5":
+ return "-> 5";
+ case "iconst_0":
+ return "-> 0";
+ case "dconst_0":
+ return "-> 0.0";
+ case "iconst_3":
+ return "-> 3";
+ case "lconst_1":
+ return "-> 1L";
+ case "dconst_1":
+ return "-> 1.0";
+ case "iconst_4":
+ return "-> 4";
+ case "lconst_0":
+ return "-> 0L";
+ case "iconst_1":
+ return "-> 1";
+ case "iconst_2":
+ return "-> 2";
+ case "instanceof":
+ return "objectref -> result";
+ case "tableswitch":
+ return "index ->";
+ case "dup":
+ return "value -> value, value";
+ default:
+ return "Stack doesn't change.";
+ }
+ }
+
}
\ No newline at end of file
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.properties
new file mode 100644
index 0000000..968a22d
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.properties
@@ -0,0 +1 @@
+NoDescAvailable=No description available
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ar.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ar.properties
new file mode 100644
index 0000000..07d8491
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ar.properties
@@ -0,0 +1 @@
+NoDescAvailable=\u0644\u0627 \u064a\u0648\u062c\u062f \u0634\u0631\u062d \u0645\u062a\u0627\u062d
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_de.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_de.properties
new file mode 100644
index 0000000..019028e
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_de.properties
@@ -0,0 +1 @@
+NoDescAvailable=Keine Beschreibung verf\u00fcgbar
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_es.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_es.properties
new file mode 100644
index 0000000..3a80a8a
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_es.properties
@@ -0,0 +1 @@
+NoDescAvailable=No hay descripci\u00f3n disponible
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_fr.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_fr.properties
new file mode 100644
index 0000000..6892acb
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_fr.properties
@@ -0,0 +1 @@
+NoDescAvailable=Aucune description disponible
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_hu.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_hu.properties
new file mode 100644
index 0000000..1647320
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_hu.properties
@@ -0,0 +1 @@
+NoDescAvailable=Nincs el\u00e9rhet\u0151 le\u00edr\u00e1s
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_in.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_in.properties
new file mode 100644
index 0000000..968a22d
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_in.properties
@@ -0,0 +1 @@
+NoDescAvailable=No description available
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_it.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_it.properties
new file mode 100644
index 0000000..c61dff0
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_it.properties
@@ -0,0 +1 @@
+NoDescAvailable=Nessuna descrizione disponibile
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ja.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ja.properties
new file mode 100644
index 0000000..5e1ae40
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ja.properties
@@ -0,0 +1 @@
+NoDescAvailable=\u8a18\u8ff0\u306f\u4e0d\u660e\u3067\u3059
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ko.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ko.properties
new file mode 100644
index 0000000..cfaf849
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ko.properties
@@ -0,0 +1 @@
+NoDescAvailable=\ud574\ub2f9 \uc124\uba85 \uc5c6\uc74c
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_nl.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_nl.properties
new file mode 100644
index 0000000..968a22d
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_nl.properties
@@ -0,0 +1 @@
+NoDescAvailable=No description available
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pl.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pl.properties
new file mode 100644
index 0000000..8498741
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pl.properties
@@ -0,0 +1 @@
+NoDescAvailable=Opis nie jest dost\u0119pny
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pt_BR.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pt_BR.properties
new file mode 100644
index 0000000..7b96f2f
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_pt_BR.properties
@@ -0,0 +1 @@
+NoDescAvailable=Nenhuma descri\u00e7\u00e3o dispon\u00edvel
\ No newline at end of file
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ru.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ru.properties
new file mode 100644
index 0000000..44e2224
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_ru.properties
@@ -0,0 +1 @@
+NoDescAvailable=\u041d\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_tr.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_tr.properties
new file mode 100644
index 0000000..0f153d8
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_tr.properties
@@ -0,0 +1 @@
+NoDescAvailable=A\u00e7\u0131klama mevcut de\u011fil
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_CN.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_CN.properties
new file mode 100644
index 0000000..8eb1343
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_CN.properties
@@ -0,0 +1 @@
+NoDescAvailable=\u6ca1\u6709\u63cf\u8ff0
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_TW.properties b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_TW.properties
new file mode 100644
index 0000000..968a22d
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow_zh_TW.properties
@@ -0,0 +1 @@
+NoDescAvailable=No description available
diff --git a/src/org/fife/ui/autocomplete/CompletionXml.dtd b/src/org/fife/ui/autocomplete/CompletionXml.dtd
new file mode 100644
index 0000000..10b81e8
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/CompletionXml.dtd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/org/fife/ui/autocomplete/arrow_left.png b/src/org/fife/ui/autocomplete/arrow_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..5dc696781e6135d37b5bf2e98e46fd94f020c48d
GIT binary patch
literal 345
zcmV-f0jBq$gGR5;6H
z{Qv(y10{fofkH6I3@AO3$p*x`Nil#0jeqs;pT9Ds7{CaN1)$9r#n~kE{`~pF@bLXZ
zhF?E_GyM7i!oL`P0x_8Wj$ni2F7#hzWPxfvDaIo>#A+qW*AYQLZl(!&BX$x7Ik;qO170ssEM
z@$bKXf%rGW?|(r27bf-TSv
zD}TdX0CM*JhkLO)8|Y^+n~Q^sK~hqR;q|N647YFGy>NTZJsWr!5CaSfwJm@a><8NX
v2&h?|yGq%gzvv3epMS6VUgTO+t)&4yg_Z9&?~wX1XYz3g^%vJ}
zsd8-%W7^RuT(Z`*)5+_lkeLp*VoUZVu_vDAcINajHbe`4`F-)spS_>!?T=Y$yPY}I
Rd=F?fgQu&X%Q~loCICsSQ$YX#
literal 0
HcmV?d00001
diff --git a/src/org/fife/ui/autocomplete/osx_sizegrip.png b/src/org/fife/ui/autocomplete/osx_sizegrip.png
new file mode 100644
index 0000000000000000000000000000000000000000..07fa8b19e32736a66b30471f5d4410a6fc310ab8
GIT binary patch
literal 4876
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
literal 0
HcmV?d00001