@Override public boolean tryLoadType(final String internalName, final Buffer buffer) { for (final ITypeLoader typeLoader : _typeLoaders) { if (typeLoader.tryLoadType(internalName, buffer)) { return true; } buffer.reset(); } return false; } }
private TypeReference getMostOuterTypeRefBySlowLookuping(TypeReference typeRef) { String name = typeRef.getName(); if (name == null) return typeRef; String packageName = typeRef.getPackageName(); if (packageName == null) return typeRef; String[] nameParts = name.split("\\$"); String newName = ""; String sep = ""; for (int i = 0; i < nameParts.length - 1; i++) { newName = newName + sep + nameParts[i]; sep = "$"; String newInternalName = packageName.replaceAll("\\.", "/") + "/" + newName; TypeReference newTypeRef = metadataSystem.lookupType(newInternalName); if (newTypeRef != null) { TypeDefinition newTypeDef = newTypeRef.resolve(); if (newTypeDef != null) { return newTypeRef; } } } return typeRef; }
private FieldDefinition findFieldInType(TypeDefinition typeDef, String uniqueStr) { String[] linkParts = uniqueStr.split("\\|"); if (linkParts.length != 4) return null; String fieldName = linkParts[3]; if (fieldName.trim().length() <= 0) return null; List<FieldDefinition> declaredFields = typeDef.getDeclaredFields(); if (declaredFields == null) return null; boolean isFound = false; for (FieldDefinition declaredField : declaredFields) { isFound = (declaredField != null && fieldName.equals(declaredField.getName())); if (isFound) { if (declaredField.isSynthetic()) { return null; } else { return declaredField; } } } return null; }
private String createUniqueStrForReference(Object reference) { String uniqueStr = null; if (reference instanceof TypeReference) { TypeReference type = (TypeReference) reference; String pathAndTypeStr = getPathAndTypeStr(type); if (pathAndTypeStr != null) { uniqueStr = "type|" + pathAndTypeStr; } } else if (reference instanceof MethodReference) { MethodReference method = (MethodReference) reference; String pathAndTypeStr = getPathAndTypeStr(method.getDeclaringType()); if (pathAndTypeStr != null) { uniqueStr = "method|" + pathAndTypeStr + "|" + method.getName() + "|" + method.getErasedSignature(); } } else if (reference instanceof FieldReference) { FieldReference field = (FieldReference) reference; String pathAndTypeStr = getPathAndTypeStr(field.getDeclaringType()); if (pathAndTypeStr != null) { uniqueStr = "field|" + pathAndTypeStr + "|" + field.getName(); } } return uniqueStr; }
return null; String typeStr = linkParts[2]; TypeReference typeRef = metadataSystem.lookupType(typeStr.replaceAll("\\.", "/")); if (typeRef == null) return null; TypeDefinition typeDef = typeRef.resolve(); if (typeDef == null) return null; String desc = typeDef.getBriefDescription(); if (desc != null && desc.trim().length() > 0) { readableLink = desc; if (methodDef == null) return null; String desc = methodDef.getBriefDescription(); if (desc != null && desc.trim().length() > 0) { String constructorName = typeDef.getName(); TypeReference declaringTypeRef = typeRef.getDeclaringType(); if (declaringTypeRef != null) { TypeDefinition declaringTypeDef = declaringTypeRef.resolve(); if (declaringTypeDef != null) { String declaringTypeName = declaringTypeDef.getName(); if (declaringTypeName != null) { constructorName = StringUtilities.removeLeft(constructorName, declaringTypeName); if (fieldDef == null) return null;
DecompilerSettings settings = cloneSettings(); LuytenTypeLoader typeLoader = new LuytenTypeLoader(); MetadataSystem metadataSystem = new MetadataSystem(typeLoader); ITypeLoader jarLoader = new JarTypeLoader(jfile); typeLoader.getTypeLoaders().add(jarLoader); boolean isUnicodeEnabled = decompilationOptions.getSettings().isUnicodeOutputEnabled(); String internalName = StringUtilities.removeRight(entry.getName(), ".class"); TypeReference type = metadataSystem.lookupType(internalName); TypeDefinition resolvedType = null; if ((type == null) || ((resolvedType = type.resolve()) == null)) { throw new Exception("Unable to resolve type.");
private MethodDefinition findMethodInType(TypeDefinition typeDef, String uniqueStr) { String[] linkParts = uniqueStr.split("\\|"); if (linkParts.length != 5) return null; String methodName = linkParts[3]; String methodErasedSignature = linkParts[4]; if (methodName.trim().length() <= 0 || methodErasedSignature.trim().length() <= 0) return null; List<MethodDefinition> declaredMethods = typeDef.getDeclaredMethods(); if (declaredMethods == null) return null; boolean isFound = false; for (MethodDefinition declaredMethod : declaredMethods) { isFound = (declaredMethod != null && methodName.equals(declaredMethod.getName())); isFound = (isFound && methodErasedSignature.equals(declaredMethod.getErasedSignature())); if (isFound) { if (declaredMethod.isSynthetic() && !settings.getShowSyntheticMembers()) { return null; } else { return declaredMethod; } } } return null; }
if (typeStr.trim().length() <= 0) return false; TypeReference typeRef = metadataSystem.lookupType(typeStr.replaceAll("\\.", "/")); if (typeRef == null) return false; TypeDefinition typeDef = typeRef.resolve(); if (typeDef == null) return false; if (typeDef.isSynthetic()) return false;
@Override public void run() { if (uniqueStr == null) return; String[] linkParts = uniqueStr.split("\\|"); if (linkParts.length <= 1) return; String destinationTypeStr = linkParts[1]; try { bar.setVisible(true); getLabel().setText("Navigating: " + destinationTypeStr.replaceAll("/", ".")); TypeReference type = metadataSystem.lookupType(destinationTypeStr); if (type == null) throw new RuntimeException("Cannot lookup type: " + destinationTypeStr); TypeDefinition typeDef = type.resolve(); if (typeDef == null) throw new RuntimeException("Cannot resolve type: " + destinationTypeStr); String tabTitle = typeDef.getName() + ".class"; extractClassToTextPane(typeDef, tabTitle, destinationTypeStr, uniqueStr); getLabel().setText("Complete"); } catch (Exception e) { getLabel().setText("Cannot navigate: " + destinationTypeStr.replaceAll("/", ".")); Luyten.showExceptionDialog("Cannot Navigate!", e); } finally { bar.setVisible(false); } } }).start();
private void doSaveClassDecompiled(File inFile, File outFile) throws Exception { DecompilerSettings settings = cloneSettings(); LuytenTypeLoader typeLoader = new LuytenTypeLoader(); MetadataSystem metadataSystem = new MetadataSystem(typeLoader); TypeReference type = metadataSystem.lookupType(inFile.getCanonicalPath()); DecompilationOptions decompilationOptions = new DecompilationOptions(); decompilationOptions.setSettings(settings); decompilationOptions.setFullDecompilation(true); boolean isUnicodeEnabled = decompilationOptions.getSettings().isUnicodeOutputEnabled(); TypeDefinition resolvedType = null; if (type == null || ((resolvedType = type.resolve()) == null)) { throw new Exception("Unable to resolve type."); } StringWriter stringwriter = new StringWriter(); PlainTextOutput plainTextOutput = new PlainTextOutput(stringwriter); plainTextOutput.setUnicodeOutputEnabled(isUnicodeEnabled); settings.getLanguage().decompileType(resolvedType, plainTextOutput, decompilationOptions); String decompiledSource = stringwriter.toString(); System.out.println("[SaveAll]: " + inFile.getName() + " -> " + outFile.getName()); try (FileOutputStream fos = new FileOutputStream(outFile); OutputStreamWriter writer = isUnicodeEnabled ? new OutputStreamWriter(fos, "UTF-8") : new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(writer);) { bw.write(decompiledSource); bw.flush(); } }
private TypeReference getMostOuterTypeRef(TypeReference typeRef) { int maxDecraringDepth = typeRef.getFullName().split("(\\.|\\$)").length; for (int i = 0; i < maxDecraringDepth; i++) { TypeReference declaringTypeRef = typeRef.getDeclaringType(); if (declaringTypeRef == null) { break; } else { typeRef = declaringTypeRef; } } if (typeRef.getName().contains("$")) { return getMostOuterTypeRefBySlowLookuping(typeRef); } return typeRef; }
public void run() { try { Thread.sleep(500); String internalName = FindBox.class.getName(); TypeReference type = metadataSystem.lookupType(internalName); TypeDefinition resolvedType = null; if ((type == null) || ((resolvedType = type.resolve()) == null)) { return; } StringWriter stringwriter = new StringWriter(); PlainTextOutput plainTextOutput = new PlainTextOutput(stringwriter); plainTextOutput .setUnicodeOutputEnabled(decompilationOptions.getSettings().isUnicodeOutputEnabled()); settings.getLanguage().decompileType(resolvedType, plainTextOutput, decompilationOptions); String decompiledSource = stringwriter.toString(); OpenFile open = new OpenFile(internalName, "*/" + internalName, getTheme(), mainWindow); open.setContent(decompiledSource); JTabbedPane pane = new JTabbedPane(); pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); pane.addTab("title", open.scrollPane); pane.setSelectedIndex(pane.indexOfTab("title")); } catch (Exception e) { Luyten.showExceptionDialog("Exception!", e); } } }.start();
definitionToSelectionMap = new HashMap<>(); referenceToSelectionsMap = new HashMap<>(); currentTypeQualifiedName = type.getPackageName() + "." + type.getName(); final StringWriter stringwriter = new StringWriter(); PlainTextOutput plainTextOutput = new PlainTextOutput(stringwriter) {
if (state == null) { JarFile jfile = new JarFile(file); ITypeLoader jarLoader = new JarTypeLoader(jfile); getLabel().setText("Extracting: " + name); String internalName = StringUtilities.removeRight(entryName, ".class"); TypeReference type = metadataSystem.lookupType(internalName); extractClassToTextPane(type, name, path, null); } else { TypeReference type = metadataSystem.lookupType(path); extractClassToTextPane(type, name, path, null); } else {
if (sameTitledOpen != null && path.equals(sameTitledOpen.path) && type.equals(sameTitledOpen.getType()) && sameTitledOpen.isContentValid()) { sameTitledOpen.setInitialNavigationLink(navigatonLink); if (type == null || ((resolvedType = type.resolve()) == null)) { throw new Exception("Unable to resolve type.");
private String getPathAndTypeStr(TypeReference typeRef) { String name = typeRef.getName(); String packageStr = typeRef.getPackageName(); TypeReference mostOuterTypeRef = getMostOuterTypeRef(typeRef); String mostOuterTypeName = mostOuterTypeRef.getName(); if (name != null && packageStr != null && mostOuterTypeName != null && name.trim().length() > 0 && mostOuterTypeName.trim().length() > 0) { String pathStr = packageStr.replaceAll("\\.", "/") + "/" + mostOuterTypeName; String typeStr = packageStr + "." + name.replace(".", "$"); return pathStr + "|" + typeStr; } return null; }
ITypeLoader jarLoader = new JarTypeLoader(jfile); typeLoader.getTypeLoaders().add(jarLoader); state = new State(file.getCanonicalPath(), file, jfile, jarLoader);
if (entryName.toLowerCase().endsWith(".class")) { String internalName = StringUtilities.removeRight(entryName, ".class"); TypeReference type = Model.metadataSystem.lookupType(internalName); try { mainWindow.getModel().extractClassToTextPane(type, array[array.length - 1], entryName,
public void closeFile() { for (OpenFile co : hmap) { int pos = house.indexOfTab(co.name); if (pos >= 0) house.remove(pos); co.close(); } final State oldState = state; Model.this.state = null; if (oldState != null) { Closer.tryClose(oldState); } hmap.clear(); tree.setModel(new DefaultTreeModel(null)); metadataSystem = new MetadataSystem(typeLoader); file = null; treeExpansionState = null; open = false; mainWindow.onFileLoadEnded(file, open); }
if (reference instanceof FieldReference) { if (((FieldReference) reference).isDefinition()) { definitionToSelectionMap.put(uniqueStr, new Selection(from, to)); return;