// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.hytalegenerator.assets.worldstructures.basic;

import com.hypixel.hytale.codec.validation.LateValidator;
import javax.annotation.Nullable;
import com.hypixel.hytale.builtin.hytalegenerator.rangemaps.DoubleRange;
import com.hypixel.hytale.builtin.hytalegenerator.density.Density;
import com.hypixel.hytale.builtin.hytalegenerator.framework.interfaces.functions.BiCarta;
import com.hypixel.hytale.builtin.hytalegenerator.biomemap.SimpleBiomeMap;
import com.hypixel.hytale.builtin.hytalegenerator.cartas.SimpleNoiseCarta;
import com.hypixel.hytale.builtin.hytalegenerator.LoggerUtil;
import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
import com.hypixel.hytale.builtin.hytalegenerator.biome.BiomeType;
import com.hypixel.hytale.builtin.hytalegenerator.assets.biomes.BiomeAsset;
import java.util.HashMap;
import com.hypixel.hytale.builtin.hytalegenerator.referencebundle.Reference;
import com.hypixel.hytale.builtin.hytalegenerator.referencebundle.BaseHeightReference;
import com.hypixel.hytale.builtin.hytalegenerator.assets.worldstructures.mapcontentfield.BaseHeightContentFieldAsset;
import com.hypixel.hytale.builtin.hytalegenerator.referencebundle.ReferenceBundle;
import com.hypixel.hytale.builtin.hytalegenerator.biomemap.BiomeMap;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.assets.density.ConstantDensityAsset;
import com.hypixel.hytale.builtin.hytalegenerator.assets.worldstructures.mapcontentfield.ContentFieldAsset;
import com.hypixel.hytale.builtin.hytalegenerator.assets.density.DensityAsset;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.builtin.hytalegenerator.assets.worldstructures.WorldStructureAsset;

public class BasicWorldStructureAsset extends WorldStructureAsset
{
    public static final BuilderCodec<BasicWorldStructureAsset> CODEC;
    private BiomeRangeAsset[] biomeRangeAssets;
    private int biomeTransitionDistance;
    private int maxBiomeEdgeDistance;
    private DensityAsset densityAsset;
    private String defaultBiomeId;
    private ContentFieldAsset[] contentFieldAssets;
    
    public BasicWorldStructureAsset() {
        this.biomeRangeAssets = new BiomeRangeAsset[0];
        this.biomeTransitionDistance = 32;
        this.maxBiomeEdgeDistance = 0;
        this.densityAsset = new ConstantDensityAsset();
        this.defaultBiomeId = "";
        this.contentFieldAssets = new ContentFieldAsset[0];
    }
    
    @Nullable
    @Override
    public BiomeMap buildBiomeMap(@Nonnull final Argument argument) {
        final ReferenceBundle referenceBundle = new ReferenceBundle();
        for (int i = this.contentFieldAssets.length - 1; i >= 0; --i) {
            final ContentFieldAsset contentFieldAsset = this.contentFieldAssets[i];
            if (contentFieldAsset instanceof final BaseHeightContentFieldAsset bedAsset) {
                final String name = bedAsset.getName();
                final double y = bedAsset.getY();
                final BaseHeightReference bedLayer = new BaseHeightReference((x, z) -> y);
                referenceBundle.put(name, bedLayer, bedLayer.getClass());
            }
        }
        final HashMap<BiomeAsset, BiomeType> biomeAssetToBiomeType = new HashMap<BiomeAsset, BiomeType>();
        final BiomeAsset defaultBiomeAsset = BiomeAsset.getAssetStore().getAssetMap().getAsset(this.defaultBiomeId);
        if (defaultBiomeAsset == null) {
            LoggerUtil.getLogger().warning("Couldn't find Biome asset with id: " + this.defaultBiomeId);
            return null;
        }
        final BiomeType defaultBiome = defaultBiomeAsset.build(argument.materialCache, argument.parentSeed, referenceBundle, argument.workerIndexer);
        biomeAssetToBiomeType.put(defaultBiomeAsset, defaultBiome);
        final Density noise = this.densityAsset.build(DensityAsset.from(argument, referenceBundle));
        final SimpleNoiseCarta<BiomeType> carta = new SimpleNoiseCarta<BiomeType>(noise, defaultBiome);
        final BiomeRangeAsset[] biomeRangeAssets = this.biomeRangeAssets;
        for (int length = biomeRangeAssets.length, j = 0; j < length; ++j) {
            final BiomeRangeAsset asset = biomeRangeAssets[j];
            final DoubleRange range = asset.getRange();
            final BiomeAsset biomeAsset = asset.getBiomeAsset();
            if (biomeAsset == null) {
                LoggerUtil.getLogger().warning("Couldn't find biome asset with name " + asset.getBiomeAssetId());
            }
            else {
                BiomeType biome;
                if (biomeAssetToBiomeType.containsKey(biomeAsset)) {
                    biome = biomeAssetToBiomeType.get(biomeAsset);
                }
                else {
                    biome = biomeAsset.build(argument.materialCache, argument.parentSeed, referenceBundle, argument.workerIndexer);
                    biomeAssetToBiomeType.put(biomeAsset, biome);
                }
                carta.put(range, biome);
            }
        }
        final SimpleBiomeMap<Object> biomeMap = new SimpleBiomeMap<Object>(carta);
        final int defaultRadius = Math.max(1, this.biomeTransitionDistance / 2);
        biomeMap.setDefaultRadius(defaultRadius);
        return biomeMap;
    }
    
    @Override
    public int getBiomeTransitionDistance() {
        return this.biomeTransitionDistance;
    }
    
