// Path: src/main/java/com/pidanic/saral/domain/Statement.java
// public interface Statement {
//     void accept(StatementGenerator generator);
// }
// 
// Path: src/main/java/com/pidanic/saral/scope/Scope.java
// public class Scope {
// 
//     private static final LocalVariable EMPTY = new LocalVariable("empty", BuiltInType.BOOLEAN, true);
// 
//     private List<LocalVariable> localVariables;
//     private List<Function> functions;
//     private String className;
// 
//     public Scope(String className) {
//         localVariables = new ArrayList<>();
//         functions = new ArrayList<>();
//         this.className = className;
//     }
// 
//     public Scope(Scope scope) {
//         localVariables = new ArrayList<>(scope.localVariables);
//         functions = new ArrayList<>(scope.functions);
//         className = scope.className;
//     }
// 
//     public List<LocalVariable> getLocalVariables() {
//         return Collections.unmodifiableList(localVariables);
//     }
// 
//     public void addLocalVariable(LocalVariable localVariable) {
//         localVariables.add(localVariable);
//         if(localVariable.type() == BuiltInType.LONG || localVariable.type() == BuiltInType.DOUBLE) {
//             localVariables.add(EMPTY);
//         }
//     }
// 
//     public boolean existsLocalVariable(String variableName) {
//         return localVariables.stream().anyMatch(variable -> variable.name().equals(variableName));
//     }
// 
//     public Optional<LocalVariable> getLocalVariable(String varName) {
//         return localVariables.stream()
//                 .filter(variable -> variable.name().equals(varName))
//                 .findFirst();
//     }
// 
//     public int getLocalVariableIndex(String varName) {
//         return localVariables.stream().map(LocalVariable::name).collect(Collectors.toList()).indexOf(varName);
//     }
// 
//     public Optional<Function> getFunction(String functionName) {
//         return functions.stream().filter(proc -> proc.getName().equals(functionName))
//                 .findFirst();
//     }
// 
//     public String getClassName() {
//         return className;
//     }
// 
//     public void addFunction(Function function) {
//         this.functions.add(function);
//     }
// 
//     public LocalVariable initializeLocalVariableAtIndex(int index) {
//         LocalVariable localVariable = this.localVariables.get(index);
//         LocalVariable initializedLocalVar = localVariable.initialize();
//         this.localVariables.set(index, initializedLocalVar);
//         return initializedLocalVar;
//     }
// 
//     public LocalVariable initializeLocalVariable(String name) {
//         LocalVariable localVariable = getLocalVariable(name).get();
//         int index = getLocalVariableIndex(name);
//         LocalVariable initializedLocalVar = localVariable.initialize();
//         this.localVariables.set(index, initializedLocalVar);
//         return initializedLocalVar;
//     }
// 
//     public int localVariablesCount() {
//         return localVariables.size();
//     }
// }
// 
// Path: src/main/java/com/pidanic/saral/util/BuiltInType.java
// public enum BuiltInType implements Type {
//     BOOLEAN("logický", boolean.class, "Z", TypeSpecificOpcodes.INT),
//     INT ("neskutočné numeralio int", int.class, "I", TypeSpecificOpcodes.INT),
//     CHAR ("písmeno", char.class, "C", TypeSpecificOpcodes.INT),
//     //BYTE ("neskutočné numeralio", byte.class, "B", TypeSpecificOpcodes.INT),
//     //SHORT ("neskutočné numeralio", short.class, "S", TypeSpecificOpcodes.INT),
//     LONG ("neskutočné numeralio", long.class, "J", TypeSpecificOpcodes.LONG),
//     //FLOAT ("skutočné numeralio", float.class, "F", TypeSpecificOpcodes.FLOAT),
//     DOUBLE ("skutočné numeralio", double.class, "D", TypeSpecificOpcodes.DOUBLE),
//     STRING ("slovo", String.class, "Ljava/lang/String;", TypeSpecificOpcodes.OBJECT),
//     BOOLEAN_ARR("funduš logický", boolean[].class, "[B", TypeSpecificOpcodes.BOOLEAN_ARRAY),
//     //INT_ARR ("int[]", int[].class, "[I"),
//     CHAR_ARR ("funduš písmeno", char[].class, "[C", TypeSpecificOpcodes.CHAR_ARRAY),
//     //BYTE_ARR ("byte[]", byte[].class, "[B"),
//     //SHORT_ARR ("short[]", short[].class, "[S"),
//     LONG_ARR ("funduš neskutočné numeralio", long[].class, "[J", TypeSpecificOpcodes.LONG_ARRAY),
//     //FLOAT_ARR ("float[]", float[].class, "[F"),
//     DOUBLE_ARR ("funduš skutočné numeralio", double[].class, "[D", TypeSpecificOpcodes.DOUBLE_ARRAY),
//     STRING_ARR ("funduš slovo", String[].class, "[Ljava/lang/String;", TypeSpecificOpcodes.OBJECT_ARRAY),
//     //NONE("", null,""),
//     VOID("void", void.class, "V", TypeSpecificOpcodes.VOID);
// 
//     private String name;
//     private Class<?> typeClass;
//     private String descriptor;
//     private TypeSpecificOpcodes opCode;
// 
//     BuiltInType(String name, Class<?> typeClass, String descriptor, TypeSpecificOpcodes op) {
//         this.name = name;
//         this.typeClass = typeClass;
//         this.descriptor = descriptor;
//         this.opCode = op;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public Class<?> getTypeClass() {
//         return typeClass;
//     }
// 
//     @Override
//     public String getDescriptor() {
//         return descriptor;
//     }
// 
//     @Override
//     public String getInternalName() {
//         return getDescriptor();
//     }
// 
//     @Override
//     public TypeSpecificOpcodes getTypeSpecificOpcode() {
//         return opCode;
//     }
// }


