From 19a77fbb472592e116f2f6654657eeec81d40b18 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 16 Mar 2019 09:45:42 +0200 Subject: Index lambda local variables to correct declaring method --- .../enigma/analysis/SourceIndexClassVisitor.java | 11 +++--- .../enigma/analysis/SourceIndexMethodVisitor.java | 10 ++++-- .../representation/ProcyonEntryFactory.java | 39 ---------------------- .../representation/entry/FieldDefEntry.java | 9 +++++ .../representation/entry/MethodDefEntry.java | 9 +++++ 5 files changed, 30 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/cuchaz/enigma/translation/representation/ProcyonEntryFactory.java (limited to 'src') diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java index a4fe9ee9..c9777030 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexClassVisitor.java @@ -17,18 +17,15 @@ import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.assembler.metadata.TypeReference; import com.strobel.decompiler.languages.TextLocation; import com.strobel.decompiler.languages.java.ast.*; -import cuchaz.enigma.translation.representation.ProcyonEntryFactory; import cuchaz.enigma.translation.representation.entry.ClassDefEntry; import cuchaz.enigma.translation.representation.entry.ClassEntry; import cuchaz.enigma.translation.representation.entry.FieldDefEntry; import cuchaz.enigma.translation.representation.entry.MethodDefEntry; public class SourceIndexClassVisitor extends SourceIndexVisitor { - private final ProcyonEntryFactory entryFactory; private ClassDefEntry classEntry; public SourceIndexClassVisitor(ClassDefEntry classEntry) { - this.entryFactory = new ProcyonEntryFactory(); this.classEntry = classEntry; } @@ -60,7 +57,7 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { @Override public Void visitMethodDeclaration(MethodDeclaration node, SourceIndex index) { MethodDefinition def = node.getUserData(Keys.METHOD_DEFINITION); - MethodDefEntry methodEntry = entryFactory.getMethodDefEntry(def); + MethodDefEntry methodEntry = MethodDefEntry.parse(def); AstNode tokenNode = node.getNameToken(); if (methodEntry.isConstructor() && methodEntry.getName().equals("")) { // for static initializers, check elsewhere for the token node @@ -73,7 +70,7 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { @Override public Void visitConstructorDeclaration(ConstructorDeclaration node, SourceIndex index) { MethodDefinition def = node.getUserData(Keys.METHOD_DEFINITION); - MethodDefEntry methodEntry = entryFactory.getMethodDefEntry(def); + MethodDefEntry methodEntry = MethodDefEntry.parse(def); index.addDeclaration(node.getNameToken(), methodEntry); return node.acceptVisitor(new SourceIndexMethodVisitor(methodEntry), index); } @@ -81,7 +78,7 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { @Override public Void visitFieldDeclaration(FieldDeclaration node, SourceIndex index) { FieldDefinition def = node.getUserData(Keys.FIELD_DEFINITION); - FieldDefEntry fieldEntry = entryFactory.getFieldDefEntry(def); + FieldDefEntry fieldEntry = FieldDefEntry.parse(def); assert (node.getVariables().size() == 1); VariableInitializer variable = node.getVariables().firstOrNullObject(); index.addDeclaration(variable.getNameToken(), fieldEntry); @@ -92,7 +89,7 @@ public class SourceIndexClassVisitor extends SourceIndexVisitor { public Void visitEnumValueDeclaration(EnumValueDeclaration node, SourceIndex index) { // treat enum declarations as field declarations FieldDefinition def = node.getUserData(Keys.FIELD_DEFINITION); - FieldDefEntry fieldEntry = entryFactory.getFieldDefEntry(def); + FieldDefEntry fieldEntry = FieldDefEntry.parse(def); index.addDeclaration(node.getNameToken(), fieldEntry); return recurse(node, index); } diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java index c4785b67..fde6edf9 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java @@ -101,8 +101,13 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { int parameterIndex = def.getSlot(); if (parameterIndex >= 0) { + MethodDefEntry ownerMethod = methodEntry; + if (def.getMethod() instanceof MethodDefinition) { + ownerMethod = MethodDefEntry.parse((MethodDefinition) def.getMethod()); + } + TypeDescriptor parameterType = TypeDescriptor.parse(def.getParameterType()); - LocalVariableDefEntry localVariableEntry = new LocalVariableDefEntry(methodEntry, parameterIndex, node.getName(), true, parameterType); + LocalVariableDefEntry localVariableEntry = new LocalVariableDefEntry(ownerMethod, parameterIndex, node.getName(), true, parameterType); Identifier identifier = node.getNameToken(); // cache the argument entry and the identifier identifierEntryCache.put(identifier.getName(), localVariableEntry); @@ -170,8 +175,9 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { if (originalVariable != null) { int variableIndex = originalVariable.getSlot(); if (variableIndex >= 0) { + MethodDefEntry ownerMethod = MethodDefEntry.parse(originalVariable.getDeclaringMethod()); TypeDescriptor variableType = TypeDescriptor.parse(originalVariable.getVariableType()); - LocalVariableDefEntry localVariableEntry = new LocalVariableDefEntry(methodEntry, variableIndex, initializer.getName(), false, variableType); + LocalVariableDefEntry localVariableEntry = new LocalVariableDefEntry(ownerMethod, variableIndex, initializer.getName(), false, variableType); identifierEntryCache.put(identifier.getName(), localVariableEntry); addDeclarationToUnmatched(identifier.getName(), index); index.addDeclaration(identifier, localVariableEntry); diff --git a/src/main/java/cuchaz/enigma/translation/representation/ProcyonEntryFactory.java b/src/main/java/cuchaz/enigma/translation/representation/ProcyonEntryFactory.java deleted file mode 100644 index a9ec5fac..00000000 --- a/src/main/java/cuchaz/enigma/translation/representation/ProcyonEntryFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Jeff Martin. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the GNU Lesser General Public - * License v3.0 which accompanies this distribution, and is available at - * http://www.gnu.org/licenses/lgpl.html - *

- * Contributors: - * Jeff Martin - initial API and implementation - ******************************************************************************/ - -package cuchaz.enigma.translation.representation; - -import com.strobel.assembler.metadata.FieldDefinition; -import com.strobel.assembler.metadata.MemberReference; -import com.strobel.assembler.metadata.MethodDefinition; -import cuchaz.enigma.translation.representation.entry.*; - -public class ProcyonEntryFactory { - public FieldEntry getFieldEntry(MemberReference def) { - ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); - return new FieldEntry(classEntry, def.getName(), new TypeDescriptor(def.getErasedSignature())); - } - - public FieldDefEntry getFieldDefEntry(FieldDefinition def) { - ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); - return new FieldDefEntry(classEntry, def.getName(), new TypeDescriptor(def.getErasedSignature()), Signature.createTypedSignature(def.getSignature()), new AccessFlags(def.getModifiers())); - } - - public MethodEntry getMethodEntry(MemberReference def) { - ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); - return new MethodEntry(classEntry, def.getName(), new MethodDescriptor(def.getErasedSignature())); - } - - public MethodDefEntry getMethodDefEntry(MethodDefinition def) { - ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName()); - return new MethodDefEntry(classEntry, def.getName(), new MethodDescriptor(def.getErasedSignature()), Signature.createSignature(def.getSignature()), new AccessFlags(def.getModifiers())); - } -} diff --git a/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java b/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java index 27033015..74176fda 100644 --- a/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java +++ b/src/main/java/cuchaz/enigma/translation/representation/entry/FieldDefEntry.java @@ -12,6 +12,7 @@ package cuchaz.enigma.translation.representation.entry; import com.google.common.base.Preconditions; +import com.strobel.assembler.metadata.FieldDefinition; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.representation.AccessFlags; @@ -36,6 +37,14 @@ public class FieldDefEntry extends FieldEntry implements DefEntry { return new FieldDefEntry(owner, name, new TypeDescriptor(desc), Signature.createTypedSignature(signature), new AccessFlags(access)); } + public static FieldDefEntry parse(FieldDefinition definition) { + ClassEntry owner = ClassEntry.parse(definition.getDeclaringType()); + TypeDescriptor descriptor = new TypeDescriptor(definition.getErasedSignature()); + Signature signature = Signature.createTypedSignature(definition.getSignature()); + AccessFlags access = new AccessFlags(definition.getModifiers()); + return new FieldDefEntry(owner, definition.getName(), descriptor, signature, access); + } + @Override public AccessFlags getAccess() { return access; diff --git a/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java b/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java index 51842443..bbcaf235 100644 --- a/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java +++ b/src/main/java/cuchaz/enigma/translation/representation/entry/MethodDefEntry.java @@ -12,6 +12,7 @@ package cuchaz.enigma.translation.representation.entry; import com.google.common.base.Preconditions; +import com.strobel.assembler.metadata.MethodDefinition; import cuchaz.enigma.translation.Translator; import cuchaz.enigma.translation.mapping.EntryMapping; import cuchaz.enigma.translation.representation.AccessFlags; @@ -36,6 +37,14 @@ public class MethodDefEntry extends MethodEntry implements DefEntry return new MethodDefEntry(owner, name, new MethodDescriptor(desc), Signature.createSignature(signature), new AccessFlags(access)); } + public static MethodDefEntry parse(MethodDefinition definition) { + ClassEntry classEntry = ClassEntry.parse(definition.getDeclaringType()); + MethodDescriptor descriptor = new MethodDescriptor(definition.getErasedSignature()); + Signature signature = Signature.createSignature(definition.getSignature()); + AccessFlags access = new AccessFlags(definition.getModifiers()); + return new MethodDefEntry(classEntry, definition.getName(), descriptor, signature, access); + } + @Override public AccessFlags getAccess() { return access; -- cgit v1.2.3