    @Override
    public int getMaxBiomeEdgeDistance() {
        return this.maxBiomeEdgeDistance;
    }
    
    @Override
    public void cleanUp() {
        this.densityAsset.cleanUp();
        for (final ContentFieldAsset contentFieldAsset : this.contentFieldAssets) {
            contentFieldAsset.cleanUp();
        }
        final BiomeAsset defaultBiomeAsset = BiomeAsset.getAssetStore().getAssetMap().getAsset(this.defaultBiomeId);
        if (defaultBiomeAsset != null) {
            defaultBiomeAsset.cleanUp();
        }
        for (final BiomeRangeAsset asset : this.biomeRangeAssets) {
            final BiomeAsset biomeAsset = asset.getBiomeAsset();
            if (biomeAsset != null) {
                biomeAsset.cleanUp();
            }
        }
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokedynamic   BootstrapMethod #3, get:()Ljava/util/function/Supplier;
        //     7: getstatic       com/hypixel/hytale/builtin/hytalegenerator/assets/worldstructures/WorldStructureAsset.ABSTRACT_CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    10: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;Lcom/hypixel/hytale/codec/builder/BuilderCodec;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    13: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    16: dup            
        //    17: ldc             "Biomes"
        //    19: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //    22: dup            
        //    23: getstatic       com/hypixel/hytale/builtin/hytalegenerator/assets/worldstructures/basic/BiomeRangeAsset.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetBuilderCodec;
        //    26: invokedynamic   BootstrapMethod #4, apply:()Ljava/util/function/IntFunction;
        //    31: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //    34: iconst_1       
        //    35: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;Z)V
        //    38: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
        //    43: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
        //    48: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    51: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    54: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    57: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    60: dup            
        //    61: ldc_w           "Density"
        //    64: getstatic       com/hypixel/hytale/builtin/hytalegenerator/assets/density/DensityAsset.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //    67: iconst_1       
        //    68: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;Z)V
        //    71: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //    76: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
        //    81: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    84: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    87: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    90: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    93: dup            
        //    94: ldc_w           "DefaultBiome"
        //    97: new             Lcom/hypixel/hytale/assetstore/codec/ContainedAssetCodec;
        //   100: dup            
        //   101: ldc             Lcom/hypixel/hytale/builtin/hytalegenerator/assets/biomes/BiomeAsset;.class
        //   103: getstatic       com/hypixel/hytale/builtin/hytalegenerator/assets/biomes/BiomeAsset.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetBuilderCodec;
        //   106: invokespecial   com/hypixel/hytale/assetstore/codec/ContainedAssetCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/assetstore/codec/AssetCodec;)V
        //   109: iconst_1       
        //   110: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;Z)V
        //   113: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
        //   118: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
        //   123: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   126: invokedynamic   BootstrapMethod #11, get:()Ljava/util/function/Supplier;
        //   131: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidatorLate:(Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   134: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   137: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   140: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   143: dup            
        //   144: ldc_w           "DefaultTransitionDistance"
        //   147: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //   150: iconst_1       
        //   151: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;Z)V
        //   154: invokedynamic   BootstrapMethod #12, accept:()Ljava/util/function/BiConsumer;
        //   159: invokedynamic   BootstrapMethod #13, apply:()Ljava/util/function/Function;
        //   164: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   167: iconst_0       
        //   168: invokestatic    java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        //   171: invokestatic    com/hypixel/hytale/codec/validation/Validators.greaterThan:(Ljava/lang/Comparable;)Lcom/hypixel/hytale/codec/validation/Validator;
        //   174: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   177: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   180: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   183: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   186: dup            
        //   187: ldc_w           "MaxBiomeEdgeDistance"
        //   190: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //   193: iconst_1       
        //   194: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;Z)V
        //   197: invokedynamic   BootstrapMethod #14, accept:()Ljava/util/function/BiConsumer;
        //   202: invokedynamic   BootstrapMethod #15, apply:()Ljava/util/function/Function;
        //   207: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   210: iconst_0       
        //   211: invokestatic    java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        //   214: invokestatic    com/hypixel/hytale/codec/validation/Validators.greaterThanOrEqual:(Ljava/lang/Comparable;)Lcom/hypixel/hytale/codec/validation/Validator;
        //   217: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   220: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   223: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   226: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   229: dup            
        //   230: ldc_w           "ContentFields"
        //   233: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   236: dup            
        //   237: getstatic       com/hypixel/hytale/builtin/hytalegenerator/assets/worldstructures/mapcontentfield/ContentFieldAsset.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //   240: invokedynamic   BootstrapMethod #16, apply:()Ljava/util/function/IntFunction;
        //   245: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   248: iconst_0       
        //   249: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;Z)V
        //   252: invokedynamic   BootstrapMethod #17, accept:()Ljava/util/function/BiConsumer;
        //   257: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/Function;
        //   262: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   265: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   268: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   271: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   274: putstatic       com/hypixel/hytale/builtin/hytalegenerator/assets/worldstructures/basic/BasicWorldStructureAsset.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   277: return         
        // 
        // The error that occurred was:
        // 
        // java.lang.UnsupportedOperationException: The requested operation is not supported.
        //     at com.strobel.util.ContractUtils.unsupported(ContractUtils.java:27)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:284)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:279)
        //     at com.strobel.assembler.metadata.TypeReference.makeGenericType(TypeReference.java:154)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:225)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:211)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:314)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2611)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1083)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:684)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:667)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:373)
        //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:344)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:206)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:93)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:868)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:761)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:638)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:162)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:137)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
        //     at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:333)
        //     at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:254)
        //     at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:129)
        // 
        throw new IllegalStateException("An error occurred while decompiling this method.");
    }
}
