docs: private File decompileType(final DecompilerSettings settings, final WindupMetadataSystem metadataSystem, final String typeName) throws IOException
      {
          log.fine("Decompiling " + typeName);
  
          final TypeReference type;
  
          // Hack to get around classes whose descriptors clash with primitive types.
          if (typeName.length() == 1)
          {
              final MetadataParser parser = new MetadataParser(IMetadataResolver.EMPTY);
              final TypeReference reference = parser.parseTypeDescriptor(typeName);
              type = metadataSystem.resolve(reference);
          }
          else
              type = metadataSystem.lookupType(typeName);
  
          if (type == null)
          {
              log.severe("Failed to load class: " + typeName);
              return null;
          }
  
          final TypeDefinition resolvedType = type.resolve();
          if (resolvedType == null)
          {
              log.severe("Failed to resolve type: " + typeName);
              return null;
          }
  
          boolean nested = resolvedType.isNested() || resolvedType.isAnonymous() || resolvedType.isSynthetic();
          if (!this.procyonConf.isIncludeNested() && nested)
              return null;
  
          settings.setJavaFormattingOptions(new JavaFormattingOptions());
  
          final FileOutputWriter writer = createFileWriter(resolvedType, settings);
          final PlainTextOutput output;
  
          output = new PlainTextOutput(writer);
          output.setUnicodeOutputEnabled(settings.isUnicodeOutputEnabled());
          if (settings.getLanguage() instanceof BytecodeLanguage)
              output.setIndentToken("  ");
  
          DecompilationOptions options = new DecompilationOptions();
          options.setSettings(settings); // I'm missing why these two classes are split.
  
          // --------- DECOMPILE ---------
          final TypeDecompilationResults results = settings.getLanguage().decompileType(resolvedType, output, options);
  
          writer.flush();
          writer.close();
  
          // If we're writing to a file and we were asked to include line numbers in any way,
          // then reformat the file to include that line number information.
          final List<LineNumberPosition> lineNumberPositions = results.getLineNumberPositions();
  
          if (!this.procyonConf.getLineNumberOptions().isEmpty())
          {
  
              final LineNumberFormatter lineFormatter = new LineNumberFormatter(writer.getFile(), lineNumberPositions,
                          this.procyonConf.getLineNumberOptions());
  
              lineFormatter.reformatFile();
          }
          return writer.getFile();
      }