private VariableState MergeVariableState(ExpressionSyntax expression, VariableState newVariableState, ExecutionState state, VariableState currentScope = null) { var variableStateToMerge = newVariableState ?? new VariableState(expression, VariableTaint.Unset); if (!(expression is MemberAccessExpressionSyntax memberAccessExpressionSyntax)) { var identifier = ""; if (expression is IdentifierNameSyntax identifierNameSyntax) { identifier = ResolveIdentifier(identifierNameSyntax.Identifier); } else if (expression is MeExpressionSyntax) { identifier = "this"; } if (currentScope != null) { currentScope.AddOrMergeProperty(identifier, variableStateToMerge); return(currentScope.PropertyStates[identifier]); } state.AddOrUpdateValue(identifier, variableStateToMerge); return(state.VariableStates[identifier]); } var variableState = MergeVariableState(memberAccessExpressionSyntax.Expression, null, state, currentScope); var stateIdentifier = ResolveIdentifier(memberAccessExpressionSyntax.Name.Identifier); //make sure this identifier exists variableState.AddOrMergeProperty(stateIdentifier, variableStateToMerge); return(variableState.PropertyStates[stateIdentifier]); }