package ru.csu.stan.java.cfg.automaton; import ru.csu.stan.java.cfg.automaton.base.ContextBase; import ru.csu.stan.java.cfg.automaton.base.IClassInsidePart; import ru.csu.stan.java.cfg.jaxb.Block; import ru.csu.stan.java.cfg.jaxb.Project; import ru.csu.stan.java.cfg.util.scope.VariableScope; import ru.csu.stan.java.classgen.automaton.IContext; import ru.csu.stan.java.classgen.handlers.NodeAttributes; import ru.csu.stan.java.classgen.util.CompilationUnit; /** * * @author mz * */ public class MethodArgumentsContext extends ContextBase implements IClassInsidePart { private Block block; private String className; private CompilationUnit compilationUnit; protected MethodArgumentsContext(ContextBase previousState, Block block, String className, CompilationUnit compilationUnit) { super(previousState); this.block = block; this.className = className; this.compilationUnit = compilationUnit; } @Override public IContext<Project> getPreviousState(String eventName) { if ("arguments".equals(eventName)) return getUpperState(); return this; } @Override public IContext<Project> getNextState(IContext<Project> context, String eventName) { if ("new_class".equals(eventName)){ setInternalCall(); return new NewClassContext(this, block, className, compilationUnit); } if ("method_invocation".equals(eventName)){ setInternalCall(); return new MethodInvocationContext(this, block, className, compilationUnit); } return this; } @Override public void processTag(String name, NodeAttributes attrs) { } @Override public void finish(String eventName) { } public void setInternalCall() { if (getUpperState() instanceof MethodInvocationContext) ((MethodInvocationContext)getUpperState()).setInternalCall(); if (getUpperState() instanceof MethodArgumentsContext) ((MethodArgumentsContext)getUpperState()).setInternalCall(); } @Override public String getClassName() { return findParentClassNameHolder().getClassName(); } @Override public int getNextInnerCount() { return findParentClassNameHolder().getNextInnerCount(); } private IClassInsidePart findParentClassNameHolder(){ ContextBase ctx = this.getUpperState(); while (!(ctx instanceof IClassInsidePart) && ctx != null) ctx = ctx.getUpperState(); return (IClassInsidePart) ctx; } @Override public VariableScope getVariableScope() { return findParentClassNameHolder().getVariableScope(); } }