import org.antlr.v4.runtime.*;
//import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.misc.Interval;

public class ConclaveListener extends JavaBaseListener {
    JavaParser parser;
	String fileName;
	String current_method = "";
	String current_class = "";
	String var_type = "Variable";
	String old_var_type = "Variable";

    public ConclaveListener(JavaParser parser, String fileName) {
		this.parser = parser;
		this.fileName = fileName;
	}

    // Class
    @Override
    public void enterClassDeclaration(JavaParser.ClassDeclarationContext ctx) {
		Token t_s = ctx.getStart();
		Token t_e = ctx.getStop();
        String line_begin = String.valueOf(t_s.getLine());
        String line_end = String.valueOf(t_e.getLine());
		current_class = fileName+"::"+ctx.Identifier()+"::"+line_begin;

        System.out.println("Class,"+fileName+"::"+ctx.Identifier()+"::"+line_begin+","+ctx.Identifier()+","+""+","+fileName+","+line_begin+","+line_end);
    }

    // Constructor
    @Override
    public void enterConstructorDeclaration(JavaParser.ConstructorDeclarationContext ctx) {
		Token t_s = ctx.getStart();
		Token t_e = ctx.getStop();
        String line_begin = String.valueOf(t_s.getLine());
        String line_end = String.valueOf(t_e.getLine());

        System.out.println("Constructor,"+fileName+"::"+ctx.Identifier()+"::"+line_begin+","+ctx.Identifier()+","+""+","+fileName+","+line_begin+","+line_end);
    }

    // Method Calls
    @Override
    public void enterExplicitGenericInvocationSuffix(JavaParser.ExplicitGenericInvocationSuffixContext ctx) {
		Token t_s = ctx.getStart();
		Token t_e = ctx.getStop();
        String line_begin = String.valueOf(t_s.getLine());
        String line_end = String.valueOf(t_e.getLine());

        //if ( ctx.type()!=null )
        //System.out.println("Call,"+fileName+"::"+ctx.Identifier()+"::"+line_begin+","+ctx.Identifier()+","+"CTX"+","+fileName+","+line_begin+","+line_end);
    }

	// Method
    @Override
    public void enterMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
		Token t_s = ctx.getStart();
		Token t_e = ctx.getStop();
        String line_begin = String.valueOf(t_s.getLine());
        String line_end = String.valueOf(t_e.getLine());
		current_method = fileName+"::"+ctx.Identifier()+"::"+line_begin;
		old_var_type = var_type;
		var_type = "LocalVariable";

        System.out.println("Method,"+fileName+"::"+ctx.Identifier()+"::"+line_begin+","+ctx.Identifier()+","+current_class+","+fileName+","+line_begin+","+line_end);
    }
    @Override
    public void exitMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
		current_method = "";
		var_type = old_var_type;
    }

	// Variable - LocalVariable OR Variable OR Parameter
    @Override
    public void enterVariableDeclaratorId(JavaParser.VariableDeclaratorIdContext ctx) {
		Token t_s = ctx.getStart();
		Token t_e = ctx.getStop();
        String line_begin = String.valueOf(t_s.getLine());
        String line_end = String.valueOf(t_e.getLine());

        System.out.println(var_type+","+fileName+"::"+ctx.Identifier()+"::"+line_begin+","+ctx.Identifier()+","+current_method+","+fileName+","+line_begin+","+line_end);
    }

    @Override
    public void enterLocalVariableDeclaration(JavaParser.LocalVariableDeclarationContext ctx) {
		old_var_type = var_type;
		var_type = "LocalVariable";
    }
    @Override
    public void exitLocalVariableDeclaration(JavaParser.LocalVariableDeclarationContext ctx) {
		var_type = old_var_type;
    }

    @Override
    public void enterFormalParameterList(JavaParser.FormalParameterListContext ctx) {
		old_var_type = var_type;
		var_type = "Parameter";
    }
    @Override
    public void exitFormalParameterList(JavaParser.FormalParameterListContext ctx) {
		var_type = old_var_type;
    }

}
