diff --git a/build.gradle b/build.gradle index 6ef1d4bb6..c857c69a7 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ plugins { sourceCompatibility = 1.8 targetCompatibility = 1.8 -version = '0.2.2' +version = '0.3.0-SNAPSHOT' def ENV = System.getenv() version = version + (ENV.GITHUB_ACTIONS ? "" : "+local") diff --git a/src/org/benf/cfr/reader/bytecode/analysis/parse/expression/LambdaExpressionFallback.java b/src/org/benf/cfr/reader/bytecode/analysis/parse/expression/LambdaExpressionFallback.java index becfd91c8..8291e8dfe 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/parse/expression/LambdaExpressionFallback.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/parse/expression/LambdaExpressionFallback.java @@ -141,11 +141,11 @@ public Dumper dumpInner(Dumper d) { d.separator("("); } List args = ListFactory.newList(n); - for (int x = 0; x < n; ++x) { - if (x > 0) d.separator(", "); - String arg = "arg_" + x; + for (int argPosition = 0; argPosition < n; ++argPosition) { + if (argPosition > 0) d.separator(", "); + String arg = "arg_" + argPosition; args.add(arg); - d.parameterName(arg, arg, lambdaFn, x, true); + d.parameterName(arg, arg, lambdaFn, argPosition, lambdaFn.getParameterLValues().get(argPosition).localVariable.getIdx(), true); } if (multi) { d.separator(")"); diff --git a/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LambdaParameter.java b/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LambdaParameter.java index f11d6eedc..a25e66870 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LambdaParameter.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LambdaParameter.java @@ -6,17 +6,17 @@ public class LambdaParameter extends LocalVariable { public final MethodPrototype originalMethod; - public final int index; // index in method params, not slot + public final int argPosition; // index in method params, not slot public LambdaParameter(String name, InferredJavaType inferredJavaType, MethodPrototype originalMethod, int index) { super(name, inferredJavaType); - this.index = index; + this.argPosition = index; this.originalMethod = originalMethod; } @Override public Dumper dump(Dumper d, boolean defines) { - getName().dumpParameter(d, originalMethod, index, defines); + getName().dumpParameter(d, originalMethod, argPosition, originalMethod.getParameterLValues().get(argPosition).localVariable.getIdx(), defines); return d; } } diff --git a/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LocalVariable.java b/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LocalVariable.java index 3687f2c32..00fefeade 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LocalVariable.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/parse/lvalue/LocalVariable.java @@ -111,12 +111,16 @@ public Precedence getPrecedence() { @Override public Dumper dump(Dumper d, boolean defines) { - return name.dump(d, defines); // todo pass lv, lvt, start offset + if (ident != null && originalRawOffset != ident.getStackPos()) { + int i = 0; + } + + return name.dumpLocalVariable(d, idx, -1, originalRawOffset, defines); } @Override public Dumper dumpInner(Dumper d) { - name.dump(d); + name.dumpLocalVariable(d, idx, -1, originalRawOffset, false); // Note that this print is only decorating when we have bad data. d.print(typeToString()); return d; diff --git a/src/org/benf/cfr/reader/bytecode/analysis/parse/utils/scope/LocalClassScopeDiscoverImpl.java b/src/org/benf/cfr/reader/bytecode/analysis/parse/utils/scope/LocalClassScopeDiscoverImpl.java index 75fbc7834..b336c57f0 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/parse/utils/scope/LocalClassScopeDiscoverImpl.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/parse/utils/scope/LocalClassScopeDiscoverImpl.java @@ -75,7 +75,7 @@ public Dumper dump(Dumper d, boolean defines) { } @Override - public Dumper dumpParameter(Dumper d, MethodPrototype methodPrototype, int index, boolean defines) { + public Dumper dumpParameter(Dumper d, MethodPrototype methodPrototype, int argPosition, int lvIndex, boolean defines) { return null; } diff --git a/src/org/benf/cfr/reader/bytecode/analysis/types/MethodPrototype.java b/src/org/benf/cfr/reader/bytecode/analysis/types/MethodPrototype.java index 3d5a78e17..885400a4d 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/types/MethodPrototype.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/types/MethodPrototype.java @@ -278,7 +278,7 @@ public void dumpDeclarationSignature(Dumper d, String methName, Method.MethodCon annotationsHelper.dumpParamType(arg, paramIdx, d); } d.print(" "); - param.getName().dumpParameter(d, this, paramIdx, true); + param.getName().dumpParameter(d, this, paramIdx, getParameterLValues().get(paramIdx).localVariable.getIdx(), true); } d.separator(")"); } diff --git a/src/org/benf/cfr/reader/bytecode/analysis/variables/Ident.java b/src/org/benf/cfr/reader/bytecode/analysis/variables/Ident.java index f27ad9c08..0001020bc 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/variables/Ident.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/variables/Ident.java @@ -28,6 +28,10 @@ public boolean equals(Object o) { return true; } + public int getStackPos() { + return stackpos; + } + public int getIdx() { return idx; } diff --git a/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariable.java b/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariable.java index 715f94c67..ce67ed3dc 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariable.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariable.java @@ -17,12 +17,12 @@ public interface NamedVariable extends Dumpable { Dumper dump(Dumper d, boolean defines); // fabric start - default Dumper dumpParameter(Dumper d, MethodPrototype prototype, int index, boolean defines) { + default Dumper dumpParameter(Dumper d, MethodPrototype prototype, int argPosition, int lvIndex, boolean defines) { return dump(d, defines); } // start offset measured in instructions, not bytes - default Dumper dumpLocalVariable(Dumper d, int localVarIndex, Ident ident, int tableIndex, int startOffset, boolean defines) { + default Dumper dumpLocalVariable(Dumper d, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines) { return dump(d, defines); } } diff --git a/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableDefault.java b/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableDefault.java index 344880e19..5e277657b 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableDefault.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableDefault.java @@ -29,12 +29,17 @@ public Dumper dump(Dumper d) { @Override public Dumper dump(Dumper d, boolean defines) { - return d.variableName(name, this, defines); + return d.variableName(name, -1, -1, -1, defines); } @Override - public Dumper dumpParameter(Dumper d, MethodPrototype methodPrototype, int index, boolean defines) { - return d.parameterName(name, this, methodPrototype, index, defines); + public Dumper dumpParameter(Dumper d, MethodPrototype methodPrototype, int argPosition, int lvIndex, boolean defines) { + return d.parameterName(name, this, methodPrototype, argPosition, lvIndex, defines); + } + + @Override + public Dumper dumpLocalVariable(Dumper d, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines) { + return d.variableName(name, lvIndex, lvtRowIndex, startOpIndex, defines); } @Override diff --git a/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableFromHint.java b/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableFromHint.java index a0539da3b..425180567 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableFromHint.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/variables/NamedVariableFromHint.java @@ -31,12 +31,12 @@ public Dumper dump(Dumper d) { @Override public Dumper dump(Dumper d, boolean defines) { - return d.variableName(name, this, defines); + return d.variableName(name, slot, -1, -1, defines); } @Override - public Dumper dumpParameter(Dumper d, MethodPrototype methodPrototype, int index, boolean defines) { - return d.parameterName(name, this, methodPrototype, index, defines); + public Dumper dumpParameter(Dumper d, MethodPrototype methodPrototype, int argPosition, int lvIndex, boolean defines) { + return d.parameterName(name, this, methodPrototype, argPosition, lvIndex, defines); } @Override diff --git a/src/org/benf/cfr/reader/bytecode/analysis/variables/VariableNamerHinted.java b/src/org/benf/cfr/reader/bytecode/analysis/variables/VariableNamerHinted.java index 06703bd4d..318462ead 100644 --- a/src/org/benf/cfr/reader/bytecode/analysis/variables/VariableNamerHinted.java +++ b/src/org/benf/cfr/reader/bytecode/analysis/variables/VariableNamerHinted.java @@ -64,6 +64,7 @@ public NamedVariable getName(int originalRawOffset, Ident ident, long stackPosit // if used in a legit location, however we should also track if this // is an instance method. if (name.equals(MiscConstants.THIS) && ident.getIdx() == 0) { + namedVariable = new NamedVariableFromHint(name, 0, -1); namedVariable.forceName(MiscConstants.THIS); } } else { diff --git a/src/org/benf/cfr/reader/state/TypeUsageCollectingDumper.java b/src/org/benf/cfr/reader/state/TypeUsageCollectingDumper.java index fc1d08087..5ddb6b077 100644 --- a/src/org/benf/cfr/reader/state/TypeUsageCollectingDumper.java +++ b/src/org/benf/cfr/reader/state/TypeUsageCollectingDumper.java @@ -5,6 +5,7 @@ import org.benf.cfr.reader.bytecode.analysis.types.JavaTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.MethodPrototype; import org.benf.cfr.reader.bytecode.analysis.types.TypeConstants; +import org.benf.cfr.reader.bytecode.analysis.variables.Ident; import org.benf.cfr.reader.bytecode.analysis.variables.NamedVariable; import org.benf.cfr.reader.entities.ClassFile; import org.benf.cfr.reader.entities.Field; @@ -108,12 +109,12 @@ public Dumper methodName(String name, MethodPrototype method, boolean special, b } @Override - public Dumper parameterName(String name, Object ref, MethodPrototype method, int index, boolean defines) { + public Dumper parameterName(String name, Object ref, MethodPrototype method, int argPosition, int lvIndex, boolean defines) { return this; } @Override - public Dumper variableName(String name, NamedVariable variable, boolean defines) { + public Dumper variableName(String name, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines) { return this; } diff --git a/src/org/benf/cfr/reader/util/output/DelegatingDumper.java b/src/org/benf/cfr/reader/util/output/DelegatingDumper.java index 578aad481..8151b6b88 100644 --- a/src/org/benf/cfr/reader/util/output/DelegatingDumper.java +++ b/src/org/benf/cfr/reader/util/output/DelegatingDumper.java @@ -4,6 +4,7 @@ import org.benf.cfr.reader.bytecode.analysis.types.JavaRefTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.JavaTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.MethodPrototype; +import org.benf.cfr.reader.bytecode.analysis.variables.Ident; import org.benf.cfr.reader.bytecode.analysis.variables.NamedVariable; import org.benf.cfr.reader.entities.Field; import org.benf.cfr.reader.entities.Method; @@ -95,14 +96,14 @@ public Dumper methodName(String name, MethodPrototype method, boolean special, b } @Override - public Dumper parameterName(String name, Object ref, MethodPrototype method, int index, boolean defines) { - delegate.parameterName(name, ref, method, index, defines); + public Dumper parameterName(String name, Object ref, MethodPrototype method, int argPosition, int lvIndex, boolean defines) { + delegate.parameterName(name, ref, method, argPosition, lvIndex, defines); return this; } @Override - public Dumper variableName(String name, NamedVariable variable, boolean defines) { - delegate.variableName(name, variable, defines); + public Dumper variableName(String name, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines) { + delegate.variableName(name, lvIndex, lvtRowIndex, startOpIndex, defines); return this; } diff --git a/src/org/benf/cfr/reader/util/output/Dumper.java b/src/org/benf/cfr/reader/util/output/Dumper.java index 265c24cf8..5c0e84e9b 100644 --- a/src/org/benf/cfr/reader/util/output/Dumper.java +++ b/src/org/benf/cfr/reader/util/output/Dumper.java @@ -4,6 +4,7 @@ import org.benf.cfr.reader.bytecode.analysis.types.JavaRefTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.JavaTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.MethodPrototype; +import org.benf.cfr.reader.bytecode.analysis.variables.Ident; import org.benf.cfr.reader.bytecode.analysis.variables.NamedVariable; import org.benf.cfr.reader.entities.Field; import org.benf.cfr.reader.entities.Method; @@ -52,12 +53,10 @@ public interface Dumper extends MethodErrorCollector { Dumper methodName(String name, MethodPrototype method, boolean special, boolean defines); - Dumper parameterName(String name, Object ref, MethodPrototype method, int index, boolean defines); - - @Deprecated // todo add lv, lvt indices and start offset - Dumper variableName(String name, NamedVariable variable, boolean defines); + Dumper parameterName(String name, Object ref, MethodPrototype method, int argPosition, int lvIndex, boolean defines); // fabric + Dumper variableName(String name, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines); default Dumper dumpClassDoc(JavaTypeInstance owner) { return this; } default Dumper dumpMethodDoc(MethodPrototype method) { return this; } default Dumper dumpFieldDoc(Field field, JavaTypeInstance owner) { return this; } diff --git a/src/org/benf/cfr/reader/util/output/StreamDumper.java b/src/org/benf/cfr/reader/util/output/StreamDumper.java index e249bb38f..e3b468f14 100644 --- a/src/org/benf/cfr/reader/util/output/StreamDumper.java +++ b/src/org/benf/cfr/reader/util/output/StreamDumper.java @@ -5,6 +5,7 @@ import org.benf.cfr.reader.bytecode.analysis.types.JavaRefTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.JavaTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.MethodPrototype; +import org.benf.cfr.reader.bytecode.analysis.variables.Ident; import org.benf.cfr.reader.bytecode.analysis.variables.NamedVariable; import org.benf.cfr.reader.entities.Field; import org.benf.cfr.reader.mapping.NullMapping; @@ -88,14 +89,14 @@ public Dumper methodName(String name, MethodPrototype method, boolean special, b } @Override - public Dumper parameterName(String name, Object ref, MethodPrototype method, int index, boolean defines) { + public Dumper parameterName(String name, Object ref, MethodPrototype method, int argPosition, int lvIndex, boolean defines) { identifier(name, ref, defines); return this; } @Override - public Dumper variableName(String name, NamedVariable variable, boolean defines) { - identifier(name, variable, defines); + public Dumper variableName(String name, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines) { + identifier(name, null, defines); return this; } diff --git a/src/org/benf/cfr/reader/util/output/ToStringDumper.java b/src/org/benf/cfr/reader/util/output/ToStringDumper.java index 887de731e..91cd3f0b1 100644 --- a/src/org/benf/cfr/reader/util/output/ToStringDumper.java +++ b/src/org/benf/cfr/reader/util/output/ToStringDumper.java @@ -3,6 +3,7 @@ import org.benf.cfr.reader.bytecode.analysis.types.JavaRefTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.JavaTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.MethodPrototype; +import org.benf.cfr.reader.bytecode.analysis.variables.Ident; import org.benf.cfr.reader.bytecode.analysis.variables.NamedVariable; import org.benf.cfr.reader.entities.Field; import org.benf.cfr.reader.entities.Method; @@ -64,13 +65,13 @@ public Dumper methodName(String name, MethodPrototype method, boolean special, b } @Override - public Dumper parameterName(String name, Object ref, MethodPrototype method, int index, boolean defines) { + public Dumper parameterName(String name, Object ref, MethodPrototype method, int argPosition, int lvIndex, boolean defines) { return identifier(name, ref, defines); } @Override - public Dumper variableName(String name, NamedVariable variable, boolean defines) { - return identifier(name, variable, defines); + public Dumper variableName(String name, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines) { + return identifier(name, null, defines); } @Override diff --git a/src/org/benf/cfr/reader/util/output/TokenStreamDumper.java b/src/org/benf/cfr/reader/util/output/TokenStreamDumper.java index 03d9bfb91..9b8e51d47 100644 --- a/src/org/benf/cfr/reader/util/output/TokenStreamDumper.java +++ b/src/org/benf/cfr/reader/util/output/TokenStreamDumper.java @@ -2,12 +2,9 @@ import org.benf.cfr.reader.api.OutputSinkFactory; import org.benf.cfr.reader.api.SinkReturns; -import org.benf.cfr.reader.bytecode.analysis.loc.HasByteCodeLoc; import org.benf.cfr.reader.bytecode.analysis.types.JavaRefTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.JavaTypeInstance; import org.benf.cfr.reader.bytecode.analysis.types.MethodPrototype; -import org.benf.cfr.reader.bytecode.analysis.variables.NamedVariable; -import org.benf.cfr.reader.entities.Field; import org.benf.cfr.reader.entities.Method; import org.benf.cfr.reader.mapping.NullMapping; import org.benf.cfr.reader.mapping.ObfuscationMapping; @@ -287,12 +284,12 @@ public Dumper methodName(String s, MethodPrototype method, boolean special, bool } @Override - public Dumper parameterName(String name, Object ref, MethodPrototype method, int index, boolean defines) { + public Dumper parameterName(String name, Object ref, MethodPrototype method, int argPosition, int lvIndex, boolean defines) { return identifier(name, ref, defines); } @Override - public Dumper variableName(String name, NamedVariable variable, boolean defines) { + public Dumper variableName(String name, int lvIndex, int lvtRowIndex, int startOpIndex, boolean defines) { return identifier(name, null, defines); }