Full Code of MinecraftForge/FernFlower for AI

master 2f94710ea971 cached
593 files
2.7 MB
751.0k tokens
3383 symbols
1 requests
Download .txt
Showing preview only (3,006K chars total). Download the full file or copy to clipboard to get everything.
Repository: MinecraftForge/FernFlower
Branch: master
Commit: 2f94710ea971
Files: 593
Total size: 2.7 MB

Directory structure:
gitextract_u07x2ck1/

├── .editorconfig
├── .gitattributes
├── .gitignore
├── README.md
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── intellij.java.decompiler.engine.iml
├── resources/
│   └── META-INF/
│       └── MANIFEST.MF
├── src/
│   └── org/
│       └── jetbrains/
│           └── java/
│               └── decompiler/
│                   ├── ClassNameConstants.java
│                   ├── code/
│                   │   ├── CodeConstants.java
│                   │   ├── ExceptionHandler.java
│                   │   ├── ExceptionTable.java
│                   │   ├── FullInstructionSequence.java
│                   │   ├── Instruction.java
│                   │   ├── InstructionSequence.java
│                   │   ├── JumpInstruction.java
│                   │   ├── SimpleInstructionSequence.java
│                   │   ├── SwitchInstruction.java
│                   │   ├── cfg/
│                   │   │   ├── BasicBlock.java
│                   │   │   ├── ControlFlowGraph.java
│                   │   │   └── ExceptionRangeCFG.java
│                   │   └── interpreter/
│                   │       └── InstructionImpact.java
│                   ├── main/
│                   │   ├── AssertProcessor.java
│                   │   ├── CancellationManager.java
│                   │   ├── ClassReference14Processor.java
│                   │   ├── ClassWriter.java
│                   │   ├── ClassesProcessor.java
│                   │   ├── DecompilerContext.java
│                   │   ├── EnumProcessor.java
│                   │   ├── Fernflower.java
│                   │   ├── InitializerProcessor.java
│                   │   ├── collectors/
│                   │   │   ├── BytecodeMappingTracer.java
│                   │   │   ├── BytecodeSourceMapper.java
│                   │   │   ├── CounterContainer.java
│                   │   │   ├── ImportCollector.java
│                   │   │   └── VarNamesCollector.java
│                   │   ├── decompiler/
│                   │   │   ├── BaseDecompiler.java
│                   │   │   ├── ConsoleDecompiler.java
│                   │   │   └── PrintStreamLogger.java
│                   │   ├── extern/
│                   │   │   ├── ClassFormatException.java
│                   │   │   ├── IBytecodeProvider.java
│                   │   │   ├── IFernflowerLogger.java
│                   │   │   ├── IFernflowerPreferences.java
│                   │   │   ├── IIdentifierRenamer.java
│                   │   │   └── IResultSaver.java
│                   │   └── rels/
│                   │       ├── ClassWrapper.java
│                   │       ├── LambdaProcessor.java
│                   │       ├── MethodProcessorRunnable.java
│                   │       ├── MethodWrapper.java
│                   │       ├── NestedClassProcessor.java
│                   │       └── NestedMemberAccess.java
│                   ├── modules/
│                   │   ├── code/
│                   │   │   └── DeadCodeHelper.java
│                   │   ├── decompiler/
│                   │   │   ├── ClasspathHelper.java
│                   │   │   ├── ClearStructHelper.java
│                   │   │   ├── ConcatenationHelper.java
│                   │   │   ├── DecHelper.java
│                   │   │   ├── DomHelper.java
│                   │   │   ├── ExitHelper.java
│                   │   │   ├── ExprProcessor.java
│                   │   │   ├── ExpressionStack.java
│                   │   │   ├── FinallyProcessor.java
│                   │   │   ├── IdeaNotNullHelper.java
│                   │   │   ├── IfHelper.java
│                   │   │   ├── InlineSingleBlockHelper.java
│                   │   │   ├── LabelHelper.java
│                   │   │   ├── LoopExtractHelper.java
│                   │   │   ├── MergeHelper.java
│                   │   │   ├── PPandMMHelper.java
│                   │   │   ├── PatternHelper.java
│                   │   │   ├── PrimitiveExpressionList.java
│                   │   │   ├── SecondaryFunctionsHelper.java
│                   │   │   ├── SequenceHelper.java
│                   │   │   ├── SimplifyExprentsHelper.java
│                   │   │   ├── StackVarsProcessor.java
│                   │   │   ├── StatEdge.java
│                   │   │   ├── StrongConnectivityHelper.java
│                   │   │   ├── SwitchHelper.java
│                   │   │   ├── SwitchPatternHelper.java
│                   │   │   ├── decompose/
│                   │   │   │   ├── DominatorEngine.java
│                   │   │   │   ├── DominatorTreeExceptionFilter.java
│                   │   │   │   ├── FastExtendedPostdominanceHelper.java
│                   │   │   │   ├── GenericDominatorEngine.java
│                   │   │   │   ├── IGraph.java
│                   │   │   │   └── IGraphNode.java
│                   │   │   ├── deobfuscator/
│                   │   │   │   ├── ExceptionDeobfuscator.java
│                   │   │   │   └── IrreducibleCFGDeobfuscator.java
│                   │   │   ├── exps/
│                   │   │   │   ├── AnnotationExprent.java
│                   │   │   │   ├── ArrayExprent.java
│                   │   │   │   ├── AssertExprent.java
│                   │   │   │   ├── AssignmentExprent.java
│                   │   │   │   ├── ConstExprent.java
│                   │   │   │   ├── ExitExprent.java
│                   │   │   │   ├── ExprUtil.java
│                   │   │   │   ├── Exprent.java
│                   │   │   │   ├── FieldExprent.java
│                   │   │   │   ├── FunctionExprent.java
│                   │   │   │   ├── IfExprent.java
│                   │   │   │   ├── InvocationExprent.java
│                   │   │   │   ├── MonitorExprent.java
│                   │   │   │   ├── NewExprent.java
│                   │   │   │   ├── RecordVarExprent.java
│                   │   │   │   ├── SwitchExprent.java
│                   │   │   │   └── VarExprent.java
│                   │   │   ├── sforms/
│                   │   │   │   ├── DirectGraph.java
│                   │   │   │   ├── DirectNode.java
│                   │   │   │   ├── FlattenStatementsHelper.java
│                   │   │   │   ├── SSAConstructorSparseEx.java
│                   │   │   │   └── SSAUConstructorSparseEx.java
│                   │   │   ├── stats/
│                   │   │   │   ├── BasicBlockStatement.java
│                   │   │   │   ├── CatchAllStatement.java
│                   │   │   │   ├── CatchStatement.java
│                   │   │   │   ├── DoStatement.java
│                   │   │   │   ├── DummyExitStatement.java
│                   │   │   │   ├── GeneralStatement.java
│                   │   │   │   ├── IfStatement.java
│                   │   │   │   ├── RootStatement.java
│                   │   │   │   ├── SequenceStatement.java
│                   │   │   │   ├── Statement.java
│                   │   │   │   ├── Statements.java
│                   │   │   │   ├── SwitchStatement.java
│                   │   │   │   └── SynchronizedStatement.java
│                   │   │   ├── typeann/
│                   │   │   │   ├── TargetInfo.java
│                   │   │   │   ├── TypeAnnotation.java
│                   │   │   │   └── TypeAnnotationWriteHelper.java
│                   │   │   └── vars/
│                   │   │       ├── CheckTypesResult.java
│                   │   │       ├── VarDefinitionHelper.java
│                   │   │       ├── VarProcessor.java
│                   │   │       ├── VarTypeProcessor.java
│                   │   │       ├── VarVersionEdge.java
│                   │   │       ├── VarVersionNode.java
│                   │   │       ├── VarVersionPair.java
│                   │   │       ├── VarVersionsGraph.java
│                   │   │       └── VarVersionsProcessor.java
│                   │   └── renamer/
│                   │       ├── ClassWrapperNode.java
│                   │       ├── ConverterHelper.java
│                   │       ├── IdentifierConverter.java
│                   │       └── PoolInterceptor.java
│                   ├── struct/
│                   │   ├── ContextUnit.java
│                   │   ├── IDecompiledData.java
│                   │   ├── StructClass.java
│                   │   ├── StructContext.java
│                   │   ├── StructField.java
│                   │   ├── StructMember.java
│                   │   ├── StructMethod.java
│                   │   ├── StructRecordComponent.java
│                   │   ├── StructTypePathEntry.java
│                   │   ├── attr/
│                   │   │   ├── StructAnnDefaultAttribute.java
│                   │   │   ├── StructAnnotationAttribute.java
│                   │   │   ├── StructAnnotationParameterAttribute.java
│                   │   │   ├── StructBootstrapMethodsAttribute.java
│                   │   │   ├── StructCodeAttribute.java
│                   │   │   ├── StructConstantValueAttribute.java
│                   │   │   ├── StructEnclosingMethodAttribute.java
│                   │   │   ├── StructExceptionsAttribute.java
│                   │   │   ├── StructGeneralAttribute.java
│                   │   │   ├── StructGenericSignatureAttribute.java
│                   │   │   ├── StructInnerClassesAttribute.java
│                   │   │   ├── StructLineNumberTableAttribute.java
│                   │   │   ├── StructLocalVariableTableAttribute.java
│                   │   │   ├── StructLocalVariableTypeTableAttribute.java
│                   │   │   ├── StructMethodParametersAttribute.java
│                   │   │   ├── StructModuleAttribute.java
│                   │   │   ├── StructPermittedSubclassesAttribute.java
│                   │   │   ├── StructRecordAttribute.java
│                   │   │   └── StructTypeAnnotationAttribute.java
│                   │   ├── consts/
│                   │   │   ├── ConstantPool.java
│                   │   │   ├── LinkConstant.java
│                   │   │   ├── PooledConstant.java
│                   │   │   └── PrimitiveConstant.java
│                   │   ├── gen/
│                   │   │   ├── DataPoint.java
│                   │   │   ├── FieldDescriptor.java
│                   │   │   ├── MethodDescriptor.java
│                   │   │   ├── NewClassNameBuilder.java
│                   │   │   ├── Type.java
│                   │   │   ├── VarType.java
│                   │   │   └── generics/
│                   │   │       ├── GenericClassDescriptor.java
│                   │   │       ├── GenericFieldDescriptor.java
│                   │   │       ├── GenericMain.java
│                   │   │       ├── GenericMethodDescriptor.java
│                   │   │       └── GenericType.java
│                   │   ├── lazy/
│                   │   │   └── LazyLoader.java
│                   │   └── match/
│                   │       ├── IMatchable.java
│                   │       ├── MatchEngine.java
│                   │       └── MatchNode.java
│                   └── util/
│                       ├── DataInputFullStream.java
│                       ├── FastFixedSetFactory.java
│                       ├── FastSparseSetFactory.java
│                       ├── InterpreterUtil.java
│                       ├── ListStack.java
│                       ├── SFormsFastMapDirect.java
│                       ├── TextBuffer.java
│                       ├── TextUtil.java
│                       └── VBStyleCollection.java
├── test/
│   └── org/
│       └── jetbrains/
│           └── java/
│               └── decompiler/
│                   ├── BulkDecompilationTest.java
│                   ├── CancellableTest.java
│                   ├── ConverterHelperTest.java
│                   ├── DecompilerTestFixture.java
│                   └── SingleClassesTest.java
└── testData/
    ├── bulk/
    │   ├── META-INF/
    │   │   └── MANIFEST.MF
    │   └── pkg/
    │       ├── Main.java
    │       └── res/
    │           ├── Loader.java
    │           └── resource.txt
    ├── bulk.jar
    ├── classes/
    │   └── pkg/
    │       └── PrivateClasses.java
    ├── kt25937/
    │   ├── META-INF/
    │   │   └── MANIFEST.MF
    │   └── kt/
    │       ├── Kt25937Kt.java
    │       └── Kt25937_1Kt.java
    ├── kt25937.jar
    ├── obfuscated/
    │   ├── a.java
    │   ├── a0.java
    │   ├── a1.java
    │   ├── a2.java
    │   ├── a3.java
    │   ├── a4.java
    │   ├── a5.java
    │   ├── a6.java
    │   ├── a7.java
    │   ├── a8.java
    │   ├── a9.java
    │   ├── a_.java
    │   ├── aa.java
    │   ├── ab.java
    │   ├── ac.java
    │   ├── ad.java
    │   ├── ae.java
    │   ├── af.java
    │   ├── ag.java
    │   ├── ah.java
    │   ├── ai.java
    │   ├── aj.java
    │   ├── ak.java
    │   ├── al.java
    │   ├── am.java
    │   ├── an.java
    │   ├── ao.java
    │   ├── ap.java
    │   ├── aq.java
    │   ├── ar.java
    │   ├── as.java
    │   ├── at.java
    │   ├── au.java
    │   ├── av.java
    │   ├── aw.java
    │   ├── ax.java
    │   ├── ay.java
    │   ├── az.java
    │   ├── b.java
    │   ├── ba.java
    │   ├── bb.java
    │   ├── bc.java
    │   ├── bd.java
    │   ├── c.java
    │   ├── d.java
    │   ├── e.java
    │   ├── f.java
    │   ├── g.java
    │   ├── h.java
    │   ├── i.java
    │   ├── j.java
    │   ├── k.java
    │   ├── l.java
    │   ├── m.java
    │   ├── n.java
    │   ├── o.java
    │   ├── okhttp3/
    │   │   └── internal/
    │   │       └── connection/
    │   │           └── e.java
    │   ├── p.java
    │   ├── q.java
    │   ├── r.java
    │   ├── s.java
    │   ├── u.java
    │   ├── v.java
    │   ├── w.java
    │   ├── x.java
    │   ├── y.java
    │   └── z.java
    ├── obfuscated.jar
    ├── results/
    │   ├── ArrayNestedTypeAnnotations.dec
    │   ├── ArrayTypeAnnotations.dec
    │   ├── ClassNonSealed.dec
    │   ├── ClassNonSealedExtendsImplements.dec
    │   ├── ClassSuperTypeAnnotations.dec
    │   ├── EnumWithOverride.dec
    │   ├── GenericArrayNestedTypeAnnotations.dec
    │   ├── GenericArrayTypeAnnotations.dec
    │   ├── GenericNestedTypeAnnotations.dec
    │   ├── GenericTypeAnnotations.dec
    │   ├── Integer.dec
    │   ├── InterfaceNonSealed.dec
    │   ├── InterfaceSuperTypeAnnotations.dec
    │   ├── InvalidMethodSignature.dec
    │   ├── MemberDeclarationTypeAnnotations.dec
    │   ├── MoreAnnotations.dec
    │   ├── NestedType.dec
    │   ├── NestedTypeAnnotations.dec
    │   ├── PrivateClasses.dec
    │   ├── RootWithClassInner.dec
    │   ├── RootWithClassOuter.dec
    │   ├── RootWithInterfaceInner.dec
    │   ├── RootWithInterfaceInnerAndOuter.dec
    │   ├── RootWithInterfaceOuter.dec
    │   ├── RootWithModule.dec
    │   ├── SwitchOnStatic.dec
    │   ├── TestAbstractMethods.dec
    │   ├── TestAccessReplace.dec
    │   ├── TestAmbiguousCall.dec
    │   ├── TestAmbiguousCallWithDebugInfo.dec
    │   ├── TestAnonymousClass.dec
    │   ├── TestAnonymousClassConstructor.dec
    │   ├── TestAnonymousParamNames.dec
    │   ├── TestAnonymousParams.dec
    │   ├── TestAnonymousSignature.dec
    │   ├── TestAsserts.dec
    │   ├── TestClashName.dec
    │   ├── TestClassCast.dec
    │   ├── TestClassFields.dec
    │   ├── TestClassLambda.dec
    │   ├── TestClassLoop.dec
    │   ├── TestClassNestedInitializer.dec
    │   ├── TestClassSimpleBytecodeMapping.dec
    │   ├── TestClassSwitch.dec
    │   ├── TestClassTypes.dec
    │   ├── TestClassVar.dec
    │   ├── TestCodeConstructs.dec
    │   ├── TestComplexInstanceOfRecordPatternJavac.dec
    │   ├── TestConstType.dec
    │   ├── TestConstants.dec
    │   ├── TestConstantsAsIs.dec
    │   ├── TestConstructorReference.dec
    │   ├── TestDebugSymbols.dec
    │   ├── TestDeprecations.dec
    │   ├── TestDynamicConstantPoolEntry.dec
    │   ├── TestEmptyBlocks.dec
    │   ├── TestEnum.dec
    │   ├── TestExtendingSubclass.dec
    │   ├── TestExtendsList.dec
    │   ├── TestFieldSingleAccess.dec
    │   ├── TestGenericArgs.dec
    │   ├── TestGroovyClass.dec
    │   ├── TestGroovyTrait.dec
    │   ├── TestIffSimplification.dec
    │   ├── TestIllegalVarName.dec
    │   ├── TestInUse.dec
    │   ├── TestInheritanceChainCycle.dec
    │   ├── TestInner2.dec
    │   ├── TestInnerClassConstructor.dec
    │   ├── TestInnerLocal.dec
    │   ├── TestInnerSignature.dec
    │   ├── TestInstanceofPatternNotSupported.dec
    │   ├── TestInstanceofWithPattern.dec
    │   ├── TestIntVarMerge.dec
    │   ├── TestInterfaceFields.dec
    │   ├── TestInterfaceMethods.dec
    │   ├── TestInterfaceSuper.dec
    │   ├── TestInvertedFloatComparison.dec
    │   ├── TestJava11StringConcat.dec
    │   ├── TestJava11StringConcatEmptyAffix.dec
    │   ├── TestJava11StringConcatSpecialChars.dec
    │   ├── TestJava9PrivateInterfaceMethod.dec
    │   ├── TestJava9StringConcat.dec
    │   ├── TestKotlinConstructorKt.dec
    │   ├── TestLambdaParams.dec
    │   ├── TestLocalClass.dec
    │   ├── TestLocalsNames.dec
    │   ├── TestLocalsSignature.dec
    │   ├── TestMemberAnnotations.dec
    │   ├── TestMethodParameters.dec
    │   ├── TestMethodParametersAttr.dec
    │   ├── TestMethodReferenceLetterClass.dec
    │   ├── TestMethodReferenceSameName.dec
    │   ├── TestMissingConstructorCallBad.dec
    │   ├── TestMissingConstructorCallGood.dec
    │   ├── TestNamedSuspendFun2Kt.dec
    │   ├── TestParameterizedTypes.dec
    │   ├── TestPop2OneDoublePop2.dec
    │   ├── TestPop2OneLongPop2.dec
    │   ├── TestPop2TwoIntPop2.dec
    │   ├── TestPop2TwoIntTwoPop.dec
    │   ├── TestPrimitiveNarrowing.dec
    │   ├── TestPrimitives.dec
    │   ├── TestPrivateEmptyConstructor.dec
    │   ├── TestRecordAnno.dec
    │   ├── TestRecordEmpty.dec
    │   ├── TestRecordGenericVararg.dec
    │   ├── TestRecordSimple.dec
    │   ├── TestRecordVararg.dec
    │   ├── TestShadowing.dec
    │   ├── TestSimpleInstanceOfRecordPatternJavac.dec
    │   ├── TestStaticNameClash.dec
    │   ├── TestStringConcat.dec
    │   ├── TestStringLiterals.dec
    │   ├── TestSuperInner.dec
    │   ├── TestSuspendLambdaKt.dec
    │   ├── TestSwitchClassReferencesEcj.dec
    │   ├── TestSwitchClassReferencesFastExitEcj.dec
    │   ├── TestSwitchClassReferencesFastExitJavac.dec
    │   ├── TestSwitchClassReferencesJavac.dec
    │   ├── TestSwitchGuarded2Javac.dec
    │   ├── TestSwitchGuardedEcj.dec
    │   ├── TestSwitchGuardedJavac.dec
    │   ├── TestSwitchNestedDeconstructionsJavac.dec
    │   ├── TestSwitchOnEnum.dec
    │   ├── TestSwitchOnEnumEclipse.dec
    │   ├── TestSwitchOnStringsEcj.dec
    │   ├── TestSwitchOnStringsJavac.dec
    │   ├── TestSwitchRules.dec
    │   ├── TestSwitchSimpleReferencesJavac.dec
    │   ├── TestSwitchWithDeconstructionsWithoutNestedJavac.dec
    │   ├── TestSynchronizedMapping.dec
    │   ├── TestSynchronizedUnprotected.dec
    │   ├── TestSyntheticAccess.dec
    │   ├── TestThrowException.dec
    │   ├── TestTryCatchFinally.dec
    │   ├── TestTryCatchFinallyJsrRet.dec
    │   ├── TestUnionType.dec
    │   ├── TestUnsupportedConstantPoolEntry.dec
    │   ├── TestVarArgCalls.dec
    │   ├── TryToPreserveCast.dec
    │   ├── module-info.dec
    │   └── package-info.dec
    └── src/
        ├── ext/
        │   ├── PkgAnno.java
        │   ├── Shadow.java
        │   ├── TestClashNameIface.java
        │   └── TestClashNameParent.java
        ├── java11/
        │   ├── TestDynamicConstantPoolEntry.jcoder
        │   ├── TestJava11StringConcat.java
        │   ├── TestJava11StringConcatEmptyAffix.java
        │   ├── TestJava11StringConcatSpecialChars.java
        │   └── TestUnsupportedConstantPoolEntry.jcoder
        ├── java9/
        │   ├── TestJava9PrivateInterfaceMethod.java
        │   ├── TestJava9StringConcat.java
        │   └── sample.module/
        │       ├── TestClass.java
        │       ├── TestModuleAnno.java
        │       ├── TestService.java
        │       ├── TestServiceImpl.java
        │       └── module-info.java
        ├── patterns/
        │   ├── TestInstanceofPatternNotSupported.java
        │   └── TestInstanceofWithPattern.java
        ├── pkg/
        │   ├── MoreAnnotations.java
        │   ├── NestedType.java
        │   ├── Shadow.java
        │   ├── SwitchOnStatic.java
        │   ├── TestAbstractMethods.java
        │   ├── TestAccessReplace.java
        │   ├── TestAmbiguousCall.java
        │   ├── TestAnonymousClass.java
        │   ├── TestAnonymousClassConstructor.java
        │   ├── TestAnonymousParamNames.java
        │   ├── TestAnonymousParams.java
        │   ├── TestAnonymousSignature.java
        │   ├── TestAsserts.java
        │   ├── TestClashName.java
        │   ├── TestClassCast.java
        │   ├── TestClassFields.java
        │   ├── TestClassLambda.java
        │   ├── TestClassLoop.java
        │   ├── TestClassNestedInitializer.java
        │   ├── TestClassSimpleBytecodeMapping.java
        │   ├── TestClassSwitch.java
        │   ├── TestClassTypes.java
        │   ├── TestClassVar.java
        │   ├── TestCodeConstructs.java
        │   ├── TestComplexInstanceOfRecordPatternJavac.java
        │   ├── TestConstType.java
        │   ├── TestConstants.java
        │   ├── TestConstantsAsIs.java
        │   ├── TestConstructorReference.java
        │   ├── TestDebugSymbols.java
        │   ├── TestDeprecations.java
        │   ├── TestEmptyBlocks.java
        │   ├── TestEnum.java
        │   ├── TestExtendingSubclass.java
        │   ├── TestExtendsList.java
        │   ├── TestFieldSingleAccess.jasm
        │   ├── TestGenericArgs.java
        │   ├── TestGroovyClass.groovy
        │   ├── TestGroovyTrait.groovy
        │   ├── TestIffSimplification.java
        │   ├── TestIllegalVarName.kt
        │   ├── TestInUse.java
        │   ├── TestInheritanceChainCycle.jasm
        │   ├── TestInner2.java
        │   ├── TestInnerClassConstructor.java
        │   ├── TestInnerLocal.java
        │   ├── TestInnerSignature.java
        │   ├── TestIntVarMerge.java
        │   ├── TestInterfaceFields.java
        │   ├── TestInterfaceMethods.java
        │   ├── TestInterfaceSuper.java
        │   ├── TestInvertedFloatComparison.java
        │   ├── TestKotlinConstructor.kt
        │   ├── TestLambdaParams.java
        │   ├── TestLocalClass.java
        │   ├── TestLocalsNames.java
        │   ├── TestLocalsSignature.java
        │   ├── TestMemberAnnotations.java
        │   ├── TestMethodParameters.java
        │   ├── TestMethodParametersAttr.java
        │   ├── TestMethodReferenceLetterClass.java
        │   ├── TestMethodReferenceSameName.java
        │   ├── TestMissingConstructorCallBad.jasm
        │   ├── TestMissingConstructorCallGood.jasm
        │   ├── TestNamedSuspendFun2.kt
        │   ├── TestParameterizedTypes.java
        │   ├── TestPop2OneDoublePop2.jasm
        │   ├── TestPop2OneLongPop2.jasm
        │   ├── TestPop2TwoIntPop2.jasm
        │   ├── TestPop2TwoIntTwoPop.jasm
        │   ├── TestPrimitiveNarrowing.java
        │   ├── TestPrimitives.java
        │   ├── TestPrivateEmptyConstructor.java
        │   ├── TestShadowing.java
        │   ├── TestSimpleInstanceOfRecordPatternJavac.java
        │   ├── TestStaticNameClash.java
        │   ├── TestStringConcat.java
        │   ├── TestStringLiterals.java
        │   ├── TestSuperInner.java
        │   ├── TestSuperInnerBase.java
        │   ├── TestSuspendLambda.kt
        │   ├── TestSwitchClassReferencesEcj.java
        │   ├── TestSwitchClassReferencesFastExitEcj.java
        │   ├── TestSwitchClassReferencesFastExitJavac.java
        │   ├── TestSwitchClassReferencesJavac.java
        │   ├── TestSwitchGuarded2Javac.java
        │   ├── TestSwitchGuardedEcj.java
        │   ├── TestSwitchGuardedJavac.java
        │   ├── TestSwitchNestedDeconstructionsJavac.java
        │   ├── TestSwitchOnEnum.java
        │   ├── TestSwitchOnEnumEclipse.java
        │   ├── TestSwitchOnStringsEcj.java
        │   ├── TestSwitchOnStringsJavac.java
        │   ├── TestSwitchRules.java
        │   ├── TestSwitchSimpleReferencesJavac.java
        │   ├── TestSwitchWithDeconstructionsWithoutNestedJavac.java
        │   ├── TestSynchronizedMapping.java
        │   ├── TestSynchronizedUnprotected.kt
        │   ├── TestSyntheticAccess.java
        │   ├── TestThrowException.java
        │   ├── TestTryCatchFinally.java
        │   ├── TestTryCatchFinallyJsrRet.java
        │   ├── TestUnionType.java
        │   ├── TestVarArgCalls.java
        │   ├── TryToPreserveCast.java
        │   ├── TypeAnnotations.java
        │   └── package-info.java
        ├── records/
        │   ├── TestRecordAnno.java
        │   ├── TestRecordEmpty.java
        │   ├── TestRecordGenericVararg.java
        │   ├── TestRecordSimple.java
        │   └── TestRecordVararg.java
        ├── sealed/
        │   ├── ClassExtends.java
        │   ├── ClassImplements.java
        │   ├── ClassNonSealed.java
        │   ├── ClassNonSealedExtendsImplements.java
        │   ├── EnumWithOverride.java
        │   ├── InterfaceNonSealed.java
        │   ├── RootWithClassInner.java
        │   ├── RootWithClassOuter.java
        │   ├── RootWithInterfaceInner.java
        │   ├── RootWithInterfaceInnerAndOuter.java
        │   ├── RootWithInterfaceOuter.java
        │   ├── bar/
        │   │   └── BarClassExtends.java
        │   └── foo/
        │       └── RootWithModule.java
        └── typeAnnotations/
            ├── A.java
            ├── ArrayNestedTypeAnnotations.java
            ├── ArrayTypeAnnotations.java
            ├── B.java
            ├── Bar.java
            ├── BarGeneric.java
            ├── C.java
            ├── ClassSuperTypeAnnotations.java
            ├── D.java
            ├── E.java
            ├── F.java
            ├── Foo.java
            ├── GenericArrayNestedTypeAnnotations.java
            ├── GenericArrayTypeAnnotations.java
            ├── GenericNestedTypeAnnotations.java
            ├── GenericTypeAnnotations.java
            ├── InterfaceSuperTypeAnnotations.java
            ├── K.java
            ├── L.java
            ├── MemberDeclarationTypeAnnotations.java
            ├── NestedTypeAnnotations.java
            ├── P.java
            ├── ParentInterface.java
            ├── S.java
            ├── SomeFunInterface.java
            ├── T.java
            ├── V.java
            └── Z.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
[*]
charset=utf-8
end_of_line=lf
insert_final_newline=false
indent_style=space
indent_size=2


================================================
FILE: .gitattributes
================================================
*.dec	text


================================================
FILE: .gitignore
================================================
/.idea/
/.gradle/
/build/
/out/

================================================
FILE: README.md
================================================
### About Fernflower

Fernflower is the first actually working analytical decompiler for Java and 
probably for a high-level programming language in general. Naturally it is still 
under development, please send your bug reports and improvement suggestions to the
[issue tracker](https://youtrack.jetbrains.com/newIssue?project=IDEA&clearDraft=true&c=Subsystem+Decompiler).

### Licence

Fernflower is licenced under the [Apache Licence Version 2.0](http://www.apache.org/licenses/LICENSE-2.0).

### Running from command line

`java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>`

\* means 0 or more times\
\+ means 1 or more times

\<source>: file or directory with files to be decompiled. Directories are recursively scanned. Allowed file extensions are class, zip and jar.
          Sources prefixed with -e= mean "library" files that won't be decompiled, but taken into account when analysing relationships between 
          classes or methods. Especially renaming of identifiers (s. option 'ren') can benefit from information about external classes.          

\<destination>: destination directory 

\<option>, \<value>: a command-line option with the corresponding value (see "Command-line options" below).

##### Examples:

`java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\`

`java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\`

### Command-line options

With the exception of mpm and urc the value of 1 means the option is activated, 0 - deactivated. Default 
value, if any, is given between parentheses.

Typically, the following options will be changed by user, if any: hes, hdc, dgs, mpm, ren, urc 
The rest of options can be left as they are: they are aimed at professional reverse engineers.

- rbr (1): hide bridge methods
- rsy (0): hide synthetic class members
- din (1): decompile inner classes
- dc4 (1): collapse 1.4 class references
- das (1): decompile assertions
- hes (1): hide empty super invocation
- hdc (1): hide empty default constructor
- dgs (0): decompile generic signatures
- ner (1): assume return not throwing exceptions
- den (1): decompile enumerations
- rgn (1): remove getClass() invocation, when it is part of a qualified new statement
- lit (0): output numeric literals "as-is"
- asc (0): encode non-ASCII characters in string and character literals as Unicode escapes
- bto (1): interpret int 1 as boolean true (workaround to a compiler bug)
- nns (0): allow for not set synthetic attribute (workaround to a compiler bug)
- uto (1): consider nameless types as java.lang.Object (workaround to a compiler architecture flaw)
- udv (1): reconstruct variable names from debug information, if present
- ump (1): reconstruct parameter names from corresponding attributes, if present
- rer (1): remove empty exception ranges
- fdi (1): de-inline finally structures
- mpm (0): maximum allowed processing time per decompiled method, in seconds. 0 means no upper limit
- ren (0): rename ambiguous (resp. obfuscated) classes and class elements
- urc (-): full name of a user-supplied class implementing IIdentifierRenamer interface. It is used to determine which class identifiers
           should be renamed and provides new identifier names (see "Renaming identifiers")
- inn (1): check for IntelliJ IDEA-specific @NotNull annotation and remove inserted code if found
- lac (0): decompile lambda expressions to anonymous classes
- nls (0): define new line character to be used for output. 0 - '\r\n' (Windows), 1 - '\n' (Unix), default is OS-dependent
- ind: indentation string (default is 3 spaces)
- crp (0): use record patterns where it is possible
- cps (0): use switch with patterns where it is possible 
- log (INFO): a logging level, possible values are TRACE, INFO, WARN, ERROR

### Renaming identifiers

Some obfuscators give classes and their member elements short, meaningless and above all ambiguous names. Recompiling of such
code leads to a great number of conflicts. Therefore it is advisable to let the decompiler rename elements in its turn, 
ensuring uniqueness of each identifier.

Option 'ren' (i.e. -ren=1) activates renaming functionality. Default renaming strategy goes as follows:
- rename an element if its name is a reserved word or is shorter than 3 characters
- new names are built according to a simple pattern: (class|method|field)_\<consecutive unique number>  
You can overwrite this rules by providing your own implementation of the 4 key methods invoked by the decompiler while renaming. Simply 
pass a class that implements org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer in the option 'urc'
(e.g. -urc=com.example.MyRenamer) to Fernflower. The class must be available on the application classpath.

The meaning of each method should be clear from naming: toBeRenamed determine whether the element will be renamed, while the other three
provide new names for classes, methods and fields respectively.  


================================================
FILE: build.gradle
================================================
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
apply plugin: 'java'

compileJava {
  sourceCompatibility '17'
  targetCompatibility '17'
}

sourceSets {
  main.java.srcDirs 'src'
  test.java.srcDirs 'test'
}

repositories { mavenCentral() }
dependencies {
  implementation 'org.jetbrains:annotations:20.1.0'
  testImplementation 'junit:junit:4.12'
  testImplementation 'org.assertj:assertj-core:3.23.1'
}

jar {
  archiveFileName = 'fernflower.jar'
  manifest {
    attributes 'Main-Class': 'org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler'
  }
}


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: gradlew
================================================
#!/bin/sh

#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
#
#   Gradle start up script for POSIX generated by Gradle.
#
#   Important for running:
#
#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
#       noncompliant, but you have some other compliant shell such as ksh or
#       bash, then to run this script, type that shell name before the whole
#       command line, like:
#
#           ksh Gradle
#
#       Busybox and similar reduced shells will NOT work, because this script
#       requires all of these POSIX shell features:
#         * functions;
#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
#         * compound commands having a testable exit status, especially «case»;
#         * various built-in commands including «command», «set», and «ulimit».
#
#   Important for patching:
#
#   (2) This script targets any POSIX shell, so it avoids extensions provided
#       by Bash, Ksh, etc; in particular arrays are avoided.
#
#       The "traditional" practice of packing multiple parameters into a
#       space-separated string is a well documented source of bugs and security
#       problems, so this is (mostly) avoided, by progressively accumulating
#       options in "$@", and eventually passing that to Java.
#
#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
#       see the in-line comments for details.
#
#       There are tweaks for specific operating systems such as AIX, CygWin,
#       Darwin, MinGW, and NonStop.
#
#   (3) This script is generated from the Groovy template
#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
#       within the Gradle project.
#
#       You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################

# Attempt to set APP_HOME

# Resolve links: $0 may be a link
app_path=$0

# Need this for daisy-chained symlinks.
while
    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
    [ -h "$app_path" ]
do
    ls=$( ls -ld "$app_path" )
    link=${ls#*' -> '}
    case $link in             #(
      /*)   app_path=$link ;; #(
      *)    app_path=$APP_HOME$link ;;
    esac
done

# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

warn () {
    echo "$*"
} >&2

die () {
    echo
    echo "$*"
    echo
    exit 1
} >&2

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in                #(
  CYGWIN* )         cygwin=true  ;; #(
  Darwin* )         darwin=true  ;; #(
  MSYS* | MINGW* )  msys=true    ;; #(
  NONSTOP* )        nonstop=true ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar


# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD=$JAVA_HOME/jre/sh/java
    else
        JAVACMD=$JAVA_HOME/bin/java
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD=java
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
    case $MAX_FD in #(
      max*)
        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
        # shellcheck disable=SC3045 
        MAX_FD=$( ulimit -H -n ) ||
            warn "Could not query maximum file descriptor limit"
    esac
    case $MAX_FD in  #(
      '' | soft) :;; #(
      *)
        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
        # shellcheck disable=SC3045 
        ulimit -n "$MAX_FD" ||
            warn "Could not set maximum file descriptor limit to $MAX_FD"
    esac
fi

# Collect all arguments for the java command, stacking in reverse order:
#   * args from the command line
#   * the main class name
#   * -classpath
#   * -D...appname settings
#   * --module-path (only if needed)
#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.

# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )

    JAVACMD=$( cygpath --unix "$JAVACMD" )

    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    for arg do
        if
            case $arg in                                #(
              -*)   false ;;                            # don't mess with options #(
              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
                    [ -e "$t" ] ;;                      #(
              *)    false ;;
            esac
        then
            arg=$( cygpath --path --ignore --mixed "$arg" )
        fi
        # Roll the args list around exactly as many times as the number of
        # args, so each arg winds up back in the position where it started, but
        # possibly modified.
        #
        # NB: a `for` loop captures its iteration list before it begins, so
        # changing the positional parameters here affects neither the number of
        # iterations, nor the values presented in `arg`.
        shift                   # remove old arg
        set -- "$@" "$arg"      # push replacement arg
    done
fi

# Collect all arguments for the java command;
#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
#     shell script including quotes and variable substitutions, so put them in
#     double quotes to make sure that they get re-expanded; and
#   * put everything else in single quotes, so that it's not re-expanded.

set -- \
        "-Dorg.gradle.appname=$APP_BASE_NAME" \
        -classpath "$CLASSPATH" \
        org.gradle.wrapper.GradleWrapperMain \
        "$@"

# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
    die "xargs is not available"
fi

# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
#   set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#

eval "set -- $(
        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
        xargs -n1 |
        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
        tr '\n' ' '
    )" '"$@"'

exec "$JAVACMD" "$@"


================================================
FILE: gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem      https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto execute

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar


@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: intellij.java.decompiler.engine.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" scope="TEST" name="JUnit4" level="project" />
    <orderEntry type="library" scope="TEST" name="assertJ" level="project" />
    <orderEntry type="library" name="jetbrains-annotations" level="project" />
  </component>
</module>

================================================
FILE: resources/META-INF/MANIFEST.MF
================================================
Manifest-Version: 1.0
Main-Class: org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler
Automatic-Module-Name: org.jetbrains.java.decompiler


================================================
FILE: src/org/jetbrains/java/decompiler/ClassNameConstants.java
================================================
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.java.decompiler;

public interface ClassNameConstants {
  String JAVA_LANG_STRING = "java/lang/String";
  String JAVA_LANG_CHARACTER = "java/lang/Character";
  String JAVA_UTIL_OBJECTS = "java/util/Objects";
  String JAVA_LANG_OBJECT = "java/lang/Object";
}


================================================
FILE: src/org/jetbrains/java/decompiler/code/CodeConstants.java
================================================
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

@SuppressWarnings({"unused", "SpellCheckingInspection"})
public interface CodeConstants {
  // ----------------------------------------------------------------------
  // BYTECODE VERSIONS
  // ----------------------------------------------------------------------

  int BYTECODE_JAVA_LE_4 = 48;
  int BYTECODE_JAVA_5 = 49;
  int BYTECODE_JAVA_6 = 50;
  int BYTECODE_JAVA_7 = 51;
  int BYTECODE_JAVA_8 = 52;
  int BYTECODE_JAVA_9 = 53;
  int BYTECODE_JAVA_10 = 54;
  int BYTECODE_JAVA_11 = 55;
  int BYTECODE_JAVA_12 = 56;
  int BYTECODE_JAVA_13 = 57;
  int BYTECODE_JAVA_14 = 58;
  int BYTECODE_JAVA_15 = 59;
  int BYTECODE_JAVA_16 = 60;
  int BYTECODE_JAVA_17 = 61;
  int BYTECODE_JAVA_18 = 62;
  int BYTECODE_JAVA_19 = 63;
  int BYTECODE_JAVA_20 = 64;
  int BYTECODE_JAVA_21 = 65;
  int BYTECODE_JAVA_22 = 66;

  // ----------------------------------------------------------------------
  // VARIABLE TYPES
  // ----------------------------------------------------------------------

  int TYPE_BYTE = 0;
  int TYPE_CHAR = 1;
  int TYPE_DOUBLE = 2;
  int TYPE_FLOAT = 3;
  int TYPE_INT = 4;
  int TYPE_LONG = 5;
  int TYPE_SHORT = 6;
  int TYPE_BOOLEAN = 7;
  int TYPE_OBJECT = 8;
  int TYPE_ADDRESS = 9;
  int TYPE_VOID = 10;
  int TYPE_ANY = 11;
  int TYPE_GROUP2EMPTY = 12;
  int TYPE_NULL = 13;
  int TYPE_NOTINITIALIZED = 14;
  int TYPE_BYTECHAR = 15;
  int TYPE_SHORTCHAR = 16;
  int TYPE_UNKNOWN = 17;
  int TYPE_GENVAR = 18;

  // ----------------------------------------------------------------------
  // VARIABLE TYPE FAMILIES
  // ----------------------------------------------------------------------

  int TYPE_FAMILY_UNKNOWN = 0;
  int TYPE_FAMILY_BOOLEAN = 1;
  int TYPE_FAMILY_INTEGER = 2;
  int TYPE_FAMILY_FLOAT = 3;
  int TYPE_FAMILY_LONG = 4;
  int TYPE_FAMILY_DOUBLE = 5;
  int TYPE_FAMILY_OBJECT = 6;

  // ----------------------------------------------------------------------
  // ACCESS FLAGS
  // ----------------------------------------------------------------------

  int ACC_PUBLIC = 0x0001;
  int ACC_PRIVATE = 0x0002;
  int ACC_PROTECTED = 0x0004;
  int ACC_STATIC = 0x0008;
  int ACC_FINAL = 0x0010;
  int ACC_SYNCHRONIZED = 0x0020;
  int ACC_OPEN = 0x0020;
  int ACC_TRANSITIVE = 0x0020;
  int ACC_VOLATILE = 0x0040;
  int ACC_BRIDGE = 0x0040;
  int ACC_STATIC_PHASE = 0x0040;
  int ACC_TRANSIENT = 0x0080;
  int ACC_VARARGS = 0x0080;
  int ACC_NATIVE = 0x0100;
  int ACC_ABSTRACT = 0x0400;
  int ACC_STRICT = 0x0800;
  int ACC_SYNTHETIC = 0x1000;
  int ACC_ANNOTATION = 0x2000;
  int ACC_ENUM = 0x4000;
  int ACC_MANDATED = 0x8000;
  int ACC_MODULE = 0x8000;

  // ----------------------------------------------------------------------
  // CLASS FLAGS
  // ----------------------------------------------------------------------

  int ACC_SUPER = 0x0020;
  int ACC_INTERFACE = 0x0200;

  // ----------------------------------------------------------------------
  // INSTRUCTION GROUPS
  // ----------------------------------------------------------------------

  int GROUP_GENERAL = 1;
  int GROUP_JUMP = 2;
  int GROUP_SWITCH = 3;
  int GROUP_INVOCATION = 4;
  int GROUP_FIELDACCESS = 5;
  int GROUP_RETURN = 6;

  // ----------------------------------------------------------------------
  // POOL CONSTANTS
  // ----------------------------------------------------------------------

  int CONSTANT_Utf8 = 1;
  int CONSTANT_Integer = 3;
  int CONSTANT_Float = 4;
  int CONSTANT_Long = 5;
  int CONSTANT_Double = 6;
  int CONSTANT_Class = 7;
  int CONSTANT_String = 8;
  int CONSTANT_Fieldref = 9;
  int CONSTANT_Methodref = 10;
  int CONSTANT_InterfaceMethodref = 11;
  int CONSTANT_NameAndType = 12;
  int CONSTANT_MethodHandle = 15;
  int CONSTANT_MethodType = 16;
  int CONSTANT_Dynamic = 17;
  int CONSTANT_InvokeDynamic = 18;
  int CONSTANT_Module = 19;
  int CONSTANT_Package = 20;

  // ----------------------------------------------------------------------
  // MethodHandle reference_kind values
  // ----------------------------------------------------------------------

  int CONSTANT_MethodHandle_REF_getField = 1;
  int CONSTANT_MethodHandle_REF_getStatic = 2;
  int CONSTANT_MethodHandle_REF_putField = 3;
  int CONSTANT_MethodHandle_REF_putStatic = 4;
  int CONSTANT_MethodHandle_REF_invokeVirtual = 5;
  int CONSTANT_MethodHandle_REF_invokeStatic = 6;
  int CONSTANT_MethodHandle_REF_invokeSpecial = 7;
  int CONSTANT_MethodHandle_REF_newInvokeSpecial = 8;
  int CONSTANT_MethodHandle_REF_invokeInterface = 9;

  // ----------------------------------------------------------------------
  // VM OPCODES
  // ----------------------------------------------------------------------

  int opc_nop = 0;
  int opc_aconst_null = 1;
  int opc_iconst_m1 = 2;
  int opc_iconst_0 = 3;
  int opc_iconst_1 = 4;
  int opc_iconst_2 = 5;
  int opc_iconst_3 = 6;
  int opc_iconst_4 = 7;
  int opc_iconst_5 = 8;
  int opc_lconst_0 = 9;
  int opc_lconst_1 = 10;
  int opc_fconst_0 = 11;
  int opc_fconst_1 = 12;
  int opc_fconst_2 = 13;
  int opc_dconst_0 = 14;
  int opc_dconst_1 = 15;
  int opc_bipush = 16;
  int opc_sipush = 17;
  int opc_ldc = 18;
  int opc_ldc_w = 19;
  int opc_ldc2_w = 20;
  int opc_iload = 21;
  int opc_lload = 22;
  int opc_fload = 23;
  int opc_dload = 24;
  int opc_aload = 25;
  int opc_iload_0 = 26;
  int opc_iload_1 = 27;
  int opc_iload_2 = 28;
  int opc_iload_3 = 29;
  int opc_lload_0 = 30;
  int opc_lload_1 = 31;
  int opc_lload_2 = 32;
  int opc_lload_3 = 33;
  int opc_fload_0 = 34;
  int opc_fload_1 = 35;
  int opc_fload_2 = 36;
  int opc_fload_3 = 37;
  int opc_dload_0 = 38;
  int opc_dload_1 = 39;
  int opc_dload_2 = 40;
  int opc_dload_3 = 41;
  int opc_aload_0 = 42;
  int opc_aload_1 = 43;
  int opc_aload_2 = 44;
  int opc_aload_3 = 45;
  int opc_iaload = 46;
  int opc_laload = 47;
  int opc_faload = 48;
  int opc_daload = 49;
  int opc_aaload = 50;
  int opc_baload = 51;
  int opc_caload = 52;
  int opc_saload = 53;
  int opc_istore = 54;
  int opc_lstore = 55;
  int opc_fstore = 56;
  int opc_dstore = 57;
  int opc_astore = 58;
  int opc_istore_0 = 59;
  int opc_istore_1 = 60;
  int opc_istore_2 = 61;
  int opc_istore_3 = 62;
  int opc_lstore_0 = 63;
  int opc_lstore_1 = 64;
  int opc_lstore_2 = 65;
  int opc_lstore_3 = 66;
  int opc_fstore_0 = 67;
  int opc_fstore_1 = 68;
  int opc_fstore_2 = 69;
  int opc_fstore_3 = 70;
  int opc_dstore_0 = 71;
  int opc_dstore_1 = 72;
  int opc_dstore_2 = 73;
  int opc_dstore_3 = 74;
  int opc_astore_0 = 75;
  int opc_astore_1 = 76;
  int opc_astore_2 = 77;
  int opc_astore_3 = 78;
  int opc_iastore = 79;
  int opc_lastore = 80;
  int opc_fastore = 81;
  int opc_dastore = 82;
  int opc_aastore = 83;
  int opc_bastore = 84;
  int opc_castore = 85;
  int opc_sastore = 86;
  int opc_pop = 87;
  int opc_pop2 = 88;
  int opc_dup = 89;
  int opc_dup_x1 = 90;
  int opc_dup_x2 = 91;
  int opc_dup2 = 92;
  int opc_dup2_x1 = 93;
  int opc_dup2_x2 = 94;
  int opc_swap = 95;
  int opc_iadd = 96;
  int opc_ladd = 97;
  int opc_fadd = 98;
  int opc_dadd = 99;
  int opc_isub = 100;
  int opc_lsub = 101;
  int opc_fsub = 102;
  int opc_dsub = 103;
  int opc_imul = 104;
  int opc_lmul = 105;
  int opc_fmul = 106;
  int opc_dmul = 107;
  int opc_idiv = 108;
  int opc_ldiv = 109;
  int opc_fdiv = 110;
  int opc_ddiv = 111;
  int opc_irem = 112;
  int opc_lrem = 113;
  int opc_frem = 114;
  int opc_drem = 115;
  int opc_ineg = 116;
  int opc_lneg = 117;
  int opc_fneg = 118;
  int opc_dneg = 119;
  int opc_ishl = 120;
  int opc_lshl = 121;
  int opc_ishr = 122;
  int opc_lshr = 123;
  int opc_iushr = 124;
  int opc_lushr = 125;
  int opc_iand = 126;
  int opc_land = 127;
  int opc_ior = 128;
  int opc_lor = 129;
  int opc_ixor = 130;
  int opc_lxor = 131;
  int opc_iinc = 132;
  int opc_i2l = 133;
  int opc_i2f = 134;
  int opc_i2d = 135;
  int opc_l2i = 136;
  int opc_l2f = 137;
  int opc_l2d = 138;
  int opc_f2i = 139;
  int opc_f2l = 140;
  int opc_f2d = 141;
  int opc_d2i = 142;
  int opc_d2l = 143;
  int opc_d2f = 144;
  int opc_i2b = 145;
  int opc_i2c = 146;
  int opc_i2s = 147;
  int opc_lcmp = 148;
  int opc_fcmpl = 149;
  int opc_fcmpg = 150;
  int opc_dcmpl = 151;
  int opc_dcmpg = 152;
  int opc_ifeq = 153;
  int opc_ifne = 154;
  int opc_iflt = 155;
  int opc_ifge = 156;
  int opc_ifgt = 157;
  int opc_ifle = 158;
  int opc_if_icmpeq = 159;
  int opc_if_icmpne = 160;
  int opc_if_icmplt = 161;
  int opc_if_icmpge = 162;
  int opc_if_icmpgt = 163;
  int opc_if_icmple = 164;
  int opc_if_acmpeq = 165;
  int opc_if_acmpne = 166;
  int opc_goto = 167;
  int opc_jsr = 168;
  int opc_ret = 169;
  int opc_tableswitch = 170;
  int opc_lookupswitch = 171;
  int opc_ireturn = 172;
  int opc_lreturn = 173;
  int opc_freturn = 174;
  int opc_dreturn = 175;
  int opc_areturn = 176;
  int opc_return = 177;
  int opc_getstatic = 178;
  int opc_putstatic = 179;
  int opc_getfield = 180;
  int opc_putfield = 181;
  int opc_invokevirtual = 182;
  int opc_invokespecial = 183;
  int opc_invokestatic = 184;
  int opc_invokeinterface = 185;
  int opc_invokedynamic = 186;
  int opc_new = 187;
  int opc_newarray = 188;
  int opc_anewarray = 189;
  int opc_arraylength = 190;
  int opc_athrow = 191;
  int opc_checkcast = 192;
  int opc_instanceof = 193;
  int opc_monitorenter = 194;
  int opc_monitorexit = 195;
  int opc_wide = 196;
  int opc_multianewarray = 197;
  int opc_ifnull = 198;
  int opc_ifnonnull = 199;
  int opc_goto_w = 200;
  int opc_jsr_w = 201;

  String CLINIT_NAME = "<clinit>";
  String INIT_NAME = "<init>";
}


================================================
FILE: src/org/jetbrains/java/decompiler/code/ExceptionHandler.java
================================================
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

import org.jetbrains.java.decompiler.main.DecompilerContext;

public class ExceptionHandler {
  public int from = 0;
  public int to = 0;
  public int handler = 0;

  public int from_instr = 0;
  public int to_instr = 0;
  public int handler_instr = 0;

  public String exceptionClass = null;

  public String toString() {
    String new_line_separator = DecompilerContext.getNewLineSeparator();
    return "from: " + from + " to: " + to + " handler: " + handler + new_line_separator +
           "from_instr: " + from_instr + " to_instr: " + to_instr + " handler_instr: " + handler_instr + new_line_separator +
           "exceptionClass: " + exceptionClass + new_line_separator;
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/code/ExceptionTable.java
================================================
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

import java.util.Collections;
import java.util.List;

public class ExceptionTable {
  public static final ExceptionTable EMPTY = new ExceptionTable(Collections.emptyList());

  private final List<ExceptionHandler> handlers;

  public ExceptionTable(List<ExceptionHandler> handlers) {
    this.handlers = handlers;
  }

  public List<ExceptionHandler> getHandlers() {
    return handlers;
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/code/FullInstructionSequence.java
================================================
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

import org.jetbrains.java.decompiler.util.VBStyleCollection;


public class FullInstructionSequence extends InstructionSequence {

  // *****************************************************************************
  // constructors
  // *****************************************************************************

  public FullInstructionSequence(VBStyleCollection<Instruction, Integer> collinstr, ExceptionTable extable) {
    super(collinstr);
    this.exceptionTable = extable;

    // translate raw exception handlers to instr
    for (ExceptionHandler handler : extable.getHandlers()) {
      handler.from_instr = this.getPointerByAbsOffset(handler.from);
      handler.to_instr = this.getPointerByAbsOffset(handler.to);
      handler.handler_instr = this.getPointerByAbsOffset(handler.handler);
    }
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/code/Instruction.java
================================================
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.java.decompiler.code;

import org.jetbrains.java.decompiler.util.TextUtil;

public class Instruction {
  public static Instruction create(int opcode, boolean wide, int group, int bytecodeVersion, int[] operands) {
    if (opcode >= CodeConstants.opc_ifeq && opcode <= CodeConstants.opc_if_acmpne ||
        opcode == CodeConstants.opc_ifnull || opcode == CodeConstants.opc_ifnonnull ||
        opcode == CodeConstants.opc_jsr || opcode == CodeConstants.opc_jsr_w ||
        opcode == CodeConstants.opc_goto || opcode == CodeConstants.opc_goto_w) {
      return new JumpInstruction(opcode, group, wide, bytecodeVersion, operands);
    }
    else if (opcode == CodeConstants.opc_tableswitch || opcode == CodeConstants.opc_lookupswitch) {
      return new SwitchInstruction(opcode, group, wide, bytecodeVersion, operands);
    }
    else {
      return new Instruction(opcode, group, wide, bytecodeVersion, operands);
    }
  }

  public static boolean equals(Instruction i1, Instruction i2) {
    return i1 != null && i2 != null &&
           (i1 == i2 ||
            i1.opcode == i2.opcode &&
            i1.wide == i2.wide &&
            i1.operandsCount() == i2.operandsCount());
  }

  public final int opcode;
  public final int group;
  public final boolean wide;
  public final int bytecodeVersion;

  protected final int[] operands;

  public Instruction(int opcode, int group, boolean wide, int bytecodeVersion, int[] operands) {
    this.opcode = opcode;
    this.group = group;
    this.wide = wide;
    this.bytecodeVersion = bytecodeVersion;
    this.operands = operands;
  }

  public void initInstruction(InstructionSequence seq) { }

  public int operandsCount() {
    return operands == null ? 0 : operands.length;
  }

  public int operand(int index) {
    return operands[index];
  }

  public boolean canFallThrough() {
    return opcode != CodeConstants.opc_goto && opcode != CodeConstants.opc_goto_w && opcode != CodeConstants.opc_ret &&
           !(opcode >= CodeConstants.opc_ireturn && opcode <= CodeConstants.opc_return) &&
           opcode != CodeConstants.opc_athrow &&
           opcode != CodeConstants.opc_jsr && opcode != CodeConstants.opc_tableswitch && opcode != CodeConstants.opc_lookupswitch;
  }

  @Override
  public String toString() {
    StringBuilder res = new StringBuilder();
    if (wide) res.append("@wide ");
    res.append("@").append(TextUtil.getInstructionName(opcode));

    int len = operandsCount();
    for (int i = 0; i < len; i++) {
      int op = operands[i];
      if (op < 0) {
        res.append(" -").append(Integer.toHexString(-op));
      }
      else {
        res.append(" ").append(Integer.toHexString(op));
      }
    }

    return res.toString();
  }

  @Override
  @SuppressWarnings("MethodDoesntCallSuperMethod")
  public Instruction clone() {
    return create(opcode, wide, group, bytecodeVersion, operands == null ? null : operands.clone());
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/code/InstructionSequence.java
================================================
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

import org.jetbrains.java.decompiler.main.DecompilerContext;
import org.jetbrains.java.decompiler.util.TextUtil;
import org.jetbrains.java.decompiler.util.VBStyleCollection;

public abstract class InstructionSequence {

  // *****************************************************************************
  // private fields
  // *****************************************************************************

  protected final VBStyleCollection<Instruction, Integer> collinstr;

  protected int pointer = 0;

  protected ExceptionTable exceptionTable = ExceptionTable.EMPTY;

  protected InstructionSequence() {
    this(new VBStyleCollection<>());
  }

  protected InstructionSequence(VBStyleCollection<Instruction, Integer> collinstr) {
    this.collinstr = collinstr;
  }

  // *****************************************************************************
  // public methods
  // *****************************************************************************

  // to nbe overwritten
  @Override
  public InstructionSequence clone() {
    return null;
  }

  public void clear() {
    collinstr.clear();
    pointer = 0;
    exceptionTable = ExceptionTable.EMPTY;
  }

  public void addInstruction(Instruction inst, int offset) {
    collinstr.addWithKey(inst, offset);
  }

  public void addInstruction(int index, Instruction inst, int offset) {
    collinstr.addWithKeyAndIndex(index, inst, offset);
  }

  public void addSequence(InstructionSequence seq) {
    for (int i = 0; i < seq.length(); i++) {
      addInstruction(seq.getInstr(i), -1); // TODO: any sensible value possible?
    }
  }

  public void removeInstruction(int index) {
    collinstr.remove(index);
  }

  public void removeLast() {
    if (!collinstr.isEmpty()) {
      collinstr.remove(collinstr.size() - 1);
    }
  }

  public Instruction getInstr(int index) {
  return collinstr.get(index);
  }

  public Instruction getLastInstr() {
  return collinstr.getLast();
  }

  public int getOffset(int index) {
    return collinstr.getKey(index);
  }

  public int getPointerByAbsOffset(int offset) {
    Integer absoffset = offset;
    if (collinstr.containsKey(absoffset)) {
      return collinstr.getIndexByKey(absoffset);
    }
    else {
      return -1;
    }
  }

  public int getPointerByRelOffset(int offset) {
    Integer absoffset = collinstr.getKey(pointer) + offset;
    if (collinstr.containsKey(absoffset)) {
      return collinstr.getIndexByKey(absoffset);
    }
    else {
      return -1;
    }
  }

  public int length() {
    return collinstr.size();
  }

  public boolean isEmpty() {
    return collinstr.isEmpty();
  }

  public void addToPointer(int diff) {
    this.pointer += diff;
  }

  public String toString() {
    return toString(0);
  }

  public String toString(int indent) {

    String new_line_separator = DecompilerContext.getNewLineSeparator();

    StringBuilder buf = new StringBuilder();

    for (int i = 0; i < collinstr.size(); i++) {
    buf.append(TextUtil.getIndentString(indent));
      buf.append(collinstr.getKey(i).intValue());
      buf.append(": ");
      buf.append(collinstr.get(i).toString());
      buf.append(new_line_separator);
    }

    return buf.toString();
  }

  // *****************************************************************************
  // getter and setter methods
  // *****************************************************************************

  public int getPointer() {
    return pointer;
  }

  public void setPointer(int pointer) {
    this.pointer = pointer;
  }

  public ExceptionTable getExceptionTable() {
    return exceptionTable;
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/code/JumpInstruction.java
================================================
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

public class JumpInstruction extends Instruction {
  public int destination;

  public JumpInstruction(int opcode, int group, boolean wide, int bytecodeVersion, int[] operands) {
    super(opcode, group, wide, bytecodeVersion, operands);
  }

  @Override
  public void initInstruction(InstructionSequence seq) {
    destination = seq.getPointerByRelOffset(this.operand(0));
  }

  @Override
  public JumpInstruction clone() {
    JumpInstruction copy = (JumpInstruction)super.clone();
    copy.destination = destination;
    return copy;
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/code/SimpleInstructionSequence.java
================================================
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

import org.jetbrains.java.decompiler.util.VBStyleCollection;

public class SimpleInstructionSequence extends InstructionSequence {

  public SimpleInstructionSequence() {
  }

  public SimpleInstructionSequence(VBStyleCollection<Instruction, Integer> collinstr) {
    super(collinstr);
  }

  @Override
  public SimpleInstructionSequence clone() {
    SimpleInstructionSequence newseq = new SimpleInstructionSequence(collinstr.clone());
    newseq.setPointer(this.getPointer());

    return newseq;
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/code/SwitchInstruction.java
================================================
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code;

public class SwitchInstruction extends Instruction {
  private int[] destinations;
  private int[] values;
  private int defaultDestination;

  public SwitchInstruction(int opcode, int group, boolean wide, int bytecodeVersion, int[] operands) {
    super(opcode, group, wide, bytecodeVersion, operands);
  }

  @Override
  public void initInstruction(InstructionSequence seq) {
    defaultDestination = seq.getPointerByRelOffset(operands[0]);

    int prefix = opcode == CodeConstants.opc_tableswitch ? 3 : 2;
    int len = operands.length - prefix;
    int low = 0;
    if (opcode == CodeConstants.opc_lookupswitch) {
      len /= 2;
    }
    else {
      low = operands[1];
    }

    destinations = new int[len];
    values = new int[len];
    for (int i = 0, k = 0; i < len; i++, k++) {
      if (opcode == CodeConstants.opc_lookupswitch) {
        values[i] = operands[prefix + k];
        k++;
      }
      else {
        values[i] = low + k;
      }
      destinations[i] = seq.getPointerByRelOffset(operands[prefix + k]);
    }
  }

  public int[] getDestinations() {
    return destinations;
  }

  public int[] getValues() {
    return values;
  }

  public int getDefaultDestination() {
    return defaultDestination;
  }

  @Override
  public SwitchInstruction clone() {
    SwitchInstruction copy = (SwitchInstruction)super.clone();
    copy.defaultDestination = defaultDestination;
    copy.destinations = destinations.clone();
    copy.values = values.clone();
    return copy;
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/code/cfg/BasicBlock.java
================================================
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code.cfg;

import org.jetbrains.java.decompiler.code.Instruction;
import org.jetbrains.java.decompiler.code.InstructionSequence;
import org.jetbrains.java.decompiler.code.SimpleInstructionSequence;
import org.jetbrains.java.decompiler.main.DecompilerContext;
import org.jetbrains.java.decompiler.modules.decompiler.decompose.IGraphNode;

import java.util.ArrayList;
import java.util.List;

public class BasicBlock implements IGraphNode {
  public final int id;

  private final InstructionSequence seq;
  private final List<Integer> originalOffsets = new ArrayList<>();
  private final List<BasicBlock> predecessors = new ArrayList<>();
  private final List<BasicBlock> successors = new ArrayList<>();
  private final List<BasicBlock> predecessorExceptions = new ArrayList<>();
  private final List<BasicBlock> successorExceptions = new ArrayList<>();

  public int mark = 0;

  public BasicBlock(int id) {
    this(id, new SimpleInstructionSequence());
  }

  public BasicBlock(int id, InstructionSequence seq) {
    this.id = id;
    this.seq = seq;
  }

  public BasicBlock clone(int newId) {
    BasicBlock block = new BasicBlock(newId, seq.clone());
    block.originalOffsets.addAll(originalOffsets);
    return block;
  }

  public Instruction getInstruction(int index) {
    return seq.getInstr(index);
  }

  public Instruction getLastInstruction() {
    return seq.isEmpty() ? null : seq.getLastInstr();
  }

  public Integer getOriginalOffset(int index) {
    return index < originalOffsets.size() ? originalOffsets.get(index) : Integer.valueOf(-1);
  }

  public int size() {
    return seq.length();
  }

  public void addPredecessor(BasicBlock block) {
    predecessors.add(block);
  }

  public void removePredecessor(BasicBlock block) {
    while (predecessors.remove(block)) /**/;
  }

  public void addSuccessor(BasicBlock block) {
    successors.add(block);
    block.addPredecessor(this);
  }

  public void removeSuccessor(BasicBlock block) {
    while (successors.remove(block)) /**/;
    block.removePredecessor(this);
  }

  // FIXME: unify block comparisons: id or direct equality
  public void replaceSuccessor(BasicBlock oldBlock, BasicBlock newBlock) {
    for (int i = 0; i < successors.size(); i++) {
      if (successors.get(i).id == oldBlock.id) {
        successors.set(i, newBlock);
        oldBlock.removePredecessor(this);
        newBlock.addPredecessor(this);
      }
    }

    for (int i = 0; i < successorExceptions.size(); i++) {
      if (successorExceptions.get(i).id == oldBlock.id) {
        successorExceptions.set(i, newBlock);
        oldBlock.removePredecessorException(this);
        newBlock.addPredecessorException(this);
      }
    }
  }

  public void addPredecessorException(BasicBlock block) {
    predecessorExceptions.add(block);
  }

  public void removePredecessorException(BasicBlock block) {
    while (predecessorExceptions.remove(block)) /**/;
  }

  public void addSuccessorException(BasicBlock block) {
    if (!successorExceptions.contains(block)) {
      successorExceptions.add(block);
      block.addPredecessorException(this);
    }
  }

  public void removeSuccessorException(BasicBlock block) {
    while (successorExceptions.remove(block)) /**/;
    block.removePredecessorException(this);
  }

  public boolean isSuccessor(BasicBlock block) {
    return successors.stream().anyMatch(successor -> successor.id == block.id);
  }

  public List<Integer> getOriginalOffsets() {
    return originalOffsets;
  }

  public InstructionSequence getSeq() {
    return seq;
  }

  public List<BasicBlock> getPredecessors() {
    return predecessors;
  }

  public List<BasicBlock> getSuccessors() {
    return successors;
  }

  public List<BasicBlock> getPredecessorExceptions() {
    return predecessorExceptions;
  }

  public List<BasicBlock> getSuccessorExceptions() {
    return successorExceptions;
  }

  @Override
  public List<? extends IGraphNode> getPredecessorNodes() {
    List<BasicBlock> lst = new ArrayList<>(predecessors);
    lst.addAll(predecessorExceptions);
    return lst;
  }

  @Override
  public String toString() {
    return id + ":" + DecompilerContext.getNewLineSeparator() + seq.toString(0);
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/code/cfg/ControlFlowGraph.java
================================================
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.java.decompiler.code.cfg;

import org.jetbrains.java.decompiler.code.*;
import org.jetbrains.java.decompiler.code.interpreter.InstructionImpact;
import org.jetbrains.java.decompiler.main.DecompilerContext;
import org.jetbrains.java.decompiler.modules.code.DeadCodeHelper;
import org.jetbrains.java.decompiler.struct.StructClass;
import org.jetbrains.java.decompiler.struct.StructMethod;
import org.jetbrains.java.decompiler.struct.consts.ConstantPool;
import org.jetbrains.java.decompiler.struct.gen.DataPoint;
import org.jetbrains.java.decompiler.struct.gen.VarType;
import org.jetbrains.java.decompiler.util.ListStack;
import org.jetbrains.java.decompiler.util.VBStyleCollection;

import java.util.*;
import java.util.Map.Entry;

public class ControlFlowGraph {
  public int last_id = 0;

  // *****************************************************************************
  // private fields
  // *****************************************************************************

  private VBStyleCollection<BasicBlock, Integer> blocks;

  private BasicBlock first;

  private BasicBlock last;

  private List<ExceptionRangeCFG> exceptions;

  private Map<BasicBlock, BasicBlock> subroutines;

  private final Set<BasicBlock> finallyExits = new HashSet<>();

  // *****************************************************************************
  // constructors
  // *****************************************************************************

  public ControlFlowGraph(InstructionSequence seq) {
    buildBlocks(seq);
  }


  // *****************************************************************************
  // public methods
  // *****************************************************************************

  public void removeMarkers() {
    for (BasicBlock block : blocks) {
      block.mark = 0;
    }
  }

  public String toString() {
    if (blocks == null) return "Empty";

    String new_line_separator = DecompilerContext.getNewLineSeparator();

    StringBuilder buf = new StringBuilder();

    for (BasicBlock block : blocks) {
      buf.append("----- Block ").append(block.id).append(" -----").append(new_line_separator);
      buf.append(block);
      buf.append("----- Edges -----").append(new_line_separator);

      List<BasicBlock> suc = block.getSuccessors();
      for (BasicBlock aSuc : suc) {
        buf.append(">>>>>>>>(regular) Block ").append(aSuc.id).append(new_line_separator);
      }
      suc = block.getSuccessorExceptions();
      for (BasicBlock handler : suc) {
        ExceptionRangeCFG range = getExceptionRange(handler, block);

        if (range == null) {
          buf.append(">>>>>>>>(exception) Block ").append(handler.id).append("\t").append("ERROR: range not found!")
            .append(new_line_separator);
        }
        else {
          List<String> exceptionTypes = range.getExceptionTypes();
          if (exceptionTypes == null) {
            buf.append(">>>>>>>>(exception) Block ").append(handler.id).append("\t").append("NULL").append(new_line_separator);
          }
          else {
            for (String exceptionType : exceptionTypes) {
              buf.append(">>>>>>>>(exception) Block ").append(handler.id).append("\t").append(exceptionType).append(new_line_separator);
            }
          }
        }
      }
      buf.append("----- ----- -----").append(new_line_separator);
    }

    return buf.toString();
  }

  public void inlineJsr(StructClass cl, StructMethod mt) {
    processJsr();
    removeJsr(cl, mt);

    removeMarkers();

    DeadCodeHelper.removeEmptyBlocks(this);
  }

  public void removeBlock(BasicBlock block) {

    while (!block.getSuccessors().isEmpty()) {
      block.removeSuccessor(block.getSuccessors().get(0));
    }

    while (!block.getSuccessorExceptions().isEmpty()) {
      block.removeSuccessorException(block.getSuccessorExceptions().get(0));
    }

    while (!block.getPredecessors().isEmpty()) {
      block.getPredecessors().get(0).removeSuccessor(block);
    }

    while (!block.getPredecessorExceptions().isEmpty()) {
      block.getPredecessorExceptions().get(0).removeSuccessorException(block);
    }

    last.removePredecessor(block);

    blocks.removeWithKey(block.id);

    for (int i = exceptions.size() - 1; i >= 0; i--) {
      ExceptionRangeCFG range = exceptions.get(i);
      if (range.getHandler() == block) {
        exceptions.remove(i);
      }
      else {
        List<BasicBlock> lstRange = range.getProtectedRange();
        lstRange.remove(block);

        if (lstRange.isEmpty()) {
          exceptions.remove(i);
        }
      }
    }

    subroutines.entrySet().removeIf(ent -> ent.getKey() == block || ent.getValue() == block);
  }

  public ExceptionRangeCFG getExceptionRange(BasicBlock handler, BasicBlock block) {

    //List<ExceptionRangeCFG> ranges = new ArrayList<ExceptionRangeCFG>();

    for (int i = exceptions.size() - 1; i >= 0; i--) {
      ExceptionRangeCFG range = exceptions.get(i);
      if (range.getHandler() == handler && range.getProtectedRange().contains(block)) {
        return range;
        //ranges.add(range);
      }
    }

    return null;
    //return ranges.isEmpty() ? null : ranges;
  }

  //	public String getExceptionsUniqueString(BasicBlock handler, BasicBlock block) {
  //
  //		List<ExceptionRangeCFG> ranges = getExceptionRange(handler, block);
  //
  //		if(ranges == null) {
  //			return null;
  //		} else {
  //			Set<String> setExceptionStrings = new HashSet<String>();
  //			for(ExceptionRangeCFG range : ranges) {
  //				setExceptionStrings.add(range.getExceptionType());
  //			}
  //
  //			String ret = "";
  //			for(String exception : setExceptionStrings) {
  //				ret += exception;
  //			}
  //
  //			return ret;
  //		}
  //	}


  // *****************************************************************************
  // private methods
  // *****************************************************************************

  private void buildBlocks(InstructionSequence instrseq) {

    short[] states = findStartInstructions(instrseq);

    Map<Integer, BasicBlock> mapInstrBlocks = new HashMap<>();
    VBStyleCollection<BasicBlock, Integer> colBlocks = createBasicBlocks(states, instrseq, mapInstrBlocks);

    blocks = colBlocks;

    connectBlocks(colBlocks, mapInstrBlocks);

    setExceptionEdges(instrseq, mapInstrBlocks);

    setSubroutineEdges();

    setFirstAndLastBlocks();
  }

  private static short[] findStartInstructions(InstructionSequence seq) {

    int len = seq.length();
    short[] inststates = new short[len];

    Set<Integer> excSet = new HashSet<>();

    for (ExceptionHandler handler : seq.getExceptionTable().getHandlers()) {
      excSet.add(handler.from_instr);
      excSet.add(handler.to_instr);
      excSet.add(handler.handler_instr);
    }


    for (int i = 0; i < len; i++) {

      // exception blocks
      if (excSet.contains(i)) {
        inststates[i] = 1;
      }

      Instruction instr = seq.getInstr(i);
      switch (instr.group) {
        case CodeConstants.GROUP_JUMP:
          inststates[((JumpInstruction)instr).destination] = 1;
        case CodeConstants.GROUP_RETURN:
          if (i + 1 < len) {
            inststates[i + 1] = 1;
          }
          break;
        case CodeConstants.GROUP_SWITCH:
          SwitchInstruction swinstr = (SwitchInstruction)instr;
          int[] dests = swinstr.getDestinations();
          for (int j = dests.length - 1; j >= 0; j--) {
            inststates[dests[j]] = 1;
          }
          inststates[swinstr.getDefaultDestination()] = 1;
          if (i + 1 < len) {
            inststates[i + 1] = 1;
          }
      }
    }

    // first instruction
    inststates[0] = 1;

    return inststates;
  }


  private VBStyleCollection<BasicBlock, Integer> createBasicBlocks(short[] startblock,
                                                                   InstructionSequence instrseq,
                                                                   Map<Integer, BasicBlock> mapInstrBlocks) {

    VBStyleCollection<BasicBlock, Integer> col = new VBStyleCollection<>();

    InstructionSequence currseq = null;
    List<Integer> lstOffs = null;

    int len = startblock.length;
    short counter = 0;
    int blockoffset = 0;

    BasicBlock currentBlock = null;
    for (int i = 0; i < len; i++) {

      if (startblock[i] == 1) {
        currentBlock = new BasicBlock(++counter);

        currseq = currentBlock.getSeq();
        lstOffs = currentBlock.getOriginalOffsets();

        col.addWithKey(currentBlock, currentBlock.id);

        blockoffset = instrseq.getOffset(i);
      }

      startblock[i] = counter;
      mapInstrBlocks.put(i, currentBlock);

      currseq.addInstruction(instrseq.getInstr(i), instrseq.getOffset(i) - blockoffset);
      lstOffs.add(instrseq.getOffset(i));
    }

    last_id = counter;

    return col;
  }


  private static void connectBlocks(List<BasicBlock> lstbb, Map<Integer, BasicBlock> mapInstrBlocks) {

    for (int i = 0; i < lstbb.size(); i++) {

      BasicBlock block = lstbb.get(i);
      Instruction instr = block.getLastInstruction();

      boolean fallthrough = instr.canFallThrough();
      BasicBlock bTemp;

      switch (instr.group) {
        case CodeConstants.GROUP_JUMP -> {
          int dest = ((JumpInstruction)instr).destination;
          bTemp = mapInstrBlocks.get(dest);
          block.addSuccessor(bTemp);
        }
        case CodeConstants.GROUP_SWITCH -> {
          SwitchInstruction sinstr = (SwitchInstruction)instr;
          int[] dests = sinstr.getDestinations();

          bTemp = mapInstrBlocks.get(((SwitchInstruction)instr).getDefaultDestination());
          block.addSuccessor(bTemp);
          for (int dest1 : dests) {
            bTemp = mapInstrBlocks.get(dest1);
            block.addSuccessor(bTemp);
          }
        }
      }

      if (fallthrough && i < lstbb.size() - 1) {
        BasicBlock defaultBlock = lstbb.get(i + 1);
        block.addSuccessor(defaultBlock);
      }
    }
  }

  private void setExceptionEdges(InstructionSequence instrseq, Map<Integer, BasicBlock> instrBlocks) {

    exceptions = new ArrayList<>();

    Map<String, ExceptionRangeCFG> mapRanges = new HashMap<>();

    for (ExceptionHandler handler : instrseq.getExceptionTable().getHandlers()) {

      BasicBlock from = instrBlocks.get(handler.from_instr);
      BasicBlock to = instrBlocks.get(handler.to_instr);
      BasicBlock handle = instrBlocks.get(handler.handler_instr);

      String key = from.id + ":" + to.id + ":" + handle.id;

      if (mapRanges.containsKey(key)) {
        ExceptionRangeCFG range = mapRanges.get(key);
        range.addExceptionType(handler.exceptionClass);
      }
      else {

        List<BasicBlock> protectedRange = new ArrayList<>();
        for (int j = from.id; j < to.id; j++) {
          BasicBlock block = blocks.getWithKey(j);
          protectedRange.add(block);
          block.addSuccessorException(handle);
        }

        ExceptionRangeCFG range = new ExceptionRangeCFG(protectedRange, handle, handler.exceptionClass == null
                                                                                ? null
                                                                                : Collections.singletonList(handler.exceptionClass));
        mapRanges.put(key, range);

        exceptions.add(range);
      }
    }
  }

  private void setSubroutineEdges() {
    final Map<BasicBlock, BasicBlock> subroutines = new LinkedHashMap<>();

    for (BasicBlock block : blocks) {

      if (block.getSeq().getLastInstr().opcode == CodeConstants.opc_jsr) {

        LinkedList<BasicBlock> stack = new LinkedList<>();
        LinkedList<LinkedList<BasicBlock>> stackJsrStacks = new LinkedList<>();

        Set<BasicBlock> setVisited = new HashSet<>();

        stack.add(block);
        stackJsrStacks.add(new LinkedList<>());

        while (!stack.isEmpty()) {

          BasicBlock node = stack.removeFirst();
          LinkedList<BasicBlock> jsrstack = stackJsrStacks.removeFirst();

          setVisited.add(node);

          switch (node.getSeq().getLastInstr().opcode) {
            case CodeConstants.opc_jsr -> jsrstack.add(node);
            case CodeConstants.opc_ret -> {
              BasicBlock enter = jsrstack.getLast();
              BasicBlock exit = blocks.getWithKey(enter.id + 1); // FIXME: find successor in a better way

              if (exit != null) {
                if (!node.isSuccessor(exit)) {
                  node.addSuccessor(exit);
                }
                jsrstack.removeLast();
                subroutines.put(enter, exit);
              }
              else {
                throw new RuntimeException("ERROR: last instruction jsr");
              }
            }
          }

          if (!jsrstack.isEmpty()) {
            for (BasicBlock succ : node.getSuccessors()) {
              if (!setVisited.contains(succ)) {
                stack.add(succ);
                stackJsrStacks.add(new LinkedList<>(jsrstack));
              }
            }
          }
        }
      }
    }

    this.subroutines = subroutines;
  }

  private void processJsr() {
    while (true) {
      if (processJsrRanges() == 0) break;
    }
  }

  private static final class JsrRecord {
    private final BasicBlock jsr;
    private final Set<BasicBlock> range;
    private final BasicBlock ret;

    private JsrRecord(BasicBlock jsr, Set<BasicBlock> range, BasicBlock ret) {
      this.jsr = jsr;
      this.range = range;
      this.ret = ret;
    }
  }

  private int processJsrRanges() {

    List<JsrRecord> lstJsrAll = new ArrayList<>();

    // get all jsr ranges
    for (Entry<BasicBlock, BasicBlock> ent : subroutines.entrySet()) {
      BasicBlock jsr = ent.getKey();
      BasicBlock ret = ent.getValue();

      lstJsrAll.add(new JsrRecord(jsr, getJsrRange(jsr, ret), ret));
    }

    // sort ranges
    // FIXME: better sort order
    List<JsrRecord> lstJsr = new ArrayList<>();
    for (JsrRecord arr : lstJsrAll) {
      int i = 0;
      for (; i < lstJsr.size(); i++) {
        JsrRecord arrJsr = lstJsr.get(i);
        if (arrJsr.range.contains(arr.jsr)) {
          break;
        }
      }
      lstJsr.add(i, arr);
    }

    // find the first intersection
    for (int i = 0; i < lstJsr.size(); i++) {
      JsrRecord arr = lstJsr.get(i);
      Set<BasicBlock> set = arr.range;

      for (int j = i + 1; j < lstJsr.size(); j++) {
        JsrRecord arr1 = lstJsr.get(j);
        Set<BasicBlock> set1 = arr1.range;

        if (!set.contains(arr1.jsr) && !set1.contains(arr.jsr)) { // rang 0 doesn't contain entry 1 and vice versa
          Set<BasicBlock> setc = new HashSet<>(set);
          setc.retainAll(set1);

          if (!setc.isEmpty()) {
            splitJsrRange(arr.jsr, arr.ret, setc);
            return 1;
          }
        }
      }
    }

    return 0;
  }

  private Set<BasicBlock> getJsrRange(BasicBlock jsr, BasicBlock ret) {

    Set<BasicBlock> blocks = new HashSet<>();

    List<BasicBlock> lstNodes = new LinkedList<>();
    lstNodes.add(jsr);

    BasicBlock dom = jsr.getSuccessors().get(0);

    while (!lstNodes.isEmpty()) {

      BasicBlock node = lstNodes.remove(0);

      for (int j = 0; j < 2; j++) {
        List<BasicBlock> lst;
        if (j == 0) {
          if (node.getLastInstruction().opcode == CodeConstants.opc_ret) {
            if (node.getSuccessors().contains(ret)) {
              continue;
            }
          }
          lst = node.getSuccessors();
        }
        else {
          if (node == jsr) {
            continue;
          }
          lst = node.getSuccessorExceptions();
        }

        CHILD:
        for (int i = lst.size() - 1; i >= 0; i--) {

          BasicBlock child = lst.get(i);
          if (!blocks.contains(child)) {

            if (node != jsr) {
              for (int k = 0; k < child.getPredecessors().size(); k++) {
                if (!DeadCodeHelper.isDominator(this, child.getPredecessors().get(k), dom)) {
                  continue CHILD;
                }
              }

              for (int k = 0; k < child.getPredecessorExceptions().size(); k++) {
                if (!DeadCodeHelper.isDominator(this, child.getPredecessorExceptions().get(k), dom)) {
                  continue CHILD;
                }
              }
            }

            // last block is a dummy one
            if (child != last) {
              blocks.add(child);
            }

            lstNodes.add(child);
          }
        }
      }
    }

    return blocks;
  }

  private void splitJsrRange(BasicBlock jsr, BasicBlock ret, Set<BasicBlock> common_blocks) {

    List<BasicBlock> lstNodes = new LinkedList<>();
    Map<Integer, BasicBlock> mapNewNodes = new HashMap<>();

    lstNodes.add(jsr);
    mapNewNodes.put(jsr.id, jsr);

    while (!lstNodes.isEmpty()) {

      BasicBlock node = lstNodes.remove(0);

      for (int j = 0; j < 2; j++) {
        List<BasicBlock> lst;
        if (j == 0) {
          if (node.getLastInstruction().opcode == CodeConstants.opc_ret) {
            if (node.getSuccessors().contains(ret)) {
              continue;
            }
          }
          lst = node.getSuccessors();
        }
        else {
          if (node == jsr) {
            continue;
          }
          lst = node.getSuccessorExceptions();
        }


        for (int i = lst.size() - 1; i >= 0; i--) {

          BasicBlock child = lst.get(i);
          Integer childid = child.id;

          if (mapNewNodes.containsKey(childid)) {
            node.replaceSuccessor(child, mapNewNodes.get(childid));
          }
          else if (common_blocks.contains(child)) {
            // make a copy of the current block
            BasicBlock copy = child.clone(++last_id);
            // copy all successors
            if (copy.getLastInstruction().opcode == CodeConstants.opc_ret && child.getSuccessors().contains(ret)) {
              copy.addSuccessor(ret);
              child.removeSuccessor(ret);
            }
            else {
              for (int k = 0; k < child.getSuccessors().size(); k++) {
                copy.addSuccessor(child.getSuccessors().get(k));
              }
            }
            for (int k = 0; k < child.getSuccessorExceptions().size(); k++) {
              copy.addSuccessorException(child.getSuccessorExceptions().get(k));
            }

            lstNodes.add(copy);
            mapNewNodes.put(childid, copy);

            if (last.getPredecessors().contains(child)) {
              last.addPredecessor(copy);
            }

            node.replaceSuccessor(child, copy);
            blocks.addWithKey(copy, copy.id);
          }
          else {
            // stop at the first fixed node
            //lstNodes.add(child);
            mapNewNodes.put(childid, child);
          }
        }
      }
    }

    // note: subroutines won't be copied!
    splitJsrExceptionRanges(common_blocks, mapNewNodes);
  }

  private void splitJsrExceptionRanges(Set<BasicBlock> common_blocks, Map<Integer, BasicBlock> mapNewNodes) {

    for (int i = exceptions.size() - 1; i >= 0; i--) {

      ExceptionRangeCFG range = exceptions.get(i);
      List<BasicBlock> lstRange = range.getProtectedRange();

      HashSet<BasicBlock> setBoth = new HashSet<>(common_blocks);
      setBoth.retainAll(lstRange);

      if (!setBoth.isEmpty()) {
        List<BasicBlock> lstNewRange;

        if (setBoth.size() == lstRange.size()) {
          lstNewRange = new ArrayList<>();
          ExceptionRangeCFG newRange = new ExceptionRangeCFG(lstNewRange,
                                                             mapNewNodes.get(range.getHandler().id), range.getExceptionTypes());
          exceptions.add(newRange);
        }
        else {
          lstNewRange = lstRange;
        }

        for (BasicBlock block : setBoth) {
          lstNewRange.add(mapNewNodes.get(block.id));
        }
      }
    }
  }

  private void removeJsr(StructClass cl, StructMethod mt) {
    removeJsrInstructions(cl.getPool(), first, DataPoint.getInitialDataPoint(mt));
  }

  private static void removeJsrInstructions(ConstantPool pool, BasicBlock block, DataPoint data) {
    ListStack<VarType> stack = data.getStack();

    InstructionSequence seq = block.getSeq();
    for (int i = 0; i < seq.length(); i++) {
      Instruction instr = seq.getInstr(i);

      VarType var = null;
      if (instr.opcode == CodeConstants.opc_astore || instr.opcode == CodeConstants.opc_pop) {
        var = stack.getByOffset(-1);
      }

      InstructionImpact.stepTypes(data, instr, pool);

      switch (instr.opcode) {
        case CodeConstants.opc_jsr, CodeConstants.opc_ret -> {
          seq.removeInstruction(i);
          i--;
        }
        case CodeConstants.opc_astore, CodeConstants.opc_pop -> {
          if (var.getType() == CodeConstants.TYPE_ADDRESS) {
            seq.removeInstruction(i);
            i--;
          }
        }
      }
    }

    block.mark = 1;

    for (int i = 0; i < block.getSuccessors().size(); i++) {
      BasicBlock suc = block.getSuccessors().get(i);
      if (suc.mark != 1) {
        removeJsrInstructions(pool, suc, data.copy());
      }
    }

    for (int i = 0; i < block.getSuccessorExceptions().size(); i++) {
      BasicBlock suc = block.getSuccessorExceptions().get(i);
      if (suc.mark != 1) {
        DataPoint point = data.copy();
        point.getStack().clear();
        point.getStack().push(new VarType(CodeConstants.TYPE_OBJECT, 0, null));
        removeJsrInstructions(pool, suc, point);
      }
    }
  }

  private void setFirstAndLastBlocks() {

    first = blocks.get(0);

    last = new BasicBlock(++last_id);

    for (BasicBlock block : blocks) {
      if (block.getSuccessors().isEmpty()) {
        last.addPredecessor(block);
      }
    }
  }

  public List<BasicBlock> getReversePostOrder() {

    List<BasicBlock> res = new LinkedList<>();
    addToReversePostOrderListIterative(first, res);

    return res;
  }

  private static void addToReversePostOrderListIterative(BasicBlock root, List<? super BasicBlock> lst) {

    LinkedList<BasicBlock> stackNode = new LinkedList<>();
    LinkedList<Integer> stackIndex = new LinkedList<>();

    Set<BasicBlock> setVisited = new HashSet<>();

    stackNode.add(root);
    stackIndex.add(0);

    while (!stackNode.isEmpty()) {

      BasicBlock node = stackNode.getLast();
      int index = stackIndex.removeLast();

      setVisited.add(node);

      List<BasicBlock> lstSuccs = new ArrayList<>(node.getSuccessors());
      lstSuccs.addAll(node.getSuccessorExceptions());

      for (; index < lstSuccs.size(); index++) {
        BasicBlock succ = lstSuccs.get(index);

        if (!setVisited.contains(succ)) {
          stackIndex.add(index + 1);

          stackNode.add(succ);
          stackIndex.add(0);

          break;
        }
      }

      if (index == lstSuccs.size()) {
        lst.add(0, node);

        stackNode.removeLast();
      }
    }
  }


  // *****************************************************************************
  // getter and setter methods
  // *****************************************************************************

  public VBStyleCollection<BasicBlock, Integer> getBlocks() {
    return blocks;
  }

  public BasicBlock getFirst() {
    return first;
  }

  public void setFirst(BasicBlock first) {
    this.first = first;
  }

  public List<ExceptionRangeCFG> getExceptions() {
    return exceptions;
  }

  public BasicBlock getLast() {
    return last;
  }

  public Set<BasicBlock> getFinallyExits() {
    return finallyExits;
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/code/cfg/ExceptionRangeCFG.java
================================================
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.code.cfg;

import org.jetbrains.java.decompiler.main.DecompilerContext;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ExceptionRangeCFG {
  private final List<BasicBlock> protectedRange; // FIXME: replace with set
  private BasicBlock handler;
  private List<String> exceptionTypes;

  public ExceptionRangeCFG(List<BasicBlock> protectedRange, BasicBlock handler, List<String> exceptionType) {
    this.protectedRange = protectedRange;
    this.handler = handler;

    if (exceptionType != null) {
      this.exceptionTypes = new ArrayList<>(exceptionType);
    }
  }

  public boolean isCircular() {
    return protectedRange.contains(handler);
  }

  @Override
  public String toString() {
    String new_line_separator = DecompilerContext.getNewLineSeparator();
    StringBuilder buf = new StringBuilder();

    buf.append("exceptionType:");

    if (exceptionTypes == null) {
      buf.append(" null");
    }
    else {
      for (String exception_type : exceptionTypes) {
        buf.append(" ").append(exception_type);
      }
    }

    buf.append(new_line_separator);

    buf.append("handler: ").append(handler.id).append(new_line_separator);
    buf.append("range: ");
    for (BasicBlock block : protectedRange) {
      buf.append(block.id).append(" ");
    }
    buf.append(new_line_separator);

    return buf.toString();
  }

  public BasicBlock getHandler() {
    return handler;
  }

  public void setHandler(BasicBlock handler) {
    this.handler = handler;
  }

  public List<BasicBlock> getProtectedRange() {
    return protectedRange;
  }

  public List<String> getExceptionTypes() {
    return this.exceptionTypes;
  }

  public void addExceptionType(String exceptionType) {
    if (this.exceptionTypes == null) {
      return;
    }

    if (exceptionType == null) {
      this.exceptionTypes = null;
    }
    else {
      this.exceptionTypes.add(exceptionType);
    }
  }

  public String getUniqueExceptionsString() {
    return exceptionTypes != null ? exceptionTypes.stream().distinct().collect(Collectors.joining(":")) : null;
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/code/interpreter/InstructionImpact.java
================================================
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.java.decompiler.code.interpreter;

import org.jetbrains.java.decompiler.code.CodeConstants;
import org.jetbrains.java.decompiler.code.Instruction;
import org.jetbrains.java.decompiler.struct.consts.ConstantPool;
import org.jetbrains.java.decompiler.struct.consts.LinkConstant;
import org.jetbrains.java.decompiler.struct.consts.PooledConstant;
import org.jetbrains.java.decompiler.struct.consts.PrimitiveConstant;
import org.jetbrains.java.decompiler.struct.gen.DataPoint;
import org.jetbrains.java.decompiler.struct.gen.FieldDescriptor;
import org.jetbrains.java.decompiler.struct.gen.MethodDescriptor;
import org.jetbrains.java.decompiler.struct.gen.VarType;
import org.jetbrains.java.decompiler.util.ListStack;

public final class InstructionImpact {

  // {read, write}
  private static final int[][][] stack_impact = {

    {null, null},                                                //		public final static int		opc_nop = 0;
    null,                                                                //		public final static int		opc_aconst_null = 1;
    null,                                                                //		public final static int		opc_iconst_m1 = 2;
    null,                                                                //		public final static int		opc_iconst_0 = 3;
    null,                                                                //		public final static int		opc_iconst_1 = 4;
    null,                                                                //		public final static int		opc_iconst_2 = 5;
    null,                        //		public final static int		opc_iconst_3 = 6;
    null,                        //		public final static int		opc_iconst_4 = 7;
    null,                        //		public final static int		opc_iconst_5 = 8;
    {null, {CodeConstants.TYPE_LONG}},                        //		public final static int		opc_lconst_0 = 9;
    {null, {CodeConstants.TYPE_LONG}},                        //		public final static int		opc_lconst_1 = 10;
    {null, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_fconst_0 = 11;
    {null, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_fconst_1 = 12;
    {null, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_fconst_2 = 13;
    {null, {CodeConstants.TYPE_DOUBLE}},                        //		public final static int		opc_dconst_0 = 14;
    {null, {CodeConstants.TYPE_DOUBLE}},                        //		public final static int		opc_dconst_1 = 15;
    {null, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_bipush = 16;
    {null, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_sipush = 17;
    null,                        //		public final static int		opc_ldc = 18;
    null,                        //		public final static int		opc_ldc_w = 19;
    null,                        //		public final static int		opc_ldc2_w = 20;
    {null, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_iload = 21;
    {null, {CodeConstants.TYPE_LONG}},                        //		public final static int		opc_lload = 22;
    {null, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_fload = 23;
    {null, {CodeConstants.TYPE_DOUBLE}},                        //		public final static int		opc_dload = 24;
    null,                        //		public final static int		opc_aload = 25;
    null,                        //		public final static int		opc_iload_0 = 26;
    null,                        //		public final static int		opc_iload_1 = 27;
    null,                        //		public final static int		opc_iload_2 = 28;
    null,                        //		public final static int		opc_iload_3 = 29;
    null,                        //		public final static int		opc_lload_0 = 30;
    null,                        //		public final static int		opc_lload_1 = 31;
    null,                        //		public final static int		opc_lload_2 = 32;
    null,                        //		public final static int		opc_lload_3 = 33;
    null,                        //		public final static int		opc_fload_0 = 34;
    null,                        //		public final static int		opc_fload_1 = 35;
    null,                        //		public final static int		opc_fload_2 = 36;
    null,                        //		public final static int		opc_fload_3 = 37;
    null,                        //		public final static int		opc_dload_0 = 38;
    null,                        //		public final static int		opc_dload_1 = 39;
    null,                        //		public final static int		opc_dload_2 = 40;
    null,                        //		public final static int		opc_dload_3 = 41;
    null,                        //		public final static int		opc_aload_0 = 42;
    null,                        //		public final static int		opc_aload_1 = 43;
    null,                        //		public final static int		opc_aload_2 = 44;
    null,                        //		public final static int		opc_aload_3 = 45;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_iaload = 46;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_laload = 47;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_FLOAT}},
    //		public final static int		opc_faload = 48;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_DOUBLE}},
    //		public final static int		opc_daload = 49;
    null,                        //		public final static int		opc_aaload = 50;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_baload = 51;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_caload = 52;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_saload = 53;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_istore = 54;
    {{CodeConstants.TYPE_LONG}, null},                        //		public final static int		opc_lstore = 55;
    {{CodeConstants.TYPE_FLOAT}, null},                        //		public final static int		opc_fstore = 56;
    {{CodeConstants.TYPE_DOUBLE}, null},                        //		public final static int		opc_dstore = 57;
    null,                        //		public final static int		opc_astore = 58;
    null,                        //		public final static int		opc_istore_0 = 59;
    null,                        //		public final static int		opc_istore_1 = 60;
    null,                        //		public final static int		opc_istore_2 = 61;
    null,                        //		public final static int		opc_istore_3 = 62;
    null,                        //		public final static int		opc_lstore_0 = 63;
    null,                        //		public final static int		opc_lstore_1 = 64;
    null,                        //		public final static int		opc_lstore_2 = 65;
    null,                        //		public final static int		opc_lstore_3 = 66;
    null,                        //		public final static int		opc_fstore_0 = 67;
    null,                        //		public final static int		opc_fstore_1 = 68;
    null,                        //		public final static int		opc_fstore_2 = 69;
    null,                        //		public final static int		opc_fstore_3 = 70;
    null,                        //		public final static int		opc_dstore_0 = 71;
    null,                        //		public final static int		opc_dstore_1 = 72;
    null,                        //		public final static int		opc_dstore_2 = 73;
    null,                        //		public final static int		opc_dstore_3 = 74;
    null,                        //		public final static int		opc_astore_0 = 75;
    null,                        //		public final static int		opc_astore_1 = 76;
    null,                        //		public final static int		opc_astore_2 = 77;
    null,                        //		public final static int		opc_astore_3 = 78;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},
    //		public final static int		opc_iastore = 79;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_LONG}, null},
    //		public final static int		opc_lastore = 80;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_FLOAT}, null},
    //		public final static int		opc_fastore = 81;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_DOUBLE}, null},
    //		public final static int		opc_dastore = 82;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_OBJECT}, null},
    //		public final static int		opc_aastore = 83;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},
    //		public final static int		opc_bastore = 84;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},
    //		public final static int		opc_castore = 85;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},
    //		public final static int		opc_sastore = 86;
    {{CodeConstants.TYPE_ANY}, null},                        //		public final static int		opc_pop = 87;
    {{CodeConstants.TYPE_ANY, CodeConstants.TYPE_ANY}, null},                        //		public final static int		opc_pop2 = 88;
    null,                        //		public final static int		opc_dup = 89;
    null,                        //		public final static int		opc_dup_x1 = 90;
    null,                        //		public final static int		opc_dup_x2 = 91;
    null,                        //		public final static int		opc_dup2 = 92;
    null,                        //		public final static int		opc_dup2_x1 = 93;
    null,                        //		public final static int		opc_dup2_x2 = 94;
    null,                        //		public final static int		opc_swap = 95;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_iadd = 96;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_ladd = 97;
    {{CodeConstants.TYPE_FLOAT, CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_FLOAT}},
    //		public final static int		opc_fadd = 98;
    {{CodeConstants.TYPE_DOUBLE, CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_DOUBLE}},
    //		public final static int		opc_dadd = 99;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_isub = 100;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lsub = 101;
    {{CodeConstants.TYPE_FLOAT, CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_FLOAT}},
    //		public final static int		opc_fsub = 102;
    {{CodeConstants.TYPE_DOUBLE, CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_DOUBLE}},
    //		public final static int		opc_dsub = 103;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_imul = 104;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lmul = 105;
    {{CodeConstants.TYPE_FLOAT, CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_FLOAT}},
    //		public final static int		opc_fmul = 106;
    {{CodeConstants.TYPE_DOUBLE, CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_DOUBLE}},
    //		public final static int		opc_dmul = 107;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_idiv = 108;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_ldiv = 109;
    {{CodeConstants.TYPE_FLOAT, CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_FLOAT}},
    //		public final static int		opc_fdiv = 110;
    {{CodeConstants.TYPE_DOUBLE, CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_DOUBLE}},
    //		public final static int		opc_ddiv = 111;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_irem = 112;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lrem = 113;
    {{CodeConstants.TYPE_FLOAT, CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_FLOAT}},
    //		public final static int		opc_frem = 114;
    {{CodeConstants.TYPE_DOUBLE, CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_DOUBLE}},
    //		public final static int		opc_drem = 115;
    {{CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_ineg = 116;
    {{CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},                        //		public final static int		opc_lneg = 117;
    {{CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_fneg = 118;
    {{CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_DOUBLE}},                        //		public final static int		opc_dneg = 119;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_ishl = 120;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lshl = 121;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_ishr = 122;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lshr = 123;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_iushr = 124;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lushr = 125;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_iand = 126;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_land = 127;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_ior = 128;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lor = 129;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_ixor = 130;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_LONG}},
    //		public final static int		opc_lxor = 131;
    {null, null},                        //		public final static int		opc_iinc = 132;
    {{CodeConstants.TYPE_INT}, {CodeConstants.TYPE_LONG}},                        //		public final static int		opc_i2l = 133;
    {{CodeConstants.TYPE_INT}, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_i2f = 134;
    {{CodeConstants.TYPE_INT}, {CodeConstants.TYPE_DOUBLE}},                        //		public final static int		opc_i2d = 135;
    {{CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_l2i = 136;
    {{CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_l2f = 137;
    {{CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_DOUBLE}},                        //		public final static int		opc_l2d = 138;
    {{CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_f2i = 139;
    {{CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_LONG}},                        //		public final static int		opc_f2l = 140;
    {{CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_DOUBLE}},                        //		public final static int		opc_f2d = 141;
    {{CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_d2i = 142;
    {{CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_LONG}},                        //		public final static int		opc_d2l = 143;
    {{CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_FLOAT}},                        //		public final static int		opc_d2f = 144;
    {{CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_i2b = 145;
    {{CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_i2c = 146;
    {{CodeConstants.TYPE_INT}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_i2s = 147;
    {{CodeConstants.TYPE_LONG, CodeConstants.TYPE_LONG}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_lcmp = 148;
    {{CodeConstants.TYPE_FLOAT, CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_fcmpl = 149;
    {{CodeConstants.TYPE_FLOAT, CodeConstants.TYPE_FLOAT}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_fcmpg = 150;
    {{CodeConstants.TYPE_DOUBLE, CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_dcmpl = 151;
    {{CodeConstants.TYPE_DOUBLE, CodeConstants.TYPE_DOUBLE}, {CodeConstants.TYPE_INT}},
    //		public final static int		opc_dcmpg = 152;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_ifeq = 153;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_ifne = 154;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_iflt = 155;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_ifge = 156;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_ifgt = 157;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_ifle = 158;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_if_icmpeq = 159;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_if_icmpne = 160;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_if_icmplt = 161;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_if_icmpge = 162;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_if_icmpgt = 163;
    {{CodeConstants.TYPE_INT, CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_if_icmple = 164;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_OBJECT}, null},
    //		public final static int		opc_if_acmpeq = 165;
    {{CodeConstants.TYPE_OBJECT, CodeConstants.TYPE_OBJECT}, null},
    //		public final static int		opc_if_acmpne = 166;
    {null, null},                        //		public final static int		opc_goto = 167;
    {null, {CodeConstants.TYPE_ADDRESS}},                        //		public final static int		opc_jsr = 168;
    {null, null},                        //		public final static int		opc_ret = 169;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_tableswitch = 170;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_lookupswitch = 171;
    {{CodeConstants.TYPE_INT}, null},                        //		public final static int		opc_ireturn = 172;
    {{CodeConstants.TYPE_LONG}, null},                        //		public final static int		opc_lreturn = 173;
    {{CodeConstants.TYPE_FLOAT}, null},                        //		public final static int		opc_freturn = 174;
    {{CodeConstants.TYPE_DOUBLE}, null},                        //		public final static int		opc_dreturn = 175;
    {{CodeConstants.TYPE_OBJECT}, null},                        //		public final static int		opc_areturn = 176;
    {null, null},                        //		public final static int		opc_return = 177;
    null,                        //		public final static int		opc_getstatic = 178;
    null,                        //		public final static int		opc_putstatic = 179;
    null,                        //		public final static int		opc_getfield = 180;
    null,                        //		public final static int		opc_putfield = 181;
    null,                        //		public final static int		opc_invokevirtual = 182;
    null,                        //		public final static int		opc_invokespecial = 183;
    null,                        //		public final static int		opc_invokestatic = 184;
    null,                        //		public final static int		opc_invokeinterface = 185;
    null,                        //		public final static int		opc_xxxunusedxxx = 186;
    null,                        //		public final static int		opc_new = 187;
    null,                        //		public final static int		opc_newarray = 188;
    null,                        //		public final static int		opc_anewarray = 189;
    {{CodeConstants.TYPE_OBJECT}, {CodeConstants.TYPE_INT}},                        //		public final static int		opc_arraylength = 190;
    null,
    //		public final static int		opc_athrow = 191;
    null,
    //		public final static int		opc_checkcast = 192;
    null,
    //		public final static int		opc_instanceof = 193;
    {{CodeConstants.TYPE_OBJECT}, null},                                //		public final static int		opc_monitorenter = 194;
    {{CodeConstants.TYPE_OBJECT}, null},                                //		public final static int		opc_monitorexit = 195;
    null,
    //		public final static int		opc_wide = 196;
    null,
    //		public final static int		opc_multianewarray = 197;
    {{CodeConstants.TYPE_OBJECT}, null},                                //		public final static int		opc_ifnull = 198;
    {{CodeConstants.TYPE_OBJECT}, null},                                //		public final static int		opc_ifnonnull = 199;
    {null, null},                                                                        //		public final static int		opc_goto_w = 200;
    {null, {CodeConstants.TYPE_ADDRESS}},                        //		public final static int		opc_jsr_w = 201;
  };

  private static final int[] arr_type = new int[]{
    CodeConstants.TYPE_BOOLEAN,
    CodeConstants.TYPE_CHAR,
    CodeConstants.TYPE_FLOAT,
    CodeConstants.TYPE_DOUBLE,
    CodeConstants.TYPE_BYTE,
    CodeConstants.TYPE_SHORT,
    CodeConstants.TYPE_INT,
    CodeConstants.TYPE_LONG
  };


  // Sonderbehandlung
  //	null,			//		public final static int		opc_aconst_null = 1;
  //	null, 			//		public final static int		opc_ldc = 18;
  //	null, 			//		public final static int		opc_ldc_w = 19;
  //	null, 			//		public final static int		opc_ldc2_w = 20;
  //	null,			//		public final static int		opc_aload = 25;
  //	null,			//		public final static int		opc_aaload = 50;
  //	null,			//		public final static int		opc_astore = 58;
  //	null, 			//		public final static int		opc_dup = 89;
  //	null, 			//		public final static int		opc_dup_x1 = 90;
  //	null, 			//		public final static int		opc_dup_x2 = 91;
  //	null, 			//		public final static int		opc_dup2 = 92;
  //	null, 			//		public final static int		opc_dup2_x1 = 93;
  //	null, 			//		public final static int		opc_dup2_x2 = 94;
  //	null, 			//		public final static int		opc_swap = 95;
  //	null, 			//		public final static int		opc_getstatic = 178;
  //	null, 			//		public final static int		opc_putstatic = 179;
  //	null, 			//		public final static int		opc_getfield = 180;
  //	null, 			//		public final static int		opc_putfield = 181;
  //	null, 			//		public final static int		opc_invokevirtual = 182;
  //	null, 			//		public final static int		opc_invokespecial = 183;
  //	null, 			//		public final static int		opc_invokestatic = 184;
  //	null, 			//		public final static int		opc_invokeinterface = 185;
  //	null,			//		public final static int		opc_new = 187;
  //	null,			//		public final static int		opc_newarray = 188;
  //	null,			//		public final static int		opc_anewarray = 189;
  //	null, 			//		public final static int		opc_athrow = 191;
  //	null,			//		public final static int		opc_checkcast = 192;
  //	null,			//		public final static int		opc_instanceof = 193;
  //	null, 			//		public final static int		opc_multianewarray = 197;


  public static void stepTypes(DataPoint data, Instruction instr, ConstantPool pool) {
    ListStack<VarType> stack = data.getStack();
    int[][] arr = stack_impact[instr.opcode];

    if (arr != null) {
      // simple types only

      int[] read = arr[0];
      int[] write = arr[1];

      if (read != null) {
        int depth = 0;
        for (int type : read) {
          depth++;
          if (type == CodeConstants.TYPE_LONG ||
              type == CodeConstants.TYPE_DOUBLE) {
            depth++;
          }
        }

        stack.removeMultiple(depth);
      }

      if (write != null) {
        for (int type : write) {
          stack.push(new VarType(type));
          if (type == CodeConstants.TYPE_LONG ||
              type == CodeConstants.TYPE_DOUBLE) {
            stack.push(new VarType(CodeConstants.TYPE_GROUP2EMPTY));
          }
        }
      }
    }
    else {
      // Sonderbehandlung
      processSpecialInstructions(data, instr, pool);
    }
  }

  private static void processSpecialInstructions(DataPoint data, Instruction instr, ConstantPool pool) {

    VarType var1;
    PrimitiveConstant cn;
    LinkConstant ck;

    ListStack<VarType> stack = data.getStack();

    switch (instr.opcode) {
      case CodeConstants.opc_aconst_null:
        stack.push(new VarType(CodeConstants.TYPE_NULL, 0, null));
        break;
      case CodeConstants.opc_ldc:
      case CodeConstants.opc_ldc_w:
      case CodeConstants.opc_ldc2_w:
        PooledConstant constant = pool.getConstant(instr.operand(0));
        switch (constant.type) {
          case CodeConstants.CONSTANT_Integer -> stack.push(new VarType(CodeConstants.TYPE_INT));
          case CodeConstants.CONSTANT_Float -> stack.push(new VarType(CodeConstants.TYPE_FLOAT));
          case CodeConstants.CONSTANT_Long -> {
            stack.push(new VarType(CodeConstants.TYPE_LONG));
            stack.push(new VarType(CodeConstants.TYPE_GROUP2EMPTY));
          }
          case CodeConstants.CONSTANT_Double -> {
            stack.push(new VarType(CodeConstants.TYPE_DOUBLE));
            stack.push(new VarType(CodeConstants.TYPE_GROUP2EMPTY));
          }
          case CodeConstants.CONSTANT_String -> stack.push(new VarType(CodeConstants.TYPE_OBJECT, 0, "java/lang/String"));
          case CodeConstants.CONSTANT_Class -> stack.push(new VarType(CodeConstants.TYPE_OBJECT, 0, "java/lang/Class"));
          case CodeConstants.CONSTANT_MethodHandle -> stack.push(new VarType(((LinkConstant)constant).descriptor));
          case CodeConstants.CONSTANT_Dynamic -> {
            ck = pool.getLinkConstant(instr.operand(0));
            FieldDescriptor constDescriptor = FieldDescriptor.parseDescriptor(ck.descriptor);
            stack.push(constDescriptor.type);
            if (constDescriptor.type.getStackSize() == 2) {
              stack.push(new VarType(CodeConstants.TYPE_GROUP2EMPTY));
            }
          }
        }
        break;
      case CodeConstants.opc_aload:
        var1 = data.getVariable(instr.operand(0));
        if (var1 != null) {
          stack.push(var1);
        }
        else {
          stack.push(new VarType(CodeConstants.TYPE_OBJECT, 0, null));
        }
        break;
      case CodeConstants.opc_aaload:
        var1 = stack.pop(2);
        stack.push(new VarType(var1.getType(), var1.getArrayDim() - 1, var1.getValue()));
        break;
      case CodeConstants.opc_astore:
        data.setVariable(instr.operand(0), stack.pop());
        break;
      case CodeConstants.opc_dup:
      case CodeConstants.opc_dup_x1:
      case CodeConstants.opc_dup_x2:
        int depth1 = 88 - instr.opcode;
        stack.insertByOffset(depth1, stack.getByOffset(-1).copy());
        break;
      case CodeConstants.opc_dup2:
      case CodeConstants.opc_dup2_x1:
      case CodeConstants.opc_dup2_x2:
        int depth2 = 90 - instr.opcode;
        stack.insertByOffset(depth2, stack.getByOffset(-2).copy());
        stack.insertByOffset(depth2, stack.getByOffset(-1).copy());
        break;
      case CodeConstants.opc_swap:
        var1 = stack.pop();
        stack.insertByOffset(-1, var1);
        break;
      case CodeConstants.opc_getfield:
        stack.pop();
      case CodeConstants.opc_getstatic:
        ck = pool.getLinkConstant(instr.operand(0));
        var1 = new VarType(ck.descriptor);
        stack.push(var1);
        if (var1.getStackSize() == 2) {
          stack.push(new VarType(CodeConstants.TYPE_GROUP2EMPTY));
        }
        break;
      case CodeConstants.opc_putfield:
        stack.pop();
      case CodeConstants.opc_putstatic:
        ck = pool.getLinkConstant(instr.operand(0));
        var1 = new VarType(ck.descriptor);
        stack.pop(var1.getStackSize());
        break;
      case CodeConstants.opc_invokevirtual:
      case CodeConstants.opc_invokespecial:
      case CodeConstants.opc_invokeinterface:
        stack.pop();
      case CodeConstants.opc_invokestatic:
      case CodeConstants.opc_invokedynamic:
        if (instr.opcode != CodeConstants.opc_invokedynamic || instr.bytecodeVersion >= CodeConstants.BYTECODE_JAVA_7) {
          ck = pool.getLinkConstant(instr.operand(0));
          MethodDescriptor md = MethodDescriptor.parseDescriptor(ck.descriptor);
          for (int i = 0; i < md.params.length; i++) {
            stack.pop(md.params[i].getStackSize());
          }
          if (md.ret.getType() != CodeConstants.TYPE_VOID) {
            stack.push(md.ret);
            if (md.ret.getStackSize() == 2) {
              stack.push(new VarType(CodeConstants.TYPE_GROUP2EMPTY));
            }
          }
        }
        break;
      case CodeConstants.opc_new:
        cn = pool.getPrimitiveConstant(instr.operand(0));
        stack.push(new VarType(CodeConstants.TYPE_OBJECT, 0, cn.getString()));
        break;
      case CodeConstants.opc_newarray:
        stack.pop();
        stack.push(new VarType(arr_type[instr.operand(0) - 4], 1).resizeArrayDim(1));
        break;
      case CodeConstants.opc_athrow:
        var1 = stack.pop();
        stack.clear();
        stack.push(var1);
        break;
      case CodeConstants.opc_checkcast:
      case CodeConstants.opc_instanceof:
        stack.pop();
        cn = pool.getPrimitiveConstant(instr.operand(0));
        stack.push(new VarType(CodeConstants.TYPE_OBJECT, 0, cn.getString()));
        break;
      case CodeConstants.opc_anewarray:
      case CodeConstants.opc_multianewarray:
        int dimensions = (instr.opcode == CodeConstants.opc_anewarray) ? 1 : instr.operand(1);
        stack.pop(dimensions);
        cn = pool.getPrimitiveConstant(instr.operand(0));
        if (cn.isArray) {
          var1 = new VarType(CodeConstants.TYPE_OBJECT, 0, cn.getString());
          var1 = var1.resizeArrayDim(var1.getArrayDim() + dimensions);
          stack.push(var1);
        }
        else {
          stack.push(new VarType(CodeConstants.TYPE_OBJECT, dimensions, cn.getString()));
        }
    }
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/main/AssertProcessor.java
================================================
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.main;

import org.jetbrains.java.decompiler.code.CodeConstants;
import org.jetbrains.java.decompiler.code.cfg.BasicBlock;
import org.jetbrains.java.decompiler.main.ClassesProcessor.ClassNode;
import org.jetbrains.java.decompiler.main.collectors.CounterContainer;
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
import org.jetbrains.java.decompiler.main.rels.ClassWrapper;
import org.jetbrains.java.decompiler.main.rels.MethodWrapper;
import org.jetbrains.java.decompiler.modules.decompiler.SecondaryFunctionsHelper;
import org.jetbrains.java.decompiler.modules.decompiler.StatEdge;
import org.jetbrains.java.decompiler.modules.decompiler.StatEdge.EdgeType;
import org.jetbrains.java.decompiler.modules.decompiler.exps.*;
import org.jetbrains.java.decompiler.modules.decompiler.stats.*;
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement.StatementType;
import org.jetbrains.java.decompiler.struct.StructField;
import org.jetbrains.java.decompiler.struct.gen.FieldDescriptor;
import org.jetbrains.java.decompiler.struct.gen.VarType;
import org.jetbrains.java.decompiler.util.InterpreterUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public final class AssertProcessor {

  private static final VarType CLASS_ASSERTION_ERROR = new VarType(CodeConstants.TYPE_OBJECT, 0, "java/lang/AssertionError");

  public static void buildAssertions(ClassNode node) {

    ClassWrapper wrapper = node.getWrapper();

    StructField field = findAssertionField(node);

    if (field != null) {

      String key = InterpreterUtil.makeUniqueKey(field.getName(), field.getDescriptor());

      boolean res = false;

      for (MethodWrapper meth : wrapper.getMethods()) {
        RootStatement root = meth.root;
        if (root != null) {
          res |= replaceAssertions(root, wrapper.getClassStruct().qualifiedName, key);
        }
      }

      if (res) {
        // hide the helper field
        wrapper.getHiddenMembers().add(key);
      }
    }
  }

  private static StructField findAssertionField(ClassNode node) {

    ClassWrapper wrapper = node.getWrapper();

    boolean noSynthFlag = DecompilerContext.getOption(IFernflowerPreferences.SYNTHETIC_NOT_SET);

    for (StructField fd : wrapper.getClassStruct().getFields()) {

      String keyField = InterpreterUtil.makeUniqueKey(fd.getName(), fd.getDescriptor());

      // initializer exists
      if (wrapper.getStaticFieldInitializers().containsKey(keyField)) {

        // access flags set
        if (fd.hasModifier(CodeConstants.ACC_STATIC) && fd.hasModifier(CodeConstants.ACC_FINAL) && (noSynthFlag || fd.isSynthetic())) {

          // field type boolean
          FieldDescriptor fdescr = FieldDescriptor.parseDescriptor(fd.getDescriptor());
          if (VarType.VARTYPE_BOOLEAN.equals(fdescr.type)) {

            Exprent initializer = wrapper.getStaticFieldInitializers().getWithKey(keyField);
            if (initializer.type == Exprent.EXPRENT_FUNCTION) {
              FunctionExprent fexpr = (FunctionExprent)initializer;

              if (fexpr.getFuncType() == FunctionExprent.FUNCTION_BOOL_NOT &&
                  fexpr.getLstOperands().get(0).type == Exprent.EXPRENT_INVOCATION) {

                InvocationExprent invexpr = (InvocationExprent)fexpr.getLstOperands().get(0);

                if (invexpr.getInstance() != null &&
                    invexpr.getInstance().type == Exprent.EXPRENT_CONST &&
                    "desiredAssertionStatus".equals(invexpr.getName()) &&
                    "java/lang/Class".equals(invexpr.getClassName()) &&
                    invexpr.getParameters().isEmpty()) {

                  ConstExprent cexpr = (ConstExprent)invexpr.getInstance();
                  if (VarType.VARTYPE_CLASS.equals(cexpr.getConstType())) {

                    ClassNode nd = node;
                    while (nd != null) {
                      if (nd.getWrapper().getClassStruct().qualifiedName.equals(cexpr.getValue())) {
                        break;
                      }
                      nd = nd.parent;
                    }

                    if (nd != null) { // found enclosing class with the same name
                      return fd;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }


    return null;
  }


  private static boolean replaceAssertions(Statement statement, String classname, String key) {

    boolean res = false;

    for (Statement st : statement.getStats()) {
      res |= replaceAssertions(st, classname, key);
    }

    boolean replaced = true;
    while (replaced) {
      replaced = false;

      for (Statement st : statement.getStats()) {
        if (st.type == StatementType.IF) {
          if (replaceAssertion(statement, (IfStatement)st, classname, key)) {
            replaced = true;
            break;
          }
        }
      }

      res |= replaced;
    }

    return res;
  }

  private static boolean replaceAssertion(Statement parent, IfStatement stat, String classname, String key) {

    boolean throwInIf = true;
    Statement ifstat = stat.getIfstat();
    InvocationExprent throwError = isAssertionError(ifstat);

    if (throwError == null) {
      //check else:
      Statement elsestat = stat.getElsestat();
      throwError = isAssertionError(elsestat);
      if (throwError == null) {
          return false;
      }
      else {
          throwInIf = false;
      }
    }


    Object[] exprres = getAssertionExprent(stat.getHeadexprent().getCondition().copy(), classname, key, throwInIf);
    if (!(Boolean)exprres[1]) {
      return false;
    }

    List<Exprent> lstParams = new ArrayList<>();

    Exprent ascond = null, retcond = null;
    if (throwInIf) {
      if (exprres[0] != null) {
        ascond = new FunctionExprent(FunctionExprent.FUNCTION_BOOL_NOT, (Exprent)exprres[0], throwError.bytecode);
        retcond = SecondaryFunctionsHelper.propagateBoolNot(ascond);
      }
    }
    else {
        ascond =  (Exprent) exprres[0];
        retcond = ascond;
    }


    lstParams.add(retcond == null ? ascond : retcond);
    if (!throwError.getParameters().isEmpty()) {
      lstParams.add(throwError.getParameters().get(0));
    }

    AssertExprent asexpr = new AssertExprent(lstParams);

    Statement newstat = new BasicBlockStatement(new BasicBlock(
      DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER)));
    newstat.setExprents(Arrays.asList(new Exprent[]{asexpr}));

    Statement first = stat.getFirst();

    if (stat.iftype == IfStatement.IFTYPE_IFELSE || (first.getExprents() != null &&
                                                     !first.getExprents().isEmpty())) {

      first.removeSuccessor(stat.getIfEdge());
      first.removeSuccessor(stat.getElseEdge());

      List<Statement> lstStatements = new ArrayList<>();
      if (first.getExprents() != null && !first.getExprents().isEmpty()) {
        lstStatements.add(first);
      }
      lstStatements.add(newstat);
      if (stat.iftype == IfStatement.IFTYPE_IFELSE) {
        if (throwInIf) {
          lstStatements.add(stat.getElsestat());
        }
        else {
          lstStatements.add(stat.getIfstat());
        }
      }

      SequenceStatement sequence = new SequenceStatement(lstStatements);
      sequence.setAllParent();

      for (int i = 0; i < sequence.getStats().size() - 1; i++) {
        sequence.getStats().get(i).addSuccessor(new StatEdge(EdgeType.REGULAR,
                                                             sequence.getStats().get(i), sequence.getStats().get(i + 1)));
      }

      if (stat.iftype == IfStatement.IFTYPE_IFELSE || !throwInIf) {
        Statement stmts;
        if (throwInIf) {
          stmts = stat.getElsestat();
        }
        else {
          stmts = stat.getIfstat();
        }

        List<StatEdge> lstSuccs = stmts.getAllSuccessorEdges();
        if (!lstSuccs.isEmpty()) {
          StatEdge endedge = lstSuccs.get(0);
          if (endedge.closure == stat) {
            sequence.addLabeledEdge(endedge);
          }
        }
      }

      newstat = sequence;
    }

    newstat.getVarDefinitions().addAll(stat.getVarDefinitions());
    parent.replaceStatement(stat, newstat);

    return true;
  }

  private static InvocationExprent isAssertionError(Statement stat) {

    if (stat == null || stat.getExprents() == null || stat.getExprents().size() != 1) {
      return null;
    }

    Exprent expr = stat.getExprents().get(0);

    if (expr.type == Exprent.EXPRENT_EXIT) {
      ExitExprent exexpr = (ExitExprent)expr;
      if (exexpr.getExitType() == ExitExprent.EXIT_THROW && exexpr.getValue().type == Exprent.EXPRENT_NEW) {
        NewExprent nexpr = (NewExprent)exexpr.getValue();
        if (CLASS_ASSERTION_ERROR.equals(nexpr.getNewType()) && nexpr.getConstructor() != null) {
          return nexpr.getConstructor();
        }
      }
    }

    return null;
  }

  private static Object[] getAssertionExprent(Exprent exprent, String classname, String key, boolean throwInIf) {

    if (exprent.type == Exprent.EXPRENT_FUNCTION) {
      int desiredOperation = FunctionExprent.FUNCTION_CADD;
      if (!throwInIf) {
        desiredOperation = FunctionExprent.FUNCTION_COR;
      }

      FunctionExprent fexpr = (FunctionExprent)exprent;
      if (fexpr.getFuncType() == desiredOperation) {

        for (int i = 0; i < 2; i++) {
          Exprent param = fexpr.getLstOperands().get(i);

          if (isAssertionField(param, classname, key, throwInIf)) {
            return new Object[]{fexpr.getLstOperands().get(1 - i), true};
          }
        }

        for (int i = 0; i < 2; i++) {
          Exprent param = fexpr.getLstOperands().get(i);

          Object[] res = getAssertionExprent(param, classname, key, throwInIf);
          if ((Boolean)res[1]) {
            if (param != res[0]) {
              fexpr.getLstOperands().set(i, (Exprent)res[0]);
            }
            return new Object[]{fexpr, true};
          }
        }
      }
      else if (isAssertionField(fexpr, classname, key, throwInIf)) {
        // assert false;
        return new Object[]{null, true};
      }
    }

    return new Object[]{exprent, false};
  }

  private static boolean isAssertionField(Exprent exprent, String classname, String key, boolean throwInIf) {
    if (throwInIf) {
      if (exprent.type == Exprent.EXPRENT_FUNCTION) {
        FunctionExprent fparam = (FunctionExprent)exprent;
        if (fparam.getFuncType() == FunctionExprent.FUNCTION_BOOL_NOT &&
            fparam.getLstOperands().get(0).type == Exprent.EXPRENT_FIELD) {
          FieldExprent fdparam = (FieldExprent)fparam.getLstOperands().get(0);
          return classname.equals(fdparam.getClassname()) &&
                 key.equals(InterpreterUtil.makeUniqueKey(fdparam.getName(), fdparam.getDescriptor().descriptorString));
        }
      }
    }
    else {
      if (exprent.type == Exprent.EXPRENT_FIELD) {
        FieldExprent fdparam = (FieldExprent) exprent;
        return classname.equals(fdparam.getClassname()) &&
               key.equals(InterpreterUtil.makeUniqueKey(fdparam.getName(), fdparam.getDescriptor().descriptorString));
      }
    }
    return false;
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/main/CancellationManager.java
================================================
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.java.decompiler.main;

import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

@ApiStatus.Experimental
public interface CancellationManager {
  /**
   * @throws CanceledException if the process has been canceled.
   */
  void checkCanceled() throws CanceledException;

  /**
   * Called every time the body of a new method is started to be decompiled
   */
  void startMethod(String className, String methodName);

  /**
   * Called every time the method decompilation is finished
   */
  void finishMethod(String className, String methodName);

  @ApiStatus.Experimental
  class CanceledException extends RuntimeException {

    public CanceledException(@NotNull Throwable cause) {
      super(cause);
    }

    public CanceledException() {
      super();
    }
  }

  @ApiStatus.Experimental
  class TimeExceedException extends CanceledException {
  }

  static CancellationManager getSimpleWithTimeout(int maxMethodTimeoutSec) {
    return new TimeoutCancellationManager(maxMethodTimeoutSec);
  }

  class TimeoutCancellationManager implements CancellationManager {
    private final long maxMilis;
    private long startMilis = 0;

    protected TimeoutCancellationManager(int maxMethodTimeoutSec) {
      this.maxMilis = maxMethodTimeoutSec * 1000L;
    }

    @Override
    public void checkCanceled() throws CanceledException {
      if (maxMilis <= 0 || startMilis <= 0) {
        return;
      }
      long timeMillis = System.currentTimeMillis();
      if (timeMillis - startMilis > maxMilis) {
        throw new TimeExceedException();
      }
    }

    @Override
    public void startMethod(String className, String methodName) {
      startMilis = System.currentTimeMillis();
    }

    @Override
    public void finishMethod(String className, String methodName) {
      startMilis = 0;
    }
  }
}


================================================
FILE: src/org/jetbrains/java/decompiler/main/ClassReference14Processor.java
================================================
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.java.decompiler.main;

import org.jetbrains.java.decompiler.code.CodeConstants;
import org.jetbrains.java.decompiler.main.ClassesProcessor.ClassNode;
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
import org.jetbrains.java.decompiler.main.rels.ClassWrapper;
import org.jetbrains.java.decompiler.main.rels.MethodWrapper;
import org.jetbrains.java.decompiler.modules.decompiler.exps.*;
import org.jetbrains.java.decompiler.modules.decompiler.sforms.DirectGraph;
import org.jetbrains.java.decompiler.modules.decompiler.stats.BasicBlockStatement;
import org.jetbrains.java.decompiler.modules.decompiler.stats.CatchStatement;
import org.jetbrains.java.decompiler.modules.decompiler.stats.RootStatement;
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement.StatementType;
import org.jetbrains.java.decompiler.struct.StructField;
import org.jetbrains.java.decompiler.struct.StructMethod;
import org.jetbrains.java.decompiler.struct.gen.MethodDescriptor;
import org.jetbrains.java.decompiler.struct.gen.VarType;
import org.jetbrains.java.decompiler.util.InterpreterUtil;
import org.jetbrains.java.decompiler.util.VBStyleCollection;

import java.util.*;
import java.util.Map.Entry;

public final class ClassReference14Processor {
  private static final ExitExprent BODY_EXPR;
  private static final ExitExprent HANDLER_EXPR;

  static {
    InvocationExprent invFor = new InvocationExprent();
    invFor.setName("forName");
    invFor.setClassName("java/lang/Class");
    invFor.setStringDescriptor("(Ljava/lang/String;)Ljava/lang/Class;");
    invFor.setDescriptor(MethodDescriptor.parseDescriptor("(Ljava/lang/String;)Ljava/lang/Class;"));
    invFor.setStatic(true);
    invFor.setParameters(Collections.singletonList(new VarExprent(0, VarType.VARTYPE_STRING, null)));
    BODY_EXPR = new ExitExprent(ExitExprent.EXIT_RETURN, invFor, VarType.VARTYPE_CLASS, null);

    InvocationExprent ctor = new InvocationExprent();
    ctor.setName(CodeConstants.INIT_NAME);
    ctor.setClassName("java/lang/NoClassDefFoundError");
    ctor.setStringDescriptor("()V");
    ctor.setFuncType(InvocationExprent.TYPE_INIT);
    ctor.setDescriptor(MethodDescriptor.parseDescriptor("()V"));
    NewExprent newExpr = new NewExprent(new VarType(CodeConstants.TYPE_OBJECT, 0, "java/lang/NoClassDefFoundError"), new ArrayList<>(), null);
    newExpr.setConstructor(ctor);
    InvocationExprent invCause = new InvocationExprent();
    invCause.setName("initCause");
    invCause.setClassName("java/lang/NoClassDefFoundError");
    invCause.setStringDescriptor("(Ljava/lang/Throwable;)Ljava/lang/Throwable;");
    invCause.setDescriptor(MethodDescriptor.parseDescriptor("(Ljava/lang/Throwable;)Ljava/lang/Throwable;"));
    invCause.setInstance(newExpr);
    invCause.setParameters(
      Collections.singletonList(new VarExprent(2, new VarType(CodeConstants.TYPE_OBJECT, 0, "java/lang/ClassNotFoundException"), null)));
    HANDLER_EXPR = new ExitExprent(ExitExprent.EXIT_THROW, invCause, null, null);
  }

  public static void processClassReferences(ClassNode node) {
    // find the synthetic method Class class$(String) if present
    Map<ClassWrapper, MethodWrapper> mapClassMeths = new HashMap<>();
    mapClassMethods(node, mapClassMeths);
    if (mapClassMeths.isEmpty()) {
      return;
    }

    Set<ClassWrapper> setFound = new HashSet<>();
    processClassRec(node, mapClassMeths, setFound);

    if (!setFound.isEmpty()) {
      for (ClassWrapper wrp : setFound) {
        StructMethod mt = mapClassMeths.get(wrp).methodStruct;
        wrp.getHiddenMembers().add(InterpreterUtil.makeUniqueKey(mt.getName(), mt.getDescriptor()));
      }
    }
  }

  private static void processClassRec(ClassNode node, Map<ClassWrapper, MethodWrapper> mapClassMeths, Set<? super ClassWrapper> setFound) {
    ClassWrapper wrapper = node.getWrapper();

    // search code
    for (MethodWrapper meth : wrapper.getMethods()) {
      RootStatement root = meth.root;
      if (root != null) {
        DirectGraph graph = meth.getOrBuildGraph();
        graph.iterateExprents(exprent -> {
          for (Entry<ClassWrapper, MethodWrapper> ent : mapClassMeths.entrySet()) {
            if (replaceInvocations(exprent, ent.getKey(), ent.getValue())) {
              setFound.add(ent.getKey());
            }
          }
          return 0;
        });
      }
    }

    // search initializers
    for (int j = 0; j < 2; j++) {
      VBStyleCollection<Exprent, String> initializers =
        j == 0 ? wrapper.getStaticFieldInitializers() : wrapper.getDynamicFieldInitializers();

      for (int i = 0; i < initializers.size(); i++) {
        for (Entry<ClassWrapper, MethodWrapper> ent : mapClassMeths.entrySet()) {
          Exprent exprent = initializers.get(i);
          if (replaceInvocations(exprent, ent.getKey(), ent.getValue())) {
            setFound.add(ent.getKey());
          }

          String cl = isClass14Invocation(exprent, ent.getKey(), ent.getValue());
          if (cl != null) {
            initializers.set(i, new ConstExprent(VarType.VARTYPE_CLASS, cl.replace('.', '/'), exprent.bytecode));
            setFound.add(ent.getKey());
          }
        }
      }
    }

    // iterate nested classes
    for (ClassNode nd : node.nested) {
      processClassRec(nd, mapClassMeths, setFound);
    }
  }

  private static void mapClassMethods(ClassNode node, Map<ClassWrapper, MethodWrapper> map) {
    boolean noSynthFlag = DecompilerContext.getOption(IFernflowerPreferences.SYNTHETIC_NOT_SET);

    ClassWrapper wrapper = node.getWrapper();

    for (MethodWrapper method : wrapper.getMethods()) {
      StructMethod mt = method.methodStruct;

      if ((noSynthFlag || mt.isSynthetic()) &&
          mt.getDescriptor().equals("(Ljava/lang/String;)Ljava/lang/Class;") &&
          mt.hasModifier(CodeConstants.ACC_STATIC)) {

        RootStatement root = method.root;
        if (root != null && root.getFirst().type == StatementType.TRY_CATCH) {
          CatchStatement cst = (CatchStatement)root.getFirst();
          if (cst.getStats().size() == 2 && cst.getFirst().type == StatementType.BASIC_BLOCK &&
              cst.getStats().get(1).type == StatementType.BASIC_BLOCK &&
              cst.getVars().get(0).getVarType().equals(new VarType(CodeConstants.TYPE_OBJECT, 0, "java/lang/ClassNotFoundException"))) {

            BasicBlockStatement body = (BasicBlockStatement)cst.getFirst();
            BasicBlockStatement handler = (BasicBlockStatement)cst.getStats().get(1);

            if (body.getExprents().size() == 1 && handler.getExprents().size() == 1) {
              if (BODY_EXPR.equals(body.getExprents().get(0)) &&
                  HANDLER_EXPR.equals(handler.getExprents().get(0))) {
                map.put(wrapper, method);
                break;
              }
            }
          }
        }
      }
    }

    // iterate nested classes
    for (ClassNode nd : node.nested) {
      mapClassMethods(nd, map);
    }
  }

  private static boolean replaceInvocations(Exprent exprent, ClassWrapper wrapper, MethodWrapper meth) {
    boolean res = false;

    while (true) {
      boolean found = false;

      for (Exprent expr : exprent.getAllExprents()) {
        String cl = isClass14Invocation(expr, wrapper, meth);
        if (cl != null) {
          exprent.replaceExprent(expr, new ConstExprent(VarType.VARTYPE_CLASS, cl.replace('.', '/'), expr.bytecode));
          found = true;
          res = true;
          break;
        }

        res |= replaceInvocations(expr, wrapper, meth);
      }

      if (!found) {
        break;
      }
    }

    return res;
  }

  private static String isClass14Invocation(Exprent exprent, ClassWrapper wrapper, MethodWrapper meth) {
    if (exprent.type == Exprent.EXPRENT_FUNCTION) {
      FunctionExprent fexpr = (FunctionExprent)exprent;
      if (fexpr.getFuncType() == FunctionExprent.FUNCTION_IIF) {
        if (fexpr.getLstOperands().get(0).type == Exprent.EXPRENT_FUNCTION) {
          FunctionExprent headexpr = (FunctionExprent)fexpr.getLstOperands().get(0);
          if (headexpr.getFuncType() == FunctionExprent.FUNCTION_EQ) {
            if (headexpr.getLstOperands().get(0).type == Exprent.EXPRENT_FIELD &&
                headexpr.getLstOperands().get(1).type == Exprent.EXPRENT_CONST &&
                ((ConstExprent)headexpr.getLstOperands().get(1)).getConstType().equals(VarType.VARTYPE_NULL)) {

              FieldExprent field = (FieldExprent)headexpr.getLstOperands().get(0);
              ClassNode fieldnode = DecompilerContext.getClassProcessor().getMapRootClasses().get(field.getClassname());

              if (fieldnode != null && fieldnode.classStruct.qualifiedName.equals(wrapper.getClassStruct().qualifiedName)) { // source class
                StructField fd =
                  wrapper.getClassStruct().getField(field.getName(), field.getDescriptor().descriptorString);  // FIXME: can be null! why??

                if (fd != null && fd.hasModifier(CodeConstants.ACC_STATIC) &&
                    (fd.isSynthetic() || DecompilerContext.getOption(IFernflowerPreferences.SYNTHETIC_NOT_SET))) {

                  if (fexpr.getLstOperands().get(1).type == Exprent.EXPRENT_ASSIGNMENT && fexpr.getLstOperands().get(2).equals(field)) {
                    AssignmentExprent asexpr = (AssignmentExprent)fexpr.getLstOperands().get(1);

                    if (asexpr.getLeft().equals(field) && asexpr.getRight().type == Exprent.EXPRENT_INVOCATION) {
                      InvocationExprent invexpr = (InvocationExprent)asexpr.getRight();

                      if (invexpr.getClassName().equals(wrapper.getClassStruct().qualifiedName) &&
                          invexpr.getName().equals(meth.methodStruct.getName()) &&
                          invexpr.getStringDescriptor().equals(meth.methodStruct.getDescriptor())) {

                        if (invexpr.getParameters().get(0).type == Exprent.EXPRENT_CONST) {
                          wrapper.getHiddenMembers()
                            .add(InterpreterUtil.makeUniqueKey(fd.getName(), fd.getDescriptor()));  // hide synthetic field
                          return ((ConstExprent)invexpr.getParameters().get(0)).getValue().toString();
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    return null;
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/main/ClassWriter.java
================================================
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.java.decompiler.main;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.java.decompiler.code.CodeConstants;
import org.jetbrains.java.decompiler.main.ClassesProcessor.ClassNode;
import org.jetbrains.java.decompiler.main.collectors.BytecodeMappingTracer;
import org.jetbrains.java.decompiler.main.extern.IFernflowerLogger;
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
import org.jetbrains.java.decompiler.main.rels.ClassWrapper;
import org.jetbrains.java.decompiler.main.rels.MethodWrapper;
import org.jetbrains.java.decompiler.modules.decompiler.ExprProcessor;
import org.jetbrains.java.decompiler.modules.decompiler.exps.AnnotationExprent;
import org.jetbrains.java.decompiler.modules.decompiler.exps.ConstExprent;
import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent;
import org.jetbrains.java.decompiler.modules.decompiler.exps.NewExprent;
import org.jetbrains.java.decompiler.modules.decompiler.stats.RootStatement;
import org.jetbrains.java.decompiler.modules.decompiler.typeann.TargetInfo;
import org.jetbrains.java.decompiler.modules.decompiler.typeann.TypeAnnotation;
import org.jetbrains.java.decompiler.modules.decompiler.typeann.TypeAnnotationWriteHelper;
import org.jetbrains.java.decompiler.modules.decompiler.vars.VarProcessor;
import org.jetbrains.java.decompiler.modules.decompiler.vars.VarVersionPair;
import org.jetbrains.java.decompiler.modules.renamer.PoolInterceptor;
import org.jetbrains.java.decompiler.struct.*;
import org.jetbrains.java.decompiler.struct.attr.*;
import org.jetbrains.java.decompiler.struct.consts.PrimitiveConstant;
import org.jetbrains.java.decompiler.struct.gen.FieldDescriptor;
import org.jetbrains.java.decompiler.struct.gen.MethodDescriptor;
import org.jetbrains.java.decompiler.struct.gen.Type;
import org.jetbrains.java.decompiler.struct.gen.VarType;
import org.jetbrains.java.decompiler.struct.gen.generics.*;
import org.jetbrains.java.decompiler.util.InterpreterUtil;
import org.jetbrains.java.decompiler.util.TextBuffer;

import java.util.*;
import java.util.stream.Collectors;

public class ClassWriter {
  private final PoolInterceptor interceptor;

  public ClassWriter() {
    interceptor = DecompilerContext.getPoolInterceptor();
  }

  private static void invokeProcessors(ClassNode node) {
    ClassWrapper wrapper = node.getWrapper();
    StructClass cl = wrapper.getClassStruct();

    InitializerProcessor.extractInitializers(wrapper);

    if (node.type == ClassNode.CLASS_ROOT &&
        !cl.isVersion5() &&
        DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_CLASS_1_4)) {
      ClassReference14Processor.processClassReferences(node);
    }

    if (cl.hasModifier(CodeConstants.ACC_ENUM) && DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_ENUM)) {
      EnumProcessor.clearEnum(wrapper);
    }

    if (DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_ASSERTIONS)) {
      AssertProcessor.buildAssertions(node);
    }
  }

  public void classLambdaToJava(ClassNode node, TextBuffer buffer, Exprent method_object, int indent, BytecodeMappingTracer origTracer) {
    ClassWrapper wrapper = node.getWrapper();
    if (wrapper == null) {
      return;
    }

    boolean lambdaToAnonymous = DecompilerContext.getOption(IFernflowerPreferences.LAMBDA_TO_ANONYMOUS_CLASS);

    ClassNode outerNode = (ClassNode)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_NODE);
    DecompilerContext.setProperty(DecompilerContext.CURRENT_CLASS_NODE, node);

    BytecodeMappingTracer tracer = new BytecodeMappingTracer(origTracer.getCurrentSourceLine());

    try {
      StructClass cl = wrapper.getClassStruct();

      DecompilerContext.getLogger().startWriteClass(node.simpleName);

      if (node.lambdaInformation.is_method_reference) {
        if (!node.lambdaInformation.is_content_method_static && method_object != null) {
          // reference to a virtual method
          buffer.append(method_object.toJava(indent, tracer));
        }
        else {
          // reference to a static method
          buffer.append(ExprProcessor.getCastTypeName(new VarType(node.lambdaInformation.content_class_name, true), Collections.emptyList()));
        }

        buffer.append("::")
          .append(CodeConstants.INIT_NAME.equals(node.lambdaInformation.content_method_name) ? "new" : node.lambdaInformation.content_method_name);
      }
      else {
        // lambda method
        StructMethod mt = cl.getMethod(node.lambdaInformation.content_method_key);
        MethodWrapper methodWrapper = wrapper.getMethodWrapper(mt.getName(), mt.getDescriptor());
        MethodDescriptor md_content = MethodDescriptor.parseDescriptor(node.lambdaInformation.content_method_descriptor);
        MethodDescriptor md_lambda = MethodDescriptor.parseDescriptor(node.lambdaInformation.method_descriptor);

        List<TypeAnnotation> parameterTypeAnnotations = TargetInfo.FormalParameterTarget.extract(TypeAnnotation.listFrom(mt));
        boolean explicitlyTyped = !parameterTypeAnnotations.isEmpty();

        if (!lambdaToAnonymous) {
          buffer.append('(');

          boolean firstParameter = true;
          int index = node.lambdaInformation.is_content_method_static ? 0 : 1;
          int start_index = md_content.params.length - md_lambda.params.length;

          for (int i = 0; i < md_content.params.length; i++) {
            if (i >= start_index) {
              if (!firstParameter) {
                buffer.append(", ");
              }

              if (explicitlyTyped) {
                List<TypeAnnotation> iParameterTypeAnnotations = TargetInfo.FormalParameterTarget.extract(parameterTypeAnnotations, i);
                VarType type = md_content.params[i];
                buffer.append(ExprProcessor.getCastTypeName(type, TypeAnnotationWriteHelper.create(iParameterTypeAnnotations)));
                buffer.append(' ');
              }

              String parameterName = methodWrapper.varproc.getVarName(new VarVersionPair(index, 0));
              buffer.append(parameterName == null ? "param" + index : parameterName); // null iff decompiled with errors

              firstParameter = false;
            }

            index += md_content.params[i].getStackSize();
          }

          buffer.append(") ->");
        }

        buffer.append(" {").appendLineSeparator();
        tracer.incrementCurrentSourceLine();

        methodLambdaToJava(node, wrapper, mt, buffer, indent + 1, !lambdaToAnonymous, tracer);

        buffer.appendIndent(indent).append("}");

        addTracer(cl, mt, tracer);
      }
    }
    finally {
      DecompilerContext.setProperty(DecompilerContext.CURRENT_CLASS_NODE, outerNode);
    }

    DecompilerContext.getLogger().endWriteClass();
  }

  public void classToJava(ClassNode node, TextBuffer buffer, int indent, BytecodeMappingTracer tracer) {
    ClassNode outerNode = (ClassNode)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_NODE);
    DecompilerContext.setProperty(DecompilerContext.CURRENT_CLASS_NODE, node);

    int startLine = tracer != null ? tracer.getCurrentSourceLine() : 0;
    BytecodeMappingTracer dummy_tracer = new BytecodeMappingTracer(startLine);

    try {
      // last minute processing
      invokeProcessors(node);

      ClassWrapper wrapper = node.getWrapper();
      StructClass cl = wrapper.getClassStruct();

      DecompilerContext.getLogger().startWriteClass(cl.qualifiedName);

      // write class definition
      int start_class_def = buffer.length();
      writeClassDefinition(node, buffer, indent);

      boolean hasContent = false;
      boolean enumFields = false;

      dummy_tracer.incrementCurrentSourceLine(buffer.countLines(start_class_def));

      List<StructRecordComponent> components = cl.getRecordComponents();

      for (StructField fd : cl.getFields()) {
        boolean hide = fd.isSynthetic() && DecompilerContext.getOption(IFernflowerPreferences.REMOVE_SYNTHETIC) ||
                       wrapper.getHiddenMembers().contains(InterpreterUtil.makeUniqueKey(fd.getName(), fd.getDescriptor()));
        if (hide) continue;

        if (components != null && fd.getAccessFlags() == (CodeConstants.ACC_FINAL | CodeConstants.ACC_PRIVATE) &&
            components.stream().anyMatch(c -> c.getName().equals(fd.getName()) && c.getDescriptor().equals(fd.getDescriptor()))) {
          // Record component field: skip it
          continue;
        }

        boolean isEnum = fd.hasModifier(CodeConstants.ACC_ENUM) && DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_ENUM);
        if (isEnum) {
          if (enumFields) {
            buffer.append(',').appendLineSeparator();
            dummy_tracer.incrementCurrentSourceLine();
          }
          enumFields = true;
        }
        else if (enumFields) {
          buffer.append(';');
          buffer.appendLineSeparator();
          buffer.appendLineSeparator();
          dummy_tracer.incrementCurrentSourceLine(2);
          enumFields = false;
        }

        fieldToJava(wrapper, cl, fd, buffer, indent + 1, dummy_tracer); // FIXME: insert real tracer

        hasContent = true;
      }

      if (enumFields) {
        buffer.append(';').appendLineSeparator();
        dummy_tracer.incrementCurrentSourceLine();
      }

      // FIXME: fields don't matter at the moment
      startLine += buffer.countLines(start_class_def);

      // methods
      for (StructMethod mt : cl.getMethods()) {
        boolean hide = mt.isSynthetic() && DecompilerContext.getOption(IFernflowerPreferences.REMOVE_SYNTHETIC) ||
                       mt.hasModifier(CodeConstants.ACC_BRIDGE) && DecompilerContext.getOption(IFernflowerPreferences.REMOVE_BRIDGE) ||
                       wrapper.getHiddenMembers().contains(InterpreterUtil.makeUniqueKey(mt.getName(), mt.getDescriptor()));
        if (hide) continue;

        int position = buffer.length();
        int storedLine = startLine;
        if (hasContent) {
          buffer.appendLineSeparator();
          startLine++;
        }
        BytecodeMappingTracer method_tracer = new BytecodeMappingTracer(startLine);
        boolean methodSkipped = !methodToJava(node, mt, buffer, indent + 1, method_tracer);
        if (!methodSkipped) {
          hasContent = true;
          addTracer(cl, mt, method_tracer);
          startLine = method_tracer.getCurrentSourceLine();
        }
        else {
          buffer.setLength(position);
          startLine = storedLine;
        }
      }

      // member classes
      for (ClassNode inner : node.nested) {
        if (inner.type == ClassNode.CLASS_MEMBER) {
          StructClass innerCl = inner.classStruct;
          boolean isSynthetic = (inner.access & CodeConstants.ACC_SYNTHETIC) != 0 || innerCl.isSynthetic();
          boolean hide = isSynthetic && DecompilerContext.getOption(IFernflowerPreferences.REMOVE_SYNTHETIC) ||
                         wrapper.getHiddenMembers().contains(innerCl.qualifiedName);
          if (hide) continue;

          if (hasContent) {
            buffer.appendLineSeparator();
            startLine++;
          }
          BytecodeMappingTracer class_tracer = new BytecodeMappingTracer(startLine);
          classToJava(inner, buffer, indent + 1, class_tracer);
          startLine = buffer.countLines();

          hasContent = true;
        }
      }

      buffer.appendIndent(indent).append('}');

      if (node.type != ClassNode.CLASS_ANONYMOUS) {
        buffer.appendLineSeparator();
      }
    }
    finally {
      DecompilerContext.setProperty(DecompilerContext.CURRENT_CLASS_NODE, outerNode);
    }

    DecompilerContext.getLogger().endWriteClass();
  }

  @SuppressWarnings("SpellCheckingInspection")
  private static boolean isSyntheticRecordMethod(StructClass cl, StructMethod mt, TextBuffer code) {
    if (cl.getRecordComponents() != null) {
      String name = mt.getName(), descriptor = mt.getDescriptor();
      if (name.equals("equals") && descriptor.equals("(Ljava/lang/Object;)Z") ||
          name.equals("hashCode") && descriptor.equals("()I") ||
          name.equals("toString") && descriptor.equals("()Ljava/lang/String;")) {
        if (code.countLines() == 1) {
          String str = code.toString().trim();
          return str.startsWith("return this." + name + "<invokedynamic>(this");
        }
      }
    }
    return false;
  }

  private void writeClassDefinition(ClassNode node, TextBuffer buffer, int indent) {
    if (node.type == ClassNode.CLASS_ANONYMOUS) {
      buffer.append(" {").appendLineSeparator();
      return;
    }

    ClassWrapper wrapper = node.getWrapper();
    StructClass cl = wrapper.getClassStruct();

    int flags = node.type == ClassNode.CLASS_ROOT ? cl.getAccessFlags() : node.access;
    boolean isDeprecated = cl.hasAttribute(StructGeneralAttribute.ATTRIBUTE_DEPRECATED);
    boolean isSynthetic = (flags & CodeConstants.ACC_SYNTHETIC) != 0 || cl.hasAttribute(StructGeneralAttribute.ATTRIBUTE_SYNTHETIC);
    boolean isEnum = DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_ENUM) && (flags & CodeConstants.ACC_ENUM) != 0;
    boolean isInterface = (flags & CodeConstants.ACC_INTERFACE) != 0;
    boolean isAnnotation = (flags & CodeConstants.ACC_ANNOTATION) != 0;

    if (isDeprecated) {
      appendDeprecation(buffer, indent);
    }

    if (interceptor != null) {
      String oldName = interceptor.getOldName(cl.qualifiedName);
      appendRenameComment(buffer, oldName, MType.CLASS, indent);
    }

    if (isSynthetic) {
      appendComment(buffer, "synthetic class", indent);
    }

    appendAnnotations(buffer, indent, cl);

    buffer.appendIndent(indent);

    if (isEnum) {
      // remove abstract and final flags (JLS 8.9 Enums)
      flags &= ~CodeConstants.ACC_ABSTRACT;
      flags &= ~CodeConstants.ACC_FINAL;
    }

    List<StructRecordComponent> components = cl.getRecordComponents();
    List<String> permittedSubclassQualifiedNames = cl.getPermittedSubclasses();

    if (components != null) {
      // records are implicitly final
      flags &= ~CodeConstants.ACC_FINAL;
    }

    appendModifiers(buffer, flags, CLASS_ALLOWED, isInterface, CLASS_EXCLUDED);

    if (permittedSubclassQualifiedNames != null && !isEnum) {
      buffer.append("sealed ");
    }
    else if (node.isNonSealed()) {
      buffer.append("non-sealed ");
    }

    if (isEnum) {
      buffer.append("enum ");
    }
    else if (isInterface) {
      if (isAnnotation) {
        buffer.append('@');
      }
      buffer.append("interface ");
    }
    else if (components != null) {
      buffer.append("record ");
    }
    else {
      buffer.append("class ");
    }
    buffer.append(node.simpleName);

    List<TypeAnnotation> typeAnnotations = TypeAnnotation.listFrom(cl);

    GenericClassDescriptor descriptor = getGenericClassDescriptor(cl);
    if (descriptor != null && !descriptor.fparameters.isEmpty()) {
      appendTypeParameters(buffer, descriptor.fparameters, descriptor.fbounds, typeAnnotations);
    }

    if (components != null) {
      buffer.append('(');
      for (int i = 0; i < components.size(); i++) {
        StructRecordComponent cd = components.get(i);
        if (i > 0) {
          buffer.append(", ");
        }
        boolean varArgComponent = i == components.size() - 1 && isVarArgRecord(cl);
        recordComponentToJava(cd, buffer, varArgComponent);
      }
      buffer.append(')');
    }

    buffer.append(' ');

    if (!isEnum && !isInterface && components == null && cl.superClass != null) {
      VarType supertype = new VarType(cl.superClass.getString(), true);
      List<TypeAnnotation> extendsTypeAnnotations = TargetInfo.SupertypeTarget.extractExtends(typeAnnotations);
      if (!VarType.VARTYPE_OBJECT.equals(supertype)) {
        buffer.append("extends ");
        if (descriptor != null) {
          buffer.append(GenericMain.getGenericCastTypeName(
            descriptor.superclass,
            TypeAnnotationWriteHelper.create(extendsTypeAnnotations))
          );
        }
        else {
          buffer.append(ExprProcessor.getCastTypeName(supertype, TypeAnnotationWriteHelper.create(extendsTypeAnnotations)));
        }
        buffer.append(' ');
      }
    }

    if (!isAnnotation) {
      int[] interfaces = cl.getInterfaces();
      if (interfaces.length > 0) {
        buffer.append(isInterface ? "extends " : "implements ");
        for (int i = 0; i < interfaces.length; i++) {
          if (i > 0) {
            buffer.append(", ");
          }
          List<TypeAnnotation> superTypeAnnotations = TargetInfo.SupertypeTarget.extract(typeAnnotations, i);
          if (descriptor != null) {
            buffer.append(GenericMain.getGenericCastTypeName(
              descriptor.superinterfaces.get(i),
              TypeAnnotationWriteHelper.create(superTypeAnnotations))
            );
          }
          else {
            buffer.append(ExprProcessor.getCastTypeName(
              new VarType(cl.getInterface(i), true),
              TypeAnnotationWriteHelper.create(superTypeAnnotations))
            );
          }
        }
        buffer.append(' ');
      }
    }

    if (permittedSubclassQualifiedNames != null && !permittedSubclassQualifiedNames.isEmpty()) {
      Set<String> qualifiedNested = node.nested.stream()
        .map(nestedNode -> nestedNode.classStruct.qualifiedName)
        .collect(Collectors.toSet());
      boolean allSubClassesAreNested = qualifiedNested.containsAll(permittedSubclassQualifiedNames);
      if (!allSubClassesAreNested) { // only generate permits lists for non-nested classes
        buffer.append("permits ");
        for (int i = 0; i < permittedSubclassQualifiedNames.size(); i++) {
          String qualifiedName = permittedSubclassQualifiedNames.get(i);
          if (i > 0) {
            buffer.append(", ");
          }
          String nestedName = DecompilerContext.getImportCollector().getNestedName(qualifiedName);
          buffer.append(nestedName);
        }
        buffer.append(' ');
      }
    }
    buffer.append('{').appendLineSeparator();
  }

  private void fieldToJava(ClassWrapper wrapper, StructClass cl, StructField fd, TextBuffer buffer, int indent, BytecodeMappingTracer tracer) {
    int start = buffer.length();
    boolean isInterface = cl.hasModifier(CodeConstants.ACC_INTERFACE);
    boolean isDeprecated = fd.hasAttribute(StructGeneralAttribute.ATTRIBUTE_DEPRECATED);
    boolean isEnum = fd.hasModifier(CodeConstants.ACC_ENUM) && DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_ENUM);

    if (isDeprecated) {
      appendDeprecation(buffer, indent);
    }

    if (interceptor != null) {
      String oldName = interceptor.getOldName(cl.qualifiedName + " " + fd.getName() + " " + fd.getDescriptor());
      appendRenameComment(buffer, oldName, MType.FIELD, indent);
    }

    if (fd.isSynthetic()) {
      appendComment(buffer, "synthetic field", indent);
    }

    Map.Entry<VarType, GenericFieldDescriptor> fieldTypeData = getFieldTypeData(fd);
    VarType fieldType = fieldTypeData.getKey();

    appendAnnotations(buffer, indent, fd);

    buffer.appendIndent(indent);

    if (!isEnum) {
      appendModifiers(buffer, fd.getAccessFlags(), FIELD_ALLOWED, isInterface, FIELD_EXCLUDED);
    }

    GenericFieldDescriptor descriptor = fieldTypeData.getValue();

    final List<TypeAnnotation> typeAnnotations = TypeAnnotation.listFrom(fd);

    if (!isEnum) {
      if (descriptor != null) {
        buffer.append(GenericMain.getGenericCastTypeName(descriptor.type, TypeAnnotationWriteHelper.create(typeAnnotations)));
      }
      else {
        buffer.append(ExprProcessor.getCastTypeName(fieldType, TypeAnnotationWriteHelper.create(typeAnnotations)));
      }
      buffer.append(' ');
    }

    buffer.append(fd.getName());

    tracer.incrementCurrentSourceLine(buffer.countLines(start));

    Exprent initializer;
    if (fd.hasModifier(CodeConstants.ACC_STATIC)) {
      initializer = wrapper.getStaticFieldInitializers().getWithKey(InterpreterUtil.makeUniqueKey(fd.getName(), fd.getDescriptor()));
    }
    else {
      initializer = wrapper.getDynamicFieldInitializers().getWithKey(InterpreterUtil.makeUniqueKey(fd.getName(), fd.getDescriptor()));
    }
    if (initializer != null) {
      if (isEnum && initializer.type == Exprent.EXPRENT_NEW) {
        NewExprent expr = (NewExprent)initializer;
        expr.setEnumConst(true);
        buffer.append(expr.toJava(indent, tracer));
      }
      else {
        buffer.append(" = ");

        if (initializer.type == Exprent.EXPRENT_CONST) {
          ((ConstExprent) initializer).adjustConstType(fieldType);
        }

        // FIXME: special case field initializer. Can map to more than one method (constructor) and bytecode instruction
        buffer.append(initializer.toJava(indent, tracer));
      }
    }
    else if (fd.hasModifier(CodeConstants.ACC_FINAL) && fd.hasModifier(CodeConstants.ACC_STATIC)) {
      StructConstantValueAttribute attr = fd.getAttribute(StructGeneralAttribute.ATTRIBUTE_CONSTANT_VALUE);
      if (attr != null) {
        PrimitiveConstant constant = cl.getPool().getPrimitiveConstant(attr.getIndex());
        buffer.append(" = ");
        buffer.append(new ConstExprent(fieldType, constant.value, null, fd).toJava(indent, tracer));
      }
    }

    if (!isEnum) {
      buffer.append(';').appendLineSeparator();
      tracer.incrementCurrentSourceLine();
    }
  }

  private static void writeModuleInfoBody(TextBuffer buffer, StructModuleAttribute moduleAttribute) {
    boolean newLineNeeded = false;

    List<StructModuleAttribute.RequiresEntry> requiresEntries = moduleAttribute.requires;
    if (!requiresEntries.isEmpty()) {
      for (StructModuleAttribute.RequiresEntry requires : requiresEntries) {
        if (!isGenerated(requires.flags)) {
          buffer.appendIndent(1).append("requires ");
          if ((requires.flags & CodeConstants.ACC_STATIC_PHASE) != 0) buffer.append("static ");
          if ((requires.flags & CodeConstants.ACC_TRANSITIVE) != 0) buffer.append("transitive ");
          buffer.append(requires.moduleName.replace('/', '.')).append(';').appendLineSeparator();
          newLineNeeded = true;
        }
      }
    }

    List<StructModuleAttribute.ExportsEntry> exportsEntries = moduleAttribute.exports;
    if (!exportsEntries.isEmpty()) {
      if (newLineNeeded) buffer.appendLineSeparator();
      for (StructModuleAttribute.ExportsEntry exports : exportsEntries) {
        if (!isGenerated(exports.flags)) {
          buffer.appendIndent(1).append("exports ").append(exports.packageName.replace('/', '.'));
          List<String> exportToModules = exports.exportToModules;
          if (!exportToModules.isEmpty()) {
            buffer.append(" to").appendLineSeparator();
            appendFQClassNames(buffer, exportToModules);
          }
          buffer.append(';').appendLineSeparator();
          newLineNeeded = true;
        }
      }
    }

    List<StructModuleAttribute.OpensEntry> opensEntries = moduleAttribute.opens;
    if (!opensEntries.isEmpty()) {
      if (newLineNeeded) buffer.appendLineSeparator();
      for (StructModuleAttribute.OpensEntry opens : opensEntries) {
        if (!isGenerated(opens.flags)) {
          buffer.appendIndent(1).append("opens ").append(opens.packageName.replace('/', '.'));
          List<String> opensToModules = opens.opensToModules;
          if (!opensToModules.isEmpty()) {
            buffer.append(" to").appendLineSeparator();
            appendFQClassNames(buffer, opensToModules);
          }
          buffer.append(';').appendLineSeparator();
          newLineNeeded = true;
        }
      }
    }

    List<String> usesEntries = moduleAttribute.uses;
    if (!usesEntries.isEmpty()) {
      if (newLineNeeded) buffer.appendLineSeparator();
      for (String uses : usesEntries) {
        buffer.appendIndent(1).append("uses ").append(ExprProcessor.buildJavaClassName(uses)).append(';').appendLineSeparator();
      }
      newLineNeeded = true;
    }

    List<StructModuleAttribute.ProvidesEntry> providesEntries = moduleAttribute.provides;
    if (!providesEntries.isEmpty()) {
      if (newLineNeeded) buffer.appendLineSeparator();
      for (StructModuleAttribute.ProvidesEntry provides : providesEntries) {
        buffer.appendIndent(1).append("provides ").append(ExprProcessor.buildJavaClassName(provides.interfaceName)).append(" with").appendLineSeparator();
        appendFQClassNames(buffer, provides.implementationNames.stream().map(ExprProcessor::buildJavaClassName).collect(Collectors.toList()));
        buffer.append(';').appendLineSeparator();
      }
    }
  }

  private static boolean isGenerated(int flags) {
    return (flags & (CodeConstants.ACC_SYNTHETIC | CodeConstants.ACC_MANDATED)) != 0;
  }

  private static void addTracer(StructClass cls, StructMethod method, BytecodeMappingTracer tracer) {
    StructLineNumberTableAttribute table = method.getAttribute(StructGeneralAttribute.ATTRIBUTE_LINE_NUMBER_TABLE);
    tracer.setLineNumberTable(table);
    String key = InterpreterUtil.makeUniqueKey(method.getName(), method.getDescriptor());
    DecompilerContext.getBytecodeSourceMapper().addTracer(cls.qualifiedName, key, tracer);
  }

  private boolean methodToJava(ClassNode node, StructMethod mt, TextBuffer buffer, int indent, BytecodeMappingTracer tracer) {
    ClassWrapper wrapper = node.getWrapper();
    StructClass cl = wrapper.getClassStruct();
    MethodWrapper methodWrapper = wrapper.getMethodWrapper(mt.getName(), mt.getDescriptor());

    boolean hideMethod = false;
    int start_index_method = buffer.length();

    MethodWrapper outerWrapper = (MethodWrapper)DecompilerContext.getProperty(DecompilerContext.CURRENT_METHOD_WRAPPER);
    DecompilerContext.setProperty(DecompilerContext.CURRENT_METHOD_WRAPPER, methodWrapper);

    try {
      boolean isInterface = cl.hasModifier(CodeConstants.ACC_INTERFACE);
      boolean isAnnotation = cl.hasModifier(CodeConstants.ACC_ANNOTATION);
      boolean isDeprecated = mt.hasAttribute(StructGeneralAttribute.ATTRIBUTE_DEPRECATED);
      boolean clInit = false, dInit = false;

      MethodDescriptor md = MethodDescriptor.parseDescriptor(mt.getDescriptor());

      int flags = mt.getAccessFlags();
      if ((flags & CodeConstants.ACC_NATIVE) != 0) {
        flags &= ~CodeConstants.ACC_STRICT; // compiler bug: a strictfp class sets all methods to strictfp
      }
      if (CodeConstants.CLINIT_NAME.equals(mt.getName())) {
        flags &= CodeConstants.ACC_STATIC; // ignore all modifiers except 'static' in a static initializer
      }

      if (isDeprecated) {
        appendDeprecation(buffer, indent);
      }

      if (interceptor != null) {
        String oldName = interceptor.getOldName(cl.qualifiedName + " " + mt.getName() + " " + mt.getDescriptor());
        appendRenameComment(buffer, oldName, MType.METHOD, indent);
      }

      boolean isSynthetic = (flags & CodeConstants.ACC_SYNTHETIC) != 0 || mt.hasAttribute(StructGeneralAttribute.ATTRIBUTE_SYNTHETIC);
      boolean isBridge = (flags & CodeConstants.ACC_BRIDGE) != 0;
      if (isSynthetic) {
        appendComment(buffer, "synthetic method", indent);
      }
      if (isBridge) {
        appendComment(buffer, "bridge method", indent);
      }

      GenericMethodDescriptor descriptor = null;
      if (DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES)) {
        StructGenericSignatureAttribute attr = mt.getAttribute(StructGeneralAttribute.ATTRIBUTE_SIGNATURE);
        if (attr != null) {
          descriptor = GenericMain.parseMethodSignature(attr.getSignature());
          if (descriptor != null) {
            long actualParams = md.params.length;
            List<VarVersionPair> mask = methodWrapper.synthParameters;
            if (mask != null) {
              actualParams = mask.stream().filter(Objects::isNull).count();
            }
            if (actualParams != descriptor.parameterTypes.size()) {
              String message = "Inconsistent generic signature in method " + mt.getName() + " " + mt.getDescriptor() + " in " + cl.qualifiedName;
              DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
              descriptor = null;
            }
          }
        }
      }
      appendAnnotations(buffer, indent, mt);

      buffer.appendIndent(indent);

      appendModifiers(buffer, flags, METHOD_ALLOWED, isInterface, METHOD_EXCLUDED);

      if (isInterface && !mt.hasModifier(CodeConstants.ACC_STATIC) && !mt.hasModifier(CodeConstants.ACC_PRIVATE) && mt.containsCode()) {
        // 'default' modifier (Java 8)
        buffer.append("default ");
      }

      String name = mt.getName();
      boolean init = false;
      if (CodeConstants.INIT_NAME.equals(name)) {
        if (node.type == ClassNode.CLASS_ANONYMOUS) {
          name = "";
          dInit = true;
        }
        else {
          name = node.simpleName;
          init = true;
        }
      }
      else if (CodeConstants.CLINIT_NAME.equals(name)) {
        name = "";
        clInit = true;
      }

      boolean throwsExceptions = false;
      int paramCount = 0;
      final List<TypeAnnotation> typeAnnotations = TypeAnnotation.listFrom(mt);
      if (!clInit && !dInit) {
        if (descriptor != null && !descriptor.typeParameters.isEmpty()) {
          appendTypeParameters(buffer, descriptor.typeParameters, descriptor.typeParameterBounds, typeAnnotations);
          buffer.append(' ');
        }

        final List<TypeAnnotation> emptyTypeAnnotations = TargetInfo.EmptyTarget.extract(typeAnnotations);
        if (init) {
          emptyTypeAnnotations.forEach(typeAnnotation -> typeAnnotation.writeTo(buffer));
        } else {
          if (descriptor != null) {
            buffer.append(GenericMain.getGenericCastTypeName(descriptor.returnType, TypeAnnotationWriteHelper.create(emptyTypeAnnotations)));
          }
          else {
            buffer.append(ExprProcessor.getCastTypeName(md.ret, TypeAnnotationWriteHelper.create(emptyTypeAnnotations)));
          }
          buffer.append(' ');
        }

        buffer.append(toValidJavaIdentifier(name));
        buffer.append('(');

        List<VarVersionPair> mask = methodWrapper.synthParameters;

        int lastVisibleParameterIndex = -1;
        for (int i = 0; i < md.params.length; i++) {
          if (mask == null || mask.get(i) == null) {
            lastVisibleParameterIndex = i;
          }
        }

        int index = methodWrapper.varproc.getFirstParameterVarIndex();
        for (int i = methodWrapper.varproc.getFirstParameterPosition(); i < md.params.length; i++) {
          if (mask == null || mask.get(i) == null) {
            if (paramCount > 0) {
              buffer.append(", ");
            }

            Type paramType;
            if (descriptor != null) paramType = descriptor.parameterTypes.get(paramCount); else paramType = md.params[i];
            appendParameterAnnotations(buffer, mt, paramType, paramCount);

            VarVersionPair pair = new VarVersionPair(index, 0);
            if (methodWrapper.varproc.isParameterFinal(pair) ||
                methodWrapper.varproc.getVarFinal(pair) == VarProcessor.VAR_EXPLICIT_FINAL) {
              buffer.append("final ");
            }

            String typeName;
            boolean isVarArg = i == lastVisibleParameterIndex && mt.hasModifier(CodeConstants.ACC_VARARGS);
            List<TypeAnnotation> typeParamAnnotations = TargetInfo.FormalParameterTarget.extract(typeAnnotations, i);
            if (paramType instanceof GenericType genParamType) {
              isVarArg &= genParamType.getArrayDim() > 0;
              if (isVarArg) {
                genParamType = genParamType.decreaseArrayDim();
              }
              typeName = GenericMain.getGenericCastTypeName(genParamType, TypeAnnotationWriteHelper.create(typeParamAnnotations));
            }
            else {
              VarType varParamType = (VarType) paramType;
              isVarArg &= varParamType.getArrayDim() > 0;
              if (isVarArg) {
                varParamType = varParamType.decreaseArrayDim();
              }
              typeName = ExprProcessor.getCastTypeName(varParamType, TypeAnnotationWriteHelper.create(typeParamAnnotations));
            }

            if (ExprProcessor.UNDEFINED_TYPE_STRING.equals(typeName) &&
                DecompilerContext.getOption(IFernflowerPreferences.UNDEFINED_PARAM_TYPE_OBJECT)) {
              typeName = ExprProcessor.getCastTypeName(VarType.VARTYPE_OBJECT, TypeAnnotationWriteHelper.create(typeParamAnnotations));
            }
            buffer.append(typeName);
            if (isVarArg) {
              buffer.append("...");
            }

            buffer.append(' ');

            String parameterName = methodWrapper.varproc.getVarName(pair);
            buffer.append(parameterName == null ? "param" + index : parameterName); // null iff decompiled with errors

            paramCount++;
          }

          index += md.params[i].getStackSize();
        }

        buffer.append(')');

        StructExceptionsAttribute attr = mt.getAttribute(StructGeneralAttribute.ATTRIBUTE_EXCEPTIONS);
        if ((descriptor != null && !descriptor.exceptionTypes.isEmpty()) || attr != null) {
          throwsExceptions = true;
          buffer.append(" throws ");

          for (int i = 0; i < attr.getThrowsExceptions().size(); i++) {
            if (i > 0) {
              buffer.append(", ");
            }
            TargetInfo.ThrowsTarget.extract(typeAnnotations, i).forEach(typeAnnotation -> typeAnnotation.writeTo(buffer));
            if (descriptor != null && !descriptor.exceptionTypes.isEmpty()) {
              GenericType type = descriptor.exceptionTypes.get(i);
              buffer.append(GenericMain.getGenericCastTypeName(type, Collections.emptyList()));
            }
            else {
              VarType type = new VarType(attr.getExcClassname(i, cl.getPool()), true);
              buffer.append(ExprProcessor.getCastTypeName(type, Collections.emptyList()));
            }
          }
        }
      }

      tracer.incrementCurrentSourceLine(buffer.countLines(start_index_method));

      if ((flags & (CodeConstants.ACC_ABSTRACT | CodeConstants.ACC_NATIVE)) != 0) { // native or abstract method (explicit or interface)
        if (isAnnotation) {
          StructAnnDefaultAttribute attr = mt.getAttribute(StructGeneralAttribute.ATTRIBUTE_ANNOTATION_DEFAULT);
          if (attr != null) {
            buffer.append(" default ");
            buffer.append(attr.getDefaultValue().toJava(0, BytecodeMappingTracer.DUMMY));
          }
        }

        buffer.append(';');
        buffer.appendLineSeparator();
      }
      else {
        if (!clInit && !dInit) {
          buffer.append(' ');
        }

        // We do not have line information for method start, lets have it here for now
        buffer.append('{').appendLineSeparator();
        tracer.incrementCurrentSourceLine();

        RootStatement root = wrapper.getMethodWrapper(mt.getName(), mt.getDescriptor()).root;

        if (root != null && !methodWrapper.decompiledWithErrors) { // check for existence
          try {
            // to restore in case of an exception
            BytecodeMappingTracer codeTracer = new BytecodeMappingTracer(tracer.getCurrentSourceLine());
            TextBuffer code = root.toJava(indent + 1, codeTracer);

            hideMethod = code.length() == 0 &&
              (clInit || dInit || hideConstructor(node, !typeAnnotations.isEmpty(), init, throwsExceptions, paramCount, flags)) ||
              isSyntheticRecordMethod(cl, mt, code);

            buffer.append(code);

            tracer.setCurrentSourceLine(codeTracer.getCurrentSourceLine());
            tracer.addTracer(codeTracer);
          }
          catch (Throwable t) {
            String message = "Method " + mt.getName() + " " + mt.getDescriptor() + " couldn't be written.";
            DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN, t);
            methodWrapper.decompiledWithErrors = true;
          }
        }

        if (methodWrapper.decompiledWithErrors) {
          buffer.appendIndent(indent + 1);
          buffer.append("// $FF: Couldn't be decompiled");
          buffer.appendLineSeparator();
          tracer.incrementCurrentSourceLine();
        }
        else if (root != null) {
          tracer.addMapping(root.getDummyExit().bytecode);
        }
        buffer.appendIndent(indent).append('}').appendLineSeparator();
      }

      tracer.incrementCurrentSourceLine();
    }
    finally {
      DecompilerContext.setProperty(DecompilerContext.CURRENT_METHOD_WRAPPER, outerWrapper);
    }

    // save total lines
    // TODO: optimize
    //tracer.setCurrentSourceLine(buffer.countLines(start_index_method));

    return !hideMethod;
  }

  private static boolean isVarArgRecord(StructClass cl) {
    String canonicalConstructorDescriptor =
      cl.getRecordComponents().stream().map(StructField::getDescriptor).collect(Collectors.joining("", "(", ")V"));
    StructMethod init = cl.getMethod(CodeConstants.INIT_NAME, canonicalConstructorDescriptor);
    return init != null && init.hasModifier(CodeConstants.ACC_VARARGS);
  }

  public static void packageInfoToJava(StructClass cl, TextBuffer buffer) {
    appendAnnotations(buffer, 0, cl);

    int index = cl.qualifiedName.lastIndexOf('/');
    String packageName = cl.qualifiedName.substring(0, index).replace('/', '.');
    buffer.append("package ").append(packageName).append(';').appendLineSeparator().appendLineSeparator();
  }

  public static void moduleInfoToJava(StructClass cl, TextBuffer buffer) {
    appendAnnotations(buffer, 0, cl);

    StructModuleAttribute moduleAttribute = cl.getAttribute(StructGeneralAttribute.ATTRIBUTE_MODULE);

    if ((moduleAttribute.moduleFlags & CodeConstants.ACC_OPEN) != 0) {
      buffer.append("open ");
    }

    buffer.append("module ").append(moduleAttribute.moduleName).append(" {").appendLineSeparator();

    writeModuleInfoBody(buffer, moduleAttribute);

    buffer.append('}').appendLineSeparator();
  }

  private static void methodLambdaToJava(ClassNode lambdaNode,
                                         ClassWrapper classWrapper,
                                         StructMethod mt,
                                         TextBuffer buffer,
                                         int indent,
                                         boolean codeOnly, BytecodeMappingTracer tracer) {
    MethodWrapper methodWrapper = classWrapper.getMethodWrapper(mt.getName(), mt.getDescriptor());

    MethodWrapper outerWrapper = (MethodWrapper)DecompilerContext.getProperty(DecompilerContext.CURRENT_METHOD_WRAPPER);
    DecompilerContext.setProperty(DecompilerContext.CURRENT_METHOD_WRAPPER, methodWrapper);

    try {
      String method_name = lambdaNode.lambdaInformation.method_name;
      MethodDescriptor md_content = MethodDescriptor.parseDescriptor(lambdaNode.lambdaInformation.content_method_descriptor);
      MethodDescriptor md_lambda = MethodDescriptor.parseDescriptor(lambdaNode.lambdaInformation.method_descriptor);

      if (!codeOnly) {
        buffer.appendIndent(indent);
        buffer.append("public ");
        buffer.append(method_name);
        buffer.append("(");

        boolean firstParameter = true;
        int index = lambdaNode.lambdaInformation.is_content_method_static ? 0 : 1;
        int start_index = md_content.params.length - md_lambda.params.length;

        for (int i = 0; i < md_content.params.length; i++) {
          if (i >= start_index) {
            if (!firstParameter) {
              buffer.append(", ");
            }

            String typeName = ExprProcessor.getCastTypeName(md_content.params[i].copy(), Collections.emptyList());
            if (ExprProcessor.UNDEFINED_TYPE_STRING.equals(typeName) &&
                DecompilerContext.getOption(IFernflowerPreferences.UNDEFINED_PARAM_TYPE_OBJECT)) {
              typeName = ExprProcessor.getCastTypeName(VarType.VARTYPE_OBJECT, Collections.emptyList());
            }

            buffer.append(typeName);
            buffer.append(" ");

            String parameterName = methodWrapper.varproc.getVarName(new VarVersionPair(index, 0));
            buffer.append(parameterName == null ? "param" + index : parameterName); // null iff decompiled with errors

            firstParameter = false;
          }

          index += md_content.params[i].getStackSize();
        }

        buffer.append(") {").appendLineSeparator();

        indent += 1;
      }

      RootStatement root = classWrapper.getMethodWrapper(mt.getName(), mt.getDescriptor()).root;
      if (!methodWrapper.decompiledWithErrors) {
        if (root != null) { // check for existence
          try {
            buffer.append(root.toJava(indent, tracer));
          }
          catch (Throwable t) {
            String message = "Method " + mt.getName() + " " + mt.getDescriptor() + " couldn't be written.";
            DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN, t);
            methodWrapper.decompiledWithErrors = true;
          }
        }
      }

      if (methodWrapper.decompiledWithErrors) {
        buffer.appendIndent(indent);
        buffer.append("// $FF: Couldn't be decompiled");
        buffer.appendLineSeparator();
      }

      if (root != null) {
        tracer.addMapping(root.getDummyExit().bytecode);
      }

      if (!codeOnly) {
        indent -= 1;
        buffer.appendIndent(indent).append('}').appendLineSeparator();
      }
    }
    finally {
      DecompilerContext.setProperty(DecompilerContext.CURRENT_METHOD_WRAPPER, outerWrapper);
    }
  }

  private static String toValidJavaIdentifier(String name) {
    if (name == null || name.isEmpty()) return name;

    boolean changed = false;
    StringBuilder res = new StringBuilder(name.length());
    for (int i = 0; i < name.length(); i++) {
      char c = name.charAt(i);
      if ((i == 0 && !Character.isJavaIdentifierStart(c))
          || (i > 0 && !Character.isJavaIdentifierPart(c))) {
        changed = true;
        res.append("_");
      }
      else {
        res.append(c);
      }
    }
    if (!changed) {
      return name;
    }
    return res.append("/* $FF was: ").append(name).append("*/").toString();
  }

  private static void recordComponentToJava(StructRecordComponent cd, TextBuffer buffer, boolean varArgComponent) {
    Map.Entry<VarType, GenericFieldDescriptor> fieldTypeData = getFieldTypeData(cd);
    VarType fieldType = fieldTypeData.getKey();
    GenericFieldDescriptor descriptor = fieldTypeData.getValue();

    appendAnnotations(buffer, -1, cd);

    final List<TypeAnnotation> typeAnnotations = TypeAnnotation.listFrom(cd);
    if (descriptor != null) {
      buffer.append(GenericMain.getGenericCastTypeName(
        varArgComponent ? descriptor.type.decreaseArrayDim() : descriptor.type,
        TypeAnnotationWriteHelper.create(typeAnnotations)
      ));
    }
    else {
      buffer.append(ExprProcessor.getCastTypeName(
        varArgComponent ? fieldType.decreaseArrayDim() : fieldType,
        TypeAnnotationWriteHelper.create(typeAnnotations)
      ));
    }
    if (varArgComponent) {
      buffer.append("...");
    }
    buffer.append(' ');

    buffer.append(cd.getName());
  }

  private static boolean hideConstructor(
    ClassNode node,
    boolean hasAnnotation,
    boolean init,
    boolean throwsExceptions,
    int paramCount,
    int methodAccessFlags
  ) {
    if (!init || hasAnnotation|| throwsExceptions || paramCount > 0 || !DecompilerContext.getOption(IFernflowerPreferences.HIDE_DEFAULT_CONSTRUCTOR)) {
      return false;
    }

    StructClass cl = node.getWrapper().getClassStruct();

	  int classAccessFlags = node.type == ClassNode.CLASS_ROOT ? cl.getAccessFlags() : node.access;
    boolean isEnum = cl.hasModifier(CodeConstants.ACC_ENUM) && DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_ENUM);

    // default constructor requires same accessibility flags. Exception: enum constructor which is always private
    if (!isEnum && ((classAccessFlags & ACCESSIBILITY_FLAGS) != (methodAccessFlags & ACCESSIBILITY_FLAGS))) {
  	  return false;
  	}

    int count = 0;
    for (StructMethod mt : cl.getMethods()) {
      if (CodeConstants.INIT_NAME.equals(mt.getName()) && ++count > 1) {
        return false;
      }
    }

    return true;
  }

  private static Map.Entry<VarType, GenericFieldDescriptor> getFieldTypeData(StructField fd) {
    VarType fieldType = new VarType(fd.getDescriptor(), false);

    GenericFieldDescriptor descriptor = null;
    if (DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES)) {
      StructGenericSignatureAttribute attr = fd.getAttribute(StructGeneralAttribute.ATTRIBUTE_SIGNATURE);
      if (attr != null) {
        descriptor = GenericMain.parseFieldSignature(attr.getSignature());
      }
    }

    return new AbstractMap.SimpleImmutableEntry<>(fieldType, descriptor);
  }

  private static void appendDeprecation(TextBuffer buffer, int indent) {
    buffer.appendIndent(indent).append("/** @deprecated */").appendLineSeparator();
  }

  private enum MType {CLASS, FIELD, METHOD}

  private static void appendRenameComment(TextBuffer buffer, String oldName, MType type, int indent) {
    if (oldName == null) return;

    buffer.appendIndent(indent);
    buffer.append("// $FF: renamed from: ");

    switch (type) {
      case CLASS -> buffer.append(ExprProcessor.buildJavaClassName(oldName));
      case FIELD -> {
        String[] fParts = oldName.split(" ");
        FieldDescriptor fd = FieldDescriptor.parseDescriptor(fParts[2]);
        buffer.append(fParts[1]);
        buffer.append(' ');
        buffer.append(getTypePrintOut(fd.type));
      }
      default -> {
        String[] mParts = oldName.split(" ");
        MethodDescriptor md = MethodDescriptor.parseDescriptor(mParts[2]);
        buffer.append(mParts[1]);
        buffer.append(" (");
        boolean first = true;
        for (VarType paramType : md.params) {
          if (!first) {
            buffer.append(", ");
          }
          first = false;
          buffer.append(getTypePrintOut(paramType));
        }
        buffer.append(") ");
        buffer.append(getTypePrintOut(md.ret));
      }
    }

    buffer.appendLineSeparator();
  }

  private static String getTypePrintOut(VarType type) {
    String typeText = ExprProcessor.getCastTypeName(type, false, Collections.emptyList());
    if (ExprProcessor.UNDEFINED_TYPE_STRING.equals(typeText) &&
        DecompilerContext.getOption(IFernflowerPreferences.UNDEFINED_PARAM_TYPE_OBJECT)) {
      typeText = ExprProcessor.getCastTypeName(VarType.VARTYPE_OBJECT, false, Collections.emptyList());
    }
    return typeText;
  }

  private static void appendComment(TextBuffer buffer, String comment, int indent) {
    buffer.appendIndent(indent).append("// $FF: ").append(comment).appendLineSeparator();
  }

  private static void appendAnnotations(TextBuffer buffer, int indent, StructMember mb) {
    for (StructGeneralAttribute.Key<?> key : StructGeneralAttribute.ANNOTATION_ATTRIBUTES) {
      StructAnnotationAttribute attribute = (StructAnnotationAttribute)mb.getAttribute(key);
      if (attribute != null) {
        for (AnnotationExprent annotation : attribute.getAnnotations()) {
          if (mb.memberAnnCollidesWithTypeAnnotation(annotation)) continue;
          String text = annotation.toJava(indent, BytecodeMappingTracer.DUMMY).toString();
          buffer.append(text);
          if (indent < 0) {
            buffer.append(' ');
          }
          else {
            buffer.appendLineSeparator();
          }
        }
      }
    }
  }

  private static void appendParameterAnnotations(TextBuffer buffer, StructMethod mt, @NotNull Type type, int param) {
    for (StructGeneralAttribute.Key<?> key : StructGeneralAttribute.PARAMETER_ANNOTATION_ATTRIBUTES) {
      StructAnnotationParameterAttribute attribute = (StructAnnotationParameterAttribute)mt.getAttribute(key);
      if (attribute != null) {
        List<List<AnnotationExprent>> annotations = attribute.getParamAnnotations();
        if (param < annotations.size()) {
          for (AnnotationExprent annotation : annotations.get(param)) {
            if (mt.paramAnnCollidesWithTypeAnnotation(annotation, type, param)) continue;
            String text = annotation.toJava(-1, BytecodeMappingTracer.DUMMY).toString();
            buffer.append(text).append(' ');
          }
        }
      }
    }
  }

  private static final Map<Integer, String> MODIFIERS;
  static {
    MODIFIERS = new LinkedHashMap<>();
    MODIFIERS.put(CodeConstants.ACC_PUBLIC, "public");
    MODIFIERS.put(CodeConstants.ACC_PROTECTED, "protected");
    MODIFIERS.put(CodeConstants.ACC_PRIVATE, "private");
    MODIFIERS.put(CodeConstants.ACC_ABSTRACT, "abstract");
    MODIFIERS.put(CodeConstants.ACC_STATIC, "static");
    MODIFIERS.put(CodeConstants.ACC_FINAL, "final");
    MODIFIERS.put(CodeConstants.ACC_STRICT, "strictfp");
    MODIFIERS.put(CodeConstants.ACC_TRANSIENT, "transient");
    MODIFIERS.put(CodeConstants.ACC_VOLATILE, "volatile");
    MODIFIERS.put(CodeConstants.ACC_SYNCHRONIZED, "synchronized");
    MODIFIERS.put(CodeConstants.ACC_NATIVE, "native");
  }

  private static final int CLASS_ALLOWED =
    CodeConstants.ACC_PUBLIC | CodeConstants.ACC_PROTECTED | CodeConstants.ACC_PRIVATE | CodeConstants.ACC_ABSTRACT |
    CodeConstants.ACC_STATIC | CodeConstants.ACC_FINAL | CodeConstants.ACC_STRICT;
  private static final int FIELD_ALLOWED =
    CodeConstants.ACC_PUBLIC | CodeConstants.ACC_PROTECTED | CodeConstants.ACC_PRIVATE | CodeConstants.ACC_STATIC |
    CodeConstants.ACC_FINAL | CodeConstants.ACC_TRANSIENT | CodeConstants.ACC_VOLATILE;
  private static final int METHOD_ALLOWED =
    CodeConstants.ACC_PUBLIC | CodeConstants.ACC_PROTECTED | CodeConstants.ACC_PRIVATE | CodeConstants.ACC_ABSTRACT |
    CodeConstants.ACC_STATIC | CodeConstants.ACC_FINAL | CodeConstants.ACC_SYNCHRONIZED | CodeConstants.ACC_NATIVE |
    CodeConstants.ACC_STRICT;

  private static final int CLASS_EXCLUDED = CodeConstants.ACC_ABSTRACT | CodeConstants.ACC_STATIC;
  private static final int FIELD_EXCLUDED = CodeConstants.ACC_PUBLIC | CodeConstants.ACC_STATIC | CodeConstants.ACC_FINAL;
  private static final int METHOD_EXCLUDED = CodeConstants.ACC_PUBLIC | CodeConstants.ACC_ABSTRACT;

  private static final int ACCESSIBILITY_FLAGS = CodeConstants.ACC_PUBLIC | CodeConstants.ACC_PROTECTED | CodeConstants.ACC_PRIVATE;

  private static void appendModifiers(TextBuffer buffer, int flags, int allowed, boolean isInterface, int excluded) {
    flags &= allowed;
    if (!isInterface) excluded = 0;
    for (int modifier : MODIFIERS.keySet()) {
      if ((flags & modifier) == modifier && (modifier & excluded) == 0) {
        buffer.append(MODIFIERS.get(modifier)).append(' ');
      }
    }
  }

  public static GenericClassDescriptor getGenericClassDescriptor(StructClass cl) {
    if (DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_GENERIC_SIGNATURES)) {
      StructGenericSignatureAttribute attr = cl.getAttribute(StructGeneralAttribute.ATTRIBUTE_SIGNATURE);
      if (attr != null) {
        return GenericMain.parseClassSignature(attr.getSignature());
      }
    }
    return null;
  }

  public static void appendTypeParameters(
    TextBuffer buffer,
    List<String> parameters,
    List<? extends List<GenericType>> bounds,
    final List<TypeAnnotation> typeAnnotations
  ) {
    buffer.append('<');
    for (int i = 0; i < parameters.size(); i++) {
      if (i > 0) {
        buffer.append(", ");
      }
      TargetInfo.TypeParameterTarget.extract(typeAnnotations, i).forEach(typeAnnotation -> typeAnnotation.writeTo(buffer));
      buffer.append(parameters.get(i));
      List<GenericType> parameterBounds = bounds.get(i);
      if (parameterBounds.size() > 1 || !"java/lang/Object".equals(parameterBounds.get(0).getValue())) {
        buffer.append(" extends ");
        TargetInfo.TypeParameterBoundTarget.extract(typeAnnotations, i, 0).forEach(typeAnnotation -> typeAnnotation.writeTo(buffer));
        buffer.append(GenericMain.getGenericCastTypeName(parameterBounds.get(0), Collections.emptyList()));
        for (int j = 1; j < parameterBounds.size(); j++) {
          buffer.append(" & ");
          TargetInfo.TypeParameterBoundTarget.extract(typeAnnotations, i, j).forEach(typeAnnotation -> typeAnnotation.writeTo(buffer));
          buffer.append(GenericMain.getGenericCastTypeName(parameterBounds.get(j), Collections.emptyList()));
        }
      }
    }

    buffer.append('>');
  }

  private static void appendFQClassNames(TextBuffer buffer, List<String> names) {
    for (int i = 0; i < names.size(); i++) {
      String name = names.get(i);
      buffer.appendIndent(2).append(name);
      if (i < names.size() - 1) {
        buffer.append(',').appendLineSeparator();
      }
    }
  }
}

================================================
FILE: src/org/jetbrains/java/decompiler/main/ClassesProcessor.java
================================================
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.java.decompiler.main;

import org.jetbrains.java.decompiler.code.CodeConstants;
import org.jetbrains.java.decompiler.code.Instruction;
import org.jetbrains.java.decompiler.code.InstructionSequence;
import org.jetbrains.java.decompiler.main.collectors.BytecodeSourceMapper;
import org.jetbrains.java.decompiler.main.collectors.ImportCollector;
import org.jetbrains.java.decompiler.main.extern.IFernflowerLogger;
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
import org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer;
import org.jetbrains.java.decompiler.main.rels.ClassWrapper;
import org.jetbrains.java.decompiler.main.rels.LambdaProcessor;
import org.jetbrains.java.decompiler.main.rels.NestedClassProcessor;
import org.jetbrains.java.decompiler.main.rels.NestedMemberAccess;
import org.jetbrains.java.decompiler.modules.decompiler.exps.InvocationExprent;
import org.jetbrains.java.decompiler.modules.decompiler.vars.VarVersionPair;
import org.jetbrains.java.decompiler.struct.StructClass;
import org.jetbrains.java.decompiler.struct.StructContext;
import org.jetbrains.java.decompiler.struct.StructMethod;
import org.jetbrains.java.decompiler.struct.attr.StructEnclosingMethodAttribute;
import org.jetbrains.java.decompiler.struct.attr.StructGeneralAttribute;
import org.jetbrains.java.decompiler.struct.attr.StructInnerClassesAttribute;
import org.jetbrains.java.decompiler.struct.consts.ConstantPool;
import org.jetbrains.java.decompiler.struct.consts.PrimitiveConstant;
import org.jetbrains.java.decompiler.struct.gen.VarType;
import org.jetbrains.java.decompiler.util.InterpreterUtil;
import org.jetbrains.java.decompiler.util.TextBuffer;

import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;

public class ClassesProcessor {
  public static final int AVERAGE_CLASS_SIZE = 16 * 1024;

  private final StructContext context;
  private final Map<String, ClassNode> mapRootClasses = new HashMap<>();

  private static class Inner {
    private String simpleName;
    private int type;
    private int accessFlags;

    private static boolean equal(Inner o1, Inner o2) {
      return o1.type == o2.type && o1.accessFlags == o2.accessFlags && Objects.equals(o1.simpleName, o2.simpleName);
    }
  }

  public ClassesProcessor(StructContext context) {
    this.context = context;
  }

  public void loadClasses(IIdentifierRenamer renamer) {
    Map<String, Inner> mapInnerClasses = new HashMap<>();
    Map<String, Set<String>> mapNestedClassReferences = new HashMap<>();
    Map<String, Set<String>> mapEnclosingClassReferences = new HashMap<>();
    Map<String, String> mapNewSimpleNames = new HashMap<>();

    boolean bDecompileInner = DecompilerContext.getOption(IFernflowerPreferences.DECOMPILE_INNER);
    boolean verifyAnonymousClasses = DecompilerContext.getOption(IFernflowerPreferences.VERIFY_ANONYMOUS_CLASSES);

    // create class nodes
    for (StructClass cl : context.getClasses().values()) {
      if (cl.isOwn() && !mapRootClasses.containsKey(cl.qualifiedName)) {
        if (bDecompileInner) {
          StructInnerClassesAttribute inner = cl.getAttribute(StructGeneralAttribute.ATTRIBUTE_INNER_CLASSES);

          if (inner != null) {
            for (StructInnerClassesAttribute.Entry entry : inner.getEntries()) {
              String innerName = entry.innerName;

              // original simple name
              String simpleName = entry.simpleName;
              String savedName = mapNewSimpleNames.get(innerName);
              if (savedName != null) {
                simpleName = savedName;
              }
              else if (simpleName != null &&
                       renamer != null &&
                       renamer.toBeRenamed(IIdentifierRenamer.Type.ELEMENT_CLASS, simpleName, null, null)) {
                simpleName = renamer.getNextClassName(innerName, simpleName);
                mapNewSimpleNames.put(innerName, simpleName);
              }

              Inner rec = new Inner();
              rec.simpleName = simpleName;
              rec.type = entry.simpleNameIdx == 0 ? ClassNode.CLASS_ANONYMOUS : entry.outerNameIdx == 0 ? ClassNode.CLASS_LOCAL : ClassNode.CLASS_MEMBER;
              rec.accessFlags = entry.accessFlags;

              // enclosing class
              String enclClassName = entry.outerNameIdx != 0 ? entry.enclosingName : cl.qualifiedName;
              if (enclClassName == null || innerName.equals(enclClassName)) {
                continue;  // invalid name or self reference
              }
              if (rec.type == ClassNode.CLASS_MEMBER && !innerName.equals(enclClassName + '$' + entry.simpleName)) {
                continue;  // not a real inner class
              }

              StructClass enclosingClass = context.getClasses().get(enclClassName);
              if (enclosingClass != null && enclosingClass.isOwn()) { // own classes only
                Inner existingRec = mapInnerClasses.get(innerName);
                if (existingRec == null) {
                  mapInnerClasses.put(innerName, rec);
                }
                else if (!Inner.equal(existingRec, rec)) {
                  String message = "Inconsistent inner class entries for " + innerName + "!";
                  DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
                }

                // reference to the nested class
                mapNestedClassReferences.computeIfAbsent(enclClassName, k -> new HashSet<>()).add(innerName);
                // reference to the enclosing class
                mapEnclosingClassReferences.computeIfAbsent(innerName, k -> new HashSet<>()).add(enclClassName);
              }
            }
          }
        }

        ClassNode node = new ClassNode(ClassNode.CLASS_ROOT, cl);
        node.access = cl.getAccessFlags();
        mapRootClasses.put(cl.qualifiedName, node);
      }
    }

    // set non-sealed if class extends or implements a sealed class and is not final or sealed itself
    for (ClassNode clazz : mapRootClasses.values()) {
      if (clazz.classStruct.hasSealedClassesSupport() &&
          (clazz.access & CodeConstants.ACC_FINAL) == 0 &&
          clazz.classStruct.getPermittedSubclasses() == null) {
        List<String> qualifiedSealedSuperNames = new ArrayList<>(Arrays.asList(clazz.classStruct.getInterfaceNames()));
        PrimitiveConstant superConst = clazz.classStruct.superClass;
        if (superConst != null) qualifiedSealedSuperNames.add(superConst.getString());
        clazz.setNonSealed(
          qualifiedSealedSuperNames.stream()
            .map(mapRootClasses::get)
            .filter(Objects::nonNull)
            .map(potentialSuper -> potentialSuper.classStruct.getPermittedSubclasses())
            .filter(Objects::nonNull)
            .anyMatch(permittedList -> permittedList.contains(clazz.classStruct.qualifiedName))
        );
      }
    }

    if (bDecompileInner) {
      // connect nested classes
      for (Entry<String, ClassNode> ent : mapRootClasses.entrySet()) {
        // root class?
        if (!mapInnerClasses.containsKey(ent.getKey())) {
          Set<String> setVisited = new HashSet<>();
          LinkedList<String> stack = new LinkedList<>();

          stack.add(ent.getKey());
          setVisited.add(ent.getKey());

          while (!stack.isEmpty()) {
            String superClass = stack.removeFirst();
            ClassNode superNode = mapRootClasses.get(superClass);

            Set<String> setNestedClasses = mapNestedClassReferences.get(superClass);
            if (setNestedClasses != null) {
              StructClass scl = superNode.classStruct;
              StructInnerClassesAttribute inner = scl.getAttribute(StructGeneralAttribute.ATTRIBUTE_INNER_CLASSES);

              if (inner == null || inner.getEntries().isEmpty()) {
                DecompilerContext.getLogger().writeMessage(superClass + " does not contain inner classes!", IFernflowerLogger.Severity.WARN);
                continue;
              }

              for (StructInnerClassesAttribute.Entry entry : inner.getEntries()) {
                String nestedClass = entry.innerName;
                if (!setNestedClasses.contains(nestedClass)) {
                  continue;
                }

                if (!setVisited.add(nestedClass)) {
                  continue;
                }

                ClassNode nestedNode = mapRootClasses.get(nestedClass);
                if (nestedNode == null) {
                  DecompilerContext.getLogger().writeMessage("Nested class " + nestedClass + " missing!", IFernflowerLogger.Severity.WARN);
                  continue;
                }

                Inner rec = mapInnerClasses.get(nestedClass);

                //if ((Integer)arr[2] == ClassNode.CLASS_MEMBER) {
                  // FIXME: check for consistent naming
                //}

                nestedNode.simpleName = rec.simpleName;
                nestedNode.type = rec.type;
                nestedNode.access = rec.accessFlags;

                // sanity checks of the class supposed to be anonymous
                if (verifyAnonymousClasses && nestedNode.type == ClassNode.CLASS_ANONYMOUS && !isAnonymous(nestedNode.classStruct, scl)) {
                  nestedNode.type = ClassNode.CLASS_LOCAL;
                }

                if (nestedNode.type == ClassNode.CLASS_ANONYMOUS) {
                  StructClass cl = nestedNode.classStruct;
                  // remove static if anonymous class (a common compiler bug)
                  nestedNode.access &= ~CodeConstants.ACC_STATIC;

                  int[] interfaces = cl.getInterfaces();
                  if (interfaces.length > 0) {
                    nestedNode.anonymousClassType = new VarType(cl.getInterface(0), true);
                  }
                  else {
                    nestedNode.anonymousClassType = new VarType(cl.superClass.getString(), true);
                  }
                }
                else if (nestedNode.type == ClassNode.CLASS_LOCAL) {
                  // only abstract and final are permitted (a common compiler bug)
                  nestedNode.access &= (CodeConstants.ACC_ABSTRACT | CodeConstants.ACC_FINAL);
                }

                superNode.nested.add(nestedNode);
                nestedNode.parent = superNode;

                nestedNode.enclosingClasses.addAll(mapEnclosingClassReferences.get(nestedClass));

                stack.add(nestedClass);
              }
            }
          }
        }
      }
    }
  }

  private static boolean isAnonymous(StructClass cl, StructClass enclosingCl) {
    // checking super class and interfaces
    int[] interfaces = cl.getInterfaces();
    if (interfaces.length > 0) {
      boolean hasNonTrivialSuperClass = cl.superClass != null && !VarType.VARTYPE_OBJECT.equals(new VarType(cl.superClass.getString(), true));
      if (hasNonTrivialSuperClass || interfaces.length > 1) { // can't have multiple 'sources'
        String message = "Inconsistent anonymous class definition: '" + cl.qualifiedName + "'. Multiple interfaces and/or super class defined.";
        DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
        return false;
      }
    }
    else if (cl.superClass == null) { // neither interface nor super class defined
      String message = "Inconsistent anonymous class definition: '" + cl.qualifiedName + "'. Neither interface nor super class defined.";
      DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
      return false;
    }

    // FIXME: check constructors
    // FIXME: check enclosing class/method

    ConstantPool pool = enclosingCl.getPool();

    int refCounter = 0;
    boolean refNotNew = false;

    StructEnclosingMethodAttribute attribute = cl.getAttribute(StructGeneralAttribute.ATTRIBUTE_ENCLOSING_METHOD);
    String enclosingMethod = attribute != null ? attribute.getMethodName() : null;

    // checking references in the enclosing class
    for (StructMethod mt : enclosingCl.getMethods()) {
      if (enclosingMethod != null && !enclosingMethod.equals(mt.getName())) {
        continue;
      }

      try {
        mt.expandData(enclosingCl);

        InstructionSequence seq = mt.getInstructionSequence();
        if (seq != null) {
          int len = seq.length();
          for (int i = 0; i < len; i++) {
            Instruction instr = seq.getInstr(i);
            switch (instr.opcode) {
              case CodeConstants.opc_checkcast, CodeConstants.opc_instanceof -> {
                if (cl.qualifiedName.equals(pool.getPrimitiveConstant(instr.operand(0)).getString())) {
                  refCounter++;
                  refNotNew = true;
                }
              }
              case CodeConstants.opc_new, CodeConstants.opc_anewarray, CodeConstants.opc_multianewarray -> {
                if (cl.qualifiedName.equals(pool.getPrimitiveConstant(instr.operand(0)).getString())) {
                  refCounter++;
                }
              }
              case CodeConstants.opc_getstatic, CodeConstants.opc_putstatic -> {
                if (cl.qualifiedName.equals(pool.getLinkConstant(instr.operand(0)).className)) {
                  refCounter++;
                  refNotNew = true;
                }
              }
            }
          }
        }

        mt.releaseResources();
      }
      catch (IOException ex) {
        String message = "Could not read method while checking anonymous class definition: '" + enclosingCl.qualifiedName + "', '" +
                         InterpreterUtil.makeUniqueKey(mt.getName(), mt.getDescriptor()) + "'";
        DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
        return false;
      }

      if (refCounter > 1 || refNotNew) {
        String message = "Inconsistent references to the class '" + cl.qualifiedName + "' which is supposed to be anonymous";
        DecompilerContext.getLogger().writeMessage(message, IFernflowerLogger.Severity.WARN);
        return false;
      }
    }

    return true;
  }

  public void writeClass(StructClass cl, TextBuffer buffer) throws IOException {
    ClassNode root = mapRootClasses.get(cl.qualifiedName);
    if (root.type != ClassNode.CLASS_ROOT) {
      return;
    }

    boolean packageInfo = cl.isSynthetic() && "package-info".equals(root.simpleName);
    boolean moduleInfo = cl.hasModifier(CodeConstants.ACC_MODULE) && cl.hasAttribute(StructGeneralAttribute.ATTRIBUTE_MODULE);

    DecompilerContext.getLogger().startReadingClass(cl.qualifiedName);
    try {
      ImportCollector importCollector = new ImportCollector(root);
      DecompilerContext.startClass(importCollector);

      if (packageInfo) {
        ClassWriter.packageInfoToJava(cl, buffer);

        importCollector.writeImports(buffer, false);
      }
      else if (moduleInfo) {
        TextBuffer moduleBuffer = new TextBuffer(AVERAGE_CLASS_SIZE);
        
Download .txt
gitextract_u07x2ck1/

├── .editorconfig
├── .gitattributes
├── .gitignore
├── README.md
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── intellij.java.decompiler.engine.iml
├── resources/
│   └── META-INF/
│       └── MANIFEST.MF
├── src/
│   └── org/
│       └── jetbrains/
│           └── java/
│               └── decompiler/
│                   ├── ClassNameConstants.java
│                   ├── code/
│                   │   ├── CodeConstants.java
│                   │   ├── ExceptionHandler.java
│                   │   ├── ExceptionTable.java
│                   │   ├── FullInstructionSequence.java
│                   │   ├── Instruction.java
│                   │   ├── InstructionSequence.java
│                   │   ├── JumpInstruction.java
│                   │   ├── SimpleInstructionSequence.java
│                   │   ├── SwitchInstruction.java
│                   │   ├── cfg/
│                   │   │   ├── BasicBlock.java
│                   │   │   ├── ControlFlowGraph.java
│                   │   │   └── ExceptionRangeCFG.java
│                   │   └── interpreter/
│                   │       └── InstructionImpact.java
│                   ├── main/
│                   │   ├── AssertProcessor.java
│                   │   ├── CancellationManager.java
│                   │   ├── ClassReference14Processor.java
│                   │   ├── ClassWriter.java
│                   │   ├── ClassesProcessor.java
│                   │   ├── DecompilerContext.java
│                   │   ├── EnumProcessor.java
│                   │   ├── Fernflower.java
│                   │   ├── InitializerProcessor.java
│                   │   ├── collectors/
│                   │   │   ├── BytecodeMappingTracer.java
│                   │   │   ├── BytecodeSourceMapper.java
│                   │   │   ├── CounterContainer.java
│                   │   │   ├── ImportCollector.java
│                   │   │   └── VarNamesCollector.java
│                   │   ├── decompiler/
│                   │   │   ├── BaseDecompiler.java
│                   │   │   ├── ConsoleDecompiler.java
│                   │   │   └── PrintStreamLogger.java
│                   │   ├── extern/
│                   │   │   ├── ClassFormatException.java
│                   │   │   ├── IBytecodeProvider.java
│                   │   │   ├── IFernflowerLogger.java
│                   │   │   ├── IFernflowerPreferences.java
│                   │   │   ├── IIdentifierRenamer.java
│                   │   │   └── IResultSaver.java
│                   │   └── rels/
│                   │       ├── ClassWrapper.java
│                   │       ├── LambdaProcessor.java
│                   │       ├── MethodProcessorRunnable.java
│                   │       ├── MethodWrapper.java
│                   │       ├── NestedClassProcessor.java
│                   │       └── NestedMemberAccess.java
│                   ├── modules/
│                   │   ├── code/
│                   │   │   └── DeadCodeHelper.java
│                   │   ├── decompiler/
│                   │   │   ├── ClasspathHelper.java
│                   │   │   ├── ClearStructHelper.java
│                   │   │   ├── ConcatenationHelper.java
│                   │   │   ├── DecHelper.java
│                   │   │   ├── DomHelper.java
│                   │   │   ├── ExitHelper.java
│                   │   │   ├── ExprProcessor.java
│                   │   │   ├── ExpressionStack.java
│                   │   │   ├── FinallyProcessor.java
│                   │   │   ├── IdeaNotNullHelper.java
│                   │   │   ├── IfHelper.java
│                   │   │   ├── InlineSingleBlockHelper.java
│                   │   │   ├── LabelHelper.java
│                   │   │   ├── LoopExtractHelper.java
│                   │   │   ├── MergeHelper.java
│                   │   │   ├── PPandMMHelper.java
│                   │   │   ├── PatternHelper.java
│                   │   │   ├── PrimitiveExpressionList.java
│                   │   │   ├── SecondaryFunctionsHelper.java
│                   │   │   ├── SequenceHelper.java
│                   │   │   ├── SimplifyExprentsHelper.java
│                   │   │   ├── StackVarsProcessor.java
│                   │   │   ├── StatEdge.java
│                   │   │   ├── StrongConnectivityHelper.java
│                   │   │   ├── SwitchHelper.java
│                   │   │   ├── SwitchPatternHelper.java
│                   │   │   ├── decompose/
│                   │   │   │   ├── DominatorEngine.java
│                   │   │   │   ├── DominatorTreeExceptionFilter.java
│                   │   │   │   ├── FastExtendedPostdominanceHelper.java
│                   │   │   │   ├── GenericDominatorEngine.java
│                   │   │   │   ├── IGraph.java
│                   │   │   │   └── IGraphNode.java
│                   │   │   ├── deobfuscator/
│                   │   │   │   ├── ExceptionDeobfuscator.java
│                   │   │   │   └── IrreducibleCFGDeobfuscator.java
│                   │   │   ├── exps/
│                   │   │   │   ├── AnnotationExprent.java
│                   │   │   │   ├── ArrayExprent.java
│                   │   │   │   ├── AssertExprent.java
│                   │   │   │   ├── AssignmentExprent.java
│                   │   │   │   ├── ConstExprent.java
│                   │   │   │   ├── ExitExprent.java
│                   │   │   │   ├── ExprUtil.java
│                   │   │   │   ├── Exprent.java
│                   │   │   │   ├── FieldExprent.java
│                   │   │   │   ├── FunctionExprent.java
│                   │   │   │   ├── IfExprent.java
│                   │   │   │   ├── InvocationExprent.java
│                   │   │   │   ├── MonitorExprent.java
│                   │   │   │   ├── NewExprent.java
│                   │   │   │   ├── RecordVarExprent.java
│                   │   │   │   ├── SwitchExprent.java
│                   │   │   │   └── VarExprent.java
│                   │   │   ├── sforms/
│                   │   │   │   ├── DirectGraph.java
│                   │   │   │   ├── DirectNode.java
│                   │   │   │   ├── FlattenStatementsHelper.java
│                   │   │   │   ├── SSAConstructorSparseEx.java
│                   │   │   │   └── SSAUConstructorSparseEx.java
│                   │   │   ├── stats/
│                   │   │   │   ├── BasicBlockStatement.java
│                   │   │   │   ├── CatchAllStatement.java
│                   │   │   │   ├── CatchStatement.java
│                   │   │   │   ├── DoStatement.java
│                   │   │   │   ├── DummyExitStatement.java
│                   │   │   │   ├── GeneralStatement.java
│                   │   │   │   ├── IfStatement.java
│                   │   │   │   ├── RootStatement.java
│                   │   │   │   ├── SequenceStatement.java
│                   │   │   │   ├── Statement.java
│                   │   │   │   ├── Statements.java
│                   │   │   │   ├── SwitchStatement.java
│                   │   │   │   └── SynchronizedStatement.java
│                   │   │   ├── typeann/
│                   │   │   │   ├── TargetInfo.java
│                   │   │   │   ├── TypeAnnotation.java
│                   │   │   │   └── TypeAnnotationWriteHelper.java
│                   │   │   └── vars/
│                   │   │       ├── CheckTypesResult.java
│                   │   │       ├── VarDefinitionHelper.java
│                   │   │       ├── VarProcessor.java
│                   │   │       ├── VarTypeProcessor.java
│                   │   │       ├── VarVersionEdge.java
│                   │   │       ├── VarVersionNode.java
│                   │   │       ├── VarVersionPair.java
│                   │   │       ├── VarVersionsGraph.java
│                   │   │       └── VarVersionsProcessor.java
│                   │   └── renamer/
│                   │       ├── ClassWrapperNode.java
│                   │       ├── ConverterHelper.java
│                   │       ├── IdentifierConverter.java
│                   │       └── PoolInterceptor.java
│                   ├── struct/
│                   │   ├── ContextUnit.java
│                   │   ├── IDecompiledData.java
│                   │   ├── StructClass.java
│                   │   ├── StructContext.java
│                   │   ├── StructField.java
│                   │   ├── StructMember.java
│                   │   ├── StructMethod.java
│                   │   ├── StructRecordComponent.java
│                   │   ├── StructTypePathEntry.java
│                   │   ├── attr/
│                   │   │   ├── StructAnnDefaultAttribute.java
│                   │   │   ├── StructAnnotationAttribute.java
│                   │   │   ├── StructAnnotationParameterAttribute.java
│                   │   │   ├── StructBootstrapMethodsAttribute.java
│                   │   │   ├── StructCodeAttribute.java
│                   │   │   ├── StructConstantValueAttribute.java
│                   │   │   ├── StructEnclosingMethodAttribute.java
│                   │   │   ├── StructExceptionsAttribute.java
│                   │   │   ├── StructGeneralAttribute.java
│                   │   │   ├── StructGenericSignatureAttribute.java
│                   │   │   ├── StructInnerClassesAttribute.java
│                   │   │   ├── StructLineNumberTableAttribute.java
│                   │   │   ├── StructLocalVariableTableAttribute.java
│                   │   │   ├── StructLocalVariableTypeTableAttribute.java
│                   │   │   ├── StructMethodParametersAttribute.java
│                   │   │   ├── StructModuleAttribute.java
│                   │   │   ├── StructPermittedSubclassesAttribute.java
│                   │   │   ├── StructRecordAttribute.java
│                   │   │   └── StructTypeAnnotationAttribute.java
│                   │   ├── consts/
│                   │   │   ├── ConstantPool.java
│                   │   │   ├── LinkConstant.java
│                   │   │   ├── PooledConstant.java
│                   │   │   └── PrimitiveConstant.java
│                   │   ├── gen/
│                   │   │   ├── DataPoint.java
│                   │   │   ├── FieldDescriptor.java
│                   │   │   ├── MethodDescriptor.java
│                   │   │   ├── NewClassNameBuilder.java
│                   │   │   ├── Type.java
│                   │   │   ├── VarType.java
│                   │   │   └── generics/
│                   │   │       ├── GenericClassDescriptor.java
│                   │   │       ├── GenericFieldDescriptor.java
│                   │   │       ├── GenericMain.java
│                   │   │       ├── GenericMethodDescriptor.java
│                   │   │       └── GenericType.java
│                   │   ├── lazy/
│                   │   │   └── LazyLoader.java
│                   │   └── match/
│                   │       ├── IMatchable.java
│                   │       ├── MatchEngine.java
│                   │       └── MatchNode.java
│                   └── util/
│                       ├── DataInputFullStream.java
│                       ├── FastFixedSetFactory.java
│                       ├── FastSparseSetFactory.java
│                       ├── InterpreterUtil.java
│                       ├── ListStack.java
│                       ├── SFormsFastMapDirect.java
│                       ├── TextBuffer.java
│                       ├── TextUtil.java
│                       └── VBStyleCollection.java
├── test/
│   └── org/
│       └── jetbrains/
│           └── java/
│               └── decompiler/
│                   ├── BulkDecompilationTest.java
│                   ├── CancellableTest.java
│                   ├── ConverterHelperTest.java
│                   ├── DecompilerTestFixture.java
│                   └── SingleClassesTest.java
└── testData/
    ├── bulk/
    │   ├── META-INF/
    │   │   └── MANIFEST.MF
    │   └── pkg/
    │       ├── Main.java
    │       └── res/
    │           ├── Loader.java
    │           └── resource.txt
    ├── bulk.jar
    ├── classes/
    │   └── pkg/
    │       └── PrivateClasses.java
    ├── kt25937/
    │   ├── META-INF/
    │   │   └── MANIFEST.MF
    │   └── kt/
    │       ├── Kt25937Kt.java
    │       └── Kt25937_1Kt.java
    ├── kt25937.jar
    ├── obfuscated/
    │   ├── a.java
    │   ├── a0.java
    │   ├── a1.java
    │   ├── a2.java
    │   ├── a3.java
    │   ├── a4.java
    │   ├── a5.java
    │   ├── a6.java
    │   ├── a7.java
    │   ├── a8.java
    │   ├── a9.java
    │   ├── a_.java
    │   ├── aa.java
    │   ├── ab.java
    │   ├── ac.java
    │   ├── ad.java
    │   ├── ae.java
    │   ├── af.java
    │   ├── ag.java
    │   ├── ah.java
    │   ├── ai.java
    │   ├── aj.java
    │   ├── ak.java
    │   ├── al.java
    │   ├── am.java
    │   ├── an.java
    │   ├── ao.java
    │   ├── ap.java
    │   ├── aq.java
    │   ├── ar.java
    │   ├── as.java
    │   ├── at.java
    │   ├── au.java
    │   ├── av.java
    │   ├── aw.java
    │   ├── ax.java
    │   ├── ay.java
    │   ├── az.java
    │   ├── b.java
    │   ├── ba.java
    │   ├── bb.java
    │   ├── bc.java
    │   ├── bd.java
    │   ├── c.java
    │   ├── d.java
    │   ├── e.java
    │   ├── f.java
    │   ├── g.java
    │   ├── h.java
    │   ├── i.java
    │   ├── j.java
    │   ├── k.java
    │   ├── l.java
    │   ├── m.java
    │   ├── n.java
    │   ├── o.java
    │   ├── okhttp3/
    │   │   └── internal/
    │   │       └── connection/
    │   │           └── e.java
    │   ├── p.java
    │   ├── q.java
    │   ├── r.java
    │   ├── s.java
    │   ├── u.java
    │   ├── v.java
    │   ├── w.java
    │   ├── x.java
    │   ├── y.java
    │   └── z.java
    ├── obfuscated.jar
    ├── results/
    │   ├── ArrayNestedTypeAnnotations.dec
    │   ├── ArrayTypeAnnotations.dec
    │   ├── ClassNonSealed.dec
    │   ├── ClassNonSealedExtendsImplements.dec
    │   ├── ClassSuperTypeAnnotations.dec
    │   ├── EnumWithOverride.dec
    │   ├── GenericArrayNestedTypeAnnotations.dec
    │   ├── GenericArrayTypeAnnotations.dec
    │   ├── GenericNestedTypeAnnotations.dec
    │   ├── GenericTypeAnnotations.dec
    │   ├── Integer.dec
    │   ├── InterfaceNonSealed.dec
    │   ├── InterfaceSuperTypeAnnotations.dec
    │   ├── InvalidMethodSignature.dec
    │   ├── MemberDeclarationTypeAnnotations.dec
    │   ├── MoreAnnotations.dec
    │   ├── NestedType.dec
    │   ├── NestedTypeAnnotations.dec
    │   ├── PrivateClasses.dec
    │   ├── RootWithClassInner.dec
    │   ├── RootWithClassOuter.dec
    │   ├── RootWithInterfaceInner.dec
    │   ├── RootWithInterfaceInnerAndOuter.dec
    │   ├── RootWithInterfaceOuter.dec
    │   ├── RootWithModule.dec
    │   ├── SwitchOnStatic.dec
    │   ├── TestAbstractMethods.dec
    │   ├── TestAccessReplace.dec
    │   ├── TestAmbiguousCall.dec
    │   ├── TestAmbiguousCallWithDebugInfo.dec
    │   ├── TestAnonymousClass.dec
    │   ├── TestAnonymousClassConstructor.dec
    │   ├── TestAnonymousParamNames.dec
    │   ├── TestAnonymousParams.dec
    │   ├── TestAnonymousSignature.dec
    │   ├── TestAsserts.dec
    │   ├── TestClashName.dec
    │   ├── TestClassCast.dec
    │   ├── TestClassFields.dec
    │   ├── TestClassLambda.dec
    │   ├── TestClassLoop.dec
    │   ├── TestClassNestedInitializer.dec
    │   ├── TestClassSimpleBytecodeMapping.dec
    │   ├── TestClassSwitch.dec
    │   ├── TestClassTypes.dec
    │   ├── TestClassVar.dec
    │   ├── TestCodeConstructs.dec
    │   ├── TestComplexInstanceOfRecordPatternJavac.dec
    │   ├── TestConstType.dec
    │   ├── TestConstants.dec
    │   ├── TestConstantsAsIs.dec
    │   ├── TestConstructorReference.dec
    │   ├── TestDebugSymbols.dec
    │   ├── TestDeprecations.dec
    │   ├── TestDynamicConstantPoolEntry.dec
    │   ├── TestEmptyBlocks.dec
    │   ├── TestEnum.dec
    │   ├── TestExtendingSubclass.dec
    │   ├── TestExtendsList.dec
    │   ├── TestFieldSingleAccess.dec
    │   ├── TestGenericArgs.dec
    │   ├── TestGroovyClass.dec
    │   ├── TestGroovyTrait.dec
    │   ├── TestIffSimplification.dec
    │   ├── TestIllegalVarName.dec
    │   ├── TestInUse.dec
    │   ├── TestInheritanceChainCycle.dec
    │   ├── TestInner2.dec
    │   ├── TestInnerClassConstructor.dec
    │   ├── TestInnerLocal.dec
    │   ├── TestInnerSignature.dec
    │   ├── TestInstanceofPatternNotSupported.dec
    │   ├── TestInstanceofWithPattern.dec
    │   ├── TestIntVarMerge.dec
    │   ├── TestInterfaceFields.dec
    │   ├── TestInterfaceMethods.dec
    │   ├── TestInterfaceSuper.dec
    │   ├── TestInvertedFloatComparison.dec
    │   ├── TestJava11StringConcat.dec
    │   ├── TestJava11StringConcatEmptyAffix.dec
    │   ├── TestJava11StringConcatSpecialChars.dec
    │   ├── TestJava9PrivateInterfaceMethod.dec
    │   ├── TestJava9StringConcat.dec
    │   ├── TestKotlinConstructorKt.dec
    │   ├── TestLambdaParams.dec
    │   ├── TestLocalClass.dec
    │   ├── TestLocalsNames.dec
    │   ├── TestLocalsSignature.dec
    │   ├── TestMemberAnnotations.dec
    │   ├── TestMethodParameters.dec
    │   ├── TestMethodParametersAttr.dec
    │   ├── TestMethodReferenceLetterClass.dec
    │   ├── TestMethodReferenceSameName.dec
    │   ├── TestMissingConstructorCallBad.dec
    │   ├── TestMissingConstructorCallGood.dec
    │   ├── TestNamedSuspendFun2Kt.dec
    │   ├── TestParameterizedTypes.dec
    │   ├── TestPop2OneDoublePop2.dec
    │   ├── TestPop2OneLongPop2.dec
    │   ├── TestPop2TwoIntPop2.dec
    │   ├── TestPop2TwoIntTwoPop.dec
    │   ├── TestPrimitiveNarrowing.dec
    │   ├── TestPrimitives.dec
    │   ├── TestPrivateEmptyConstructor.dec
    │   ├── TestRecordAnno.dec
    │   ├── TestRecordEmpty.dec
    │   ├── TestRecordGenericVararg.dec
    │   ├── TestRecordSimple.dec
    │   ├── TestRecordVararg.dec
    │   ├── TestShadowing.dec
    │   ├── TestSimpleInstanceOfRecordPatternJavac.dec
    │   ├── TestStaticNameClash.dec
    │   ├── TestStringConcat.dec
    │   ├── TestStringLiterals.dec
    │   ├── TestSuperInner.dec
    │   ├── TestSuspendLambdaKt.dec
    │   ├── TestSwitchClassReferencesEcj.dec
    │   ├── TestSwitchClassReferencesFastExitEcj.dec
    │   ├── TestSwitchClassReferencesFastExitJavac.dec
    │   ├── TestSwitchClassReferencesJavac.dec
    │   ├── TestSwitchGuarded2Javac.dec
    │   ├── TestSwitchGuardedEcj.dec
    │   ├── TestSwitchGuardedJavac.dec
    │   ├── TestSwitchNestedDeconstructionsJavac.dec
    │   ├── TestSwitchOnEnum.dec
    │   ├── TestSwitchOnEnumEclipse.dec
    │   ├── TestSwitchOnStringsEcj.dec
    │   ├── TestSwitchOnStringsJavac.dec
    │   ├── TestSwitchRules.dec
    │   ├── TestSwitchSimpleReferencesJavac.dec
    │   ├── TestSwitchWithDeconstructionsWithoutNestedJavac.dec
    │   ├── TestSynchronizedMapping.dec
    │   ├── TestSynchronizedUnprotected.dec
    │   ├── TestSyntheticAccess.dec
    │   ├── TestThrowException.dec
    │   ├── TestTryCatchFinally.dec
    │   ├── TestTryCatchFinallyJsrRet.dec
    │   ├── TestUnionType.dec
    │   ├── TestUnsupportedConstantPoolEntry.dec
    │   ├── TestVarArgCalls.dec
    │   ├── TryToPreserveCast.dec
    │   ├── module-info.dec
    │   └── package-info.dec
    └── src/
        ├── ext/
        │   ├── PkgAnno.java
        │   ├── Shadow.java
        │   ├── TestClashNameIface.java
        │   └── TestClashNameParent.java
        ├── java11/
        │   ├── TestDynamicConstantPoolEntry.jcoder
        │   ├── TestJava11StringConcat.java
        │   ├── TestJava11StringConcatEmptyAffix.java
        │   ├── TestJava11StringConcatSpecialChars.java
        │   └── TestUnsupportedConstantPoolEntry.jcoder
        ├── java9/
        │   ├── TestJava9PrivateInterfaceMethod.java
        │   ├── TestJava9StringConcat.java
        │   └── sample.module/
        │       ├── TestClass.java
        │       ├── TestModuleAnno.java
        │       ├── TestService.java
        │       ├── TestServiceImpl.java
        │       └── module-info.java
        ├── patterns/
        │   ├── TestInstanceofPatternNotSupported.java
        │   └── TestInstanceofWithPattern.java
        ├── pkg/
        │   ├── MoreAnnotations.java
        │   ├── NestedType.java
        │   ├── Shadow.java
        │   ├── SwitchOnStatic.java
        │   ├── TestAbstractMethods.java
        │   ├── TestAccessReplace.java
        │   ├── TestAmbiguousCall.java
        │   ├── TestAnonymousClass.java
        │   ├── TestAnonymousClassConstructor.java
        │   ├── TestAnonymousParamNames.java
        │   ├── TestAnonymousParams.java
        │   ├── TestAnonymousSignature.java
        │   ├── TestAsserts.java
        │   ├── TestClashName.java
        │   ├── TestClassCast.java
        │   ├── TestClassFields.java
        │   ├── TestClassLambda.java
        │   ├── TestClassLoop.java
        │   ├── TestClassNestedInitializer.java
        │   ├── TestClassSimpleBytecodeMapping.java
        │   ├── TestClassSwitch.java
        │   ├── TestClassTypes.java
        │   ├── TestClassVar.java
        │   ├── TestCodeConstructs.java
        │   ├── TestComplexInstanceOfRecordPatternJavac.java
        │   ├── TestConstType.java
        │   ├── TestConstants.java
        │   ├── TestConstantsAsIs.java
        │   ├── TestConstructorReference.java
        │   ├── TestDebugSymbols.java
        │   ├── TestDeprecations.java
        │   ├── TestEmptyBlocks.java
        │   ├── TestEnum.java
        │   ├── TestExtendingSubclass.java
        │   ├── TestExtendsList.java
        │   ├── TestFieldSingleAccess.jasm
        │   ├── TestGenericArgs.java
        │   ├── TestGroovyClass.groovy
        │   ├── TestGroovyTrait.groovy
        │   ├── TestIffSimplification.java
        │   ├── TestIllegalVarName.kt
        │   ├── TestInUse.java
        │   ├── TestInheritanceChainCycle.jasm
        │   ├── TestInner2.java
        │   ├── TestInnerClassConstructor.java
        │   ├── TestInnerLocal.java
        │   ├── TestInnerSignature.java
        │   ├── TestIntVarMerge.java
        │   ├── TestInterfaceFields.java
        │   ├── TestInterfaceMethods.java
        │   ├── TestInterfaceSuper.java
        │   ├── TestInvertedFloatComparison.java
        │   ├── TestKotlinConstructor.kt
        │   ├── TestLambdaParams.java
        │   ├── TestLocalClass.java
        │   ├── TestLocalsNames.java
        │   ├── TestLocalsSignature.java
        │   ├── TestMemberAnnotations.java
        │   ├── TestMethodParameters.java
        │   ├── TestMethodParametersAttr.java
        │   ├── TestMethodReferenceLetterClass.java
        │   ├── TestMethodReferenceSameName.java
        │   ├── TestMissingConstructorCallBad.jasm
        │   ├── TestMissingConstructorCallGood.jasm
        │   ├── TestNamedSuspendFun2.kt
        │   ├── TestParameterizedTypes.java
        │   ├── TestPop2OneDoublePop2.jasm
        │   ├── TestPop2OneLongPop2.jasm
        │   ├── TestPop2TwoIntPop2.jasm
        │   ├── TestPop2TwoIntTwoPop.jasm
        │   ├── TestPrimitiveNarrowing.java
        │   ├── TestPrimitives.java
        │   ├── TestPrivateEmptyConstructor.java
        │   ├── TestShadowing.java
        │   ├── TestSimpleInstanceOfRecordPatternJavac.java
        │   ├── TestStaticNameClash.java
        │   ├── TestStringConcat.java
        │   ├── TestStringLiterals.java
        │   ├── TestSuperInner.java
        │   ├── TestSuperInnerBase.java
        │   ├── TestSuspendLambda.kt
        │   ├── TestSwitchClassReferencesEcj.java
        │   ├── TestSwitchClassReferencesFastExitEcj.java
        │   ├── TestSwitchClassReferencesFastExitJavac.java
        │   ├── TestSwitchClassReferencesJavac.java
        │   ├── TestSwitchGuarded2Javac.java
        │   ├── TestSwitchGuardedEcj.java
        │   ├── TestSwitchGuardedJavac.java
        │   ├── TestSwitchNestedDeconstructionsJavac.java
        │   ├── TestSwitchOnEnum.java
        │   ├── TestSwitchOnEnumEclipse.java
        │   ├── TestSwitchOnStringsEcj.java
        │   ├── TestSwitchOnStringsJavac.java
        │   ├── TestSwitchRules.java
        │   ├── TestSwitchSimpleReferencesJavac.java
        │   ├── TestSwitchWithDeconstructionsWithoutNestedJavac.java
        │   ├── TestSynchronizedMapping.java
        │   ├── TestSynchronizedUnprotected.kt
        │   ├── TestSyntheticAccess.java
        │   ├── TestThrowException.java
        │   ├── TestTryCatchFinally.java
        │   ├── TestTryCatchFinallyJsrRet.java
        │   ├── TestUnionType.java
        │   ├── TestVarArgCalls.java
        │   ├── TryToPreserveCast.java
        │   ├── TypeAnnotations.java
        │   └── package-info.java
        ├── records/
        │   ├── TestRecordAnno.java
        │   ├── TestRecordEmpty.java
        │   ├── TestRecordGenericVararg.java
        │   ├── TestRecordSimple.java
        │   └── TestRecordVararg.java
        ├── sealed/
        │   ├── ClassExtends.java
        │   ├── ClassImplements.java
        │   ├── ClassNonSealed.java
        │   ├── ClassNonSealedExtendsImplements.java
        │   ├── EnumWithOverride.java
        │   ├── InterfaceNonSealed.java
        │   ├── RootWithClassInner.java
        │   ├── RootWithClassOuter.java
        │   ├── RootWithInterfaceInner.java
        │   ├── RootWithInterfaceInnerAndOuter.java
        │   ├── RootWithInterfaceOuter.java
        │   ├── bar/
        │   │   └── BarClassExtends.java
        │   └── foo/
        │       └── RootWithModule.java
        └── typeAnnotations/
            ├── A.java
            ├── ArrayNestedTypeAnnotations.java
            ├── ArrayTypeAnnotations.java
            ├── B.java
            ├── Bar.java
            ├── BarGeneric.java
            ├── C.java
            ├── ClassSuperTypeAnnotations.java
            ├── D.java
            ├── E.java
            ├── F.java
            ├── Foo.java
            ├── GenericArrayNestedTypeAnnotations.java
            ├── GenericArrayTypeAnnotations.java
            ├── GenericNestedTypeAnnotations.java
            ├── GenericTypeAnnotations.java
            ├── InterfaceSuperTypeAnnotations.java
            ├── K.java
            ├── L.java
            ├── MemberDeclarationTypeAnnotations.java
            ├── NestedTypeAnnotations.java
            ├── P.java
            ├── ParentInterface.java
            ├── S.java
            ├── SomeFunInterface.java
            ├── T.java
            ├── V.java
            └── Z.java
Download .txt
Showing preview only (294K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3383 symbols across 397 files)

FILE: src/org/jetbrains/java/decompiler/ClassNameConstants.java
  type ClassNameConstants (line 4) | public interface ClassNameConstants {

FILE: src/org/jetbrains/java/decompiler/code/CodeConstants.java
  type CodeConstants (line 4) | @SuppressWarnings({"unused", "SpellCheckingInspection"})

FILE: src/org/jetbrains/java/decompiler/code/ExceptionHandler.java
  class ExceptionHandler (line 6) | public class ExceptionHandler {
    method toString (line 17) | public String toString() {

FILE: src/org/jetbrains/java/decompiler/code/ExceptionTable.java
  class ExceptionTable (line 7) | public class ExceptionTable {
    method ExceptionTable (line 12) | public ExceptionTable(List<ExceptionHandler> handlers) {
    method getHandlers (line 16) | public List<ExceptionHandler> getHandlers() {

FILE: src/org/jetbrains/java/decompiler/code/FullInstructionSequence.java
  class FullInstructionSequence (line 7) | public class FullInstructionSequence extends InstructionSequence {
    method FullInstructionSequence (line 13) | public FullInstructionSequence(VBStyleCollection<Instruction, Integer>...

FILE: src/org/jetbrains/java/decompiler/code/Instruction.java
  class Instruction (line 6) | public class Instruction {
    method create (line 7) | public static Instruction create(int opcode, boolean wide, int group, ...
    method equals (line 22) | public static boolean equals(Instruction i1, Instruction i2) {
    method Instruction (line 37) | public Instruction(int opcode, int group, boolean wide, int bytecodeVe...
    method initInstruction (line 45) | public void initInstruction(InstructionSequence seq) { }
    method operandsCount (line 47) | public int operandsCount() {
    method operand (line 51) | public int operand(int index) {
    method canFallThrough (line 55) | public boolean canFallThrough() {
    method toString (line 62) | @Override
    method clone (line 82) | @Override

FILE: src/org/jetbrains/java/decompiler/code/InstructionSequence.java
  class InstructionSequence (line 8) | public abstract class InstructionSequence {
    method InstructionSequence (line 20) | protected InstructionSequence() {
    method InstructionSequence (line 24) | protected InstructionSequence(VBStyleCollection<Instruction, Integer> ...
    method clone (line 33) | @Override
    method clear (line 38) | public void clear() {
    method addInstruction (line 44) | public void addInstruction(Instruction inst, int offset) {
    method addInstruction (line 48) | public void addInstruction(int index, Instruction inst, int offset) {
    method addSequence (line 52) | public void addSequence(InstructionSequence seq) {
    method removeInstruction (line 58) | public void removeInstruction(int index) {
    method removeLast (line 62) | public void removeLast() {
    method getInstr (line 68) | public Instruction getInstr(int index) {
    method getLastInstr (line 72) | public Instruction getLastInstr() {
    method getOffset (line 76) | public int getOffset(int index) {
    method getPointerByAbsOffset (line 80) | public int getPointerByAbsOffset(int offset) {
    method getPointerByRelOffset (line 90) | public int getPointerByRelOffset(int offset) {
    method length (line 100) | public int length() {
    method isEmpty (line 104) | public boolean isEmpty() {
    method addToPointer (line 108) | public void addToPointer(int diff) {
    method toString (line 112) | public String toString() {
    method toString (line 116) | public String toString(int indent) {
    method getPointer (line 137) | public int getPointer() {
    method setPointer (line 141) | public void setPointer(int pointer) {
    method getExceptionTable (line 145) | public ExceptionTable getExceptionTable() {

FILE: src/org/jetbrains/java/decompiler/code/JumpInstruction.java
  class JumpInstruction (line 4) | public class JumpInstruction extends Instruction {
    method JumpInstruction (line 7) | public JumpInstruction(int opcode, int group, boolean wide, int byteco...
    method initInstruction (line 11) | @Override
    method clone (line 16) | @Override

FILE: src/org/jetbrains/java/decompiler/code/SimpleInstructionSequence.java
  class SimpleInstructionSequence (line 6) | public class SimpleInstructionSequence extends InstructionSequence {
    method SimpleInstructionSequence (line 8) | public SimpleInstructionSequence() {
    method SimpleInstructionSequence (line 11) | public SimpleInstructionSequence(VBStyleCollection<Instruction, Intege...
    method clone (line 15) | @Override

FILE: src/org/jetbrains/java/decompiler/code/SwitchInstruction.java
  class SwitchInstruction (line 4) | public class SwitchInstruction extends Instruction {
    method SwitchInstruction (line 9) | public SwitchInstruction(int opcode, int group, boolean wide, int byte...
    method initInstruction (line 13) | @Override
    method getDestinations (line 41) | public int[] getDestinations() {
    method getValues (line 45) | public int[] getValues() {
    method getDefaultDestination (line 49) | public int getDefaultDestination() {
    method clone (line 53) | @Override

FILE: src/org/jetbrains/java/decompiler/code/cfg/BasicBlock.java
  class BasicBlock (line 13) | public class BasicBlock implements IGraphNode {
    method BasicBlock (line 25) | public BasicBlock(int id) {
    method BasicBlock (line 29) | public BasicBlock(int id, InstructionSequence seq) {
    method clone (line 34) | public BasicBlock clone(int newId) {
    method getInstruction (line 40) | public Instruction getInstruction(int index) {
    method getLastInstruction (line 44) | public Instruction getLastInstruction() {
    method getOriginalOffset (line 48) | public Integer getOriginalOffset(int index) {
    method size (line 52) | public int size() {
    method addPredecessor (line 56) | public void addPredecessor(BasicBlock block) {
    method removePredecessor (line 60) | public void removePredecessor(BasicBlock block) {
    method addSuccessor (line 64) | public void addSuccessor(BasicBlock block) {
    method removeSuccessor (line 69) | public void removeSuccessor(BasicBlock block) {
    method replaceSuccessor (line 75) | public void replaceSuccessor(BasicBlock oldBlock, BasicBlock newBlock) {
    method addPredecessorException (line 93) | public void addPredecessorException(BasicBlock block) {
    method removePredecessorException (line 97) | public void removePredecessorException(BasicBlock block) {
    method addSuccessorException (line 101) | public void addSuccessorException(BasicBlock block) {
    method removeSuccessorException (line 108) | public void removeSuccessorException(BasicBlock block) {
    method isSuccessor (line 113) | public boolean isSuccessor(BasicBlock block) {
    method getOriginalOffsets (line 117) | public List<Integer> getOriginalOffsets() {
    method getSeq (line 121) | public InstructionSequence getSeq() {
    method getPredecessors (line 125) | public List<BasicBlock> getPredecessors() {
    method getSuccessors (line 129) | public List<BasicBlock> getSuccessors() {
    method getPredecessorExceptions (line 133) | public List<BasicBlock> getPredecessorExceptions() {
    method getSuccessorExceptions (line 137) | public List<BasicBlock> getSuccessorExceptions() {
    method getPredecessorNodes (line 141) | @Override
    method toString (line 148) | @Override

FILE: src/org/jetbrains/java/decompiler/code/cfg/ControlFlowGraph.java
  class ControlFlowGraph (line 19) | public class ControlFlowGraph {
    method ControlFlowGraph (line 42) | public ControlFlowGraph(InstructionSequence seq) {
    method removeMarkers (line 51) | public void removeMarkers() {
    method toString (line 57) | public String toString() {
    method inlineJsr (line 99) | public void inlineJsr(StructClass cl, StructMethod mt) {
    method removeBlock (line 108) | public void removeBlock(BasicBlock block) {
    method getExceptionRange (line 148) | public ExceptionRangeCFG getExceptionRange(BasicBlock handler, BasicBl...
    method buildBlocks (line 190) | private void buildBlocks(InstructionSequence instrseq) {
    method findStartInstructions (line 208) | private static short[] findStartInstructions(InstructionSequence seq) {
    method createBasicBlocks (line 258) | private VBStyleCollection<BasicBlock, Integer> createBasicBlocks(short...
    method connectBlocks (line 298) | private static void connectBlocks(List<BasicBlock> lstbb, Map<Integer,...
    method setExceptionEdges (line 334) | private void setExceptionEdges(InstructionSequence instrseq, Map<Integ...
    method setSubroutineEdges (line 371) | private void setSubroutineEdges() {
    method processJsr (line 427) | private void processJsr() {
    class JsrRecord (line 433) | private static final class JsrRecord {
      method JsrRecord (line 438) | private JsrRecord(BasicBlock jsr, Set<BasicBlock> range, BasicBlock ...
    method processJsrRanges (line 445) | private int processJsrRanges() {
    method getJsrRange (line 495) | private Set<BasicBlock> getJsrRange(BasicBlock jsr, BasicBlock ret) {
    method splitJsrRange (line 559) | private void splitJsrRange(BasicBlock jsr, BasicBlock ret, Set<BasicBl...
    method splitJsrExceptionRanges (line 637) | private void splitJsrExceptionRanges(Set<BasicBlock> common_blocks, Ma...
    method removeJsr (line 667) | private void removeJsr(StructClass cl, StructMethod mt) {
    method removeJsrInstructions (line 671) | private static void removeJsrInstructions(ConstantPool pool, BasicBloc...
    method setFirstAndLastBlocks (line 719) | private void setFirstAndLastBlocks() {
    method getReversePostOrder (line 732) | public List<BasicBlock> getReversePostOrder() {
    method addToReversePostOrderListIterative (line 740) | private static void addToReversePostOrderListIterative(BasicBlock root...
    method getBlocks (line 786) | public VBStyleCollection<BasicBlock, Integer> getBlocks() {
    method getFirst (line 790) | public BasicBlock getFirst() {
    method setFirst (line 794) | public void setFirst(BasicBlock first) {
    method getExceptions (line 798) | public List<ExceptionRangeCFG> getExceptions() {
    method getLast (line 802) | public BasicBlock getLast() {
    method getFinallyExits (line 806) | public Set<BasicBlock> getFinallyExits() {

FILE: src/org/jetbrains/java/decompiler/code/cfg/ExceptionRangeCFG.java
  class ExceptionRangeCFG (line 10) | public class ExceptionRangeCFG {
    method ExceptionRangeCFG (line 15) | public ExceptionRangeCFG(List<BasicBlock> protectedRange, BasicBlock h...
    method isCircular (line 24) | public boolean isCircular() {
    method toString (line 28) | @Override
    method getHandler (line 56) | public BasicBlock getHandler() {
    method setHandler (line 60) | public void setHandler(BasicBlock handler) {
    method getProtectedRange (line 64) | public List<BasicBlock> getProtectedRange() {
    method getExceptionTypes (line 68) | public List<String> getExceptionTypes() {
    method addExceptionType (line 72) | public void addExceptionType(String exceptionType) {
    method getUniqueExceptionsString (line 85) | public String getUniqueExceptionsString() {

FILE: src/org/jetbrains/java/decompiler/code/interpreter/InstructionImpact.java
  class InstructionImpact (line 16) | public final class InstructionImpact {
    method stepTypes (line 328) | public static void stepTypes(DataPoint data, Instruction instr, Consta...
    method processSpecialInstructions (line 367) | private static void processSpecialInstructions(DataPoint data, Instruc...

FILE: src/org/jetbrains/java/decompiler/main/AssertProcessor.java
  class AssertProcessor (line 26) | public final class AssertProcessor {
    method buildAssertions (line 30) | public static void buildAssertions(ClassNode node) {
    method findAssertionField (line 56) | private static StructField findAssertionField(ClassNode node) {
    method replaceAssertions (line 119) | private static boolean replaceAssertions(Statement statement, String c...
    method replaceAssertion (line 146) | private static boolean replaceAssertion(Statement parent, IfStatement ...
    method isAssertionError (line 253) | private static InvocationExprent isAssertionError(Statement stat) {
    method getAssertionExprent (line 274) | private static Object[] getAssertionExprent(Exprent exprent, String cl...
    method isAssertionField (line 314) | private static boolean isAssertionField(Exprent exprent, String classn...

FILE: src/org/jetbrains/java/decompiler/main/CancellationManager.java
  type CancellationManager (line 7) | @ApiStatus.Experimental
    method checkCanceled (line 12) | void checkCanceled() throws CanceledException;
    method startMethod (line 17) | void startMethod(String className, String methodName);
    method finishMethod (line 22) | void finishMethod(String className, String methodName);
    class CanceledException (line 24) | @ApiStatus.Experimental
      method CanceledException (line 27) | public CanceledException(@NotNull Throwable cause) {
      method CanceledException (line 31) | public CanceledException() {
    class TimeExceedException (line 36) | @ApiStatus.Experimental
    method getSimpleWithTimeout (line 40) | static CancellationManager getSimpleWithTimeout(int maxMethodTimeoutSe...
    class TimeoutCancellationManager (line 44) | class TimeoutCancellationManager implements CancellationManager {
      method TimeoutCancellationManager (line 48) | protected TimeoutCancellationManager(int maxMethodTimeoutSec) {
      method checkCanceled (line 52) | @Override
      method startMethod (line 63) | @Override
      method finishMethod (line 68) | @Override

FILE: src/org/jetbrains/java/decompiler/main/ClassReference14Processor.java
  class ClassReference14Processor (line 25) | public final class ClassReference14Processor {
    method processClassReferences (line 58) | public static void processClassReferences(ClassNode node) {
    method processClassRec (line 77) | private static void processClassRec(ClassNode node, Map<ClassWrapper, ...
    method mapClassMethods (line 123) | private static void mapClassMethods(ClassNode node, Map<ClassWrapper, ...
    method replaceInvocations (line 163) | private static boolean replaceInvocations(Exprent exprent, ClassWrappe...
    method isClass14Invocation (line 189) | private static String isClass14Invocation(Exprent exprent, ClassWrappe...

FILE: src/org/jetbrains/java/decompiler/main/ClassWriter.java
  class ClassWriter (line 38) | public class ClassWriter {
    method ClassWriter (line 41) | public ClassWriter() {
    method invokeProcessors (line 45) | private static void invokeProcessors(ClassNode node) {
    method classLambdaToJava (line 66) | public void classLambdaToJava(ClassNode node, TextBuffer buffer, Expre...
    method classToJava (line 156) | public void classToJava(ClassNode node, TextBuffer buffer, int indent,...
    method isSyntheticRecordMethod (line 283) | @SuppressWarnings("SpellCheckingInspection")
    method writeClassDefinition (line 299) | private void writeClassDefinition(ClassNode node, TextBuffer buffer, i...
    method fieldToJava (line 459) | private void fieldToJava(ClassWrapper wrapper, StructClass cl, StructF...
    method writeModuleInfoBody (line 546) | private static void writeModuleInfoBody(TextBuffer buffer, StructModul...
    method isGenerated (line 616) | private static boolean isGenerated(int flags) {
    method addTracer (line 620) | private static void addTracer(StructClass cls, StructMethod method, By...
    method methodToJava (line 627) | private boolean methodToJava(ClassNode node, StructMethod mt, TextBuff...
    method isVarArgRecord (line 905) | private static boolean isVarArgRecord(StructClass cl) {
    method packageInfoToJava (line 912) | public static void packageInfoToJava(StructClass cl, TextBuffer buffer) {
    method moduleInfoToJava (line 920) | public static void moduleInfoToJava(StructClass cl, TextBuffer buffer) {
    method methodLambdaToJava (line 936) | private static void methodLambdaToJava(ClassNode lambdaNode,
    method toValidJavaIdentifier (line 1025) | private static String toValidJavaIdentifier(String name) {
    method recordComponentToJava (line 1047) | private static void recordComponentToJava(StructRecordComponent cd, Te...
    method hideConstructor (line 1075) | private static boolean hideConstructor(
    method getFieldTypeData (line 1107) | private static Map.Entry<VarType, GenericFieldDescriptor> getFieldType...
    method appendDeprecation (line 1121) | private static void appendDeprecation(TextBuffer buffer, int indent) {
    type MType (line 1125) | private enum MType {CLASS, FIELD, METHOD}
    method appendRenameComment (line 1127) | private static void appendRenameComment(TextBuffer buffer, String oldN...
    method getTypePrintOut (line 1163) | private static String getTypePrintOut(VarType type) {
    method appendComment (line 1172) | private static void appendComment(TextBuffer buffer, String comment, i...
    method appendAnnotations (line 1176) | private static void appendAnnotations(TextBuffer buffer, int indent, S...
    method appendParameterAnnotations (line 1195) | private static void appendParameterAnnotations(TextBuffer buffer, Stru...
    method appendModifiers (line 1244) | private static void appendModifiers(TextBuffer buffer, int flags, int ...
    method getGenericClassDescriptor (line 1254) | public static GenericClassDescriptor getGenericClassDescriptor(StructC...
    method appendTypeParameters (line 1264) | public static void appendTypeParameters(
    method appendFQClassNames (line 1293) | private static void appendFQClassNames(TextBuffer buffer, List<String>...

FILE: src/org/jetbrains/java/decompiler/main/ClassesProcessor.java
  class ClassesProcessor (line 34) | public class ClassesProcessor {
    class Inner (line 40) | private static class Inner {
      method equal (line 45) | private static boolean equal(Inner o1, Inner o2) {
    method ClassesProcessor (line 50) | public ClassesProcessor(StructContext context) {
    method loadClasses (line 54) | public void loadClasses(IIdentifierRenamer renamer) {
    method isAnonymous (line 233) | private static boolean isAnonymous(StructClass cl, StructClass enclosi...
    method writeClass (line 316) | public void writeClass(StructClass cl, TextBuffer buffer) throws IOExc...
    method initWrappers (line 390) | private static void initWrappers(ClassNode node) {
    method addClassNameToImport (line 405) | private static void addClassNameToImport(ClassNode node, ImportCollect...
    method destroyWrappers (line 415) | private static void destroyWrappers(ClassNode node) {
    method getMapRootClasses (line 424) | public Map<String, ClassNode> getMapRootClasses() {
    class ClassNode (line 429) | public static class ClassNode {
      method ClassNode (line 451) | public ClassNode(String content_class_name,
      method ClassNode (line 488) | public ClassNode(int type, StructClass classStruct) {
      method getClassNode (line 495) | public ClassNode getClassNode(String qualifiedName) {
      method getWrapper (line 504) | public ClassWrapper getWrapper() {
      method isNonSealed (line 512) | public boolean isNonSealed() {
      method setNonSealed (line 516) | public void setNonSealed(boolean nonSealed) {
      class LambdaInformation (line 520) | public static class LambdaInformation {

FILE: src/org/jetbrains/java/decompiler/main/DecompilerContext.java
  class DecompilerContext (line 18) | public class DecompilerContext {
    method DecompilerContext (line 41) | public DecompilerContext(@NotNull Map<String, Object> properties,
    method DecompilerContext (line 49) | public DecompilerContext(@NotNull Map<String, Object> properties,
    method getCurrentContext (line 80) | public static DecompilerContext getCurrentContext() {
    method setCurrentContext (line 84) | public static void setCurrentContext(DecompilerContext context) {
    method setProperty (line 88) | public static void setProperty(String key, Object value) {
    method startClass (line 92) | public static void startClass(ImportCollector importCollector) {
    method startMethod (line 99) | public static void startMethod(VarProcessor varProcessor) {
    method getProperty (line 109) | public static Object getProperty(String key) {
    method getOption (line 113) | public static boolean getOption(String key) {
    method getNewLineSeparator (line 117) | public static String getNewLineSeparator() {
    method getLogger (line 122) | public static IFernflowerLogger getLogger() {
    method getStructContext (line 126) | public static StructContext getStructContext() {
    method getClassProcessor (line 130) | public static ClassesProcessor getClassProcessor() {
    method getCancellationManager (line 134) | public static CancellationManager getCancellationManager() {
    method getPoolInterceptor (line 138) | public static PoolInterceptor getPoolInterceptor() {
    method getImportCollector (line 142) | public static ImportCollector getImportCollector() {
    method getVarProcessor (line 146) | public static VarProcessor getVarProcessor() {
    method getCounterContainer (line 150) | public static CounterContainer getCounterContainer() {
    method getBytecodeSourceMapper (line 154) | public static BytecodeSourceMapper getBytecodeSourceMapper() {

FILE: src/org/jetbrains/java/decompiler/main/EnumProcessor.java
  class EnumProcessor (line 16) | public final class EnumProcessor {
    method clearEnum (line 17) | public static void clearEnum(ClassWrapper wrapper) {

FILE: src/org/jetbrains/java/decompiler/main/Fernflower.java
  class Fernflower (line 21) | public class Fernflower implements IDecompiledData {
    method Fernflower (line 27) | public Fernflower(IBytecodeProvider provider,
    method Fernflower (line 63) | public Fernflower(IBytecodeProvider provider, IResultSaver saver, Map<...
    method loadHelper (line 67) | private static IIdentifierRenamer loadHelper(String className, IFernfl...
    method addSource (line 81) | public void addSource(File source) {
    method addLibrary (line 85) | public void addLibrary(File library) {
    method decompileContext (line 89) | public void decompileContext() {
    method clearContext (line 99) | public void clearContext() {
    method getClassEntryName (line 103) | @Override
    method getClassContent (line 118) | @Override

FILE: src/org/jetbrains/java/decompiler/main/InitializerProcessor.java
  class InitializerProcessor (line 21) | public final class InitializerProcessor {
    method extractInitializers (line 22) | public static void extractInitializers(ClassWrapper wrapper) {
    method liftConstructor (line 39) | private static void liftConstructor(ClassWrapper wrapper) {
    method hideEmptySuper (line 82) | private static void hideEmptySuper(ClassWrapper wrapper) {
    method extractStaticInitializers (line 101) | private static void extractStaticInitializers(ClassWrapper wrapper, Me...
    method extractDynamicInitializers (line 140) | private static void extractDynamicInitializers(ClassWrapper wrapper) {
    method isExprentIndependent (line 229) | private static boolean isExprentIndependent(Exprent exprent, MethodWra...

FILE: src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java
  class BytecodeMappingTracer (line 9) | public class BytecodeMappingTracer {
    method BytecodeMappingTracer (line 16) | public BytecodeMappingTracer() { }
    method BytecodeMappingTracer (line 18) | public BytecodeMappingTracer(int initial_source_line) {
    method incrementCurrentSourceLine (line 22) | public void incrementCurrentSourceLine() {
    method incrementCurrentSourceLine (line 26) | public void incrementCurrentSourceLine(int number_lines) {
    method addMapping (line 30) | public void addMapping(int bytecode_offset) {
    method addMapping (line 34) | public void addMapping(Set<Integer> bytecode_offsets) {
    method addTracer (line 42) | public void addTracer(BytecodeMappingTracer tracer) {
    method getMapping (line 50) | public Map<Integer, Integer> getMapping() {
    method getCurrentSourceLine (line 54) | public int getCurrentSourceLine() {
    method setCurrentSourceLine (line 58) | public void setCurrentSourceLine(int currentSourceLine) {
    method setLineNumberTable (line 62) | public void setLineNumberTable(StructLineNumberTableAttribute lineNumb...
    method getUnmappedLines (line 68) | public Set<Integer> getUnmappedLines() {
    method getOriginalLinesMapping (line 72) | public Map<Integer, Integer> getOriginalLinesMapping() {

FILE: src/org/jetbrains/java/decompiler/main/collectors/BytecodeSourceMapper.java
  class BytecodeSourceMapper (line 10) | public class BytecodeSourceMapper {
    method addMapping (line 20) | public void addMapping(String className, String methodName, int byteco...
    method addTracer (line 28) | public void addTracer(String className, String methodName, BytecodeMap...
    method dumpMapping (line 36) | public void dumpMapping(TextBuffer buffer, boolean offsetsToHex) {
    method addTotalOffset (line 91) | public void addTotalOffset(int offset_total) {
    method getOriginalLinesMapping (line 98) | public int[] getOriginalLinesMapping() {

FILE: src/org/jetbrains/java/decompiler/main/collectors/CounterContainer.java
  class CounterContainer (line 4) | public class CounterContainer {
    method setCounter (line 11) | public void setCounter(int counter, int value) {
    method getCounter (line 15) | public int getCounter(int counter) {
    method getCounterAndIncrement (line 19) | public int getCounterAndIncrement(int counter) {

FILE: src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java
  class ImportCollector (line 16) | public class ImportCollector {
    method ImportCollector (line 27) | public ImportCollector(ClassNode root) {
    method getNestedNameInClassContext (line 88) | public String getNestedNameInClassContext(String classToName) {
    method getNestedName (line 98) | public String getNestedName(String fullName) {
    method getNestedName (line 102) | public String getNestedName(String fullName, boolean imported) {
    method writeImports (line 171) | public void writeImports(TextBuffer buffer, boolean addSeparator) {
    method packImports (line 181) | private List<String> packImports() {

FILE: src/org/jetbrains/java/decompiler/main/collectors/VarNamesCollector.java
  class VarNamesCollector (line 8) | public class VarNamesCollector {
    method VarNamesCollector (line 12) | public VarNamesCollector() { }
    method VarNamesCollector (line 14) | public VarNamesCollector(Collection<String> setNames) {
    method addName (line 18) | public void addName(String value) {
    method getFreeName (line 22) | public String getFreeName(int index) {
    method getFreeName (line 26) | public String getFreeName(String proposition) {

FILE: src/org/jetbrains/java/decompiler/main/decompiler/BaseDecompiler.java
  class BaseDecompiler (line 14) | @SuppressWarnings("unused")
    method BaseDecompiler (line 18) | public BaseDecompiler(IBytecodeProvider provider, IResultSaver saver, ...
    method BaseDecompiler (line 22) | public BaseDecompiler(IBytecodeProvider provider, IResultSaver saver, ...
    method addSource (line 27) | public void addSource(File source) {
    method addLibrary (line 31) | public void addLibrary(File library) {
    method decompileContext (line 35) | public void decompileContext() {

FILE: src/org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler.java
  class ConsoleDecompiler (line 21) | public class ConsoleDecompiler implements IBytecodeProvider, IResultSaver {
    method main (line 22) | @SuppressWarnings("UseOfSystemOutOrSystemErr")
    method addPath (line 86) | @SuppressWarnings("UseOfSystemOutOrSystemErr")
    method ConsoleDecompiler (line 106) | public ConsoleDecompiler(File destination, Map<String, Object> options...
    method ConsoleDecompiler (line 111) | public ConsoleDecompiler(File destination, Map<String, Object> options...
    method addSource (line 116) | public void addSource(File source) {
    method addLibrary (line 120) | public void addLibrary(File library) {
    method decompileContext (line 124) | public void decompileContext() {
    method getBytecode (line 137) | @Override
    method getAbsolutePath (line 156) | private String getAbsolutePath(String path) {
    method saveFolder (line 160) | @Override
    method copyFile (line 168) | @Override
    method saveClassFile (line 178) | @Override
    method createArchive (line 189) | @Override
    method saveDirEntry (line 206) | @Override
    method copyEntry (line 211) | @Override
    method saveClassEntry (line 235) | @Override
    method checkEntry (line 256) | private boolean checkEntry(String entryName, String file) {
    method closeArchive (line 267) | @Override

FILE: src/org/jetbrains/java/decompiler/main/decompiler/PrintStreamLogger.java
  class PrintStreamLogger (line 9) | public class PrintStreamLogger extends IFernflowerLogger {
    method PrintStreamLogger (line 14) | public PrintStreamLogger(PrintStream printStream) {
    method writeMessage (line 19) | @Override
    method writeMessage (line 26) | @Override
    method startReadingClass (line 34) | @Override
    method endReadingClass (line 42) | @Override
    method startClass (line 50) | @Override
    method endClass (line 58) | @Override
    method startMethod (line 66) | @Override
    method endMethod (line 74) | @Override
    method startWriteClass (line 82) | @Override
    method endWriteClass (line 90) | @Override

FILE: src/org/jetbrains/java/decompiler/main/extern/ClassFormatException.java
  class ClassFormatException (line 4) | public class ClassFormatException extends RuntimeException {
    method ClassFormatException (line 5) | public ClassFormatException(String message) {

FILE: src/org/jetbrains/java/decompiler/main/extern/IBytecodeProvider.java
  type IBytecodeProvider (line 6) | public interface IBytecodeProvider {
    method getBytecode (line 7) | byte[] getBytecode(String externalPath, String internalPath) throws IO...

FILE: src/org/jetbrains/java/decompiler/main/extern/IFernflowerLogger.java
  class IFernflowerLogger (line 4) | public abstract class IFernflowerLogger {
    type Severity (line 6) | public enum Severity {
      method Severity (line 11) | Severity(String prefix) {
    method accepts (line 18) | public boolean accepts(Severity severity) {
    method setSeverity (line 22) | public void setSeverity(Severity severity) {
    method writeMessage (line 26) | public abstract void writeMessage(String message, Severity severity);
    method writeMessage (line 28) | public abstract void writeMessage(String message, Severity severity, T...
    method writeMessage (line 30) | public void writeMessage(String message, Throwable t) {
    method startReadingClass (line 34) | public void startReadingClass(String className) { }
    method endReadingClass (line 36) | public void endReadingClass() { }
    method startClass (line 38) | public void startClass(String className) { }
    method endClass (line 40) | public void endClass() { }
    method startMethod (line 42) | public void startMethod(String methodName) { }
    method endMethod (line 44) | public void endMethod() { }
    method startWriteClass (line 46) | public void startWriteClass(String className) { }
    method endWriteClass (line 48) | public void endWriteClass() { }

FILE: src/org/jetbrains/java/decompiler/main/extern/IFernflowerPreferences.java
  type IFernflowerPreferences (line 10) | public interface IFernflowerPreferences {
    method getDefaults (line 56) | static Map<String, Object> getDefaults() {

FILE: src/org/jetbrains/java/decompiler/main/extern/IIdentifierRenamer.java
  type IIdentifierRenamer (line 4) | public interface IIdentifierRenamer {
    type Type (line 6) | enum Type {ELEMENT_CLASS, ELEMENT_FIELD, ELEMENT_METHOD}
    method toBeRenamed (line 8) | boolean toBeRenamed(Type elementType, String className, String element...
    method getNextClassName (line 10) | String getNextClassName(String fullName, String shortName);
    method getNextFieldName (line 12) | String getNextFieldName(String className, String field, String descrip...
    method getNextMethodName (line 14) | String getNextMethodName(String className, String method, String descr...

FILE: src/org/jetbrains/java/decompiler/main/extern/IResultSaver.java
  type IResultSaver (line 6) | public interface IResultSaver {
    method saveFolder (line 7) | void saveFolder(String path);
    method copyFile (line 9) | void copyFile(String source, String path, String entryName);
    method saveClassFile (line 11) | void saveClassFile(String path, String qualifiedName, String entryName...
    method createArchive (line 13) | void createArchive(String path, String archiveName, Manifest manifest);
    method saveDirEntry (line 15) | void saveDirEntry(String path, String archiveName, String entryName);
    method copyEntry (line 17) | void copyEntry(String source, String path, String archiveName, String ...
    method saveClassEntry (line 19) | void saveClassEntry(String path, String archiveName, String qualifiedN...
    method closeArchive (line 21) | void closeArchive(String path, String archiveName);

FILE: src/org/jetbrains/java/decompiler/main/rels/ClassWrapper.java
  class ClassWrapper (line 29) | public class ClassWrapper {
    method ClassWrapper (line 36) | public ClassWrapper(StructClass classStruct) {
    method init (line 40) | public void init() {
    method applyParameterNames (line 132) | private static void applyParameterNames(StructMethod mt, MethodDescrip...
    method applyDebugInfo (line 152) | private static void applyDebugInfo(StructMethod mt, VarProcessor varPr...
    method getMethodWrapper (line 178) | public MethodWrapper getMethodWrapper(String name, String descriptor) {
    method getClassStruct (line 182) | public StructClass getClassStruct() {
    method getMethods (line 186) | public VBStyleCollection<MethodWrapper, String> getMethods() {
    method getHiddenMembers (line 190) | public Set<String> getHiddenMembers() {
    method getStaticFieldInitializers (line 194) | public VBStyleCollection<Exprent, String> getStaticFieldInitializers() {
    method getDynamicFieldInitializers (line 198) | public VBStyleCollection<Exprent, String> getDynamicFieldInitializers() {
    method toString (line 202) | @Override

FILE: src/org/jetbrains/java/decompiler/main/rels/LambdaProcessor.java
  class LambdaProcessor (line 26) | public class LambdaProcessor {
    method processClass (line 31) | public void processClass(ClassNode node) throws IOException {

FILE: src/org/jetbrains/java/decompiler/main/rels/MethodProcessorRunnable.java
  class MethodProcessorRunnable (line 23) | public class MethodProcessorRunnable implements Runnable {
    method MethodProcessorRunnable (line 36) | public MethodProcessorRunnable(StructClass klass,
    method run (line 48) | @Override
    method codeToJava (line 70) | public static RootStatement codeToJava(StructClass cl, StructMethod mt...
    method getResult (line 226) | public RootStatement getResult() throws Throwable {
    method isFinished (line 232) | public boolean isFinished() {

FILE: src/org/jetbrains/java/decompiler/main/rels/MethodWrapper.java
  class MethodWrapper (line 16) | public class MethodWrapper {
    method MethodWrapper (line 27) | public MethodWrapper(RootStatement root, VarProcessor varproc, StructM...
    method getOrBuildGraph (line 34) | public DirectGraph getOrBuildGraph() {
    method toString (line 41) | @Override

FILE: src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java
  class NestedClassProcessor (line 32) | public class NestedClassProcessor {
    method processClass (line 33) | public void processClass(ClassNode root, ClassNode node) {
    method setLambdaVars (line 90) | private static void setLambdaVars(ClassNode parent, ClassNode child) {
    method checkNotFoundClasses (line 167) | private static void checkNotFoundClasses(ClassNode root, ClassNode nod...
    method insertNestedClass (line 209) | private static boolean insertNestedClass(ClassNode root, ClassNode chi...
    method computeLocalVarsAndDefinitions (line 232) | private static void computeLocalVarsAndDefinitions(ClassNode node) {
    method insertLocalVars (line 391) | private static void insertLocalVars(ClassNode parent, ClassNode child) {
    method getMaskLocalVars (line 571) | private static Map<String, List<VarFieldPair>> getMaskLocalVars(ClassW...
    method getEnclosingVarField (line 601) | private static String getEnclosingVarField(StructClass cl, MethodWrapp...
    method possiblySyntheticField (line 638) | private static boolean possiblySyntheticField(StructField fd) {
    method mergeListSignatures (line 642) | private static void mergeListSignatures(List<VarFieldPair> first, List...
    method isEqual (line 707) | private static boolean isEqual(boolean both, VarFieldPair fObj, VarFie...
    method setLocalClassDefinition (line 729) | private static void setLocalClassDefinition(MethodWrapper method, Clas...
    method findFirstBlock (line 769) | private static Statement findFirstBlock(Statement stat, Set<Statement>...
    method getDefStatement (line 796) | private static Statement getDefStatement(Statement stat, VarType class...
    method searchForClass (line 849) | private static boolean searchForClass(Exprent exprent, VarType classTy...
    class VarFieldPair (line 889) | private static class VarFieldPair {
      method VarFieldPair (line 893) | VarFieldPair(String field, VarVersionPair varPair) {
      method equals (line 898) | @Override
      method hashCode (line 906) | @Override

FILE: src/org/jetbrains/java/decompiler/main/rels/NestedMemberAccess.java
  class NestedMemberAccess (line 20) | public class NestedMemberAccess {
    type MethodAccess (line 22) | private enum MethodAccess {NORMAL, FIELD_GET, FIELD_SET, METHOD, FUNCT...
    method propagateMemberAccess (line 28) | public void propagateMemberAccess(ClassNode root) {
    method computeMethodTypes (line 41) | private void computeMethodTypes(ClassNode node) {
    method computeMethodType (line 55) | private void computeMethodType(ClassNode node, MethodWrapper method) {
    method eliminateStaticAccess (line 206) | private void eliminateStaticAccess(ClassNode node) {
    method replaceInvocations (line 263) | private boolean replaceInvocations(ClassNode caller, MethodWrapper met...
    method sameTree (line 295) | private static boolean sameTree(ClassNode caller, ClassNode callee) {
    method replaceAccessExprent (line 312) | private Exprent replaceAccessExprent(ClassNode caller, MethodWrapper m...
    method replaceFunction (line 447) | private static Exprent replaceFunction(final InvocationExprent invexpr...

FILE: src/org/jetbrains/java/decompiler/modules/code/DeadCodeHelper.java
  class DeadCodeHelper (line 17) | public final class DeadCodeHelper {
    method removeDeadBlocks (line 18) | public static void removeDeadBlocks(ControlFlowGraph graph) {
    method removeEmptyBlocks (line 47) | public static void removeEmptyBlocks(ControlFlowGraph graph) {
    method removeEmptyBlock (line 66) | private static boolean removeEmptyBlock(ControlFlowGraph graph, BasicB...
    method isDominator (line 188) | public static boolean isDominator(ControlFlowGraph graph, BasicBlock b...
    method removeGoTos (line 228) | public static void removeGoTos(ControlFlowGraph graph) {
    method connectDummyExitBlock (line 240) | public static void connectDummyExitBlock(ControlFlowGraph graph) {
    method extendSynchronizedRangeToMonitorExit (line 248) | public static void extendSynchronizedRangeToMonitorExit(ControlFlowGra...
    method findMonitorExitIndex (line 370) | private static int findMonitorExitIndex(InstructionSequence sequence) {
    method incorporateValueReturns (line 381) | public static void incorporateValueReturns(ControlFlowGraph graph) {
    method mergeBasicBlocks (line 477) | public static void mergeBasicBlocks(ControlFlowGraph graph) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/ClasspathHelper.java
  class ClasspathHelper (line 12) | public final class ClasspathHelper {
    method findMethod (line 16) | public static Method findMethod(String classname, String methodName, M...
    method findMethodOnClasspath (line 32) | private static Method findMethodOnClasspath(String targetClass, String...
    method buildMethodSignature (line 49) | private static String buildMethodSignature(String name, MethodDescript...
    method appendType (line 66) | private static void appendType(StringBuilder sb, VarType type) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/ClearStructHelper.java
  class ClearStructHelper (line 10) | public final class ClearStructHelper {
    method clearStatements (line 12) | public static void clearStatements(RootStatement root) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/ConcatenationHelper.java
  class ConcatenationHelper (line 17) | public final class ConcatenationHelper {
    method contractStringConcat (line 26) | public static Exprent contractStringConcat(Exprent expr) {
    method createConcatExprent (line 128) | private static Exprent createConcatExprent(List<Exprent> lstOperands, ...
    method extractParameters (line 143) | private static List<Exprent> extractParameters(List<PooledConstant> bo...
    method isAppendConcat (line 219) | private static boolean isAppendConcat(InvocationExprent expr, VarType ...
    method isNewConcat (line 246) | private static boolean isNewConcat(NewExprent expr, VarType cltype) {
    method removeStringValueOf (line 255) | private static Exprent removeStringValueOf(Exprent exprent) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/DecHelper.java
  class DecHelper (line 16) | public final class DecHelper {
    method checkStatementExceptions (line 18) | public static boolean checkStatementExceptions(List<? extends Statemen...
    method isChoiceStatement (line 61) | public static boolean isChoiceStatement(Statement head, List<? super S...
    method getUniquePredExceptions (line 189) | public static Set<Statement> getUniquePredExceptions(Statement head) {
    method copyExprentList (line 195) | public static List<Exprent> copyExprentList(List<? extends Exprent> ls...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/DomHelper.java
  class DomHelper (line 21) | public final class DomHelper {
    method graphToStatement (line 24) | private static RootStatement graphToStatement(ControlFlowGraph graph) {
    method calcPostDominators (line 92) | public static VBStyleCollection<List<Integer>, Integer> calcPostDomina...
    method parseGraph (line 193) | public static RootStatement parseGraph(ControlFlowGraph graph) {
    method removeSynchronizedHandler (line 218) | public static void removeSynchronizedHandler(Statement stat) {
    method buildSynchronized (line 230) | private static void buildSynchronized(Statement stat) {
    method processStatement (line 298) | private static boolean processStatement(Statement general, HashMap<Int...
    method findGeneralStatement (line 391) | private static Statement findGeneralStatement(Statement stat, boolean ...
    method checkSynchronizedCompleteness (line 548) | private static boolean checkSynchronizedCompleteness(Set<Statement> se...
    method findSimpleStatements (line 566) | private static boolean findSimpleStatements(Statement stat, HashMap<In...
    method detectStatement (line 631) | private static Statement detectStatement(Statement head) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/ExitHelper.java
  class ExitHelper (line 20) | public final class ExitHelper {
    method condenseExits (line 21) | public static boolean condenseExits(RootStatement root) {
    method cleanUpUnreachableBlocks (line 32) | private static void cleanUpUnreachableBlocks(Statement stat) {
    method integrateExits (line 66) | private static int integrateExits(Statement stat) {
    method isExitEdge (line 175) | private static Statement isExitEdge(StatEdge edge) {
    method isOnlyEdge (line 191) | private static boolean isOnlyEdge(StatEdge edge) {
    method removeRedundantReturns (line 214) | public static void removeRedundantReturns(RootStatement root) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/ExprProcessor.java
  class ExprProcessor (line 38) | public class ExprProcessor {
    method ExprProcessor (line 109) | public ExprProcessor(MethodDescriptor md, VarProcessor varProc) {
    method processStatement (line 114) | public void processStatement(RootStatement root, StructClass cl) {
    method buildEntryPointKey (line 219) | private static String buildEntryPointKey(LinkedList<String> entryPoint...
    method collectCatchVars (line 231) | private static void collectCatchVars(Statement stat, FlattenStatements...
    method initStatementExprEntries (line 255) | private static void initStatementExprEntries(Statement stat) {
    method processBlock (line 263) | public void processBlock(BasicBlockStatement stat, PrimitiveExpression...
    method nextMeaningfulOffset (line 597) | private static int nextMeaningfulOffset(BasicBlock block, int index) {
    method pushEx (line 616) | private void pushEx(ExpressionStack stack, List<Exprent> exprlist, Exp...
    method pushEx (line 620) | private void pushEx(ExpressionStack stack, List<Exprent> exprlist, Exp...
    method insertByOffsetEx (line 629) | private void insertByOffsetEx(int offset, ExpressionStack stack, List<...
    method getTypeName (line 654) | public static String getTypeName(VarType type, List<TypeAnnotationWrit...
    method getTypeName (line 658) | public static String getTypeName(VarType type, boolean getShort, List<...
    method writeTypeAnnotationBeforeType (line 697) | public static List<TypeAnnotationWriteHelper> writeTypeAnnotationBefor...
    method writeNestedClass (line 716) | public static List<TypeAnnotationWriteHelper> writeNestedClass(
    method canWriteNestedTypeAnnotation (line 756) | public static boolean canWriteNestedTypeAnnotation(String curPath, Lis...
    method enclosingClassList (line 764) | public static List<ClassesProcessor.ClassNode> enclosingClassList() {
    method writeNestedTypeAnnotations (line 779) | public static List<TypeAnnotationWriteHelper> writeNestedTypeAnnotations(
    method popNestedTypeAnnotation (line 796) | public static void popNestedTypeAnnotation(List<TypeAnnotationWriteHel...
    method getCastTypeName (line 805) | public static String getCastTypeName(VarType type, List<TypeAnnotation...
    method getCastTypeName (line 809) | public static String getCastTypeName(VarType type, boolean getShort, L...
    method arrayPath (line 818) | public static List<TypeAnnotationWriteHelper> arrayPath(Type type, Lis...
    method nonArrayPath (line 824) | public static List<TypeAnnotationWriteHelper> nonArrayPath(Type type, ...
    method writeArray (line 837) | public static void writeArray(StringBuilder sb, int arrayDim, List<Typ...
    method getExpressionData (line 853) | public static PrimitiveExpressionList getExpressionData(VarExprent var) {
    method endsWithSemicolon (line 863) | public static boolean endsWithSemicolon(Exprent expr) {
    method addDeletedGotoInstructionMapping (line 871) | private static void addDeletedGotoInstructionMapping(Statement stat, B...
    method jmpWrapper (line 882) | public static TextBuffer jmpWrapper(Statement stat, int indent, boolea...
    method buildJavaClassName (line 916) | public static String buildJavaClassName(String name) {
    method listToJava (line 930) | public static TextBuffer listToJava(List<? extends Exprent> lst, int i...
    method getDefaultArrayValue (line 965) | public static ConstExprent getDefaultArrayValue(VarType arrType) {
    method getCastedExprent (line 985) | public static boolean getCastedExprent(Exprent exprent,
    method getCastedExprent (line 994) | public static boolean getCastedExprent(Exprent exprent,
    method isIntConstant (line 1051) | private static boolean isIntConstant(Exprent exprent) {
    method isNarrowedIntType (line 1064) | private static boolean isNarrowedIntType(VarType type) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/ExpressionStack.java
  class ExpressionStack (line 7) | public class ExpressionStack extends ListStack<Exprent> {
    method ExpressionStack (line 8) | public ExpressionStack() { }
    method ExpressionStack (line 10) | private ExpressionStack(int initialCapacity) {
    method copy (line 14) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/FinallyProcessor.java
  class FinallyProcessor (line 41) | public class FinallyProcessor {
    method FinallyProcessor (line 48) | public FinallyProcessor(MethodDescriptor md, VarProcessor varProc) {
    method iterateGraph (line 53) | public boolean iterateGraph(StructClass cl, StructMethod mt, RootState...
    class Record (line 111) | private static final class Record {
      method Record (line 115) | private Record(int firstCode, Map<BasicBlock, Boolean> mapLast) {
    method getFinallyInformation (line 121) | private Record getFinallyInformation(StructClass cl, StructMethod mt, ...
    method insertSemaphore (line 284) | private static void insertSemaphore(ControlFlowGraph graph,
    method createHeadBlock (line 354) | @NotNull
    method insertBlockBefore (line 362) | private static void insertBlockBefore(ControlFlowGraph graph, BasicBlo...
    method getAllBasicBlocks (line 394) | private static Set<BasicBlock> getAllBasicBlocks(Statement stat) {
    method verifyFinallyEx (line 418) | private boolean verifyFinallyEx(ControlFlowGraph graph, CatchAllStatem...
    class Area (line 486) | private static final class Area {
      method Area (line 491) | private Area(BasicBlock start, Set<BasicBlock> sample, BasicBlock ne...
    method compareSubGraphsEx (line 498) | private Area compareSubGraphsEx(ControlFlowGraph graph,
    method getUniqueNext (line 618) | private static BasicBlock getUniqueNext(ControlFlowGraph graph, Set<Ba...
    method compareBasicBlocksEx (line 690) | private boolean compareBasicBlocksEx(ControlFlowGraph graph,
    method copyExceptionEdges (line 770) | public static void copyExceptionEdges(ControlFlowGraph graph, BasicBlo...
    method equalInstructions (line 779) | public boolean equalInstructions(Instruction first, Instruction second...
    method deleteArea (line 806) | private static void deleteArea(ControlFlowGraph graph, Area area) {
    method removeExceptionInstructionsEx (line 895) | private static void removeExceptionInstructionsEx(BasicBlock block, in...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/IdeaNotNullHelper.java
  class IdeaNotNullHelper (line 19) | public final class IdeaNotNullHelper {
    method removeHardcodedChecks (line 22) | public static boolean removeHardcodedChecks(Statement root, StructMeth...
    method findAndRemoveParameterCheck (line 39) | private static boolean findAndRemoveParameterCheck(Statement stat, Str...
    method removeParameterCheck (line 125) | private static void removeParameterCheck(Statement stat) {
    method findAndRemoveReturnCheck (line 156) | private static boolean findAndRemoveReturnCheck(Statement stat, Struct...
    method removeReturnCheck (line 177) | private static boolean removeReturnCheck(Statement stat, StructMethod ...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/IfHelper.java
  class IfHelper (line 17) | public final class IfHelper {
    method mergeAllIfs (line 18) | public static boolean mergeAllIfs(RootStatement root) {
    method mergeAllIfsRec (line 26) | private static boolean mergeAllIfsRec(Statement stat, Set<? super Inte...
    method mergeIfs (line 54) | public static boolean mergeIfs(Statement statement, Set<? super Intege...
    method collapseIfIf (line 117) | private static boolean collapseIfIf(IfNode rtnode) {
    method collapseIfElse (line 189) | private static boolean collapseIfElse(IfNode rtnode) {
    method collapseElse (line 240) | private static boolean collapseElse(IfNode rtnode) {
    method buildGraph (line 340) | private static IfNode buildGraph(IfStatement stat, boolean stsingle) {
    method reorderIf (line 403) | private static boolean reorderIf(IfStatement ifstat) {
    method hasDirectEndEdge (line 611) | private static boolean hasDirectEndEdge(Statement stat, Statement from) {
    method getNextStatement (line 654) | private static Statement getNextStatement(Statement stat) {
    method existsPath (line 678) | private static boolean existsPath(Statement from, Statement to) {
    class IfNode (line 688) | private static class IfNode {
      method IfNode (line 693) | IfNode(Statement value) {
      method addChild (line 697) | public void addChild(IfNode child, int type) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/InlineSingleBlockHelper.java
  class InlineSingleBlockHelper (line 13) | public final class InlineSingleBlockHelper {
    method inlineSingleBlocks (line 16) | public static boolean inlineSingleBlocks(RootStatement root) {
    method inlineSingleBlocksRec (line 27) | private static boolean inlineSingleBlocksRec(Statement stat) {
    method inlineBlock (line 49) | private static void inlineBlock(SequenceStatement seq, int index) {
    method isInlineable (line 108) | private static boolean isInlineable(SequenceStatement seq, int index) {
    method sameCatchRanges (line 139) | private static boolean sameCatchRanges(StatEdge edge) {
    method noExitLabels (line 169) | private static boolean noExitLabels(Statement block, Statement sequenc...
    method isBreakEdgeLabeled (line 188) | public static boolean isBreakEdgeLabeled(Statement source, Statement c...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java
  class LabelHelper (line 15) | public final class LabelHelper {
    method cleanUpEdges (line 18) | public static void cleanUpEdges(RootStatement root) {
    method identifyLabels (line 31) | public static void identifyLabels(RootStatement root) {
    method liftClosures (line 42) | private static void liftClosures(Statement stat) {
    method removeNonImmediateEdges (line 78) | private static void removeNonImmediateEdges(Statement stat) {
    method lowContinueLabels (line 91) | public static void lowContinueLabels(Statement stat, HashSet<StatEdge>...
    method lowClosures (line 128) | public static void lowClosures(Statement stat) {
    method resetAllEdges (line 148) | private static void resetAllEdges(Statement stat) {
    method setRetEdgesUnlabeled (line 160) | private static void setRetEdgesUnlabeled(RootStatement root) {
    method setExplicitEdges (line 171) | private static HashMap<Statement, List<StatEdge>> setExplicitEdges(Sta...
    method processEdgesWithNext (line 289) | private static void processEdgesWithNext(Statement stat, HashMap<State...
    method hideDefaultSwitchEdges (line 381) | private static void hideDefaultSwitchEdges(Statement stat) {
    class LabelSets (line 409) | private static class LabelSets {
    method processStatementLabel (line 414) | private static LabelSets processStatementLabel(Statement stat) {
    method replaceContinueWithBreak (line 448) | public static void replaceContinueWithBreak(Statement stat) {
    method getMinContinueClosure (line 474) | private static Statement getMinContinueClosure(StatEdge edge) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/LoopExtractHelper.java
  class LoopExtractHelper (line 18) | public final class LoopExtractHelper {
    method extractLoops (line 21) | public static boolean extractLoops(Statement root) {
    method extractLoopsRec (line 33) | private static int extractLoopsRec(Statement stat) {
    method extractLoop (line 65) | private static boolean extractLoop(DoStatement stat) {
    method extractLastIf (line 79) | private static boolean extractLastIf(DoStatement stat) {
    method extractFirstIf (line 110) | private static boolean extractFirstIf(DoStatement stat) {
    method isExternStatement (line 138) | private static boolean isExternStatement(DoStatement loop, Statement b...
    method extractIfBlock (line 157) | private static void extractIfBlock(DoStatement loop, IfStatement ifsta...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java
  class MergeHelper (line 20) | public final class MergeHelper {
    method enhanceLoops (line 21) | public static void enhanceLoops(Statement root) {
    method enhanceLoopsRec (line 26) | private static boolean enhanceLoopsRec(Statement stat) {
    method enhanceLoop (line 42) | private static boolean enhanceLoop(DoStatement stat) {
    method matchDoWhile (line 64) | private static void matchDoWhile(DoStatement stat) {
    method matchWhile (line 125) | private static boolean matchWhile(DoStatement stat) {
    method isDirectPath (line 236) | public static boolean isDirectPath(Statement stat, Statement endstat) {
    method matchFor (line 273) | private static void matchFor(DoStatement stat) {
    method removeLastEmptyStatement (line 353) | private static void removeLastEmptyStatement(DoStatement dostat, State...
    method getLastDirectData (line 377) | private static Statement getLastDirectData(Statement stat) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/PPandMMHelper.java
  class PPandMMHelper (line 18) | public class PPandMMHelper {
    method findPPandMM (line 22) | public boolean findPPandMM(RootStatement root) {
    method processExprentList (line 51) | private boolean processExprentList(List<Exprent> lst) {
    method processExprentRecursive (line 73) | private Exprent processExprentRecursive(Exprent exprent) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/PatternHelper.java
  class PatternHelper (line 22) | public final class PatternHelper {
    method replaceAssignmentsWithPatternVariables (line 34) | public static void replaceAssignmentsWithPatternVariables(@NotNull Roo...
    method replaceAssignmentsWithPatternVariables (line 54) | private static List<Runnable> replaceAssignmentsWithPatternVariables(@...
    method findInstanceofExprent (line 95) | @Nullable
    method findInitPatternVarCandidate (line 103) | static PatternVariableCandidate findInitPatternVarCandidate(@NotNull S...
    method findNextPatternVarCandidate (line 129) | @Nullable
    method findSimpleCandidateFromIfStat (line 165) | @Nullable
    method findInitRecordPatternCandidate (line 213) | private static PatternVariableCandidate findInitRecordPatternCandidate...
    method findRecordPatternCandidate (line 230) | @Nullable
    method findRecursivelyInstanceOfIfStatement (line 301) | private static PatternVariableCandidate findRecursivelyInstanceOfIfSta...
    method processCatchStatement (line 353) | private static boolean processCatchStatement(@NotNull VarTracker tracker,
    method processFullBlock (line 428) | private static boolean processFullBlock(@NotNull VarTracker tracker,
    method processAtLeastOneBlock (line 446) | static boolean processAtLeastOneBlock(@NotNull VarTracker tracker, @No...
    method collectRecordAssignment (line 468) | private static boolean collectRecordAssignment(@NotNull VarTracker tra...
    method checkRegularEdgesForRecordPattern (line 508) | private static boolean checkRegularEdgesForRecordPattern(@NotNull Stat...
    class PatternVariableCandidate (line 525) | static class PatternVariableCandidate {
      method PatternVariableCandidate (line 533) | PatternVariableCandidate(@NotNull VarExprent varExprent,
      method getTempAssignments (line 545) | List<TempVarAssignmentItem> getTempAssignments() {
      method getVarExprent (line 549) | @NotNull VarExprent getVarExprent() {
      method getTempVarAssignments (line 553) | @NotNull List<TempVarAssignmentItem> getTempVarAssignments() {
      method getCleaner (line 557) | @NotNull Runnable getCleaner() {
      method getUsedIfStatement (line 561) | @NotNull Set<IfStatement> getUsedIfStatement() {
      method getNextStatement (line 565) | @NotNull Statement getNextStatement() {
      method getGuards (line 569) | @Nullable Exprent getGuards() {
      method setGuards (line 573) | void setGuards(@Nullable Exprent guards) {
    class VarTracker (line 578) | static class VarTracker {
      method VarTracker (line 586) | VarTracker(@NotNull RecordVarExprent root) { this.root = root; }
      method put (line 588) | void put(@NotNull VarExprent varExprent,
      method getRecord (line 597) | @Nullable
      method getTempItems (line 602) | @NotNull
      method copy (line 607) | @Nullable
      method putAll (line 636) | private void putAll(@NotNull VarTracker tracker) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/PrimitiveExpressionList.java
  class PrimitiveExpressionList (line 9) | public class PrimitiveExpressionList {
    method PrimitiveExpressionList (line 13) | public PrimitiveExpressionList() {
    method PrimitiveExpressionList (line 17) | private PrimitiveExpressionList(ExpressionStack stack) {
    method copy (line 21) | public PrimitiveExpressionList copy() {
    method getExpressions (line 25) | public List<Exprent> getExpressions() {
    method getStack (line 29) | public ExpressionStack getStack() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/SecondaryFunctionsHelper.java
  class SecondaryFunctionsHelper (line 20) | public final class SecondaryFunctionsHelper {
    method identifySecondaryFunctions (line 42) | public static boolean identifySecondaryFunctions(Statement stat, VarPr...
    method identifySecondaryFunctions (line 119) | private static Exprent identifySecondaryFunctions(Exprent exprent, boo...
    method propagateBoolNot (line 370) | public static Exprent propagateBoolNot(Exprent exprent) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/SequenceHelper.java
  class SequenceHelper (line 19) | public final class SequenceHelper {
    method condenseSequences (line 22) | public static void condenseSequences(Statement root) {
    method condenseSequencesRec (line 26) | private static void condenseSequencesRec(Statement stat) {
    method isSequenceDisbandable (line 148) | private static boolean isSequenceDisbandable(Statement block, Statemen...
    method removeEmptyStatements (line 167) | private static void removeEmptyStatements(SequenceStatement sequence) {
    method mergeFlatStatements (line 230) | private static void mergeFlatStatements(SequenceStatement sequence) {
    method getFirstExprentlist (line 267) | private static Statement getFirstExprentlist(Statement stat) {
    method destroyAndFlattenStatement (line 280) | public static void destroyAndFlattenStatement(Statement stat) {
    method destroyStatementContent (line 296) | public static void destroyStatementContent(Statement stat, boolean sel...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/SimplifyExprentsHelper.java
  class SimplifyExprentsHelper (line 25) | public class SimplifyExprentsHelper {
    method SimplifyExprentsHelper (line 53) | public SimplifyExprentsHelper(boolean firstInvocation) {
    method simplifyStackVarsStatement (line 57) | public boolean simplifyStackVarsStatement(Statement stat, Set<Integer>...
    method simplifyStackVarsExprents (line 93) | private boolean simplifyStackVarsExprents(List<Exprent> list, StructCl...
    method addArrayInitializer (line 202) | private static boolean addArrayInitializer(Exprent first, Exprent seco...
    method isArrayInitializer (line 257) | private static int isArrayInitializer(List<Exprent> list, int index) {
    method isTrivialStackAssignment (line 341) | private static boolean isTrivialStackAssignment(Exprent first) {
    method isStackAssignment2 (line 355) | private static boolean isStackAssignment2(Exprent first, Exprent secon...
    method isStackAssignment (line 372) | private static boolean isStackAssignment(Exprent first, Exprent second) {
    method isPPIorMMI (line 400) | private static Exprent isPPIorMMI(Exprent first) {
    method isIPPorIMM (line 434) | private static boolean isIPPorIMM(Exprent first, Exprent second) {
    method isIPPorIMM2 (line 457) | private static boolean isIPPorIMM2(Exprent first, Exprent second) {
    method isMonitorExit (line 500) | private static boolean isMonitorExit(Exprent first) {
    method isQualifiedNewGetClass (line 511) | private static boolean isQualifiedNewGetClass(Exprent first, Exprent s...
    method isConstructorInvocationRemote (line 542) | private static boolean isConstructorInvocationRemote(List<Exprent> lis...
    method isLambda (line 587) | private static Exprent isLambda(Exprent exprent, StructClass cl) {
    method isSimpleConstructorInvocation (line 618) | private static Exprent isSimpleConstructorInvocation(Exprent exprent) {
    method buildIff (line 640) | private static boolean buildIff(Statement stat, SSAConstructorSparseEx...
    method isIff (line 744) | private static boolean isIff(Exprent exp) {
    method collapseInlinedClass14 (line 748) | private static boolean collapseInlinedClass14(Statement stat) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/StackVarsProcessor.java
  class StackVarsProcessor (line 29) | public class StackVarsProcessor {
    method simplifyStackVars (line 30) | public static void simplifyStackVars(RootStatement root, StructMethod ...
    method setVersionsToNull (line 76) | private static void setVersionsToNull(Statement stat) {
    method setExprentVersionsToNull (line 94) | private static void setExprentVersionsToNull(Exprent exprent) {
    method iterateStatements (line 105) | private static boolean iterateStatements(RootStatement root, SSAUConst...
    method isReplaceableVar (line 196) | private static Exprent isReplaceableVar(Exprent exprent, Map<VarVersio...
    method replaceSingleVar (line 205) | private static void replaceSingleVar(Exprent parent, VarExprent var, E...
    method iterateExprent (line 235) | private static int[] iterateExprent(List<Exprent> lstExprents,
    method getAllVersions (line 411) | private static Set<VarVersionPair> getAllVersions(Exprent exprent) {
    method iterateChildExprent (line 427) | private static Object[] iterateChildExprent(Exprent exprent,
    method getUsedVersions (line 557) | private static boolean getUsedVersions(SSAUConstructorSparseEx ssa, Va...
    method isVersionToBeReplaced (line 603) | private static boolean isVersionToBeReplaced(VarVersionPair usedvar,
    method getAllVarVersions (line 650) | private static Map<Integer, Set<VarVersionPair>> getAllVarVersions(Var...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/StatEdge.java
  class StatEdge (line 10) | public class StatEdge {
    method StatEdge (line 19) | private StatEdge(@NotNull EdgeType type,
    method StatEdge (line 35) | public StatEdge(@NotNull EdgeType type, Statement source, Statement de...
    method StatEdge (line 40) | public StatEdge(@NotNull EdgeType type, Statement source, Statement de...
    method StatEdge (line 46) | public StatEdge(Statement source, Statement destination, List<String> ...
    method getType (line 53) | public @NotNull EdgeType getType() {
    method setType (line 56) | public void setType(@NotNull EdgeType type) {
    method getSource (line 60) | public Statement getSource() {
    method setSource (line 63) | public void setSource(Statement source) {
    method getDestination (line 67) | public Statement getDestination() {
    method setDestination (line 70) | public void setDestination(Statement destination) {
    method getExceptions (line 74) | public List<String> getExceptions() {
    method copy (line 78) | public StatEdge copy() {
    type EdgeType (line 85) | public interface EdgeType {
      method mask (line 87) | @Override
      method toString (line 92) | @Override
      method mask (line 99) | @Override
      method toString (line 104) | @Override
      method mask (line 111) | @Override
      method toString (line 116) | @Override
      method mask (line 123) | @Override
      method toString (line 128) | @Override
      method mask (line 135) | @Override
      method toString (line 140) | @Override
      method mask (line 147) | @Override
      method unite (line 152) | @Override
      method toString (line 157) | @Override
      method mask (line 164) | @Override
      method unite (line 169) | @Override
      method toString (line 174) | @Override
      method mask (line 181) | @Override
      method unite (line 186) | @Override
      method mask (line 192) | int mask();
      method unite (line 194) | default @NotNull EdgeType unite(@NotNull EdgeType other) {
      method types (line 203) | static EdgeType[] types() {
    type EdgeDirection (line 212) | public enum EdgeDirection {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/StrongConnectivityHelper.java
  class StrongConnectivityHelper (line 18) | public class StrongConnectivityHelper {
    method StrongConnectivityHelper (line 28) | public StrongConnectivityHelper(@NotNull Statement startStatement) {
    method visitTree (line 43) | private void visitTree(@NotNull Statement statement) {
    method visit (line 56) | private void visit(@NotNull Statement statement) {
    method isExitComponent (line 87) | public static boolean isExitComponent(@NotNull List<? extends Statemen...
    method getExitReps (line 98) | public @NotNull List<Statement> getExitReps() {
    method getComponents (line 108) | public @NotNull List<@NotNull List<Statement>> getComponents() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/SwitchHelper.java
  class SwitchHelper (line 25) | public final class SwitchHelper {
    method simplifySwitchOnEnum (line 32) | public static void simplifySwitchOnEnum(@NotNull SwitchStatement switc...
    method simplifySwitchesOnReferences (line 52) | public static void simplifySwitchesOnReferences(@NotNull RootStatement...
    method checkAssignmentsToDelete (line 74) | static boolean checkAssignmentsToDelete(@NotNull Statement parent,
    method checkRecursivelyAssignmentsToDelete (line 80) | private static boolean checkRecursivelyAssignmentsToDelete(@NotNull St...
    method collectSwitchesOn (line 121) | private static void collectSwitchesOn(@NotNull Statement statement,
    method evaluateCaseLabelsToFieldsMapping (line 143) | @NotNull
    method findRealCaseValues (line 188) | @Nullable
    method isEnumArray (line 213) | private static boolean isEnumArray(Exprent exprent) {
    method removeTempVariableDeclarations (line 229) | static void removeTempVariableDeclarations(@NotNull List<TempVarAssign...
    method containVar (line 281) | private static boolean containVar(@NotNull Map<VarExprent, List<VarExp...
    method prepareForRules (line 298) | public static void prepareForRules(@NotNull Statement statement, @NotN...
    method canBeRules (line 313) | private static boolean canBeRules(@NotNull SwitchStatement statement) {
    method prepareForRules (line 343) | private static void prepareForRules(@NotNull SwitchStatement statement) {
    type SwitchRecognizer (line 356) | interface SwitchRecognizer {
      method recognize (line 357) | @Nullable
    class StringSwitchRecognizer (line 361) | private abstract static class StringSwitchRecognizer implements Switch...
      method recognize (line 363) | @Override
      method findRealCaseValuesHashCodes (line 367) | @NotNull
      method findRealCaseValue (line 380) | @Nullable
      class JavacStringRecognizer (line 404) | private static class JavacStringRecognizer extends StringSwitchRecog...
        method recognize (line 423) | @Nullable
      class EcjStringRecognizer (line 492) | private static class EcjStringRecognizer extends StringSwitchRecogni...
        method recognize (line 493) | @Nullable
    type SwitchOnCandidate (line 545) | interface SwitchOnCandidate {
      method simplify (line 546) | void simplify();
      method usedSwitch (line 548) | Set<SwitchStatement> usedSwitch();
      method prepareTempAssignments (line 550) | List<TempVarAssignmentItem> prepareTempAssignments();
    class SwitchOnStringCandidate (line 553) | private abstract static class SwitchOnStringCandidate implements Switc...
      method addTempVarAssignment (line 554) | @Nullable
      class JavacSwitchCandidate (line 568) | private static class JavacSwitchCandidate extends SwitchOnStringCand...
        method JavacSwitchCandidate (line 580) | JavacSwitchCandidate(@NotNull SwitchStatement firstSwitch,
        method simplify (line 602) | @Override
        method usedSwitch (line 640) | @Override
        method getSelector (line 645) | @NotNull
        method prepareTempAssignments (line 667) | @Override
      class EcjSwitchCandidate (line 676) | private static class EcjSwitchCandidate extends SwitchOnStringCandid...
        method EcjSwitchCandidate (line 683) | private EcjSwitchCandidate(@NotNull SwitchStatement switchStatement,
        method simplify (line 695) | @Override
        method usedSwitch (line 719) | @Override
        method prepareTempAssignments (line 724) | @Override
        method removeOuterBreakEdge (line 729) | private static void removeOuterBreakEdge(@NotNull IfStatement ifSt...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/SwitchPatternHelper.java
  class SwitchPatternHelper (line 34) | @SuppressWarnings("SSBasedInspection")
    method isBootstrapSwitch (line 37) | public static boolean isBootstrapSwitch(@NotNull Exprent headExprent) {
    class JavacReferenceRecognizer (line 54) | static class JavacReferenceRecognizer implements SwitchHelper.SwitchRe...
      method recognize (line 56) | @Override
    class JavacReferenceFinder (line 67) | private static class JavacReferenceFinder {
      method JavacReferenceFinder (line 121) | private JavacReferenceFinder(@Nullable VarTracker tracker,
      method findCandidate (line 132) | public @Nullable SwitchOnReferenceCandidate findCandidate() {
      method findInitializer (line 217) | @NotNull
      method getRoot (line 266) | @Nullable
      method checkBootstrap (line 414) | private boolean checkBootstrap() {
      method resortForSwitchBootstrap (line 431) | @Nullable
      method createDefaultPatternVal (line 517) | @NotNull
      method collectPatterns (line 531) | @Nullable
      method collectGuards (line 662) | @NotNull
      method normalizeCandidateWithBrokenEdges (line 794) | @Nullable
      method edgeCanBeWayOutOfRoot (line 855) | private boolean edgeCanBeWayOutOfRoot(@Nullable DoStatement doStatem...
      method outsideCatch (line 865) | private boolean outsideCatch(@NotNull StatEdge edge, @Nullable DoSta...
      method tryToFindNestedSwitch (line 887) | @Nullable
    method getMapCaseClasses (line 1110) | @NotNull
    method isNonNullCheck (line 1124) | private static boolean isNonNullCheck(@NotNull Exprent exprent, @NotNu...
    method checkReinitVar (line 1147) | private static boolean checkReinitVar(@NotNull Exprent var, @NotNull S...
    class SwitchOnReferenceCandidate (line 1177) | private static class SwitchOnReferenceCandidate implements SwitchOnCan...
      method SwitchOnReferenceCandidate (line 1201) | private SwitchOnReferenceCandidate(@NotNull SwitchStatement rootSwit...
      method simplify (line 1225) | @Override
      method changeDefaultToFullCase (line 1255) | private static void changeDefaultToFullCase(@NotNull SwitchStatement...
      method getStatementWithFirstAssignment (line 1282) | @Nullable
      method changeEverywhere (line 1298) | private static void changeEverywhere(@NotNull VarExprent oldVariant,
      method usedSwitch (line 1317) | @Override
      method prepareTempAssignments (line 1322) | @Override
      method getMapCaseValue (line 1327) | @NotNull
      method prepareSortedCases (line 1352) | private void prepareSortedCases() {
      method remapCaseValues (line 1399) | private boolean remapCaseValues(@NotNull Map<Integer, Exprent> mapCa...
      method remapWithPatterns (line 1437) | private static void remapWithPatterns(@NotNull SwitchStatement switc...
      method deleteNullCases (line 1460) | private static void deleteNullCases(@NotNull SwitchStatement stateme...
      method addGuards (line 1490) | private static void addGuards(@NotNull SwitchStatement switchStateme...
      method extendCases (line 1516) | private static void extendCases(@NotNull SwitchStatement switchState...
      method normalizeCaseLabels (line 1559) | private static void normalizeCaseLabels(@NotNull SwitchStatement swi...
      method normalizeLabels (line 1581) | private static void normalizeLabels(@NotNull SwitchStatement switchS...
      method cleanDefault (line 1620) | private static void cleanDefault(@NotNull SwitchStatement statement) {
      method resort (line 1672) | private static void resort(@NotNull SwitchStatement statement, @NotN...
    class PatternContainer (line 1685) | private static class PatternContainer {
      method replacePattern (line 1694) | void replacePattern(@NotNull Statement statement,
      method addPattern (line 1704) | void addPattern(@NotNull Statement statement,
      method getPatterns (line 1717) | @Nullable

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/decompose/DominatorEngine.java
  class DominatorEngine (line 10) | public class DominatorEngine {
    method DominatorEngine (line 17) | public DominatorEngine(Statement statement) {
    method initialize (line 21) | public void initialize() {
    method orderStatements (line 25) | private void orderStatements() {
    method getCommonIDom (line 32) | private static Integer getCommonIDom(Integer key1, Integer key2, VBSty...
    method calcIDoms (line 58) | private void calcIDoms() {
    method getOrderedIDoms (line 94) | public VBStyleCollection<Integer, Integer> getOrderedIDoms() {
    method isDominator (line 98) | public boolean isDominator(Integer node, Integer dom) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/decompose/DominatorTreeExceptionFilter.java
  class DominatorTreeExceptionFilter (line 12) | public class DominatorTreeExceptionFilter {
    method DominatorTreeExceptionFilter (line 30) | public DominatorTreeExceptionFilter(Statement statement) {
    method initialize (line 34) | public void initialize() {
    method acceptStatementPair (line 49) | public boolean acceptStatementPair(Integer head, Integer exit) {
    method buildDominatorTree (line 63) | private void buildDominatorTree() {
    method buildExceptionRanges (line 77) | private void buildExceptionRanges() {
    method buildExceptionDoms (line 95) | private Map<Integer, Integer> buildExceptionDoms(Integer id) {
    method buildFilter (line 117) | private void buildFilter(Integer id) {
    method getDomEngine (line 153) | public DominatorEngine getDomEngine() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/decompose/FastExtendedPostdominanceHelper.java
  class FastExtendedPostdominanceHelper (line 13) | public class FastExtendedPostdominanceHelper {
    method getExtendedPostdominators (line 25) | public HashMap<Integer, Set<Integer>> getExtendedPostdominators(Statem...
    method filterOnDominance (line 64) | private void filterOnDominance(DominatorTreeExceptionFilter filter) {
    method filterOnExceptionRanges (line 120) | private void filterOnExceptionRanges(DominatorTreeExceptionFilter filt...
    method removeErroneousNodes (line 134) | private void removeErroneousNodes() {
    method calcDefaultReachableSets (line 209) | private void calcDefaultReachableSets() {
    method calcReachabilitySuppPoints (line 230) | private void calcReachabilitySuppPoints(final EdgeType edgetype) {
    method iterateReachability (line 250) | private void iterateReachability(IReachabilityAction action, EdgeType ...
    type IReachabilityAction (line 313) | private interface IReachabilityAction {
      method action (line 314) | boolean action(Statement node, HashMap<Integer, FastFixedSet<Integer...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/decompose/GenericDominatorEngine.java
  class GenericDominatorEngine (line 9) | public class GenericDominatorEngine {
    method GenericDominatorEngine (line 17) | public GenericDominatorEngine(IGraph graph) {
    method initialize (line 21) | public void initialize() {
    method orderNodes (line 25) | private void orderNodes() {
    method getCommonIDom (line 34) | private static IGraphNode getCommonIDom(IGraphNode node1, IGraphNode n...
    method calcIDoms (line 74) | private void calcIDoms() {
    method isDominator (line 115) | public boolean isDominator(IGraphNode node, IGraphNode dom) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/decompose/IGraph.java
  type IGraph (line 7) | public interface IGraph {
    method getReversePostOrderList (line 9) | List<? extends IGraphNode> getReversePostOrderList();
    method getRoots (line 11) | Set<? extends IGraphNode> getRoots();

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/decompose/IGraphNode.java
  type IGraphNode (line 6) | public interface IGraphNode {
    method getPredecessorNodes (line 7) | List<? extends IGraphNode> getPredecessorNodes();

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/deobfuscator/ExceptionDeobfuscator.java
  class ExceptionDeobfuscator (line 25) | public final class ExceptionDeobfuscator {
    class Range (line 27) | private static final class Range {
      method Range (line 33) | private Range(BasicBlock handler, String uniqueStr, Set<BasicBlock> ...
    method restorePopRanges (line 41) | public static void restorePopRanges(ControlFlowGraph graph) {
    method insertEmptyExceptionHandlerBlocks (line 150) | public static void insertEmptyExceptionHandlerBlocks(ControlFlowGraph ...
    method removeEmptyRanges (line 191) | public static void removeEmptyRanges(ControlFlowGraph graph) {
    method removeCircularRanges (line 215) | public static void removeCircularRanges(final ControlFlowGraph graph) {
    method getReachableBlocksRestricted (line 256) | private static List<BasicBlock> getReachableBlocksRestricted(BasicBloc...
    method hasObfuscatedExceptions (line 287) | public static boolean hasObfuscatedExceptions(ControlFlowGraph graph) {
    method handleMultipleEntryExceptionRanges (line 315) | public static boolean handleMultipleEntryExceptionRanges(ControlFlowGr...
    method getRangeEntries (line 357) | private static Set<BasicBlock> getRangeEntries(ExceptionRangeCFG range) {
    method splitExceptionRange (line 373) | private static boolean splitExceptionRange(ExceptionRangeCFG range,
    method duplicateMergedCatchBlocks (line 405) | public static void duplicateMergedCatchBlocks(@NotNull ControlFlowGrap...
    method insertDummyExceptionHandlerBlocks (line 481) | public static void insertDummyExceptionHandlerBlocks(ControlFlowGraph ...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/deobfuscator/IrreducibleCFGDeobfuscator.java
  class IrreducibleCFGDeobfuscator (line 16) | public final class IrreducibleCFGDeobfuscator {
    method isStatementIrreducible (line 19) | public static boolean isStatementIrreducible(Statement statement) {
    method getCandidateForSplitting (line 99) | private static Statement getCandidateForSplitting(Statement statement) {
    method splitIrreducibleNode (line 127) | public static boolean splitIrreducibleNode(Statement statement) {
    method getStatementSize (line 162) | private static int getStatementSize(Statement statement) {
    method copyStatement (line 176) | private static Statement copyStatement(Statement from, Statement to, H...
    method initCopiedStatement (line 222) | private static void initCopiedStatement(Statement statement) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/AnnotationExprent.java
  class AnnotationExprent (line 12) | public class AnnotationExprent extends Exprent {
    method AnnotationExprent (line 21) | public AnnotationExprent(String className, List<String> parNames, List...
    method toJava (line 28) | @Override
    method getClassName (line 70) | public String getClassName() {
    method getAnnotationType (line 74) | public int getAnnotationType() {
    method hashCode (line 86) | @Override
    method equals (line 91) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/ArrayExprent.java
  class ArrayExprent (line 12) | public class ArrayExprent extends Exprent {
    method ArrayExprent (line 17) | public ArrayExprent(Exprent array, Exprent index, VarType hardType, Se...
    method copy (line 26) | @Override
    method getExprType (line 31) | @Override
    method getExprentUse (line 42) | @Override
    method checkExprTypeBounds (line 47) | @Override
    method getAllExprents (line 55) | @Override
    method toJava (line 63) | @Override
    method replaceExprent (line 82) | @Override
    method equals (line 92) | @Override
    method getArray (line 101) | public Exprent getArray() {
    method getIndex (line 105) | public Exprent getIndex() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/AssertExprent.java
  class AssertExprent (line 11) | public class AssertExprent extends Exprent {
    method AssertExprent (line 15) | public AssertExprent(List<? extends Exprent> parameters) {
    method toJava (line 20) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/AssignmentExprent.java
  class AssignmentExprent (line 17) | public class AssignmentExprent extends Exprent {
    method AssignmentExprent (line 39) | public AssignmentExprent(Exprent left, Exprent right, Set<Integer> byt...
    method getExprType (line 47) | @Override
    method checkExprTypeBounds (line 52) | @Override
    method getAllExprents (line 72) | @Override
    method copy (line 80) | @Override
    method getPrecedence (line 85) | @Override
    method toJava (line 90) | @Override
    method replaceExprent (line 148) | @Override
    method equals (line 158) | @Override
    method getLeft (line 172) | public Exprent getLeft() {
    method getRight (line 176) | public Exprent getRight() {
    method setRight (line 180) | public void setRight(Exprent right) {
    method getCondType (line 184) | public int getCondType() {
    method setCondType (line 188) | public void setCondType(int condType) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/ConstExprent.java
  class ConstExprent (line 23) | public class ConstExprent extends Exprent {
    method ConstExprent (line 55) | public ConstExprent(int val, boolean boolPermitted, Set<Integer> bytec...
    method ConstExprent (line 59) | public ConstExprent(VarType constType, Object value, Set<Integer> byte...
    method ConstExprent (line 63) | public ConstExprent(VarType constType, Object value, Set<Integer> byte...
    method ConstExprent (line 68) | private ConstExprent(VarType constType, Object value, boolean boolPerm...
    method guessType (line 76) | private static VarType guessType(int val, boolean boolPermitted) {
    method copy (line 104) | @Override
    method getExprType (line 109) | @Override
    method getExprentUse (line 114) | @Override
    method getAllExprents (line 119) | @Override
    method toJava (line 124) | @Override
    method inConstantVariable (line 276) | private boolean inConstantVariable(String classSignature, String varia...
    method isNull (line 283) | public boolean isNull() {
    method convertStringToJava (line 287) | private static String convertStringToJava(String value, boolean ascii) {
    method equals (line 322) | @Override
    method hashCode (line 331) | @Override
    method hasBooleanValue (line 338) | public boolean hasBooleanValue() {
    method hasValueOne (line 350) | public boolean hasValueOne() {
    method getZeroConstant (line 362) | public static ConstExprent getZeroConstant(int type) {
    method getConstType (line 372) | public VarType getConstType() {
    method setConstType (line 376) | public void setConstType(VarType constType) {
    method adjustConstType (line 380) | public void adjustConstType(VarType expectedType) {
    method isPrintableAscii (line 396) | private static boolean isPrintableAscii(int c) {
    method getValue (line 401) | public Object getValue() {
    method getIntValue (line 405) | public int getIntValue() {
    method isBoolPermitted (line 409) | public boolean isBoolPermitted() {
    method match (line 417) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/ExitExprent.java
  class ExitExprent (line 23) | public class ExitExprent extends Exprent {
    method ExitExprent (line 32) | public ExitExprent(int exitType, Exprent value, VarType retType, Set<I...
    method copy (line 41) | @Override
    method checkExprTypeBounds (line 46) | @Override
    method getAllExprents (line 58) | @Override
    method toJava (line 67) | @Override
    method replaceExprent (line 115) | @Override
    method equals (line 122) | @Override
    method getExitType (line 131) | public int getExitType() {
    method getValue (line 135) | public Exprent getValue() {
    method getRetType (line 139) | public VarType getRetType() {
    method match (line 147) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/ExprUtil.java
  class ExprUtil (line 16) | public final class ExprUtil {
    method getSyntheticParametersMask (line 17) | public static List<VarVersionPair> getSyntheticParametersMask(String c...
    method getSyntheticParametersMask (line 22) | public static List<VarVersionPair> getSyntheticParametersMask(ClassNod...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/Exprent.java
  class Exprent (line 24) | public class Exprent implements IMatchable {
    method Exprent (line 48) | public Exprent(int type) {
    method getPrecedence (line 53) | public int getPrecedence() {
    method getExprType (line 57) | public VarType getExprType() {
    method getExprentUse (line 61) | public int getExprentUse() {
    method checkExprTypeBounds (line 65) | public CheckTypesResult checkExprTypeBounds() {
    method containsExprent (line 69) | public boolean containsExprent(Exprent exprent) {
    method getAllExprents (line 82) | public List<Exprent> getAllExprents(boolean recursive) {
    method getAllVariables (line 92) | public Set<VarVersionPair> getAllVariables() {
    method getAllExprents (line 105) | public List<Exprent> getAllExprents() {
    method copy (line 109) | public Exprent copy() {
    method toJava (line 113) | public TextBuffer toJava(int indent, BytecodeMappingTracer tracer) {
    method replaceExprent (line 117) | public void replaceExprent(Exprent oldExpr, Exprent newExpr) { }
    method addBytecodeOffsets (line 119) | public void addBytecodeOffsets(Collection<Integer> bytecodeOffsets) {
    method findObject (line 134) | @Override
    method match (line 158) | @Override
    method toString (line 177) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/FieldExprent.java
  class FieldExprent (line 26) | public class FieldExprent extends Exprent {
    method FieldExprent (line 33) | public FieldExprent(LinkConstant cn, Exprent instance, Set<Integer> by...
    method FieldExprent (line 37) | public FieldExprent(String name, String classname, boolean isStatic, E...
    method getExprType (line 48) | @Override
    method getExprentUse (line 53) | @Override
    method getAllExprents (line 58) | @Override
    method copy (line 67) | @Override
    method isAmbiguous (line 72) | private boolean isAmbiguous() {
    method toJava (line 84) | @Override
    method replaceExprent (line 146) | @Override
    method equals (line 153) | @Override
    method getClassname (line 165) | public String getClassname() {
    method getDescriptor (line 169) | public FieldDescriptor getDescriptor() {
    method getInstance (line 173) | public Exprent getInstance() {
    method isStatic (line 177) | public boolean isStatic() {
    method getName (line 181) | public String getName() {
    method match (line 189) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/FunctionExprent.java
  class FunctionExprent (line 16) | public class FunctionExprent extends Exprent {
    method FunctionExprent (line 186) | public FunctionExprent(int funcType, ListStack<Exprent> stack, Set<Int...
    method FunctionExprent (line 202) | public FunctionExprent(int funcType, List<Exprent> operands, Set<Integ...
    method FunctionExprent (line 210) | public FunctionExprent(int funcType, Exprent operand, Set<Integer> byt...
    method getExprType (line 215) | @Override
    method getExprentUse (line 272) | @Override
    method checkExprTypeBounds (line 286) | @Override
    method getAllExprents (line 373) | @Override
    method copy (line 378) | @Override
    method equals (line 390) | @Override
    method replaceExprent (line 399) | @Override
    method toJava (line 408) | @Override
    method getPrecedence (line 496) | @Override
    method getPrecedence (line 501) | public static int getPrecedence(int func) {
    method getSimpleCastType (line 505) | public VarType getSimpleCastType() {
    method wrapOperandString (line 509) | private TextBuffer wrapOperandString(Exprent expr, boolean eq, int ind...
    method getMaxVarType (line 533) | private static VarType getMaxVarType(VarType[] arr) {
    method getFuncType (line 552) | public int getFuncType() {
    method setFuncType (line 556) | public void setFuncType(int funcType) {
    method getLstOperands (line 560) | public List<Exprent> getLstOperands() {
    method setImplicitType (line 564) | public void setImplicitType(VarType implicitType) {
    method match (line 572) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/IfExprent.java
  class IfExprent (line 16) | public class IfExprent extends Exprent {
    method IfExprent (line 67) | public IfExprent(int ifType, ListStack<Exprent> stack, Set<Integer> by...
    method IfExprent (line 85) | private IfExprent(Exprent condition, Set<Integer> bytecodeOffsets) {
    method copy (line 92) | @Override
    method getAllExprents (line 97) | @Override
    method toJava (line 104) | @Override
    method replaceExprent (line 110) | @Override
    method equals (line 117) | @Override
    method negateIf (line 125) | public IfExprent negateIf() {
    method getCondition (line 130) | public Exprent getCondition() {
    method setCondition (line 134) | public void setCondition(Exprent condition) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/InvocationExprent.java
  class InvocationExprent (line 34) | public class InvocationExprent extends Exprent {
    method InvocationExprent (line 60) | public InvocationExprent() {
    method InvocationExprent (line 64) | public InvocationExprent(int opcode,
    method InvocationExprent (line 131) | private InvocationExprent(InvocationExprent expr) {
    method getExprType (line 156) | @Override
    method checkExprTypeBounds (line 161) | @Override
    method getAllExprents (line 177) | @Override
    method copy (line 188) | @Override
    method toJava (line 193) | @Override
    method isVarArgCall (line 371) | private boolean isVarArgCall() {
    method isBoxingCall (line 389) | public boolean isBoxingCall() {
    method isInstanceCall (line 417) | public boolean isInstanceCall(@NotNull String className, @NotNull Stri...
    method isDynamicCall (line 422) | public boolean isDynamicCall(@NotNull String methodName, int parameter...
    method markUsingBoxingResult (line 426) | public void markUsingBoxingResult() {
    method getClassNameForPrimitiveType (line 431) | private static String getClassNameForPrimitiveType(int type) {
    method isUnboxingCall (line 456) | private boolean isUnboxingCall() {
    method getAmbiguousParameters (line 460) | private BitSet getAmbiguousParameters() {
    method replaceExprent (line 512) | @Override
    method equals (line 525) | @Override
    method getParameters (line 539) | public List<Exprent> getParameters() {
    method setParameters (line 543) | public void setParameters(List<Exprent> parameters) {
    method getDescriptor (line 547) | public MethodDescriptor getDescriptor() {
    method setDescriptor (line 551) | public void setDescriptor(MethodDescriptor descriptor) {
    method getClassName (line 555) | public String getClassName() {
    method setClassName (line 559) | public void setClassName(String className) {
    method getFuncType (line 563) | public int getFuncType() {
    method setFuncType (line 567) | public void setFuncType(int funcType) {
    method getInstance (line 571) | public Exprent getInstance() {
    method setInstance (line 575) | public void setInstance(Exprent instance) {
    method isStatic (line 579) | public boolean isStatic() {
    method setStatic (line 583) | public void setStatic(boolean isStatic) {
    method getName (line 587) | public String getName() {
    method setName (line 591) | public void setName(String name) {
    method getStringDescriptor (line 595) | public String getStringDescriptor() {
    method setStringDescriptor (line 599) | public void setStringDescriptor(String stringDescriptor) {
    method getInvocationType (line 603) | public int getInvocationType() {
    method getInvokeDynamicClassSuffix (line 607) | public String getInvokeDynamicClassSuffix() {
    method getBootstrapArguments (line 611) | public List<PooledConstant> getBootstrapArguments() {
    method match (line 619) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/MonitorExprent.java
  class MonitorExprent (line 14) | public class MonitorExprent extends Exprent {
    method MonitorExprent (line 22) | public MonitorExprent(int monType, Exprent value, Set<Integer> bytecod...
    method copy (line 30) | @Override
    method getAllExprents (line 35) | @Override
    method toJava (line 42) | @Override
    method replaceExprent (line 54) | @Override
    method equals (line 61) | @Override
    method getMonType (line 70) | public int getMonType() {
    method getValue (line 74) | public Exprent getValue() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java
  class NewExprent (line 23) | public class NewExprent extends Exprent {
    method NewExprent (line 34) | public NewExprent(VarType newType, ListStack<Exprent> stack, int array...
    method NewExprent (line 38) | public NewExprent(VarType newType, List<Exprent> lstDims, Set<Integer>...
    method getDimensions (line 58) | private static List<Exprent> getDimensions(int arrayDim, ListStack<Exp...
    method getExprType (line 66) | @Override
    method checkExprTypeBounds (line 71) | @Override
    method getAllExprents (line 96) | @Override
    method copy (line 115) | @Override
    method getPrecedence (line 131) | @Override
    method toJava (line 136) | @Override
    method probablySyntheticParameter (line 365) | private static boolean probablySyntheticParameter(String className) {
    method getQualifiedNewInstance (line 370) | private static String getQualifiedNewInstance(String classname, List<E...
    method replaceExprent (line 403) | @Override
    method equals (line 426) | @Override
    method getConstructor (line 438) | public InvocationExprent getConstructor() {
    method setConstructor (line 442) | public void setConstructor(InvocationExprent constructor) {
    method getLstDims (line 446) | public List<Exprent> getLstDims() {
    method getNewType (line 450) | public VarType getNewType() {
    method getLstArrayElements (line 454) | public List<Exprent> getLstArrayElements() {
    method setLstArrayElements (line 458) | public void setLstArrayElements(List<Exprent> lstArrayElements) {
    method setDirectArrayInit (line 462) | public void setDirectArrayInit(boolean directArrayInit) {
    method setVarArgParam (line 466) | public void setVarArgParam(boolean isVarArgParam) {
    method isLambda (line 470) | public boolean isLambda() {
    method isAnonymous (line 474) | public boolean isAnonymous() {
    method setAnonymous (line 478) | public void setAnonymous(boolean anonymous) {
    method setEnumConst (line 482) | public void setEnumConst(boolean enumConst) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/RecordVarExprent.java
  class RecordVarExprent (line 15) | public class RecordVarExprent extends VarExprent {
    method RecordVarExprent (line 20) | public RecordVarExprent(VarExprent v) {
    method toJava (line 27) | @Override
    method addComponent (line 48) | public void addComponent(@NotNull RecordVarExprent exprent) {
    method copy (line 55) | @Override
    method copyFrom (line 73) | public boolean copyFrom(@NotNull VarExprent varExprent) {
    method getComponents (line 86) | public List<RecordVarExprent> getComponents() {
    method getDirectComponent (line 96) | @Nullable

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/SwitchExprent.java
  class SwitchExprent (line 20) | public class SwitchExprent extends Exprent {
    method SwitchExprent (line 25) | public SwitchExprent(Exprent value, Set<Integer> bytecodeOffsets) {
    method copy (line 32) | @Override
    method getExprType (line 45) | @Override
    method checkExprTypeBounds (line 50) | @Override
    method getAllExprents (line 73) | @Override
    method toJava (line 80) | @Override
    method replaceExprent (line 107) | @Override
    method equals (line 114) | @Override
    method getValue (line 127) | public Exprent getValue() {
    method setCaseValues (line 131) | public void setCaseValues(List<List<Exprent>> caseValues) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/exps/VarExprent.java
  class VarExprent (line 33) | public class VarExprent extends Exprent {
    method VarExprent (line 46) | public VarExprent(int index, VarType varType, VarProcessor processor) {
    method VarExprent (line 50) | public VarExprent(int index, VarType varType, VarProcessor processor, ...
    method getExprType (line 58) | @Override
    method getExprentUse (line 63) | @Override
    method getAllExprents (line 68) | @Override
    method copy (line 73) | @Override
    method toJava (line 83) | @Override
    method getVisibleOffset (line 115) | public int getVisibleOffset() {
    method getName (line 119) | @NotNull
    method getVarVersionPair (line 124) | public VarVersionPair getVarVersionPair() {
    method getDebugName (line 128) | public String getDebugName(StructMethod method) {
    method appendDefinitionType (line 142) | void appendDefinitionType(TextBuffer buffer) {
    method hashCode (line 183) | @Override
    method equals (line 188) | @Override
    method getIndex (line 198) | public int getIndex() {
    method setIndex (line 202) | public void setIndex(int index) {
    method getVarType (line 206) | public VarType getVarType() {
    method setVarType (line 219) | public void setVarType(VarType varType) {
    method isDefinition (line 223) | public boolean isDefinition() {
    method setDefinition (line 227) | public void setDefinition(boolean definition) {
    method getProcessor (line 231) | public VarProcessor getProcessor() {
    method getVersion (line 235) | public int getVersion() {
    method setVersion (line 239) | public void setVersion(int version) {
    method isClassDef (line 243) | public boolean isClassDef() {
    method setClassDef (line 247) | public void setClassDef(boolean classDef) {
    method isStack (line 251) | public boolean isStack() {
    method setStack (line 255) | public void setStack(boolean stack) {
    method match (line 263) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectGraph.java
  class DirectGraph (line 16) | public class DirectGraph {
    method sortReversePostOrder (line 34) | public void sortReversePostOrder() {
    method addToReversePostOrderListIterative (line 44) | private static void addToReversePostOrderListIterative(DirectNode root...
    method iterateExprents (line 83) | public boolean iterateExprents(ExprentIterator iter) {
    type ExprentIterator (line 120) | public interface ExprentIterator {
      method processExprent (line 124) | int processExprent(Exprent exprent);

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectNode.java
  class DirectNode (line 14) | public class DirectNode {
    method DirectNode (line 23) | public DirectNode(@NotNull DirectNodeType type, @NotNull Statement sta...
    method DirectNode (line 30) | public DirectNode(@NotNull DirectNodeType type, @NotNull Statement sta...
    method toString (line 37) | @Override
    type DirectNodeType (line 42) | public enum DirectNodeType {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/sforms/FlattenStatementsHelper.java
  class FlattenStatementsHelper (line 16) | public class FlattenStatementsHelper {
    method buildDirectGraph (line 37) | public DirectGraph buildDirectGraph(RootStatement root) {
    method flattenStatement (line 60) | private void flattenStatement() {
    method saveEdge (line 380) | private void saveEdge(DirectNode sourcenode,
    method setEdges (line 411) | private void setEdges() {
    method getMapDestinationNodes (line 464) | public Map<Integer, String[]> getMapDestinationNodes() {
    class FinallyPathWrapper (line 468) | public static final class FinallyPathWrapper {
      method FinallyPathWrapper (line 473) | private FinallyPathWrapper(String source, String destination, String...
      method equals (line 479) | @Override
      method hashCode (line 487) | @Override
      method toString (line 492) | @Override
    class StackEntry (line 499) | private static class StackEntry {
      method StackEntry (line 512) | StackEntry(CatchAllStatement catchstatement,
      method StackEntry (line 534) | StackEntry(CatchAllStatement catchstatement, boolean state) {
    class Edge (line 539) | private static class Edge {
      method Edge (line 544) | Edge(String sourceid, Integer statid, EdgeType edgetype) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/sforms/SSAConstructorSparseEx.java
  class SSAConstructorSparseEx (line 30) | public class SSAConstructorSparseEx {
    method splitVariables (line 53) | public void splitVariables(RootStatement root, StructMethod mt) {
    method ssaStatements (line 84) | private void ssaStatements(DirectGraph dgraph, HashSet<String> updated) {
    method processExprent (line 136) | private void processExprent(Exprent expr, SFormsFastMapDirect[] varmap...
    method getNextFreeVersion (line 278) | private Integer getNextFreeVersion(Integer var) {
    method mergeInVarMaps (line 290) | private void mergeInVarMaps(DirectNode node, DirectGraph dgraph) {
    method getFilteredOutMap (line 317) | private SFormsFastMapDirect getFilteredOutMap(String nodeid, String pr...
    method mergeMaps (line 409) | private static SFormsFastMapDirect mergeMaps(SFormsFastMapDirect mapTo...
    method mapsEqual (line 418) | private static boolean mapsEqual(SFormsFastMapDirect map1, SFormsFastM...
    method setCurrentVar (line 440) | private void setCurrentVar(SFormsFastMapDirect varmap, Integer var, In...
    method setCatchMaps (line 446) | private void setCatchMaps(Statement stat, DirectGraph dgraph, FlattenS...
    method createFirstMap (line 477) | private SFormsFastMapDirect createFirstMap(StructMethod mt) {
    method getPhi (line 509) | public HashMap<VarVersionPair, FastSparseSet<Integer>> getPhi() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/sforms/SSAUConstructorSparseEx.java
  class SSAUConstructorSparseEx (line 25) | public class SSAUConstructorSparseEx {
    method splitVariables (line 68) | public void splitVariables(RootStatement root, StructMethod mt) {
    method ssaStatements (line 103) | private void ssaStatements(DirectGraph dgraph, HashSet<String> updated...
    method processExprent (line 152) | private void processExprent(Exprent expr, SFormsFastMapDirect[] varmap...
    method createOrUpdatePhiNode (line 410) | private void createOrUpdatePhiNode(VarVersionPair phivar, FastSparseSe...
    method varMapToGraph (line 467) | private void varMapToGraph(VarVersionPair varpaar, SFormsFastMapDirect...
    method getNextFreeVersion (line 476) | private Integer getNextFreeVersion(Integer var, Statement stat) {
    method mergeInVarMaps (line 499) | private void mergeInVarMaps(DirectNode node, DirectGraph dgraph) {
    method getFilteredOutMap (line 527) | private SFormsFastMapDirect getFilteredOutMap(String nodeid, String pr...
    method mergeMaps (line 663) | private static SFormsFastMapDirect mergeMaps(SFormsFastMapDirect mapTo...
    method mapsEqual (line 672) | private static boolean mapsEqual(SFormsFastMapDirect map1, SFormsFastM...
    method setCurrentVar (line 695) | private void setCurrentVar(SFormsFastMapDirect varmap, Integer var, In...
    method setCatchMaps (line 701) | private void setCatchMaps(Statement stat, DirectGraph dgraph, FlattenS...
    method createFirstMap (line 734) | private SFormsFastMapDirect createFirstMap(StructMethod mt, RootStatem...
    method getFirstProtectedRange (line 767) | private static Integer getFirstProtectedRange(Statement stat) {
    method getSsuversions (line 794) | public VarVersionsGraph getSsuversions() {
    method getLiveVarVersionsMap (line 798) | public SFormsFastMapDirect getLiveVarVersionsMap(VarVersionPair varpaa...
    method getMapVersionFirstRange (line 809) | public HashMap<VarVersionPair, Integer> getMapVersionFirstRange() {
    method getMapFieldVars (line 813) | public HashMap<Integer, Integer> getMapFieldVars() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/BasicBlockStatement.java
  class BasicBlockStatement (line 14) | public class BasicBlockStatement extends Statement {
    method BasicBlockStatement (line 17) | public BasicBlockStatement(BasicBlock block) {
    method toJava (line 39) | @Override
    method getSimpleCopy (line 46) | @Override
    method getBlock (line 58) | public BasicBlock getBlock() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchAllStatement.java
  class CatchAllStatement (line 21) | public final class CatchAllStatement extends Statement {
    method CatchAllStatement (line 35) | private CatchAllStatement() {
    method CatchAllStatement (line 39) | private CatchAllStatement(Statement head, Statement handler) {
    method isHead (line 67) | public static Statement isHead(Statement head) {
    method toJava (line 98) | @Override
    method replaceStatement (line 149) | @Override
    method getSimpleCopy (line 159) | @Override
    method initSimpleCopy (line 181) | @Override
    method getHandler (line 191) | public Statement getHandler() {
    method isFinally (line 195) | public boolean isFinally() {
    method setFinally (line 199) | public void setFinally(boolean isFinally) {
    method getMonitor (line 203) | public VarExprent getMonitor() {
    method setMonitor (line 207) | public void setMonitor(VarExprent monitor) {
    method getVars (line 211) | public List<VarExprent> getVars() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java
  class CatchStatement (line 22) | public final class CatchStatement extends Statement {
    method CatchStatement (line 30) | private CatchStatement() {
    method CatchStatement (line 34) | private CatchStatement(Statement head, Statement next, Set<Statement> ...
    method isHead (line 63) | public static Statement isHead(Statement head) {
    method toJava (line 135) | @Override
    method getSimpleCopy (line 184) | @Override
    method getVars (line 202) | public List<VarExprent> getVars() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/DoStatement.java
  class DoStatement (line 17) | public final class DoStatement extends Statement {
    method DoStatement (line 24) | private DoStatement() {
    method DoStatement (line 32) | private DoStatement(Statement head) {
    method isHead (line 39) | public static @Nullable Statement isHead(Statement head) {
    method toJava (line 60) | @Override
    method getSequentialObjects (line 112) | @Override
    method replaceExprent (line 131) | @Override
    method getSimpleCopy (line 144) | @Override
    method getInitExprentList (line 149) | public @NotNull List<Exprent> getInitExprentList() {
    method getConditionExprentList (line 153) | public @NotNull List<Exprent> getConditionExprentList() {
    method getIncExprentList (line 157) | public @NotNull List<Exprent> getIncExprentList() {
    method getConditionExprent (line 161) | public @Nullable Exprent getConditionExprent() {
    method setConditionExprent (line 165) | public void setConditionExprent(Exprent conditionExprent) {
    method getIncExprent (line 169) | public @Nullable Exprent getIncExprent() {
    method setIncExprent (line 173) | public void setIncExprent(Exprent incExprent) {
    method getInitExprent (line 177) | public @Nullable Exprent getInitExprent() {
    method setInitExprent (line 181) | public void setInitExprent(Exprent initExprent) {
    method getLoopType (line 185) | public @NotNull LoopType getLoopType() {
    method setLoopType (line 189) | public void setLoopType(@NotNull LoopType loopType) {
    type LoopType (line 193) | public enum LoopType {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/DummyExitStatement.java
  class DummyExitStatement (line 8) | public class DummyExitStatement extends Statement {
    method DummyExitStatement (line 11) | public DummyExitStatement() {
    method addBytecodeOffsets (line 15) | public void addBytecodeOffsets(Collection<Integer> bytecodeOffsets) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/GeneralStatement.java
  class GeneralStatement (line 11) | public class GeneralStatement extends Statement {
    method GeneralStatement (line 17) | private GeneralStatement() {
    method GeneralStatement (line 21) | public GeneralStatement(Statement head, Collection<? extends Statement...
    method toJava (line 42) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/IfStatement.java
  class IfStatement (line 21) | public final class IfStatement extends Statement {
    method IfStatement (line 46) | private IfStatement() {
    method IfStatement (line 52) | private IfStatement(Statement head, int regedges, Statement postst) {
    method isHead (line 160) | public static Statement isHead(Statement head) {
    method toJava (line 191) | @Override
    method initExprents (line 271) | @Override
    method getSequentialObjects (line 284) | @Override
    method replaceExprent (line 293) | @Override
    method replaceStatement (line 300) | @Override
    method getSimpleCopy (line 333) | @Override
    method initSimpleCopy (line 343) | @Override
    method getElsestat (line 364) | public Statement getElsestat() {
    method setElsestat (line 368) | public void setElsestat(Statement elsestat) {
    method getIfstat (line 372) | public Statement getIfstat() {
    method setIfstat (line 376) | public void setIfstat(Statement ifstat) {
    method isNegated (line 380) | public boolean isNegated() {
    method setNegated (line 384) | public void setNegated(boolean negated) {
    method getHeadexprentList (line 388) | public List<Exprent> getHeadexprentList() {
    method getHeadexprent (line 392) | public IfExprent getHeadexprent() {
    method setElseEdge (line 396) | public void setElseEdge(StatEdge elseedge) {
    method setIfEdge (line 400) | public void setIfEdge(StatEdge ifedge) {
    method getIfEdge (line 404) | public StatEdge getIfEdge() {
    method getElseEdge (line 408) | public StatEdge getElseEdge() {
    method findObject (line 416) | @Override
    method match (line 433) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/RootStatement.java
  class RootStatement (line 8) | public class RootStatement extends Statement {
    method RootStatement (line 11) | public RootStatement(Statement head, DummyExitStatement dummyExit) {
    method toJava (line 21) | @Override
    method getDummyExit (line 26) | public DummyExitStatement getDummyExit() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/SequenceStatement.java
  class SequenceStatement (line 15) | public class SequenceStatement extends Statement {
    method SequenceStatement (line 22) | private SequenceStatement() {
    method SequenceStatement (line 26) | public SequenceStatement(List<? extends Statement> lst) {
    method SequenceStatement (line 39) | private SequenceStatement(Statement head, Statement tail) {
    method isHead2Block (line 58) | public static Statement isHead2Block(Statement head) {
    method toJava (line 88) | @Override
    method getSimpleCopy (line 125) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statement.java
  class Statement (line 28) | public abstract class Statement implements IMatchable {
    method Statement (line 62) | Statement(@NotNull StatementType type) {
    method Statement (line 67) | Statement(@NotNull StatementType type, int id) {
    method clearTempInformation (line 77) | public void clearTempInformation() {
    method processMap (line 94) | private static <T> void processMap(Map<EdgeType, List<T>> map) {
    method collapseNodesToStatement (line 106) | public void collapseNodesToStatement(Statement stat) {
    method setAllParent (line 195) | public void setAllParent() {
    method addLabeledEdge (line 201) | public void addLabeledEdge(StatEdge edge) {
    method addEdgeDirectInternal (line 210) | private void addEdgeDirectInternal(EdgeDirection direction, StatEdge e...
    method addEdgeInternal (line 219) | private void addEdgeInternal(EdgeDirection direction, StatEdge edge) {
    method removeEdgeDirectInternal (line 235) | private void removeEdgeDirectInternal(EdgeDirection direction, StatEdg...
    method removeEdgeInternal (line 250) | private void removeEdgeInternal(EdgeDirection direction, StatEdge edge) {
    method addPredecessor (line 267) | public void addPredecessor(StatEdge edge) {
    method removePredecessor (line 271) | public void removePredecessor(StatEdge edge) {
    method addSuccessor (line 280) | public void addSuccessor(StatEdge edge) {
    method removeSuccessor (line 290) | public void removeSuccessor(StatEdge edge) {
    method removeAllSuccessors (line 308) | public void removeAllSuccessors(Statement stat) {
    method buildContinueSet (line 321) | public HashSet<Statement> buildContinueSet() {
    method buildMonitorFlags (line 343) | public void buildMonitorFlags() {
    method getReversePostOrderList (line 381) | public List<Statement> getReversePostOrderList() {
    method getReversePostOrderList (line 385) | public List<Statement> getReversePostOrderList(Statement stat) {
    method getPostReversePostOrderList (line 394) | public List<Statement> getPostReversePostOrderList() {
    method getPostReversePostOrderList (line 398) | public List<Statement> getPostReversePostOrderList(List<Statement> lst...
    method containsStatement (line 420) | public boolean containsStatement(Statement stat) {
    method containsStatementStrict (line 424) | public boolean containsStatementStrict(Statement stat) {
    method toJava (line 440) | public TextBuffer toJava(int indent, BytecodeMappingTracer tracer) {
    method getSequentialObjects (line 445) | public List<Object> getSequentialObjects() {
    method initExprents (line 449) | public void initExprents() {
    method replaceExprent (line 453) | public void replaceExprent(Exprent oldexpr, Exprent newexpr) {
    method getSimpleCopy (line 457) | public Statement getSimpleCopy() {
    method initSimpleCopy (line 461) | public void initSimpleCopy() {
    method replaceStatement (line 467) | public void replaceStatement(Statement oldstat, Statement newstat) {
    method addToReversePostOrderListIterative (line 517) | private static void addToReversePostOrderListIterative(Statement root,...
    method addToPostReversePostOrderList (line 560) | private static void addToPostReversePostOrderList(Statement stat, List...
    method changeEdgeNode (line 581) | public void changeEdgeNode(EdgeDirection direction, StatEdge edge, Sta...
    method changeEdgeType (line 615) | public void changeEdgeType(EdgeDirection direction, StatEdge edge, Edg...
    method getEdges (line 638) | private List<StatEdge> getEdges(EdgeType type, @NotNull EdgeDirection ...
    method getNeighbours (line 663) | public List<Statement> getNeighbours(EdgeType type, EdgeDirection dire...
    method getNeighboursSet (line 688) | public Set<Statement> getNeighboursSet(EdgeType type, EdgeDirection di...
    method getSuccessorEdges (line 692) | public List<StatEdge> getSuccessorEdges(EdgeType type) {
    method getPredecessorEdges (line 696) | public List<StatEdge> getPredecessorEdges(EdgeType type) {
    method getAllSuccessorEdges (line 700) | public List<StatEdge> getAllSuccessorEdges() {
    method getAllPredecessorEdges (line 704) | public List<StatEdge> getAllPredecessorEdges() {
    method getFirst (line 708) | public Statement getFirst() {
    method setFirst (line 713) | public void setFirst(Statement first) {
    method getPost (line 717) | public Statement getPost() {
    method getStats (line 721) | public VBStyleCollection<Statement, Integer> getStats() {
    method getLastBasicType (line 726) | public StatementType getLastBasicType() {
    method getContinueSet (line 730) | public HashSet<Statement> getContinueSet() {
    method isContainsMonitorExit (line 734) | public boolean isContainsMonitorExit() {
    method isMonitorEnter (line 738) | public boolean isMonitorEnter() {
    method getBasichead (line 742) | public BasicBlockStatement getBasichead() {
    method isLabeled (line 751) | public boolean isLabeled() {
    method hasBasicSuccEdge (line 761) | public boolean hasBasicSuccEdge() {
    method getParent (line 771) | public Statement getParent() {
    method setParent (line 776) | public void setParent(Statement parent) {
    method getLabelEdges (line 780) | public HashSet<StatEdge> getLabelEdges() {  // FIXME: why HashSet?
    method getVarDefinitions (line 784) | public List<Exprent> getVarDefinitions() {
    method getExprents (line 789) | @Nullable
    method setExprents (line 795) | public void setExprents(List<Exprent> exprents) {
    method isCopied (line 799) | public boolean isCopied() {
    method setCopied (line 803) | public void setCopied(boolean copied) {
    method toString (line 808) | public String toString() {
    method findObject (line 816) | @Override
    method match (line 846) | @Override
    type StatementType (line 888) | public enum StatementType {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statements.java
  class Statements (line 11) | public final class Statements {
    method findFirstData (line 12) | public static Statement findFirstData(Statement stat) {
    method isInvocationInitConstructor (line 26) | public static boolean isInvocationInitConstructor(InvocationExprent in...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/SwitchStatement.java
  class SwitchStatement (line 30) | public final class SwitchStatement extends Statement {
    method SwitchStatement (line 40) | private SwitchStatement() {
    method SwitchStatement (line 44) | private SwitchStatement(@NotNull Statement head, @Nullable Statement p...
    method setCanBeRule (line 61) | public void setCanBeRule(boolean canBeRule) {
    method addGuard (line 65) | public void addGuard(@NotNull Statement statement, @NotNull Exprent gu...
    method removeCaseStatement (line 75) | public void removeCaseStatement(@NotNull Statement statement) {
    method duplicateCaseStatement (line 101) | public int duplicateCaseStatement(@NotNull Statement currentStatement) {
    method setUseCustomDefault (line 138) | public void setUseCustomDefault() {
    method isHead (line 142) | @Nullable
    method toJava (line 161) | @Override
    method initExprents (line 239) | @Override
    method getSequentialObjects (line 246) | @Override
    method replaceExprent (line 254) | @Override
    method replaceStatement (line 261) | @Override
    method getSimpleCopy (line 271) | @Override
    method initSimpleCopy (line 277) | @Override
    method sortEdgesAndNodes (line 284) | public void sortEdgesAndNodes() {
    method mapEdgeIndicesToEdges (line 310) | private void mapEdgeIndicesToEdges(int[] values,
    method collectRegularEdgesIndices (line 328) | private void collectRegularEdgesIndices(@NotNull Map<StatEdge, Integer...
    method collectExitEdgesIndices (line 345) | private void collectExitEdgesIndices(@NotNull Map<StatEdge, Integer> e...
    method sortEdges (line 365) | private void sortEdges(List<@Nullable Statement> nodes, @NotNull List<...
    method replaceNullStatementsWithBasicBlocks (line 401) | private void replaceNullStatementsWithBasicBlocks(List<@Nullable State...
    method getHeadExprentList (line 422) | @NotNull
    method getHeadExprent (line 427) | @Nullable
    method getCaseEdges (line 432) | @NotNull
    method getCaseStatements (line 437) | @NotNull
    method getDefaultEdge (line 442) | @NotNull
    method getCaseValues (line 447) | @NotNull

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/stats/SynchronizedStatement.java
  class SynchronizedStatement (line 18) | public class SynchronizedStatement extends Statement {
    method SynchronizedStatement (line 28) | public SynchronizedStatement() {
    method SynchronizedStatement (line 34) | public SynchronizedStatement(Statement head, Statement body, Statement...
    method toJava (line 60) | @Override
    method mapMonitorExitInstr (line 83) | private void mapMonitorExitInstr(BytecodeMappingTracer tracer) {
    method initExprents (line 91) | @Override
    method getSequentialObjects (line 96) | @Override
    method replaceExprent (line 105) | @Override
    method replaceStatement (line 112) | @Override
    method removeExc (line 122) | public void removeExc() {
    method getSimpleCopy (line 129) | @Override
    method initSimpleCopy (line 134) | @Override
    method getBody (line 144) | public Statement getBody() {
    method getHeadexprentList (line 148) | public List<Exprent> getHeadexprentList() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/typeann/TargetInfo.java
  type TargetInfo (line 11) | public interface TargetInfo {
    class CatchTarget (line 15) | class CatchTarget implements TargetInfo {
      method CatchTarget (line 18) | public CatchTarget(int exceptionTableIndex) {
      method getExceptionTableIndex (line 25) | public int getExceptionTableIndex() {
    class EmptyTarget (line 34) | class EmptyTarget implements TargetInfo {
      method extract (line 38) | public static List<TypeAnnotation> extract(List<TypeAnnotation> type...
    class FormalParameterTarget (line 49) | class FormalParameterTarget implements TargetInfo {
      method FormalParameterTarget (line 52) | public FormalParameterTarget(int formalParameterIndex) {
      method getFormalParameterIndex (line 59) | public int getFormalParameterIndex() {
      method extract (line 66) | public static List<TypeAnnotation> extract(List<TypeAnnotation> type...
      method extract (line 75) | public static List<TypeAnnotation> extract(List<TypeAnnotation> type...
    class LocalvarTarget (line 89) | class LocalvarTarget implements TargetInfo {
      method LocalvarTarget (line 92) | public LocalvarTarget(Offsets[] table) {
      method getTable (line 99) | public Offsets[] getTable() {
      class Offsets (line 106) | public static class Offsets {
        method Offsets (line 113) | public Offsets(int startPc, int length, int index) {
        method getStartPc (line 122) | public int getStartPc() {
        method getLength (line 129) | public int getLength() {
        method getIndex (line 136) | public int getIndex() {
    class OffsetTarget (line 146) | class OffsetTarget implements TargetInfo {
      method OffsetTarget (line 149) | public OffsetTarget(int offset) {
      method getOffset (line 158) | public int getOffset() {
    class SupertypeTarget (line 167) | class SupertypeTarget implements TargetInfo {
      method SupertypeTarget (line 172) | public SupertypeTarget(int supertypeIndex) {
      method getSupertypeIndex (line 181) | public int getSupertypeIndex() {
      method inExtendsClause (line 185) | public boolean inExtendsClause() {
      method extract (line 192) | public static List<TypeAnnotation> extract(List<TypeAnnotation> type...
      method extractExtends (line 203) | public static List<TypeAnnotation> extractExtends(List<TypeAnnotatio...
    class ThrowsTarget (line 215) | class ThrowsTarget implements TargetInfo {
      method ThrowsTarget (line 218) | public ThrowsTarget(int throwsTypeIndex) {
      method getThrowsTypeIndex (line 225) | public int getThrowsTypeIndex() {
      method extract (line 232) | public static List<TypeAnnotation> extract(List<TypeAnnotation> type...
    class TypeParameterTarget (line 245) | class TypeParameterTarget implements TargetInfo {
      method TypeParameterTarget (line 248) | public TypeParameterTarget(int typeParameterIndex) {
      method getTypeParameterIndex (line 255) | public int getTypeParameterIndex() {
      method extract (line 262) | public static List<TypeAnnotation> extract(List<TypeAnnotation> type...
    class TypeParameterBoundTarget (line 276) | class TypeParameterBoundTarget implements TargetInfo {
      method TypeParameterBoundTarget (line 281) | public TypeParameterBoundTarget(int typeParameterIndex, int boundInd...
      method getTypeParameterIndex (line 289) | public int getTypeParameterIndex() {
      method getBoundIndex (line 296) | public int getBoundIndex() {
      method extract (line 303) | public static List<TypeAnnotation> extract(
    class TypeArgumentTarget (line 318) | class TypeArgumentTarget implements TargetInfo {
      method TypeArgumentTarget (line 323) | public TypeArgumentTarget(int offset, int typeArgumentIndex) {
      method getOffset (line 328) | public int getOffset() {
      method getTypeArgumentIndex (line 332) | public int getTypeArgumentIndex() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/typeann/TypeAnnotation.java
  class TypeAnnotation (line 20) | public class TypeAnnotation {
    method TypeAnnotation (line 49) | public TypeAnnotation(
    method getTargetType (line 61) | @MagicConstant(valuesFromClass = TypeAnnotation.class)
    method getTargetInfo (line 66) | public TargetInfo getTargetInfo() {
    method getAnnotationExpr (line 70) | public @NotNull AnnotationExprent getAnnotationExpr() {
    method getPaths (line 74) | public @NotNull List<StructTypePathEntry> getPaths() {
    method toString (line 78) | @Override
    method writeTo (line 83) | public void writeTo(@NotNull StringBuilder sb) {
    method writeTo (line 88) | public void writeTo(@NotNull TextBuffer sb) {
    method listFrom (line 93) | public static List<TypeAnnotation> listFrom(StructMember md) {
    method isWrittenBeforeType (line 106) | public boolean isWrittenBeforeType(@NotNull Type type) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/typeann/TypeAnnotationWriteHelper.java
  class TypeAnnotationWriteHelper (line 16) | public class TypeAnnotationWriteHelper {
    method TypeAnnotationWriteHelper (line 21) | public TypeAnnotationWriteHelper(@NotNull TypeAnnotation annotation) {
    method TypeAnnotationWriteHelper (line 25) | public TypeAnnotationWriteHelper(@NotNull TypeAnnotation annotation, @...
    method getPaths (line 33) | public @NotNull Deque<StructTypePathEntry> getPaths() {
    method getAnnotation (line 40) | public @NotNull TypeAnnotation getAnnotation() {
    method writeTo (line 44) | public void writeTo(@NotNull StringBuilder sb) {
    method writeTo (line 48) | public void writeTo(@NotNull TextBuffer sb) {
    method arrayPathCount (line 52) | public int arrayPathCount() {
    method create (line 56) | public static List<TypeAnnotationWriteHelper> create(List<TypeAnnotati...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/CheckTypesResult.java
  class CheckTypesResult (line 10) | public class CheckTypesResult {
    method addMaxTypeExprent (line 14) | public void addMaxTypeExprent(Exprent exprent, VarType type) {
    method addMinTypeExprent (line 18) | public void addMinTypeExprent(Exprent exprent, VarType type) {
    method getMaxTypeExprents (line 22) | public List<ExprentTypePair> getMaxTypeExprents() {
    method getMinTypeExprents (line 26) | public List<ExprentTypePair> getMinTypeExprents() {
    class ExprentTypePair (line 30) | static class ExprentTypePair {
      method ExprentTypePair (line 34) | ExprentTypePair(Exprent exprent, VarType type) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarDefinitionHelper.java
  class VarDefinitionHelper (line 23) | public class VarDefinitionHelper {
    method VarDefinitionHelper (line 34) | public VarDefinitionHelper(Statement root, StructMethod mt, VarProcess...
    method setVarDefinitions (line 112) | public void setVarDefinitions() {
    method findFirstBlock (line 199) | private Statement findFirstBlock(Statement stat, Integer varindex) {
    method initStatement (line 233) | private Set<Integer> initStatement(Statement stat) {
    method getAllVars (line 303) | private static List<VarExprent> getAllVars(List<Exprent> lst) {
    method setDefinition (line 322) | private static boolean setDefinition(Exprent expr, Integer index) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarProcessor.java
  class VarProcessor (line 19) | public class VarProcessor {
    method getMethod (line 24) | public StructMethod getMethod() {
    method VarProcessor (line 39) | public VarProcessor(StructClass cl, StructMethod mt, MethodDescriptor ...
    method setVarVersions (line 48) | public void setVarVersions(RootStatement root) {
    method setVarDefinitions (line 54) | public void setVarDefinitions(Statement root) {
    method setDebugVarNames (line 59) | public void setDebugVarNames(Map<Integer, String> mapDebugVarNames) {
    method getVarOriginalIndex (line 93) | public Integer getVarOriginalIndex(int index) {
    method refreshVarNames (line 97) | public void refreshVarNames(VarNamesCollector vc) {
    method getVarNamesCollector (line 104) | public VarNamesCollector getVarNamesCollector() {
    method getVarType (line 108) | public VarType getVarType(VarVersionPair pair) {
    method setVarType (line 112) | public void setVarType(VarVersionPair pair, VarType type) {
    method getVarName (line 116) | public String getVarName(VarVersionPair pair) {
    method setVarName (line 120) | public void setVarName(VarVersionPair pair, String name) {
    method getVarNames (line 124) | public Collection<String> getVarNames() {
    method getVarFinal (line 128) | public int getVarFinal(VarVersionPair pair) {
    method setVarFinal (line 132) | public void setVarFinal(VarVersionPair pair, int finalType) {
    method getThisVars (line 136) | public Map<VarVersionPair, String> getThisVars() {
    method getExternalVars (line 140) | public Set<VarVersionPair> getExternalVars() {
    method isParameterFinal (line 144) | public boolean isParameterFinal(VarVersionPair pair) {
    method setParameterFinal (line 148) | public void setParameterFinal(VarVersionPair pair) {
    method getFirstParameterVarIndex (line 152) | public int getFirstParameterVarIndex() {
    method getFirstParameterPosition (line 156) | public int getFirstParameterPosition() {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarTypeProcessor.java
  class VarTypeProcessor (line 24) | public class VarTypeProcessor {
    method VarTypeProcessor (line 32) | public VarTypeProcessor(@NotNull StructMethod method, @NotNull MethodD...
    method calculateVarTypes (line 37) | public void calculateVarTypes(@NotNull RootStatement root, @NotNull Di...
    method setInitVariables (line 45) | private void setInitVariables() {
    method setCatchBlockVariables (line 62) | private void setCatchBlockVariables(@NotNull RootStatement root) {
    method checkTypeExprent (line 84) | private boolean checkTypeExprent(@NotNull Exprent currentExprent) {
    method processVarTypes (line 113) | private boolean processVarTypes(@NotNull DirectGraph graph) {
    method changeExprentType (line 117) | private boolean changeExprentType(@NotNull Exprent exprent, @NotNull V...
    method changeConstExprentType (line 152) | private boolean changeConstExprentType(@NotNull VarVersionPair varVers...
    method resetExprentTypes (line 190) | private static void resetExprentTypes(@NotNull DirectGraph graph) {
    method getMaxExprentTypes (line 209) | public Map<VarVersionPair, VarType> getMaxExprentTypes() {
    method getMinExprentTypes (line 213) | public Map<VarVersionPair, VarType> getMinExprentTypes() {
    method getFinalVariables (line 217) | public Map<VarVersionPair, Integer> getFinalVariables() {
    method getVarType (line 221) | public VarType getVarType(VarVersionPair pair) {
    method setVarType (line 225) | public void setVarType(VarVersionPair pair, VarType type) {

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionEdge.java
  class VarVersionEdge (line 4) | public class VarVersionEdge { // FIXME: can be removed?
    method VarVersionEdge (line 17) | public VarVersionEdge(int type, VarVersionNode source, VarVersionNode ...
    method equals (line 24) | @Override
    method hashCode (line 32) | @Override
    method toString (line 37) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionNode.java
  class VarVersionNode (line 12) | public class VarVersionNode implements IGraphNode {
    method VarVersionNode (line 23) | public VarVersionNode(int var, int version) {
    method addPredecessor (line 28) | public void addPredecessor(VarVersionEdge edge) {
    method removePredecessor (line 32) | public void removePredecessor(VarVersionEdge edge) {
    method addSuccessor (line 36) | public void addSuccessor(VarVersionEdge edge) {
    method removeSuccessor (line 40) | public void removeSuccessor(VarVersionEdge edge) {
    method getPredecessorNodes (line 44) | @Override
    method toString (line 53) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionPair.java
  class VarVersionPair (line 6) | public class VarVersionPair {
    method VarVersionPair (line 13) | public VarVersionPair(int var, int version) {
    method VarVersionPair (line 18) | public VarVersionPair(Integer var, Integer version) {
    method VarVersionPair (line 23) | public VarVersionPair(VarExprent var) {
    method equals (line 28) | @Override
    method hashCode (line 36) | @Override
    method toString (line 44) | @Override

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionsGraph.java
  class VarVersionsGraph (line 11) | public class VarVersionsGraph {
    method createNode (line 16) | public VarVersionNode createNode(VarVersionPair ver) {
    method addNodes (line 22) | public void addNodes(Collection<VarVersionNode> colnodes, Collection<V...
    method isDominatorSet (line 26) | public boolean isDominatorSet(VarVersionNode node, Set<VarVersionNode>...
    method initDominators (line 65) | public void initDominators() {
    method getReversedPostOrder (line 89) | private static List<VarVersionNode> getReversedPostOrder(Collection<Va...
    method addToReversePostOrderListIterative (line 102) | private static void addToReversePostOrderListIterative(VarVersionNode ...

FILE: src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionsProcessor.java
  class VarVersionsProcessor (line 22) | public class VarVersionsProcessor {
    method VarVersionsProcessor (line 27) | public VarVersionsProcessor(StructMethod mt, MethodDescriptor md) {
    method setVarVersions (line 32) | public void setVarVersions(RootStatement root, VarVersionsProcessor pr...
    method mergePhiVersions (line 52) | private static void mergePhiVersions(SSAConstructorSparseEx ssa, Direc...
    method updateVersions (line 93) | private static void updateVersions(DirectGraph graph, final Map<VarVer...
    method eliminateNonJavaTypes (line 112) | private static void eliminateNonJavaTypes(VarTypeProcessor typeProcess...
    method simpleMerge (line 137) | private static void simpleMerge(VarTypeProcessor typeProcessor, Direct...
    method setNewVarIndices (line 237) | private void setNewVarIndices(VarTypeProcessor typeProcessor, DirectGr...
    method getVarType (line 307) | public VarType getVarType(VarVersionPair pair) {
    method setVarType (line 311) | public void setVarType(VarVersionPair pair, VarType type) {
    method getVarFinal (line 315) | public int getVarFinal(VarVersionPair pair) {
    method setVarFinal (line 320) | public void setVarFinal(VarVersionPair pair, int finalType) {
    method getMapOriginalVarIndices (line 324) | public Map<Integer, Integer> getMapOriginalVarIndices() {

FILE: src/org/jetbrains/java/decompiler/modules/renamer/ClassWrapperNode.java
  class ClassWrapperNode (line 9) | public class ClassWrapperNode {
    method ClassWrapperNode (line 13) | public ClassWrapperNode(StructClass cl) {
    method addSubclass (line 17) | public void addSubclass(ClassWrapperNode node) {
    method getClassStruct (line 21) | public StructClass getClassStruct() {
    method getSubclasses (line 25) | public List<ClassWrapperNode> getSubclasses() {

FILE: src/org/jetbrains/java/decompiler/modules/renamer/ConverterHelper.java
  class ConverterHelper (line 12) | public class ConverterHelper implements IIdentifierRenamer {
    method toBeRenamed (line 28) | @Override
    method isValidIdentifier (line 48) | private static boolean isValidIdentifier(boolean isMethod, String iden...
    method getNextClassName (line 77) | @Override
    method getNextFieldName (line 103) | @Override
    method getNextMethodName (line 108) | @Override
    method getSimpleClassName (line 117) | public static String getSimpleClassName(String fullName) {
    method replaceSimpleClassName (line 121) | public static String replaceSimpleClassName(String fullName, String ne...

FILE: src/org/jetbrains/java/decompiler/modules/renamer/IdentifierConverter.java
  class IdentifierConverter (line 18) | public class IdentifierConverter implements NewClassNameBuilder {
    method IdentifierConverter (line 26) | public IdentifierConverter(StructContext context, IIdentifierRenamer h...
    method rename (line 32) | public void rename() {
    method renameClasses (line 45) | private void renameClasses() {
    method processExternalInterface (line 83) | private Map<String, String> processExternalInterface(StructClass cl) {
    method renameInterfaces (line 104) | private void renameInterfaces() {
    method renameAllClasses (line 130) | private void renameAllClasses() {
    method renameClass (line 141) | private void renameClass(StructClass cl) {
    method renameClassIdentifiers (line 164) | private void renameClassIdentifiers(StructClass cl, Map<String, String...
    method buildNewClassname (line 240) | @Override
    method buildNewDescriptor (line 245) | private String buildNewDescriptor(boolean isField, String descriptor) {
    method getReversePostOrderListIterative (line 256) | private static List<ClassWrapperNode> getReversePostOrderListIterative...
    method buildInheritanceTree (line 296) | private void buildInheritanceTree() {

FILE: src/org/jetbrains/java/decompiler/modules/renamer/PoolInterceptor.java
  class PoolInterceptor (line 7) | public class PoolInterceptor {
    method addName (line 11) | public void addName(String oldName, String newName) {
    method getName (line 16) | public String getName(String oldName) {
    method getOldName (line 20) | public String getOldName(String newName) {

FILE: src/org/jetbrains/java/decompiler/struct/ContextUnit.java
  class ContextUnit (line 17) | public class ContextUnit {
    method ContextUnit (line 38) | public ContextUnit(int type, String archivePath, String filename, bool...
    method addClass (line 47) | public void addClass(StructClass cl, String entryName) {
    method addDirEntry (line 52) | public void addDirEntry(String entry) {
    method addOtherEntry (line 56) | public void addOtherEntry(String fullPath, String entry) {
    method reload (line 60) | public void reload(LazyLoader loader) throws IOException {
    method save (line 81) | public void save() {
    method setManifest (line 143) | public void setManifest(Manifest manifest) {
    method isOwn (line 147) | public boolean isOwn() {
    method getClasses (line 151) | public List<StructClass> getClasses() {

FILE: src/org/jetbrains/java/decompiler/struct/IDecompiledData.java
  type IDecompiledData (line 4) | public interface IDecompiledData {
    method getClassEntryName (line 6) | String getClassEntryName(StructClass cl, String entryname);
    method getClassContent (line 8) | String getClassContent(StructClass cl);

FILE: src/org/jetbrains/java/decompiler/struct/StructClass.java
  class StructClass (line 40) | public class StructClass extends StructMember {
    method create (line 41) | public static StructClass create(DataInputFullStream in, boolean own, ...
    method StructClass (line 98) | private StructClass(int accessFlags,
    method hasField (line 123) | public boolean hasField(String name, String descriptor) {
    method getField (line 127) | public StructField getField(String name, String descriptor) {
    method getMethod (line 131) | public StructMethod getMethod(String key) {
    method getMethod (line 135) | public StructMethod getMethod(String name, String descriptor) {
    method getInterface (line 139) | public String getInterface(int i) {
    method releaseResources (line 143) | public void releaseResources() {
    method getPool (line 149) | public ConstantPool getPool() {
    method getRecordComponents (line 159) | public List<StructRecordComponent> getRecordComponents() {
    method getPermittedSubclasses (line 165) | public List<String> getPermittedSubclasses() {
    method getInterfaces (line 171) | public int[] getInterfaces() {
    method getInterfaceNames (line 175) | public String[] getInterfaceNames() {
    method getMethods (line 179) | public VBStyleCollection<StructMethod, String> getMethods() {
    method getFields (line 183) | public VBStyleCollection<StructField, String> getFields() {
    method isOwn (line 187) | public boolean isOwn() {
    method getLoader (line 191) | public LazyLoader getLoader() {
    method isVersion5 (line 195) | public boolean isVersion5() {
    method isVersion7 (line 200) | public boolean isVersion7() {
    method isVersion8 (line 204) | public boolean isVersion8() {
    method isVersion14 (line 208) | public boolean isVersion14() {
    method isVersion15 (line 212) | public boolean isVersion15() {
    method isVersion16 (line 216) | public boolean isVersion16() {
    method isVersion17 (line 220) | public boolean isVersion17() {
    method isVersion21 (line 224) | public boolean isVersion21() {
    method isPreviewVersion (line 228) | public boolean isPreviewVersion() {
    method hasSealedClassesSupport (line 232) | public boolean hasSealedClassesSupport() {
    method hasPatternsInInstanceofSupport (line 236) | public boolean hasPatternsInInstanceofSupport() {
    method hasEnhancedSwitchSupport (line 240) | public boolean hasEnhancedSwitchSupport() {
    method hasRecordPatternSupport (line 244) | public boolean hasRecordPatternSupport() {
    method toString (line 248) | @Override
    method getType (line 253) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/StructContext.java
  class StructContext (line 19) | public class StructContext {
    method StructContext (line 26) | public StructContext(IResultSaver saver, IDecompiledData decompiledDat...
    method getClass (line 35) | public StructClass getClass(String name) {
    method reloadContext (line 39) | public void reloadContext() throws IOException {
    method saveContext (line 54) | public void saveContext() {
    method addSpace (line 62) | public void addSpace(File file, boolean isOwn) {
    method addSpace (line 66) | private void addSpace(String path, File file, boolean isOwn, int level) {
    method addArchive (line 124) | private void addArchive(String path, File file, int type, boolean isOw...
    method getClasses (line 164) | public Map<String, StructClass> getClasses() {

FILE: src/org/jetbrains/java/decompiler/struct/StructField.java
  class StructField (line 22) | public class StructField extends StructMember {
    method create (line 23) | public static StructField create(DataInputFullStream in, ConstantPool ...
    method StructField (line 38) | protected StructField(int accessFlags, Map<String, StructGeneralAttrib...
    method getName (line 44) | public final String getName() {
    method getDescriptor (line 48) | public final String getDescriptor() {
    method toString (line 52) | @Override
    method getType (line 57) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/StructMember.java
  class StructMember (line 22) | public abstract class StructMember {
    method StructMember (line 26) | protected StructMember(int accessFlags, Map<String, StructGeneralAttri...
    method getAccessFlags (line 31) | public int getAccessFlags() {
    method getAttribute (line 35) | public <T extends StructGeneralAttribute> T getAttribute(StructGeneral...
    method hasAttribute (line 40) | public boolean hasAttribute(StructGeneralAttribute.Key<?> attribute) {
    method hasModifier (line 44) | public boolean hasModifier(int modifier) {
    method isSynthetic (line 48) | public boolean isSynthetic() {
    method getType (line 52) | protected abstract Type getType();
    method memberAnnCollidesWithTypeAnnotation (line 57) | public boolean memberAnnCollidesWithTypeAnnotation(AnnotationExprent t...
    method paramAnnCollidesWithTypeAnnotation (line 70) | public boolean paramAnnCollidesWithTypeAnnotation(AnnotationExprent ty...
    method getPossibleTypeAnnotationCollisions (line 78) | private List<TypeAnnotation> getPossibleTypeAnnotationCollisions(@NotN...
    method readAttributes (line 92) | public static Map<String, StructGeneralAttribute> readAttributes(DataI...

FILE: src/org/jetbrains/java/decompiler/struct/StructMethod.java
  class StructMethod (line 30) | public class StructMethod extends StructMember {
    method create (line 31) | public static StructMethod create(DataInputFullStream in, ConstantPool...
    method StructMethod (line 61) | private StructMethod(int accessFlags,
    method expandData (line 81) | public void expandData(StructClass classStruct) throws IOException {
    method releaseResources (line 89) | public void releaseResources() {
    method parseBytecode (line 96) | @SuppressWarnings("AssignmentToForLoopParameter")
    method getName (line 298) | public String getName() {
    method getDescriptor (line 302) | public String getDescriptor() {
    method getBytecodeVersion (line 306) | public int getBytecodeVersion() {
    method containsCode (line 310) | public boolean containsCode() {
    method getLocalVariables (line 314) | public int getLocalVariables() {
    method getInstructionSequence (line 318) | public InstructionSequence getInstructionSequence() {
    method getLocalVariableAttr (line 322) | public StructLocalVariableTableAttribute getLocalVariableAttr() {
    method getType (line 326) | @Override
    method toString (line 331) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/StructRecordComponent.java
  class StructRecordComponent (line 20) | public class StructRecordComponent extends StructField {
    method create (line 21) | public static StructRecordComponent create(DataInputFullStream in, Con...
    method StructRecordComponent (line 33) | private StructRecordComponent(int flags, Map<String, StructGeneralAttr...

FILE: src/org/jetbrains/java/decompiler/struct/StructTypePathEntry.java
  class StructTypePathEntry (line 7) | public class StructTypePathEntry {
    method StructTypePathEntry (line 11) | public StructTypePathEntry(int typePathKind, int typeArgumentIndex) {
    method getTypeArgumentIndex (line 19) | public int getTypeArgumentIndex() {
    method getTypePathEntryKind (line 26) | public int getTypePathEntryKind() {
    type Kind (line 35) | public enum Kind {
      method Kind (line 58) | Kind(int id) {
      method getId (line 62) | public int getId() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructAnnDefaultAttribute.java
  class StructAnnDefaultAttribute (line 10) | public class StructAnnDefaultAttribute extends StructGeneralAttribute {
    method initContent (line 14) | @Override
    method getDefaultValue (line 19) | public Exprent getDefaultValue() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructAnnotationAttribute.java
  class StructAnnotationAttribute (line 19) | public class StructAnnotationAttribute extends StructGeneralAttribute {
    method initContent (line 22) | @Override
    method parseAnnotations (line 27) | public static List<AnnotationExprent> parseAnnotations(ConstantPool po...
    method parseAnnotation (line 41) | public static @NotNull AnnotationExprent parseAnnotation(DataInputStre...
    method parseAnnotationElement (line 63) | public static Exprent parseAnnotationElement(DataInputStream data, Con...
    method getAnnotations (line 137) | public List<AnnotationExprent> getAnnotations() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructAnnotationParameterAttribute.java
  class StructAnnotationParameterAttribute (line 13) | public class StructAnnotationParameterAttribute extends StructGeneralAtt...
    method initContent (line 17) | @Override
    method getParamAnnotations (line 32) | public List<List<AnnotationExprent>> getParamAnnotations() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructBootstrapMethodsAttribute.java
  class StructBootstrapMethodsAttribute (line 13) | public class StructBootstrapMethodsAttribute extends StructGeneralAttrib...
    method initContent (line 18) | @Override
    method getMethodsNumber (line 39) | public int getMethodsNumber() {
    method getMethodReference (line 43) | public LinkConstant getMethodReference(int index) {
    method getMethodArguments (line 47) | public List<PooledConstant> getMethodArguments(int index) {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructCodeAttribute.java
  class StructCodeAttribute (line 26) | public class StructCodeAttribute extends StructGeneralAttribute {
    method initContent (line 32) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructConstantValueAttribute.java
  class StructConstantValueAttribute (line 9) | public class StructConstantValueAttribute extends StructGeneralAttribute {
    method initContent (line 13) | @Override
    method getIndex (line 18) | public int getIndex() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructEnclosingMethodAttribute.java
  class StructEnclosingMethodAttribute (line 10) | public class StructEnclosingMethodAttribute extends StructGeneralAttribu...
    method initContent (line 16) | @Override
    method getClassName (line 29) | public String getClassName() {
    method getMethodDescriptor (line 33) | public String getMethodDescriptor() {
    method getMethodName (line 37) | public String getMethodName() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructExceptionsAttribute.java
  class StructExceptionsAttribute (line 12) | public class StructExceptionsAttribute extends StructGeneralAttribute {
    method initContent (line 16) | @Override
    method getExcClassname (line 30) | public String getExcClassname(int index, ConstantPool pool) {
    method getThrowsExceptions (line 34) | public List<Integer> getThrowsExceptions() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java
  class StructGeneralAttribute (line 16) | public class StructGeneralAttribute {
    class Key (line 47) | @SuppressWarnings("unused")
      method Key (line 51) | public Key(String name) {
    method createAttribute (line 56) | public static StructGeneralAttribute createAttribute(String name) {
    method initContent (line 118) | public void initContent(DataInputFullStream data, ConstantPool pool) t...

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructGenericSignatureAttribute.java
  class StructGenericSignatureAttribute (line 9) | public class StructGenericSignatureAttribute extends StructGeneralAttrib...
    method initContent (line 13) | @Override
    method getSignature (line 19) | public String getSignature() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructInnerClassesAttribute.java
  class StructInnerClassesAttribute (line 12) | public class StructInnerClassesAttribute extends StructGeneralAttribute {
    class Entry (line 13) | public static final class Entry {
      method Entry (line 21) | private Entry(int outerNameIdx, int simpleNameIdx, int accessFlags, ...
    method initContent (line 33) | @Override
    method getEntries (line 57) | public List<Entry> getEntries() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java
  class StructLineNumberTableAttribute (line 18) | public class StructLineNumberTableAttribute extends StructGeneralAttribu...
    method initContent (line 21) | @Override
    method findLineNumber (line 36) | public int findLineNumber(int pc) {
    method getRawData (line 47) | public int[] getRawData() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructLocalVariableTableAttribute.java
  class StructLocalVariableTableAttribute (line 22) | public class StructLocalVariableTableAttribute extends StructGeneralAttr...
    method initContent (line 25) | @Override
    method add (line 49) | public void add(StructLocalVariableTableAttribute attr) {
    method getName (line 53) | public String getName(int index, int visibleOffset) {
    method getDescriptor (line 57) | public String getDescriptor(int index, int visibleOffset) {
    method matchingVars (line 61) | private Stream<LocalVariable> matchingVars(int index, int visibleOffse...
    method containsName (line 65) | public boolean containsName(String name) {
    method getMapParamNames (line 69) | public Map<Integer, String> getMapParamNames() {
    class LocalVariable (line 73) | private static final class LocalVariable {
      method LocalVariable (line 80) | private LocalVariable(int start_pc, int length, String name, String ...

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructLocalVariableTypeTableAttribute.java
  class StructLocalVariableTypeTableAttribute (line 18) | public class StructLocalVariableTypeTableAttribute extends StructGeneral...
    method initContent (line 22) | @Override
    method add (line 27) | public void add(StructLocalVariableTypeTableAttribute attr) {
    method getSignature (line 31) | public String getSignature(int index, int visibleOffset) {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructMethodParametersAttribute.java
  class StructMethodParametersAttribute (line 20) | public class StructMethodParametersAttribute extends StructGeneralAttrib...
    method initContent (line 23) | @Override
    method getEntries (line 43) | public List<Entry> getEntries() {
    class Entry (line 47) | public static class Entry {
      method Entry (line 51) | public Entry(String name, int accessFlags) {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructModuleAttribute.java
  class StructModuleAttribute (line 12) | public class StructModuleAttribute extends StructGeneralAttribute {
    method initContent (line 23) | @Override
    method readRequires (line 41) | public List<RequiresEntry> readRequires(DataInputFullStream data, Cons...
    method readExports (line 57) | private static List<ExportsEntry> readExports(DataInputFullStream data...
    method readOpens (line 72) | private static List<OpensEntry> readOpens(DataInputFullStream data, Co...
    method readUses (line 87) | private static List<String> readUses(DataInputFullStream data, Constan...
    method readProvides (line 91) | private static List<ProvidesEntry> readProvides(DataInputFullStream da...
    method readStringList (line 105) | private static List<String> readStringList(DataInputFullStream data, C...
    class RequiresEntry (line 120) | public static final class RequiresEntry {
      method RequiresEntry (line 125) | public RequiresEntry(String moduleName, int flags, String moduleVers...
    class ExportsEntry (line 132) | public static final class ExportsEntry {
      method ExportsEntry (line 137) | public ExportsEntry(String packageName, int flags, List<String> expo...
    class OpensEntry (line 144) | public static final class OpensEntry {
      method OpensEntry (line 149) | public OpensEntry(String packageName, int flags, List<String> export...
    class ProvidesEntry (line 156) | public static final class ProvidesEntry {
      method ProvidesEntry (line 160) | public ProvidesEntry(String interfaceName, List<String> implementati...

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructPermittedSubclassesAttribute.java
  class StructPermittedSubclassesAttribute (line 19) | public class StructPermittedSubclassesAttribute extends StructGeneralAtt...
    method initContent (line 22) | @Override
    method getClasses (line 32) | public List<String> getClasses() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructRecordAttribute.java
  class StructRecordAttribute (line 21) | public class StructRecordAttribute extends StructGeneralAttribute {
    method initContent (line 24) | @Override
    method getComponents (line 34) | public List<StructRecordComponent> getComponents() {

FILE: src/org/jetbrains/java/decompiler/struct/attr/StructTypeAnnotationAttribute.java
  class StructTypeAnnotationAttribute (line 17) | public class StructTypeAnnotationAttribute extends StructGeneralAttribute {
    method initContent (line 20) | @Override
    method parse (line 34) | private static TypeAnnotation parse(DataInputStream data, ConstantPool...
    method getAnnotations (line 79) | public List<TypeAnnotation> getAnnotations() {

FILE: src/org/jetbrains/java/decompiler/struct/consts/ConstantPool.java
  class ConstantPool (line 20) | @SuppressWarnings("AssignmentToForLoopParameter")
    method ConstantPool (line 28) | public ConstantPool(DataInputStream in) throws IOException {
    method skipPool (line 93) | public static void skipPool(DataInputFullStream in) throws IOException {
    method getClassElement (line 111) | public String[] getClassElement(int elementType, String className, int...
    method getConstant (line 135) | public PooledConstant getConstant(int index) {
    method getPrimitiveConstant (line 139) | public PrimitiveConstant getPrimitiveConstant(int index) {
    method getLinkConstant (line 154) | public LinkConstant getLinkConstant(int index) {
    method buildNewClassname (line 177) | @Override
    method buildNewDescriptor (line 196) | private String buildNewDescriptor(boolean isField, String descriptor) {

FILE: src/org/jetbrains/java/decompiler/struct/consts/LinkConstant.java
  class LinkConstant (line 6) | public class LinkConstant extends PooledConstant {
    method LinkConstant (line 12) | public LinkConstant(int type, String className, String elementName, St...
    method LinkConstant (line 21) | public LinkConstant(int type, int index1, int index2) {
    method initConstant (line 27) | private void initConstant() {
    method resolveConstant (line 41) | @Override
    method equals (line 67) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/consts/PooledConstant.java
  class PooledConstant (line 4) | public class PooledConstant {
    method PooledConstant (line 7) | public PooledConstant(int type) {
    method resolveConstant (line 11) | public void resolveConstant(ConstantPool pool) { }

FILE: src/org/jetbrains/java/decompiler/struct/consts/PrimitiveConstant.java
  class PrimitiveConstant (line 6) | public class PrimitiveConstant extends PooledConstant {
    method PrimitiveConstant (line 11) | public PrimitiveConstant(int type, Object value) {
    method PrimitiveConstant (line 18) | public PrimitiveConstant(int type, int index) {
    method initConstant (line 23) | private void initConstant() {
    method getString (line 30) | public String getString() {
    method resolveConstant (line 34) | @Override
    method equals (line 43) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/gen/DataPoint.java
  class DataPoint (line 11) | public class DataPoint {
    method DataPoint (line 15) | public DataPoint() {
    method DataPoint (line 19) | private DataPoint(List<VarType> localVariables, ListStack<VarType> sta...
    method copy (line 24) | public DataPoint copy() {
    method setVariable (line 28) | public void setVariable(int index, VarType value) {
    method getVariable (line 38) | public VarType getVariable(int index) {
    method getInitialDataPoint (line 47) | public static DataPoint getInitialDataPoint(StructMethod mt) {
    method getStack (line 69) | public ListStack<VarType> getStack() {

FILE: src/org/jetbrains/java/decompiler/struct/gen/FieldDescriptor.java
  class FieldDescriptor (line 6) | public final class FieldDescriptor {
    method FieldDescriptor (line 16) | private FieldDescriptor(String descriptor) {
    method parseDescriptor (line 21) | public static FieldDescriptor parseDescriptor(String descriptor) {
    method buildNewDescriptor (line 25) | public String buildNewDescriptor(NewClassNameBuilder builder) {
    method equals (line 36) | @Override
    method hashCode (line 44) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/gen/MethodDescriptor.java
  class MethodDescriptor (line 10) | public final class MethodDescriptor {
    method MethodDescriptor (line 14) | private MethodDescriptor(VarType[] params, VarType ret) {
    method parseDescriptor (line 19) | public static MethodDescriptor parseDescriptor(String descriptor) {
    method buildNewDescriptor (line 67) | public String buildNewDescriptor(NewClassNameBuilder builder) {
    method buildNewType (line 104) | private static VarType buildNewType(VarType type, NewClassNameBuilder ...
    method equals (line 114) | @Override
    method hashCode (line 122) | @Override

FILE: src/org/jetbrains/java/decompiler/struct/gen/NewClassNameBuilder.java
  type NewClassNameBuilder (line 4) | public interface NewClassNameBuilder {
    method buildNewClassname (line 5) | String buildNewClassname(String className);

FILE: src/org/jetbrains/java/decompiler/struct/gen/Type.java
  type Type (line 10) | public interface Type {
    method getType (line 11) | int getType();
    method getArrayDim (line 13) | int getArrayDim();
    method getValue (line 15) | String getValue();
    method isAnnotatable (line 21) | default boolean isAnnotatable() {

FILE: src/org/jetbrains/java/decompiler/struct/gen/VarType.java
  class VarType (line 8) | public class VarType implements Type {  // TODO: optimize switch
    method VarType (line 41) | public VarType(int type) {
    method VarType (line 45) | public VarType(int type, int arrayDim) {
    method VarType (line 49) | public VarType(int type, int arrayDim, String value) {
    method VarType (line 53) | private VarType(int type, int arrayDim, String value, int typeFamily, ...
    method VarType (line 62) | public VarType(String signature) {
    method VarType (line 66) | public VarType(String signature, boolean clType) {
    method getType (line 105) | @Override
    method getArrayDim (line 110) | @Override
    method getValue (line 115) | @Override
    method getTypeFamily (line 120) | public int getTypeFamily() {
    method getStackSize (line 124) | public int getStackSize() {
    method getChar (line 128) | private static String getChar(int type) {
    method getStackSize (line 150) | private static int getStackSize(int type, int arrayDim) {
    method getFamily (line 162) | private static int getFamily(int type, int arrayDim) {
    method decreaseArrayDim (line 179) | public VarType decreaseArrayDim() {
    method resizeArrayDim (line 189) | public VarType resizeArrayDim(int newArrayDim) {
    method copy (line 193) | public VarType copy() {
    method copy (line 197) | public VarType copy(boolean forceFalseBoolean) {
    method isFalseBoolean (line 201) | public boolean isFalseBoolean() {
    method isSuperset (line 205) | public boolean isSuperset(VarType val) {
    method isStrictSuperset (line 209) | public boolean isStrictSuperset(VarType val) {
    method equals (line 251) | @Override
    method toString (line 264) | @Override
    method getCommonMinType (line 280) | public static VarType getCommonMinType(VarType type1, VarType type2) {
    method getCommonSupertype (line 312) | public static VarType getCommonSupertype(VarType type1, VarType type2) {
    method getMinTypeInFamily (line 343) | public static VarType getMinTypeInFamily(int family) {
    method getType (line 356) | public static int getType(char c) {

FILE: src/org/jetbrains/java/decompiler/struct/gen/generics/GenericClassDescriptor.java
  class GenericClassDescriptor (line 7) | public class GenericClassDescriptor {

FILE: src/org/jetbrains/java/decompiler/struct/gen/generics/GenericFieldDescriptor.java
  class GenericFieldDescriptor (line 4) | public class GenericFieldDescriptor {
    method GenericFieldDescriptor (line 7) | public GenericFieldDescriptor(GenericType type) {

FILE: src/org/jetbrains/java/decompiler/struct/gen/generics/GenericMain.java
  class GenericMain (line 16) | public final class GenericMain {
    method parseClassSignature (line 29) | public static GenericClassDescriptor parseClassSignature(String signat...
    method parseFieldSignature (line 54) | public static GenericFieldDescriptor parseFieldSignature(String signat...
    method parseMethodSignature (line 64) | public static GenericMethodDescriptor parseMethodSignature(String sign...
    method parseFormalParameters (line 102) | private static String parseFormalParameters(String signature, List<? s...
    method getGenericCastTypeName (line 162) | public static String getGenericCastTypeName(GenericType type, List<Typ...
    method getTypeName (line 170) | private static String getTypeName(GenericType type, List<TypeAnnotatio...
    method appendClassName (line 193) | private static void appendClassName(GenericType type, StringBuilder sb...
    method appendTypeArguments (line 220) | private static List<TypeAnnotationWriteHelper> appendTypeArguments(
    method getGenericTypeAnnotations (line 256) | private static List<TypeAnnotationWriteHelper> getGenericTypeAnnotations(
    method writeTypeAnnotationBeforeWildCard (line 269) | private static List<TypeAnnotationWriteHelper> writeTypeAnnotationBefo...
    method writeTypeAnnotationAfterWildCard (line 289) | private static List<TypeAnnotationWriteHelper> writeTypeAnnotationAfte...

FILE: src/org/jetbrains/java/decompiler/struct/gen/generics/GenericMethodDescriptor.java
  class GenericMethodDescriptor (line 7) | public class GenericMethodDescriptor {
    method GenericMethodDescriptor (line 14) | public GenericMethodDescriptor(List<String> typeParameters,
    method substitute (line 26) | private static <T> List<T> substitute(List<T> list) {

FILE: src/org/jetbrains/java/decompiler/struct/gen/generics/GenericType.java
  class GenericType (line 11) | public class GenericType implements Type {
    method GenericType (line 26) | public GenericType(int type, int arrayDim, String value) {
    method GenericType (line 32) | private GenericType(GenericType other, int arrayDim) {
    method GenericType (line 39) | public GenericType(String signature) {
    method getType (line 101) | @Override
    method getArrayDim (line 106) | @Override
    method getValue (line 111) | @Override
    method getNextClassSignature (line 116) | private static String getNextClassSignature(String value) {
    method parseArgumentsList (line 138) | private static void parseArgumentsList(String value, GenericType type) {
    method getNextType (line 165) | public static String getNextType(String value) {
    method decreaseArrayDim (line 211) | public GenericType decreaseArrayDim() {
    method getArguments (line 216) | public List<GenericType> getArguments() {
    method getEnclosingClasses (line 220) | public List<GenericType> getEnclosingClasses() {
    method getWildcards (line 224) | public List<Integer> getWildcards() {

FILE: src/org/jetbrains/java/decompiler/struct/lazy/LazyLoader.java
  class LazyLoader (line 15) | public class LazyLoader {
    method LazyLoader (line 19) | public LazyLoader(IBytecodeProvider provider) {
    method addClassLink (line 23) | public void addClassLink(String className, Link link) {
    method removeClassLink (line 27) | public void removeClassLink(String className) {
    method getClassLink (line 31) | public Link getClassLink(String className) {
    method loadPool (line 35) | public ConstantPool loadPool(String className) {
    method loadBytecode (line 49) | public byte[] loadBytecode(StructClass classStruct, StructMethod mt, i...
    method getClassStream (line 115) | public DataInputFullStream getClassStream(String externalPath, String ...
    method getClassStream (line 120) | public DataInputFullStream getClassStream(String qualifiedClassName) t...
    method skipAttributes (line 125) | public static void skipAttributes(DataInputFullStream in) throws IOExc...
    class Link (line 133) | public static class Link {
      method Link (line 137) | public Link(String externalPath, String internalPath) {

FILE: src/org/jetbrains/java/decompiler/struct/match/IMatchable.java
  type IMatchable (line 4) | public interface IMatchable {
    type MatchProperties (line 5) | enum MatchProperties {
    method findObject (line 27) | IMatchable findObject(MatchNode matchNode, int index);
    method match (line 29) | boolean match(MatchNode matchNode, MatchEngine engine);

FILE: src/org/jetbrains/java/decompiler/struct/match/MatchEngine.java
  class MatchEngine (line 17) | public class MatchEngine {
    method MatchEngine (line 85) | public MatchEngine(String description) {
    method match (line 156) | public boolean match(IMatchable object) {
    method match (line 161) | private boolean match(MatchNode matchNode, IMatchable object) {
    method checkAndSetVariableValue (line 187) | public boolean checkAndSetVariableValue(String name, Object value) {
    method getVariableValue (line 198) | public Object getVariableValue(String name) {

FILE: src/org/jetbrains/java/decompiler/struct/match/MatchNode.java
  class MatchNode (line 11) | public class MatchNode {
    class RuleValue (line 12) | public static class RuleValue {
      method RuleValue (line 16) | public RuleValue(int parameter, Object value) {
      method isVariable (line 21) | public boolean isVariable() {
      method toString (line 26) | public String toString() {
    method MatchNode (line 38) | public MatchNode(int type) {
    method addChild (line 42) | public void addChild(MatchNode child) {
    method addRule (line 46) | public void addRule(MatchProperties property, RuleValue value) {
    method getType (line 50) | public int getType() {
    method getChildren (line 54) | public List<MatchNode> getChildren() {
    method getRules (line 58) | public Map<MatchProperties, RuleValue> getRules() {
    method getRuleValue (line 62) | public Object getRuleValue(MatchProperties property) {

FILE: src/org/jetbrains/java/decompiler/util/DataInputFullStream.java
  class DataInputFullStream (line 8) | public class DataInputFullStream extends DataInputStream {
    method DataInputFullStream (line 9) | public DataInputFullStream(byte[] bytes) {
    method read (line 13) | public byte[] read(int n) throws IOException {
    method discard (line 17) | public void discard(int n) throws IOException {

FILE: src/org/jetbrains/java/decompiler/util/FastFixedSetFactory.java
  class FastFixedSetFactory (line 6) | public class FastFixedSetFactory<E> {
    method FastFixedSetFactory (line 12) | public FastFixedSetFactory(Collection<E> set) {
    method spawnEmptySet (line 34) | public FastFixedSet<E> spawnEmptySet() {
    method getDataLength (line 38) | private int getDataLength() {
    method getInternalValuesCollection (line 42) | private VBStyleCollection<int[], E> getInternalValuesCollection() {
    class FastFixedSet (line 46) | public static final class FastFixedSet<E> implements Iterable<E> {
      method FastFixedSet (line 55) | private FastFixedSet(FastFixedSetFactory<E> factory) {
      method getCopy (line 61) | public FastFixedSet<E> getCopy() {
      method setAllElements (line 72) | public void setAllElements() {
      method add (line 83) | public void add(E element) {
      method addAll (line 88) | public void addAll(Collection<E> set) {
      method remove (line 94) | public void remove(E element) {
      method contains (line 99) | public boolean contains(E element) {
      method contains (line 104) | public boolean contains(FastFixedSet<E> set) {
      method union (line 117) | public void union(FastFixedSet<E> set) {
      method intersection (line 126) | public void intersection(FastFixedSet<E> set) {
      method complement (line 135) | public void complement(FastFixedSet<E> set) {
      method equals (line 145) | public boolean equals(Object o) {
      method isEmpty (line 161) | public boolean isEmpty() {
      method iterator (line 173) | @Override
      method toPlainSet (line 178) | public Set<E> toPlainSet() {
      method toPlainCollection (line 182) | private <T extends Collection<E>> T toPlainCollection(T cl) {
      method toString (line 202) | public String toString() {
      method getData (line 228) | private int[] getData() {
      method setData (line 232) | private void setData(int[] data) {
      method getFactory (line 236) | public FastFixedSetFactory<E> getFactory() {
    class FastFixedSetIterator (line 241) | public static final class FastFixedSetIterator<E> implements Iterator<...
      method FastFixedSetIterator (line 250) | private FastFixedSetIterator(FastFixedSet<E> set) {
      method getNextIndex (line 256) | private int getNextIndex(int index) {
      method hasNext (line 288) | @Override
      method next (line 294) | @Override
      method remove (line 310) | @Override

FILE: src/org/jetbrains/java/decompiler/util/FastSparseSetFactory.java
  class FastSparseSetFactory (line 6) | public class FastSparseSetFactory<E> {
    method FastSparseSetFactory (line 14) | public FastSparseSetFactory(Collection<? extends E> set) {
    method addElement (line 40) | private int[] addElement(E element) {
    method spawnEmptySet (line 56) | public FastSparseSet<E> spawnEmptySet() {
    method getLastBlock (line 60) | public int getLastBlock() {
    method getInternalValuesCollection (line 64) | private VBStyleCollection<int[], E> getInternalValuesCollection() {
    class FastSparseSet (line 69) | public static final class FastSparseSet<E> implements Iterable<E> {
      method FastSparseSet (line 79) | private FastSparseSet(FastSparseSetFactory<E> factory) {
      method FastSparseSet (line 88) | private FastSparseSet(FastSparseSetFactory<E> factory, int[] data, i...
      method getCopy (line 96) | public FastSparseSet<E> getCopy() {
      method ensureCapacity (line 100) | private int[] ensureCapacity(int index) {
      method add (line 117) | public void add(E element) {
      method remove (line 134) | public void remove(E element) {
      method contains (line 151) | public boolean contains(E element) {
      method setNext (line 161) | private void setNext() {
      method changeNext (line 172) | private static void changeNext(int[] arrnext, int key, int oldnext, ...
      method union (line 183) | public void union(FastSparseSet<E> set) {
      method intersection (line 208) | public void intersection(FastSparseSet<E> set) {
      method complement (line 225) | public void complement(FastSparseSet<E> set) {
      method equals (line 248) | public boolean equals(Object o) {
      method getCardinality (line 275) | public int getCardinality() {
      method isEmpty (line 300) | public boolean isEmpty() {
      method iterator (line 304) | @Override
      method toPlainSet (line 309) | public Set<E> toPlainSet() {
      method toString (line 330) | public String toString() {
      method getData (line 334) | private int[] getData() {
      method getNext (line 338) | private int[] getNext() {
      method getFactory (line 342) | public FastSparseSetFactory<E> getFactory() {
    class FastSparseSetIterator (line 347) | public static final class FastSparseSetIterator<E> implements Iterator...
      method FastSparseSetIterator (line 357) | private FastSparseSetIterator(FastSparseSet<E> set) {
      method getNextIndex (line 364) | private int getNextIndex(int index) {
      method hasNext (line 395) | @Override
      method next (line 401) | @Override
      method remove (line 417) | @Override

FILE: src/org/jetbrains/java/decompiler/util/InterpreterUtil.java
  class InterpreterUtil (line 10) | public final class InterpreterUtil {
    method copyFile (line 17) | public static void copyFile(File source, File target) throws IOExcepti...
    method copyStream (line 23) | public static void copyStream(InputStream in, OutputStream out) throws...
    method getBytes (line 31) | public static byte[] getBytes(ZipFile archive, ZipEntry entry) throws ...
    method getBytes (line 37) | public static byte[] getBytes(File file) throws IOException {
    method readBytes (line 43) | public static byte[] readBytes(InputStream stream, int length) throws ...
    method discardBytes (line 58) | public static void discardBytes(InputStream stream, int length) throws...
    method equalSets (line 64) | public static boolean equalSets(Collection<?> c1, Collection<?> c2) {
    method makeUniqueKey (line 81) | public static String makeUniqueKey(String name, String descriptor) {
    method makeUniqueKey (line 85) | public static String makeUniqueKey(String name, String descriptor1, St...

FILE: src/org/jetbrains/java/decompiler/util/ListStack.java
  class ListStack (line 6) | public class ListStack<T> extends ArrayList<T> {
    method ListStack (line 9) | public ListStack() {
    method ListStack (line 13) | public ListStack(int initialCapacity) {
    method ListStack (line 17) | private ListStack(ArrayList<? extends T> list) {
    method copy (line 21) | public ListStack<T> copy() {
    method push (line 27) | public void push(T item) {
    method pop (line 32) | public T pop() {
    method pop (line 39) | public T pop(int count) {
    method removeMultiple (line 47) | public void removeMultiple(int count) {
    method getByOffset (line 55) | public T getByOffset(int offset) {
    method insertByOffset (line 59) | public void insertByOffset(int offset, T item) {
    method clear (line 64) | @Override

FILE: src/org/jetbrains/java/decompiler/util/SFormsFastMapDirect.java
  class SFormsFastMapDirect (line 13) | public class SFormsFastMapDirect {
    method SFormsFastMapDirect (line 21) | public SFormsFastMapDirect() {
    method SFormsFastMapDirect (line 25) | private SFormsFastMapDirect(boolean initialize) {
    method SFormsFastMapDirect (line 35) | public SFormsFastMapDirect(SFormsFastMapDirect map) {
    method getCopy (line 54) | public SFormsFastMapDirect getCopy() {
    method size (line 95) | public int size() {
    method isEmpty (line 99) | public boolean isEmpty() {
    method put (line 103) | public void put(int key, FastSparseSet<Integer> value) {
    method removeAllFields (line 107) | public void removeAllFields() {
    method putInternal (line 121) | public void putInternal(final int key, final FastSparseSet<Integer> va...
    method changeNext (line 159) | private static void changeNext(int[] arrnext, int key, int oldnext, in...
    method containsKey (line 170) | public boolean containsKey(int key) {
    method get (line 174) | public FastSparseSet<Integer> get(int key) {
    method complement (line 194) | public void complement(SFormsFastMapDirect map) {
    method intersection (line 232) | public void intersection(SFormsFastMapDirect map) {
    method union (line 271) | public void union(SFormsFastMapDirect map) {
    method toString (line 312) | public String toString() {
    method entryList (line 336) | public List<Entry<Integer, FastSparseSet<Integer>>> entryList() {
    method ensureCapacity (line 374) | private FastSparseSet<Integer>[] ensureCapacity(int index, int size, b...

FILE: src/org/jetbrains/java/decompiler/util/TextBuffer.java
  class TextBuffer (line 14) | @SuppressWarnings("UnusedReturnValue")
    method TextBuffer (line 21) | public TextBuffer() {
    method TextBuffer (line 25) | public TextBuffer(int size) {
    method TextBuffer (line 29) | public TextBuffer(String text) {
    method append (line 33) | public TextBuffer append(String str) {
    method append (line 38) | public TextBuffer append(char ch) {
    method append (line 43) | public TextBuffer append(int i) {
    method appendLineSeparator (line 48) | public TextBuffer appendLineSeparator() {
    method appendIndent (line 53) | public TextBuffer appendIndent(int length) {
    method prepend (line 60) | public TextBuffer prepend(String s) {
    method enclose (line 66) | public TextBuffer enclose(String left, String right) {
    method containsOnlyWhitespaces (line 72) | public boolean containsOnlyWhitespaces() {
    method toString (line 81) | @Override
    method addOriginalLineNumbers (line 124) | private String addOriginalLineNumbers() {
    method appendLines (line 147) | private void appendLines(StringBuilder res, String[] srcLines, int fro...
    method length (line 169) | public int length() {
    method setStart (line 173) | public void setStart(int position) {
    method setLength (line 178) | public void setLength(int position) {
    method append (line 191) | public TextBuffer append(TextBuffer buffer) {
    method shiftMapping (line 202) | private void shiftMapping(int shiftOffset) {
    method checkMapCreated (line 218) | private void checkMapCreated() {
    method countLines (line 224) | public int countLines() {
    method countLines (line 228) | public int countLines(int from) {
    method count (line 232) | public int count(String substring, int from) {
    method compactLines (line 241) | private static List<String> compactLines(List<String> srcLines, int re...
    method dumpOriginalLineNumbers (line 273) | public void dumpOriginalLineNumbers(int[] lineMapping) {

FILE: src/org/jetbrains/java/decompiler/util/TextUtil.java
  class TextUtil (line 13) | public final class TextUtil {
    method writeQualifiedSuper (line 20) | public static void writeQualifiedSuper(TextBuffer buf, String qualifie...
    method getIndentString (line 28) | public static String getIndentString(int length) {
    method append (line 36) | public static void append(StringBuilder buf, String string, int times) {
    method isPrintableUnicode (line 40) | public static boolean isPrintableUnicode(char c) {
    method charToUnicodeLiteral (line 46) | public static String charToUnicodeLiteral(int value) {
    method isValidIdentifier (line 52) | public static boolean isValidIdentifier(String id, int version) {
    method isJavaIdentifier (line 56) | private static boolean isJavaIdentifier(String id) {
    method isKeyword (line 70) | private static boolean isKeyword(String id, int version) {
    method getInstructionName (line 74) | public static String getInstructionName(int opcode) {

FILE: src/org/jetbrains/java/decompiler/util/VBStyleCollection.java
  class VBStyleCollection (line 8) | public class VBStyleCollection<E, K> extends ArrayList<E> {
    method VBStyleCollection (line 14) | public VBStyleCollection() {
    method VBStyleCollection (line 18) | public VBStyleCollection(int initialCapacity) {
    method add (line 24) | @Override
    method remove (line 31) | @Override
    method addAll (line 36) | @Override
    method addAllWithKey (line 44) | public void addAllWithKey(Collection<E> elements, Collection<K> keys) {
    method addWithKey (line 55) | public void addWithKey(E element, K key) {
    method putWithKey (line 62) | public E putWithKey(E element, K key) {
    method add (line 73) | @Override
    method addWithKeyAndIndex (line 80) | public void addWithKeyAndIndex(int index, E element, K key) {
    method removeWithKey (line 87) | public void removeWithKey(K key) {
    method remove (line 95) | @Override
    method getWithKey (line 106) | public E getWithKey(K key) {
    method getIndexByKey (line 114) | public int getIndexByKey(K key) {
    method getLast (line 118) | public E getLast() {
    method containsKey (line 122) | public boolean containsKey(K key) {
    method clear (line 126) | @Override
    method clone (line 133) | @Override
    method setMap (line 142) | public void setMap(HashMap<K, Integer> map) {
    method getKey (line 146) | public K getKey(int index) {
    method getLstKeys (line 150) | public ArrayList<K> getLstKeys() {
    method setLstKeys (line 154) | public void setLstKeys(ArrayList<K> lstKeys) {
    method addToListIndex (line 158) | private void addToListIndex(int index, int diff) {

FILE: test/org/jetbrains/java/decompiler/BulkDecompilationTest.java
  class BulkDecompilationTest (line 18) | public class BulkDecompilationTest {
    method setUp (line 21) | @Before
    method tearDown (line 27) | @After
    method testDirectory (line 33) | @Test
    method testJar (line 45) | @Test
    method testKtJar (line 50) | @Test
    method testObfuscated (line 55) | @Test
    method doTestJar (line 60) | private void doTestJar(String name) {
    method unpack (line 72) | private static void unpack(Path archive, Path targetDir) {

FILE: test/org/jetbrains/java/decompiler/CancellableTest.java
  class CancellableTest (line 19) | public class CancellableTest {
    method setUp (line 30) | @Before
    method tearDown (line 66) | @After
    method testCancellablePrimitiveNarrowing (line 72) | @Test
    method testCancellableClassFields (line 77) | @Test
    method testCancellableInterfaceFields (line 80) | @Test
    method testCancellableClassLambda (line 83) | @Test
    method doCancellableTest (line 86) | private void doCancellableTest(String testFile, String... companionFil...

FILE: test/org/jetbrains/java/decompiler/ConverterHelperTest.java
  class ConverterHelperTest (line 11) | public class ConverterHelperTest {
    method testValidClassName (line 18) | @Test public void testValidClassName() { doTestClassName(VALID_CLASS_N...
    method testValidFieldName (line 19) | @Test public void testValidFieldName() { doTestFieldName(VALID_FIELD_N...
    method testValidMethodName (line 20) | @Test public void testValidMethodName() { doTestMethodName(VALID_METHO...
    method testNullClassName (line 22) | @Test public void testNullClassName() { doTestClassName(null, true); }
    method testNullFieldName (line 23) | @Test public void testNullFieldName() { doTestFieldName(null, VALID_FI...
    method testNullMethodName (line 24) | @Test public void testNullMethodName() { doTestMethodName(null, VALID_...
    method testEmptyClassName (line 26) | @Test public void testEmptyClassName() { doTestClassName("", true); }
    method testEmptyFieldName (line 27) | @Test public void testEmptyFieldName() { doTestFieldName("", VALID_FIE...
    method testEmptyMethodName (line 28) | @Test public void testEmptyMethodName() { doTestMethodName("", VALID_M...
    method testShortClassName (line 30) | @Test public void testShortClassName() { doTestClassName("C", true); }
    method testShortFieldName (line 31) | @Test public void testShortFieldName() { doTestFieldName("f", VALID_FI...
    method testShortMethodName (line 32) | @Test public void testShortMethodName() { doTestMethodName("m", VALID_...
    method testUnderscoreClassName (line 34) | @Test public void testUnderscoreClassName() { doTestClassName("_", tru...
    method testUnderscoreFieldName (line 35) | @Test public void testUnderscoreFieldName() { doTestFieldName("_", VAL...
    method testUnderscoreMethodName (line 36) | @Test public void testUnderscoreMethodName() { doTestMethodName("_", V...
    method testKeywordClassName (line 38) | @Test public void testKeywordClassName() { doTestClassName("public", t...
    method testKeywordFieldName (line 39) | @Test public void testKeywordFieldName() { doTestFieldName("public", V...
    method testKeywordMethodName (line 40) | @Test public void testKeywordMethodName() { doTestMethodName("public",...
    method testReservedWindowsNamespaceClassName (line 42) | @Test public void testReservedWindowsNamespaceClassName() { doTestClas...
    method testReservedWindowsNamespaceFieldName (line 43) | @Test public void testReservedWindowsNamespaceFieldName() { doTestFiel...
    method testReservedWindowsNamespaceName (line 44) | @Test public void testReservedWindowsNamespaceName() { doTestMethodNam...
    method testLeadingDigitClassName (line 46) | @Test public void testLeadingDigitClassName() { doTestClassName("4iden...
    method testLeadingDigitFieldName (line 47) | @Test public void testLeadingDigitFieldName() { doTestFieldName("4iden...
    method testLeadingDigitMethodName (line 48) | @Test public void testLeadingDigitMethodName() { doTestMethodName("4id...
    method testInvalidLeadingCharClassName (line 50) | @Test public void testInvalidLeadingCharClassName() { doTestClassName(...
    method testInvalidLeadingCharFieldName (line 51) | @Test public void testInvalidLeadingCharFieldName() { doTestFieldName(...
    method testInvalidLeadingCharMethodName (line 52) | @Test public void testInvalidLeadingCharMethodName() { doTestMethodNam...
    method testInvalidMiddleCharClassName (line 54) | @Test public void testInvalidMiddleCharClassName() { doTestClassName("...
    method testInvalidMiddleCharFieldName (line 55) | @Test public void testInvalidMiddleCharFieldName() { doTestFieldName("...
    method testInvalidMiddleCharMethodName (line 56) | @Test public void testInvalidMiddleCharMethodName() { doTestMethodName...
    method testInvalidTrailingCharClassName (line 58) | @Test public void testInvalidTrailingCharClassName() { doTestClassName...
    method testInvalidTrailingCharFieldName (line 59) | @Test public void testInvalidTrailingCharFieldName() { doTestFieldName...
    method testInvalidTrailingCharMethodName (line 60) | @Test public void testInvalidTrailingCharMethodName() { doTestMethodNa...
    method testLtInitGtClassName (line 62) | @Test public void testLtInitGtClassName() { doTestClassName(CodeConsta...
    method testLtInitGtFieldName (line 63) | @Test public void testLtInitGtFieldName() { doTestFieldName(CodeConsta...
    method testLtInitGtMethodName (line 64) | @Test public void testLtInitGtMethodName() { doTestMethodName(CodeCons...
    method testLtClinitGtClassName (line 66) | @Test public void testLtClinitGtClassName() { doTestClassName(CodeCons...
    method testLtClinitGtFieldName (line 67) | @Test public void testLtClinitGtFieldName() { doTestFieldName(CodeCons...
    method testLtClinitGtMethodName (line 68) | @Test public void testLtClinitGtMethodName() { doTestMethodName(CodeCo...
    method doTestClassName (line 70) | private static void doTestClassName(String className, boolean shallBeR...
    method doTestFieldName (line 74) | private static void doTestFieldName(String element, String descriptor,...
    method doTestMethodName (line 78) | private static void doTestMethodName(String element, String descriptor...
    method doTest (line 82) | private static void doTest(Type elementType, String className, String ...

FILE: test/org/jetbrains/java/decompiler/DecompilerTestFixture.java
  class DecompilerTestFixture (line 29) | public class DecompilerTestFixture {
    method setUp (line 35) | public void setUp(Map<String, String> customOptions) throws IOException {
    method setUp (line 39) | public void setUp(@NotNull Map<String, String> customOptions,
    method tearDown (line 70) | public void tearDown() throws IOException {
    method getTestDataDir (line 81) | public Path getTestDataDir() {
    method getTempDir (line 85) | public Path getTempDir() {
    method getTargetDir (line 89) | public Path getTargetDir() {
    method getDecompiler (line 93) | public ConsoleDecompiler getDecompiler() {
    method isTestDataDir (line 97) | private static boolean isTestDataDir(Path dir) {
    method deleteRecursively (line 101) | private static void deleteRecursively(Path file) throws IOException {
    method assertFilesEqual (line 117) | public static void assertFilesEqual(Path expected, Path actual) {
    class TestConsoleDecompiler (line 139) | private static class TestConsoleDecompiler extends ConsoleDecompiler {
      method TestConsoleDecompiler (line 142) | TestConsoleDecompiler(File destination, Map<String, Object> options) {
      method TestConsoleDecompiler (line 146) | TestConsoleDecompiler(File destination, Map<String, Object> options,...
      method getBytecode (line 150) | @Override
      method close (line 168) | void close() {

FILE: test/org/jetbrains/java/decompiler/SingleClassesTest.java
  class SingleClassesTest (line 26) | public class SingleClassesTest {
    method setUp (line 36) | @Before
    method tearDown (line 48) | @After
    method testPrimitiveNarrowing (line 54) | @Test public void testPrimitiveNarrowing() { doTest("pkg/TestPrimitive...
    method testClassFields (line 55) | @Test public void testClassFields() { doTest("pkg/TestClassFields"); }
    method testInterfaceFields (line 56) | @Test public void testInterfaceFields() { doTest("pkg/TestInterfaceFie...
    method testClassLambda (line 57) | @Test public void testClassLambda() { doTest("pkg/TestClassLambda"); }
    method testClassLoop (line 58) | @Test public void testClassLoop() { doTest("pkg/TestClassLoop"); }
    method testClassSwitch (line 59) | @Test public void testClassSwitch() { doTest("pkg/TestClassSwitch"); }
    method testClassTypes (line 60) | @Test public void testClassTypes() { doTest("pkg/TestClassTypes"); }
    method testClassVar (line 61) | @Test public void testClassVar() { doTest("pkg/TestClassVar"); }
    method testClassNestedInitializer (line 62) | @Test public void testClassNestedInitializer() { doTest("pkg/TestClass...
    method testClassCast (line 63) | @Test public void testClassCast() { doTest("pkg/TestClassCast"); }
    method testDeprecations (line 64) | @Test public void testDeprecations() { doTest("pkg/TestDeprecations"); }
    method testExtendsList (line 65) | @Test public void testExtendsList() { doTest("pkg/TestExtendsList"); }
    method testMethodParameters (line 66) | @Test public void testMethodParameters() { doTest("pkg/TestMethodParam...
    method testMethodParametersAttr (line 67) | @Test public void testMethodParametersAttr() { doTest("pkg/TestMethodP...
    method testCodeConstructs (line 68) | @Test public void testCodeConstructs() { doTest("pkg/TestCodeConstruct...
    method testConstantsAsIs (line 69) | @Test public void testConstantsAsIs() { doTest("pkg/TestConstantsAsIs"...
    method testConstants (line 70) | @Test public void testConstants() {
    method testInteger (line 74) | @Test public void testInteger() {
    method testEnum (line 78) | @Test public void testEnum() { doTest("pkg/TestEnum"); }
    method testDebugSymbols (line 79) | @Test public void testDebugSymbols() { doTest("pkg/TestDebugSymbols"); }
    method testInvalidMethodSignature (line 80) | @Test public void testInvalidMethodSignature() { doTest("InvalidMethod...
    method testAnonymousClassConstructor (line 81) | @Test public void testAnonymousClassConstructor() { doTest("pkg/TestAn...
    method testInnerClassConstructor (line 82) | @Test public void testInnerClassConstructor() { doTest("pkg/T
Condensed preview — 593 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,025K chars).
[
  {
    "path": ".editorconfig",
    "chars": 93,
    "preview": "[*]\ncharset=utf-8\nend_of_line=lf\ninsert_final_newline=false\nindent_style=space\nindent_size=2\n"
  },
  {
    "path": ".gitattributes",
    "chars": 11,
    "preview": "*.dec\ttext\n"
  },
  {
    "path": ".gitignore",
    "chars": 31,
    "preview": "/.idea/\n/.gradle/\n/build/\n/out/"
  },
  {
    "path": "README.md",
    "chars": 4997,
    "preview": "### About Fernflower\n\nFernflower is the first actually working analytical decompiler for Java and \nprobably for a high-l"
  },
  {
    "path": "build.gradle",
    "chars": 657,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 223,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "gradlew",
    "chars": 8474,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "gradlew.bat",
    "chars": 2776,
    "preview": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "intellij.java.decompiler.engine.iml",
    "chars": 811,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\" "
  },
  {
    "path": "resources/META-INF/MANIFEST.MF",
    "chars": 151,
    "preview": "Manifest-Version: 1.0\nMain-Class: org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler\nAutomatic-Module-Name:"
  },
  {
    "path": "src/org/jetbrains/java/decompiler/ClassNameConstants.java",
    "chars": 401,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/CodeConstants.java",
    "chars": 9709,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/ExceptionHandler.java",
    "chars": 872,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/ExceptionTable.java",
    "chars": 579,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/FullInstructionSequence.java",
    "chars": 1001,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/Instruction.java",
    "chars": 3065,
    "preview": "// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/InstructionSequence.java",
    "chars": 3787,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/JumpInstruction.java",
    "chars": 729,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/SimpleInstructionSequence.java",
    "chars": 691,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/SwitchInstruction.java",
    "chars": 1686,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/cfg/BasicBlock.java",
    "chars": 4391,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/cfg/ControlFlowGraph.java",
    "chars": 23765,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/cfg/ExceptionRangeCFG.java",
    "chars": 2295,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/code/interpreter/InstructionImpact.java",
    "chars": 31925,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/AssertProcessor.java",
    "chars": 11479,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/CancellationManager.java",
    "chars": 1987,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/ClassReference14Processor.java",
    "chars": 10584,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/ClassWriter.java",
    "chars": 53255,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/ClassesProcessor.java",
    "chars": 21984,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/DecompilerContext.java",
    "chars": 5995,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/EnumProcessor.java",
    "chars": 2635,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/Fernflower.java",
    "chars": 4944,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/InitializerProcessor.java",
    "chars": 9783,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/collectors/BytecodeMappingTracer.java",
    "chars": 3036,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/collectors/BytecodeSourceMapper.java",
    "chars": 4159,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/collectors/CounterContainer.java",
    "chars": 667,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/collectors/ImportCollector.java",
    "chars": 7569,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/collectors/VarNamesCollector.java",
    "chars": 840,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/decompiler/BaseDecompiler.java",
    "chars": 1482,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/decompiler/ConsoleDecompiler.java",
    "chars": 9345,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/decompiler/PrintStreamLogger.java",
    "chars": 2347,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/extern/ClassFormatException.java",
    "chars": 346,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/extern/IBytecodeProvider.java",
    "chars": 344,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/extern/IFernflowerLogger.java",
    "chars": 1283,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/extern/IFernflowerPreferences.java",
    "chars": 3749,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/extern/IIdentifierRenamer.java",
    "chars": 611,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/extern/IResultSaver.java",
    "chars": 859,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/rels/ClassWrapper.java",
    "chars": 8752,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/rels/LambdaProcessor.java",
    "chars": 5619,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/rels/MethodProcessorRunnable.java",
    "chars": 8433,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/rels/MethodWrapper.java",
    "chars": 1650,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java",
    "chars": 34086,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/main/rels/NestedMemberAccess.java",
    "chars": 16536,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/code/DeadCodeHelper.java",
    "chars": 18860,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/ClasspathHelper.java",
    "chars": 2268,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/ClearStructHelper.java",
    "chars": 720,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/ConcatenationHelper.java",
    "chars": 9427,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/DecHelper.java",
    "chars": 5664,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/DomHelper.java",
    "chars": 20159,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/ExitHelper.java",
    "chars": 8350,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/ExprProcessor.java",
    "chars": 46147,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/ExpressionStack.java",
    "chars": 693,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/FinallyProcessor.java",
    "chars": 32400,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/IdeaNotNullHelper.java",
    "chars": 12507,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/IfHelper.java",
    "chars": 22157,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/InlineSingleBlockHelper.java",
    "chars": 5607,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/LabelHelper.java",
    "chars": 15463,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/LoopExtractHelper.java",
    "chars": 5402,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/MergeHelper.java",
    "chars": 13309,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/PPandMMHelper.java",
    "chars": 4409,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/PatternHelper.java",
    "chars": 29388,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/PrimitiveExpressionList.java",
    "chars": 880,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/SecondaryFunctionsHelper.java",
    "chars": 18042,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/SequenceHelper.java",
    "chars": 9064,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/SimplifyExprentsHelper.java",
    "chars": 29741,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/StackVarsProcessor.java",
    "chars": 22507,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/StatEdge.java",
    "chars": 4891,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/StrongConnectivityHelper.java",
    "chars": 3955,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/SwitchHelper.java",
    "chars": 36567,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/SwitchPatternHelper.java",
    "chars": 79660,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/decompose/DominatorEngine.java",
    "chars": 2823,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/decompose/DominatorTreeExceptionFilter.java",
    "chars": 4651,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/decompose/FastExtendedPostdominanceHelper.java",
    "chars": 9527,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/decompose/GenericDominatorEngine.java",
    "chars": 3202,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/decompose/IGraph.java",
    "chars": 382,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/decompose/IGraphNode.java",
    "chars": 336,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/deobfuscator/ExceptionDeobfuscator.java",
    "chars": 20117,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/deobfuscator/IrreducibleCFGDeobfuscator.java",
    "chars": 7108,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/AnnotationExprent.java",
    "chars": 2838,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/ArrayExprent.java",
    "chars": 3031,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/AssertExprent.java",
    "chars": 1094,
    "preview": "/*\n * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be fou"
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/AssignmentExprent.java",
    "chars": 5664,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/ConstExprent.java",
    "chars": 18362,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/ExitExprent.java",
    "chars": 4994,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/ExprUtil.java",
    "chars": 2094,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/Exprent.java",
    "chars": 5755,
    "preview": "/*\n * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be fou"
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/FieldExprent.java",
    "chars": 6702,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/FunctionExprent.java",
    "chars": 20014,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/IfExprent.java",
    "chars": 3861,
    "preview": "/*\n * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be fou"
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/InvocationExprent.java",
    "chars": 21815,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/MonitorExprent.java",
    "chars": 1855,
    "preview": "/*\n * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be fou"
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java",
    "chars": 16794,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/RecordVarExprent.java",
    "chars": 3404,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/SwitchExprent.java",
    "chars": 4108,
    "preview": "/*\n * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be fou"
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/exps/VarExprent.java",
    "chars": 8959,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectGraph.java",
    "chars": 3555,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/sforms/DirectNode.java",
    "chars": 1572,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/sforms/FlattenStatementsHelper.java",
    "chars": 21180,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/sforms/SSAConstructorSparseEx.java",
    "chars": 16012,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/sforms/SSAUConstructorSparseEx.java",
    "chars": 27322,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/BasicBlockStatement.java",
    "chars": 2339,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchAllStatement.java",
    "chars": 7092,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java",
    "chars": 7446,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/DoStatement.java",
    "chars": 6645,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/DummyExitStatement.java",
    "chars": 809,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/GeneralStatement.java",
    "chars": 1744,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/IfStatement.java",
    "chars": 11895,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/RootStatement.java",
    "chars": 993,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/SequenceStatement.java",
    "chars": 3691,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statement.java",
    "chars": 26177,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/Statements.java",
    "chars": 1665,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/SwitchStatement.java",
    "chars": 17067,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/stats/SynchronizedStatement.java",
    "chars": 4506,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/typeann/TargetInfo.java",
    "chars": 11762,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/typeann/TypeAnnotation.java",
    "chars": 4199,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/typeann/TypeAnnotationWriteHelper.java",
    "chars": 1901,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/CheckTypesResult.java",
    "chars": 1221,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarDefinitionHelper.java",
    "chars": 9676,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarProcessor.java",
    "chars": 5516,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarTypeProcessor.java",
    "chars": 9941,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionEdge.java",
    "chars": 1106,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionNode.java",
    "chars": 1605,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionPair.java",
    "chars": 1151,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionsGraph.java",
    "chars": 4039,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/decompiler/vars/VarVersionsProcessor.java",
    "chars": 13443,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/renamer/ClassWrapperNode.java",
    "chars": 757,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/renamer/ConverterHelper.java",
    "chars": 5034,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/renamer/IdentifierConverter.java",
    "chars": 11693,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/modules/renamer/PoolInterceptor.java",
    "chars": 752,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/ContextUnit.java",
    "chars": 5041,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/IDecompiledData.java",
    "chars": 331,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/StructClass.java",
    "chars": 8217,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/StructContext.java",
    "chars": 5780,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/StructField.java",
    "chars": 1834,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/StructMember.java",
    "chars": 5271,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/StructMethod.java",
    "chars": 11170,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/StructRecordComponent.java",
    "chars": 1435,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/StructTypePathEntry.java",
    "chars": 1757,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructAnnDefaultAttribute.java",
    "chars": 785,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructAnnotationAttribute.java",
    "chars": 5887,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructAnnotationParameterAttribute.java",
    "chars": 1229,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructBootstrapMethodsAttribute.java",
    "chars": 1738,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructCodeAttribute.java",
    "chars": 1343,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructConstantValueAttribute.java",
    "chars": 646,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructEnclosingMethodAttribute.java",
    "chars": 1224,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructExceptionsAttribute.java",
    "chars": 1168,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java",
    "chars": 6621,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructGenericSignatureAttribute.java",
    "chars": 733,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructInnerClassesAttribute.java",
    "chars": 2163,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructLineNumberTableAttribute.java",
    "chars": 1483,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructLocalVariableTableAttribute.java",
    "chars": 3093,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructLocalVariableTypeTableAttribute.java",
    "chars": 1215,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructMethodParametersAttribute.java",
    "chars": 1584,
    "preview": "/*\n * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be fou"
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructModuleAttribute.java",
    "chars": 6273,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructPermittedSubclassesAttribute.java",
    "chars": 1148,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructRecordAttribute.java",
    "chars": 1308,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/attr/StructTypeAnnotationAttribute.java",
    "chars": 3997,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/consts/ConstantPool.java",
    "chars": 8318,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/consts/LinkConstant.java",
    "chars": 2801,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/consts/PooledConstant.java",
    "chars": 369,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/consts/PrimitiveConstant.java",
    "chars": 1575,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/DataPoint.java",
    "chars": 2017,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/FieldDescriptor.java",
    "chars": 1660,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/MethodDescriptor.java",
    "chars": 3536,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/NewClassNameBuilder.java",
    "chars": 279,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/Type.java",
    "chars": 1057,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/VarType.java",
    "chars": 12830,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/generics/GenericClassDescriptor.java",
    "chars": 529,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/generics/GenericFieldDescriptor.java",
    "chars": 352,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/generics/GenericMain.java",
    "chars": 11587,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/generics/GenericMethodDescriptor.java",
    "chars": 1255,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/gen/generics/GenericType.java",
    "chars": 5482,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/lazy/LazyLoader.java",
    "chars": 4250,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/match/IMatchable.java",
    "chars": 798,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/match/MatchEngine.java",
    "chars": 7617,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/struct/match/MatchNode.java",
    "chars": 1699,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/DataInputFullStream.java",
    "chars": 636,
    "preview": "// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/FastFixedSetFactory.java",
    "chars": 7152,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/FastSparseSetFactory.java",
    "chars": 9411,
    "preview": "// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/InterpreterUtil.java",
    "chars": 2587,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/ListStack.java",
    "chars": 1343,
    "preview": "// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/SFormsFastMapDirect.java",
    "chars": 9749,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/TextBuffer.java",
    "chars": 8466,
    "preview": "// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/TextUtil.java",
    "chars": 6212,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "src/org/jetbrains/java/decompiler/util/VBStyleCollection.java",
    "chars": 3650,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "test/org/jetbrains/java/decompiler/BulkDecompilationTest.java",
    "chars": 2568,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "test/org/jetbrains/java/decompiler/CancellableTest.java",
    "chars": 3515,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "test/org/jetbrains/java/decompiler/ConverterHelperTest.java",
    "chars": 5977,
    "preview": "// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found "
  },
  {
    "path": "test/org/jetbrains/java/decompiler/DecompilerTestFixture.java",
    "chars": 6401,
    "preview": "// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  },
  {
    "path": "test/org/jetbrains/java/decompiler/SingleClassesTest.java",
    "chars": 18845,
    "preview": "// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license."
  }
]

// ... and 393 more files (download for full content)

About this extraction

This page contains the full source code of the MinecraftForge/FernFlower GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 593 files (2.7 MB), approximately 751.0k tokens, and a symbol index with 3383 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!