/** * Returns an {@link MethodAnalysisContext} like this one but including the provided {@link * StateParameter}. */ public void addParameter(Parameter param) { extraParameters.add(param); if (param instanceof StateParameter) { StateParameter stateParameter = (StateParameter) param; stateParameters.put(stateParameter.referent().id(), stateParameter); } if (param instanceof TimerParameter) { TimerParameter timerParameter = (TimerParameter) param; timerParameters.put(timerParameter.referent().id(), timerParameter); } }
@Test public void testDeclAndUsageOfStateInSuperclass() throws Exception { class DoFnOverridingAbstractStateUse extends DoFnDeclaringStateAndAbstractUse { @Override public void processWithState(ProcessContext c, ValueState<String> state) {} } DoFnSignature sig = DoFnSignatures.getSignature(new DoFnOverridingAbstractStateUse().getClass()); assertThat(sig.stateDeclarations().size(), equalTo(1)); assertThat(sig.processElement().extraParameters().size(), equalTo(2)); DoFnSignature.StateDeclaration decl = sig.stateDeclarations().get(DoFnOverridingAbstractStateUse.STATE_ID); StateParameter stateParam = (StateParameter) sig.processElement().extraParameters().get(1); assertThat( decl.field(), equalTo(DoFnDeclaringStateAndAbstractUse.class.getDeclaredField("myStateSpec"))); // The method we pull out is the superclass method; this is what allows validation to remain // simple. The later invokeDynamic instruction causes it to invoke the actual implementation. assertThat(stateParam.referent(), equalTo(decl)); }
@Override public StackManipulation dispatch(StateParameter p) { return new StackManipulation.Compound( new TextConstant(p.referent().id()), MethodInvocation.invoke( getExtraContextFactoryMethodDescription(STATE_PARAMETER_METHOD, String.class)), TypeCasting.to( new TypeDescription.ForLoadedType(p.referent().stateType().getRawType()))); }