/**
   * Read the ShaderNodesDefinitions block and returns a list of ShaderNodesDefinition This method
   * is used by the j3sn loader
   *
   * <p>note that the order of the definitions in the list is not guaranteed.
   *
   * @param statements the list statements to parse
   * @param key the ShaderNodeDefinitionKey
   * @return a list of ShaderNodesDefinition
   * @throws IOException
   */
  public List<ShaderNodeDefinition> readNodesDefinitions(
      List<Statement> statements, ShaderNodeDefinitionKey key) throws IOException {

    for (Statement statement : statements) {
      String[] split = statement.getLine().split("[ \\{]");
      if (statement.getLine().startsWith("ShaderNodeDefinition")) {
        String name = statement.getLine().substring("ShaderNodeDefinition".length()).trim();

        if (!getNodeDefinitions().containsKey(name)) {
          shaderNodeDefinition = new ShaderNodeDefinition();
          getNodeDefinitions().put(name, shaderNodeDefinition);
          shaderNodeDefinition.setName(name);
          readShaderNodeDefinition(statement.getContents(), key);
        }
      } else {
        throw new MatParseException("ShaderNodeDefinition", split[0], statement);
      }
    }

    return new ArrayList<ShaderNodeDefinition>(getNodeDefinitions().values());
  }