/*
 * Copyright 2000-2017 JetBrains s.r.o.
 *
 * 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
 *
 * http://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.
 */
package com.intellij.debugger.streams.trace.impl.handler;

import com.intellij.debugger.streams.trace.TraceHandler;
import com.intellij.debugger.streams.trace.impl.TraceExpressionBuilderImpl;
import org.jetbrains.annotations.NotNull;

import java.util.List;

/**
 * @author Vitaliy.Bibaev
 */
public abstract class HandlerBase implements TraceHandler {
  private HandlerBase() {
  }

  private static final String DECLARATION_FORMAT = "final %s %s = %s;" + TraceExpressionBuilderImpl.LINE_SEPARATOR;

  @NotNull
  @Override
  final public String additionalVariablesDeclaration() {
    final StringBuilder stringBuilder = new StringBuilder();
    final List<Variable> variables = getVariables();
    for (final Variable variable : variables) {
      stringBuilder.append(String.format(DECLARATION_FORMAT, variable.getTypeName(), variable.getName(), variable.getInitialExpression()));
    }

    return stringBuilder.toString();
  }

  @NotNull
  protected abstract List<Variable> getVariables();

  static abstract class Producer extends HandlerBase implements TraceExpressionBuilderImpl.ProducerCallTraceHandler {
  }

  static abstract class Intermediate extends HandlerBase implements TraceExpressionBuilderImpl.IntermediateCallTraceHandler {
  }

  static abstract class Terminator extends HandlerBase implements TraceExpressionBuilderImpl.TerminatorCallTraceHandler {
  }
}

@@ -829,16 +829,46 @@
 tNull;%0A%0A
+import java.util.Collections;%0A
 import j
@@ -1514,16 +1514,78 @@
 %0A    %7D%0A%0A
+    getClassesDeclarations().forEach(stringBuilder::append);%0A%0A
     retu
@@ -1682,16 +1682,120 @@
 les();%0A%0A
+  @NotNull%0A  protected List%3CString%3E getClassesDeclarations() %7B%0A    return Collections.emptyList();%0A  %7D%0A%0A
   static
@@ -1903,32 +1903,39 @@
 andler %7B%0A  %7D%0A%0A  
+public 
 static abstract 

Add ability to declare new classes in the handlers