import com.pidanic.saral.domain.Statement;
import com.pidanic.saral.scope.Scope;
import com.pidanic.saral.util.BuiltInType;
import java.util.List;
package com.pidanic.saral.domain.block;



public class Procedure extends Function {

    public Procedure(Scope scope, String name, List<Argument> arguments, List<Statement> statements) {
// Path: src/main/java/com/pidanic/saral/domain/Statement.java
// public interface Statement {
//     void accept(StatementGenerator generator);
// }
// 
// Path: src/main/java/com/pidanic/saral/scope/Scope.java
// public class Scope {
// 
//     private static final LocalVariable EMPTY = new LocalVariable("empty", BuiltInType.BOOLEAN, true);
// 
//     private List<LocalVariable> localVariables;
//     private List<Function> functions;
//     private String className;
// 
//     public Scope(String className) {
//         localVariables = new ArrayList<>();
//         functions = new ArrayList<>();
//         this.className = className;
//     }
// 
//     public Scope(Scope scope) {
//         localVariables = new ArrayList<>(scope.localVariables);
//         functions = new ArrayList<>(scope.functions);
//         className = scope.className;
//     }
// 
//     public List<LocalVariable> getLocalVariables() {
//         return Collections.unmodifiableList(localVariables);
//     }
// 
//     public void addLocalVariable(LocalVariable localVariable) {
//         localVariables.add(localVariable);
//         if(localVariable.type() == BuiltInType.LONG || localVariable.type() == BuiltInType.DOUBLE) {
//             localVariables.add(EMPTY);
//         }
//     }
// 
//     public boolean existsLocalVariable(String variableName) {
//         return localVariables.stream().anyMatch(variable -> variable.name().equals(variableName));
//     }
// 
//     public Optional<LocalVariable> getLocalVariable(String varName) {
//         return localVariables.stream()
//                 .filter(variable -> variable.name().equals(varName))
//                 .findFirst();
//     }
// 
//     public int getLocalVariableIndex(String varName) {
//         return localVariables.stream().map(LocalVariable::name).collect(Collectors.toList()).indexOf(varName);
//     }
// 
//     public Optional<Function> getFunction(String functionName) {
//         return functions.stream().filter(proc -> proc.getName().equals(functionName))
//                 .findFirst();
//     }
// 
//     public String getClassName() {
//         return className;
//     }
// 
//     public void addFunction(Function function) {
//         this.functions.add(function);
//     }
// 
//     public LocalVariable initializeLocalVariableAtIndex(int index) {
//         LocalVariable localVariable = this.localVariables.get(index);
//         LocalVariable initializedLocalVar = localVariable.initialize();
//         this.localVariables.set(index, initializedLocalVar);
//         return initializedLocalVar;
//     }
// 
//     public LocalVariable initializeLocalVariable(String name) {
//         LocalVariable localVariable = getLocalVariable(name).get();
//         int index = getLocalVariableIndex(name);
//         LocalVariable initializedLocalVar = localVariable.initialize();
//         this.localVariables.set(index, initializedLocalVar);
//         return initializedLocalVar;
//     }
// 
//     public int localVariablesCount() {
//         return localVariables.size();
//     }
// }
// 
// Path: src/main/java/com/pidanic/saral/util/BuiltInType.java
// public enum BuiltInType implements Type {
//     BOOLEAN("logický", boolean.class, "Z", TypeSpecificOpcodes.INT),
//     INT ("neskutočné numeralio int", int.class, "I", TypeSpecificOpcodes.INT),
//     CHAR ("písmeno", char.class, "C", TypeSpecificOpcodes.INT),
//     //BYTE ("neskutočné numeralio", byte.class, "B", TypeSpecificOpcodes.INT),
//     //SHORT ("neskutočné numeralio", short.class, "S", TypeSpecificOpcodes.INT),
//     LONG ("neskutočné numeralio", long.class, "J", TypeSpecificOpcodes.LONG),
//     //FLOAT ("skutočné numeralio", float.class, "F", TypeSpecificOpcodes.FLOAT),
//     DOUBLE ("skutočné numeralio", double.class, "D", TypeSpecificOpcodes.DOUBLE),
//     STRING ("slovo", String.class, "Ljava/lang/String;", TypeSpecificOpcodes.OBJECT),
//     BOOLEAN_ARR("funduš logický", boolean[].class, "[B", TypeSpecificOpcodes.BOOLEAN_ARRAY),
//     //INT_ARR ("int[]", int[].class, "[I"),
//     CHAR_ARR ("funduš písmeno", char[].class, "[C", TypeSpecificOpcodes.CHAR_ARRAY),
//     //BYTE_ARR ("byte[]", byte[].class, "[B"),
//     //SHORT_ARR ("short[]", short[].class, "[S"),
//     LONG_ARR ("funduš neskutočné numeralio", long[].class, "[J", TypeSpecificOpcodes.LONG_ARRAY),
//     //FLOAT_ARR ("float[]", float[].class, "[F"),
//     DOUBLE_ARR ("funduš skutočné numeralio", double[].class, "[D", TypeSpecificOpcodes.DOUBLE_ARRAY),
//     STRING_ARR ("funduš slovo", String[].class, "[Ljava/lang/String;", TypeSpecificOpcodes.OBJECT_ARRAY),
//     //NONE("", null,""),
//     VOID("void", void.class, "V", TypeSpecificOpcodes.VOID);
// 
//     private String name;
//     private Class<?> typeClass;
//     private String descriptor;
//     private TypeSpecificOpcodes opCode;
// 
//     BuiltInType(String name, Class<?> typeClass, String descriptor, TypeSpecificOpcodes op) {
//         this.name = name;
//         this.typeClass = typeClass;
//         this.descriptor = descriptor;
//         this.opCode = op;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public Class<?> getTypeClass() {
//         return typeClass;
//     }
// 
//     @Override
//     public String getDescriptor() {
//         return descriptor;
//     }
// 
//     @Override
//     public String getInternalName() {
//         return getDescriptor();
//     }
// 
//     @Override
//     public TypeSpecificOpcodes getTypeSpecificOpcode() {
//         return opCode;
//     }
// }


// Path: src/main/java/com/pidanic/saral/domain/block/Procedure.java
import com.pidanic.saral.domain.Statement;
import com.pidanic.saral.scope.Scope;
import com.pidanic.saral.util.BuiltInType;
import java.util.List;

package com.pidanic.saral.domain.block;



public class Procedure extends Function {

    public Procedure(Scope scope, String name, List<Argument> arguments, List<Statement> statements) {
        super(scope, name, arguments, statements, BuiltInType.VOID);